ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrackingGeometrySvc Class Reference

#include <ActsTrackingGeometrySvc.h>

Inheritance diagram for ActsTrackingGeometrySvc:

Public Member Functions

StatusCode initialize () override
 ActsTrackingGeometrySvc (const std::string &name, ISvcLocator *pSvcLocator)
std::shared_ptr< const Acts::TrackingGeometry > trackingGeometry () override
unsigned int populateAlignmentStore (ActsTrk::DetectorAlignStore &store) const override
const ActsTrk::GeometryContextgetNominalContext () const override

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 56 of file ActsTrackingGeometrySvc.h.

Constructor & Destructor Documentation

◆ ActsTrackingGeometrySvc()

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

Definition at line 71 of file ActsTrackingGeometrySvc.cxx.

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

Member Function Documentation

◆ getNominalContext()

const GeometryContext & ActsTrackingGeometrySvc::getNominalContext ( ) const
override

Definition at line 1138 of file ActsTrackingGeometrySvc.cxx.

1138{ return m_nominalContext; }
ActsTrk::GeometryContext m_nominalContext

◆ initialize()

StatusCode ActsTrackingGeometrySvc::initialize ( )
override

Definition at line 79 of file ActsTrackingGeometrySvc.cxx.

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

◆ makeBeamPipeConfig()

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

Definition at line 1141 of file ActsTrackingGeometrySvc.cxx.

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

◆ makeHGTDLayerBuilder()

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

Definition at line 794 of file ActsTrackingGeometrySvc.cxx.

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

◆ makeLayerBuilderConfig()

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

Definition at line 825 of file ActsTrackingGeometrySvc.cxx.

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

◆ makeSCTTRTAssembly()

std::shared_ptr< Acts::TrackingVolume > ActsTrackingGeometrySvc::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 916 of file ActsTrackingGeometrySvc.cxx.

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

◆ makeStrawLayerBuilder()

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

Definition at line 763 of file ActsTrackingGeometrySvc.cxx.

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

◆ populateAlignmentStore()

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

Definition at line 1131 of file ActsTrackingGeometrySvc.cxx.

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

◆ runConsistencyChecks()

bool ActsTrackingGeometrySvc::runConsistencyChecks ( ) const
private

Definition at line 529 of file ActsTrackingGeometrySvc.cxx.

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

◆ trackingGeometry()

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

Definition at line 756 of file ActsTrackingGeometrySvc.cxx.

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

Member Data Documentation

◆ m_barrelMaterialBins

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

Definition at line 116 of file ActsTrackingGeometrySvc.h.

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

◆ m_blueprintGraphviz

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

Definition at line 156 of file ActsTrackingGeometrySvc.h.

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

◆ m_blueprintNodeBuilders

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

Definition at line 147 of file ActsTrackingGeometrySvc.h.

147{this, "BlueprintNodeBuilders", {}};

◆ m_buildBeamPipe

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

Definition at line 111 of file ActsTrackingGeometrySvc.h.

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

◆ m_buildSubdetectors

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

Definition at line 118 of file ActsTrackingGeometrySvc.h.

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

◆ m_caloVolumeBuilder

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

Definition at line 145 of file ActsTrackingGeometrySvc.h.

145{this, "CaloVolumeBuilder", ""};

◆ m_consistencyCheckOutput

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

Definition at line 139 of file ActsTrackingGeometrySvc.h.

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

◆ m_consistencyCheckPoints

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

Definition at line 142 of file ActsTrackingGeometrySvc.h.

142 {this, "ConsistencyCheckPoints",
143 1000, "number of random points for consistency check"};

◆ m_detStore

ServiceHandle<StoreGateSvc> ActsTrackingGeometrySvc::m_detStore
private

Definition at line 90 of file ActsTrackingGeometrySvc.h.

◆ m_doEndcapLayerMerging

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

Definition at line 158 of file ActsTrackingGeometrySvc.h.

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

◆ m_elementStore

std::shared_ptr<ActsElementVector> ActsTrackingGeometrySvc::m_elementStore {nullptr}
private

Definition at line 99 of file ActsTrackingGeometrySvc.h.

99{nullptr};

◆ m_endcapMaterialBins

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

Definition at line 117 of file ActsTrackingGeometrySvc.h.

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

◆ m_HGTD_idHelper

const HGTD_ID* ActsTrackingGeometrySvc::m_HGTD_idHelper {nullptr}
private

Definition at line 103 of file ActsTrackingGeometrySvc.h.

103{nullptr};

◆ m_materialMapCalibFolder

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

Definition at line 110 of file ActsTrackingGeometrySvc.h.

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

◆ m_materialMapInputFileBase

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

Definition at line 109 of file ActsTrackingGeometrySvc.h.

109{this, "MaterialMapInputFile", "", ""};

◆ m_nominalContext

ActsTrk::GeometryContext ActsTrackingGeometrySvc::m_nominalContext {}
private

Definition at line 105 of file ActsTrackingGeometrySvc.h.

105{};

◆ m_numberOfBinsFactor

Gaudi::Property<double> ActsTrackingGeometrySvc::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 163 of file ActsTrackingGeometrySvc.h.

163{this, "NumberOfBinsFactor", 5.0};

◆ m_numberOfInnermostLayerBinsFactor

Gaudi::Property<double> ActsTrackingGeometrySvc::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 166 of file ActsTrackingGeometrySvc.h.

166{this, "NumberOfInnermostLayerBinsFactor",2.0};

◆ m_objDebugOutput

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

Definition at line 108 of file ActsTrackingGeometrySvc.h.

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

◆ m_passiveITkInnerPixelBarrelLayerHalflengthZ

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

Definition at line 125 of file ActsTrackingGeometrySvc.h.

125{this, "PassiveITkInnerPixelBarrelLayerHalflengthZ", {}};

◆ m_passiveITkInnerPixelBarrelLayerRadii

Gaudi::Property<std::vector<float> > ActsTrackingGeometrySvc::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 124 of file ActsTrackingGeometrySvc.h.

124{this, "PassiveITkInnerPixelBarrelLayerRadii", {}};

◆ m_passiveITkInnerPixelBarrelLayerThickness

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

Definition at line 126 of file ActsTrackingGeometrySvc.h.

126{this, "PassiveITkInnerPixelBarrelLayerThickness", {}};

◆ m_passiveITkOuterPixelBarrelLayerHalflengthZ

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

Definition at line 129 of file ActsTrackingGeometrySvc.h.

129{this, "PassiveITkOuterPixelBarrelLayerHalflengthZ", {}};

◆ m_passiveITkOuterPixelBarrelLayerRadii

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

Definition at line 128 of file ActsTrackingGeometrySvc.h.

128{this, "PassiveITkOuterPixelBarrelLayerRadii", {}};

◆ m_passiveITkOuterPixelBarrelLayerThickness

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

Definition at line 130 of file ActsTrackingGeometrySvc.h.

130{this, "PassiveITkOuterPixelBarrelLayerThickness", {}};

◆ m_passiveITkStripBarrelLayerHalflengthZ

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

Definition at line 133 of file ActsTrackingGeometrySvc.h.

133{this, "PassiveITkStripBarrelLayerHalflengthZ", {}};

◆ m_passiveITkStripBarrelLayerRadii

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

Definition at line 132 of file ActsTrackingGeometrySvc.h.

132{this, "PassiveITkStripBarrelLayerRadii", {}};

◆ m_passiveITkStripBarrelLayerThickness

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

Definition at line 134 of file ActsTrackingGeometrySvc.h.

134{this, "PassiveITkStripBarrelLayerThickness", {}};

◆ m_printGeo

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

Print the assembled tracking geometry after building.

Definition at line 114 of file ActsTrackingGeometrySvc.h.

114{this, "printGeometry", false};

◆ m_refineVisitors

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

Definition at line 149 of file ActsTrackingGeometrySvc.h.

149{this, "RefinementTools", {}};

◆ m_runConsistencyChecks

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

Definition at line 136 of file ActsTrackingGeometrySvc.h.

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

◆ m_subDetNoAlign

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

Definition at line 152 of file ActsTrackingGeometrySvc.h.

152{};

◆ m_subDetNoAlignProp

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

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

Definition at line 151 of file ActsTrackingGeometrySvc.h.

151{this, "NotAlignDetectors", {}};

◆ m_trackingGeometry

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

Definition at line 100 of file ActsTrackingGeometrySvc.h.

100{nullptr};

◆ m_TRT_idHelper

const TRT_ID* ActsTrackingGeometrySvc::m_TRT_idHelper {nullptr}
private

Definition at line 102 of file ActsTrackingGeometrySvc.h.

102{nullptr};

◆ m_useBlueprint

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

Definition at line 154 of file ActsTrackingGeometrySvc.h.

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

◆ m_useMaterialMap

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

Definition at line 107 of file ActsTrackingGeometrySvc.h.

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

◆ p_beamPipeMgr

const BeamPipeDetectorManager* ActsTrackingGeometrySvc::p_beamPipeMgr {nullptr}
private

Definition at line 96 of file ActsTrackingGeometrySvc.h.

96{nullptr};

◆ p_HGTDManager

const HGTD_DetectorManager* ActsTrackingGeometrySvc::p_HGTDManager {nullptr}
private

Definition at line 97 of file ActsTrackingGeometrySvc.h.

97{nullptr};

◆ p_ITkPixelManager

const InDetDD::SiDetectorManager* ActsTrackingGeometrySvc::p_ITkPixelManager {nullptr}
private

Definition at line 94 of file ActsTrackingGeometrySvc.h.

94{nullptr};

◆ p_ITkStripManager

const InDetDD::SiDetectorManager* ActsTrackingGeometrySvc::p_ITkStripManager {nullptr}
private

Definition at line 95 of file ActsTrackingGeometrySvc.h.

95{nullptr};

◆ p_pixelManager

const InDetDD::SiDetectorManager* ActsTrackingGeometrySvc::p_pixelManager {nullptr}
private

Definition at line 91 of file ActsTrackingGeometrySvc.h.

91{nullptr};

◆ p_SCTManager

const InDetDD::SiDetectorManager* ActsTrackingGeometrySvc::p_SCTManager {nullptr}
private

Definition at line 92 of file ActsTrackingGeometrySvc.h.

92{nullptr};

◆ p_TRTManager

const InDetDD::TRT_DetectorManager* ActsTrackingGeometrySvc::p_TRTManager {nullptr}
private

Definition at line 93 of file ActsTrackingGeometrySvc.h.

93{nullptr};

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