Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:01:37

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