84 return StatusCode::FAILURE;
94 m_autoRetrieveTools =
false;
95 m_checkToolDeps =
false;
98 << Acts::VersionMajor <<
"." << Acts::VersionMinor <<
"."
99 << Acts::VersionPatch <<
" [" << Acts::CommitHash <<
"]");
104 ATH_MSG_INFO(
"Configured to build " << buildSubdet.size()
105 <<
" subdetectors:");
106 for (
const auto &
s : buildSubdet) {
111 if (buildSubdet.find(
"Pixel") != buildSubdet.end()) {
114 if (buildSubdet.find(
"SCT") != buildSubdet.end()) {
117 if (buildSubdet.find(
"TRT") != buildSubdet.end()) {
121 if (buildSubdet.find(
"ITkPixel") != buildSubdet.end()) {
124 if (buildSubdet.find(
"ITkStrip") != buildSubdet.end()) {
127 if (buildSubdet.find(
"HGTD") != buildSubdet.end()) {
139 ATH_MSG_FATAL(
"Consistency check for ITk inner pixel barrel passive layer construction failed. Please check your inputs! ");
140 return StatusCode::FAILURE;
145 ATH_MSG_FATAL(
"Consistency check for ITk outer pixel barrel passive layer construction failed. Please check your inputs! ");
146 return StatusCode::FAILURE;
151 ATH_MSG_FATAL(
"Consistency check for ITk strip barrel passive layer construction failed. Please check your inputs! ");
152 return StatusCode::FAILURE;
158 ATH_MSG_INFO(
"Using Blueprint API for geometry construction");
164 using enum Acts::AxisDirection;
166 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
168 std::back_inserter(ptrBuilders),
169 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>&
b) { return b.get(); });
173 Acts::Experimental::Blueprint::Config
cfg;
174 cfg.envelope[AxisZ] = {20_mm, 20_mm};
175 cfg.envelope[AxisR] = {0_mm, 20_mm};
177 auto blueprint = std::make_unique<Acts::Experimental::Blueprint>(
cfg);
179 auto&
root = blueprint->addCylinderContainer(
"Detector", AxisZ);
181 std::shared_ptr<Acts::Experimental::BlueprintNode> currentTop{
nullptr};
183 for (
auto&
builder : ptrBuilders) {
188 root.addChild(std::move(currentTop));
194 Acts::ObjVisualization3D vis;
196 {.visible =
false}, {.visible =
true});
197 vis.write(
"blueprint_sensitive.obj");
201 {.visible =
false}, {.visible =
false});
202 vis.write(
"blueprint_volume.obj");
206 {.visible =
true}, {.visible =
false});
207 vis.write(
"blueprint_portals.obj");
212 return StatusCode::SUCCESS;
217 Acts::LayerArrayCreator::Config lacCfg;
218 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
221 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
222 auto trackingVolumeArrayCreator =
223 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
226 Acts::CylinderVolumeHelper::Config cvhConfig;
227 cvhConfig.layerArrayCreator = layerArrayCreator;
228 cvhConfig.trackingVolumeArrayCreator = trackingVolumeArrayCreator;
230 auto cylinderVolumeHelper =
231 std::make_shared<const Acts::CylinderVolumeHelper>(
234 Acts::TrackingGeometryBuilder::Config tgbConfig;
235 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
238 std::shared_ptr<const Acts::IMaterialDecorator> matDeco =
nullptr;
241 if (matFileFullPath.empty()) {
243 return StatusCode::FAILURE;
245 ATH_MSG_INFO(
"Configured to use material input: " << matFileFullPath);
247 if (matFileFullPath.find(
".json") != std::string::npos) {
249 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
251 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
254 tgbConfig.materialDecorator = matDeco;
257 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
262 tgbConfig.trackingVolumeBuilders.push_back([&](
const auto &gctx,
266 Acts::CylinderVolumeBuilder::Config bpvConfig =
269 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
272 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
279 if (buildSubdet.count(
"Pixel") > 0) {
280 tgbConfig.trackingVolumeBuilders.push_back([&](
const auto &gctx,
285 auto lb = std::make_shared<ActsLayerBuilder>(
287 Acts::CylinderVolumeBuilder::Config cvbConfig;
288 cvbConfig.layerEnvelopeR = {3_mm, 3_mm};
289 cvbConfig.layerEnvelopeZ = 1_mm;
290 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
291 cvbConfig.volumeName =
"Pixel";
292 cvbConfig.layerBuilder =
lb;
295 Acts::CylinderVolumeBuilder cvb(
298 return cvb.trackingVolume(gctx, inner);
303 if (buildSubdet.count(
"ITkPixel") > 0) {
304 tgbConfig.trackingVolumeBuilders.push_back(
305 [&](
const auto &gctx,
const auto &inner,
const auto &) {
309 cfg.doEndcapLayerMerging =
true;
313 auto lb = std::make_shared<ActsLayerBuilder>(
316 Acts::CylinderVolumeBuilder::Config cvbConfig;
317 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
318 cvbConfig.layerEnvelopeZ = 1_mm;
319 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
320 cvbConfig.volumeName =
"ITkPixelInner";
321 cvbConfig.layerBuilder =
lb;
324 Acts::CylinderVolumeBuilder cvb(
328 return cvb.trackingVolume(gctx, inner);
331 tgbConfig.trackingVolumeBuilders.push_back(
332 [&](
const auto &gctx,
const auto &inner,
const auto &) {
336 cfg.doEndcapLayerMerging =
false;
340 auto lb = std::make_shared<ActsLayerBuilder>(
343 Acts::CylinderVolumeBuilder::Config cvbConfig;
344 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
345 cvbConfig.layerEnvelopeZ = 1_mm;
346 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
347 cvbConfig.volumeName =
"ITkPixelOuter";
348 cvbConfig.layerBuilder =
lb;
349 cvbConfig.buildToRadiusZero =
false;
350 cvbConfig.checkRingLayout =
true;
351 cvbConfig.ringTolerance = 10_mm;
353 Acts::CylinderVolumeBuilder cvb(
357 return cvb.trackingVolume(gctx, inner);
362 if (buildSubdet.count(
"ITkStrip") > 0) {
363 tgbConfig.trackingVolumeBuilders.push_back(
364 [&](
const auto &gctx,
const auto &inner,
const auto &) {
371 auto lb = std::make_shared<ActsLayerBuilder>(
374 Acts::CylinderVolumeBuilder::Config cvbConfig;
375 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
376 cvbConfig.layerEnvelopeZ = 1_mm;
377 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
378 cvbConfig.volumeName =
"ITkStrip";
379 cvbConfig.layerBuilder =
lb;
380 cvbConfig.buildToRadiusZero =
383 Acts::CylinderVolumeBuilder cvb(
387 return cvb.trackingVolume(gctx, inner);
391 bool buildSCT = buildSubdet.count(
"SCT") > 0;
392 bool buildTRT = buildSubdet.count(
"TRT") > 0;
394 if (buildSCT && buildTRT) {
396 tgbConfig.trackingVolumeBuilders.push_back(
397 [&](
const auto &gctx,
const auto &inner,
const auto &) {
400 cfg.endcapEnvelopeZ = sctECEnvelopeZ;
401 auto sct_lb = std::make_shared<ActsLayerBuilder>(
407 *cylinderVolumeHelper, inner);
410 }
else if (buildSCT) {
411 tgbConfig.trackingVolumeBuilders.push_back(
412 [&](
const auto &gctx,
const auto &inner,
const auto &) {
415 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
416 auto lb = std::make_shared<ActsLayerBuilder>(
420 Acts::CylinderVolumeBuilder::Config cvbConfig;
421 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
422 cvbConfig.layerEnvelopeZ = 2_mm;
423 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
424 cvbConfig.volumeName =
"SCT";
425 cvbConfig.layerBuilder =
lb;
426 cvbConfig.buildToRadiusZero =
false;
428 Acts::CylinderVolumeBuilder cvb(
432 return cvb.trackingVolume(gctx, inner);
434 }
else if (buildTRT) {
435 tgbConfig.trackingVolumeBuilders.push_back(
436 [&](
const auto &gctx,
const auto &inner,
const auto &) {
438 Acts::CylinderVolumeBuilder::Config cvbConfig;
439 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
440 cvbConfig.layerEnvelopeZ = 2_mm;
441 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
442 cvbConfig.volumeName =
"TRT";
443 cvbConfig.layerBuilder =
lb;
444 cvbConfig.buildToRadiusZero =
false;
446 Acts::CylinderVolumeBuilder cvb(
450 return cvb.trackingVolume(gctx, inner);
455 if(buildSubdet.count(
"HGTD") > 0) {
456 tgbConfig.trackingVolumeBuilders.push_back(
457 [&](
const auto &gctx,
const auto &inner,
const auto &) {
459 Acts::CylinderVolumeBuilder::Config cvbConfig;
460 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
461 cvbConfig.layerEnvelopeZ = 1_mm;
462 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
463 cvbConfig.volumeName =
"HGTD";
464 cvbConfig.layerBuilder =
lb;
465 cvbConfig.buildToRadiusZero =
false;
467 Acts::CylinderVolumeBuilder cvb(
471 return cvb.trackingVolume(gctx, inner);
477 tgbConfig.trackingVolumeBuilders.push_back(
478 [&](
const auto &gctx,
const auto &inner,
const auto &) {
484 tgbConfig.trackingVolumeBuilders.push_back(
485 [&](
const auto &gctx,
const auto &inner,
const auto &) {
490 ATH_MSG_ERROR(
"Encountered error when building Acts tracking geometry");
492 return StatusCode::FAILURE;
495 auto trackingGeometryBuilder =
496 std::make_shared<const Acts::TrackingGeometryBuilder>(
505 ATH_MSG_ERROR(
"No ACTS tracking geometry was built. Cannot proceeed");
506 return StatusCode::FAILURE;
511 ATH_MSG_INFO(
"Running extra consistency check! (this is SLOW)");
513 ATH_MSG_ERROR(
"Consistency check has failed! Geometry is not consistent");
514 return StatusCode::FAILURE;
518 ATH_MSG_INFO(
"Acts TrackingGeometry construction completed");
520 return StatusCode::SUCCESS;