100 {
103 try {
105 } catch (...) {
107 return StatusCode::FAILURE;
108 }
109 }
111
112
113
114
115 m_autoRetrieveTools = false;
116 m_checkToolDeps = false;
117
119 << Acts::VersionMajor << "." << Acts::VersionMinor << "."
120 << Acts::VersionPatch << " [" << Acts::CommitHash.value_or("unknown hash") << "]");
121
122
125 ATH_MSG_INFO(
"Configured to build " << buildSubdet.size()
126 << " subdetectors:");
127 for (const auto &s : buildSubdet) {
129 }
130
132 if (buildSubdet.contains("Pixel") ) {
134 }
135 if (buildSubdet.contains("SCT") ) {
137 }
138 if (buildSubdet.contains("TRT") ) {
141 }
142 if (buildSubdet.contains("ITkPixel") ) {
144 }
145 if (buildSubdet.contains("ITkStrip") ) {
147 }
148 if (buildSubdet.contains("HGTD") ) {
151 }
152
155 }
156
157
160 ATH_MSG_FATAL(
"Consistency check for ITk inner pixel barrel passive layer construction failed. Please check your inputs! ");
161 return StatusCode::FAILURE;
162 }
163
166 ATH_MSG_FATAL(
"Consistency check for ITk outer pixel barrel passive layer construction failed. Please check your inputs! ");
167 return StatusCode::FAILURE;
168 }
169
172 ATH_MSG_FATAL(
"Consistency check for ITk strip barrel passive layer construction failed. Please check your inputs! ");
173 return StatusCode::FAILURE;
174 }
175
177
178
179 ATH_MSG_INFO(
"Using Blueprint API for geometry construction");
182
185
186 using enum Acts::AxisDirection;
187
188 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
190 std::back_inserter(ptrBuilders),
191 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>& b) { return b.get(); });
192
194
195 Acts::Blueprint::Config
cfg;
196 cfg.envelope[AxisZ] = {20_mm, 20_mm};
197 cfg.envelope[AxisR] = {0_mm, 20_mm};
198
199 auto blueprint = std::make_unique<Acts::Blueprint>(cfg);
200
201 auto&
root = blueprint->addCylinderContainer(
"Detector", AxisZ);
202
203 std::shared_ptr<Acts::BlueprintNode> currentTop{nullptr};
204
205 for (auto& builder : ptrBuilders) {
207
208 }
209
210 root.addChild(std::move(currentTop));
211
212 Acts::BlueprintOptions blueprintOptions;
214 std::unique_ptr<Acts::TrackingGeometry>
trackingGeometry = blueprint->construct(
216
220 }
222
224
226 Acts::ObjVisualization3D vis;
228 viewConfigFunc({.visible = false}, {.visible = false}, {.visible = true}));
229 vis.write("blueprint_sensitive.obj");
230 vis.clear();
231
233 viewConfigFunc({.visible = true}, {.visible = false}, {.visible = false}));
234 vis.write("blueprint_volume.obj");
235 vis.clear();
236
238 viewConfigFunc({.visible = false}, {.visible = true}, {.visible = false}));
239 vis.write("blueprint_portals.obj");
240 }
242 Acts::detail::TrackingGeometryPrintVisitor printer{
m_nominalContext.context()};
244 ATH_MSG_INFO(
"Built tracking geometry \n"<<printer.stream().str());
245 }
248 return StatusCode::FAILURE;
249 }
250
251 return StatusCode::SUCCESS;
252 }
253
255
256 Acts::LayerArrayCreator::Config lacCfg;
257 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
259
260 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
261 auto trackingVolumeArrayCreator =
262 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
264
265 Acts::CylinderVolumeHelper::Config cvhConfig;
266 cvhConfig.layerArrayCreator = layerArrayCreator;
267 cvhConfig.trackingVolumeArrayCreator = trackingVolumeArrayCreator;
268
269 auto cylinderVolumeHelper =
270 std::make_shared<const Acts::CylinderVolumeHelper>(
272
273 Acts::TrackingGeometryBuilder::Config tgbConfig;
274 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
275
277 std::shared_ptr<const Acts::IMaterialDecorator> matDeco = nullptr;
278
280 if (matFileFullPath.empty()) {
282 return StatusCode::FAILURE;
283 }
284 ATH_MSG_INFO(
"Configured to use material input: " << matFileFullPath);
285
286 if (matFileFullPath.find(".json") != std::string::npos) {
287
288 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
289
290 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
292 }
293 tgbConfig.materialDecorator = std::move(matDeco);
294 }
295
296 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
297
298 try {
299
301 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
302 const auto &inner,
303 const auto &) {
304
305 Acts::CylinderVolumeBuilder::Config bpvConfig =
307
308 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
310
311 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
312 });
313 }
314
315
316
317
318 if (buildSubdet.contains("Pixel")) {
319 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
320 const auto &inner,
321 const auto &) {
324 auto lb = std::make_shared<ActsLayerBuilder>(
326 Acts::CylinderVolumeBuilder::Config cvbConfig;
327 cvbConfig.layerEnvelopeR = {3_mm, 3_mm};
328 cvbConfig.layerEnvelopeZ = 1_mm;
329 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
330 cvbConfig.volumeName = "Pixel";
331 cvbConfig.layerBuilder =
lb;
333
334 Acts::CylinderVolumeBuilder cvb(
336
337 return cvb.trackingVolume(gctx, inner);
338 });
339 }
340
341
342 if (buildSubdet.contains("ITkPixel") ) {
343 tgbConfig.trackingVolumeBuilders.push_back(
344 [&](const auto &gctx, const auto &inner, const auto &) {
348 cfg.doEndcapLayerMerging =
true;
352 auto lb = std::make_shared<ActsLayerBuilder>(
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 = "ITkPixelInner";
360 cvbConfig.layerBuilder =
lb;
362
363 Acts::CylinderVolumeBuilder cvb(
364 cvbConfig,
366
367 return cvb.trackingVolume(gctx, inner);
368 });
369
370 tgbConfig.trackingVolumeBuilders.push_back(
371 [&](const auto &gctx, const auto &inner, const auto &) {
375 cfg.doEndcapLayerMerging =
false;
379 auto lb = std::make_shared<ActsLayerBuilder>(
381
382 Acts::CylinderVolumeBuilder::Config cvbConfig;
383 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
384 cvbConfig.layerEnvelopeZ = 1_mm;
385 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
386 cvbConfig.volumeName = "ITkPixelOuter";
387 cvbConfig.layerBuilder =
lb;
388 cvbConfig.buildToRadiusZero = false;
389 cvbConfig.checkRingLayout = true;
390 cvbConfig.ringTolerance = 10_mm;
391
392 Acts::CylinderVolumeBuilder cvb(
393 cvbConfig,
395
396 return cvb.trackingVolume(gctx, inner);
397 });
398 }
399
400
401 if (buildSubdet.contains("ITkStrip")) {
402 tgbConfig.trackingVolumeBuilders.push_back(
403 [&](const auto &gctx, const auto &inner, const auto &) {
410 auto lb = std::make_shared<ActsLayerBuilder>(
412
413 Acts::CylinderVolumeBuilder::Config cvbConfig;
414 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
415 cvbConfig.layerEnvelopeZ = 1_mm;
416 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
417 cvbConfig.volumeName = "ITkStrip";
418 cvbConfig.layerBuilder =
lb;
419 cvbConfig.buildToRadiusZero =
421
422 Acts::CylinderVolumeBuilder cvb(
423 cvbConfig,
425
426 return cvb.trackingVolume(gctx, inner);
427 });
428 }
429
430 bool buildSCT = buildSubdet.contains("SCT") ;
431 bool buildTRT = buildSubdet.contains("TRT");
432
433 if (buildSCT && buildTRT) {
434
435 tgbConfig.trackingVolumeBuilders.push_back(
436 [&](const auto &gctx, const auto &inner, const auto &) {
439 cfg.endcapEnvelopeZ = sctECEnvelopeZ;
440 auto sct_lb = std::make_shared<ActsLayerBuilder>(
442
444
446 *cylinderVolumeHelper, inner);
447 });
448
449 } else if (buildSCT) {
450 tgbConfig.trackingVolumeBuilders.push_back(
451 [&](const auto &gctx, const auto &inner, const auto &) {
454 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
455 auto lb = std::make_shared<ActsLayerBuilder>(
456 lbCfg,
458
459 Acts::CylinderVolumeBuilder::Config cvbConfig;
460 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
461 cvbConfig.layerEnvelopeZ = 2_mm;
462 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
463 cvbConfig.volumeName = "SCT";
464 cvbConfig.layerBuilder =
lb;
465 cvbConfig.buildToRadiusZero = false;
466
467 Acts::CylinderVolumeBuilder cvb(
468 cvbConfig,
470
471 return cvb.trackingVolume(gctx, inner);
472 });
473 } else if (buildTRT) {
474 tgbConfig.trackingVolumeBuilders.push_back(
475 [&](const auto &gctx, const auto &inner, const auto &) {
477 Acts::CylinderVolumeBuilder::Config cvbConfig;
478 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
479 cvbConfig.layerEnvelopeZ = 2_mm;
480 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
481 cvbConfig.volumeName = "TRT";
482 cvbConfig.layerBuilder = std::move(
lb);
483 cvbConfig.buildToRadiusZero = false;
484
485 Acts::CylinderVolumeBuilder cvb(
486 cvbConfig,
488
489 return cvb.trackingVolume(gctx, inner);
490 });
491 }
492
493
494 if(buildSubdet.contains("HGTD") ) {
495 tgbConfig.trackingVolumeBuilders.push_back(
496 [&](const auto &gctx, const auto &inner, const auto &) {
498 Acts::CylinderVolumeBuilder::Config cvbConfig;
499 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
500 cvbConfig.layerEnvelopeZ = 1_mm;
501 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
502 cvbConfig.volumeName = "HGTD";
503 cvbConfig.layerBuilder = std::move(
lb);
504 cvbConfig.buildToRadiusZero = false;
505
506 Acts::CylinderVolumeBuilder cvb(
507 cvbConfig,
509
510 return cvb.trackingVolume(gctx, inner);
511 });
512 }
513
514
516 tgbConfig.trackingVolumeBuilders.push_back(
517 [&](const auto &gctx, const auto &inner, const auto &) {
519 });
520 }
521
522 } catch (const std::exception &e) {
523 ATH_MSG_ERROR(
"Encountered error when building Acts tracking geometry");
525 return StatusCode::FAILURE;
526 }
527
528 auto trackingGeometryBuilder =
529 std::make_shared<const Acts::TrackingGeometryBuilder>(
531
536
538 ATH_MSG_ERROR(
"No ACTS tracking geometry was built. Cannot proceeed");
539 return StatusCode::FAILURE;
540 }
541
542
544 ATH_MSG_INFO(
"Running extra consistency check! (this is SLOW)");
546 ATH_MSG_ERROR(
"Consistency check has failed! Geometry is not consistent");
547 return StatusCode::FAILURE;
548 }
549 }
550
553 return StatusCode::FAILURE;
554 }
555
556
557 ATH_MSG_INFO(
"Acts TrackingGeometry construction completed");
558
559 return StatusCode::SUCCESS;
560}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_FATAL(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)
const TRT_ID * m_TRT_idHelper
const InDetDD::TRT_DetectorManager * p_TRTManager
bool runConsistencyChecks() const
Gaudi::Property< std::vector< std::string > > m_buildSubdetectors
Gaudi::Property< bool > m_keepGoingOnMaterialMergeFailure
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerThickness
Gaudi::Property< bool > m_useBlueprint
ActsLayerBuilder::Config makeLayerBuilderConfig(const InDetDD::InDetDetectorManager *manager)
const InDetDD::SiDetectorManager * p_ITkStripManager
std::set< ActsTrk::DetectorType > m_subDetNoAlign
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
BooleanProperty m_runConsistencyChecks
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerRadii
Gaudi::Property< bool > m_buildBeamPipe
Gaudi::Property< std::string > m_materialMapCalibFolder
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerThickness
const BeamPipeDetectorManager * p_beamPipeMgr
std::shared_ptr< const Acts::ILayerBuilder > makeHGTDLayerBuilder(const HGTD_DetectorManager *manager)
std::unique_ptr< const ActsTrk::DetectorElementToActsGeometryIdMap > m_detIdMap
Gaudi::Property< bool > m_printGeo
Print the assembled tracking geometry after building.
Gaudi::Property< std::string > m_materialMapInputFileBase
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
const InDetDD::SiDetectorManager * p_SCTManager
std::unique_ptr< ActsTrk::DetectorElementToActsGeometryIdMap > createDetectorElementToGeoIdMap() const
Creates and popules the DetectorElement -> Acts::Surface geo identifier map from the geometry service...
Gaudi::Property< bool > m_useMaterialMap
const HGTD_DetectorManager * p_HGTDManager
Gaudi::Property< std::vector< float > > m_passiveITkOuterPixelBarrelLayerRadii
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerHalflengthZ
Gaudi::Property< std::vector< float > > m_passiveITkStripBarrelLayerHalflengthZ
Gaudi::Property< bool > m_objDebugOutput
const HGTD_ID * m_HGTD_idHelper
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)
static Root::TMsgLogger logger("iLumiCalc")
Acts::Logging::Level actsLevelVector(MSG::Level lvl)