File indexing completed on 2025-10-26 07:54:34
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/Direction.hpp"
0013 #include "Acts/Geometry/GeometryContext.hpp"
0014 #include "Acts/Surfaces/RegularSurface.hpp"
0015 #include "Acts/Surfaces/Surface.hpp"
0016 #include "Acts/Utilities/BinnedArray.hpp"
0017
0018 #include <memory>
0019
0020 namespace Acts {
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 template <class volume_t>
0037 class BoundarySurfaceT {
0038 #ifndef DOXYGEN
0039 friend volume_t;
0040 #endif
0041
0042 using VolumePtr = std::shared_ptr<const volume_t>;
0043 using VolumeArray = BinnedArray<VolumePtr>;
0044
0045 public:
0046 BoundarySurfaceT()
0047 : m_surface(nullptr),
0048 m_oppositeVolume(nullptr),
0049 m_alongVolume(nullptr),
0050 m_oppositeVolumeArray(nullptr),
0051 m_alongVolumeArray(nullptr) {}
0052
0053
0054
0055
0056
0057
0058
0059 BoundarySurfaceT(std::shared_ptr<const RegularSurface> surface,
0060 const volume_t* inside, const volume_t* outside)
0061 : m_surface(std::move(surface)),
0062 m_oppositeVolume(inside),
0063 m_alongVolume(outside),
0064 m_oppositeVolumeArray(nullptr),
0065 m_alongVolumeArray(nullptr) {}
0066
0067
0068
0069
0070
0071
0072
0073 BoundarySurfaceT(std::shared_ptr<const RegularSurface> surface,
0074 VolumePtr inside, VolumePtr outside)
0075 : m_surface(std::move(surface)),
0076 m_oppositeVolume(inside.get()),
0077 m_alongVolume(outside.get()),
0078 m_oppositeVolumeArray(nullptr),
0079 m_alongVolumeArray(nullptr) {}
0080
0081
0082
0083
0084
0085
0086
0087
0088 BoundarySurfaceT(std::shared_ptr<const RegularSurface> surface,
0089 std::shared_ptr<const VolumeArray> insideArray,
0090 std::shared_ptr<const VolumeArray> outsideArray)
0091 : m_surface(std::move(surface)),
0092 m_oppositeVolume(nullptr),
0093 m_alongVolume(nullptr),
0094 m_oppositeVolumeArray(insideArray),
0095 m_alongVolumeArray(outsideArray) {}
0096
0097 virtual ~BoundarySurfaceT() = default;
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 virtual const volume_t* attachedVolume(const GeometryContext& gctx,
0108 const Vector3& pos,
0109 const Vector3& dir) const {
0110 const volume_t* attVolume = nullptr;
0111
0112 if ((surfaceRepresentation().normal(gctx, pos)).dot(dir) > 0.) {
0113 attVolume = m_alongVolumeArray ? m_alongVolumeArray->object(pos).get()
0114 : m_alongVolume;
0115 } else {
0116 attVolume = m_oppositeVolumeArray
0117 ? m_oppositeVolumeArray->object(pos).get()
0118 : m_oppositeVolume;
0119 }
0120 return attVolume;
0121 }
0122
0123
0124
0125
0126
0127
0128
0129
0130 template <class parameters_t>
0131 bool onBoundary(const GeometryContext& gctx, const parameters_t& pars) const {
0132 return surfaceRepresentation().isOnSurface(gctx, pars);
0133 }
0134
0135
0136
0137 virtual const RegularSurface& surfaceRepresentation() const {
0138 return *m_surface;
0139 }
0140
0141
0142
0143
0144
0145
0146 void attachVolume(const volume_t* volume, Direction dir) {
0147 if (dir == Direction::Backward()) {
0148 m_oppositeVolume = volume;
0149 } else {
0150 m_alongVolume = volume;
0151 }
0152 }
0153
0154
0155
0156
0157
0158
0159 void attachVolumeArray(std::shared_ptr<const VolumeArray> volumes,
0160 Direction dir) {
0161 if (dir == Direction::Backward()) {
0162 m_oppositeVolumeArray = volumes;
0163 } else {
0164 m_alongVolumeArray = volumes;
0165 }
0166 }
0167
0168 protected:
0169
0170 std::shared_ptr<const RegularSurface> m_surface;
0171
0172 const volume_t* m_oppositeVolume;
0173
0174 const volume_t* m_alongVolume;
0175
0176 std::shared_ptr<const VolumeArray> m_oppositeVolumeArray;
0177
0178 std::shared_ptr<const VolumeArray> m_alongVolumeArray;
0179 };
0180
0181 class TrackingVolume;
0182 using BoundarySurface = BoundarySurfaceT<TrackingVolume>;
0183
0184 }