Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-30 07:56:16

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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   // Monostate is the null state, where no designator is configured.
0035   Designator m_designator{std::monostate{}};
0036 };
0037 
0038 }  // namespace detail
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 }  // namespace Acts::Experimental