12 #include "DD4hep/DetFactoryHelper.h"
15 using namespace dd4hep;
23 static Ref_t
create_element(Detector& lcdd, xml_h xml, SensitiveDetector sens) {
24 xml_det_t x_det = xml;
25 string det_name = x_det.nameStr();
27 DetElement cylinderVolume(det_name, x_det.id());
32 dd4hep::xml::Dimension x_det_dim(x_det.dimensions());
33 Tube tube_shape(x_det_dim.rmin(), x_det_dim.rmax(), x_det_dim.dz());
34 Volume tube_vol(det_name, tube_shape,
36 tube_vol.setVisAttributes(lcdd, x_det_dim.visStr());
40 for (xml_coll_t j(xml, _U(
layer)); j; ++j) {
41 xml_comp_t x_layer = j;
42 double l_rmin = x_layer.inner_r();
43 double l_rmax = x_layer.outer_r();
44 double l_length = x_layer.dz();
46 string layer_name = det_name + _toString((
int)layer_num,
"layer%d");
47 Volume layer_vol(layer_name, Tube(l_rmin, l_rmax, l_length),
48 lcdd.material(x_layer.materialStr()));
49 DetElement lay_det(cylinderVolume, layer_name, layer_num);
51 layer_vol.setVisAttributes(lcdd, x_layer.visStr());
52 int module_num_num = 0;
54 if (x_layer.hasChild(_U(module))) {
55 for (xml_coll_t i(x_layer, _U(module)); i; i++) {
56 xml_comp_t x_module = i;
57 int repeat = x_module.repeat();
58 double deltaphi = 2. *
M_PI / repeat;
59 double radius = x_module.radius();
60 double slicedz = x_module.dz();
62 size_t module_num = 0;
67 Trapezoid(x_module.x1(), x_module.x2(), x_module.thickness(),
68 x_module.thickness(), x_module.length()),
69 lcdd.material(x_module.materialStr()));
70 mod_vol.setVisAttributes(lcdd, x_module.visStr());
76 x_module.x1(), x_module.x2(), x_module.length(),
77 x_module.thickness(), sens.readout().segmentation());
81 std::vector<PlacedVolume> sensComponents;
83 std::shared_ptr<const Acts::DigitizationModule> digiComponent =
nullptr;
86 for (xml_coll_t comp(x_module, _U(module_component)); comp; comp++) {
87 xml_comp_t x_comp = comp;
90 _toString((
int)comp_num,
"component%d") + x_comp.materialStr();
93 Trapezoid(x_comp.x1(), x_comp.x2(), x_comp.thickness(),
94 x_comp.thickness(), x_comp.length()),
95 lcdd.material(x_comp.materialStr()));
96 comp_vol.setVisAttributes(lcdd, x_comp.visStr());
103 x_comp.x1(), x_comp.x2(), x_comp.length(), x_comp.thickness(),
104 sens.readout().segmentation());
107 if (x_comp.isSensitive())
108 comp_vol.setSensitiveDetector(sens);
111 Position translation(0., x_comp.z(), 0.);
112 PlacedVolume placed_comp = mod_vol.placeVolume(comp_vol, translation);
113 if (x_comp.isSensitive())
114 sensComponents.push_back(placed_comp);
115 placed_comp.addPhysVolID(
"component", module_num);
120 for (
int k = 0;
k < repeat;
k++) {
121 string zname = _toString((
int)
k,
"z%d");
125 zname + _toString((
int)(repeat * module_num_num + module_num),
127 Position trans(radius *
cos(phi), radius * sin(phi), slicedz);
129 DetElement mod_det(lay_det, module_name,
130 repeat * module_num_num + module_num);
132 if (x_module.isSensitive()) {
133 mod_vol.setSensitiveDetector(sens);
140 for (
auto& sensComp : sensComponents) {
142 DetElement comp_det(mod_det,
"component", scomp_num);
146 comp_det.setPlacement(sensComp);
149 Rotation3D rotation1(1., 0., 0., 0., 1., 0., 0., 0., 1.);
152 RotationY(phi + 0.5 *
M_PI) *
153 RotationZ(0.1 *
M_PI),
155 PlacedVolume placedmodule =
156 layer_vol.placeVolume(mod_vol, rotation1 * transf1);
157 placedmodule.addPhysVolID(
"module",
158 repeat * module_num_num + module_num);
160 mod_det.setPlacement(placedmodule);
170 layerExtension->
addType(
"sensitive disk",
"layer");
174 Position layer_pos(0., 0., x_layer.z());
175 PlacedVolume placedLayer = tube_vol.placeVolume(layer_vol, layer_pos);
176 placedLayer.addPhysVolID(
"layer", layer_num);
177 lay_det.setPlacement(placedLayer);
183 Position endcap_translation(0., 0., x_det_dim.z());
184 Rotation3D rotation(1., 0., 0., 0., 1., 0., 0., 0., 1.);
185 if (x_det_dim.z() < 0.) {
186 rotation.SetComponents(1., 0., 0., 0., -1., 0., 0., 0., -1.);
188 Transform3D endcap_transform(rotation, endcap_translation);
189 Volume mother_vol = lcdd.pickMotherVolume(cylinderVolume);
190 PlacedVolume placedTube = mother_vol.placeVolume(tube_vol, endcap_transform);
191 placedTube.addPhysVolID(
"system", cylinderVolume.id());
192 cylinderVolume.setPlacement(placedTube);
194 return cylinderVolume;