File indexing completed on 2025-01-19 09:23:21
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(ActsScalar innerAlpha, ActsScalar innerOffsetZ,
0060 ActsScalar outerAlpha, ActsScalar outerOffsetZ,
0061 ActsScalar halflengthZ, ActsScalar averagePhi,
0062 ActsScalar halfPhiSector) noexcept(false);
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 ConeVolumeBounds(ActsScalar cylinderR, ActsScalar alpha, ActsScalar offsetZ,
0076 ActsScalar halflengthZ, ActsScalar averagePhi,
0077 ActsScalar halfPhiSector) noexcept(false);
0078
0079
0080
0081
0082 ConeVolumeBounds(const std::array<ActsScalar, eSize>& values) noexcept(false)
0083 : m_values(values) {
0084 checkConsistency();
0085 buildSurfaceBounds();
0086 }
0087
0088 ConeVolumeBounds(const ConeVolumeBounds& cobo) = default;
0089 ~ConeVolumeBounds() override = default;
0090 ConeVolumeBounds& operator=(const ConeVolumeBounds& cobo) = default;
0091
0092 VolumeBounds::BoundsType type() const final { return VolumeBounds::eCone; }
0093
0094
0095
0096
0097 std::vector<ActsScalar> values() const final;
0098
0099
0100
0101
0102
0103
0104 bool inside(const Vector3& pos, ActsScalar tol = 0.) const final;
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 std::vector<OrientedSurface> orientedSurfaces(
0117 const Transform3& transform = Transform3::Identity()) const final;
0118
0119
0120
0121
0122
0123
0124 Volume::BoundingBox boundingBox(const Transform3* trf = nullptr,
0125 const Vector3& envelope = {0, 0, 0},
0126 const Volume* entity = nullptr) const final;
0127
0128
0129
0130 ActsScalar get(BoundValues bValue) const { return m_values[bValue]; }
0131
0132
0133 ActsScalar innerRmin() const;
0134
0135
0136 ActsScalar innerRmax() const;
0137
0138
0139 ActsScalar innerTanAlpha() const;
0140
0141
0142 ActsScalar outerRmin() const;
0143
0144
0145 ActsScalar outerRmax() const;
0146
0147
0148 ActsScalar outerTanAlpha() const;
0149
0150
0151
0152
0153 std::ostream& toStream(std::ostream& os) const final;
0154
0155 private:
0156
0157
0158 void checkConsistency() noexcept(false);
0159
0160
0161 void buildSurfaceBounds();
0162
0163
0164 std::array<ActsScalar, eSize> m_values;
0165 std::shared_ptr<CylinderBounds> m_innerCylinderBounds{nullptr};
0166 std::shared_ptr<ConeBounds> m_innerConeBounds{nullptr};
0167 std::shared_ptr<ConeBounds> m_outerConeBounds{nullptr};
0168 std::shared_ptr<CylinderBounds> m_outerCylinderBounds{nullptr};
0169 std::shared_ptr<RadialBounds> m_negativeDiscBounds{nullptr};
0170 std::shared_ptr<RadialBounds> m_positiveDiscBounds{nullptr};
0171 std::shared_ptr<PlanarBounds> m_sectorBounds{nullptr};
0172
0173
0174 ActsScalar m_innerRmin = 0.;
0175 ActsScalar m_innerRmax = 0.;
0176 ActsScalar m_innerTanAlpha = 0.;
0177 ActsScalar m_outerRmin = 0.;
0178 ActsScalar m_outerRmax = 0.;
0179 ActsScalar m_outerTanAlpha = 0.;
0180 };
0181
0182 }