Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-10 08:38:44

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/Definitions/Alignment.hpp"
0013 #include "Acts/Definitions/Direction.hpp"
0014 #include "Acts/Definitions/Tolerance.hpp"
0015 #include "Acts/Definitions/TrackParametrization.hpp"
0016 #include "Acts/Geometry/GeometryContext.hpp"
0017 #include "Acts/Geometry/GeometryObject.hpp"
0018 #include "Acts/Geometry/Polyhedron.hpp"
0019 #include "Acts/Material/MaterialSlab.hpp"
0020 #include "Acts/Surfaces/BoundaryTolerance.hpp"
0021 #include "Acts/Surfaces/SurfaceBounds.hpp"
0022 #include "Acts/Surfaces/SurfacePlacementBase.hpp"
0023 #include "Acts/Utilities/AxisDefinitions.hpp"
0024 #include "Acts/Utilities/CloneablePtr.hpp"
0025 #include "Acts/Utilities/Intersection.hpp"
0026 #include "Acts/Utilities/Result.hpp"
0027 #include "Acts/Visualization/ViewConfig.hpp"
0028 
0029 #include <array>
0030 #include <memory>
0031 #include <ostream>
0032 #include <string>
0033 #include <string_view>
0034 #include <utility>
0035 
0036 namespace Acts {
0037 
0038 class SurfaceBounds;
0039 class ISurfaceMaterial;
0040 class Layer;
0041 class TrackingVolume;
0042 class IVisualization3D;
0043 
0044 /// @class Surface
0045 ///
0046 /// Abstract Base Class for tracking surfaces
0047 ///
0048 /// The Surface class builds the core of the Acts Tracking Geometry.
0049 /// All other geometrical objects are either extending the surface or
0050 /// are built from it.
0051 ///
0052 /// Surfaces are either owned by Detector elements or the Tracking Geometry,
0053 /// in which case they are not copied within the data model objects.
0054 ///
0055 class Surface : public virtual GeometryObject,
0056                 public std::enable_shared_from_this<Surface> {
0057  public:
0058   friend struct GeometryContextOstreamWrapper<Surface>;
0059 
0060   /// @enum SurfaceType
0061   ///
0062   /// This enumerator simplifies the persistency & calculations,
0063   /// by saving a dynamic_cast, e.g. for persistency
0064   enum SurfaceType {
0065     Cone = 0,
0066     Cylinder = 1,
0067     Disc = 2,
0068     Perigee = 3,
0069     Plane = 4,
0070     Straw = 5,
0071     Curvilinear = 6,
0072     Other = 7
0073   };
0074 
0075   /// Helper strings for screen output
0076   static constexpr std::array<std::string_view, Surface::SurfaceType::Other + 1>
0077       s_surfaceTypeNames = {"Cone",  "Cylinder", "Disc",        "Perigee",
0078                             "Plane", "Straw",    "Curvilinear", "Other"};
0079 
0080   friend std::ostream& operator<<(std::ostream& os, SurfaceType type);
0081 
0082  protected:
0083   /// Constructor with Transform3 as a shared object
0084   ///
0085   /// @param transform Transform3 positions the surface in 3D global space
0086   /// @note also acts as default constructor
0087   explicit Surface(const Transform3& transform = Transform3::Identity());
0088 
0089   /// Copy constructor
0090   ///
0091   /// @note copy construction invalidates the association
0092   /// to detector element and layer
0093   ///
0094   /// @param other Source surface for copy.
0095   Surface(const Surface& other) noexcept = default;
0096 
0097   /// Constructor from SurfacePlacement: Element proxy
0098   ///
0099   /// @param placement Reference to the surface placement
0100   /// @note The Surface does not take any ownership over the
0101   ///       `SurfacePlacementBase` it is expected that the user
0102   ///        ensures the life-time of the `SurfacePlacementBase`
0103   ///        and that the `Surface` is actually owned by
0104   ///        the `SurfacePlacementBase` instance
0105   explicit Surface(const SurfacePlacementBase& placement) noexcept;
0106 
0107   /// Copy constructor with optional shift
0108   ///
0109   /// @note copy construction invalidates the association
0110   /// to detector element and layer
0111   ///
0112   /// @param gctx The current geometry context object, e.g. alignment
0113   /// @param other Source surface for copy
0114   /// @param shift Additional transform applied as: shift * transform
0115   explicit Surface(const GeometryContext& gctx, const Surface& other,
0116                    const Transform3& shift) noexcept;
0117 
0118  public:
0119   ~Surface() noexcept override;
0120 
0121   /// Factory for producing memory managed instances of Surface.
0122   /// Will forward all parameters and will attempt to find a suitable
0123   /// constructor.
0124   /// @param args Constructor arguments to forward to surface creation
0125   /// @return Shared pointer to the created surface instance
0126   template <class T, typename... Args>
0127   static std::shared_ptr<T> makeShared(Args&&... args) {
0128     return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
0129   }
0130 
0131   /// Retrieve a @c std::shared_ptr for this surface (non-const version)
0132   ///
0133   /// @note Will error if this was not created through the @c makeShared factory
0134   ///       since it needs access to the original reference. In C++14 this is
0135   ///       undefined behavior (but most likely implemented as a @c bad_weak_ptr
0136   ///       exception), in C++17 it is defined as that exception.
0137   /// @note Only call this if you need shared ownership of this object.
0138   ///
0139   /// @return The shared pointer
0140   std::shared_ptr<Surface> getSharedPtr();
0141 
0142   /// Retrieve a @c std::shared_ptr for this surface (const version)
0143   ///
0144   /// @note Will error if this was not created through the @c makeShared factory
0145   ///       since it needs access to the original reference. In C++14 this is
0146   ///       undefined behavior, but most likely implemented as a @c bad_weak_ptr
0147   ///       exception, in C++17 it is defined as that exception.
0148   /// @note Only call this if you need shared ownership of this object.
0149   ///
0150   /// @return The shared pointer
0151   std::shared_ptr<const Surface> getSharedPtr() const;
0152 
0153   /// Assignment operator
0154   /// @note copy construction invalidates the association
0155   /// to detector element and layer
0156   ///
0157   /// @param other Source surface for the assignment
0158   /// @return Reference to this surface after assignment
0159   Surface& operator=(const Surface& other) noexcept = default;
0160 
0161   /// Comparison (equality) operator
0162   /// The strategy for comparison is
0163   /// (a) first pointer comparison
0164   /// (b) then type comparison
0165   /// (c) then bounds comparison
0166   /// (d) then transform comparison
0167   ///
0168   /// @param other source surface for the comparison
0169   /// @return True if surfaces are equal, false otherwise
0170   bool operator==(const Surface& other) const;
0171 
0172  public:
0173   /// Return method for the Surface type to avoid dynamic casts
0174   /// @return The surface type enumeration value
0175   virtual SurfaceType type() const = 0;
0176 
0177   /// Return method for the surface Transform3 by reference
0178   /// In case a detector element is associated the surface transform
0179   /// is just forwarded to the detector element in order to keep the
0180   /// (mis-)alignment cache cetrally handled
0181   ///
0182   /// @param gctx The current geometry context object, e.g. alignment
0183   ///
0184   /// @return the contextual transform
0185   const Transform3& localToGlobalTransform(const GeometryContext& gctx) const;
0186 
0187   /// Return method for the surface center
0188   /// @note the center is always recalculated in order to not keep a cache
0189   ///
0190   /// @param gctx The current geometry context object, e.g. alignment
0191   ///
0192   /// @return center position by value
0193   virtual Vector3 center(const GeometryContext& gctx) const;
0194 
0195   /// Return the surface normal at a given @p position and @p direction.
0196   /// This method is fully generic, and valid for all surface types.
0197   /// @note For some surface types, the @p direction is ignored, but
0198   ///       it is **not safe** to pass in a zero vector!
0199   /// @param gctx The current geometry context object, e.g. alignment
0200   /// @param pos The position at which to calculate the normal
0201   /// @param direction The direction at which to calculate the normal
0202   /// @return The normal vector at the given position and direction
0203   virtual Vector3 normal(const GeometryContext& gctx, const Vector3& pos,
0204                          const Vector3& direction) const = 0;
0205 
0206   /// Return method for SurfaceBounds
0207   /// @return SurfaceBounds by reference
0208   virtual const SurfaceBounds& bounds() const = 0;
0209 
0210   /// Return the associated surface placement if there is any
0211   /// @return Pointer to the surface placement, can be nullptr
0212   const SurfacePlacementBase* surfacePlacement() const;
0213 
0214   /// Return method for the associated Layer in which the surface is embedded
0215   /// @return Layer by plain pointer, can be nullptr
0216   const Layer* associatedLayer() const;
0217 
0218   /// Return the thickness of the surface in the normal direction
0219   /// @return The surface thickness
0220   double thickness() const;
0221 
0222   /// Set Associated Layer
0223   /// Many surfaces can be associated to a Layer, but it might not be known yet
0224   /// during construction of the layer, this can be set afterwards
0225   ///
0226   /// @param lay the assignment Layer by reference
0227   void associateLayer(const Layer& lay);
0228 
0229   /// Check if the surface has an associated material description
0230   /// @return True if the surface has an associated material, false otherwise
0231   bool hasMaterial() const;
0232 
0233   /// Return method for the associated Material to this surface
0234   /// @return SurfaceMaterial as plain pointer, can be nullptr
0235   const ISurfaceMaterial* surfaceMaterial() const;
0236 
0237   /// Return method for the shared pointer to the associated Material
0238   /// @return SurfaceMaterial as shared_pointer, can be nullptr
0239   const std::shared_ptr<const ISurfaceMaterial>& surfaceMaterialSharedPtr()
0240       const;
0241 
0242   /// Assign a placement object which may dynamically align the surface in space
0243   /// @param placement: Placement object defining the surface's position
0244   void assignSurfacePlacement(const SurfacePlacementBase& placement);
0245 
0246   /// Assign the surface material description
0247   ///
0248   /// The material is usually derived in a complicated way and loaded from
0249   /// a framework given source. As various surfaces may share the same source
0250   /// this is provided by a shared pointer
0251   ///
0252   /// @param material Material description associated to this surface
0253   virtual void assignSurfaceMaterial(
0254       std::shared_ptr<const ISurfaceMaterial> material);
0255 
0256   /// Assign whether the surface is sensitive
0257   /// @param isSensitive Boolean flag to set sensitivity
0258   /// @throw logic_error if the surface is associated to a detector element
0259   void assignIsSensitive(bool isSensitive);
0260 
0261   /// Assign the thickness of the surface in the
0262   ///        orthogonal dimension
0263   /// @param thick: Thickness parameter to assign (>=0)
0264   void assignThickness(double thick);
0265 
0266   /// Return method for full material description of the Surface
0267   /// - from local coordinate on the surface
0268   ///
0269   /// @param lp is the local position used for the (eventual) lookup
0270   ///
0271   /// @return const MaterialSlab
0272   virtual const MaterialSlab& materialSlab(const Vector2& lp) const;
0273 
0274   /// Return method for fully scaled material description of the Surface
0275   /// - from local coordinate on the surface
0276   ///
0277   /// @param lp is the local position used for the (eventual) lookup
0278   /// @param pDir is the positive direction through the surface
0279   /// @param mode is the material update directive
0280   ///
0281   /// @return MaterialSlab
0282   virtual MaterialSlab materialSlab(const Vector2& lp, Direction pDir,
0283                                     MaterialUpdateMode mode) const;
0284 
0285   /// The geometric onSurface method
0286   ///
0287   /// Geometrical check whether position is on Surface
0288   ///
0289   /// @param gctx The current geometry context object, e.g. alignment
0290   /// @param position global position to be evaludated
0291   /// @param direction global momentum direction (required for line-type surfaces)
0292   /// @param boundaryTolerance BoundaryTolerance directive for this onSurface check
0293   /// @param tolerance optional tolerance within which a point is considered on surface
0294   ///
0295   /// @return boolean indication if operation was successful
0296   bool isOnSurface(
0297       const GeometryContext& gctx, const Vector3& position,
0298       const Vector3& direction,
0299       const BoundaryTolerance& boundaryTolerance = BoundaryTolerance::None(),
0300       double tolerance = s_onSurfaceTolerance) const;
0301 
0302   /// Calculates the closest point on the boundary of the surface to a given
0303   /// point in local coordinates.
0304   /// @param lposition The local position to check
0305   /// @param metric The metric to use for the calculation
0306   /// @return The closest point on the boundary of the surface
0307   virtual Vector2 closestPointOnBoundary(const Vector2& lposition,
0308                                          const SquareMatrix2& metric) const;
0309 
0310   /// Calculates the distance to the boundary of the surface from a given point
0311   /// in local coordinates.
0312   /// @param lposition The local position to check
0313   /// @return The distance to the boundary of the surface
0314   virtual double distanceToBoundary(const Vector2& lposition) const;
0315 
0316   /// The insideBounds method for local positions
0317   ///
0318   /// @param lposition The local position to check
0319   /// @param boundaryTolerance BoundaryTolerance directive for this onSurface check
0320   /// @return boolean indication if operation was successful
0321   virtual bool insideBounds(const Vector2& lposition,
0322                             const BoundaryTolerance& boundaryTolerance =
0323                                 BoundaryTolerance::None()) const;
0324 
0325   /// Local to global transformation
0326   /// Generalized local to global transformation for the surface types. Since
0327   /// some surface types need the global momentum/direction to resolve sign
0328   /// ambiguity this is also provided
0329   ///
0330   /// @param gctx The current geometry context object, e.g. alignment
0331   /// @param lposition local 2D position in specialized surface frame
0332   /// @param direction global 3D momentum direction
0333   ///
0334   /// @return The global position by value
0335   virtual Vector3 localToGlobal(const GeometryContext& gctx,
0336                                 const Vector2& lposition,
0337                                 const Vector3& direction) const = 0;
0338 
0339   /// Global to local transformation
0340   /// Generalized global to local transformation for the surface types. Since
0341   /// some surface types need the global momentum/direction to resolve sign
0342   /// ambiguity this is also provided
0343   ///
0344   /// @param gctx The current geometry context object, e.g. alignment
0345   /// @param position global 3D position - considered to be on surface but not
0346   /// inside bounds (check is done)
0347   /// @param direction global 3D momentum direction
0348   /// @param tolerance optional tolerance within which a point is considered
0349   /// valid on surface
0350   ///
0351   /// @return a Result<Vector2> which can be !ok() if the operation fails
0352   virtual Result<Vector2> globalToLocal(
0353       const GeometryContext& gctx, const Vector3& position,
0354       const Vector3& direction,
0355       double tolerance = s_onSurfaceTolerance) const = 0;
0356 
0357   /// Return method for the reference frame
0358   /// This is the frame in which the covariance matrix is defined (specialized
0359   /// by all surfaces)
0360   ///
0361   /// @param gctx The current geometry context object, e.g. alignment
0362   /// @param position global 3D position - considered to be on surface but not
0363   /// inside bounds (check is done)
0364   /// @param direction global 3D momentum direction (optionally ignored)
0365   ///
0366   /// @return RotationMatrix3 which defines the three axes of the measurement
0367   /// frame
0368   virtual RotationMatrix3 referenceFrame(const GeometryContext& gctx,
0369                                          const Vector3& position,
0370                                          const Vector3& direction) const;
0371 
0372   /// Calculate the jacobian from local to global which the surface knows best,
0373   /// hence the calculation is done here.
0374   ///
0375   /// @note In principle, the input could also be a free parameters
0376   /// vector as it could be transformed to a bound parameters. But the transform
0377   /// might fail in case the parameters is not on surface. To avoid the check
0378   /// inside this function, it takes directly the bound parameters as input
0379   /// (then the check might be done where this function is called).
0380   ///
0381   /// @todo this mixes track parameterisation and geometry
0382   /// should move to :
0383   /// "Acts/EventData/detail/coordinate_transformations.hpp"
0384   ///
0385   /// @param gctx The current geometry context object, e.g. alignment
0386   /// @param position global 3D position
0387   /// @param direction global 3D momentum direction
0388   ///
0389   /// @return Jacobian from local to global
0390   virtual BoundToFreeMatrix boundToFreeJacobian(const GeometryContext& gctx,
0391                                                 const Vector3& position,
0392                                                 const Vector3& direction) const;
0393 
0394   /// Calculate the jacobian from global to local which the surface knows best,
0395   /// hence the calculation is done here.
0396   ///
0397   /// @note It assumes the input free parameters is on surface, hence no
0398   /// onSurface check is done inside this function.
0399   ///
0400   /// @todo this mixes track parameterisation and geometry
0401   /// should move to :
0402   /// "Acts/EventData/detail/coordinate_transformations.hpp"
0403   ///
0404   /// @param gctx The current geometry context object, e.g. alignment
0405   /// @param position global 3D position
0406   /// @param direction global 3D momentum direction
0407   ///
0408   /// @return Jacobian from global to local
0409   virtual FreeToBoundMatrix freeToBoundJacobian(const GeometryContext& gctx,
0410                                                 const Vector3& position,
0411                                                 const Vector3& direction) const;
0412 
0413   /// Calculate the derivative of path length at the geometry constraint or
0414   /// point-of-closest-approach w.r.t. free parameters. The calculation is
0415   /// identical for all surfaces where the reference frame does not depend on
0416   /// the direction
0417   ///
0418   /// @todo this mixes track parameterisation and geometry
0419   /// should move to :
0420   /// "Acts/EventData/detail/coordinate_transformations.hpp"
0421   ///
0422   /// @param gctx The current geometry context object, e.g. alignment
0423   /// @param position global 3D position
0424   /// @param direction global 3D momentum direction
0425   ///
0426   /// @return Derivative of path length w.r.t. free parameters
0427   virtual FreeToPathMatrix freeToPathDerivative(const GeometryContext& gctx,
0428                                                 const Vector3& position,
0429                                                 const Vector3& direction) const;
0430 
0431   /// Calculation of the path correction for incident
0432   ///
0433   /// @param gctx The current geometry context object, e.g. alignment
0434   /// @param position global 3D position
0435   /// @note The @p position is either ignored, or it is coerced to be on the surface,
0436   ///       depending on the surface type.
0437   /// @param direction global 3D momentum direction
0438   ///
0439   /// @return Path correction with respect to the nominal incident.
0440   virtual double pathCorrection(const GeometryContext& gctx,
0441                                 const Vector3& position,
0442                                 const Vector3& direction) const = 0;
0443 
0444   /// Straight line intersection schema from position/direction
0445   ///
0446   /// @param gctx The current geometry context object, e.g. alignment
0447   /// @param position The position to start from
0448   /// @param direction The direction at start
0449   /// @param boundaryTolerance the BoundaryTolerance
0450   /// @param tolerance the tolerance used for the intersection
0451   ///
0452   /// @return @c MultiIntersection3D intersection object
0453   virtual MultiIntersection3D intersect(
0454       const GeometryContext& gctx, const Vector3& position,
0455       const Vector3& direction,
0456       const BoundaryTolerance& boundaryTolerance =
0457           BoundaryTolerance::Infinite(),
0458       double tolerance = s_onSurfaceTolerance) const = 0;
0459 
0460   /// Helper method for printing: the returned object captures the
0461   /// surface and the geometry context and will print the surface
0462   /// @param gctx The current geometry context object, e.g. alignment
0463   /// @return The wrapper object for printing
0464   GeometryContextOstreamWrapper<Surface> toStream(
0465       const GeometryContext& gctx) const {
0466     return {*this, gctx};
0467   }
0468 
0469   /// Output into a std::string
0470   ///
0471   /// @param gctx The current geometry context object, e.g. alignment
0472   /// @return String representation of the surface
0473   std::string toString(const GeometryContext& gctx) const;
0474 
0475   /// Return properly formatted class name
0476   /// @return The surface class name as a string
0477   virtual std::string name() const = 0;
0478 
0479   /// Returns whether the Surface is sensitive
0480   /// @return True if the surface is sensitive
0481   bool isSensitive() const;
0482 
0483   /// Returns whether the Surface is alignable
0484   /// @return True if the surface is alignable
0485   bool isAlignable() const;
0486 
0487   /// Return a Polyhedron for surface objects
0488   ///
0489   /// @param gctx The current geometry context object, e.g. alignment
0490   /// @param quarterSegments The number of segemtns to approximate a 0.5*pi sector,
0491   /// which represents a quarter of the full circle
0492   ///
0493   /// @note In order to symmetrize the code between sectoral and closed cylinders
0494   /// in case of closed cylinders, both (-pi, pi) are given as separate vertices
0495   ///
0496   /// @note An internal surface transform can invalidate the extrema
0497   /// in the transformed space
0498   ///
0499   /// @return A list of vertices and a face/facett description of it
0500   virtual Polyhedron polyhedronRepresentation(
0501       const GeometryContext& gctx, unsigned int quarterSegments = 2u) const = 0;
0502 
0503   /// The derivative of bound track parameters w.r.t. alignment
0504   /// parameters of its reference surface (i.e. local frame origin in
0505   /// global 3D Cartesian coordinates and its rotation represented with
0506   /// extrinsic Euler angles)
0507   ///
0508   /// @param gctx The current geometry context object, e.g. alignment
0509   /// change of alignment parameters
0510   /// @param position global 3D position
0511   /// @param direction global 3D momentum direction
0512   /// @param pathDerivative is the derivative of free parameters w.r.t. path
0513   /// length
0514   ///
0515   /// @return Derivative of bound track parameters w.r.t. local frame
0516   /// alignment parameters
0517   AlignmentToBoundMatrix alignmentToBoundDerivative(
0518       const GeometryContext& gctx, const Vector3& position,
0519       const Vector3& direction, const FreeVector& pathDerivative) const;
0520 
0521   /// Calculate the derivative of path length at the geometry constraint or
0522   /// point-of-closest-approach w.r.t. alignment parameters of the surface (i.e.
0523   /// local frame origin in global 3D Cartesian coordinates and its rotation
0524   /// represented with extrinsic Euler angles)
0525   ///
0526   /// @note Re-implementation is needed for surface whose intersection with
0527   /// track is not its local xy plane, e.g. LineSurface, CylinderSurface and
0528   /// ConeSurface
0529   ///
0530   /// @param gctx The current geometry context object, e.g. alignment
0531   /// @param position global 3D position
0532   /// @param direction global 3D momentum direction
0533   ///
0534   /// @return Derivative of path length w.r.t. the alignment parameters
0535   virtual AlignmentToPathMatrix alignmentToPathDerivative(
0536       const GeometryContext& gctx, const Vector3& position,
0537       const Vector3& direction) const;
0538 
0539   /// Calculate the derivative of bound track parameters local position w.r.t.
0540   /// position in local 3D Cartesian coordinates
0541   ///
0542   /// @param gctx The current geometry context object, e.g. alignment
0543   /// @param position The position of the parameters in global
0544   ///
0545   /// @return Derivative of bound local position w.r.t. position in local 3D
0546   /// cartesian coordinates
0547   virtual Matrix<2, 3> localCartesianToBoundLocalDerivative(
0548       const GeometryContext& gctx, const Vector3& position) const = 0;
0549 
0550   /// Visualize the surface for debugging and inspection
0551   /// @param helper Visualization helper for 3D rendering
0552   /// @param gctx Geometry context for coordinate transformations
0553   /// @param viewConfig Visual configuration (color, style, etc.)
0554   void visualize(IVisualization3D& helper, const GeometryContext& gctx,
0555                  const ViewConfig& viewConfig = s_viewSurface) const;
0556 
0557  protected:
0558   /// Output Method for std::ostream, to be overloaded by child classes
0559   ///
0560   /// @param gctx The current geometry context object, e.g. alignment
0561   /// @param sl is the ostream to be dumped into
0562   /// @return Reference to the output stream for chaining
0563   virtual std::ostream& toStreamImpl(const GeometryContext& gctx,
0564                                      std::ostream& sl) const;
0565 
0566   /// Local axes of the surface
0567   /// @return An array of local axes directions
0568   virtual std::array<AxisDirection, 2> localAxes() const = 0;
0569 
0570   /// Transform surface local coordinates to material local coordinates
0571   /// @param surfaceLocal The local coordinates on the surface
0572   /// @return The corresponding local coordinates for material lookup
0573   virtual Vector2 transformSurfaceLocalToMaterialLocal(
0574       const Vector2& surfaceLocal) const;
0575 
0576   /// Transform3 definition that positions
0577   /// (translation, rotation) the surface in global space
0578   CloneablePtr<const Transform3> m_transform;
0579 
0580   /// Possibility to attach a material description
0581   std::shared_ptr<const ISurfaceMaterial> m_surfaceMaterial;
0582 
0583   /// Whether to swap the local coordinates for material lookup
0584   bool m_swapMaterialAxes{false};
0585 
0586  private:
0587   /// Pointer to the a SurfacePlacement
0588   const SurfacePlacementBase* m_placement{nullptr};
0589 
0590   /// The associated layer Layer - layer in which the Surface is be embedded,
0591   /// nullptr if not associated
0592   const Layer* m_associatedLayer{nullptr};
0593 
0594   /// Flag to indicate whether the surface is sensitive
0595   bool m_isSensitive{false};
0596 
0597   /// Thickness of the surface in the normal direction
0598   double m_thickness{0.};
0599 
0600   /// Calculate the derivative of bound track parameters w.r.t.
0601   /// alignment parameters of its reference surface (i.e. origin in global 3D
0602   /// Cartesian coordinates and its rotation represented with extrinsic Euler
0603   /// angles) without any path correction
0604   ///
0605   /// @note This function should be used together with alignment to path
0606   /// derivative to get the full alignment to bound derivatives
0607   ///
0608   /// @param gctx The current geometry context object, e.g. alignment
0609   /// @param position global 3D position
0610   /// @param direction global 3D momentum direction
0611   ///
0612   /// @return Derivative of bound track parameters w.r.t. local frame alignment
0613   /// parameters without path correction
0614   AlignmentToBoundMatrix alignmentToBoundDerivativeWithoutCorrection(
0615       const GeometryContext& gctx, const Vector3& position,
0616       const Vector3& direction) const;
0617 };
0618 
0619 }  // namespace Acts