ATLAS Offline Software
Loading...
Searching...
No Matches
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
32using namespace Acts::UnitLiterals;
33
34const Acts::LayerVector
35ActsStrawLayerBuilder::negativeLayers(const Acts::GeometryContext& gctx) const
36{
37 return endcapLayers(gctx, -1);
38}
39
40const Acts::LayerVector
41ActsStrawLayerBuilder::positiveLayers(const Acts::GeometryContext& gctx) const
42{
43 return endcapLayers(gctx, 1);
44
45}
46
47
48const Acts::LayerVector
49ActsStrawLayerBuilder::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
158const Acts::LayerVector
159ActsStrawLayerBuilder::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}
#define M_PI
double length(const pvec &v)
This is an Identifier helper class for the TRT subdetector.
const Acts::LayerVector positiveLayers(const Acts::GeometryContext &gctx) const override
const Acts::LayerVector centralLayers(const Acts::GeometryContext &gctx) const override
const Acts::LayerVector endcapLayers(const Acts::GeometryContext &gctx, int side) const
Config m_cfg
configruation object
const Acts::LayerVector negativeLayers(const Acts::GeometryContext &gctx) const override
Extended TRT_BaseElement to describe a TRT readout element, this is a planar layer with n ( order of ...
const TRT_BarrelCode & getCode() const
Doomed (?):
unsigned int nStraws() const
Number of straws in the element.
const Amg::Transform3D & strawTransform(unsigned int straw) const
Straw transform - fast access in array, in Tracking frame: Amg.
Extended class of a TRT_BaseElement to describe a readout elment in the endcap.
const TRT_EndcapCode & getCode() const
Doomed (?
Helper class to organize the straw elements on TRT readout elements.
unsigned int getNEndcapWheels() const
unsigned int getNEndcapPhi() const
unsigned int getNBarrelPhi() const
unsigned int getNBarrelRings() const
unsigned int getNBarrelLayers(unsigned int iMod) const
unsigned int getNEndcapLayers(unsigned int iWheel) const