File indexing completed on 2025-12-16 09:22:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Geometry/IndexGrid.hpp"
0012 #include "Acts/Geometry/ReferenceGenerators.hpp"
0013 #include "Acts/Geometry/TrackingVolume.hpp"
0014 #include "Acts/Navigation/INavigationPolicy.hpp"
0015 #include "Acts/Navigation/NavigationStream.hpp"
0016 #include "Acts/Surfaces/BoundaryTolerance.hpp"
0017 #include "Acts/Utilities/Grid.hpp"
0018 #include "Acts/Utilities/GridAccessHelpers.hpp"
0019 #include "Acts/Utilities/ProtoAxis.hpp"
0020
0021 namespace Acts {
0022
0023 class IndexGridNavigationConfig {
0024 public:
0025
0026 std::vector<std::size_t> binExpansion = {0u, 0u};
0027
0028
0029 std::vector<double> referenceExpansion = {};
0030
0031
0032
0033 std::shared_ptr<Surface> surface = nullptr;
0034
0035
0036 std::shared_ptr<IReferenceGenerator> referenceGenerator =
0037 std::make_shared<PolyhedronReferenceGenerator>();
0038 };
0039
0040
0041
0042
0043 template <typename GridType>
0044 class IndexGridNavigationPolicy : public INavigationPolicy {
0045 public:
0046 using IndexGridType = IndexGrid<GridType>;
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 explicit IndexGridNavigationPolicy(const GeometryContext& gctx,
0057 const TrackingVolume& volume,
0058 const Logger& logger,
0059 const IndexGridNavigationConfig& config,
0060 const IndexGridType& grid)
0061 : m_cfg(config), m_volume(volume), m_indexGrid(grid) {
0062 ACTS_VERBOSE("Constructing IndexGridNavigationPolicy for volume '"
0063 << m_volume.volumeName() << "'");
0064
0065
0066 IndexGridFiller filler{m_cfg.binExpansion, m_cfg.referenceExpansion,
0067 getDefaultLogger("IndexGridFiller", logger.level())};
0068 const auto& surfaces = m_volume.surfaces();
0069
0070 std::vector<std::shared_ptr<const Surface>> surfacePtrs = {};
0071 surfacePtrs.reserve(surfaces.size());
0072 for (const auto& surface : surfaces) {
0073 surfacePtrs.push_back(surface.getSharedPtr());
0074 }
0075 filler.fill(gctx, m_indexGrid, surfacePtrs, *m_cfg.referenceGenerator);
0076 }
0077
0078
0079
0080
0081
0082
0083 void initializeCandidates(const GeometryContext& gctx,
0084 const NavigationArguments& args,
0085 AppendOnlyNavigationStream& stream,
0086 const Logger& logger) const {
0087 ACTS_VERBOSE(
0088 "IndexGridNavigationPolicy: candidates initialization for volume '"
0089 << m_volume.volumeName() << "'");
0090
0091
0092 Vector3 position = args.position;
0093 if (m_cfg.surface) {
0094 auto multiIntersection = m_cfg.surface->intersect(
0095 gctx, position, args.direction, BoundaryTolerance::Infinite());
0096 position = multiIntersection.closestForward().position();
0097 }
0098
0099
0100 const auto& surfaces = m_volume.surfaces();
0101 const auto& indices =
0102 m_indexGrid.grid.atPosition(GridAccessHelpers::castPosition<GridType>(
0103 m_indexGrid.transform * position, m_indexGrid.casts));
0104
0105 for (const auto& idx : indices) {
0106 stream.addSurfaceCandidate(surfaces[idx], args.tolerance);
0107 }
0108 }
0109
0110
0111
0112 void connect(NavigationDelegate& delegate) const override {
0113 connectDefault<IndexGridNavigationPolicy>(delegate);
0114 }
0115
0116
0117
0118 const IndexGridType& indexGrid() const { return m_indexGrid; }
0119
0120 private:
0121
0122 IndexGridNavigationConfig m_cfg;
0123
0124 const TrackingVolume& m_volume;
0125
0126 IndexGridType m_indexGrid;
0127 };
0128
0129
0130 using RegularCylinderIndexGrid =
0131 Grid<std::vector<std::size_t>,
0132 Axis<AxisType::Equidistant, AxisBoundaryType::Bound>,
0133 Axis<AxisType::Equidistant, AxisBoundaryType::Closed>>;
0134 using RegularCylinderIndexGridNavigationPolicy =
0135 IndexGridNavigationPolicy<RegularCylinderIndexGrid>;
0136
0137 static_assert(
0138 NavigationPolicyConcept<RegularCylinderIndexGridNavigationPolicy>);
0139
0140
0141 using RegularRingIndexGrid =
0142 Grid<std::vector<std::size_t>,
0143 Axis<AxisType::Equidistant, AxisBoundaryType::Closed>>;
0144 using RegularRingIndexGridNavigationPolicy =
0145 IndexGridNavigationPolicy<RegularRingIndexGrid>;
0146
0147
0148 using RegularDiscIndexGrid =
0149 Grid<std::vector<std::size_t>,
0150 Axis<AxisType::Equidistant, AxisBoundaryType::Bound>,
0151 Axis<AxisType::Equidistant, AxisBoundaryType::Closed>>;
0152 using RegularDiscIndexGridNavigationPolicy =
0153 IndexGridNavigationPolicy<RegularDiscIndexGrid>;
0154
0155 static_assert(NavigationPolicyConcept<RegularDiscIndexGridNavigationPolicy>);
0156
0157
0158 using RegularPlaneIndexGrid =
0159 Grid<std::vector<std::size_t>,
0160 Axis<AxisType::Equidistant, AxisBoundaryType::Bound>,
0161 Axis<AxisType::Equidistant, AxisBoundaryType::Bound>>;
0162 using RegularPlaneIndexGridNavigationPolicy =
0163 IndexGridNavigationPolicy<RegularPlaneIndexGrid>;
0164 static_assert(NavigationPolicyConcept<RegularPlaneIndexGridNavigationPolicy>);
0165
0166 }