73 const Acts::GeometryContext& gctx,
74 std::shared_ptr<Acts::Experimental::BlueprintNode>&& child) {
76 ExtentEnvelope envelope = ExtentEnvelope{{
80 auto itkHgtdPad = std::make_shared<Acts::Experimental::PadBlueprintNode>(
81 "itkHgtdPad", envelope);
84 std::make_shared<Acts::Experimental::CylinderContainerBlueprintNode>(
88 itkHgtdNode->addChild(std::move(child));
92 itkHgtdPad->addChild(itkHgtdNode);
97 const Acts::GeometryContext& ,
98 Acts::Experimental::BlueprintNode&
node) {
101 throw std::runtime_error(
"HGTD manager not available");
105 <<
m_hgtdMgr->getDetectorElementCollection()->size()
108 std::vector<std::shared_ptr<ActsDetectorElement>> elements;
110 for (
const auto* element : *
m_hgtdMgr->getDetectorElementCollection()) {
113 if (hgtdDetElement ==
nullptr) {
115 throw std::runtime_error{
"Corrupt detector element collection"};
117 elements.push_back(std::make_shared<ActsDetectorElement>(
118 *hgtdDetElement, hgtdDetElement->
identify()));
123 elements.begin(), elements.end());
125 for (
int bec : {-2, 2}) {
126 const std::string s = bec > 0 ?
"p" :
"n";
128 std::map<int, std::vector<std::shared_ptr<Acts::Surface>>> layers{};
130 for (
auto& element : elements) {
134 <<
id.bec() <<
", layer/disk " <<
id.layer_disk()
135 <<
", eta_module " <<
id.eta_module() <<
", phi_module "
138 if (
id.bec() * bec <= 0) {
142 layers[
id.layer_disk()].push_back(element->surface().getSharedPtr());
145 ATH_MSG_DEBUG(
"Found " << layers.size() <<
" layers in HGTD " << s <<
"EC");
146 for (
auto& [key, surfaces] : layers) {
151 node.withGeometryIdentifier([&layers, bec, s,
this](
auto& geoId) {
152 std::string ecName =
"HGTD_" + s +
"EC";
154 .incrementLayerIds(1);
156 geoId.addCylinderContainer(ecName, AxisR, [&](
auto& hgtd) {
157 hgtd.setAttachmentStrategy(AttachmentStrategy::Gap);
158 hgtd.setResizeStrategy(ResizeStrategy::Gap);
160 hgtd.addCylinderContainer(
161 ecName +
"_Container", AxisZ, [&](
auto& hgtdContainer) {
162 hgtdContainer.setAttachmentStrategy(AttachmentStrategy::Gap);
163 hgtdContainer.setResizeStrategy(ResizeStrategy::Gap);
165 for (
auto& [key, surfaces] : layers) {
166 std::string layerName = ecName +
"_" + std::to_string(key);
181 Acts::Experimental::BlueprintNode& parent,
int bec,
int index,
182 const std::string& name,
183 std::vector<std::shared_ptr<Acts::Surface>>& surfaces) {
184 using enum Acts::SurfaceArrayNavigationPolicy::LayerType;
185 using enum Acts::CylinderVolumeBounds::Face;
186 using enum Acts::AxisDirection;
187 using enum Acts::AxisBoundaryType;
189 parent.addMaterial(name +
"_Material", [&](
auto& mat) {
191 mat.configureFace(bec > 0 ? NegativeDisc : PositiveDisc,
192 {AxisR, Bound, 20}, {AxisPhi, Closed, 40});
194 mat.configureFace(NegativeDisc, {AxisR, Bound, 20},
195 {AxisPhi, Closed, 40});
196 mat.configureFace(PositiveDisc, {AxisR, Bound, 20},
197 {AxisPhi, Closed, 40});
200 mat.addLayer(name, [&surfaces](
auto& layer) {
201 layer.setNavigationPolicyFactory(
202 Acts::NavigationPolicyFactory{}
203 .add<Acts::SurfaceArrayNavigationPolicy>(
204 Acts::SurfaceArrayNavigationPolicy::Config{.layerType = Disc,
206 .add<Acts::TryAllNavigationPolicy>(
207 Acts::TryAllNavigationPolicy::Config{.sensitives =
false})
209 layer.setSurfaces(surfaces);
210 layer.setEnvelope(Acts::ExtentEnvelope{{
211 .z = {0.1_mm, 0.1_mm},