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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"
#include "TMath.h"
#include "DDRec/Surface.h"
#include "DDRec/DetectorData.h"
//#include "Acts/Plugins/DD4hep/ActsExtension.hpp"
using namespace std;
using namespace dd4hep;
using namespace dd4hep::rec;
/** \addtogroup trackers Tracking Detectors
*/
/** \addtogroup GEMdisc GEM Disc Tracker
* \brief Type: **GEMTrackerDisc**.
* \ingroup trackers
*
* A simple GEM disc tracker.
*
* \code
* <detector>
* </detector>
* \endcode
*
*/
static Ref_t create_detector(Detector& lcdd, xml_h e, SensitiveDetector sens)
{
typedef vector<PlacedVolume> Placements;
xml_det_t x_det = e;
Material air = lcdd.air();
Material carbon = lcdd.material("CarbonFiber");
Material silicon = lcdd.material("SiliconOxide");
int det_id = x_det.id();
string det_name = x_det.nameStr();
PlacedVolume pv;
DetElement sdet(det_name, det_id);
Assembly assembly(det_name+"_assembly");
sens.setType("tracker");
string module_name = "GEM";
double thickness = 0.01*dd4hep::cm;
int N_layers = 0;
for(xml_coll_t lay( x_det, _U(layer) ); lay; ++lay, ++N_layers) {
xml_comp_t x_layer = lay;
double inner_r = x_layer.attr<double>( _Unicode(inner_r) ) ;
double outer_r = x_layer.attr<double>( _Unicode(outer_r) ) ;
double phi0_offset = x_layer.attr<double>( _Unicode(phi0_offset) ) ;
double z = x_layer.attr<double>( _Unicode(z) ) ;
int layer_id = x_layer.id();//attr<double>( _Unicode(z) ) ;
string layer_name = std::string("gem_layer") + std::to_string(layer_id) ;
Tube gem_layer(inner_r, outer_r, thickness/2.0);
Volume gem_layer_vol("gem_layer_vol", gem_layer, carbon);
gem_layer_vol.setSensitiveDetector(sens);
DetElement layer_DE( sdet, _toString(layer_id,"layer%d"), layer_id );
pv = assembly.placeVolume( gem_layer_vol, Transform3D(RotationZ(phi0_offset),Position(0.0,0.0,z)) );
pv.addPhysVolID( "layer", layer_id );
layer_DE.setPlacement(pv);
}
sdet.setAttributes(lcdd, assembly,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
pv = lcdd.pickMotherVolume(sdet).placeVolume(assembly);
pv.addPhysVolID("system", det_id); // Set the subdetector system ID.
sdet.setPlacement(pv);
assembly->GetShape()->ComputeBBox() ;
return sdet;
}
DECLARE_DETELEMENT(my_GEMTracker, create_detector)