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
#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();
double RIn = dims.rmin();
double ROut = dims.rmax();
double SizeZ = dims.z_length();
double ShiftZ = dims.z_offset();
double PosZ = dims.z();
double lay_RIn = dims.rmin1();
double lay_ROut = dims.rmax1();
double lay_dz = dims.dz();
Material mat_iron = desc.material("Iron");
Material mat_vac = desc.material("Vacuum");
//Outer volume
Tube ci_Hcal_Solid(RIn, ROut, SizeZ / 2., 0., 360 * dd4hep::deg);
Volume envelopeVol("ci_Hcal_Logic", ci_Hcal_Solid, mat_vac);
//Iron tube for the layers
Tube ci_Hcal_detSolid(lay_RIn, lay_ROut, lay_dz / 2., 0., 360 * dd4hep::deg);
//Adding layers to placed detector 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");
Volume layer_vol(layer_name, ci_Hcal_detSolid, mat_iron);
layer_vol.setVisAttributes(detElem.visStr());
sens.setType("calorimeter");
layer_vol.setSensitiveDetector(sens);
Position layer_pos(0, 0, x_layer.z());
PlacedVolume layer_phv = envelopeVol.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), Position(0, 0, ShiftZ));
PlacedVolume detPV = motherVol.placeVolume(envelopeVol, tr);
detPV.addPhysVolID("system", detID);
det.setPlacement(detPV);
return det;
}
// clang-format off
DECLARE_DETELEMENT(ci_HCAL, createDetector)