File indexing completed on 2025-10-17 07:58:36
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Geometry/GeometryContext.hpp"
0012 #include "Acts/Navigation/NavigationDelegates.hpp"
0013 #include "Acts/Navigation/NavigationState.hpp"
0014 #include "Acts/Navigation/NavigationStateFillers.hpp"
0015 #include "Acts/Navigation/NavigationStateUpdaters.hpp"
0016 #include "Acts/Utilities/Axis.hpp"
0017 #include "Acts/Utilities/AxisDefinitions.hpp"
0018 #include "Acts/Utilities/Grid.hpp"
0019
0020 #include <stdexcept>
0021
0022 namespace Acts::Experimental {
0023
0024 class DetectorVolume;
0025
0026
0027
0028
0029 struct EndOfWorld : public IExternalNavigation {
0030
0031
0032
0033
0034
0035 inline void update(const GeometryContext& gctx,
0036 NavigationState& nState) const {
0037 (void)gctx;
0038 nState.currentVolume = nullptr;
0039 }
0040 };
0041
0042
0043 using SingleDetectorVolumeNavigation =
0044 SingleObjectNavigation<IExternalNavigation, DetectorVolume,
0045 DetectorVolumeFiller>;
0046
0047 using SingleIndex = std::size_t;
0048
0049 using VariableBoundAxis =
0050 Acts::Axis<Acts::AxisType::Variable, Acts::AxisBoundaryType::Bound>;
0051 using VariableBoundIndexGrid1 = Acts::Grid<SingleIndex, VariableBoundAxis>;
0052
0053
0054
0055
0056
0057
0058 struct DetectorVolumesCollection {
0059
0060 std::vector<const DetectorVolume*> dVolumes = {};
0061
0062
0063
0064
0065
0066
0067
0068 inline const DetectorVolume* extract(const GeometryContext& ,
0069 const NavigationState& ,
0070 const SingleIndex& index) const {
0071 return dVolumes[index];
0072 }
0073 };
0074
0075
0076
0077
0078
0079 struct BoundVolumesGrid1Navigation : public IExternalNavigation {
0080
0081 using IndexedUpdater =
0082 IndexedGridNavigation<IExternalNavigation, VariableBoundIndexGrid1,
0083 DetectorVolumesCollection, DetectorVolumeFiller>;
0084
0085 IndexedUpdater indexedUpdater;
0086
0087
0088
0089
0090
0091
0092
0093 BoundVolumesGrid1Navigation(
0094 const std::vector<double>& gBoundaries, AxisDirection bValue,
0095 const std::vector<const DetectorVolume*>& cVolumes,
0096 const Transform3& bTransform = Transform3::Identity()) noexcept(false)
0097 : indexedUpdater(IndexedUpdater(VariableBoundIndexGrid1(std::make_tuple(
0098 VariableBoundAxis(gBoundaries))),
0099 {bValue}, bTransform)) {
0100 indexedUpdater.extractor.dVolumes = cVolumes;
0101
0102 if (gBoundaries.size() != cVolumes.size() + 1u) {
0103 throw std::invalid_argument(
0104 "ExternalNavigationDelegates: mismatching boundaries and volume "
0105 "numbers");
0106 }
0107
0108 for (std::size_t ib = 1u; ib < gBoundaries.size(); ++ib) {
0109 indexedUpdater.grid.at(ib) = ib - 1;
0110 }
0111 }
0112
0113 BoundVolumesGrid1Navigation() = delete;
0114
0115
0116
0117
0118
0119 inline void update(const GeometryContext& gctx,
0120 NavigationState& nState) const {
0121 indexedUpdater.update(gctx, nState);
0122 }
0123 };
0124
0125 }