File indexing completed on 2025-10-30 08:09:45
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 #pragma once
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Geometry/Volume.hpp"
0013 #include "Acts/Geometry/VolumeBounds.hpp"
0014 #include "Acts/Utilities/BoundingBox.hpp"
0015 
0016 #include <array>
0017 #include <iomanip>
0018 #include <memory>
0019 #include <ostream>
0020 #include <vector>
0021 
0022 namespace Acts {
0023 
0024 class CylinderBounds;
0025 class ConeBounds;
0026 class RadialBounds;
0027 class PlanarBounds;
0028 
0029 
0030 
0031 
0032 
0033 
0034 class ConeVolumeBounds : public VolumeBounds {
0035  public:
0036   
0037   enum BoundValues : unsigned int {
0038     eInnerAlpha = 0,
0039     eInnerOffsetZ = 1,
0040     eOuterAlpha = 2,
0041     eOuterOffsetZ = 3,
0042     eHalfLengthZ = 4,
0043     eAveragePhi = 5,
0044     eHalfPhiSector = 6,
0045     eSize
0046   };
0047 
0048   ConeVolumeBounds() = delete;
0049 
0050   
0051   
0052   
0053   
0054   
0055   
0056   
0057   
0058   
0059   ConeVolumeBounds(double innerAlpha, double innerOffsetZ, double outerAlpha,
0060                    double outerOffsetZ, double halflengthZ, double averagePhi,
0061                    double halfPhiSector) noexcept(false);
0062 
0063   
0064   
0065   
0066   
0067   
0068   
0069   
0070   
0071   
0072   
0073   
0074   ConeVolumeBounds(double cylinderR, double alpha, double offsetZ,
0075                    double halflengthZ, double averagePhi,
0076                    double halfPhiSector) noexcept(false);
0077 
0078   
0079   
0080   
0081   ConeVolumeBounds(const std::array<double, eSize>& values) noexcept(false)
0082       : m_values(values) {
0083     checkConsistency();
0084     buildSurfaceBounds();
0085   }
0086 
0087   ConeVolumeBounds(const ConeVolumeBounds& cobo) = default;
0088   ~ConeVolumeBounds() override = default;
0089   ConeVolumeBounds& operator=(const ConeVolumeBounds& cobo) = default;
0090 
0091   VolumeBounds::BoundsType type() const final { return VolumeBounds::eCone; }
0092 
0093   
0094   
0095   
0096   std::vector<double> values() const final;
0097 
0098   
0099   
0100   
0101   
0102   
0103   bool inside(const Vector3& pos, double tol = 0.) const final;
0104 
0105   
0106   
0107   
0108   
0109   
0110   
0111   
0112   
0113   
0114   
0115   std::vector<OrientedSurface> orientedSurfaces(
0116       const Transform3& transform = Transform3::Identity()) const final;
0117 
0118   
0119   
0120   
0121   
0122   
0123   Volume::BoundingBox boundingBox(const Transform3* trf = nullptr,
0124                                   const Vector3& envelope = {0, 0, 0},
0125                                   const Volume* entity = nullptr) const final;
0126 
0127   
0128   
0129   double get(BoundValues bValue) const { return m_values[bValue]; }
0130 
0131   
0132   double innerRmin() const;
0133 
0134   
0135   double innerRmax() const;
0136 
0137   
0138   double innerTanAlpha() const;
0139 
0140   
0141   double outerRmin() const;
0142 
0143   
0144   double outerRmax() const;
0145 
0146   
0147   double outerTanAlpha() const;
0148 
0149   
0150   
0151   
0152   std::ostream& toStream(std::ostream& os) const final;
0153 
0154  private:
0155   
0156   
0157   void checkConsistency() noexcept(false);
0158 
0159   
0160   void buildSurfaceBounds();
0161 
0162   
0163   std::array<double, eSize> m_values;
0164   std::shared_ptr<CylinderBounds> m_innerCylinderBounds{nullptr};
0165   std::shared_ptr<ConeBounds> m_innerConeBounds{nullptr};
0166   std::shared_ptr<ConeBounds> m_outerConeBounds{nullptr};
0167   std::shared_ptr<CylinderBounds> m_outerCylinderBounds{nullptr};
0168   std::shared_ptr<RadialBounds> m_negativeDiscBounds{nullptr};
0169   std::shared_ptr<RadialBounds> m_positiveDiscBounds{nullptr};
0170   std::shared_ptr<PlanarBounds> m_sectorBounds{nullptr};
0171 
0172   
0173   double m_innerRmin = 0.;
0174   double m_innerRmax = 0.;
0175   double m_innerTanAlpha = 0.;
0176   double m_outerRmin = 0.;
0177   double m_outerRmax = 0.;
0178   double m_outerTanAlpha = 0.;
0179 };
0180 
0181 }