10 #include "DD4hep/DetFactoryHelper.h"
13 using namespace dd4hep;
22 xml_det_t x_det = xml;
23 string det_name = x_det.nameStr();
25 DetElement cylinderVolume(det_name, x_det.id());
28 detvolume->addType(
"endcap",
"detector");
31 dd4hep::xml::Dimension x_det_dim(x_det.dimensions());
32 Tube tube_shape(x_det_dim.rmin(), x_det_dim.rmax(), x_det_dim.dz());
33 Volume tube_vol(det_name, tube_shape,
35 tube_vol.setVisAttributes(lcdd, x_det_dim.visStr());
37 int module_num_num = 0;
39 for (xml_coll_t j(xml, _U(
layer)); j; ++j) {
40 xml_comp_t x_layer = j;
41 double l_rmin = x_layer.inner_r();
42 double l_rmax = x_layer.outer_r();
43 double l_length = x_layer.dz();
45 string layer_name = det_name + _toString((
int)layer_num,
"layer%d");
46 Volume layer_vol(layer_name, Tube(l_rmin, l_rmax, l_length),
47 lcdd.material(x_layer.materialStr()));
48 DetElement lay_det(cylinderVolume, layer_name, layer_num);
50 layer_vol.setVisAttributes(lcdd, x_layer.visStr());
52 if (x_layer.hasChild(_U(module))) {
53 for (xml_coll_t i(x_layer, _U(module)); i; i++) {
54 xml_comp_t x_module = i;
55 int repeat = x_module.repeat();
56 double deltaphi = 2. *
M_PI / repeat;
57 double radius = x_module.radius();
61 Trapezoid(x_module.x1(), x_module.x2(), x_module.thickness(),
62 x_module.thickness(), x_module.length()),
63 lcdd.material(x_module.materialStr()));
64 size_t module_num = 0;
66 for (
int k = 0;
k < repeat;
k++) {
67 double slicedz = x_module.dz();
69 slicedz -= 10. * x_module.thickness();
70 string zname = _toString((
int)
k,
"z%d");
72 mod_vol.setVisAttributes(lcdd, x_module.visStr());
75 zname + _toString((
int)(repeat * module_num_num + module_num),
77 Position trans(radius * cos(phi), radius * sin(phi), slicedz);
79 DetElement mod_det(lay_det, module_name,
80 repeat * module_num_num + module_num);
85 if (x_module.isSensitive()) {
86 mod_vol.setSensitiveDetector(sens);
89 PlacedVolume placedmodule = layer_vol.placeVolume(
93 placedmodule.addPhysVolID(
"module",
94 repeat * module_num_num + module_num);
96 mod_det.setPlacement(placedmodule);
106 detlayer->
addType(
"axes",
"definitions",
"XZy");
107 detlayer->
addType(
"sensitive disk",
"layer");
109 double layerZpos = x_layer.z();
111 Position layer_pos(0., 0., layerZpos);
112 PlacedVolume placedLayer = tube_vol.placeVolume(layer_vol, layer_pos);
113 placedLayer.addPhysVolID(
"layer", layer_num);
114 lay_det.setPlacement(placedLayer);
120 Position endcap_translation(0., 0., x_det_dim.z());
121 Rotation3D rotation(1., 0., 0., 0., 1., 0., 0., 0., 1.);
122 if (x_det_dim.z() < 0.) {
123 rotation.SetComponents(1., 0., 0., 0., 1., 0., 0., 0., -1.);
125 Transform3D endcap_transform(rotation, endcap_translation);
126 Volume mother_vol = lcdd.pickMotherVolume(cylinderVolume);
127 PlacedVolume placedTube = mother_vol.placeVolume(tube_vol, endcap_transform);
128 placedTube.addPhysVolID(
"system", cylinderVolume.id());
129 cylinderVolume.setPlacement(placedTube);
131 return cylinderVolume;