Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ActsStrawLayerBuilder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // ATHENA
9 #include "Identifier/Identifier.h"
10 
11 // PACKAGE
14 
15 // ACTS
16 #include "Acts/Geometry/ILayerBuilder.hpp"
17 #include "Acts/Surfaces/CylinderSurface.hpp"
18 #include "Acts/Surfaces/StrawSurface.hpp"
19 #include "Acts/Surfaces/DiscSurface.hpp"
20 #include "Acts/Geometry/LayerCreator.hpp"
21 #include "Acts/Definitions/Algebra.hpp"
22 #include "Acts/Geometry/ProtoLayer.hpp"
23 #include "Acts/Geometry/GeometryContext.hpp"
24 #include "Acts/Definitions/Units.hpp"
25 #include "Acts/Utilities/BinningType.hpp"
26 
27 // STL
28 #include <Acts/Utilities/AxisDefinitions.hpp>
29 #include <iostream>
30 #include <fstream>
31 
32 using namespace Acts::UnitLiterals;
33 
34 const Acts::LayerVector
35 ActsStrawLayerBuilder::negativeLayers(const Acts::GeometryContext& gctx) const
36 {
37  return endcapLayers(gctx, -1);
38 }
39 
40 const Acts::LayerVector
41 ActsStrawLayerBuilder::positiveLayers(const Acts::GeometryContext& gctx) const
42 {
43  return endcapLayers(gctx, 1);
44 
45 }
46 
47 
48 const Acts::LayerVector
49 ActsStrawLayerBuilder::centralLayers(const Acts::GeometryContext& gctx) const
50 {
51  ACTS_VERBOSE("Building central Straw layers");
52 
53  using LBBV = Acts::LineBounds::BoundValues;
54  using enum Acts::AxisDirection;
55 
56  const InDetDD::TRT_Numerology* trtNums = m_cfg.mng->getNumerology();
57  size_t nBarrelRings = trtNums->getNBarrelRings();
58  size_t nBarrelPhiSectors = trtNums->getNBarrelPhi();
59 
60 
61  ACTS_VERBOSE("- Numerology reports: - " << nBarrelRings << " barrel rings");
62  ACTS_VERBOSE(" - " << nBarrelPhiSectors << " barrel phi sectors");
63 
64  Acts::LayerVector layers;
65 
66  std::vector<Acts::ProtoLayer> protoLayers;
67 
68  for(size_t iring=0; iring < nBarrelRings;iring++) {
69  ACTS_VERBOSE("- Collecting elements for ring " << iring);
70 
71  // were calculating min/max radius while were at it.
72  Acts::ProtoLayer pl;
73  auto& ext = pl.extent;
74  ext.range(AxisR).setMin( std::numeric_limits<double>::max() );
75  ext.range(AxisR).setMax( std::numeric_limits<double>::lowest() );
76  ext.range(AxisZ).setMin( std::numeric_limits<double>::max() );
77  ext.range(AxisZ).setMax( std::numeric_limits<double>::lowest() );
78  ext.range(AxisPhi).setMin( -M_PI );
79  ext.range(AxisPhi).setMax( M_PI );
80 
81  pl.envelope[AxisZ] = {1_mm, 1_mm};
82  pl.envelope[AxisR] = {0_mm, 0_mm};
83 
84  double fudge = 0_mm;
85  // RING in TRT speak is translated to Layer in ACTS speak
86  std::vector<std::shared_ptr<const Acts::Surface>> layerSurfaces;
87 
88  size_t nBarrelLayers = trtNums->getNBarrelLayers(iring);
89  ACTS_VERBOSE(" - Numerology reports: " << nBarrelLayers << " layers in ring " << iring);
90  for (size_t ilayer=0;ilayer < nBarrelLayers;ilayer++) {
91  for (size_t iphisec=0;iphisec < nBarrelPhiSectors;iphisec++) {
92  // what is this?
93  for (size_t iposneg=0;iposneg<2;iposneg++) {
94 
95  const InDetDD::TRT_BarrelElement* brlElem
96  = m_cfg.mng->getBarrelElement(iposneg, iring, iphisec, ilayer);
97 
98  unsigned int nStraws = brlElem->nStraws();
99 
100  for(unsigned int istraw=0;istraw<nStraws;istraw++) {
101 
102  Acts::Transform3 trf = brlElem->strawTransform(istraw);
103  // need to convert translation to length unit
104  trf.translation() *= 1_mm;
105  auto code = brlElem->getCode();
106  Identifier straw_id = m_cfg.idHelper->straw_id(code.isPosZ() == 1 ? 1 : -1,
107  code.getPhiIndex(),
108  code.getModuleIndex(),
109  code.getStrawLayerIndex(),
110  istraw);
111 
112  auto elem = std::make_shared<const ActsDetectorElement>(
113  trf, *brlElem, straw_id);
114 
115  m_cfg.elementStore->push_back(elem);
116 
117  auto straw = dynamic_cast<const Acts::StrawSurface*>(&elem->surface());
118  if (not straw) continue;
119  auto strawBounds = dynamic_cast<const Acts::LineBounds*>(&straw->bounds());
120  if (not strawBounds) continue;
121  // units should be fine since they're already converted in det elem construction
122  double radius = strawBounds->get(LBBV::eR);
123  double length = strawBounds->get(LBBV::eHalfLengthZ);
124  fudge = radius / 4.;
125 
126  // calculate min/max R and Z
127  Acts::Vector3 ctr = straw->center(gctx);
128  ext.range(AxisR).setMax( std::max(ext.max(AxisR), ctr.perp() + radius) );
129  ext.range(AxisR).setMin( std::min(ext.min(AxisR), ctr.perp() - radius) );
130  ext.range(AxisZ).setMax( std::max(ext.max(AxisZ), ctr.z() + length) );
131  ext.range(AxisZ).setMin( std::min(ext.min(AxisZ), ctr.z() - length) );
132 
133  layerSurfaces.push_back(straw->getSharedPtr());
134  }
135  }
136  }
137  }
138 
139  ACTS_VERBOSE(" - Collected " << layerSurfaces.size() << " straws");
140 
141  if(iring > 0) {
142  // match outer radius of previous ring
143  const Acts::ProtoLayer &prev = protoLayers.at(iring-1);
144  ext.range(AxisR).setMin( prev.extent.max(AxisR) + prev.envelope[AxisR][1] + pl.envelope[AxisR][0] + fudge );
145  }
146 
147  std::shared_ptr<Acts::Layer> layer
148  = m_cfg.layerCreator->cylinderLayer(gctx, std::move(layerSurfaces), 100, 1, pl);
149  layers.push_back(layer);
150 
151  protoLayers.push_back(pl);
152 
153  }
154 
155  return layers;
156 }
157 
158 const Acts::LayerVector
159 ActsStrawLayerBuilder::endcapLayers(const Acts::GeometryContext& gctx, int side) const
160 {
161  ACTS_VERBOSE("Building endcap Straw layers");
162  using LBBV = Acts::LineBounds::BoundValues;
163  using enum Acts::AxisDirection;
164 
165  const InDetDD::TRT_Numerology* trtNums = m_cfg.mng->getNumerology();
166  size_t nEndcapWheels = trtNums->getNEndcapWheels();
167  size_t nEndcapPhiSectors = trtNums->getNEndcapPhi();
168 
169  ACTS_VERBOSE("- Numerology reports: - " << nEndcapWheels<< " endcap wheels");
170  ACTS_VERBOSE(" - " << nEndcapPhiSectors << " endcap phi sectors");
171 
172  Acts::LayerVector layers;
173 
174  for(size_t iwheel=0;iwheel<nEndcapWheels;++iwheel) {
175  ACTS_VERBOSE("- Collecting elements for wheel " << iwheel);
176 
177 
178  size_t nEndcapLayers = trtNums->getNEndcapLayers(iwheel);
179  ACTS_VERBOSE(" - Numerology reports: " << nEndcapLayers << " layers in wheel " << iwheel);
180  for(size_t ilayer=0;ilayer<nEndcapLayers;++ilayer) {
181  std::vector<std::shared_ptr<const Acts::Surface>> wheelSurfaces;
182 
183 
184  Acts::ProtoLayer pl;
185  auto& ext = pl.extent;;
186  ext.range(AxisR).setMin( std::numeric_limits<double>::max() );
187  ext.range(AxisR).setMax( std::numeric_limits<double>::lowest() );
188  ext.range(AxisZ).setMin( std::numeric_limits<double>::max() );
189  ext.range(AxisZ).setMax( std::numeric_limits<double>::lowest() );
190  ext.range(AxisPhi).setMin( -M_PI );
191  ext.range(AxisPhi).setMax( M_PI );
192  pl.envelope[AxisR] = {0_mm, 0_mm};
193 
194  for (unsigned int iphisec=0; iphisec<nEndcapPhiSectors; ++iphisec) {
195 
196  size_t iposneg = side < 0 ? 0 : 1;
197  const InDetDD::TRT_EndcapElement* ecElem = m_cfg.mng->getEndcapElement(iposneg, iwheel, ilayer, iphisec);
198  unsigned int nStraws = ecElem->nStraws();
199 
200  for(unsigned int istraw=0;istraw<nStraws;istraw++) {
201 
202  Acts::Transform3 trf = (ecElem->strawTransform(istraw));
203  // need to convert translation to length unit
204  trf.translation() *= 1_mm;
205 
206  auto code = ecElem->getCode();
207  Identifier straw_id = m_cfg.idHelper->straw_id(code.isPosZ() == 1 ? 2 : -2,
208  code.getPhiIndex(),
209  code.getWheelIndex(),
210  code.getStrawLayerIndex(),
211  istraw);
212 
213 
214  auto elem = std::make_shared<const ActsDetectorElement>(
215  trf, *ecElem, straw_id);
216 
217  m_cfg.elementStore->push_back(elem);
218 
219  auto straw = dynamic_cast<const Acts::StrawSurface*>(&elem->surface());
220  if (straw){
221  auto strawBounds = dynamic_cast<const Acts::LineBounds*>(&straw->bounds());
222  if (strawBounds){
223  double radius = strawBounds->get(LBBV::eR);
224  double length = strawBounds->get(LBBV::eHalfLengthZ);
225 
226  Acts::Vector3 ctr = straw->center(gctx);
227  ext.range(AxisZ).setMax( std::max(ext.max(AxisZ), ctr.z() + radius) );
228  ext.range(AxisZ).setMin( std::min(ext.min(AxisZ), ctr.z() - radius) );
229  ext.range(AxisR).setMax( std::max(ext.max(AxisR), ctr.perp() + length) );
230  ext.range(AxisR).setMin( std::min(ext.min(AxisR), ctr.perp() - length) );
231  pl.envelope[AxisZ] = {radius/2., radius/2.};
232 
233  wheelSurfaces.push_back(straw->getSharedPtr());
234  }
235  }
236  }
237  }
238 
239  std::shared_ptr<Acts::Layer> layer
240  = m_cfg.layerCreator->discLayer(gctx, std::move(wheelSurfaces), 1, 100, pl);
241  layers.push_back(layer);
242  ACTS_VERBOSE(" - Collected " << wheelSurfaces.size() << " straws");
243  }
244 
245  }
246 
247  ACTS_VERBOSE(" - Built " << layers.size() << " straw endcap layers");
248  return layers;
249 }
ActsStrawLayerBuilder::negativeLayers
const Acts::LayerVector negativeLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsStrawLayerBuilder.cxx:35
InDetDD::TRT_BarrelElement
Definition: TRT_BarrelElement.h:43
TRT::Hit::straw
@ straw
Definition: HitInfo.h:82
TRT_DetectorManager.h
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
InDetDD::TRT_BaseElement::nStraws
unsigned int nStraws() const
Number of straws in the element.
ActsStrawLayerBuilder::endcapLayers
const Acts::LayerVector endcapLayers(const Acts::GeometryContext &gctx, int side) const
Definition: ActsStrawLayerBuilder.cxx:159
ActsStrawLayerBuilder.h
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:114
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
ActsStrawLayerBuilder::centralLayers
const Acts::LayerVector centralLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsStrawLayerBuilder.cxx:49
M_PI
#define M_PI
Definition: ActiveFraction.h:11
InDetDD::TRT_EndcapElement
Definition: TRT_EndcapElement.h:43
TRT::Hit::side
@ side
Definition: HitInfo.h:83
InDetDD::TRT_Numerology::getNEndcapWheels
unsigned int getNEndcapWheels() const
histSizes.code
code
Definition: histSizes.py:129
InDetDD::TRT_Numerology
Definition: TRT_Numerology.h:22
InDetDD::TRT_EndcapElement::getCode
const TRT_EndcapCode & getCode() const
Doomed (??)
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
ActsStrawLayerBuilder::positiveLayers
const Acts::LayerVector positiveLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsStrawLayerBuilder.cxx:41
InDetDD::TRT_Numerology::getNBarrelPhi
unsigned int getNBarrelPhi() const
InDetDD::TRT_Numerology::getNBarrelLayers
unsigned int getNBarrelLayers(unsigned int iMod) const
MakeFileForMJB.ext
string ext
Definition: Moriond2016/MakeFileForMJB.py:41
ActsDetectorElement.h
InDetDD::TRT_BarrelElement::getCode
const TRT_BarrelCode & getCode() const
Doomed (?):
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
InDetDD::TRT_BaseElement::strawTransform
const Amg::Transform3D & strawTransform(unsigned int straw) const
Straw transform - fast access in array, in Tracking frame: Amg.
Definition: TRT_BaseElement.cxx:89
TRT_Numerology.h
InDetDD::TRT_Numerology::getNEndcapPhi
unsigned int getNEndcapPhi() const
InDetDD::TRT_Numerology::getNEndcapLayers
unsigned int getNEndcapLayers(unsigned int iWheel) const
InDetDD::TRT_Numerology::getNBarrelRings
unsigned int getNBarrelRings() const
CaloLCW_tf.trf
trf
Definition: CaloLCW_tf.py:20
dqt_zlumi_alleff_HIST.ctr
ctr
Definition: dqt_zlumi_alleff_HIST.py:193
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
Identifier
Definition: IdentifierFieldParser.cxx:14