Back to home page

EIC code displayed by LXR

 
 

    


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

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/Definitions/Algebra.hpp"
0012 #include "Acts/Geometry/BoundarySurfaceFace.hpp"
0013 #include "Acts/Geometry/BoundarySurfaceT.hpp"
0014 #include "Acts/Geometry/GeometryContext.hpp"
0015 #include "Acts/Geometry/GeometryIdentifier.hpp"
0016 #include "Acts/Geometry/Layer.hpp"
0017 #include "Acts/Geometry/Portal.hpp"
0018 #include "Acts/Geometry/TrackingVolumeVisitorConcept.hpp"
0019 #include "Acts/Geometry/Volume.hpp"
0020 #include "Acts/Material/IVolumeMaterial.hpp"
0021 #include "Acts/Navigation/NavigationDelegate.hpp"
0022 #include "Acts/Navigation/NavigationStream.hpp"
0023 #include "Acts/Surfaces/Surface.hpp"
0024 #include "Acts/Surfaces/SurfaceArray.hpp"
0025 #include "Acts/Surfaces/SurfaceVisitorConcept.hpp"
0026 #include "Acts/Utilities/BinnedArray.hpp"
0027 #include "Acts/Utilities/Logger.hpp"
0028 #include "Acts/Utilities/TransformRange.hpp"
0029 #include "Acts/Visualization/ViewConfig.hpp"
0030 
0031 #include <cstddef>
0032 #include <memory>
0033 #include <string>
0034 #include <unordered_map>
0035 #include <utility>
0036 #include <vector>
0037 
0038 #include <boost/container/container_fwd.hpp>
0039 
0040 namespace Acts {
0041 
0042 class GlueVolumesDescriptor;
0043 class VolumeBounds;
0044 template <typename object_t>
0045 struct NavigationOptions;
0046 class IMaterialDecorator;
0047 class ISurfaceMaterial;
0048 class IVolumeMaterial;
0049 class Surface;
0050 class TrackingVolume;
0051 struct GeometryIdentifierHook;
0052 class Portal;
0053 class INavigationPolicy;
0054 
0055 /// Interface types of the Gen1 geometry model
0056 /// @note This interface is being replaced, and is subject to removal
0057 /// @{
0058 
0059 // master typedefs
0060 using TrackingVolumePtr = std::shared_ptr<const TrackingVolume>;
0061 using MutableTrackingVolumePtr = std::shared_ptr<TrackingVolume>;
0062 
0063 using TrackingVolumeBoundaryPtr =
0064     std::shared_ptr<const BoundarySurfaceT<TrackingVolume>>;
0065 using TrackingVolumeBoundaries = std::vector<TrackingVolumeBoundaryPtr>;
0066 
0067 // possible contained
0068 using TrackingVolumeArray = BinnedArray<TrackingVolumePtr>;
0069 using TrackingVolumeVector = std::vector<TrackingVolumePtr>;
0070 using MutableTrackingVolumeVector = std::vector<MutableTrackingVolumePtr>;
0071 using LayerArray = BinnedArray<LayerPtr>;
0072 using LayerVector = std::vector<LayerPtr>;
0073 
0074 /// Intersection with @c Layer
0075 using LayerIntersection = std::pair<SurfaceIntersection, const Layer*>;
0076 /// Multi-intersection with @c Layer
0077 using LayerMultiIntersection =
0078     std::pair<SurfaceMultiIntersection, const Layer*>;
0079 
0080 /// BoundarySurface of a volume
0081 using BoundarySurface = BoundarySurfaceT<TrackingVolume>;
0082 /// Intersection with a @c BoundarySurface
0083 using BoundaryIntersection =
0084     std::pair<SurfaceIntersection, const BoundarySurface*>;
0085 /// Multi-intersection with a @c BoundarySurface
0086 using BoundaryMultiIntersection =
0087     std::pair<SurfaceMultiIntersection, const BoundarySurface*>;
0088 
0089 /// @}
0090 
0091 /// @class TrackingVolume
0092 ///
0093 /// Full Volume description used in Tracking,
0094 /// it inherits from Volume to get the geometrical structure.
0095 ///
0096 ///     A TrackingVolume at navigation level can provide the (layer) material
0097 /// information / internal navigation with in
0098 ///     5 different ways:
0099 ///
0100 ///         --- a) Static confinement of Layers
0101 ///         --- b) detached sub volumes
0102 ///         --- b) unordered (arbitrarily oriented) layers
0103 ///         --- d) unordered sub volumes
0104 ///         --- e) unordered layers AND unordered subvolumes
0105 ///
0106 ///    The TrackingVolume can also be a simple container of other
0107 ///    TrackingVolumes
0108 ///
0109 /// In addition it is capable of holding a subarray of Layers and
0110 /// TrackingVolumes.
0111 ///
0112 class TrackingVolume : public Volume {
0113   friend class TrackingGeometry;
0114 
0115  public:
0116   TrackingVolume() = delete;
0117   ~TrackingVolume() override;
0118   TrackingVolume(const TrackingVolume&) = delete;
0119   TrackingVolume& operator=(const TrackingVolume&) = delete;
0120   TrackingVolume(TrackingVolume&&) noexcept;
0121   TrackingVolume& operator=(TrackingVolume&&) noexcept;
0122 
0123   /// Constructor for a container Volume
0124   /// - vacuum filled volume either as a for other tracking volumes
0125   ///
0126   /// @param transform is the global 3D transform to position the volume in
0127   /// space
0128   /// @param volbounds is the description of the volume boundaries
0129   /// @param volumeName is a string identifier
0130   TrackingVolume(const Transform3& transform,
0131                  std::shared_ptr<VolumeBounds> volbounds,
0132                  const std::string& volumeName = "undefined");
0133 
0134   /// Constructor for a full equipped Tracking Volume
0135   ///
0136   /// @param transform is the global 3D transform to position the volume in
0137   /// space
0138   /// @param volumeBounds is the description of the volume boundaries
0139   /// @param volumeMaterial is are materials of the tracking volume
0140   /// @param staticLayerArray is the confined layer array (optional)
0141   /// @param containedVolumeArray are the sub volumes if the volume is a
0142   /// container
0143   /// @param denseVolumeVector  The contained dense volumes
0144   /// @param volumeName is a string identifier
0145   TrackingVolume(
0146       const Transform3& transform, std::shared_ptr<VolumeBounds> volumeBounds,
0147       std::shared_ptr<const IVolumeMaterial> volumeMaterial,
0148       std::unique_ptr<const LayerArray> staticLayerArray = nullptr,
0149       std::shared_ptr<const TrackingVolumeArray> containedVolumeArray = nullptr,
0150       MutableTrackingVolumeVector denseVolumeVector = {},
0151       const std::string& volumeName = "undefined");
0152 
0153   /// Constructor from a regular volume
0154   /// @param volume is the volume to be converted
0155   /// @param volumeName is a string identifier
0156   TrackingVolume(Volume& volume, const std::string& volumeName = "undefined");
0157 
0158   /// Return the associated sub Volume, returns THIS if no subVolume exists
0159   /// @param gctx The current geometry context object, e.g. alignment
0160   /// @param position is the global position associated with that search
0161   /// @param tol Search position tolerance for dense volumes
0162   ///
0163   /// @return plain pointer to associated with the position
0164   const TrackingVolume* lowestTrackingVolume(const GeometryContext& gctx,
0165                                              const Vector3& position,
0166                                              const double tol = 0.) const;
0167 
0168   /// @brief Visit all reachable surfaces
0169   ///
0170   /// @tparam visitor_t Type of the callable visitor
0171   ///
0172   /// @param visitor The callable. Will be called for each reachable surface
0173   /// that is found, a selection of the surfaces can be done in the visitor
0174   /// @param restrictToSensitives If true, only sensitive surfaces are visited
0175   ///
0176   /// @note If a context is needed for the visit, the vistitor has to provide
0177   /// this, e.g. as a private member
0178   template <SurfaceVisitor visitor_t>
0179   void visitSurfaces(visitor_t&& visitor, bool restrictToSensitives) const {
0180     if (!restrictToSensitives) {
0181       // Visit the boundary surfaces
0182       for (const auto& bs : m_boundarySurfaces) {
0183         visitor(&(bs->surfaceRepresentation()));
0184       }
0185 
0186       for (const auto& portal : portals()) {
0187         visitor(&portal.surface());
0188       }
0189     }
0190 
0191     // Internal structure
0192     if (m_confinedVolumes == nullptr) {
0193       // no sub volumes => loop over the confined layers
0194       if (m_confinedLayers != nullptr) {
0195         for (const auto& layer : m_confinedLayers->arrayObjects()) {
0196           // Surfaces contained in the surface array
0197           if (layer->surfaceArray() != nullptr) {
0198             for (const auto& srf : layer->surfaceArray()->surfaces()) {
0199               visitor(srf);
0200               continue;
0201             }
0202           }
0203           if (!restrictToSensitives) {
0204             // Surfaces of the layer
0205             visitor(&layer->surfaceRepresentation());
0206             // Approach surfaces of the layer
0207             if (layer->approachDescriptor() != nullptr) {
0208               for (const auto& srf :
0209                    layer->approachDescriptor()->containedSurfaces()) {
0210                 visitor(srf);
0211               }
0212             }
0213           }
0214         }
0215       }
0216     } else {
0217       // contains sub volumes
0218       for (const auto& volume : m_confinedVolumes->arrayObjects()) {
0219         volume->visitSurfaces(visitor, restrictToSensitives);
0220       }
0221     }
0222 
0223     for (const auto& surface : surfaces()) {
0224       visitor(&surface);
0225     }
0226 
0227     for (const auto& volume : volumes()) {
0228       volume.visitSurfaces(visitor, restrictToSensitives);
0229     }
0230   }
0231 
0232   /// @brief Visit all sensitive surfaces
0233   ///
0234   /// @tparam visitor_t Type of the callable visitor
0235   ///
0236   /// @param visitor The callable. Will be called for each sensitive surface
0237   /// that is found, a selection of the surfaces can be done in the visitor
0238   ///
0239   /// @note If a context is needed for the visit, the vistitor has to provide
0240   /// this, e.g. as a private member
0241   template <SurfaceVisitor visitor_t>
0242   void visitSurfaces(visitor_t&& visitor) const {
0243     visitSurfaces(std::forward<visitor_t>(visitor), true);
0244   }
0245 
0246   /// @brief Visit all reachable tracking volumes
0247   ///
0248   /// @tparam visitor_t Type of the callable visitor
0249   ///
0250   /// @param visitor The callable. Will be called for each reachable volume
0251   /// that is found, a selection of the volumes can be done in the visitor
0252   ///
0253   /// @note If a context is needed for the visit, the vistitor has to provide
0254   /// this, e.g. as a private member
0255   template <TrackingVolumeVisitor visitor_t>
0256   void visitVolumes(visitor_t&& visitor) const {
0257     visitor(this);
0258     if (m_confinedVolumes != nullptr) {
0259       // contains sub volumes
0260       for (const auto& volume : m_confinedVolumes->arrayObjects()) {
0261         volume->visitVolumes(visitor);
0262       }
0263     }
0264 
0265     for (const auto& volume : m_volumes) {
0266       volume->visitVolumes(visitor);
0267     }
0268   }
0269 
0270   /// Returns the VolumeName - for debug reason, might be depreciated later
0271   const std::string& volumeName() const;
0272 
0273   /// Set the volume name to @p volumeName
0274   /// @param volumeName is the new name of
0275   void setVolumeName(const std::string& volumeName);
0276 
0277   /// Return the material of the volume
0278   const IVolumeMaterial* volumeMaterial() const;
0279 
0280   /// Return the material of the volume as shared pointer
0281   const std::shared_ptr<const IVolumeMaterial>& volumeMaterialPtr() const;
0282 
0283   /// Set the volume material description
0284   ///
0285   /// The material is usually derived in a complicated way and loaded from
0286   /// a framework given source. As various volumes could potentially share the
0287   /// the same material description, it is provided as a shared object
0288   ///
0289   /// @param material Material description of this volume
0290   void assignVolumeMaterial(std::shared_ptr<const IVolumeMaterial> material);
0291 
0292   /// Return the MotherVolume - if it exists
0293   const TrackingVolume* motherVolume() const;
0294 
0295   /// Return the MotherVolume - if it exists
0296   TrackingVolume* motherVolume();
0297 
0298   /// Set the MotherVolume
0299   ///
0300   /// @param mvol is the mother volume
0301   void setMotherVolume(TrackingVolume* mvol);
0302 
0303   using MutableVolumeRange =
0304       detail::TransformRange<detail::Dereference,
0305                              std::vector<std::unique_ptr<TrackingVolume>>>;
0306   using VolumeRange = detail::TransformRange<
0307       detail::ConstDereference,
0308       const std::vector<std::unique_ptr<TrackingVolume>>>;
0309 
0310   /// Return all volumes registered under this tracking volume
0311   /// @return the range of volumes
0312   VolumeRange volumes() const;
0313 
0314   /// Return mutable view of the registered volumes under this tracking volume
0315   /// @return the range of volumes
0316   MutableVolumeRange volumes();
0317 
0318   using MutablePortalRange =
0319       detail::TransformRange<detail::Dereference,
0320                              std::vector<std::shared_ptr<Portal>>>;
0321 
0322   using PortalRange =
0323       detail::TransformRange<detail::ConstDereference,
0324                              const std::vector<std::shared_ptr<Portal>>>;
0325 
0326   /// Return all portals registered under this tracking volume
0327   /// @return the range of portals
0328   PortalRange portals() const;
0329 
0330   /// Return mutable view of the registered portals under this tracking volume
0331   /// @return the range of portals
0332   MutablePortalRange portals();
0333 
0334   /// Add a portal to this tracking volume
0335   /// @param portal The portal to add
0336   void addPortal(std::shared_ptr<Portal> portal);
0337 
0338   using MutableSurfaceRange =
0339       detail::TransformRange<detail::Dereference,
0340                              std::vector<std::shared_ptr<Surface>>>;
0341   using SurfaceRange =
0342       detail::TransformRange<detail::ConstDereference,
0343                              const std::vector<std::shared_ptr<Surface>>>;
0344 
0345   /// Return all surfaces registered under this tracking volume
0346   /// @return the range of surfaces
0347   SurfaceRange surfaces() const;
0348 
0349   /// Return mutable view of the registered surfaces under this tracking volume
0350   /// @return the range of surfaces
0351   MutableSurfaceRange surfaces();
0352 
0353   /// Add a surface to this tracking volume
0354   /// @param surface The surface to add
0355   void addSurface(std::shared_ptr<Surface> surface);
0356 
0357   /// Add a child volume to this tracking volume
0358   /// @param volume The volume to add
0359   /// @note The @p volume will have its mother volume assigned to @p this.
0360   ///       It will throw if @p volume already has a mother volume set
0361   /// @return Reference to the added volume
0362   TrackingVolume& addVolume(std::unique_ptr<TrackingVolume> volume);
0363 
0364   /// Interface of @c TrackingVolume in the Gen1 geometry model
0365   /// @note This interface is being replaced, and is subject to removal
0366   ///
0367   /// @{
0368 
0369   /// Return the associated Layer to the global position
0370   ///
0371   /// @param gctx The current geometry context object, e.g. alignment
0372   /// @param position is the associated global position
0373   ///
0374   /// @return plain pointer to layer object
0375   const Layer* associatedLayer(const GeometryContext& gctx,
0376                                const Vector3& position) const;
0377 
0378   /// @brief Resolves the volume into (compatible) Layers
0379   ///
0380   /// This is the method for the propagator/extrapolator
0381   /// @tparam options_t Type of navigation options object for decomposition
0382   ///
0383   /// @param gctx The current geometry context object, e.g. alignment
0384   /// @param position Position for the search
0385   /// @param direction Direction for the search
0386   /// @param options The templated navigation options
0387   ///
0388   /// @return vector of compatible intersections with layers
0389   boost::container::small_vector<LayerIntersection, 10> compatibleLayers(
0390       const GeometryContext& gctx, const Vector3& position,
0391       const Vector3& direction, const NavigationOptions<Layer>& options) const;
0392 
0393   /// @brief Returns all boundary surfaces sorted by the user.
0394   ///
0395   /// @tparam options_t Type of navigation options object for decomposition
0396   /// @tparam sorter_t Type of the boundary surface sorter
0397   ///
0398   /// @param gctx The current geometry context object, e.g. alignment
0399   /// @param position The position for searching
0400   /// @param direction The direction for searching
0401   /// @param options The templated navigation options
0402   /// @param logger A @c Logger instance
0403   ///
0404   /// @return is the templated boundary intersection
0405   boost::container::small_vector<BoundaryIntersection, 4> compatibleBoundaries(
0406       const GeometryContext& gctx, const Vector3& position,
0407       const Vector3& direction, const NavigationOptions<Surface>& options,
0408       const Logger& logger = getDummyLogger()) const;
0409 
0410   /// Return the confined static layer array - if it exists
0411   /// @return the BinnedArray of static layers if exists
0412   const LayerArray* confinedLayers() const;
0413 
0414   /// Return the confined volumes of this container array - if it exists
0415   std::shared_ptr<const TrackingVolumeArray> confinedVolumes() const;
0416 
0417   /// Return the confined dense volumes
0418   const MutableTrackingVolumeVector denseVolumes() const;
0419 
0420   /// Method to return the BoundarySurfaces
0421   const TrackingVolumeBoundaries& boundarySurfaces() const;
0422 
0423   /// Set the boundary surface material description
0424   ///
0425   /// The material is usually derived in a complicated way and loaded from
0426   /// a framework given source. As various volumes could potentially share the
0427   /// the same material description, it is provided as a shared object
0428   ///
0429   /// @param surfaceMaterial Material description of this volume
0430   /// @param bsFace Specifies which boundary surface to assign the material to
0431   void assignBoundaryMaterial(
0432       std::shared_ptr<const ISurfaceMaterial> surfaceMaterial,
0433       BoundarySurfaceFace bsFace);
0434 
0435   /// Glue another tracking volume to this one
0436   ///  - if common face is set the glued volumes are sharing the boundary, down
0437   /// to the last navigation volume
0438   ///
0439   /// @param gctx The current geometry context object, e.g. alignment
0440   /// @param bsfMine is the boundary face indicater where to glue
0441   /// @param neighbor is the TrackingVolume to be glued
0442   /// @param bsfNeighbor is the boundary surface of the neighbor
0443   void glueTrackingVolume(const GeometryContext& gctx,
0444                           BoundarySurfaceFace bsfMine, TrackingVolume* neighbor,
0445                           BoundarySurfaceFace bsfNeighbor);
0446 
0447   /// Glue another tracking volume to this one
0448   ///  - if common face is set the glued volumes are sharing the boundary, down
0449   /// to the last navigation volume
0450   ///
0451   /// @param gctx The current geometry context object, e.g. alignment
0452   /// @param bsfMine is the boundary face indicater where to glue
0453   /// @param neighbors are the TrackingVolumes to be glued
0454   /// @param bsfNeighbor are the boundary surface of the neighbors
0455   void glueTrackingVolumes(
0456       const GeometryContext& gctx, BoundarySurfaceFace bsfMine,
0457       const std::shared_ptr<TrackingVolumeArray>& neighbors,
0458       BoundarySurfaceFace bsfNeighbor);
0459 
0460   /// Provide a new BoundarySurface from the glueing
0461   ///
0462   /// @param bsf is the boundary face indicater where to glue
0463   /// @param bs is the new boundary surface
0464   /// @param checkmaterial is a flag how to deal with material, if true:
0465   /// - if the old boundary surface had a material description
0466   ///   but the new one has not, keep the current one
0467   /// - in all other cases just assign the new boundary surface
0468   void updateBoundarySurface(
0469       BoundarySurfaceFace bsf,
0470       std::shared_ptr<const BoundarySurfaceT<TrackingVolume>> bs,
0471       bool checkmaterial = true);
0472 
0473   /// Register the outside glue volumes -
0474   /// ordering is in the TrackingVolume Frame:
0475   ///  - negativeFaceXY
0476   ///  - (faces YZ, ZY, radial faces)
0477   ///  - positiveFaceXY
0478   ///
0479   /// @param gvd register a new GlueVolumeDescriptor
0480   void registerGlueVolumeDescriptor(std::unique_ptr<GlueVolumesDescriptor> gvd);
0481 
0482   /// Register the outside glue volumes -
0483   /// ordering is in the TrackingVolume Frame:
0484   ///  - negativeFaceXY
0485   ///  - (faces YZ, ZY, radial faces)
0486   ///  - positiveFaceXY
0487   GlueVolumesDescriptor& glueVolumesDescriptor();
0488 
0489   /// Produces a 3D visualization of this tracking volume
0490   /// @param helper The visualization helper describing the output format
0491   /// @param gctx The geometry context
0492   /// @param viewConfig The view configuration
0493   /// @param portalViewConfig View configuration for portals
0494   /// @param sensitiveViewConfig View configuration for sensitive surfaces
0495   void visualize(IVisualization3D& helper, const GeometryContext& gctx,
0496                  const ViewConfig& viewConfig,
0497                  const ViewConfig& portalViewConfig,
0498                  const ViewConfig& sensitiveViewConfig) const;
0499 
0500   /// Register a navigation policy with this volume. The argument can not be
0501   /// nullptr.
0502   /// @param policy is the navigation policy to be registered
0503   void setNavigationPolicy(std::unique_ptr<INavigationPolicy> policy);
0504 
0505   /// Populate the navigation stream with navigation candidates from this
0506   /// volume. Internally, this consults the registered navigation policy, where
0507   /// the default is a noop.
0508   /// @param args are the navigation arguments
0509   /// @param stream is the navigation stream to be updated
0510   /// @param logger is the logger
0511   void initializeNavigationCandidates(const NavigationArguments& args,
0512                                       AppendOnlyNavigationStream& stream,
0513                                       const Logger& logger) const;
0514 
0515  private:
0516   void connectDenseBoundarySurfaces(
0517       MutableTrackingVolumeVector& confinedDenseVolumes);
0518 
0519   /// interlink the layers in this TrackingVolume
0520   void interlinkLayers();
0521 
0522   /// Create Boundary Surface
0523   void createBoundarySurfaces();
0524 
0525   /// method to synchronize the layers with potentially updated volume bounds:
0526   /// - adapts the layer dimensions to the new volumebounds + envelope
0527   ///
0528   /// @param envelope is the clearance between volume boundary and layer
0529   void synchronizeLayers(double envelope = 1.) const;
0530 
0531   // the boundary surfaces
0532   std::vector<TrackingVolumeBoundaryPtr> m_boundarySurfaces;
0533 
0534   ///(a) static configuration ordered by Binned arrays
0535   /// static layers
0536   std::unique_ptr<const LayerArray> m_confinedLayers = nullptr;
0537 
0538   /// Array of Volumes inside the Volume when acting as container
0539   std::shared_ptr<const TrackingVolumeArray> m_confinedVolumes = nullptr;
0540 
0541   /// confined dense
0542   MutableTrackingVolumeVector m_confinedDenseVolumes;
0543 
0544   /// Volumes to glue Volumes from the outside
0545   std::unique_ptr<GlueVolumesDescriptor> m_glueVolumeDescriptor{nullptr};
0546 
0547   /// @}
0548 
0549  private:
0550   /// close the Geometry, i.e. set the GeometryIdentifier and assign material
0551   ///
0552   /// @param materialDecorator is a dedicated decorator for the
0553   ///        material to be assigned (surface, volume based)
0554   /// @param volumeMap is a map to find the a volume by identifier
0555   /// @param vol is the geometry id of the volume
0556   ///        as calculated by the TrackingGeometry
0557   /// @param hook Identifier hook to be applied to surfaces
0558   /// @param logger A @c Logger instance
0559   ///
0560   void closeGeometry(
0561       const IMaterialDecorator* materialDecorator,
0562       std::unordered_map<GeometryIdentifier, const TrackingVolume*>& volumeMap,
0563       std::size_t& vol, const GeometryIdentifierHook& hook,
0564       const Logger& logger = getDummyLogger());
0565 
0566   /// The volume based material the TrackingVolume consists of
0567   std::shared_ptr<const IVolumeMaterial> m_volumeMaterial{nullptr};
0568 
0569   /// Remember the mother volume
0570   TrackingVolume* m_motherVolume{nullptr};
0571 
0572   /// Volume name for debug reasons & screen output
0573   std::string m_name;
0574 
0575   std::vector<std::unique_ptr<TrackingVolume>> m_volumes;
0576   std::vector<std::shared_ptr<Portal>> m_portals;
0577   std::vector<std::shared_ptr<Surface>> m_surfaces;
0578 
0579   std::unique_ptr<INavigationPolicy> m_navigationPolicy;
0580 
0581   NavigationDelegate m_navigationDelegate{};
0582 };
0583 
0584 }  // namespace Acts