SiTrackerBarrel_geo.cpp 8.12 KB
Newer Older
1
2
3
//==========================================================================
// Specialized generic detector constructor
//==========================================================================
4
5
6

#include "Acts/Plugins/DD4hep/ActsExtension.hpp"
#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp"
7
8
9
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"

10

11
12
13
14
15
using namespace std;
using namespace dd4hep;
using namespace dd4hep::detail;

static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  typedef vector<PlacedVolume> Placements;
  xml_det_t x_det = e;
  Material air = description.air();

  int det_id = x_det.id();
  string det_name = x_det.nameStr();
  DetElement sdet(det_name, det_id);

  Acts::ActsExtension* barrelExtension = new Acts::ActsExtension();
  barrelExtension->addType("barrel", "detector");
  sdet.addExtension<Acts::ActsExtension>(barrelExtension);

  Assembly                assembly(det_name);
  map<string, Volume>     volumes;
  map<string, Placements> sensitives;
  PlacedVolume            pv;

  sens.setType("tracker");
  for (xml_coll_t mi(x_det, _U(module)); mi; ++mi) {
    xml_comp_t x_mod = mi;
    xml_comp_t m_env = x_mod.child(_U(module_envelope));
    string     m_nam = x_mod.nameStr();
Whitney Armstrong's avatar
Whitney Armstrong committed
38
    Volume     m_vol(m_nam, Box(m_env.thickness() / 2,m_env.width() / 2, m_env.length() / 2 ), air);
39
40
41
42
43
    int        ncomponents = 0, sensor_number = 1;

    if (volumes.find(m_nam) != volumes.end()) {
      printout(ERROR, "SiTrackerBarrel", "Logics error in building modules.");
      throw runtime_error("Logics error in building modules.");
44
    }
45
46
47
48
49
50
51
    volumes[m_nam] = m_vol;
    m_vol.setVisAttributes(description.visAttributes(x_mod.visStr()));
    for (xml_coll_t ci(x_mod, _U(module_component)); ci; ++ci, ++ncomponents) {
      xml_comp_t x_comp = ci;
      xml_comp_t x_pos  = x_comp.position(false);
      xml_comp_t x_rot  = x_comp.rotation(false);
      string     c_nam  = _toString(ncomponents, "component%d");
Whitney Armstrong's avatar
Whitney Armstrong committed
52
      Box        c_box(x_comp.thickness() / 2, x_comp.width() / 2 ,x_comp.length() / 2 );
53
      Volume     c_vol(c_nam, c_box, description.material(x_comp.materialStr()));
Whitney Armstrong's avatar
Whitney Armstrong committed
54
55
56
57
58
      PlacedVolume c_pv;
      //if (x_pos) {
      //std::cout << x_pos.x(0) << "\n";
      //}

59
60
61
62

      if (x_pos && x_rot) {
        Position    c_pos(x_pos.x(0), x_pos.y(0), x_pos.z(0));
        RotationZYX c_rot(x_rot.z(0), x_rot.y(0), x_rot.x(0));
Whitney Armstrong's avatar
Whitney Armstrong committed
63
        c_pv = m_vol.placeVolume(c_vol, Transform3D(c_rot, c_pos));
64
      } else if (x_rot) {
Whitney Armstrong's avatar
Whitney Armstrong committed
65
        c_pv = m_vol.placeVolume(c_vol, RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0)));
66
      } else if (x_pos) {
Whitney Armstrong's avatar
Whitney Armstrong committed
67
        c_pv = m_vol.placeVolume(c_vol, Position(x_pos.x(0), x_pos.y(0), x_pos.z(0)));
68
      } else {
Whitney Armstrong's avatar
Whitney Armstrong committed
69
        c_pv = m_vol.placeVolume(c_vol);
70
71
72
73
74
      }
      c_vol.setRegion(description, x_comp.regionStr());
      c_vol.setLimitSet(description, x_comp.limitsStr());
      c_vol.setVisAttributes(description, x_comp.visStr());
      if (x_comp.isSensitive()) {
Whitney Armstrong's avatar
Whitney Armstrong committed
75
        c_pv.addPhysVolID(_U(sensor), sensor_number++);
76
        c_vol.setSensitiveDetector(sens);
Whitney Armstrong's avatar
Whitney Armstrong committed
77
        sensitives[m_nam].push_back(c_pv);
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
      }
    }
  }
  for (xml_coll_t li(x_det, _U(layer)); li; ++li) {
    xml_comp_t x_layer  = li;
    xml_comp_t x_barrel = x_layer.child(_U(barrel_envelope));
    xml_comp_t x_layout = x_layer.child(_U(rphi_layout));
    xml_comp_t z_layout = x_layer.child(_U(z_layout)); // Get the <z_layout> element.
    int        lay_id   = x_layer.id();
    string     m_nam    = x_layer.moduleStr();
    string     lay_nam  = _toString(x_layer.id(), "layer%d");
    Tube       lay_tub(x_barrel.inner_r(), x_barrel.outer_r(), x_barrel.z_length() / 2);
    Volume     lay_vol(lay_nam, lay_tub, air); // Create the layer envelope volume.
    lay_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
    double      phi0     = x_layout.phi0();     // Starting phi of first module.
    double      phi_tilt = x_layout.phi_tilt(); // Phi tilt of a module.
    double      rc       = x_layout.rc();       // Radius of the module center.
    int         nphi     = x_layout.nphi();     // Number of modules in phi.
    double      rphi_dr  = x_layout.dr();       // The delta radius of every other module.
    double      phi_incr = (M_PI * 2) / nphi;   // Phi increment for one module.
    double      phic     = phi0;                // Phi of the module center.
    double      z0       = z_layout.z0();       // Z position of first module in phi.
    double      nz       = z_layout.nz();       // Number of modules to place in z.
    double      z_dr     = z_layout.dr();       // Radial displacement parameter, of every other module.
    Volume      m_env    = volumes[m_nam];
    DetElement  lay_elt(sdet, _toString(x_layer.id(), "layer%d"), lay_id);

    Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
    layerExtension->addType("sensitive cylinder", "layer");
Whitney Armstrong's avatar
Whitney Armstrong committed
107
    //layerExtension->addValue(10. * Acts::UnitConstants::mm, "r", "envelope");
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    lay_elt.addExtension<Acts::ActsExtension>(layerExtension);

    Placements& sensVols = sensitives[m_nam];

    // Z increment for module placement along Z axis.
    // Adjust for z0 at center of module rather than
    // the end of cylindrical envelope.
    double z_incr = nz > 1 ? (2.0 * z0) / (nz - 1) : 0.0;
    // Starting z for module placement along Z axis.
    double module_z = -z0;
    int    module   = 1;

    // Loop over the number of modules in phi.
    for (int ii = 0; ii < nphi; ii++) {
      double dx = z_dr * std::cos(phic + phi_tilt); // Delta x of module position.
      double dy = z_dr * std::sin(phic + phi_tilt); // Delta y of module position.
      double x  = rc * std::cos(phic);              // Basic x module position.
      double y  = rc * std::sin(phic);              // Basic y module position.

      // Loop over the number of modules in z.
      for (int j = 0; j < nz; j++) {
        string     module_name = _toString(module, "module%d");
        DetElement mod_elt(lay_elt, module_name, module);
        // Module PhysicalVolume.
        //         Transform3D
        //         tr(RotationZYX(0,-((M_PI/2)-phic-phi_tilt),M_PI/2),Position(x,y,module_z));
        // NOTE (Nikiforos, 26/08 Rotations needed to be fixed so that component1 (silicon) is on the
        // outside
Whitney Armstrong's avatar
Whitney Armstrong committed
136
        Transform3D tr(RotationZYX(phic - phi_tilt,0, 0), Position(x, y, module_z));
137
138
139
140
141
142
143
144

        pv = lay_vol.placeVolume(m_env, tr);
        pv.addPhysVolID("module", module);
        mod_elt.setPlacement(pv);
        for (size_t ic = 0; ic < sensVols.size(); ++ic) {
          PlacedVolume sens_pv = sensVols[ic];
          DetElement   comp_elt(mod_elt, sens_pv.volume().name(), module);
          comp_elt.setPlacement(sens_pv);
Whitney Armstrong's avatar
Whitney Armstrong committed
145
          Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("YZX");
146
          comp_elt.addExtension<Acts::ActsExtension>(moduleExtension);
147
        }
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

        /// Increase counters etc.
        module++;
        // Adjust the x and y coordinates of the module.
        x += dx;
        y += dy;
        // Flip sign of x and y adjustments.
        dx *= -1;
        dy *= -1;
        // Add z increment to get next z placement pos.
        module_z += z_incr;
      }
      phic += phi_incr; // Increment the phi placement of module.
      rc += rphi_dr;    // Increment the center radius according to dr parameter.
      rphi_dr *= -1;    // Flip sign of dr parameter.
      module_z = -z0;   // Reset the Z placement parameter for module.
164
    }
165
166
167
168
169
170
171
172
173
174
    // Create the PhysicalVolume for the layer.
    pv = assembly.placeVolume(lay_vol); // Place layer in mother
    pv.addPhysVolID("layer", lay_id);   // Set the layer ID.
    lay_elt.setAttributes(description, lay_vol, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr());
    lay_elt.setPlacement(pv);
  }
  sdet.setAttributes(description, assembly, x_det.regionStr(), x_det.limitsStr(), x_det.visStr());
  assembly.setVisAttributes(description.invisible());
  pv = description.pickMotherVolume(sdet).placeVolume(assembly);
  pv.addPhysVolID("system", det_id); // Set the subdetector system ID.
Whitney Armstrong's avatar
Whitney Armstrong committed
175
  pv.addPhysVolID("barrel", 1);      // Flag this as a barrel subdetector.
176
177
  sdet.setPlacement(pv);
  return sdet;
178
179
180
181
}

// clang-format off
DECLARE_DETELEMENT(topside_SiTrackerBarrel, create_detector)