79 {
82 try {
84 } catch (...) {
86 return StatusCode::FAILURE;
87 }
88 }
90
91
92
93
94 m_autoRetrieveTools = false;
95 m_checkToolDeps = false;
96
98 << Acts::VersionMajor << "." << Acts::VersionMinor << "."
99 << Acts::VersionPatch << " [" << Acts::CommitHash.value_or("unknown hash") << "]");
100
101
104 ATH_MSG_INFO(
"Configured to build " << buildSubdet.size()
105 << " subdetectors:");
106 for (const auto &s : buildSubdet) {
108 }
109
111 if (buildSubdet.find("Pixel") != buildSubdet.end()) {
113 }
114 if (buildSubdet.find("SCT") != buildSubdet.end()) {
116 }
117 if (buildSubdet.find("TRT") != buildSubdet.end()) {
120 }
121 if (buildSubdet.find("ITkPixel") != buildSubdet.end()) {
123 }
124 if (buildSubdet.find("ITkStrip") != buildSubdet.end()) {
126 }
127 if (buildSubdet.find("HGTD") != buildSubdet.end()) {
130 }
131
134 }
135
136
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
156
157
158 ATH_MSG_INFO(
"Using Blueprint API for geometry construction");
161
164
165 using enum Acts::AxisDirection;
166
167 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
169 std::back_inserter(ptrBuilders),
170 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>& b) { return b.get(); });
171
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
182 std::shared_ptr<Acts::Experimental::BlueprintNode> currentTop{nullptr};
183
184 for (auto& builder : ptrBuilders) {
186
187 }
188
189 root.addChild(std::move(currentTop));
190
191 std::unique_ptr<Acts::TrackingGeometry>
trackingGeometry = blueprint->construct(
193
197 }
199
201
203 Acts::ObjVisualization3D vis;
205 {.visible = false}, {.visible = true});
206 vis.write("blueprint_sensitive.obj");
207 vis.clear();
208
210 {.visible = false}, {.visible = false});
211 vis.write("blueprint_volume.obj");
212 vis.clear();
213
215 {.visible = true}, {.visible = false});
216 vis.write("blueprint_portals.obj");
217 }
219 Acts::detail::TrackingGeometryPrintVisitor printer{
m_nominalContext.context()};
221 ATH_MSG_INFO(
"Built tracking geometry \n"<<printer.stream().str());
222 }
223
224 return StatusCode::SUCCESS;
225 }
226
228
229 Acts::LayerArrayCreator::Config lacCfg;
230 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
232
233 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
234 auto trackingVolumeArrayCreator =
235 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
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>(
245
246 Acts::TrackingGeometryBuilder::Config tgbConfig;
247 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
248
250 std::shared_ptr<const Acts::IMaterialDecorator> matDeco = nullptr;
251
253 if (matFileFullPath.empty()) {
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
261 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
262
263 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
265 }
266 tgbConfig.materialDecorator = matDeco;
267 }
268
269 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
270
271 try {
272
274 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
275 const auto &inner,
276 const auto &) {
277
278 Acts::CylinderVolumeBuilder::Config bpvConfig =
280
281 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
283
284 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
285 });
286 }
287
288
289
290
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>(
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;
306
307 Acts::CylinderVolumeBuilder cvb(
309
310 return cvb.trackingVolume(gctx, inner);
311 });
312 }
313
314
315 if (buildSubdet.count("ITkPixel") > 0) {
316 tgbConfig.trackingVolumeBuilders.push_back(
317 [&](const auto &gctx, const auto &inner, const auto &) {
321 cfg.doEndcapLayerMerging =
true;
325 auto lb = std::make_shared<ActsLayerBuilder>(
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;
335
336 Acts::CylinderVolumeBuilder cvb(
337 cvbConfig,
339
340 return cvb.trackingVolume(gctx, inner);
341 });
342
343 tgbConfig.trackingVolumeBuilders.push_back(
344 [&](const auto &gctx, const auto &inner, const auto &) {
348 cfg.doEndcapLayerMerging =
false;
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 = "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,
368
369 return cvb.trackingVolume(gctx, inner);
370 });
371 }
372
373
374 if (buildSubdet.count("ITkStrip") > 0) {
375 tgbConfig.trackingVolumeBuilders.push_back(
376 [&](const auto &gctx, const auto &inner, const auto &) {
383 auto lb = std::make_shared<ActsLayerBuilder>(
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 =
394
395 Acts::CylinderVolumeBuilder cvb(
396 cvbConfig,
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
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>(
415
417
419 *cylinderVolumeHelper, inner);
420 });
421
422 } else if (buildSCT) {
423 tgbConfig.trackingVolumeBuilders.push_back(
424 [&](const auto &gctx, const auto &inner, const auto &) {
427 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
428 auto lb = std::make_shared<ActsLayerBuilder>(
429 lbCfg,
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,
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,
461
462 return cvb.trackingVolume(gctx, inner);
463 });
464 }
465
466
467 if(buildSubdet.count("HGTD") > 0) {
468 tgbConfig.trackingVolumeBuilders.push_back(
469 [&](const auto &gctx, const auto &inner, const auto &) {
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,
482
483 return cvb.trackingVolume(gctx, inner);
484 });
485 }
486
487
489 tgbConfig.trackingVolumeBuilders.push_back(
490 [&](const auto &gctx, const auto &inner, const auto &) {
492 });
493 }
494
495 } catch (const std::exception &e) {
496 ATH_MSG_ERROR(
"Encountered error when building Acts tracking geometry");
498 return StatusCode::FAILURE;
499 }
500
501 auto trackingGeometryBuilder =
502 std::make_shared<const Acts::TrackingGeometryBuilder>(
504
509
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)");
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_VERBOSE(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
const TRT_ID * m_TRT_idHelper
Gaudi::Property< std::vector< unsigned int > > m_subDetNoAlignProp
Define the subdetectors for which the tracking geometry does not expect a valid alignment store.
const HGTD_ID * m_HGTD_idHelper
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
BooleanProperty m_runConsistencyChecks
bool runConsistencyChecks() const
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
static Root::TMsgLogger logger("iLumiCalc")
Acts::Logging::Level actsLevelVector(MSG::Level lvl)
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.