Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <XML/Helper.h>
///////////////////////////
// Central Ion GEM
///////////////////////////
using namespace dd4hep;
static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens)
{
xml::DetElement detElem = handle;
std::string detName = detElem.nameStr();
int detID = detElem.id();
xml::Component dims = detElem.dimensions();
xml::Component pos = detElem.position();
double SizeZ = dims.z_length(); // Size in Z direction
double ROut = dims.rmax(); // Outer radius
double RIn = dims.rmin(); // Inner radius
double ShiftZ = dims.z_offset();
double X = dims.x();
double Z = dims.z();
int Nlayers = dims.number();
double HCAL_rmin = dims.rmax1(); // Maximum radius that the layer can be
Material mat = desc.material(detElem.materialStr());
Material vac = desc.material("Vacuum");
// Outer Volume
Tube ci_GEM_GVol_Solid(RIn, ROut, SizeZ / 2., 0., 360 * deg);
Volume detVol("ci_GEM_GVol_Logic", ci_GEM_GVol_Solid, vac);
// Adding layers to placed volume
for (xml_coll_t li(detElem, _U(layer)); li; ++li) {
xml_comp_t x_layer = li;
std::string layer_name = detName + _toString(x_layer.id(), "_layer%d");
double outer_r = x_layer.outer_r();
if (outer_r > HCAL_rmin) {
outer_r = HCAL_rmin;
}
Volume layer_vol(layer_name, Tube(x_layer.inner_r(), outer_r, x_layer.dz()), mat);
layer_vol.setVisAttributes(desc.visAttributes(detElem.visStr()));
sens.setType("tracker");
layer_vol.setSensitiveDetector(sens);
Position layer_pos(0, 0, x_layer.z());
PlacedVolume layer_phv = detVol.placeVolume(layer_vol, layer_pos);
layer_phv.addPhysVolID("layer", x_layer.id());
}
DetElement det(detName, detID);
Volume motherVol = desc.pickMotherVolume(det);
Transform3D tr(RotationZYX(0.0, 0.0, 0.0), Position(pos.x(), pos.x(), pos.z() + SizeZ / 2.0));
PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
detPV.addPhysVolID("system", detID);
det.setPlacement(detPV);
return det;
}
// clang-format off
DECLARE_DETELEMENT(ci_GEM, createDetector)