Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:27:41

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2022-2023 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 http://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/Grid.hpp"
0017 #include "Acts/Utilities/detail/Axis.hpp"
0018 
0019 #include <stdexcept>
0020 
0021 namespace Acts::Experimental {
0022 
0023 class DetectorVolume;
0024 
0025 /// @brief  The end of world sets the volume pointer of the
0026 /// navigation state to nullptr, usually indicates the end of
0027 /// the known world, hence the name
0028 struct EndOfWorld : public IExternalNavigation {
0029   /// @brief a null volume link - explicitly
0030   ///
0031   /// @note the method parameters are ignored
0032   inline void update(const GeometryContext& /*ignored*/,
0033                      NavigationState& nState) const {
0034     nState.currentVolume = nullptr;
0035   }
0036 };
0037 
0038 /// Navigation to a connected single detector volumed
0039 using SingleDetectorVolumeNavigation =
0040     SingleObjectNavigation<IExternalNavigation, DetectorVolume,
0041                            DetectorVolumeFiller>;
0042 
0043 using SingleIndex = std::size_t;
0044 
0045 using VariableBoundAxis =
0046     Acts::detail::Axis<Acts::detail::AxisType::Variable,
0047                        Acts::detail::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<ActsScalar>& gBoundaries, BinningValue 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