Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:10:55

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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 /// @brief  The end of world sets the volume pointer of the
0027 /// navigation state to nullptr, usually indicates the end of
0028 /// the known world, hence the name
0029 struct EndOfWorld : public IExternalNavigation {
0030   /// @brief a null volume link - explicitly
0031   ///
0032   /// @note the method parameters are ignored
0033   inline void update(const GeometryContext& /*ignored*/,
0034                      NavigationState& nState) const {
0035     nState.currentVolume = nullptr;
0036   }
0037 };
0038 
0039 /// Navigation to a connected single detector volumed
0040 using SingleDetectorVolumeNavigation =
0041     SingleObjectNavigation<IExternalNavigation, DetectorVolume,
0042                            DetectorVolumeFiller>;
0043 
0044 using SingleIndex = std::size_t;
0045 
0046 using VariableBoundAxis =
0047     Acts::Axis<Acts::AxisType::Variable, Acts::AxisBoundaryType::Bound>;
0048 using VariableBoundIndexGrid1 = Acts::Grid<SingleIndex, VariableBoundAxis>;
0049 
0050 /// @brief This holds and extracts a collection of detector
0051 /// volumes. Alternatively an extractor could also use the
0052 /// detector and its associated detector volume container for
0053 /// volume extraction.
0054 ///
0055 struct DetectorVolumesCollection {
0056   /// The volumes held by this collection
0057   std::vector<const DetectorVolume*> dVolumes = {};
0058 
0059   /// Extract a voume from a collection
0060   ///
0061   /// @note that geometry context and navigation state are ignored here
0062   /// @param index are access indices into the surfaces store
0063   ///
0064   /// @return the extracted volume
0065   inline const DetectorVolume* extract(const GeometryContext& /*gctx*/,
0066                                        const NavigationState& /*nState*/,
0067                                        const SingleIndex& index) const {
0068     return dVolumes[index];
0069   }
0070 };
0071 
0072 /// @brief This is used for volumes that are indexed in a bound
0073 /// 1-dimensional grid, e.g. a z-spaced array, or an r-spaced array
0074 /// of volumes.
0075 ///
0076 struct BoundVolumesGrid1Navigation : public IExternalNavigation {
0077   using IndexedUpdater =
0078       IndexedGridNavigation<IExternalNavigation, VariableBoundIndexGrid1,
0079                             DetectorVolumesCollection, DetectorVolumeFiller>;
0080   // The indexed updator
0081   IndexedUpdater indexedUpdater;
0082 
0083   /// Allowed constructor with explicit arguments
0084   ///
0085   /// @param gBoundaries the grid boundaries
0086   /// @param bValue the binning value
0087   /// @param cVolumes the contained volumes
0088   /// @param bTransform is the optional transform
0089   BoundVolumesGrid1Navigation(
0090       const std::vector<double>& gBoundaries, AxisDirection bValue,
0091       const std::vector<const DetectorVolume*>& cVolumes,
0092       const Transform3& bTransform = Transform3::Identity()) noexcept(false)
0093       : indexedUpdater(IndexedUpdater(VariableBoundIndexGrid1(std::make_tuple(
0094                                           VariableBoundAxis(gBoundaries))),
0095                                       {bValue}, bTransform)) {
0096     indexedUpdater.extractor.dVolumes = cVolumes;
0097 
0098     if (gBoundaries.size() != cVolumes.size() + 1u) {
0099       throw std::invalid_argument(
0100           "ExternalNavigationDelegates: mismatching boundaries and volume "
0101           "numbers");
0102     }
0103     // Initialize the grid entries
0104     for (std::size_t ib = 1u; ib < gBoundaries.size(); ++ib) {
0105       indexedUpdater.grid.at(ib) = ib - 1;
0106     }
0107   }
0108   // Deleted default constructor
0109   BoundVolumesGrid1Navigation() = delete;
0110 
0111   /// @brief This updator relies on an 1D single index grid
0112   ///
0113   /// @param gctx the geometry context
0114   /// @param nState [in,out] the navigation state to be updated
0115   inline void update(const GeometryContext& gctx,
0116                      NavigationState& nState) const {
0117     indexedUpdater.update(gctx, nState);
0118   }
0119 };
0120 
0121 }  // namespace Acts::Experimental