ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrk::TrackingGeometrySvc Class Reference

#include <TrackingGeometrySvc.h>

Inheritance diagram for ActsTrk::TrackingGeometrySvc:

Public Member Functions

StatusCode initialize () override
 TrackingGeometrySvc (const std::string &name, ISvcLocator *pSvcLocator)
std::shared_ptr< const Acts::TrackingGeometry > trackingGeometry () override
 Returns a pointer to the internal ACTS tracking geometry.
unsigned int populateAlignmentStore (ActsTrk::DetectorAlignStore &store) const override
 Loops through the volumes of the tracking geometry and caches the aligned transforms in the store.
const ActsTrk::GeometryContextgetNominalContext () const override
 Returns an empty nominal context without any alignment caches.
const Acts::TrackingVolume * getEnvelope (const ActsTrk::SystemEnvelope envType) const override
 Returns the envelope volume from the tracking geometry that's containing all volumes of the subsystem.

Private Member Functions

ActsLayerBuilder::Config makeLayerBuilderConfig (const InDetDD::InDetDetectorManager *manager)
std::shared_ptr< const Acts::ILayerBuilder > makeStrawLayerBuilder (const InDetDD::InDetDetectorManager *manager)
std::shared_ptr< const Acts::ILayerBuilder > makeHGTDLayerBuilder (const HGTD_DetectorManager *manager)
std::shared_ptr< Acts::TrackingVolume > makeSCTTRTAssembly (const Acts::GeometryContext &gctx, const Acts::ILayerBuilder &sct_lb, const Acts::ILayerBuilder &trt_lb, const Acts::CylinderVolumeHelper &cvh, const std::shared_ptr< const Acts::TrackingVolume > &pixel)
Acts::CylinderVolumeBuilder::Config makeBeamPipeConfig (std::shared_ptr< const Acts::CylinderVolumeHelper > cvh) const
bool runConsistencyChecks () const

Private Attributes

ServiceHandle< StoreGateSvcm_detStore
const InDetDD::SiDetectorManagerp_pixelManager {nullptr}
const InDetDD::SiDetectorManagerp_SCTManager {nullptr}
const InDetDD::TRT_DetectorManagerp_TRTManager {nullptr}
const InDetDD::SiDetectorManagerp_ITkPixelManager {nullptr}
const InDetDD::SiDetectorManagerp_ITkStripManager {nullptr}
const BeamPipeDetectorManagerp_beamPipeMgr {nullptr}
const HGTD_DetectorManagerp_HGTDManager {nullptr}
std::shared_ptr< ActsElementVectorm_elementStore {nullptr}
std::shared_ptr< const Acts::TrackingGeometry > m_trackingGeometry {nullptr}
const TRT_IDm_TRT_idHelper {nullptr}
const HGTD_IDm_HGTD_idHelper {nullptr}
ActsTrk::GeometryContext m_nominalContext {}
Gaudi::Property< bool > m_useMaterialMap {this, "UseMaterialMap", false, ""}
Gaudi::Property< bool > m_objDebugOutput {this, "ObjDebugOutput", false, ""}
Gaudi::Property< std::string > m_materialMapInputFileBase {this, "MaterialMapInputFile", "", ""}
Gaudi::Property< std::string > m_materialMapCalibFolder {this, "MaterialMapCalibFolder", ".", ""}
Gaudi::Property< bool > m_buildBeamPipe {this, "BuildBeamPipe", false, ""}
Gaudi::Property< bool > m_printGeo {this, "printGeometry", false}
 Print the assembled tracking geometry after building.
Gaudi::Property< std::vector< size_t > > m_barrelMaterialBins {this, "BarrelMaterialBins", {10, 10}}
Gaudi::Property< std::vector< size_t > > m_endcapMaterialBins {this, "EndcapMaterialBins", {5, 20}}
Gaudi::Property< std::vector< std::string > > m_buildSubdetectors {this, "BuildSubDetectors", {"Pixel", "SCT", "TRT", "Calo", "HGTD", "Muon"}}
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerRadii {this, "PassiveITkInnerPixelBarrelLayerRadii", {}}
 the specifications for building additional passive cylinders in the barrel region: for each cylinder you want to specify radius, half length in z and thickness
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerHalflengthZ {this, "PassiveITkInnerPixelBarrelLayerHalflengthZ", {}}
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerThickness {this, "PassiveITkInnerPixelBarrelLayerThickness", {}}
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerRadii {this, "PassiveITkOuterPixelBarrelLayerRadii", {}}
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerHalflengthZ {this, "PassiveITkOuterPixelBarrelLayerHalflengthZ", {}}
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerThickness {this, "PassiveITkOuterPixelBarrelLayerThickness", {}}
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerRadii {this, "PassiveITkStripBarrelLayerRadii", {}}
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerHalflengthZ {this, "PassiveITkStripBarrelLayerHalflengthZ", {}}
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerThickness {this, "PassiveITkStripBarrelLayerThickness", {}}
BooleanProperty m_runConsistencyChecks
StringProperty m_consistencyCheckOutput
Gaudi::Property< size_t > m_consistencyCheckPoints
ToolHandle< IActsTrackingVolumeBuilderm_caloVolumeBuilder {this, "CaloVolumeBuilder", ""}
ToolHandleArray< ActsTrk::IBlueprintNodeBuilderm_blueprintNodeBuilders {this, "BlueprintNodeBuilders", {}}
ToolHandleArray< ActsTrk::IRefineTrackingGeoToolm_refineVisitors {this, "RefinementTools", {}}
Gaudi::Property< std::vector< unsigned int > > m_subDetNoAlignProp {this, "NotAlignDetectors", {}}
 Define the subdetectors for which the tracking geometry does not expect a valid alignment store.
std::set< ActsTrk::DetectorTypem_subDetNoAlign {}
Gaudi::Property< bool > m_useBlueprint {this, "UseBlueprint", false, "Use the new Blueprint API for geometry construction"}
Gaudi::Property< std::string > m_blueprintGraphviz
Gaudi::Property< bool > m_doEndcapLayerMerging {this, "DoEndcapLayerMerging", true, "Merge overlapping endcap layers in z"}
Gaudi::Property< double > m_numberOfBinsFactor {this, "NumberOfBinsFactor", 5.0}
 controls how many bins are created for the sensitive surface grid.
Gaudi::Property< double > m_numberOfInnermostLayerBinsFactor {this, "NumberOfInnermostLayerBinsFactor",2.0}
 Special treatment for the innermost pixel layer to have more control on bin size to account for shallow angle tracks.

Detailed Description

Definition at line 58 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

Constructor & Destructor Documentation

◆ TrackingGeometrySvc()

ActsTrk::TrackingGeometrySvc::TrackingGeometrySvc ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 72 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

74 : base_class(name, svc),
75 m_detStore("StoreGateSvc/DetectorStore", name),
76 m_elementStore (std::make_shared<ActsElementVector>())
77{
78}
std::shared_ptr< ActsElementVector > m_elementStore

Member Function Documentation

◆ getEnvelope()

const Acts::TrackingVolume * ActsTrk::TrackingGeometrySvc::getEnvelope ( const ActsTrk::SystemEnvelope envType) const
override

Returns the envelope volume from the tracking geometry that's containing all volumes of the subsystem.

Definition at line 1222 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

1222 {
1223 const Acts::TrackingVolume* retVol{nullptr};
1224 using namespace ActsTrk::detail::GeoVolIds;
1225 switch (envType) {
1226 using enum ActsTrk::SystemEnvelope;
1227 case ITkExit:
1228 break;
1229 case CaloExit:
1230 retVol = m_trackingGeometry->findVolume(Acts::GeometryIdentifier{}.withVolume(s_caloEnvelopeID));
1231 break;
1232 case MsExit:
1233 break;
1234 }
1235 if(!retVol) {
1236 THROW_EXCEPTION("There is no system envelope "<<envType);
1237 }
1238 return retVol;
1239}
std::shared_ptr< const Acts::TrackingGeometry > m_trackingGeometry
SystemEnvelope
Define an enumeration to retrieve the envelope tracking volume from.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ getNominalContext()

const GeometryContext & ActsTrk::TrackingGeometrySvc::getNominalContext ( ) const
override

Returns an empty nominal context without any alignment caches.

Definition at line 1139 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

◆ initialize()

StatusCode ActsTrk::TrackingGeometrySvc::initialize ( )
override

Definition at line 80 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

80 {
81 ATH_MSG_INFO(name() << " is initializing");
82 for (unsigned int skipAlign : m_subDetNoAlignProp) {
83 try {
84 m_subDetNoAlign.insert(static_cast<DetectorType>(skipAlign));
85 } catch (...) {
86 ATH_MSG_FATAL("Failed to interpret " << m_subDetNoAlignProp << " as ActsDetectorElements");
87 return StatusCode::FAILURE;
88 }
89 }
90 ATH_CHECK(m_caloVolumeBuilder.retrieve(EnableTool{!m_caloVolumeBuilder.empty()}));
91
92 // FIXME: ActsCaloTrackingVolumeBuilder holds ReadHandle to
93 // CaloDetDescrManager. Hopefully this service is never called before that
94 // object is available.
95 m_autoRetrieveTools = false;
96 m_checkToolDeps = false;
97
98 ATH_MSG_INFO("ACTS version is: v"
99 << Acts::VersionMajor << "." << Acts::VersionMinor << "."
100 << Acts::VersionPatch << " [" << Acts::CommitHash.value_or("unknown hash") << "]");
101
102 // load which subdetectors to build from property
103 std::set<std::string> buildSubdet(m_buildSubdetectors.begin(),
104 m_buildSubdetectors.end());
105 ATH_MSG_INFO("Configured to build " << buildSubdet.size()
106 << " subdetectors:");
107 for (const auto &s : buildSubdet) {
108 ATH_MSG_INFO(" - " << s);
109 }
110
111 ATH_MSG_DEBUG("Loading detector manager(s)");
112 if (buildSubdet.find("Pixel") != buildSubdet.end()) {
113 ATH_CHECK(m_detStore->retrieve(p_pixelManager, "Pixel"));
114 }
115 if (buildSubdet.find("SCT") != buildSubdet.end()) {
116 ATH_CHECK(m_detStore->retrieve(p_SCTManager, "SCT"));
117 }
118 if (buildSubdet.find("TRT") != buildSubdet.end()) {
119 ATH_CHECK(m_detStore->retrieve(p_TRTManager, "TRT"));
120 ATH_CHECK(m_detStore->retrieve(m_TRT_idHelper, "TRT_ID"));
121 }
122 if (buildSubdet.find("ITkPixel") != buildSubdet.end()) {
123 ATH_CHECK(m_detStore->retrieve(p_ITkPixelManager, "ITkPixel"));
124 }
125 if (buildSubdet.find("ITkStrip") != buildSubdet.end()) {
126 ATH_CHECK(m_detStore->retrieve(p_ITkStripManager, "ITkStrip"));
127 }
128 if (buildSubdet.find("HGTD") != buildSubdet.end()) {
129 ATH_CHECK(m_detStore->retrieve(p_HGTDManager, "HGTD"));
130 ATH_CHECK(m_detStore->retrieve(m_HGTD_idHelper, "HGTD_ID"));
131 }
132
133 if(m_buildBeamPipe) {
134 ATH_CHECK(m_detStore->retrieve(p_beamPipeMgr, "BeamPipe"));
135 }
136
137 // Consistency check on the size vectors for passive layers
140 ATH_MSG_FATAL("Consistency check for ITk inner pixel barrel passive layer construction failed. Please check your inputs! ");
141 return StatusCode::FAILURE;
142 }
143
146 ATH_MSG_FATAL("Consistency check for ITk outer pixel barrel passive layer construction failed. Please check your inputs! ");
147 return StatusCode::FAILURE;
148 }
149
152 ATH_MSG_FATAL("Consistency check for ITk strip barrel passive layer construction failed. Please check your inputs! ");
153 return StatusCode::FAILURE;
154 }
155
156 if (m_useBlueprint) {
157
158
159 ATH_MSG_INFO("Using Blueprint API for geometry construction");
160 std::set<std::string> buildSubdet(m_buildSubdetectors.begin(),
161 m_buildSubdetectors.end());
162
164 ATH_CHECK(m_refineVisitors.retrieve());
165
166 using enum Acts::AxisDirection;
167
168 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
169 std::transform(m_blueprintNodeBuilders.begin(), m_blueprintNodeBuilders.end(),
170 std::back_inserter(ptrBuilders),
171 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>& b) { return b.get(); });
172
173 auto logger = makeActsAthenaLogger(this, std::string("Blueprint"), std::string("ActsTGSvc"));
174
175 Acts::Experimental::Blueprint::Config cfg;
176 cfg.envelope[AxisZ] = {20_mm, 20_mm};
177 cfg.envelope[AxisR] = {0_mm, 20_mm};
178
179 auto blueprint = std::make_unique<Acts::Experimental::Blueprint>(cfg);
180
181 auto& root = blueprint->addCylinderContainer("Detector", AxisZ);
182 //The starting top node
183 std::shared_ptr<Acts::Experimental::BlueprintNode> currentTop{nullptr};
184
185 for (auto& builder : ptrBuilders) {
186 currentTop = builder->buildBlueprintNode(getNominalContext().context(), std::move(currentTop));
187
188 }
189
190 root.addChild(std::move(currentTop));
191
192 std::unique_ptr<Acts::TrackingGeometry> trackingGeometry = blueprint->construct(
193 {}, getNominalContext().context(), *logger->clone(std::nullopt, Acts::Logging::DEBUG));
194
195 for (auto& refineVisitor : m_refineVisitors) {
196 trackingGeometry->apply(*refineVisitor);
197 ATH_CHECK(refineVisitor->finalize());
198 }
199 m_refineVisitors.clear();
200
202
203 if (m_objDebugOutput) {
204 Acts::ObjVisualization3D vis;
205 m_trackingGeometry->visualize(vis, getNominalContext().context(), {.visible = false},
206 {.visible = false}, {.visible = true});
207 vis.write("blueprint_sensitive.obj");
208 vis.clear();
209
210 m_trackingGeometry->visualize(vis, getNominalContext().context(), {.visible = true},
211 {.visible = false}, {.visible = false});
212 vis.write("blueprint_volume.obj");
213 vis.clear();
214
215 m_trackingGeometry->visualize(vis, getNominalContext().context(), {.visible = false},
216 {.visible = true}, {.visible = false});
217 vis.write("blueprint_portals.obj");
218 }
219 if (m_printGeo) {
220 Acts::detail::TrackingGeometryPrintVisitor printer{m_nominalContext.context()};
221 m_trackingGeometry->apply(printer);
222 ATH_MSG_INFO("Built tracking geometry \n"<<printer.stream().str());
223 }
224
225 return StatusCode::SUCCESS;
226 }
227
228 ATH_MSG_DEBUG("Setting up ACTS geometry helpers");
229
230 Acts::LayerArrayCreator::Config lacCfg;
231 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
232 lacCfg, makeActsAthenaLogger(this, std::string("LayArrCrtr"), std::string("ActsTGSvc")));
233
234 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
235 auto trackingVolumeArrayCreator =
236 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
237 tvcCfg, makeActsAthenaLogger(this, std::string("TrkVolArrCrtr"), std::string("ActsTGSvc")));
238
239 Acts::CylinderVolumeHelper::Config cvhConfig;
240 cvhConfig.layerArrayCreator = layerArrayCreator;
241 cvhConfig.trackingVolumeArrayCreator = trackingVolumeArrayCreator;
242
243 auto cylinderVolumeHelper =
244 std::make_shared<const Acts::CylinderVolumeHelper>(
245 cvhConfig, makeActsAthenaLogger(this, std::string("CylVolHlpr"), std::string("ActsTGSvc")));
246
247 Acts::TrackingGeometryBuilder::Config tgbConfig;
248 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
249
250 if (m_useMaterialMap) {
251 std::shared_ptr<const Acts::IMaterialDecorator> matDeco = nullptr;
252
253 std::string matFileFullPath = PathResolverFindCalibFile(m_materialMapCalibFolder.value()+"/"+m_materialMapInputFileBase.value());
254 if (matFileFullPath.empty()) {
255 ATH_MSG_ERROR( "Material Map Input File " << m_materialMapCalibFolder.value() << "/" << m_materialMapInputFileBase.value() << " not found.");
256 return StatusCode::FAILURE;
257 }
258 ATH_MSG_INFO("Configured to use material input: " << matFileFullPath);
259
260 if (matFileFullPath.find(".json") != std::string::npos) {
261 // Set up the converter first
262 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
263 // Set up the json-based decorator
264 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
265 jsonGeoConvConfig, matFileFullPath, ActsTrk::actsLevelVector(msg().level()));
266 }
267 tgbConfig.materialDecorator = matDeco;
268 }
269
270 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
271
272 try {
273 // BeamPipe
274 if(m_buildBeamPipe) {
275 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
276 const auto &inner,
277 const auto &) {
278
279 Acts::CylinderVolumeBuilder::Config bpvConfig =
280 makeBeamPipeConfig(cylinderVolumeHelper);
281
282 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
283 bpvConfig, makeActsAthenaLogger(this, std::string("BPVolBldr"), std::string("ActsTGSvc"))};
284
285 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
286 });
287 }
288
289
290
291 // PIXEL
292 if (buildSubdet.count("Pixel") > 0) {
293 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
294 const auto &inner,
295 const auto &) {
298 auto lb = std::make_shared<ActsLayerBuilder>(
299 cfg, makeActsAthenaLogger(this, std::string("PixelGMSLayBldr"), std::string("ActsTGSvc")));
300 Acts::CylinderVolumeBuilder::Config cvbConfig;
301 cvbConfig.layerEnvelopeR = {3_mm, 3_mm};
302 cvbConfig.layerEnvelopeZ = 1_mm;
303 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
304 cvbConfig.volumeName = "Pixel";
305 cvbConfig.layerBuilder = lb;
306 cvbConfig.buildToRadiusZero = !m_buildBeamPipe;
307
308 Acts::CylinderVolumeBuilder cvb(
309 cvbConfig, makeActsAthenaLogger(this, std::string("CylVolBldr"), std::string("ActsTGSvc")));
310
311 return cvb.trackingVolume(gctx, inner);
312 });
313 }
314
315 // ITK PIXEL
316 if (buildSubdet.count("ITkPixel") > 0) {
317 tgbConfig.trackingVolumeBuilders.push_back(
318 [&](const auto &gctx, const auto &inner, const auto &) {
321 cfg.objDebugOutput = m_objDebugOutput;
322 cfg.doEndcapLayerMerging = true;
323 cfg.passiveBarrelLayerRadii = m_passiveITkInnerPixelBarrelLayerRadii;
324 cfg.passiveBarrelLayerHalflengthZ = m_passiveITkInnerPixelBarrelLayerHalflengthZ;
325 cfg.passiveBarrelLayerThickness = m_passiveITkInnerPixelBarrelLayerThickness;
326 auto lb = std::make_shared<ActsLayerBuilder>(
327 cfg, makeActsAthenaLogger(this, std::string("ITkPxInLb"), std::string("ActsTGSvc")));
328
329 Acts::CylinderVolumeBuilder::Config cvbConfig;
330 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
331 cvbConfig.layerEnvelopeZ = 1_mm;
332 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
333 cvbConfig.volumeName = "ITkPixelInner";
334 cvbConfig.layerBuilder = lb;
335 cvbConfig.buildToRadiusZero = !m_buildBeamPipe;
336
337 Acts::CylinderVolumeBuilder cvb(
338 cvbConfig,
339 makeActsAthenaLogger(this, std::string("CylVolBldr"), std::string("ActsTGSvc")));
340
341 return cvb.trackingVolume(gctx, inner);
342 });
343
344 tgbConfig.trackingVolumeBuilders.push_back(
345 [&](const auto &gctx, const auto &inner, const auto &) {
348 cfg.objDebugOutput = m_objDebugOutput;
349 cfg.doEndcapLayerMerging = false;
350 cfg.passiveBarrelLayerRadii = m_passiveITkOuterPixelBarrelLayerRadii;
351 cfg.passiveBarrelLayerHalflengthZ = m_passiveITkOuterPixelBarrelLayerHalflengthZ;
352 cfg.passiveBarrelLayerThickness = m_passiveITkOuterPixelBarrelLayerThickness;
353 auto lb = std::make_shared<ActsLayerBuilder>(
354 cfg, makeActsAthenaLogger(this, std::string("ITkPxOtLb"), std::string("ActsTGSvc")));
355
356 Acts::CylinderVolumeBuilder::Config cvbConfig;
357 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
358 cvbConfig.layerEnvelopeZ = 1_mm;
359 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
360 cvbConfig.volumeName = "ITkPixelOuter";
361 cvbConfig.layerBuilder = lb;
362 cvbConfig.buildToRadiusZero = false;
363 cvbConfig.checkRingLayout = true;
364 cvbConfig.ringTolerance = 10_mm;
365
366 Acts::CylinderVolumeBuilder cvb(
367 cvbConfig,
368 makeActsAthenaLogger(this, std::string("CylVolBldr"), std::string("ActsTGSvc")));
369
370 return cvb.trackingVolume(gctx, inner);
371 });
372 }
373
374 // ITK STRIP
375 if (buildSubdet.count("ITkStrip") > 0) {
376 tgbConfig.trackingVolumeBuilders.push_back(
377 [&](const auto &gctx, const auto &inner, const auto &) {
380 cfg.objDebugOutput = m_objDebugOutput;
381 cfg.passiveBarrelLayerRadii = m_passiveITkStripBarrelLayerRadii;
382 cfg.passiveBarrelLayerHalflengthZ = m_passiveITkStripBarrelLayerHalflengthZ;
383 cfg.passiveBarrelLayerThickness = m_passiveITkStripBarrelLayerThickness;
384 auto lb = std::make_shared<ActsLayerBuilder>(
385 cfg, makeActsAthenaLogger(this, std::string("ITkStripLB"), std::string("ActsTGSvc")));
386
387 Acts::CylinderVolumeBuilder::Config cvbConfig;
388 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
389 cvbConfig.layerEnvelopeZ = 1_mm;
390 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
391 cvbConfig.volumeName = "ITkStrip";
392 cvbConfig.layerBuilder = lb;
393 cvbConfig.buildToRadiusZero =
394 buildSubdet.count("ITkPixel") == 0 && !m_buildBeamPipe;
395
396 Acts::CylinderVolumeBuilder cvb(
397 cvbConfig,
398 makeActsAthenaLogger(this, std::string("CylVolBldr"), std::string("ActsTGSvc")));
399
400 return cvb.trackingVolume(gctx, inner);
401 });
402 }
403
404 bool buildSCT = buildSubdet.count("SCT") > 0;
405 bool buildTRT = buildSubdet.count("TRT") > 0;
406
407 if (buildSCT && buildTRT) {
408 // building both we need to take care
409 tgbConfig.trackingVolumeBuilders.push_back(
410 [&](const auto &gctx, const auto &inner, const auto &) {
413 cfg.endcapEnvelopeZ = sctECEnvelopeZ;
414 auto sct_lb = std::make_shared<ActsLayerBuilder>(
415 cfg, makeActsAthenaLogger(this, std::string("SCTGMSLayBldr"), std::string("ActsTGSvc")));
416
417 auto trt_lb = makeStrawLayerBuilder(p_TRTManager);
418
419 return makeSCTTRTAssembly(gctx, *sct_lb, *trt_lb,
420 *cylinderVolumeHelper, inner);
421 });
422
423 } else if (buildSCT) {
424 tgbConfig.trackingVolumeBuilders.push_back(
425 [&](const auto &gctx, const auto &inner, const auto &) {
427 lbCfg.mode = ActsLayerBuilder::Mode::SCT;
428 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
429 auto lb = std::make_shared<ActsLayerBuilder>(
430 lbCfg,
431 makeActsAthenaLogger(this, std::string("SCTGMSLayBldr"), std::string("ActsTGSvc")));
432
433 Acts::CylinderVolumeBuilder::Config cvbConfig;
434 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
435 cvbConfig.layerEnvelopeZ = 2_mm;
436 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
437 cvbConfig.volumeName = "SCT";
438 cvbConfig.layerBuilder = lb;
439 cvbConfig.buildToRadiusZero = false;
440
441 Acts::CylinderVolumeBuilder cvb(
442 cvbConfig,
443 makeActsAthenaLogger(this, std::string("SCTCylVolBldr"), std::string("ActsTGSvc")));
444
445 return cvb.trackingVolume(gctx, inner);
446 });
447 } else if (buildTRT) {
448 tgbConfig.trackingVolumeBuilders.push_back(
449 [&](const auto &gctx, const auto &inner, const auto &) {
451 Acts::CylinderVolumeBuilder::Config cvbConfig;
452 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
453 cvbConfig.layerEnvelopeZ = 2_mm;
454 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
455 cvbConfig.volumeName = "TRT";
456 cvbConfig.layerBuilder = lb;
457 cvbConfig.buildToRadiusZero = false;
458
459 Acts::CylinderVolumeBuilder cvb(
460 cvbConfig,
461 makeActsAthenaLogger(this, std::string("TRTCylVolBldr"), std::string("ActsTGSvc")));
462
463 return cvb.trackingVolume(gctx, inner);
464 });
465 }
466
467 //HGTD
468 if(buildSubdet.count("HGTD") > 0) {
469 tgbConfig.trackingVolumeBuilders.push_back(
470 [&](const auto &gctx, const auto &inner, const auto &) {
471 auto lb = makeHGTDLayerBuilder(p_HGTDManager); //using ActsHGTDLayerBuilder
472 Acts::CylinderVolumeBuilder::Config cvbConfig;
473 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
474 cvbConfig.layerEnvelopeZ = 1_mm;
475 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
476 cvbConfig.volumeName = "HGTD";
477 cvbConfig.layerBuilder = lb;
478 cvbConfig.buildToRadiusZero = false;
479
480 Acts::CylinderVolumeBuilder cvb(
481 cvbConfig,
482 makeActsAthenaLogger(this, std::string("HGTDCylVolBldr"), std::string("ActsTGSvc")));
483
484 return cvb.trackingVolume(gctx, inner);
485 });
486 }
487
488 // Calo
489 if (m_caloVolumeBuilder.isEnabled()) {
490 tgbConfig.trackingVolumeBuilders.push_back(
491 [&](const auto &gctx, const auto &inner, const auto &) {
492 return m_caloVolumeBuilder->trackingVolume(gctx, inner, nullptr);
493 });
494 }
495
496 } catch (const std::exception &e) {
497 ATH_MSG_ERROR("Encountered error when building Acts tracking geometry");
498 ATH_MSG_ERROR(e.what());
499 return StatusCode::FAILURE;
500 }
501
502 auto trackingGeometryBuilder =
503 std::make_shared<const Acts::TrackingGeometryBuilder>(
504 tgbConfig, makeActsAthenaLogger(this, std::string("TrkGeomBldr"), std::string("ActsTGSvc")));
505
506 ATH_MSG_VERBOSE("Begin building process");
508 trackingGeometryBuilder->trackingGeometry(getNominalContext().context());
509 ATH_MSG_VERBOSE("Building process completed");
510
511 if (!m_trackingGeometry) {
512 ATH_MSG_ERROR("No ACTS tracking geometry was built. Cannot proceeed");
513 return StatusCode::FAILURE;
514 }
515
516
518 ATH_MSG_INFO("Running extra consistency check! (this is SLOW)");
519 if(!runConsistencyChecks()) {
520 ATH_MSG_ERROR("Consistency check has failed! Geometry is not consistent");
521 return StatusCode::FAILURE;
522 }
523 }
524
525 ATH_MSG_INFO("Acts TrackingGeometry construction completed");
526
527 return StatusCode::SUCCESS;
528}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Acts::GeometryContext context() const
const InDetDD::TRT_DetectorManager * p_TRTManager
Gaudi::Property< std::vector< std::string > > m_buildSubdetectors
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerThickness
ActsLayerBuilder::Config makeLayerBuilderConfig(const InDetDD::InDetDetectorManager *manager)
const InDetDD::SiDetectorManager * p_ITkStripManager
Gaudi::Property< std::vector< unsigned int > > m_subDetNoAlignProp
Define the subdetectors for which the tracking geometry does not expect a valid alignment store.
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerThickness
ToolHandleArray< ActsTrk::IRefineTrackingGeoTool > m_refineVisitors
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerHalflengthZ
Acts::CylinderVolumeBuilder::Config makeBeamPipeConfig(std::shared_ptr< const Acts::CylinderVolumeHelper > cvh) const
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerRadii
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerThickness
std::shared_ptr< const Acts::ILayerBuilder > makeHGTDLayerBuilder(const HGTD_DetectorManager *manager)
Gaudi::Property< bool > m_printGeo
Print the assembled tracking geometry after building.
std::shared_ptr< const Acts::TrackingGeometry > trackingGeometry() override
Returns a pointer to the internal ACTS tracking geometry.
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerRadii
the specifications for building additional passive cylinders in the barrel region: for each cylinder ...
const ActsTrk::GeometryContext & getNominalContext() const override
Returns an empty nominal context without any alignment caches.
std::shared_ptr< const Acts::ILayerBuilder > makeStrawLayerBuilder(const InDetDD::InDetDetectorManager *manager)
ToolHandleArray< ActsTrk::IBlueprintNodeBuilder > m_blueprintNodeBuilders
ToolHandle< IActsTrackingVolumeBuilder > m_caloVolumeBuilder
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerRadii
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerHalflengthZ
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerHalflengthZ
const InDetDD::SiDetectorManager * p_ITkPixelManager
const InDetDD::SiDetectorManager * p_pixelManager
std::shared_ptr< Acts::TrackingVolume > makeSCTTRTAssembly(const Acts::GeometryContext &gctx, const Acts::ILayerBuilder &sct_lb, const Acts::ILayerBuilder &trt_lb, const Acts::CylinderVolumeHelper &cvh, const std::shared_ptr< const Acts::TrackingVolume > &pixel)
int lb
Definition globals.cxx:23
static Root::TMsgLogger logger("iLumiCalc")
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
Acts::Logging::Level actsLevelVector(MSG::Level lvl)
MsgStream & msg
Definition testRead.cxx:32

◆ makeBeamPipeConfig()

Acts::CylinderVolumeBuilder::Config ActsTrk::TrackingGeometrySvc::makeBeamPipeConfig ( std::shared_ptr< const Acts::CylinderVolumeHelper > cvh) const
private

Definition at line 1142 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

1143 {
1144
1145 // adapted from InnerDetector/InDetDetDescr/InDetTrackingGeometry/src/BeamPipeBuilder.cxx
1146
1147 PVConstLink beamPipeTopVolume = p_beamPipeMgr->getTreeTop(0);
1148
1149 if (p_beamPipeMgr->getNumTreeTops() == 1){
1150 beamPipeTopVolume = p_beamPipeMgr->getTreeTop(0)->getChildVol(0)->getChildVol(0);
1151 }
1152
1153 Acts::Transform3 beamPipeTransform;
1154 beamPipeTransform.setIdentity();
1155
1156 beamPipeTransform = Acts::Translation3(beamPipeTopVolume->getX().translation());
1157
1158 double beamPipeRadius = 20;
1159
1160 const GeoLogVol* beamPipeLogVolume = beamPipeTopVolume->getLogVol();
1161 const GeoTube* beamPipeTube = nullptr;
1162
1163
1164 if (beamPipeLogVolume == nullptr) {
1165 ATH_MSG_ERROR("Beam pip volume has no log volume");
1166 throw std::runtime_error("Beam pip volume has no log volume");
1167 }
1168 // get the geoShape and translate
1169 beamPipeTube = dynamic_cast<const GeoTube*>(beamPipeLogVolume->getShape());
1170 if (beamPipeTube == nullptr){
1171 ATH_MSG_ERROR("BeamPipeLogVolume was not of type GeoTube");
1172 throw std::runtime_error{"BeamPipeLogVolume was not of type GeoTube"};
1173 }
1174
1175 for(unsigned int i=0;i<beamPipeTopVolume->getNChildVols();i++) {
1176
1177 if(beamPipeTopVolume->getNameOfChildVol(i) == "SectionC03"){
1178
1179 PVConstLink childTopVolume = beamPipeTopVolume->getChildVol(i);
1180 const GeoLogVol* childLogVolume = childTopVolume->getLogVol();
1181 const GeoTube* childTube = nullptr;
1182
1183 if (childLogVolume){
1184 childTube = dynamic_cast<const GeoTube*>(childLogVolume->getShape());
1185 if (childTube){
1186 beamPipeRadius = 0.5 * (childTube->getRMax()+childTube->getRMin());
1187 }
1188 }
1189
1190 break; // Exit loop after SectionC03 is found
1191 }
1192
1193 } // Loop over child volumes
1194
1195 ATH_MSG_VERBOSE("BeamPipe constructed from Database: translation (yes) - radius "
1196 << ( beamPipeTube ? "(yes)" : "(no)") << " - r = " << beamPipeRadius );
1197
1198 ATH_MSG_VERBOSE("BeamPipe shift estimated as : " << Amg::toString(beamPipeTransform.translation()));
1199
1200 Acts::CylinderVolumeBuilder::Config cfg;
1201
1202 Acts::PassiveLayerBuilder::Config bplConfig;
1203 bplConfig.layerIdentification = "BeamPipe";
1204 bplConfig.centralLayerRadii = {beamPipeRadius * 1_mm};
1205 bplConfig.centralLayerHalflengthZ = {3000_mm};
1206 bplConfig.centralLayerThickness = {1_mm};
1207 auto beamPipeBuilder = std::make_shared<const Acts::PassiveLayerBuilder>(
1208 bplConfig, makeActsAthenaLogger(this, std::string("BPLayBldr"), std::string("ActsTGSvc")));
1209
1210 // create the volume for the beam pipe
1211 cfg.trackingVolumeHelper = cvh;
1212 cfg.volumeName = "BeamPipe";
1213 cfg.layerBuilder = beamPipeBuilder;
1214 cfg.layerEnvelopeR = {1_mm, 1_mm};
1215 cfg.buildToRadiusZero = true;
1216
1217 return cfg;
1218}
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.

◆ makeHGTDLayerBuilder()

std::shared_ptr< const Acts::ILayerBuilder > ActsTrk::TrackingGeometrySvc::makeHGTDLayerBuilder ( const HGTD_DetectorManager * manager)
private

Definition at line 795 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

796 {
797
798 std::string managerName = manager->getName();
799 auto matcher = [](const Acts::GeometryContext & /*gctx*/,
800 Acts::AxisDirection /*aDir*/, const Acts::Surface * /*aS*/,
801 const Acts::Surface *
802 /*bS*/) -> bool { return false; };
803
804 Acts::SurfaceArrayCreator::Config sacCfg;
805 sacCfg.surfaceMatcher = matcher;
806 sacCfg.doPhiBinningOptimization = false;
807
808 auto surfaceArrayCreator = std::make_shared<Acts::SurfaceArrayCreator>(
809 sacCfg,
810 makeActsAthenaLogger(this, managerName + "SrfArrCrtr", std::string("ActsTGSvc")));
811 Acts::LayerCreator::Config lcCfg;
812 lcCfg.surfaceArrayCreator = surfaceArrayCreator;
813 auto layerCreator = std::make_shared<Acts::LayerCreator>(
814 lcCfg, makeActsAthenaLogger(this, managerName + "LayCrtr", std::string("ActsTGSvc")));
815
816 ActsHGTDLayerBuilder::Config cfg;
817 cfg.mng = static_cast<const HGTD_DetectorManager *>(manager);
818 cfg.elementStore = m_elementStore;
819 cfg.layerCreator = layerCreator;
820 cfg.idHelper = m_HGTD_idHelper;
821 cfg.numberOfBinsFactor = m_numberOfBinsFactor;
822 return std::make_shared<const ActsHGTDLayerBuilder>(
823 cfg, makeActsAthenaLogger(this, managerName + "GMSLayBldr", std::string("ActsTGSvc")));
824}
Gaudi::Property< double > m_numberOfBinsFactor
controls how many bins are created for the sensitive surface grid.
const Matcher_t & matcher() const
Return the matcher object.

◆ makeLayerBuilderConfig()

ActsLayerBuilder::Config ActsTrk::TrackingGeometrySvc::makeLayerBuilderConfig ( const InDetDD::InDetDetectorManager * manager)
private

Definition at line 826 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

827 {
828 using enum Acts::AxisDirection;
829
830 std::string managerName = manager->getName();
831
832 std::shared_ptr<const Acts::ILayerBuilder> gmLayerBuilder;
833 auto matcher = [](const Acts::GeometryContext & /*gctx*/,
834 Acts::AxisDirection aDir, const Acts::Surface *aS,
835 const Acts::Surface *bS) -> bool {
836 auto a = dynamic_cast<const ActsDetectorElement *>(
837 aS->surfacePlacement());
838 auto b = dynamic_cast<const ActsDetectorElement *>(
839 bS->surfacePlacement());
840 if ((not a) or (not b)) {
841 throw std::runtime_error(
842 "Cast of surface associated element to ActsDetectorElement failed "
843 "in TrackingGeometrySvc::makeVolumeBuilder");
844 }
845
846 IdentityHelper idA = a->identityHelper();
847 IdentityHelper idB = b->identityHelper();
848
849 // check if same bec
850 // can't be same if not
851 if (idA.bec() != idB.bec())
852 return false;
853
854 if (aDir == AxisPhi) {
855 // std::cout << idA.phi_module() << " <-> " << idB.phi_module() <<
856 // std::endl;
857 return idA.phi_module() == idB.phi_module();
858 }
859
860 if (aDir == AxisZ) {
861 return (idA.eta_module() == idB.eta_module()) &&
862 (idA.layer_disk() == idB.layer_disk()) && (idA.bec() == idB.bec());
863 }
864
865 if (aDir == AxisR) {
866 return (idA.eta_module() == idB.eta_module()) &&
867 (idA.layer_disk() == idB.layer_disk()) && (idB.bec() == idA.bec());
868 }
869
870 return false;
871 };
872
873 Acts::SurfaceArrayCreator::Config sacCfg;
874 sacCfg.surfaceMatcher = matcher;
875
876 auto surfaceArrayCreator = std::make_shared<Acts::SurfaceArrayCreator>(
877 sacCfg,
878 makeActsAthenaLogger(this, managerName + "SrfArrCrtr", std::string("ActsTGSvc")));
879 Acts::LayerCreator::Config lcCfg;
880 lcCfg.surfaceArrayCreator = surfaceArrayCreator;
881 auto layerCreator = std::make_shared<Acts::LayerCreator>(
882 lcCfg, makeActsAthenaLogger(this, managerName + "LayCrtr", std::string("ActsTGSvc")));
883
884 ActsLayerBuilder::Config cfg;
885 cfg.surfaceMatcher = matcher;
886
887 // set bins from configuration
888 if (m_barrelMaterialBins.size() != 2) {
889 throw std::invalid_argument("Number of barrel material bin counts != 2");
890 }
891 std::vector<size_t> brlBins(m_barrelMaterialBins);
892 cfg.barrelMaterialBins = {brlBins.at(0), brlBins.at(1)};
893
894 if (m_endcapMaterialBins.size() != 2) {
895 throw std::invalid_argument("Number of endcap material bin counts != 2");
896 }
897 std::vector<size_t> ecBins(m_endcapMaterialBins);
898 cfg.endcapMaterialBins = {ecBins.at(0), ecBins.at(1)};
899
900 cfg.mng = static_cast<const InDetDD::SiDetectorManager *>(manager);
901 // use class member element store
902 cfg.elementStore = m_elementStore;
903 cfg.layerCreator = layerCreator;
904
905 cfg.numberOfBinsFactor = m_numberOfBinsFactor;
906 cfg.numberOfInnermostLayerBinsFactor = m_numberOfInnermostLayerBinsFactor;
907
908 // gmLayerBuilder = std::make_shared<const ActsLayerBuilder>(
909 // cfg, makeActsAthenaLogger(this, managerName + "GMLayBldr",
910 // "ActsTGSvc"));
911
912 // return gmLayerBuilder;
913 return cfg;
914}
static Double_t a
Gaudi::Property< std::vector< size_t > > m_endcapMaterialBins
Gaudi::Property< std::vector< size_t > > m_barrelMaterialBins
Gaudi::Property< double > m_numberOfInnermostLayerBinsFactor
Special treatment for the innermost pixel layer to have more control on bin size to account for shall...
int phi_module() const
int eta_module() const
int layer_disk() const

◆ makeSCTTRTAssembly()

std::shared_ptr< Acts::TrackingVolume > ActsTrk::TrackingGeometrySvc::makeSCTTRTAssembly ( const Acts::GeometryContext & gctx,
const Acts::ILayerBuilder & sct_lb,
const Acts::ILayerBuilder & trt_lb,
const Acts::CylinderVolumeHelper & cvh,
const std::shared_ptr< const Acts::TrackingVolume > & pixel )
private

Definition at line 917 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

920 {
921 ATH_MSG_VERBOSE("Building SCT+TRT assembly");
922
923 Acts::CylinderVolumeBuilder::Config cvbCfg;
924 Acts::CylinderVolumeBuilder cvb(
925 cvbCfg, makeActsAthenaLogger(this, std::string("SCTTRTCVB"), std::string("ActsTGSvc")));
926
927 ATH_MSG_VERBOSE("Making SCT negative layers: ");
928 Acts::VolumeConfig sctNegEC =
929 cvb.analyzeContent(gctx, sct_lb.negativeLayers(gctx), {});
930 ATH_MSG_VERBOSE("Making SCT positive layers: ");
931 Acts::VolumeConfig sctPosEC =
932 cvb.analyzeContent(gctx, sct_lb.positiveLayers(gctx), {});
933 ATH_MSG_VERBOSE("Making SCT central layers: ");
934 Acts::VolumeConfig sctBrl =
935 cvb.analyzeContent(gctx, sct_lb.centralLayers(gctx), {});
936
937 ATH_MSG_VERBOSE("Making TRT negative layers: ");
938 Acts::VolumeConfig trtNegEC =
939 cvb.analyzeContent(gctx, trt_lb.negativeLayers(gctx), {});
940 ATH_MSG_VERBOSE("Making TRT positive layers: ");
941 Acts::VolumeConfig trtPosEC =
942 cvb.analyzeContent(gctx, trt_lb.positiveLayers(gctx), {});
943 ATH_MSG_VERBOSE("Making TRT central layers: ");
944 Acts::VolumeConfig trtBrl =
945 cvb.analyzeContent(gctx, trt_lb.centralLayers(gctx), {});
946
947 // synchronize trt
948
949 double absZMinEC = std::min(std::abs(trtNegEC.zMax), std::abs(trtPosEC.zMin));
950 double absZMaxEC = std::max(std::abs(trtNegEC.zMin), std::abs(trtPosEC.zMax));
951
952 trtNegEC.zMin = -absZMaxEC;
953 trtNegEC.zMax = -absZMinEC;
954 trtPosEC.zMin = absZMinEC;
955 trtPosEC.zMax = absZMaxEC;
956
957 using CVBBV = Acts::CylinderVolumeBounds::BoundValues;
958
959 // if pixel is present, shrink SCT volumes in R
960 bool isSCTSmallerInZ = false;
961 if (pixel) {
962 ATH_MSG_VERBOSE("Shrinking SCT in R (and maybe in increase size in Z) to fit around Pixel");
963 auto pixelBounds = dynamic_cast<const Acts::CylinderVolumeBounds *>(
964 &pixel->volumeBounds());
965 double sctNegECzMin = std::min(sctNegEC.zMin, -pixelBounds->get(CVBBV::eHalfLengthZ));
966 double sctPosECzMax = std::max(sctPosEC.zMax, pixelBounds->get(CVBBV::eHalfLengthZ));
967
968 ATH_MSG_VERBOSE("- SCT +-EC.rMin: " << sctNegEC.rMin << " -> " << pixelBounds->get(CVBBV::eMaxR));
969 ATH_MSG_VERBOSE("- SCT BRL.rMin: " << sctBrl.rMin << " -> " << pixelBounds->get(CVBBV::eMaxR));
970 ATH_MSG_VERBOSE("- SCT EC.zMin: " << sctNegEC.zMin << " -> " << sctNegECzMin);
971 ATH_MSG_VERBOSE("- SCT EC.zMax: " << sctPosEC.zMax << " -> " << sctPosECzMax);
972
973 sctNegEC.rMin = pixelBounds->get(CVBBV::eMaxR);
974 sctPosEC.rMin = pixelBounds->get(CVBBV::eMaxR);
975 sctBrl.rMin = pixelBounds->get(CVBBV::eMaxR);
976
977 isSCTSmallerInZ = sctPosEC.zMax < pixelBounds->get(CVBBV::eHalfLengthZ);
978
979 sctNegEC.zMin = sctNegECzMin;
980 sctPosEC.zMax = sctPosECzMax;
981
982
983 } else {
984 ATH_MSG_VERBOSE("Pixel is not configured, not wrapping");
985 }
986
987 ATH_MSG_VERBOSE("SCT Volume Configuration:");
988 ATH_MSG_VERBOSE("- SCT::NegativeEndcap: " << sctNegEC.layers.size()
989 << " layers, "
990 << sctNegEC.toString());
991 ATH_MSG_VERBOSE("- SCT::Barrel: " << sctBrl.layers.size() << " layers, "
992 << sctBrl.toString());
993 ATH_MSG_VERBOSE("- SCT::PositiveEncap: " << sctPosEC.layers.size()
994 << " layers, "
995 << sctPosEC.toString());
996
997 ATH_MSG_VERBOSE("TRT Volume Configuration:");
998 ATH_MSG_VERBOSE("- TRT::NegativeEndcap: " << trtNegEC.layers.size()
999 << " layers, "
1000 << trtNegEC.toString());
1001 ATH_MSG_VERBOSE("- TRT::Barrel: " << trtBrl.layers.size() << " layers, "
1002 << trtBrl.toString());
1003 ATH_MSG_VERBOSE("- TRT::PositiveEncap: " << trtPosEC.layers.size()
1004 << " layers, "
1005 << trtPosEC.toString());
1006
1007 // harmonize SCT BRL <-> EC, normally the CVB does this, but we're skipping
1008 // that
1009 sctBrl.zMax = (sctBrl.zMax + sctPosEC.zMin) / 2.;
1010 sctBrl.zMin = -sctBrl.zMax;
1011
1012 // and now harmonize everything
1013 // inflate TRT Barrel to match SCT
1014 trtBrl.zMin = sctBrl.zMin;
1015 trtBrl.zMax = sctBrl.zMax;
1016
1017 // extend TRT endcaps outwards z so they match SCT
1018 trtNegEC.zMin = sctNegEC.zMin;
1019 trtPosEC.zMax = sctPosEC.zMax;
1020
1021 // extend endcap in z so it touches barrel
1022 trtNegEC.zMax = trtBrl.zMin;
1023 sctNegEC.zMax = trtBrl.zMin;
1024 trtPosEC.zMin = trtBrl.zMax;
1025 sctPosEC.zMin = trtBrl.zMax;
1026
1027 // extend SCT in R so they touch TRT barel
1028 sctBrl.rMax = trtBrl.rMin;
1029 sctNegEC.rMax = trtNegEC.rMin;
1030 sctPosEC.rMax = trtPosEC.rMin;
1031
1032 // extend TRT endcaps in r to that of Barrel
1033 trtNegEC.rMax = trtBrl.rMax;
1034 trtPosEC.rMax = trtBrl.rMax;
1035
1036 ATH_MSG_VERBOSE("Dimensions after synchronization between SCT and TRT");
1037 ATH_MSG_VERBOSE("SCT Volume Configuration:");
1038 ATH_MSG_VERBOSE("- SCT::NegativeEndcap: " << sctNegEC.layers.size()
1039 << " layers, "
1040 << sctNegEC.toString());
1041 ATH_MSG_VERBOSE("- SCT::Barrel: " << sctBrl.layers.size() << " layers, "
1042 << sctBrl.toString());
1043 ATH_MSG_VERBOSE("- SCT::PositiveEncap: " << sctPosEC.layers.size()
1044 << " layers, "
1045 << sctPosEC.toString());
1046
1047 ATH_MSG_VERBOSE("TRT Volume Configuration:");
1048 ATH_MSG_VERBOSE("- TRT::NegativeEndcap: " << trtNegEC.layers.size()
1049 << " layers, "
1050 << trtNegEC.toString());
1051 ATH_MSG_VERBOSE("- TRT::Barrel: " << trtBrl.layers.size() << " layers, "
1052 << trtBrl.toString());
1053 ATH_MSG_VERBOSE("- TRT::PositiveEncap: " << trtPosEC.layers.size()
1054 << " layers, "
1055 << trtPosEC.toString());
1056
1057 auto makeTVol = [&](const auto &vConf, const auto &name) {
1058 return cvh.createTrackingVolume(gctx, vConf.layers, {},
1059 nullptr, // no material
1060 vConf.rMin, vConf.rMax, vConf.zMin,
1061 vConf.zMax, name);
1062 };
1063
1064 // now turn them into actual TrackingVolumes
1065 auto tvSctNegEC = makeTVol(sctNegEC, "SCT::NegativeEndcap");
1066 auto tvSctBrl = makeTVol(sctBrl, "SCT::Barrel");
1067 auto tvSctPosEC = makeTVol(sctPosEC, "SCT::PositiveEndcap");
1068
1069 auto tvTrtNegEC = makeTVol(trtNegEC, "TRT::NegativeEndcap");
1070 auto tvTrtBrl = makeTVol(trtBrl, "TRT::Barrel");
1071 auto tvTrtPosEC = makeTVol(trtPosEC, "TRT::PositiveEndcap");
1072
1073 // combine the endcaps and the barrels, respetively
1074 auto negEC =
1075 cvh.createContainerTrackingVolume(gctx, {tvSctNegEC, tvTrtNegEC});
1076 auto posEC =
1077 cvh.createContainerTrackingVolume(gctx, {tvSctPosEC, tvTrtPosEC});
1078 auto barrel = cvh.createContainerTrackingVolume(gctx, {tvSctBrl, tvTrtBrl});
1079
1080 // and now combine all of those into one container for the assembly
1081
1082 auto container =
1083 cvh.createContainerTrackingVolume(gctx, {negEC, barrel, posEC});
1084
1085 // if pixel is present, add positive and negative gap volumes so we can wrap
1086 // it all
1087 if (pixel) {
1088 auto containerBounds = dynamic_cast<const Acts::CylinderVolumeBounds *>(
1089 &container->volumeBounds());
1090 auto pixelBounds = dynamic_cast<const Acts::CylinderVolumeBounds *>(
1091 &pixel->volumeBounds());
1092 std::vector<std::shared_ptr<Acts::TrackingVolume>> noVolumes;
1093
1094 if(!isSCTSmallerInZ) {
1095 // pixel is smaller in z, need gap volumes
1096 auto posGap = cvh.createGapTrackingVolume(
1097 gctx, noVolumes,
1098 nullptr, // no material,
1099 pixelBounds->get(CVBBV::eMinR), pixelBounds->get(CVBBV::eMaxR),
1100 pixelBounds->get(CVBBV::eHalfLengthZ),
1101 containerBounds->get(CVBBV::eHalfLengthZ),
1102 0, // material layers,
1103 true, // cylinder
1104 "Pixel::PositiveGap");
1105 auto negGap = cvh.createGapTrackingVolume(
1106 gctx, noVolumes,
1107 nullptr, // no material,
1108 pixelBounds->get(CVBBV::eMinR), pixelBounds->get(CVBBV::eMaxR),
1109 -containerBounds->get(CVBBV::eHalfLengthZ),
1110 -pixelBounds->get(CVBBV::eHalfLengthZ),
1111 0, // material layers,
1112 true, // cylinder
1113 "Pixel::NegativeGap");
1114
1115 auto pixelContainer =
1116 cvh.createContainerTrackingVolume(gctx, {negGap, pixel, posGap});
1117 // and now create one container that contains Pixel+SCT+TRT
1118 container =
1119 cvh.createContainerTrackingVolume(gctx, {pixelContainer, container});
1120 }
1121 else {
1122 // wrap the pixel directly
1123 container =
1124 cvh.createContainerTrackingVolume(gctx, {pixel, container});
1125 }
1126
1127 }
1128
1129 return container;
1130}
Acts::CylinderVolumeBounds::BoundValues CVBBV
const SG::AuxVectorData * container() const
Return the container holding this element.

◆ makeStrawLayerBuilder()

std::shared_ptr< const Acts::ILayerBuilder > ActsTrk::TrackingGeometrySvc::makeStrawLayerBuilder ( const InDetDD::InDetDetectorManager * manager)
private

Definition at line 764 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

765 {
766
767 std::string managerName = manager->getName();
768 auto matcher = [](const Acts::GeometryContext & /*gctx*/,
769 Acts::AxisDirection /*aDir*/, const Acts::Surface * /*aS*/,
770 const Acts::Surface *
771 /*bS*/) -> bool { return false; };
772
773 Acts::SurfaceArrayCreator::Config sacCfg;
774 sacCfg.surfaceMatcher = matcher;
775 sacCfg.doPhiBinningOptimization = false;
776
777 auto surfaceArrayCreator = std::make_shared<Acts::SurfaceArrayCreator>(
778 sacCfg,
779 makeActsAthenaLogger(this, managerName + "SrfArrCrtr", std::string("ActsTGSvc")));
780 Acts::LayerCreator::Config lcCfg;
781 lcCfg.surfaceArrayCreator = surfaceArrayCreator;
782 auto layerCreator = std::make_shared<Acts::LayerCreator>(
783 lcCfg, makeActsAthenaLogger(this, managerName + "LayCrtr", std::string("ActsTGSvc")));
784
785 ActsStrawLayerBuilder::Config cfg;
786 cfg.mng = static_cast<const InDetDD::TRT_DetectorManager *>(manager);
787 cfg.elementStore = m_elementStore;
788 cfg.layerCreator = layerCreator;
789 cfg.idHelper = m_TRT_idHelper;
790 return std::make_shared<const ActsStrawLayerBuilder>(
791 cfg, makeActsAthenaLogger(this, managerName + "GMSLayBldr", std::string("ActsTGSvc")));
792}

◆ populateAlignmentStore()

unsigned int ActsTrk::TrackingGeometrySvc::populateAlignmentStore ( ActsTrk::DetectorAlignStore & store) const
override

Loops through the volumes of the tracking geometry and caches the aligned transforms in the store.

Definition at line 1132 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

1132 {
1133 ATH_MSG_DEBUG("Populate the alignment store with all detector elements");
1134 TrackingGeoAlignVisitor visitor{store};
1135 m_trackingGeometry->apply(visitor);
1136 ATH_MSG_DEBUG("Populated with " << visitor.alignedObjects() << " elements");
1137 return visitor.alignedObjects();
1138}
TestStore store
Definition TestStore.cxx:23

◆ runConsistencyChecks()

bool ActsTrk::TrackingGeometrySvc::runConsistencyChecks ( ) const
private

Definition at line 530 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

530 {
531 bool result = true;
532
533 std::vector<Acts::Vector2> localPoints;
534 localPoints.reserve(m_consistencyCheckPoints);
535 std::mt19937 gen;
536 std::uniform_real_distribution<> dist(0.0, 1.0);
537
538 std::optional<std::ofstream> os;
539 if(!m_consistencyCheckOutput.empty()){
540 os = std::ofstream{m_consistencyCheckOutput};
541 if(!os->good()) {
542 throw std::runtime_error{"Failed to open consistency check output file"};
543 }
544 }
545
546 if(os) {
547 (*os) << "geo_id,vol_id,lay_id,sen_id,type,acts_loc0,acts_loc1,acts_inside,trk_loc0,trk_loc1,trk_inside,x,y,z,g2l_loc0,g2l_loc1,trk_x,trk_y,trk_z" << std::endl;
548 }
549 for(size_t i=0;i<m_consistencyCheckPoints;i++) {
550 localPoints.emplace_back(dist(gen), dist(gen));
551 }
552
553 Acts::GeometryContext gctx = getNominalContext().context();
554
555 size_t nTotalSensors = 0;
556 std::array<size_t,3> nInconsistent{0,0,0};
557 size_t nMismatchedCenters = 0;
558 size_t nMismatchedNormals = 0;
559
560 // Comparison of Eigen vectors, similar to a.isApprox(b), but use absolute comparison to also work with zero vectors.
561 // All values will be mm or radians, so 1e-5 is a reasonable precision.
562 auto isApprox = [](auto& a, auto& b) -> bool {
563 return ((a - b).array().abs() < 1e-5).all();
564 };
565
566 m_trackingGeometry->visitSurfaces([&](const Acts::Surface *surface) {
567 nTotalSensors++;
568
569 const auto* actsDetElem = dynamic_cast<const ActsDetectorElement*>(surface->surfacePlacement());
570 if(actsDetElem == nullptr) {
571 ATH_MSG_ERROR("Invalid detector element found");
572 result = false;
573 return;
574 }
575 const auto* siDetElem = dynamic_cast<const InDetDD::SiDetectorElement*>(actsDetElem->upstreamDetectorElement());
576 if(siDetElem == nullptr) {
577 return;
578 }
579
580 const auto* regSurface = dynamic_cast<const Acts::RegularSurface*>(surface);
581 const auto& trkSurface = siDetElem->surface();
582 if(regSurface == nullptr) {
583 ATH_MSG_ERROR("Invalid surface found");
584 result = false;
585 return;
586 }
587
588 Acts::Vector3 center{regSurface->center(gctx)};
589 Amg::Vector3D trkCenter{trkSurface.center()};
590 if (/* auto *b = */ dynamic_cast<const Acts::AnnulusBounds *>(&surface->bounds()))
591 {
592 // // Acts::AnnulusBounds defines center() as center of whole disc, so get it from the bounds
593 // Acts::Vector2 locCenter{0.5 * (b->rMin() + b->rMax()), 0.5 * (b->phiMin() + b->phiMax())};
594 // center = surface->localToGlobal(gctx, locCenter, Acts::Vector3::Zero());
595 center.head<2>() = trkCenter.head<2>(); // that doesn't (quite) work for xy, so just pass that check
596 }
597
598 if(!isApprox(trkCenter, center)) {
599 std::string trkName;
600 if (auto idHelper = siDetElem->getIdHelper())
601 {
602 trkName = idHelper->show_to_string(siDetElem->identify());
603 }
604 ATH_MSG_WARNING("Acts surface "
605 << surface->geometryId()
606 << " center (" << center[0] << ',' << center[1] << ',' << center[2]
607 << ") does not match Trk surface " << trkName
608 << " center (" << trkCenter[0] << ',' << trkCenter[1] << ',' << trkCenter[2] << ')');
609 nMismatchedCenters++;
610 result = false;
611 }
612
613 const auto* lineSurface = dynamic_cast<const Acts::LineSurface*>(surface);
614 if(lineSurface == nullptr) {
615 Acts::Vector3 norm{regSurface->normal(gctx, regSurface->center(gctx))};
616 Amg::Vector3D trkNorm{trkSurface.normal()};
617 if(!isApprox(trkNorm, norm)) {
618 std::string trkName;
619 if (auto idHelper = siDetElem->getIdHelper())
620 {
621 trkName = idHelper->show_to_string(siDetElem->identify());
622 }
623 ATH_MSG_WARNING("Acts surface "
624 << surface->geometryId()
625 << " normal (" << norm[0] << ',' << norm[1] << ',' << norm[2]
626 << ") does not match Trk surface " << trkName
627 << " normal (" << trkNorm[0] << ',' << trkNorm[1] << ',' << trkNorm[2] << ')');
628 nMismatchedNormals++;
629 result = false;
630 }
631 }
632
633 auto doPoints = [&](unsigned int type, const Acts::Vector2& loc) -> std::array<bool,3> {
634 Acts::Vector3 glb = surface->localToGlobal(gctx, loc, Acts::Vector3::Zero());
635
636 Amg::Vector2D locTrk = Amg::Vector2D::Zero();
637 Amg::Vector3D glbTrk = Amg::Vector3D::Zero();
638 Acts::Vector2 locg2l = Acts::Vector2::Zero();
639 bool locg2lOk = false;
640 auto locTrkRes = trkSurface.globalToLocal(glb);
641 if (locTrkRes) {
642 locTrk = locTrkRes.value();
643 glbTrk = trkSurface.localToGlobal(locTrk);
644
645 auto locg2lRes = surface->globalToLocal(gctx, glbTrk, Acts::Vector3::Zero());
646 if (locg2lRes.ok()) {
647 locg2lOk = true;
648 locg2l = locg2lRes.value();
649 }
650 }
651
652 auto gId = surface->geometryId();
653 if(os) {
654 (*os) << gId.value()
655 << "," << gId.volume()
656 << "," << gId.layer()
657 << "," << gId.sensitive()
658 << "," << type
659 << "," << loc[0]
660 << "," << loc[1]
661 << "," << surface->insideBounds(loc)
662 << "," << locTrk[0]
663 << "," << locTrk[1]
664 << "," << trkSurface.insideBounds(locTrk)
665 << "," << glb[0]
666 << "," << glb[1]
667 << "," << glb[2]
668 << "," << locg2l[0]
669 << "," << locg2l[1]
670 << "," << glbTrk[0]
671 << "," << glbTrk[1]
672 << "," << glbTrk[2]
673 << std::endl;
674 }
675
676 return {surface->insideBounds(loc) == trkSurface.insideBounds(locTrk),
677 locg2lOk ? isApprox(loc, locg2l) : true,
678 locTrkRes ? isApprox(glb, glbTrk) : true};
679 };
680
681
682 constexpr double envelope = 10.0 * Acts::UnitConstants::mm;
683
684 std::array<bool,3> allOk{true,true,true};
685 if(const auto* bounds = dynamic_cast<const Acts::PlanarBounds*>(&surface->bounds()); bounds) {
686 ATH_MSG_VERBOSE("Planar bounds");
687
688 const Acts::RectangleBounds& boundingBox = bounds->boundingBox();
689 Acts::Vector2 min = boundingBox.min().array() - envelope;
690 Acts::Vector2 max = boundingBox.max().array() + envelope;
691 Acts::Vector2 diag = max - min;
692
693 for(const auto& testPoint : localPoints) {
694 Acts::Vector2 loc = min.array() + (testPoint.array() * diag.array());
695 auto pointOk = doPoints(0, loc);
696 for (size_t i=0; i<pointOk.size(); ++i) {
697 if (!pointOk[i]) {
698 result = false;
699 allOk[i] = false;
700 }
701 }
702 }
703
704 }
705 else if(const auto* bounds = dynamic_cast<const Acts::AnnulusBounds*>(&surface->bounds()); bounds) {
706 ATH_MSG_VERBOSE("Annulus bounds");
707
708 // custom bounding box algo
709 std::vector<Acts::Vector2> vertices = bounds->vertices(5); // 5 segments on the radial edges
710 Acts::Vector2 min{std::numeric_limits<double>::max(), std::numeric_limits<double>::max()};
711 Acts::Vector2 max{std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest()};
712 for (const auto& vtx : vertices) {
713 min = min.array().min(vtx.array());
714 max = max.array().max(vtx.array());
715 }
716 min.array() -= envelope;
717 max.array() += envelope;
718 Acts::Vector2 diag = max - min;
719
720 for(const auto& testPoint : localPoints) {
721 Acts::Vector2 locXY = min.array() + (testPoint.array() * diag.array());
722 Acts::Vector2 locPC = dynamic_cast<const Acts::DiscSurface&>(*surface).localCartesianToPolar(locXY);
723
724 auto pointOk = doPoints(1, locPC);
725 for (size_t i=0; i<pointOk.size(); ++i) {
726 if (!pointOk[i]) {
727 result = false;
728 allOk[i] = false;
729 }
730 }
731 }
732
733 }
734 else {
735 result = false;
736 }
737
738 for (size_t i=0; i<allOk.size(); ++i) {
739 if (!allOk[i]) {
740 ++nInconsistent[i];
741 }
742 }
743
744 });
745
746 ATH_MSG_INFO("Total number of sensors : " << nTotalSensors);
747 ATH_MSG_INFO("Number of sensors with mismatched centers : " << nMismatchedCenters);
748 ATH_MSG_INFO("Number of sensors with mismatched normals : " << nMismatchedNormals);
749 ATH_MSG_INFO("Number of sensors with inconsistent inside: " << nInconsistent[0]);
750 ATH_MSG_INFO("Number of sensors with inconsistent g2l : " << nInconsistent[1]);
751 ATH_MSG_INFO("Number of sensors with inconsistent l2g : " << nInconsistent[2]);
752
753 return result;
754}
#define ATH_MSG_WARNING(x)
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D

◆ trackingGeometry()

std::shared_ptr< const Acts::TrackingGeometry > ActsTrk::TrackingGeometrySvc::trackingGeometry ( )
override

Returns a pointer to the internal ACTS tracking geometry.

Definition at line 757 of file Acts/ActsGeometry/src/TrackingGeometrySvc.cxx.

757 {
758
759 ATH_MSG_VERBOSE("Retrieving tracking geometry");
760 return m_trackingGeometry;
761}

Member Data Documentation

◆ m_barrelMaterialBins

Gaudi::Property<std::vector<size_t> > ActsTrk::TrackingGeometrySvc::m_barrelMaterialBins {this, "BarrelMaterialBins", {10, 10}}
private

Definition at line 120 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

120{this, "BarrelMaterialBins", {10, 10}};

◆ m_blueprintGraphviz

Gaudi::Property<std::string> ActsTrk::TrackingGeometrySvc::m_blueprintGraphviz
private
Initial value:
{this, "BlueprintGraphviz",
"", "Write the blueprint graph to a file. No file will be written if empty"}

Definition at line 160 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

160 {this, "BlueprintGraphviz",
161 "", "Write the blueprint graph to a file. No file will be written if empty"};

◆ m_blueprintNodeBuilders

ToolHandleArray<ActsTrk::IBlueprintNodeBuilder> ActsTrk::TrackingGeometrySvc::m_blueprintNodeBuilders {this, "BlueprintNodeBuilders", {}}
private

Definition at line 151 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

151{this, "BlueprintNodeBuilders", {}};

◆ m_buildBeamPipe

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_buildBeamPipe {this, "BuildBeamPipe", false, ""}
private

Definition at line 115 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

115{this, "BuildBeamPipe", false, ""};

◆ m_buildSubdetectors

Gaudi::Property<std::vector<std::string> > ActsTrk::TrackingGeometrySvc::m_buildSubdetectors {this, "BuildSubDetectors", {"Pixel", "SCT", "TRT", "Calo", "HGTD", "Muon"}}
private

Definition at line 122 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

122{this, "BuildSubDetectors", {"Pixel", "SCT", "TRT", "Calo", "HGTD", "Muon"}};

◆ m_caloVolumeBuilder

ToolHandle<IActsTrackingVolumeBuilder> ActsTrk::TrackingGeometrySvc::m_caloVolumeBuilder {this, "CaloVolumeBuilder", ""}
private

Definition at line 149 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

149{this, "CaloVolumeBuilder", ""};

◆ m_consistencyCheckOutput

StringProperty ActsTrk::TrackingGeometrySvc::m_consistencyCheckOutput
private
Initial value:
{this, "ConsistencyCheckOutput",
"", "Output file for geometry debugging, will not write if empty",}

Definition at line 143 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

143 {this, "ConsistencyCheckOutput",
144 "", "Output file for geometry debugging, will not write if empty",};

◆ m_consistencyCheckPoints

Gaudi::Property<size_t> ActsTrk::TrackingGeometrySvc::m_consistencyCheckPoints
private
Initial value:
{this, "ConsistencyCheckPoints",
1000, "number of random points for consistency check"}

Definition at line 146 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

146 {this, "ConsistencyCheckPoints",
147 1000, "number of random points for consistency check"};

◆ m_detStore

ServiceHandle<StoreGateSvc> ActsTrk::TrackingGeometrySvc::m_detStore
private

Definition at line 94 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

◆ m_doEndcapLayerMerging

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_doEndcapLayerMerging {this, "DoEndcapLayerMerging", true, "Merge overlapping endcap layers in z"}
private

Definition at line 162 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

162{this, "DoEndcapLayerMerging", true, "Merge overlapping endcap layers in z"};

◆ m_elementStore

std::shared_ptr<ActsElementVector> ActsTrk::TrackingGeometrySvc::m_elementStore {nullptr}
private

Definition at line 103 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

103{nullptr};

◆ m_endcapMaterialBins

Gaudi::Property<std::vector<size_t> > ActsTrk::TrackingGeometrySvc::m_endcapMaterialBins {this, "EndcapMaterialBins", {5, 20}}
private

Definition at line 121 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

121{this, "EndcapMaterialBins", {5, 20}};

◆ m_HGTD_idHelper

const HGTD_ID* ActsTrk::TrackingGeometrySvc::m_HGTD_idHelper {nullptr}
private

Definition at line 107 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

107{nullptr};

◆ m_materialMapCalibFolder

Gaudi::Property<std::string> ActsTrk::TrackingGeometrySvc::m_materialMapCalibFolder {this, "MaterialMapCalibFolder", ".", ""}
private

Definition at line 114 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

114{this, "MaterialMapCalibFolder", ".", ""};

◆ m_materialMapInputFileBase

Gaudi::Property<std::string> ActsTrk::TrackingGeometrySvc::m_materialMapInputFileBase {this, "MaterialMapInputFile", "", ""}
private

Definition at line 113 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

113{this, "MaterialMapInputFile", "", ""};

◆ m_nominalContext

ActsTrk::GeometryContext ActsTrk::TrackingGeometrySvc::m_nominalContext {}
private

Definition at line 109 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

109{};

◆ m_numberOfBinsFactor

Gaudi::Property<double> ActsTrk::TrackingGeometrySvc::m_numberOfBinsFactor {this, "NumberOfBinsFactor", 5.0}
private

controls how many bins are created for the sensitive surface grid.

1 results in the same number of bins as there are surfaces per layer in each dimension. using a higher number will reduce the number of surfaces per bin, thus speeding up navigation, but increasing memory consumption.

Definition at line 167 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

167{this, "NumberOfBinsFactor", 5.0};

◆ m_numberOfInnermostLayerBinsFactor

Gaudi::Property<double> ActsTrk::TrackingGeometrySvc::m_numberOfInnermostLayerBinsFactor {this, "NumberOfInnermostLayerBinsFactor",2.0}
private

Special treatment for the innermost pixel layer to have more control on bin size to account for shallow angle tracks.

Definition at line 170 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

170{this, "NumberOfInnermostLayerBinsFactor",2.0};

◆ m_objDebugOutput

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_objDebugOutput {this, "ObjDebugOutput", false, ""}
private

Definition at line 112 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

112{this, "ObjDebugOutput", false, ""};

◆ m_passiveITkInnerPixelBarrelLayerHalflengthZ

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkInnerPixelBarrelLayerHalflengthZ {this, "PassiveITkInnerPixelBarrelLayerHalflengthZ", {}}
private

Definition at line 129 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

129{this, "PassiveITkInnerPixelBarrelLayerHalflengthZ", {}};

◆ m_passiveITkInnerPixelBarrelLayerRadii

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkInnerPixelBarrelLayerRadii {this, "PassiveITkInnerPixelBarrelLayerRadii", {}}
private

the specifications for building additional passive cylinders in the barrel region: for each cylinder you want to specify radius, half length in z and thickness

Definition at line 128 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

128{this, "PassiveITkInnerPixelBarrelLayerRadii", {}};

◆ m_passiveITkInnerPixelBarrelLayerThickness

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkInnerPixelBarrelLayerThickness {this, "PassiveITkInnerPixelBarrelLayerThickness", {}}
private

Definition at line 130 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

130{this, "PassiveITkInnerPixelBarrelLayerThickness", {}};

◆ m_passiveITkOuterPixelBarrelLayerHalflengthZ

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkOuterPixelBarrelLayerHalflengthZ {this, "PassiveITkOuterPixelBarrelLayerHalflengthZ", {}}
private

Definition at line 133 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

133{this, "PassiveITkOuterPixelBarrelLayerHalflengthZ", {}};

◆ m_passiveITkOuterPixelBarrelLayerRadii

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkOuterPixelBarrelLayerRadii {this, "PassiveITkOuterPixelBarrelLayerRadii", {}}
private

Definition at line 132 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

132{this, "PassiveITkOuterPixelBarrelLayerRadii", {}};

◆ m_passiveITkOuterPixelBarrelLayerThickness

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkOuterPixelBarrelLayerThickness {this, "PassiveITkOuterPixelBarrelLayerThickness", {}}
private

Definition at line 134 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

134{this, "PassiveITkOuterPixelBarrelLayerThickness", {}};

◆ m_passiveITkStripBarrelLayerHalflengthZ

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkStripBarrelLayerHalflengthZ {this, "PassiveITkStripBarrelLayerHalflengthZ", {}}
private

Definition at line 137 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

137{this, "PassiveITkStripBarrelLayerHalflengthZ", {}};

◆ m_passiveITkStripBarrelLayerRadii

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkStripBarrelLayerRadii {this, "PassiveITkStripBarrelLayerRadii", {}}
private

Definition at line 136 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

136{this, "PassiveITkStripBarrelLayerRadii", {}};

◆ m_passiveITkStripBarrelLayerThickness

Gaudi::Property<std::vector<float> > ActsTrk::TrackingGeometrySvc::m_passiveITkStripBarrelLayerThickness {this, "PassiveITkStripBarrelLayerThickness", {}}
private

Definition at line 138 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

138{this, "PassiveITkStripBarrelLayerThickness", {}};

◆ m_printGeo

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_printGeo {this, "printGeometry", false}
private

Print the assembled tracking geometry after building.

Definition at line 118 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

118{this, "printGeometry", false};

◆ m_refineVisitors

ToolHandleArray<ActsTrk::IRefineTrackingGeoTool> ActsTrk::TrackingGeometrySvc::m_refineVisitors {this, "RefinementTools", {}}
private

Definition at line 153 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

153{this, "RefinementTools", {}};

◆ m_runConsistencyChecks

BooleanProperty ActsTrk::TrackingGeometrySvc::m_runConsistencyChecks
private
Initial value:
{this, "RunConsistencyChecks",
false, "Run extra consistency checks w.r.t to Trk::. This is SLOW!"}

Definition at line 140 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

140 {this, "RunConsistencyChecks",
141 false, "Run extra consistency checks w.r.t to Trk::. This is SLOW!"};

◆ m_subDetNoAlign

std::set<ActsTrk::DetectorType> ActsTrk::TrackingGeometrySvc::m_subDetNoAlign {}
private

Definition at line 156 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

156{};

◆ m_subDetNoAlignProp

Gaudi::Property<std::vector<unsigned int> > ActsTrk::TrackingGeometrySvc::m_subDetNoAlignProp {this, "NotAlignDetectors", {}}
private

Define the subdetectors for which the tracking geometry does not expect a valid alignment store.

Definition at line 155 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

155{this, "NotAlignDetectors", {}};

◆ m_trackingGeometry

std::shared_ptr<const Acts::TrackingGeometry> ActsTrk::TrackingGeometrySvc::m_trackingGeometry {nullptr}
private

Definition at line 104 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

104{nullptr};

◆ m_TRT_idHelper

const TRT_ID* ActsTrk::TrackingGeometrySvc::m_TRT_idHelper {nullptr}
private

Definition at line 106 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

106{nullptr};

◆ m_useBlueprint

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_useBlueprint {this, "UseBlueprint", false, "Use the new Blueprint API for geometry construction"}
private

Definition at line 158 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

158{this, "UseBlueprint", false, "Use the new Blueprint API for geometry construction"};

◆ m_useMaterialMap

Gaudi::Property<bool> ActsTrk::TrackingGeometrySvc::m_useMaterialMap {this, "UseMaterialMap", false, ""}
private

Definition at line 111 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

111{this, "UseMaterialMap", false, ""};

◆ p_beamPipeMgr

const BeamPipeDetectorManager* ActsTrk::TrackingGeometrySvc::p_beamPipeMgr {nullptr}
private

Definition at line 100 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

100{nullptr};

◆ p_HGTDManager

const HGTD_DetectorManager* ActsTrk::TrackingGeometrySvc::p_HGTDManager {nullptr}
private

Definition at line 101 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

101{nullptr};

◆ p_ITkPixelManager

const InDetDD::SiDetectorManager* ActsTrk::TrackingGeometrySvc::p_ITkPixelManager {nullptr}
private

Definition at line 98 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

98{nullptr};

◆ p_ITkStripManager

const InDetDD::SiDetectorManager* ActsTrk::TrackingGeometrySvc::p_ITkStripManager {nullptr}
private

Definition at line 99 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

99{nullptr};

◆ p_pixelManager

const InDetDD::SiDetectorManager* ActsTrk::TrackingGeometrySvc::p_pixelManager {nullptr}
private

Definition at line 95 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

95{nullptr};

◆ p_SCTManager

const InDetDD::SiDetectorManager* ActsTrk::TrackingGeometrySvc::p_SCTManager {nullptr}
private

Definition at line 96 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

96{nullptr};

◆ p_TRTManager

const InDetDD::TRT_DetectorManager* ActsTrk::TrackingGeometrySvc::p_TRTManager {nullptr}
private

Definition at line 97 of file Acts/ActsGeometry/src/TrackingGeometrySvc.h.

97{nullptr};

The documentation for this class was generated from the following files: