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