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