2#include <FairGeoBuilder.h>
3#include <FairGeoInterface.h>
4#include <FairGeoLoader.h>
5#include <FairGeoMedia.h>
10#include <TGeoCompositeShape.h>
12#include <TGeoManager.h>
13#include <TGeoMatrix.h>
15#include <TGeoVolume.h>
36 template <
typename T,
typename... Args>
37 auto TGeoManagerCreate(Args&&... args) -> T*
39 return std::make_unique<T>(std::forward<Args>(args)...).release();
42 auto create_cone_displacement(
const std::string& name,
double rotate_y_degree) -> TGeoCombiTrans*
44 auto rotation = TGeoRotation{};
45 rotation.RotateY(rotate_y_degree);
46 auto* transition = TGeoManagerCreate<TGeoCombiTrans>(
48 transition->SetName(name.c_str());
49 transition->RegisterYourself();
53 auto build_bar_shape(std::string_view name,
const BarDimension& bar_dimension) -> TGeoShape*
55 auto* displace1 = create_cone_displacement(
"trc1",
DEGREE_90);
56 auto* displace2 = create_cone_displacement(
"trc2", -
DEGREE_90);
58 auto* main_bar_shape = TGeoManagerCreate<TGeoBBox>(
59 fmt::format(
"{}Box", name).c_str(), bar_dimension.
length, bar_dimension.
width, bar_dimension.
width);
60 auto* cone_shape = TGeoManagerCreate<TGeoCone>(fmt::format(
"{}Cone", name).c_str(),
65 bar_dimension.
width * std::sqrt(2.));
66 auto* bar_tail_shape = TGeoManagerCreate<TGeoBBox>(fmt::format(
"{}ConeBox", name).c_str(),
70 return TGeoManagerCreate<TGeoCompositeShape>(name.data(),
71 fmt::format(
"{}+(({}*{}):{})+(({}*{}):{})",
72 main_bar_shape->GetName(),
73 bar_tail_shape->GetName(),
74 cone_shape->GetName(),
76 bar_tail_shape->GetName(),
77 cone_shape->GetName(),
95 auto* neuland = TGeoManagerCreate<TGeoVolumeAssembly>(
"volNeuland");
98 const auto first_plane_front_z = -num_of_planes *
BarSize_Z / 2.;
100 auto rot_zero = TGeoRotation{};
101 auto rot_90 = TGeoRotation{};
104 for (
int module_id{}; module_id < total_module_size; ++module_id)
108 const auto z_pos =
PlaneID2ZPos(plane_id) + first_plane_front_z;
110 auto* translation_rotation = TGeoManagerCreate<TGeoCombiTrans>();
113 translation_rotation->SetTranslation(0, vertical_displacement, z_pos);
114 translation_rotation->SetRotation(rot_zero);
118 translation_rotation->SetTranslation(vertical_displacement, 0, z_pos);
119 translation_rotation->SetRotation(rot_90);
121 neuland->AddNode(
bar_, module_id + 1, translation_rotation);
154 auto* shape_Al_solid = build_bar_shape(
"shapeAlWrappingSolid", dimension);
157 fmt::format(
"{} - {}", shape_Al_solid->GetName(),
shape_scintillator_->GetName()).c_str());
161 auto* shape_tape_solid = build_bar_shape(
"shapeTapeWrappingSolid", dimension);
164 fmt::format(
"{} - {}", shape_tape_solid->GetName(), shape_Al_solid->GetName()).c_str());
169 auto* bar = TGeoManagerCreate<TGeoVolumeAssembly>(
"volPaddle");
179 static constexpr auto greyish_blue = 33;
180 static constexpr auto transparency = 30;
181 scintillator->SetLineColor(greyish_blue);
182 scintillator->SetTransparency(transparency);
189 static constexpr auto greyish_silver = 17;
190 Al_wrapping->SetLineColor(greyish_silver);
197 static constexpr auto black = 1;
198 tape_wrapping->SetLineColor(black);
199 return tape_wrapping;
204 auto* fair_medium =
geo_media_->getMedium(material_name.c_str());
205 if (fair_medium ==
nullptr)
207 R3BLOG(error, fmt::format(
"FairGeoMedium {} not found!", material_name));
215 if (gGeoManager ==
nullptr)
219 auto* material = gGeoManager->GetMedium(material_name.c_str());
220 if (material ==
nullptr)
222 R3BLOG(error, fmt::format(
"TGeoMedium {} not found!", material_name));
229 auto* geo_interface = geo_loader->getGeoInterface();
230 const auto* working_dir = std::getenv(
"VMCWORKDIR");
231 if (working_dir ==
nullptr)
233 throw R3B::logic_error(
"Environment variable \"VMCWORKDIR\" is not defined!");
235 geo_interface->setMediaFile(fmt::format(
"{}/geometry/media_r3b.geo", working_dir).c_str());
236 geo_interface->readMedia();
#define R3BLOG(severity, x)
TGeoShape * shape_Al_wrapping_
void construct_all_shapes()
TGeoMedium * material_poly_
TGeoVolume * Al_wrapping_
auto build_bar_volume() -> TGeoVolume *
void construct_all_volumes()
TGeoShape * shape_tape_wrapping_
auto build_scintillator() -> TGeoVolume *
FairGeoBuilder * geo_builder_
auto build_Al_wrapping() -> TGeoVolume *
TGeoShape * shape_scintillator_
auto build_tape_wrapping() -> TGeoVolume *
auto construct_volume(int num_of_planes, FairGeoLoader *geo_loader) -> TGeoVolume *
TGeoMedium * material_Al_
TGeoMedium * material_BC408_
TGeoVolume * scintillator_
auto build_detector(int num_of_planes) -> TGeoVolume *
void construct_all_material()
void read_material_from_file(FairGeoLoader *geo_loader)
auto build_material(const std::string &material) -> TGeoMedium *
FairGeoMedia * geo_media_
TGeoVolume * tape_wrapping_
const auto BC408_THICKNESS
const auto TAPE_THICKNESS
const auto BC408_CONE_RADIUS
constexpr auto BAR_CONE_LENGTH
constexpr auto CONE_LENGHT_PADDING
constexpr auto BAR_BASE_LENGTH
constexpr auto BarsPerPlane
constexpr auto ModuleID2PlaneID(int moduleID) -> int
constexpr auto GetBarVerticalDisplacement(int module_num) -> double
constexpr auto IsPlaneIDHorizontal(int plane_id) -> bool
constexpr auto PlaneID2ZPos(int plane_id) -> T