85 return StatusCode::FAILURE;
93 m_autoRetrieveTools =
false;
94 m_checkToolDeps =
false;
97 << Acts::VersionMajor <<
"." << Acts::VersionMinor <<
"."
98 << Acts::VersionPatch <<
" [" << Acts::CommitHash.value_or(
"unknown hash") <<
"]");
103 ATH_MSG_INFO(
"Configured to build " << buildSubdet.size()
104 <<
" subdetectors:");
105 for (
const auto &
s : buildSubdet) {
110 if (buildSubdet.find(
"Pixel") != buildSubdet.end()) {
113 if (buildSubdet.find(
"SCT") != buildSubdet.end()) {
116 if (buildSubdet.find(
"TRT") != buildSubdet.end()) {
120 if (buildSubdet.find(
"ITkPixel") != buildSubdet.end()) {
123 if (buildSubdet.find(
"ITkStrip") != buildSubdet.end()) {
126 if (buildSubdet.find(
"HGTD") != buildSubdet.end()) {
138 ATH_MSG_FATAL(
"Consistency check for ITk inner pixel barrel passive layer construction failed. Please check your inputs! ");
139 return StatusCode::FAILURE;
144 ATH_MSG_FATAL(
"Consistency check for ITk outer pixel barrel passive layer construction failed. Please check your inputs! ");
145 return StatusCode::FAILURE;
150 ATH_MSG_FATAL(
"Consistency check for ITk strip barrel passive layer construction failed. Please check your inputs! ");
151 return StatusCode::FAILURE;
157 ATH_MSG_INFO(
"Using Blueprint API for geometry construction");
163 using enum Acts::AxisDirection;
165 std::vector<ActsTrk::IBlueprintNodeBuilder*> ptrBuilders;
167 std::back_inserter(ptrBuilders),
168 [](ToolHandle<ActsTrk::IBlueprintNodeBuilder>&
b) { return b.get(); });
172 Acts::Experimental::Blueprint::Config
cfg;
173 cfg.envelope[AxisZ] = {20_mm, 20_mm};
174 cfg.envelope[AxisR] = {0_mm, 20_mm};
176 auto blueprint = std::make_unique<Acts::Experimental::Blueprint>(
cfg);
178 auto&
root = blueprint->addCylinderContainer(
"Detector", AxisZ);
180 std::shared_ptr<Acts::Experimental::BlueprintNode> currentTop{
nullptr};
182 for (
auto&
builder : ptrBuilders) {
187 root.addChild(std::move(currentTop));
193 Acts::ObjVisualization3D vis;
195 {.visible =
false}, {.visible =
true});
196 vis.write(
"blueprint_sensitive.obj");
200 {.visible =
false}, {.visible =
false});
201 vis.write(
"blueprint_volume.obj");
205 {.visible =
true}, {.visible =
false});
206 vis.write(
"blueprint_portals.obj");
213 ATH_MSG_INFO(
"Built tracking geometry \n"<<printer.stream().str());
216 return StatusCode::SUCCESS;
221 Acts::LayerArrayCreator::Config lacCfg;
222 auto layerArrayCreator = std::make_shared<const Acts::LayerArrayCreator>(
225 Acts::TrackingVolumeArrayCreator::Config tvcCfg;
226 auto trackingVolumeArrayCreator =
227 std::make_shared<const Acts::TrackingVolumeArrayCreator>(
230 Acts::CylinderVolumeHelper::Config cvhConfig;
231 cvhConfig.layerArrayCreator = layerArrayCreator;
232 cvhConfig.trackingVolumeArrayCreator = trackingVolumeArrayCreator;
234 auto cylinderVolumeHelper =
235 std::make_shared<const Acts::CylinderVolumeHelper>(
238 Acts::TrackingGeometryBuilder::Config tgbConfig;
239 tgbConfig.trackingVolumeHelper = cylinderVolumeHelper;
242 std::shared_ptr<const Acts::IMaterialDecorator> matDeco =
nullptr;
245 if (matFileFullPath.empty()) {
247 return StatusCode::FAILURE;
249 ATH_MSG_INFO(
"Configured to use material input: " << matFileFullPath);
251 if (matFileFullPath.find(
".json") != std::string::npos) {
253 Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig;
255 matDeco = std::make_shared<const Acts::JsonMaterialDecorator>(
258 tgbConfig.materialDecorator = matDeco;
261 std::array<double, 2> sctECEnvelopeZ{20_mm, 20_mm};
266 tgbConfig.trackingVolumeBuilders.push_back([&](
const auto &gctx,
270 Acts::CylinderVolumeBuilder::Config bpvConfig =
273 Acts::CylinderVolumeBuilder beamPipeVolumeBuilder {
276 return beamPipeVolumeBuilder.trackingVolume(gctx, inner);
283 if (buildSubdet.count(
"Pixel") > 0) {
284 tgbConfig.trackingVolumeBuilders.push_back([&](
const auto &gctx,
289 auto lb = std::make_shared<ActsLayerBuilder>(
291 Acts::CylinderVolumeBuilder::Config cvbConfig;
292 cvbConfig.layerEnvelopeR = {3_mm, 3_mm};
293 cvbConfig.layerEnvelopeZ = 1_mm;
294 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
295 cvbConfig.volumeName =
"Pixel";
296 cvbConfig.layerBuilder =
lb;
299 Acts::CylinderVolumeBuilder cvb(
302 return cvb.trackingVolume(gctx, inner);
307 if (buildSubdet.count(
"ITkPixel") > 0) {
308 tgbConfig.trackingVolumeBuilders.push_back(
309 [&](
const auto &gctx,
const auto &inner,
const auto &) {
313 cfg.doEndcapLayerMerging =
true;
317 auto lb = std::make_shared<ActsLayerBuilder>(
320 Acts::CylinderVolumeBuilder::Config cvbConfig;
321 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
322 cvbConfig.layerEnvelopeZ = 1_mm;
323 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
324 cvbConfig.volumeName =
"ITkPixelInner";
325 cvbConfig.layerBuilder =
lb;
328 Acts::CylinderVolumeBuilder cvb(
332 return cvb.trackingVolume(gctx, inner);
335 tgbConfig.trackingVolumeBuilders.push_back(
336 [&](
const auto &gctx,
const auto &inner,
const auto &) {
340 cfg.doEndcapLayerMerging =
false;
344 auto lb = std::make_shared<ActsLayerBuilder>(
347 Acts::CylinderVolumeBuilder::Config cvbConfig;
348 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
349 cvbConfig.layerEnvelopeZ = 1_mm;
350 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
351 cvbConfig.volumeName =
"ITkPixelOuter";
352 cvbConfig.layerBuilder =
lb;
353 cvbConfig.buildToRadiusZero =
false;
354 cvbConfig.checkRingLayout =
true;
355 cvbConfig.ringTolerance = 10_mm;
357 Acts::CylinderVolumeBuilder cvb(
361 return cvb.trackingVolume(gctx, inner);
366 if (buildSubdet.count(
"ITkStrip") > 0) {
367 tgbConfig.trackingVolumeBuilders.push_back(
368 [&](
const auto &gctx,
const auto &inner,
const auto &) {
375 auto lb = std::make_shared<ActsLayerBuilder>(
378 Acts::CylinderVolumeBuilder::Config cvbConfig;
379 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
380 cvbConfig.layerEnvelopeZ = 1_mm;
381 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
382 cvbConfig.volumeName =
"ITkStrip";
383 cvbConfig.layerBuilder =
lb;
384 cvbConfig.buildToRadiusZero =
387 Acts::CylinderVolumeBuilder cvb(
391 return cvb.trackingVolume(gctx, inner);
395 bool buildSCT = buildSubdet.count(
"SCT") > 0;
396 bool buildTRT = buildSubdet.count(
"TRT") > 0;
398 if (buildSCT && buildTRT) {
400 tgbConfig.trackingVolumeBuilders.push_back(
401 [&](
const auto &gctx,
const auto &inner,
const auto &) {
404 cfg.endcapEnvelopeZ = sctECEnvelopeZ;
405 auto sct_lb = std::make_shared<ActsLayerBuilder>(
411 *cylinderVolumeHelper, inner);
414 }
else if (buildSCT) {
415 tgbConfig.trackingVolumeBuilders.push_back(
416 [&](
const auto &gctx,
const auto &inner,
const auto &) {
419 lbCfg.endcapEnvelopeZ = sctECEnvelopeZ;
420 auto lb = std::make_shared<ActsLayerBuilder>(
424 Acts::CylinderVolumeBuilder::Config cvbConfig;
425 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
426 cvbConfig.layerEnvelopeZ = 2_mm;
427 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
428 cvbConfig.volumeName =
"SCT";
429 cvbConfig.layerBuilder =
lb;
430 cvbConfig.buildToRadiusZero =
false;
432 Acts::CylinderVolumeBuilder cvb(
436 return cvb.trackingVolume(gctx, inner);
438 }
else if (buildTRT) {
439 tgbConfig.trackingVolumeBuilders.push_back(
440 [&](
const auto &gctx,
const auto &inner,
const auto &) {
442 Acts::CylinderVolumeBuilder::Config cvbConfig;
443 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
444 cvbConfig.layerEnvelopeZ = 2_mm;
445 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
446 cvbConfig.volumeName =
"TRT";
447 cvbConfig.layerBuilder =
lb;
448 cvbConfig.buildToRadiusZero =
false;
450 Acts::CylinderVolumeBuilder cvb(
454 return cvb.trackingVolume(gctx, inner);
459 if(buildSubdet.count(
"HGTD") > 0) {
460 tgbConfig.trackingVolumeBuilders.push_back(
461 [&](
const auto &gctx,
const auto &inner,
const auto &) {
463 Acts::CylinderVolumeBuilder::Config cvbConfig;
464 cvbConfig.layerEnvelopeR = {5_mm, 5_mm};
465 cvbConfig.layerEnvelopeZ = 1_mm;
466 cvbConfig.trackingVolumeHelper = cylinderVolumeHelper;
467 cvbConfig.volumeName =
"HGTD";
468 cvbConfig.layerBuilder =
lb;
469 cvbConfig.buildToRadiusZero =
false;
471 Acts::CylinderVolumeBuilder cvb(
475 return cvb.trackingVolume(gctx, inner);
481 tgbConfig.trackingVolumeBuilders.push_back(
482 [&](
const auto &gctx,
const auto &inner,
const auto &) {
488 ATH_MSG_ERROR(
"Encountered error when building Acts tracking geometry");
490 return StatusCode::FAILURE;
493 auto trackingGeometryBuilder =
494 std::make_shared<const Acts::TrackingGeometryBuilder>(
503 ATH_MSG_ERROR(
"No ACTS tracking geometry was built. Cannot proceeed");
504 return StatusCode::FAILURE;
509 ATH_MSG_INFO(
"Running extra consistency check! (this is SLOW)");
511 ATH_MSG_ERROR(
"Consistency check has failed! Geometry is not consistent");
512 return StatusCode::FAILURE;
516 ATH_MSG_INFO(
"Acts TrackingGeometry construction completed");
518 return StatusCode::SUCCESS;