Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-07-16 08:07:29

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 #pragma once
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Geometry/CuboidVolumeBounds.hpp"
0013 #include "Acts/Geometry/PortalShell.hpp"
0014 #include "Acts/Geometry/TrackingVolume.hpp"
0015 #include "Acts/Utilities/AxisDefinitions.hpp"
0016 #include "Acts/Utilities/Logger.hpp"
0017 
0018 #include <array>
0019 #include <memory>
0020 #include <vector>
0021 
0022 namespace Acts {
0023 
0024 /// @class CuboidPortalShell
0025 /// Base class for cuboid shaped portal shells, e.g. shells for cuboid
0026 /// volumes
0027 class CuboidPortalShell : public PortalShellBase {
0028  public:
0029   /// Type alias for cuboid volume bounds face enumeration
0030   using Face = CuboidVolumeBounds::Face;
0031 
0032   /// Retrieve a shared_ptr for the portal associated to the given face. Can be
0033   /// nullptr if unset.
0034   /// @param face The face to retrieve the portal for
0035   /// @return The portal associated to the face
0036   virtual std::shared_ptr<Portal> portal(Face face) = 0;
0037 
0038   /// Set the portal associated to the given face.
0039   /// @param portal The portal to set
0040   /// @param face The face to set the portal
0041   virtual void setPortal(std::shared_ptr<Portal> portal, Face face) = 0;
0042 
0043   /// @copydoc PortalShellBase::fill
0044   void fill(TrackingVolume& volume) override;
0045 
0046   /// @brief Get the transformation matrix for this cuboid portal shell
0047   /// @return Reference to the transformation matrix
0048   virtual const Transform3& localToGlobalTransform(
0049       const GeometryContext& gctx) const = 0;
0050 };
0051 
0052 /// Output stream operator for the CuboidPortalShell::Face enum
0053 /// @param os The output stream
0054 /// @param face The face to output
0055 /// @return The output stream
0056 std::ostream& operator<<(std::ostream& os, CuboidPortalShell::Face face);
0057 
0058 /// @class SingleCuboidPortalShell
0059 /// This class describes a cuboid shell containing a single volume.
0060 class SingleCuboidPortalShell : public CuboidPortalShell {
0061  public:
0062   /// Construct a single cuboid portal shell for the given volume
0063   /// @param volume The volume to create the shell for
0064   explicit SingleCuboidPortalShell(TrackingVolume& volume);
0065 
0066   /// @copydoc PortalShellBase::size
0067   std::size_t size() const final;
0068 
0069   /// @copydoc CuboidPortalShell::portal
0070   std::shared_ptr<Portal> portal(Face face) final;
0071 
0072   /// @copydoc CuboidPortalShell::setPortal
0073   void setPortal(std::shared_ptr<Portal> portal, Face face) final;
0074 
0075   /// @copydoc PortalShellBase::applyToVolume
0076   void applyToVolume() override;
0077 
0078   /// @copydoc PortalShellBase::isValid
0079   bool isValid() const override;
0080 
0081   /// @copydoc PortalShellBase::label
0082   std::string label() const override;
0083 
0084   const Transform3& localToGlobalTransform(
0085       const GeometryContext& gctx) const override {
0086     return m_volume->localToGlobalTransform(gctx);
0087   };
0088 
0089  private:
0090   std::array<std::shared_ptr<Portal>, 6> m_portals{};
0091 
0092   TrackingVolume* m_volume;
0093 };
0094 
0095 /// @class CuboidStackPortalShell
0096 /// This class describes a cuboid shell containing multiple volumes.
0097 class CuboidStackPortalShell final : public CuboidPortalShell {
0098  public:
0099   /// Construct the portal shell stack from the given shells
0100   /// @param gctx The geometry context
0101   /// @param shells The shells to stack
0102   /// @note The shells must be ordered in the given direction
0103   /// @param direction The stacking direction (along x/y/z axis) in local stack coordinates
0104   /// @param logger A logging instance for debugging
0105   CuboidStackPortalShell(const GeometryContext& gctx,
0106                          std::vector<CuboidPortalShell*> shells,
0107                          AxisDirection direction,
0108                          const Logger& logger = getDummyLogger());
0109 
0110   /// @copydoc PortalShellBase::size
0111   std::size_t size() const override;
0112 
0113   /// @copydoc CuboidPortalShell::portal
0114   std::shared_ptr<Portal> portal(Face face) override;
0115 
0116   /// @copydoc CuboidPortalShell::setPortal
0117   void setPortal(std::shared_ptr<Portal> portal, Face face) override;
0118 
0119   void applyToVolume() override {
0120     // No-op, because it's a composite portal shell
0121   }
0122 
0123   /// @copydoc PortalShellBase::isValid
0124   bool isValid() const override;
0125 
0126   /// @copydoc PortalShellBase::label
0127   std::string label() const override;
0128 
0129   /// Return the stack's group transform
0130   /// @return Reference to the transform of the cuboid stack
0131   const Transform3& localToGlobalTransform(
0132       const GeometryContext& gctx) const override;
0133 
0134  private:
0135   /// Shell stacking direction in local stack coordinates
0136   AxisDirection m_direction;
0137 
0138   /// The cuboid face positioned first along the stacking direction
0139   CuboidVolumeBounds::Face m_frontFace = Face::NegativeXFace;
0140   /// The cuboid face positioned last along the stacking direction
0141   CuboidVolumeBounds::Face m_backFace = Face::PositiveXFace;
0142   /// The cuboid faces parallel to the stacking direction
0143   std::array<CuboidVolumeBounds::Face, 4> m_sideFaces{
0144       Face::NegativeZFace, Face::PositiveZFace, Face::NegativeYFace,
0145       Face::PositiveYFace};
0146 
0147   std::vector<CuboidPortalShell*> m_shells;
0148 };
0149 
0150 }  // namespace Acts