10 #include <GeoModelKernel/GeoTube.h>
11 #include <GeoModelKernel/GeoVPhysVol.h>
16 #include <Acts/Definitions/Units.hpp>
17 #include <Acts/Geometry/Blueprint.hpp>
18 #include <Acts/Geometry/BlueprintNode.hpp>
19 #include <Acts/Geometry/ContainerBlueprintNode.hpp>
20 #include <Acts/Geometry/CylinderVolumeBounds.hpp>
21 #include <Acts/Geometry/Extent.hpp>
22 #include <Acts/Geometry/GeometryIdentifierBlueprintNode.hpp>
23 #include <Acts/Geometry/LayerBlueprintNode.hpp>
24 #include <Acts/Geometry/MaterialDesignatorBlueprintNode.hpp>
25 #include <Acts/Geometry/ProtoLayer.hpp>
26 #include <Acts/Geometry/VolumeAttachmentStrategy.hpp>
27 #include "Acts/Geometry/VolumeResizeStrategy.hpp"
28 #include "Acts/Material/HomogeneousSurfaceMaterial.hpp"
29 #include <Acts/Navigation/SurfaceArrayNavigationPolicy.hpp>
30 #include <Acts/Surfaces/SurfaceArray.hpp>
31 #include <Acts/Navigation/TryAllNavigationPolicy.hpp>
32 #include <Acts/Utilities/AxisDefinitions.hpp>
48 using namespace Acts::UnitLiterals;
53 constexpr std::size_t s_stripVolumeId = 20;
54 constexpr std::size_t s_innerPixelVolumeId = 5;
55 constexpr std::size_t s_outerPixelVolumeId = 10;
56 constexpr std::size_t s_beamPipeVolumeId = 1;
58 using enum Acts::CylinderVolumeBounds::Face;
59 using enum Acts::AxisDirection;
60 using enum Acts::AxisBoundaryType;
62 using AttachmentStrategy = Acts::VolumeAttachmentStrategy;
63 using ResizeStrategy = Acts::VolumeResizeStrategy;
66 std::vector<const Acts::Surface*> makeConstPtrVector(
67 const std::vector<std::shared_ptr<Acts::Surface>>& surfs) {
68 std::vector<const Acts::Surface*> constPtrs;
69 constPtrs.reserve(surfs.size());
70 for (
const auto& surf : surfs) {
71 constPtrs.push_back(surf.get());
78 Acts::ProtoLayer protoLayer;
79 std::vector<std::shared_ptr<Acts::Surface>> surfaces;
81 LayerData(
const Acts::GeometryContext& gctx,
82 std::vector<std::shared_ptr<Acts::Surface>> surfs)
83 : protoLayer(gctx, makeConstPtrVector(surfs)),
84 surfaces(std::move(surfs)) {}
88 std::vector<LayerData> mergeLayers(
const Acts::GeometryContext& gctx,
89 std::vector<LayerData>
layers) {
90 using enum Acts::AxisDirection;
92 std::vector<LayerData> mergedLayers;
97 mergedLayers.push_back(std::move(
layers.front()));
99 for (
size_t i = 1;
i <
layers.size();
i++) {
101 auto& prev = mergedLayers.back();
105 (
current.protoLayer.min(AxisZ) <= prev.protoLayer.max(AxisZ) &&
106 current.protoLayer.max(AxisZ) >= prev.protoLayer.min(AxisZ));
110 std::vector<std::shared_ptr<Acts::Surface>> mergedSurfaces;
111 mergedSurfaces.reserve(
current.surfaces.size() + prev.surfaces.size());
112 mergedSurfaces.insert(mergedSurfaces.end(),
current.surfaces.begin(),
114 mergedSurfaces.insert(mergedSurfaces.end(), prev.surfaces.begin(),
115 prev.surfaces.end());
117 mergedLayers.pop_back();
118 mergedLayers.emplace_back(gctx, std::move(mergedSurfaces));
119 auto& merged = mergedLayers.back();
120 merged.protoLayer.envelope[AxisR] =
current.protoLayer.envelope[AxisR];
121 merged.protoLayer.envelope[AxisZ] =
current.protoLayer.envelope[AxisZ];
123 mergedLayers.push_back(std::move(
current));
131 void addStripBarrelLayer(
132 Acts::Experimental::BlueprintNode&
parent, std::size_t ilayer,
133 const std::vector<std::shared_ptr<Acts::Surface>>& surfaces) {
135 using enum Acts::CylinderVolumeBounds::Face;
136 using enum Acts::AxisDirection;
137 using enum Acts::AxisBoundaryType;
139 auto addLayer = [ilayer, &surfaces](
auto&
node) {
141 layer.setNavigationPolicyFactory(
142 Acts::NavigationPolicyFactory{}
143 .add<Acts::SurfaceArrayNavigationPolicy>(
144 Acts::SurfaceArrayNavigationPolicy::Config{
145 .layerType =
Cylinder, .bins = {30, 10}})
146 .add<Acts::TryAllNavigationPolicy>(
147 Acts::TryAllNavigationPolicy::Config{.sensitives =
false})
150 layer.setSurfaces(surfaces);
151 layer.setEnvelope(Acts::ExtentEnvelope{{
161 [&addLayer](
auto& lmat) {
162 lmat.configureFace(OuterCylinder,
163 {AxisRPhi, Bound, 20},
172 void addStripEndcapLayer(
173 Acts::Experimental::BlueprintNode&
parent,
int bec,
const std::string&
name,
174 const std::vector<std::shared_ptr<Acts::Surface>>& surfaces) {
176 using enum Acts::CylinderVolumeBounds::Face;
177 using enum Acts::AxisDirection;
178 using enum Acts::AxisBoundaryType;
181 mat.configureFace(
bec < 0 ? NegativeDisc : PositiveDisc, {AxisR, Bound, 20},
182 {AxisPhi, Bound, 40});
185 layer.setNavigationPolicyFactory(
186 Acts::NavigationPolicyFactory{}
187 .add<Acts::SurfaceArrayNavigationPolicy>(
188 Acts::SurfaceArrayNavigationPolicy::Config{.layerType =
Disc,
190 .add<Acts::TryAllNavigationPolicy>(
191 Acts::TryAllNavigationPolicy::Config{.sensitives =
false})
194 layer.setSurfaces(surfaces);
195 layer.setEnvelope(Acts::ExtentEnvelope{{
196 .z = {0.1_mm, 0.1_mm},
209 if(m_buildBeamPipe) {
212 m_elementStore = std::make_shared<ActsElementVector>();
213 return StatusCode::SUCCESS;
217 std::shared_ptr<Acts::Experimental::BlueprintNode> ItkBlueprintNodeBuilder::buildBlueprintNode(
218 const Acts::GeometryContext& gctx, std::shared_ptr<Acts::Experimental::BlueprintNode>&& childNode) {
221 ATH_MSG_ERROR(
"Child node for the Itk should be null - no child expected");
222 throw std::runtime_error(
"Child node is not null");
226 auto itkNode = std::make_shared<Acts::Experimental::CylinderContainerBlueprintNode>(
"ItkNode", AxisR);
229 buildItkPixelBlueprintNode(gctx, *itkNode);
232 buildItkStripBlueprintNode(gctx, *itkNode);
235 if(m_buildBeamPipe) {
237 buildBeamPipeBlueprintNode(gctx, *itkNode);
245 void ItkBlueprintNodeBuilder::buildItkPixelBlueprintNode(
246 const Acts::GeometryContext& gctx, Acts::Experimental::BlueprintNode&
node) {
249 if (!m_itkPixelMgr) {
251 throw std::runtime_error(
"ITkPixel manager not available");
255 << m_itkPixelMgr->getDetectorElementCollection()->size()
258 std::vector<std::shared_ptr<ActsDetectorElement>> elements;
261 for (
const auto* element :
262 *m_itkPixelMgr->getDetectorElementCollection()) {
265 if (siDetElement ==
nullptr) {
267 throw std::runtime_error{
"Corrupt detector element collection"};
269 elements.push_back(std::make_shared<ActsDetectorElement>(*siDetElement));
274 m_elementStore->vector().insert(m_elementStore->vector().end(),
275 elements.begin(), elements.end());
278 node.addMaterial(
"InnerPixelMaterial", [&](
auto&
mat) {
279 mat.configureFace(OuterCylinder, {AxisRPhi, Bound, 20}, {AxisZ, Bound, 20});
281 auto& innerPixelContainer =
mat.addCylinderContainer(
"InnerPixel", AxisZ);
284 auto& barrelGeoId = innerPixelContainer.withGeometryIdentifier();
285 barrelGeoId.setAllVolumeIdsTo(s_innerPixelVolumeId)
286 .incrementLayerIds(1)
287 .sortBy([](
auto&
a,
auto&
b) {
289 dynamic_cast<const Acts::CylinderVolumeBounds&
>(
a.volumeBounds());
291 dynamic_cast<const Acts::CylinderVolumeBounds&
>(
b.volumeBounds());
293 using enum Acts::CylinderVolumeBounds::BoundValues;
294 double aMidR = (boundsA.get(eMinR) + boundsA.get(eMaxR)) / 2.0;
295 double bMidR = (boundsB.get(eMinR) + boundsB.get(eMaxR)) / 2.0;
297 return aMidR < bMidR;
300 auto& barrel = barrelGeoId.addCylinderContainer(
"InnerPixel_Brl", AxisR);
301 barrel.setAttachmentStrategy(AttachmentStrategy::Gap);
302 barrel.setResizeStrategy(ResizeStrategy::Gap);
304 std::map<int, std::vector<std::shared_ptr<Acts::Surface>>>
layers{};
306 for (
auto& element : elements) {
312 if (
id.layer_disk() >= 2) {
317 layers[elementLayer].push_back(element->surface().getSharedPtr());
322 for (
const auto& [ilayer, surfaces] :
layers) {
323 ATH_MSG_DEBUG(
"- Layer " << ilayer <<
" has " << surfaces.size()
327 std::format(
"InnerPixel_Brl_{}_Material", ilayer), [&](
auto& lmat) {
329 lmat.configureFace(OuterCylinder, {AxisRPhi, Bound, 40},
334 lmat.addLayer(
std::format(
"InnerPixel_Brl_{}", ilayer));
337 layer.setNavigationPolicyFactory(
338 Acts::NavigationPolicyFactory{}
339 .add<Acts::SurfaceArrayNavigationPolicy>(
340 Acts::SurfaceArrayNavigationPolicy::Config{
341 .layerType = Cylinder,
343 .add<Acts::TryAllNavigationPolicy>(
344 Acts::TryAllNavigationPolicy::Config{.sensitives =
348 layer.setSurfaces(surfaces);
349 layer.setEnvelope(Acts::ExtentEnvelope{{
357 for (
int bec : {-2, 2}) {
358 std::string
s =
bec > 0 ?
"p" :
"n";
359 auto& ecGeoId = innerPixelContainer.withGeometryIdentifier();
360 ecGeoId.setAllVolumeIdsTo(s_innerPixelVolumeId + std::floor(
bec / 2))
361 .incrementLayerIds(1);
362 auto& ec = ecGeoId.addCylinderContainer(
"InnerPixel_" +
s +
"EC", AxisZ);
363 ec.setAttachmentStrategy(AttachmentStrategy::Gap);
364 ec.setResizeStrategy(ResizeStrategy::Expand);
366 std::map<std::tuple<int, int, int>,
367 std::vector<std::shared_ptr<Acts::Surface>>>
370 for (
auto& element : elements) {
372 if (
id.
bec() *
bec <= 0) {
376 if (
id.layer_disk() >= 3) {
380 std::tuple<int, int, int>
key{
id.bec(),
id.layer_disk(),
382 initialLayers[
key].push_back(element->surface().getSharedPtr());
386 <<
" initial layers to InnerPixel " <<
s <<
"EC");
389 std::vector<LayerData> protoLayers;
390 protoLayers.reserve(initialLayers.size());
392 for (
const auto& [
key, surfaces] : initialLayers) {
393 auto&
layer = protoLayers.emplace_back(gctx, surfaces);
394 layer.protoLayer.envelope[AxisR] = {2_mm, 2_mm};
395 layer.protoLayer.envelope[AxisZ] = {1_mm, 1_mm};
399 std::ranges::sort(protoLayers,
400 [](
const LayerData&
a,
const LayerData&
b) {
401 return std::abs(
a.protoLayer.medium(AxisZ)) <
402 std::abs(
b.protoLayer.medium(AxisZ));
405 ATH_MSG_DEBUG(
"Found " << protoLayers.size() <<
" initial layers");
408 std::vector<LayerData> mergedLayers;
409 if (m_doEndcapLayerMerging) {
410 mergedLayers = mergeLayers(gctx, std::move(protoLayers));
412 mergedLayers = std::move(protoLayers);
415 ATH_MSG_DEBUG(
"After merging: " << mergedLayers.size() <<
" layers");
418 for (
const auto [
key, pl] : Acts::enumerate(mergedLayers)) {
422 pl.protoLayer.medium(AxisZ);
425 auto addLayer = [&layerName, &pl](
auto&
parent) {
430 layer.setNavigationPolicyFactory(
431 Acts::NavigationPolicyFactory{}
432 .add<Acts::SurfaceArrayNavigationPolicy>(
433 Acts::SurfaceArrayNavigationPolicy::Config{
436 .add<Acts::TryAllNavigationPolicy>(
437 Acts::TryAllNavigationPolicy::Config{.sensitives =
false})
440 layer.setSurfaces(pl.surfaces);
441 layer.setEnvelope(Acts::ExtentEnvelope{{
448 <<
key <<
" / " << mergedLayers.size()
449 <<
" at z = " << pl.protoLayer.medium(AxisZ));
450 if (
key < mergedLayers.size() - 1) {
453 ec.addMaterial(layerName +
"_Material", [&](
auto& lmat) {
455 lmat.configureFace(
bec < 0 ? NegativeDisc : PositiveDisc,
456 {AxisR, Bound, 40}, {AxisPhi, Bound, 40});
467 node.addMaterial(
"OuterPixelMaterial", [&](
auto&
mat) {
468 mat.configureFace(OuterCylinder, {AxisRPhi, Bound, 20}, {AxisZ, Bound, 20});
470 auto& outerPixelContainer =
mat.addCylinderContainer(
"OuterPixel", AxisZ);
473 auto& barrelGeoId = outerPixelContainer.withGeometryIdentifier();
474 barrelGeoId.setAllVolumeIdsTo(s_outerPixelVolumeId).incrementLayerIds(1);
476 auto& barrel = barrelGeoId.addCylinderContainer(
"OuterPixel_Brl", AxisR);
477 barrel.setAttachmentStrategy(AttachmentStrategy::Gap);
478 barrel.setResizeStrategy(ResizeStrategy::Gap);
480 std::map<int, std::vector<std::shared_ptr<Acts::Surface>>>
layers{};
482 for (
auto& element : elements) {
488 if (
id.layer_disk() <= 1) {
493 layers[elementLayer].push_back(element->surface().getSharedPtr());
498 for (
const auto& [ilayer, surfaces] :
layers) {
499 ATH_MSG_DEBUG(
"- Layer " << ilayer <<
" has " << surfaces.size()
503 std::format(
"OuterPixel_Brl_{}_Material", ilayer), [&](
auto& lmat) {
505 lmat.configureFace(OuterCylinder, {AxisRPhi, Bound, 40},
513 layer.setNavigationPolicyFactory(
514 Acts::NavigationPolicyFactory{}
515 .add<Acts::SurfaceArrayNavigationPolicy>(
516 Acts::SurfaceArrayNavigationPolicy::Config{
517 .layerType = Cylinder,
519 .add<Acts::TryAllNavigationPolicy>(
520 Acts::TryAllNavigationPolicy::Config{.sensitives =
524 layer.setSurfaces(surfaces);
525 layer.setEnvelope(Acts::ExtentEnvelope{{
532 constexpr
static auto addEndcapLayer = [](
auto&
parent,
const auto&
name,
533 const auto& surfaces) {
535 layer.setNavigationPolicyFactory(
536 Acts::NavigationPolicyFactory{}
537 .add<Acts::SurfaceArrayNavigationPolicy>(
538 Acts::SurfaceArrayNavigationPolicy::Config{
539 .layerType = Disc, .bins = {30, 30}})
540 .add<Acts::TryAllNavigationPolicy>(
541 Acts::TryAllNavigationPolicy::Config{.sensitives =
false})
544 layer.setSurfaces(surfaces);
549 for (
int bec : {-2, 2}) {
550 const std::string
s =
bec > 0 ?
"p" :
"n";
554 auto& ec_outer_geoId = outerPixelContainer.withGeometryIdentifier();
556 .setAllVolumeIdsTo(s_outerPixelVolumeId + std::floor(
bec / 2))
557 .incrementLayerIds(1);
560 ec_outer_geoId.addCylinderContainer(
"OuterPixel_" +
s +
"EC", AxisR);
563 std::array diskGroups{std::pair{3, 4}, std::pair{6, 5}, std::pair{7, 8}};
565 for (
size_t idx = 0;
idx < diskGroups.size(); ++
idx) {
566 auto [disk1, disk2] = diskGroups[
idx];
568 auto& ec_stack = ec_outer.addCylinderContainer(
571 ec_stack.setAttachmentStrategy(AttachmentStrategy::Gap);
572 ec_stack.setResizeStrategy(ResizeStrategy::Expand);
575 std::map<std::tuple<int, int>,
576 std::vector<std::shared_ptr<Acts::Surface>>>
579 for (
auto& element : elements) {
582 (
id.layer_disk() != disk1 &&
id.layer_disk() != disk2)) {
585 std::tuple<int, int>
key{
id.layer_disk(),
id.eta_module()};
586 eta_rings[
key].push_back(element->surface().getSharedPtr());
589 ATH_MSG_DEBUG(
"Found " << eta_rings.size() <<
" eta rings in group "
593 std::vector<std::vector<std::shared_ptr<Acts::Surface>>> sorted_rings;
594 sorted_rings.reserve(eta_rings.size());
595 for (
const auto& [
key, surfaces] : eta_rings) {
596 sorted_rings.push_back(surfaces);
599 std::ranges::sort(sorted_rings, [&gctx](
const auto&
a,
const auto&
b) {
600 Acts::ProtoLayer pl_a(gctx, makeConstPtrVector(
a));
601 Acts::ProtoLayer pl_b(gctx, makeConstPtrVector(
b));
602 return std::abs(pl_a.min(AxisZ)) < std::abs(pl_b.min(AxisZ));
606 for (
size_t i = 0;
i < sorted_rings.size(); ++
i) {
607 const auto& surfaces = sorted_rings[
i];
611 if (
i < sorted_rings.size() - 1) {
612 ec_stack.addMaterial(layerName +
"_Material", [&](
auto&
mat) {
613 mat.configureFace(
bec > 0 ? PositiveDisc : NegativeDisc,
614 {AxisR, Bound, 20}, {AxisPhi, Bound, 40});
615 addEndcapLayer(
mat, layerName, surfaces);
618 addEndcapLayer(ec_stack, layerName, surfaces);
627 void ItkBlueprintNodeBuilder::buildItkStripBlueprintNode(
const Acts::GeometryContext& gctx,
628 Acts::Experimental::BlueprintNode&
node) {
631 if (!m_itkStripMgr) {
633 throw std::runtime_error(
"ITkStrip manager not available");
637 << m_itkStripMgr->getDetectorElementCollection()->size()
640 std::vector<std::shared_ptr<ActsDetectorElement>> elements;
643 for (
const auto* element :
644 *m_itkStripMgr->getDetectorElementCollection()) {
647 if (siDetElement ==
nullptr) {
649 throw std::runtime_error{
"Corrupt detector element collection"};
651 elements.push_back(std::make_shared<ActsDetectorElement>(*siDetElement));
656 m_elementStore->vector().insert(m_elementStore->vector().end(),
657 elements.begin(), elements.end());
660 node.addMaterial(
"StripMaterial", [&](
auto&
mat) {
661 mat.configureFace(OuterCylinder, {AxisRPhi, Bound, 20}, {AxisZ, Bound, 20});
663 mat.addCylinderContainer(
"Strip", AxisZ, [&](
auto& strips) {
665 strips.withGeometryIdentifier([
this, &elements](
auto& geoId) {
666 geoId.setAllVolumeIdsTo(s_stripVolumeId).incrementLayerIds(1);
668 geoId.addCylinderContainer(
669 "Strip_Brl", AxisR, [
this, &elements](
auto& barrel) {
670 barrel.setAttachmentStrategy(AttachmentStrategy::Gap);
671 barrel.setResizeStrategy(ResizeStrategy::Gap);
673 std::map<int, std::vector<std::shared_ptr<Acts::Surface>>>
676 for (
auto& element : elements) {
683 layers[elementLayer].push_back(
684 element->surface().getSharedPtr());
688 <<
" layers to Strip barrel");
690 for (
const auto& [ilayer, surfaces] :
layers) {
691 ATH_MSG_DEBUG(
"- Layer " << ilayer <<
" has " << surfaces.size()
693 addStripBarrelLayer(barrel, ilayer, surfaces);
699 for (
int bec : {-2, 2}) {
700 const std::string
s =
bec > 0 ?
"p" :
"n";
702 std::map<int, std::vector<std::shared_ptr<Acts::Surface>>>
layers{};
704 for (
auto& element : elements) {
706 if (
id.
bec() *
bec <= 0) {
710 layers[
id.layer_disk()].push_back(element->surface().getSharedPtr());
717 std::vector<std::vector<std::shared_ptr<Acts::Surface>>> sorted_layers;
718 sorted_layers.reserve(
layers.size());
719 for (
const auto& [
key, surfaces] :
layers) {
720 sorted_layers.push_back(surfaces);
723 std::sort(sorted_layers.begin(), sorted_layers.end(),
724 [&gctx](
const auto&
a,
const auto&
b) {
725 Acts::ProtoLayer pl_a(gctx, makeConstPtrVector(a));
726 Acts::ProtoLayer pl_b(gctx, makeConstPtrVector(b));
727 return std::abs(pl_a.min(AxisZ)) <
728 std::abs(pl_b.min(AxisZ));
731 strips.withGeometryIdentifier([&sorted_layers,
bec, &
s](
auto& geoId) {
732 geoId.setAllVolumeIdsTo(s_stripVolumeId + std::floor(
bec / 2))
733 .incrementLayerIds(1);
735 geoId.addCylinderContainer(
736 "Strip_" +
s +
"EC", AxisZ, [&sorted_layers,
bec, &
s](
auto& ec) {
737 ec.setAttachmentStrategy(AttachmentStrategy::Gap);
738 ec.setResizeStrategy(ResizeStrategy::Gap);
741 for (
size_t i = 0;
i < sorted_layers.size(); ++
i) {
742 const auto& surfaces = sorted_layers[
i];
745 addStripEndcapLayer(ec,
bec, layerName, surfaces);
755 void ItkBlueprintNodeBuilder::buildBeamPipeBlueprintNode(
const Acts::GeometryContext& ,
756 Acts::Experimental::BlueprintNode&
node) {
760 PVConstLink beamPipeTopVolume = m_beamPipeMgr->getTreeTop(0);
761 if (m_beamPipeMgr->getNumTreeTops() == 1) {
763 m_beamPipeMgr->getTreeTop(0)->getChildVol(0)->getChildVol(0);
769 double beamPipeRadius = 20;
771 const GeoLogVol* beamPipeLogVolume = beamPipeTopVolume->getLogVol();
773 if (beamPipeLogVolume ==
nullptr) {
775 throw std::runtime_error(
"Beam pipe volume has no log volume");
779 const GeoTube* beamPipeTube =
780 dynamic_cast<const GeoTube*
>(beamPipeLogVolume->getShape());
781 if (beamPipeTube ==
nullptr) {
783 throw std::runtime_error{
"BeamPipeLogVolume was not of type GeoTube"};
787 for (
unsigned int i = 0;
i < beamPipeTopVolume->getNChildVols();
i++) {
788 auto childName = beamPipeTopVolume->getNameOfChildVol(
i);
789 if (childName !=
"SectionC03") {
792 PVConstLink childTopVolume = beamPipeTopVolume->getChildVol(
i);
793 const GeoLogVol* childLogVolume = childTopVolume->getLogVol();
794 const GeoTube* childTube =
795 dynamic_cast<const GeoTube*
>(childLogVolume->getShape());
797 beamPipeRadius = 0.5 * (childTube->getRMax() + childTube->getRMin());
805 "BeamPipe constructed from Database: translation (yes) - radius "
806 << (beamPipeTube ?
"(yes)" :
"(no)") <<
" - r = " << beamPipeRadius);
809 << beamPipeTransform.translation().transpose());
812 node.withGeometryIdentifier([&](
auto& geoId) {
813 geoId.setAllVolumeIdsTo(s_beamPipeVolumeId);
815 geoId.addMaterial(
"BeamPipe_Material", [&](
auto&
mat) {
816 mat.configureFace(OuterCylinder, {AxisRPhi, Bound, 20},
820 mat.addStaticVolume(beamPipeTransform,
821 std::make_shared<Acts::CylinderVolumeBounds>(
822 0, beamPipeRadius * 1_mm, 3 * 1_m),