File indexing completed on 2025-12-15 09:42:06
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
0047 BoundarySurfaceT() = default;
0048
0049
0050
0051
0052
0053
0054 BoundarySurfaceT(std::shared_ptr<RegularSurface> surface,
0055 const volume_t* inside, const volume_t* outside)
0056 : m_surface(std::move(surface)),
0057 m_oppositeVolume{inside},
0058 m_alongVolume{outside} {}
0059
0060
0061
0062
0063
0064
0065
0066 BoundarySurfaceT(std::shared_ptr<RegularSurface> surface, VolumePtr inside,
0067 VolumePtr outside)
0068 : m_surface(std::move(surface)),
0069 m_oppositeVolume(inside.get()),
0070 m_alongVolume(outside.get()) {}
0071
0072
0073
0074
0075
0076
0077
0078
0079 BoundarySurfaceT(std::shared_ptr<RegularSurface> surface,
0080 std::shared_ptr<const VolumeArray> insideArray,
0081 std::shared_ptr<const VolumeArray> outsideArray)
0082 : m_surface{std::move(surface)},
0083 m_oppositeVolumeArray{std::move(insideArray)},
0084 m_alongVolumeArray{std::move(outsideArray)} {}
0085
0086 virtual ~BoundarySurfaceT() = default;
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096 virtual const volume_t* attachedVolume(const GeometryContext& gctx,
0097 const Vector3& pos,
0098 const Vector3& dir) const {
0099 const volume_t* attVolume = nullptr;
0100
0101 if ((surfaceRepresentation().normal(gctx, pos)).dot(dir) > 0.) {
0102 attVolume = m_alongVolumeArray ? m_alongVolumeArray->object(pos).get()
0103 : m_alongVolume;
0104 } else {
0105 attVolume = m_oppositeVolumeArray
0106 ? m_oppositeVolumeArray->object(pos).get()
0107 : m_oppositeVolume;
0108 }
0109 return attVolume;
0110 }
0111
0112
0113
0114
0115
0116
0117
0118
0119 template <class parameters_t>
0120 bool onBoundary(const GeometryContext& gctx, const parameters_t& pars) const {
0121 return surfaceRepresentation().isOnSurface(gctx, pars);
0122 }
0123
0124
0125
0126 virtual const RegularSurface& surfaceRepresentation() const {
0127 return *m_surface;
0128 }
0129
0130
0131
0132 RegularSurface& surfaceRepresentation() { return *m_surface; }
0133
0134
0135
0136
0137
0138
0139 void attachVolume(const volume_t* volume, Direction dir) {
0140 if (dir == Direction::Backward()) {
0141 m_oppositeVolume = volume;
0142 } else {
0143 m_alongVolume = volume;
0144 }
0145 }
0146
0147
0148
0149
0150
0151
0152 void attachVolumeArray(std::shared_ptr<const VolumeArray> volumes,
0153 Direction dir) {
0154 if (dir == Direction::Backward()) {
0155 m_oppositeVolumeArray = volumes;
0156 } else {
0157 m_alongVolumeArray = volumes;
0158 }
0159 }
0160
0161 protected:
0162
0163 std::shared_ptr<RegularSurface> m_surface{};
0164
0165 const volume_t* m_oppositeVolume{};
0166
0167 const volume_t* m_alongVolume{};
0168
0169 std::shared_ptr<const VolumeArray> m_oppositeVolumeArray{};
0170
0171 std::shared_ptr<const VolumeArray> m_alongVolumeArray{};
0172 };
0173
0174 class TrackingVolume;
0175 using BoundarySurface = BoundarySurfaceT<TrackingVolume>;
0176
0177 }