80 {
83 try {
85 } catch (...) {
87 return StatusCode::FAILURE;
88 }
89 }
91
92
93
94
95 m_autoRetrieveTools = false;
96 m_checkToolDeps = false;
97
99 << Acts::VersionMajor << "." << Acts::VersionMinor << "."
100 << Acts::VersionPatch << " [" << Acts::CommitHash.value_or("unknown hash") << "]");
101
102
105 ATH_MSG_INFO(
"Configured to build " << buildSubdet.size()
106 << " subdetectors:");
107 for (const auto &s : buildSubdet) {
109 }
110
112 if (buildSubdet.find("Pixel") != buildSubdet.end()) {
114 }
115 if (buildSubdet.find("SCT") != buildSubdet.end()) {
117 }
118 if (buildSubdet.find("TRT") != buildSubdet.end()) {
121 }
122 if (buildSubdet.find("ITkPixel") != buildSubdet.end()) {
124 }
125 if (buildSubdet.find("ITkStrip") != buildSubdet.end()) {
127 }
128 if (buildSubdet.find("HGTD") != buildSubdet.end()) {
131 }
132
135 }
136
137
140 ATH_MSG_FATAL(
"Consistency check for ITk inner pixel barrel passive layer construction failed. Please check your inputs! ");
141 return StatusCode::FAILURE;
142 }
143
146 ATH_MSG_FATAL(
"Consistency check for ITk outer pixel barrel passive layer construction failed. Please check your inputs! ");
147 return StatusCode::FAILURE;
148 }
149
152 ATH_MSG_FATAL(
"Consistency check for ITk strip barrel passive layer construction failed. Please check your inputs! ");
153 return StatusCode::FAILURE;
154 }
155
157
158
159 ATH_MSG_INFO(
"Using Blueprint API for geometry construction");
162
165
166 using enum Acts::AxisDirection;
167
168 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
170 std::back_inserter(ptrBuilders),
171 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>& b) { return b.get(); });
172
174
175 Acts::Experimental::Blueprint::Config
cfg;
176 cfg.envelope[AxisZ] = {20_mm, 20_mm};
177 cfg.envelope[AxisR] = {0_mm, 20_mm};
178
179 auto blueprint = std::make_unique<Acts::Experimental::Blueprint>(cfg);
180
181 auto&
root = blueprint->addCylinderContainer(
"Detector", AxisZ);
182
183 std::shared_ptr<Acts::Experimental::BlueprintNode> currentTop{nullptr};
184
185 for (auto& builder : ptrBuilders) {
187
188 }
189
190 root.addChild(std::move(currentTop));
191
192 std::unique_ptr<Acts::TrackingGeometry>
trackingGeometry = blueprint->construct(
194
198 }
200
202
204 Acts::ObjVisualization3D vis;
206 {.visible = false}, {.visible = true});
207 vis.write("blueprint_sensitive.obj");
208 vis.clear();
209
211 {.visible = false}, {.visible = false});
212 vis.write("blueprint_volume.obj");
213 vis.clear();
214
216 {.visible = true}, {.visible = false});
217 vis.write("blueprint_portals.obj");
218 }
220 Acts::detail::TrackingGeometryPrintVisitor printer{
m_nominalContext.context()};
222 ATH_MSG_INFO(
"Built tracking geometry \n"<<printer.stream().str());
223 }
224
225 return StatusCode::SUCCESS;
226 }
227
229
230 Acts::LayerArrayCreator::Config lacCfg;
231 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
233
234 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
235 auto trackingVolumeArrayCreator =
236 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
238
239 Acts::CylinderVolumeHelper::Config cvhConfig;
240 cvhConfig.layerArrayCreator = layerArrayCreator;
241 cvhConfig.trackingVolumeArrayCreator = trackingVolumeArrayCreator;
242
243 auto cylinderVolumeHelper =
244 std::make_shared<const Acts::CylinderVolumeHelper>(
246
247 Acts::TrackingGeometryBuilder::Config tgbConfig;
248 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
249
251 std::shared_ptr<const Acts::IMaterialDecorator> matDeco = nullptr;
252
254 if (matFileFullPath.empty()) {
256 return StatusCode::FAILURE;
257 }
258 ATH_MSG_INFO(
"Configured to use material input: " << matFileFullPath);
259
260 if (matFileFullPath.find(".json") != std::string::npos) {
261
262 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
263
264 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
266 }
267 tgbConfig.materialDecorator = matDeco;
268 }
269
270 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
271
272 try {
273
275 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
276 const auto &inner,
277 const auto &) {
278
279 Acts::CylinderVolumeBuilder::Config bpvConfig =
281
282 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
284
285 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
286 });
287 }
288
289
290
291
292 if (buildSubdet.count("Pixel") > 0) {
293 tgbConfig.trackingVolumeBuilders.push_back([&](const auto &gctx,
294 const auto &inner,
295 const auto &) {
298 auto lb = std::make_shared<ActsLayerBuilder>(
300 Acts::CylinderVolumeBuilder::Config cvbConfig;
301 cvbConfig.layerEnvelopeR = {3_mm, 3_mm};
302 cvbConfig.layerEnvelopeZ = 1_mm;
303 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
304 cvbConfig.volumeName = "Pixel";
305 cvbConfig.layerBuilder =
lb;
307
308 Acts::CylinderVolumeBuilder cvb(
310
311 return cvb.trackingVolume(gctx, inner);
312 });
313 }
314
315
316 if (buildSubdet.count("ITkPixel") > 0) {
317 tgbConfig.trackingVolumeBuilders.push_back(
318 [&](const auto &gctx, const auto &inner, const auto &) {
322 cfg.doEndcapLayerMerging =
true;
326 auto lb = std::make_shared<ActsLayerBuilder>(
328
329 Acts::CylinderVolumeBuilder::Config cvbConfig;
330 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
331 cvbConfig.layerEnvelopeZ = 1_mm;
332 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
333 cvbConfig.volumeName = "ITkPixelInner";
334 cvbConfig.layerBuilder =
lb;
336
337 Acts::CylinderVolumeBuilder cvb(
338 cvbConfig,
340
341 return cvb.trackingVolume(gctx, inner);
342 });
343
344 tgbConfig.trackingVolumeBuilders.push_back(
345 [&](const auto &gctx, const auto &inner, const auto &) {
349 cfg.doEndcapLayerMerging =
false;
353 auto lb = std::make_shared<ActsLayerBuilder>(
355
356 Acts::CylinderVolumeBuilder::Config cvbConfig;
357 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
358 cvbConfig.layerEnvelopeZ = 1_mm;
359 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
360 cvbConfig.volumeName = "ITkPixelOuter";
361 cvbConfig.layerBuilder =
lb;
362 cvbConfig.buildToRadiusZero = false;
363 cvbConfig.checkRingLayout = true;
364 cvbConfig.ringTolerance = 10_mm;
365
366 Acts::CylinderVolumeBuilder cvb(
367 cvbConfig,
369
370 return cvb.trackingVolume(gctx, inner);
371 });
372 }
373
374
375 if (buildSubdet.count("ITkStrip") > 0) {
376 tgbConfig.trackingVolumeBuilders.push_back(
377 [&](const auto &gctx, const auto &inner, const auto &) {
384 auto lb = std::make_shared<ActsLayerBuilder>(
386
387 Acts::CylinderVolumeBuilder::Config cvbConfig;
388 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
389 cvbConfig.layerEnvelopeZ = 1_mm;
390 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
391 cvbConfig.volumeName = "ITkStrip";
392 cvbConfig.layerBuilder =
lb;
393 cvbConfig.buildToRadiusZero =
395
396 Acts::CylinderVolumeBuilder cvb(
397 cvbConfig,
399
400 return cvb.trackingVolume(gctx, inner);
401 });
402 }
403
404 bool buildSCT = buildSubdet.count("SCT") > 0;
405 bool buildTRT = buildSubdet.count("TRT") > 0;
406
407 if (buildSCT && buildTRT) {
408
409 tgbConfig.trackingVolumeBuilders.push_back(
410 [&](const auto &gctx, const auto &inner, const auto &) {
413 cfg.endcapEnvelopeZ = sctECEnvelopeZ;
414 auto sct_lb = std::make_shared<ActsLayerBuilder>(
416
418
420 *cylinderVolumeHelper, inner);
421 });
422
423 } else if (buildSCT) {
424 tgbConfig.trackingVolumeBuilders.push_back(
425 [&](const auto &gctx, const auto &inner, const auto &) {
428 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
429 auto lb = std::make_shared<ActsLayerBuilder>(
430 lbCfg,
432
433 Acts::CylinderVolumeBuilder::Config cvbConfig;
434 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
435 cvbConfig.layerEnvelopeZ = 2_mm;
436 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
437 cvbConfig.volumeName = "SCT";
438 cvbConfig.layerBuilder =
lb;
439 cvbConfig.buildToRadiusZero = false;
440
441 Acts::CylinderVolumeBuilder cvb(
442 cvbConfig,
444
445 return cvb.trackingVolume(gctx, inner);
446 });
447 } else if (buildTRT) {
448 tgbConfig.trackingVolumeBuilders.push_back(
449 [&](const auto &gctx, const auto &inner, const auto &) {
451 Acts::CylinderVolumeBuilder::Config cvbConfig;
452 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
453 cvbConfig.layerEnvelopeZ = 2_mm;
454 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
455 cvbConfig.volumeName = "TRT";
456 cvbConfig.layerBuilder =
lb;
457 cvbConfig.buildToRadiusZero = false;
458
459 Acts::CylinderVolumeBuilder cvb(
460 cvbConfig,
462
463 return cvb.trackingVolume(gctx, inner);
464 });
465 }
466
467
468 if(buildSubdet.count("HGTD") > 0) {
469 tgbConfig.trackingVolumeBuilders.push_back(
470 [&](const auto &gctx, const auto &inner, const auto &) {
472 Acts::CylinderVolumeBuilder::Config cvbConfig;
473 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
474 cvbConfig.layerEnvelopeZ = 1_mm;
475 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
476 cvbConfig.volumeName = "HGTD";
477 cvbConfig.layerBuilder =
lb;
478 cvbConfig.buildToRadiusZero = false;
479
480 Acts::CylinderVolumeBuilder cvb(
481 cvbConfig,
483
484 return cvb.trackingVolume(gctx, inner);
485 });
486 }
487
488
490 tgbConfig.trackingVolumeBuilders.push_back(
491 [&](const auto &gctx, const auto &inner, const auto &) {
493 });
494 }
495
496 } catch (const std::exception &e) {
497 ATH_MSG_ERROR(
"Encountered error when building Acts tracking geometry");
499 return StatusCode::FAILURE;
500 }
501
502 auto trackingGeometryBuilder =
503 std::make_shared<const Acts::TrackingGeometryBuilder>(
505
510
512 ATH_MSG_ERROR(
"No ACTS tracking geometry was built. Cannot proceeed");
513 return StatusCode::FAILURE;
514 }
515
516
518 ATH_MSG_INFO(
"Running extra consistency check! (this is SLOW)");
520 ATH_MSG_ERROR(
"Consistency check has failed! Geometry is not consistent");
521 return StatusCode::FAILURE;
522 }
523 }
524
525 ATH_MSG_INFO(
"Acts TrackingGeometry construction completed");
526
527 return StatusCode::SUCCESS;
528}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_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)
Acts::GeometryContext context() const
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< 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)
Gaudi::Property< bool > m_printGeo
Print the assembled tracking geometry after building.
Gaudi::Property< std::string > m_materialMapInputFileBase
std::shared_ptr< const Acts::TrackingGeometry > trackingGeometry() override
Returns a pointer to the internal ACTS tracking geometry.
Gaudi::Property< std::vector< float > > m_passiveITkInnerPixelBarrelLayerRadii
the specifications for building additional passive cylinders in the barrel region: for each cylinder ...
const ActsTrk::GeometryContext & getNominalContext() const override
Returns an empty nominal context without any alignment caches.
std::shared_ptr< const Acts::ILayerBuilder > makeStrawLayerBuilder(const InDetDD::InDetDetectorManager *manager)
ToolHandleArray< ActsTrk::IBlueprintNodeBuilder > m_blueprintNodeBuilders
ToolHandle< IActsTrackingVolumeBuilder > m_caloVolumeBuilder
const InDetDD::SiDetectorManager * p_SCTManager
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")
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
Acts::Logging::Level actsLevelVector(MSG::Level lvl)