File indexing completed on 2026-05-30 07:56:16
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/Geometry/MaterialDesignatorBlueprintNode.hpp"
0010
0011 #include "Acts/Geometry/CuboidPortalShell.hpp"
0012 #include "Acts/Geometry/CuboidVolumeBounds.hpp"
0013 #include "Acts/Geometry/CylinderPortalShell.hpp"
0014 #include "Acts/Geometry/CylinderVolumeBounds.hpp"
0015 #include "Acts/Geometry/DiamondPortalShell.hpp"
0016 #include "Acts/Geometry/DiamondVolumeBounds.hpp"
0017 #include "Acts/Geometry/Portal.hpp"
0018 #include "Acts/Geometry/PortalShell.hpp"
0019 #include "Acts/Geometry/TrapezoidPortalShell.hpp"
0020 #include "Acts/Geometry/TrapezoidVolumeBounds.hpp"
0021 #include "Acts/Material/HomogeneousSurfaceMaterial.hpp"
0022 #include "Acts/Surfaces/Surface.hpp"
0023 #include "Acts/Utilities/GraphViz.hpp"
0024 #include "Acts/Utilities/ProtoAxis.hpp"
0025
0026 #include "./MaterialDesignator.hpp"
0027
0028 namespace Acts::Experimental {
0029
0030 namespace detail {
0031 class MaterialDesignatorBlueprintNodeImpl {
0032 public:
0033 std::string m_name{};
0034
0035 Designator m_designator{std::monostate{}};
0036 };
0037
0038 }
0039
0040 MaterialDesignatorBlueprintNode::MaterialDesignatorBlueprintNode(
0041 const std::string& name) {
0042 m_impl = std::make_unique<detail::MaterialDesignatorBlueprintNodeImpl>();
0043 m_impl->m_name = name;
0044 }
0045
0046 const std::string& MaterialDesignatorBlueprintNode::name() const {
0047 return impl().m_name;
0048 }
0049
0050 void MaterialDesignatorBlueprintNode::toStream(std::ostream& os) const {
0051 os << "MaterialDesignatorBlueprintNode(" << name() << ")";
0052 }
0053
0054 Volume& MaterialDesignatorBlueprintNode::build(const BlueprintOptions& options,
0055 const GeometryContext& gctx,
0056 const Logger& logger) {
0057 if (children().size() != 1) {
0058 ACTS_ERROR(prefix() << "MaterialDesignatorBlueprintNode must have exactly "
0059 "one child, but has "
0060 << children().size());
0061 throw std::runtime_error(
0062 "MaterialDesignatorBlueprintNode must have exactly one child");
0063 }
0064
0065 return children().at(0).build(options, gctx, logger);
0066 }
0067
0068 PortalShellBase& MaterialDesignatorBlueprintNode::connect(
0069 const BlueprintOptions& options, const GeometryContext& gctx,
0070 const Logger& logger) {
0071 ACTS_DEBUG(prefix() << "MaterialDesignatorBlueprintNode::connect");
0072 if (children().size() != 1) {
0073 ACTS_ERROR(prefix() << "MaterialDesignatorBlueprintNode must have exactly "
0074 "one child, but has "
0075 << children().size());
0076 throw std::runtime_error(
0077 "MaterialDesignatorBlueprintNode must have exactly one child");
0078 }
0079
0080 auto& shell = children().at(0).connect(options, gctx, logger);
0081
0082 ACTS_DEBUG(prefix() << "Received shell from child "
0083 << children().at(0).name());
0084
0085 detail::apply(impl().m_designator, shell, logger, prefix());
0086
0087 return shell;
0088 }
0089
0090 void MaterialDesignatorBlueprintNode::finalize(const BlueprintOptions& options,
0091 const GeometryContext& gctx,
0092 TrackingVolume& parent,
0093 const Logger& logger) {
0094 if (children().size() != 1) {
0095 ACTS_ERROR(prefix() << "MaterialDesignatorBlueprintNode must have exactly "
0096 "one child, but has "
0097 << children().size());
0098 throw std::runtime_error(
0099 "MaterialDesignatorBlueprintNode must have exactly one child");
0100 }
0101 return children().at(0).finalize(options, gctx, parent, logger);
0102 }
0103
0104 void MaterialDesignatorBlueprintNode::addToGraphviz(std::ostream& os) const {
0105 std::stringstream ss;
0106 ss << "<b>" + name() + "</b>";
0107 ss << "<br/>MaterialDesignator";
0108
0109 detail::graphvizLabel(impl().m_designator, ss);
0110
0111 os << GraphViz::Node{
0112 .id = name(), .label = ss.str(), .shape = GraphViz::Shape::Hexagon};
0113 BlueprintNode::addToGraphviz(os);
0114 }
0115
0116 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0117 CylinderVolumeBounds::Face face, const DirectedProtoAxis& loc0,
0118 const DirectedProtoAxis& loc1) {
0119 impl().m_designator = detail::merge(
0120 impl().m_designator,
0121 detail::CylinderProtoDesignator(face, loc0, loc1, prefix()));
0122 return *this;
0123 }
0124
0125 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0126 CylinderVolumeBounds::Face face,
0127 std::shared_ptr<const Acts::ISurfaceMaterial> material) {
0128 if (material == nullptr) {
0129 throw std::invalid_argument(prefix() + "Material is nullptr");
0130 }
0131 impl().m_designator = detail::merge(
0132 impl().m_designator,
0133 detail::CylinderHomogeneousMaterialDesignator(face, std::move(material)));
0134 return *this;
0135 }
0136
0137 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0138 CuboidVolumeBounds::Face face, const DirectedProtoAxis& loc0,
0139 const DirectedProtoAxis& loc1) {
0140 impl().m_designator =
0141 detail::merge(impl().m_designator,
0142 detail::CuboidProtoDesignator(face, loc0, loc1, prefix()));
0143 return *this;
0144 }
0145
0146 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0147 CuboidVolumeBounds::Face face,
0148 std::shared_ptr<const Acts::ISurfaceMaterial> material) {
0149 if (material == nullptr) {
0150 throw std::invalid_argument(prefix() + "Material is nullptr");
0151 }
0152 impl().m_designator = detail::merge(
0153 impl().m_designator,
0154 detail::CuboidHomogeneousMaterialDesignator(face, std::move(material)));
0155 return *this;
0156 }
0157
0158 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0159 TrapezoidVolumeBounds::Face face,
0160 std::shared_ptr<const Acts::ISurfaceMaterial> material) {
0161 if (material == nullptr) {
0162 throw std::invalid_argument(prefix() + "Material is nullptr");
0163 }
0164 impl().m_designator = detail::merge(
0165 impl().m_designator, detail::TrapezoidHomogeneousMaterialDesignator(
0166 face, std::move(material)));
0167 return *this;
0168 }
0169
0170 MaterialDesignatorBlueprintNode& MaterialDesignatorBlueprintNode::configureFace(
0171 DiamondVolumeBounds::Face face,
0172 std::shared_ptr<const Acts::ISurfaceMaterial> material) {
0173 if (material == nullptr) {
0174 throw std::invalid_argument(prefix() + "Material is nullptr");
0175 }
0176 impl().m_designator = detail::merge(
0177 impl().m_designator,
0178 detail::DiamondHomogeneousMaterialDesignator(face, std::move(material)));
0179 return *this;
0180 }
0181
0182 detail::MaterialDesignatorBlueprintNodeImpl&
0183 MaterialDesignatorBlueprintNode::impl() {
0184 if (!m_impl) {
0185 throw std::runtime_error("MaterialDesignatorBlueprintNodeImpl is not set");
0186 }
0187 return *m_impl;
0188 }
0189
0190 const detail::MaterialDesignatorBlueprintNodeImpl&
0191 MaterialDesignatorBlueprintNode::impl() const {
0192 if (!m_impl) {
0193 throw std::runtime_error("MaterialDesignatorBlueprintNodeImpl is not set");
0194 }
0195 return *m_impl;
0196 }
0197
0198 MaterialDesignatorBlueprintNode::~MaterialDesignatorBlueprintNode() = default;
0199
0200 }