ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::CylinderSurface Class Reference

Class for a CylinderSurface in the ATLAS detector. More...

#include <CylinderSurface.h>

Inheritance diagram for Trk::CylinderSurface:
Collaboration diagram for Trk::CylinderSurface:

Public Types

using ChargedTrackParametersUniquePtr
 Unique ptr types.
using NeutralTrackParametersUniquePtr

Public Member Functions

 CylinderSurface ()
 Default Constructor.
 CylinderSurface (const CylinderSurface &csf)
 Copy constructor.
CylinderSurfaceoperator= (const CylinderSurface &csf)
 Assignment operator.
 CylinderSurface (CylinderSurface &&csf) noexcept=default
 Move constructor.
CylinderSurfaceoperator= (CylinderSurface &&csf) noexcept=default
 Move Assignment operator.
virtual ~CylinderSurface ()=default
 Destructor.
 CylinderSurface (const Amg::Transform3D &htrans, double radius, double hlength)
 Constructor from EigenTransform, radius and halflength.
 CylinderSurface (const Amg::Transform3D &htrans, double radius, double hphi, double hlength)
 Constructor from EigenTransform, radius halfphi, and halflength.
 CylinderSurface (const Amg::Transform3D &htrans, std::shared_ptr< const CylinderBounds > cbounds)
 Constructor from EigenTransform and CylinderBounds.
 CylinderSurface (const Amg::Transform3D &htrans)
 Constructor from EigenTransform from unique_ptr.
 CylinderSurface (double radius, double hlength)
 Constructor from radius and halflength - speed optimized for concentric volumes.
 CylinderSurface (double radius, double hphi, double hlength)
 Constructor from radius halfphi, and halflength - speed optimized for concentric volumes.
 CylinderSurface (std::shared_ptr< const CylinderBounds > cbounds)
 Constructor from EigenTransform and CylinderBounds.
 CylinderSurface (const CylinderSurface &csf, const Amg::Transform3D &transf)
 Copy constructor with shift.
virtual bool operator== (const Surface &sf) const override
 Equality operator.
bool operator== (const CylinderSurface &cf) const
virtual CylinderSurfaceclone () const override
 Implicit Constructor.
virtual Surface::ChargedTrackParametersUniquePtr createUniqueTrackParameters (double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
 Use the Surface as a ParametersBase constructor, from local parameters - charged.
virtual Surface::ChargedTrackParametersUniquePtr createUniqueTrackParameters (const Amg::Vector3D &position, const Amg::Vector3D &momentum, double charge, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
 Use the Surface as a ParametersBase constructor, from global parameters - charged.
virtual NeutralTrackParametersUniquePtr createUniqueNeutralParameters (double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
 Use the Surface as a ParametersBase constructor, from local parameters - neutral.
virtual NeutralTrackParametersUniquePtr createUniqueNeutralParameters (const Amg::Vector3D &position, const Amg::Vector3D &momentum, double charge, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
 Use the Surface as a ParametersBase constructor, from global parameters - neutral.
template<int DIM, class T>
std::unique_ptr< ParametersT< DIM, T, CylinderSurface > > createUniqueParameters (double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(DIM)> cov=std::nullopt) const
 Use the Surface as a ParametersBase constructor, from local parameters.
template<int DIM, class T>
std::unique_ptr< ParametersT< DIM, T, CylinderSurface > > createUniqueParameters (const Amg::Vector3D &position, const Amg::Vector3D &momentum, double charge, std::optional< AmgSymMatrix(DIM)> cov=std::nullopt) const
 Use the Surface as a ParametersBase constructor, from global parameters.
virtual Amg::RotationMatrix3D measurementFrame (const Amg::Vector3D &glopos, const Amg::Vector3D &glomom) const override final
 Return the measurement frame - this is needed for alignment, in particular for StraightLine and Perigee Surface.
virtual constexpr SurfaceType type () const override final
 Return the surface type.
virtual const Amg::Vector3DglobalReferencePoint () const override final
 Returns a global reference point: For the Cylinder this is \( (R*cos(\phi), R*sin(\phi),0)*transform() \) Where \( \phi \) denotes the averagePhi() of the cylinderBounds.
virtual Amg::Vector3D normal (const Amg::Vector2D &locpo) const override final
 Return method for surface normal information at a given local point, overwrites the normal() from base class.
virtual const Amg::Vector3DrotSymmetryAxis () const
 Return method for the rotational symmetry axis - the z-Axis of the HepTransform.
virtual const CylinderBoundsbounds () const override final
 This method returns the CylinderBounds by reference (NoBounds is not possible for cylinder)
bool hasBounds () const
virtual bool insideBounds (const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const override
 This method calls the inside method of CylinderBounds.
virtual bool insideBoundsCheck (const Amg::Vector2D &locpos, const BoundaryCheck &bchk) const override final
virtual Amg::Vector2D localParametersToPosition (const LocalParameters &locpars) const override final
 Specialized for CylinderSurface : LocalParameters to Vector2D.
virtual void localToGlobal (const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const override
 Specialized for CylinderSurface : LocalToGlobal method without dynamic memory allocation.
virtual bool globalToLocal (const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const override
 Specialized for CylinderSurface : GlobalToLocal method without dynamic memory allocation - boolean checks if on surface.
virtual bool isOnSurface (const Amg::Vector3D &glopo, const BoundaryCheck &bchk=true, double tol1=0., double tol2=0.) const override
 This method returns true if the GlobalPosition is on the Surface for both, within or without check of whether the local position is inside boundaries or not.
virtual Intersection straightLineIntersection (const Amg::Vector3D &pos, const Amg::Vector3D &dir, bool forceDir=false, Trk::BoundaryCheck bchk=false) const override final
 fast straight line intersection schema - provides closest intersection and (signed) path length
virtual DistanceSolution straightLineDistanceEstimate (const Amg::Vector3D &pos, const Amg::Vector3D &dir) const override
 fast distance to Surface
virtual DistanceSolution straightLineDistanceEstimate (const Amg::Vector3D &pos, const Amg::Vector3D &dir, bool bound) const override
 fast distance to Surface - with bounds directive
virtual double pathCorrection (const Amg::Vector3D &pos, const Amg::Vector3D &mom) const override
 the pathCorrection for derived classes with thickness
virtual std::string name () const override
 Return properly formatted class name for screen output.
virtual const Amg::Vector3Dnormal () const
 Returns the normal vector of the Surface (i.e.
bool operator!= (const Surface &sf) const
 Non-equality operator.
std::unique_ptr< SurfaceuniqueClone () const
 NVI method returning unique_ptr clone.
const Amg::Transform3DcachedTransform () const
 Return the cached transformation directly.
const Amg::Transform3Dtransform () const
 Returns HepGeom::Transform3D by reference.
const Amg::Vector3Dcenter () const
 Returns the center position of the Surface.
const TrkDetElementBaseassociatedDetectorElement () const
 return associated Detector Element
Identifier associatedDetectorElementIdentifier () const
 return Identifier of the associated Detector Element
const Trk::LayerassociatedLayer () const
 return the associated Layer
const Trk::MaterialLayermaterialLayer () const
 return the material Layer
Trk::MaterialLayermaterialLayer ()
virtual const Trk::SurfacebaseSurface () const
 return the base surface (simplified for persistification)
std::optional< Amg::Vector2DpositionOnSurface (const Amg::Vector3D &glopo, const BoundaryCheck &bchk=true, double tol1=0., double tol2=0.) const
 positionOnSurface() returns the LocalPosition on the Surface,
If BoundaryCheck==false it just returns the value of globalToLocal (including nullptr possibility), if BoundaryCheck==true it checks whether the point is inside bounds or not (returns std::nullopt in this case).
template<class T>
bool onSurface (const T &parameters, const BoundaryCheck &bchk=BoundaryCheck(true)) const
 The templated Parameters OnSurface method - checks on surface pointer first.
Amg::Vector3D localToGlobal (const Amg::Vector2D &locpos) const
 This method returns the GlobalPosition from a LocalPosition uses the per surface localToGlobal.
Amg::Vector3D localToGlobal (const Amg::Vector2D &locpos, const Amg::Vector3D &glomom) const
 This method returns the GlobalPosition from a LocalPosition The LocalPosition can be outside Surface bounds - for generality with momentum.
Amg::Vector3D localToGlobal (const LocalParameters &locpars) const
 This method returns the GlobalPosition from LocalParameters The LocalParameters can be outside Surface bounds.
Amg::Vector3D localToGlobal (const LocalParameters &locpars, const Amg::Vector3D &glomom) const
 This method returns the GlobalPosition from LocalParameters The LocalParameters can be outside Surface bounds - for generality with momentum.
std::optional< Amg::Vector2DglobalToLocal (const Amg::Vector3D &glopos, double tol=0.) const
 This method returns the LocalPosition from a provided GlobalPosition.
std::optional< Amg::Vector2DglobalToLocal (const Amg::Vector3D &glopos, const Amg::Vector3D &glomom) const
 This method returns the LocalPosition from a provided GlobalPosition.
template<typename T>
Intersection straightLineIntersection (const T &pars, bool forceDir=false, const Trk::BoundaryCheck &bchk=false) const
 fst straight line intersection schema - templated for charged and neutral parameters
bool isFree () const
 Returns 'true' if this surface is 'free', i.e.
bool isActive () const
 Return 'true' if this surface is owned by the detector element.
void setTransform (const Amg::Transform3D &trans)
 Set the transform updates center and normal.
void setOwner (SurfaceOwner x)
 set Ownership
SurfaceOwner owner () const
 return ownership
void setMaterialLayer (std::shared_ptr< Trk::MaterialLayer > mlay)
 set material layer
virtual MsgStream & dump (MsgStream &sl) const
 Output Method for MsgStream, to be overloaded by child classes.
virtual std::ostream & dump (std::ostream &sl) const
 Output Method for std::ostream, to be overloaded by child classes.
void associateLayer (const Layer &lay)
 method to associate a Trk::Layer.

Static Public Member Functions

static std::size_t numberOfInstantiations ()

Static Public Attributes

static constexpr SurfaceType staticType = SurfaceType::Cylinder
 The surface type static constexpr.
static std::atomic_size_t s_numberOfInstantiations

Protected Member Functions

Amg::Transform3D inverseTransformHelper () const
 Helper method to factorize in one place common operations calculate inverse transofrm and multiply with position.
Amg::Vector3D inverseTransformMultHelper (const Amg::Vector3D &glopos) const

Protected Attributes

std::shared_ptr< const CylinderBoundsm_bounds
 The global reference point (== a point on the surface)
CxxUtils::CachedUniquePtr< Amg::Vector3Dm_referencePoint
 The rotational symmetry axis.
CxxUtils::CachedUniquePtr< Amg::Vector3Dm_rotSymmetryAxis
std::unique_ptr< Transformsm_transforms {}
 Unique Pointer to the Transforms struct.
const TrkDetElementBasem_associatedDetElement {}
 Not owning Pointer to the Detector Element.
Identifier m_associatedDetElementId {}
 Identifier to the Detector Element.
const Layerm_associatedLayer {}
 The associated layer Trk::Layer This is the layer in which the Surface is embedded.
std::shared_ptr< MaterialLayerm_materialLayer {}
 Possibility to attach a material description to the surface.
SurfaceOwner m_owner {SurfaceOwner::noOwn}
 enum for surface owner : default free surface

Static Protected Attributes

static constexpr double s_onSurfaceTolerance = 10e-5
 Tolerance for being on Surface.

Friends

template<class SURFACE, class BOUNDS_CNV>
class ::BoundSurfaceCnv_p1
 < data members
template<class SURFACE, class BOUNDS_CNV>
class ::BoundSurfaceCnv_p2
 bounds (shared)

Detailed Description

Class for a CylinderSurface in the ATLAS detector.

It inherits from Surface.

The cylinder surface has a special role in the TrackingGeometry, since it builds the surfaces of all TrackingVolumes at container level, hence, to optimize speed in global to local transformations, constructors w/o transform is possible, assumint the identity transform to.

Todo
update for new Possibility of CylinderBounds
Author
Andre.nosp@m.as.S.nosp@m.alzbu.nosp@m.rger.nosp@m.@cern.nosp@m..ch
Christos Anastopoulos (Thread safety and interface cleanup)
Shaun Roe (interface cleanup)

Definition at line 54 of file CylinderSurface.h.

Member Typedef Documentation

◆ ChargedTrackParametersUniquePtr

Initial value:
std::unique_ptr<ParametersBase<5, Trk::Charged>>

Unique ptr types.

Definition at line 128 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

◆ NeutralTrackParametersUniquePtr

Initial value:
std::unique_ptr<ParametersBase<5, Trk::Neutral>>

Definition at line 130 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

Constructor & Destructor Documentation

◆ CylinderSurface() [1/11]

Trk::CylinderSurface::CylinderSurface ( )

Default Constructor.

Definition at line 21 of file CylinderSurface.cxx.

22 : Trk::Surface()
23 , m_bounds(nullptr)
24 , m_referencePoint(nullptr)
25 , m_rotSymmetryAxis(nullptr)
26{}
std::shared_ptr< const CylinderBounds > m_bounds
The global reference point (== a point on the surface)
CxxUtils::CachedUniquePtr< Amg::Vector3D > m_rotSymmetryAxis
CxxUtils::CachedUniquePtr< Amg::Vector3D > m_referencePoint
The rotational symmetry axis.

◆ CylinderSurface() [2/11]

Trk::CylinderSurface::CylinderSurface ( const CylinderSurface & csf)

Copy constructor.

Definition at line 29 of file CylinderSurface.cxx.

30 : Trk::Surface(csf)
31 , m_bounds(csf.m_bounds)
32 , m_referencePoint(nullptr)
33 , m_rotSymmetryAxis(nullptr)
34{}

◆ CylinderSurface() [3/11]

Trk::CylinderSurface::CylinderSurface ( CylinderSurface && csf)
defaultnoexcept

Move constructor.

◆ ~CylinderSurface()

virtual Trk::CylinderSurface::~CylinderSurface ( )
virtualdefault

Destructor.

◆ CylinderSurface() [4/11]

Trk::CylinderSurface::CylinderSurface ( const Amg::Transform3D & htrans,
double radius,
double hlength )

Constructor from EigenTransform, radius and halflength.

Definition at line 46 of file CylinderSurface.cxx.

49 : Trk::Surface(htrans)
50 , m_bounds(std::make_shared<const Trk::CylinderBounds>(radius, hlength))
51 , m_referencePoint(nullptr)
52 , m_rotSymmetryAxis(nullptr)
53{}

◆ CylinderSurface() [5/11]

Trk::CylinderSurface::CylinderSurface ( const Amg::Transform3D & htrans,
double radius,
double hphi,
double hlength )

Constructor from EigenTransform, radius halfphi, and halflength.

Definition at line 56 of file CylinderSurface.cxx.

60 : Trk::Surface(htrans)
61 , m_bounds(std::make_shared<Trk::CylinderBounds>(radius, hphi, hlength))
62 , m_referencePoint(nullptr)
63 , m_rotSymmetryAxis(nullptr)
64{}

◆ CylinderSurface() [6/11]

Trk::CylinderSurface::CylinderSurface ( const Amg::Transform3D & htrans,
std::shared_ptr< const CylinderBounds > cbounds )

Constructor from EigenTransform and CylinderBounds.

Definition at line 67 of file CylinderSurface.cxx.

69 : Trk::Surface(htrans)
70 , m_bounds(std::move(cbounds))
71 , m_referencePoint(nullptr)
72 , m_rotSymmetryAxis(nullptr)
73{
74}

◆ CylinderSurface() [7/11]

Trk::CylinderSurface::CylinderSurface ( const Amg::Transform3D & htrans)

Constructor from EigenTransform from unique_ptr.

  • bounds is not set

Definition at line 77 of file CylinderSurface.cxx.

78 : Trk::Surface(htrans)
79 , m_bounds(nullptr)
80 , m_referencePoint(nullptr)
81 , m_rotSymmetryAxis(nullptr)
82{}

◆ CylinderSurface() [8/11]

Trk::CylinderSurface::CylinderSurface ( double radius,
double hlength )

Constructor from radius and halflength - speed optimized for concentric volumes.

Definition at line 85 of file CylinderSurface.cxx.

86 : Trk::Surface()
87 , m_bounds(std::make_shared<Trk::CylinderBounds>(radius, hlength))
88 , m_referencePoint(nullptr)
89 , m_rotSymmetryAxis(nullptr)
90{}

◆ CylinderSurface() [9/11]

Trk::CylinderSurface::CylinderSurface ( double radius,
double hphi,
double hlength )

Constructor from radius halfphi, and halflength - speed optimized for concentric volumes.

Definition at line 93 of file CylinderSurface.cxx.

96 : Trk::Surface()
97 , m_bounds(std::make_shared<Trk::CylinderBounds>(radius, hphi, hlength))
98 , m_referencePoint(nullptr)
99 , m_rotSymmetryAxis(nullptr)
100{}

◆ CylinderSurface() [10/11]

Trk::CylinderSurface::CylinderSurface ( std::shared_ptr< const CylinderBounds > cbounds)

Constructor from EigenTransform and CylinderBounds.

  • ownership of the bounds is passed
  • speed optimized fron concentric volumes

Definition at line 103 of file CylinderSurface.cxx.

104 : Trk::Surface()
105 , m_bounds(std::move(cbounds))
106 , m_referencePoint(nullptr)
107 , m_rotSymmetryAxis(nullptr)
108{
109}

◆ CylinderSurface() [11/11]

Trk::CylinderSurface::CylinderSurface ( const CylinderSurface & csf,
const Amg::Transform3D & transf )

Copy constructor with shift.

Definition at line 37 of file CylinderSurface.cxx.

39 : Trk::Surface(csf, transf)
40 , m_bounds(csf.m_bounds)
41 , m_referencePoint(nullptr)
42 , m_rotSymmetryAxis(nullptr)
43{}

Member Function Documentation

◆ associatedDetectorElement()

const TrkDetElementBase * Trk::Surface::associatedDetectorElement ( ) const
inherited

return associated Detector Element

◆ associatedDetectorElementIdentifier()

Identifier Trk::Surface::associatedDetectorElementIdentifier ( ) const
inherited

return Identifier of the associated Detector Element

◆ associatedLayer()

const Trk::Layer * Trk::Surface::associatedLayer ( ) const
inherited

return the associated Layer

◆ associateLayer()

void Trk::Surface::associateLayer ( const Layer & lay)
inherited

method to associate a Trk::Layer.

We do not take ownership as this is typically already owned by the Geometry

◆ baseSurface()

virtual const Trk::Surface * Trk::Surface::baseSurface ( ) const
virtualinherited

return the base surface (simplified for persistification)

◆ bounds()

virtual const CylinderBounds & Trk::CylinderSurface::bounds ( ) const
finaloverridevirtual

This method returns the CylinderBounds by reference (NoBounds is not possible for cylinder)

Implements Trk::Surface.

◆ cachedTransform()

const Amg::Transform3D * Trk::Surface::cachedTransform ( ) const
inherited

Return the cached transformation directly.

Don't try to make a new transform if it's not here.

◆ center()

const Amg::Vector3D & Trk::Surface::center ( ) const
inherited

Returns the center position of the Surface.

◆ clone()

virtual CylinderSurface * Trk::CylinderSurface::clone ( ) const
overridevirtual

Implicit Constructor.

Implements Trk::Surface.

◆ createUniqueNeutralParameters() [1/2]

Trk::Surface::NeutralTrackParametersUniquePtr Trk::CylinderSurface::createUniqueNeutralParameters ( const Amg::Vector3D & position,
const Amg::Vector3D & momentum,
double charge,
std::optional< AmgSymMatrix(5)> cov = std::nullopt ) const
finaloverridevirtual

Use the Surface as a ParametersBase constructor, from global parameters - neutral.

Implements Trk::Surface.

Definition at line 156 of file CylinderSurface.cxx.

158 {
159 return std::make_unique<ParametersT<5, Neutral, CylinderSurface>>(
160 position, momentum, charge, *this, std::move(cov));
161}
double charge(const T &p)
Definition AtlasPID.h:997

◆ createUniqueNeutralParameters() [2/2]

Trk::Surface::NeutralTrackParametersUniquePtr Trk::CylinderSurface::createUniqueNeutralParameters ( double l1,
double l2,
double phi,
double theta,
double qop,
std::optional< AmgSymMatrix(5)> cov = std::nullopt ) const
finaloverridevirtual

Use the Surface as a ParametersBase constructor, from local parameters - neutral.

Implements Trk::Surface.

Definition at line 146 of file CylinderSurface.cxx.

148 {
149 return std::make_unique<ParametersT<5, Neutral, CylinderSurface>>(
150 l1, l2, phi, theta, qop, *this, std::move(cov));
151}
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75

◆ createUniqueParameters() [1/2]

template<int DIM, class T>
std::unique_ptr< ParametersT< DIM, T, CylinderSurface > > Trk::CylinderSurface::createUniqueParameters ( const Amg::Vector3D & position,
const Amg::Vector3D & momentum,
double charge,
std::optional< AmgSymMatrix(DIM)> cov = std::nullopt ) const

Use the Surface as a ParametersBase constructor, from global parameters.

◆ createUniqueParameters() [2/2]

template<int DIM, class T>
std::unique_ptr< ParametersT< DIM, T, CylinderSurface > > Trk::CylinderSurface::createUniqueParameters ( double l1,
double l2,
double phi,
double theta,
double qop,
std::optional< AmgSymMatrix(DIM)> cov = std::nullopt ) const

Use the Surface as a ParametersBase constructor, from local parameters.

◆ createUniqueTrackParameters() [1/2]

Trk::Surface::ChargedTrackParametersUniquePtr Trk::CylinderSurface::createUniqueTrackParameters ( const Amg::Vector3D & position,
const Amg::Vector3D & momentum,
double charge,
std::optional< AmgSymMatrix(5)> cov = std::nullopt ) const
finaloverridevirtual

Use the Surface as a ParametersBase constructor, from global parameters - charged.

Implements Trk::Surface.

Definition at line 136 of file CylinderSurface.cxx.

138 {
139 return std::make_unique<ParametersT<5, Charged, CylinderSurface>>(
140 position, momentum, charge, *this, std::move(cov));
141}

◆ createUniqueTrackParameters() [2/2]

Trk::Surface::ChargedTrackParametersUniquePtr Trk::CylinderSurface::createUniqueTrackParameters ( double l1,
double l2,
double phi,
double theta,
double qop,
std::optional< AmgSymMatrix(5)> cov = std::nullopt ) const
finaloverridevirtual

Use the Surface as a ParametersBase constructor, from local parameters - charged.

Implements Trk::Surface.

Definition at line 126 of file CylinderSurface.cxx.

128 {
129 return std::make_unique<ParametersT<5, Charged, CylinderSurface>>(
130 l1, l2, phi, theta, qop, *this, std::move(cov));
131}

◆ dump() [1/2]

MsgStream & Surface::dump ( MsgStream & sl) const
virtualinherited

Output Method for MsgStream, to be overloaded by child classes.

Reimplemented in Trk::DetElementSurface, and Trk::PerigeeSurface.

Definition at line 157 of file Surface.cxx.

158{
159 sl << std::setiosflags(std::ios::fixed);
160 sl << std::setprecision(4);
161 sl << name() << std::endl;
162 if (associatedDetectorElement()!=nullptr){
163 sl<<" Detector Type = "<<associatedDetectorElement()->detectorTypeString()<<std::endl;
164 }
165 sl << " Center position (x, y, z) = (" << center().x() << ", " << center().y() << ", " << center().z() << ")"
166 << std::endl;
168 Amg::Vector3D rotX(rot.col(0));
169 Amg::Vector3D rotY(rot.col(1));
170 Amg::Vector3D rotZ(rot.col(2));
171 sl << std::setprecision(6);
172 sl << " Rotation: colX = (" << rotX(0) << ", " << rotX(1) << ", " << rotX(2) << ")" << std::endl;
173 sl << " colY = (" << rotY(0) << ", " << rotY(1) << ", " << rotY(2) << ")" << std::endl;
174 sl << " colZ = (" << rotZ(0) << ", " << rotZ(1) << ", " << rotZ(2) << ")" << std::endl;
175 sl << " Bounds : " << bounds();
176 if (!checkTransform(*this)) {
177 sl << std::endl << " NOT a strict rotation matrix." << std::endl;
178 }
179 sl << std::setprecision(-1);
180 return sl;
181}
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
virtual const SurfaceBounds & bounds() const =0
Surface Bounds method.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
virtual std::string name() const =0
Return properly formatted class name.
std::string detectorTypeString() const
Returns a string of the Detector element type.
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Eigen::Matrix< double, 3, 1 > Vector3D

◆ dump() [2/2]

std::ostream & Surface::dump ( std::ostream & sl) const
virtualinherited

Output Method for std::ostream, to be overloaded by child classes.

Reimplemented in Trk::DetElementSurface, and Trk::PerigeeSurface.

Definition at line 185 of file Surface.cxx.

186{
187 sl << std::setiosflags(std::ios::fixed);
188 sl << std::setprecision(4);
189 sl << name() << std::endl;
190 if (associatedDetectorElement()!=nullptr){
191 sl<<" Detector Type = "<<associatedDetectorElement()->detectorTypeString()<<std::endl;
192 }
193 sl << " Center position (x, y, z) = (" << center().x() << ", " << center().y() << ", " << center().z() << ")"
194 << std::endl;
196 Amg::Vector3D rotX(rot.col(0));
197 Amg::Vector3D rotY(rot.col(1));
198 Amg::Vector3D rotZ(rot.col(2));
199 sl << std::setprecision(6);
200 sl << " Rotation: colX = (" << rotX(0) << ", " << rotX(1) << ", " << rotX(2) << ")" << std::endl;
201 sl << " colY = (" << rotY(0) << ", " << rotY(1) << ", " << rotY(2) << ")" << std::endl;
202 sl << " colZ = (" << rotZ(0) << ", " << rotZ(1) << ", " << rotZ(2) << ")" << std::endl;
203 sl << " Bounds : " << bounds();
204 if (!checkTransform(*this)) {
205 sl << std::endl << " NOT a strict rotation matrix." << std::endl;
206 }
207 sl << std::setprecision(-1);
208 return sl;
209}

◆ globalReferencePoint()

const Amg::Vector3D & Trk::CylinderSurface::globalReferencePoint ( ) const
finaloverridevirtual

Returns a global reference point: For the Cylinder this is \( (R*cos(\phi), R*sin(\phi),0)*transform() \) Where \( \phi \) denotes the averagePhi() of the cylinderBounds.

Reimplemented from Trk::Surface.

Definition at line 164 of file CylinderSurface.cxx.

165{
166 if (!m_referencePoint) {
167 double rMedium = bounds().r();
168 double phi = bounds().averagePhi();
169 Amg::Vector3D gp(rMedium * cos(phi), rMedium * sin(phi), 0.);
170 m_referencePoint.set(std::make_unique<Amg::Vector3D>(transform() * gp));
171 }
172 return (*m_referencePoint);
173}
virtual double r() const override final
This method returns the radius.
double averagePhi() const
This method returns the average phi.
virtual const CylinderBounds & bounds() const override final
This method returns the CylinderBounds by reference (NoBounds is not possible for cylinder)

◆ globalToLocal() [1/3]

bool Trk::CylinderSurface::globalToLocal ( const Amg::Vector3D & glob,
const Amg::Vector3D & mom,
Amg::Vector2D & loc ) const
overridevirtual

Specialized for CylinderSurface : GlobalToLocal method without dynamic memory allocation - boolean checks if on surface.

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface.

Definition at line 235 of file CylinderSurface.cxx.

238{
239 // get the transform & transform global position into cylinder frame
240 // transform it to the globalframe: CylinderSurfaces are allowed to have 0
241 // pointer transform
242 double radius = 0.;
243 double inttol = bounds().r() * 0.0001;
244 if (inttol < 0.01)
245 inttol = 0.01;
246 // do the transformation or not
248 Amg::Vector3D loc3Dframe(inverseTransformMultHelper(glopos));
249 locpos = Amg::Vector2D(bounds().r() * loc3Dframe.phi(), loc3Dframe.z());
250 radius = loc3Dframe.perp();
251 } else {
252 locpos = Amg::Vector2D(bounds().r() * glopos.phi(), glopos.z());
253 radius = glopos.perp();
254 }
255 // return true or false
256 return (fabs(radius - bounds().r()) <= inttol);
257}
Amg::Vector3D inverseTransformMultHelper(const Amg::Vector3D &glopos) const
std::unique_ptr< Transforms > m_transforms
Unique Pointer to the Transforms struct.
int r
Definition globals.cxx:22
Eigen::Matrix< double, 2, 1 > Vector2D

◆ globalToLocal() [2/3]

std::optional< Amg::Vector2D > Trk::Surface::globalToLocal ( const Amg::Vector3D & glopos,
const Amg::Vector3D & glomom ) const
inherited

This method returns the LocalPosition from a provided GlobalPosition.

If the GlobalPosition is not on the Surface, it returns a nullopt This method does not check if the calculated LocalPosition is inside surface bounds. If this check is needed, use positionOnSurface - for generality with momentum

◆ globalToLocal() [3/3]

std::optional< Amg::Vector2D > Trk::Surface::globalToLocal ( const Amg::Vector3D & glopos,
double tol = 0. ) const
inherited

This method returns the LocalPosition from a provided GlobalPosition.

If the GlobalPosition is not on the Surface, it returns nullopt This method does not check if the calculated LocalPosition is inside surface bounds. If this check is needed, use positionOnSurface - only for planar, cylinder surface fully defined

◆ hasBounds()

bool Trk::CylinderSurface::hasBounds ( ) const

◆ insideBounds()

virtual bool Trk::CylinderSurface::insideBounds ( const Amg::Vector2D & locpos,
double tol1 = 0.,
double tol2 = 0. ) const
overridevirtual

This method calls the inside method of CylinderBounds.

Implements Trk::Surface.

Reimplemented in Trk::SubtractedCylinderLayer, and Trk::SubtractedCylinderSurface.

◆ insideBoundsCheck()

virtual bool Trk::CylinderSurface::insideBoundsCheck ( const Amg::Vector2D & locpos,
const BoundaryCheck & bchk ) const
finaloverridevirtual

Implements Trk::Surface.

◆ inverseTransformHelper()

Amg::Transform3D Trk::Surface::inverseTransformHelper ( ) const
protectedinherited

Helper method to factorize in one place common operations calculate inverse transofrm and multiply with position.

◆ inverseTransformMultHelper()

Amg::Vector3D Trk::Surface::inverseTransformMultHelper ( const Amg::Vector3D & glopos) const
protectedinherited

◆ isActive()

bool Trk::Surface::isActive ( ) const
inherited

Return 'true' if this surface is owned by the detector element.

◆ isFree()

bool Trk::Surface::isFree ( ) const
inherited

Returns 'true' if this surface is 'free', i.e.

it does not belong to a detector element (and returns false otherwise

◆ isOnSurface()

bool Trk::CylinderSurface::isOnSurface ( const Amg::Vector3D & glopo,
const BoundaryCheck & bchk = true,
double tol1 = 0.,
double tol2 = 0. ) const
overridevirtual

This method returns true if the GlobalPosition is on the Surface for both, within or without check of whether the local position is inside boundaries or not.

Reimplemented from Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface.

Definition at line 260 of file CylinderSurface.cxx.

264{
265 Amg::Vector3D loc3Dframe =
267 return (bchk ? bounds().inside3D(loc3Dframe,
270 : true);
271}
static constexpr double s_onSurfaceTolerance
Tolerance for being on Surface.

◆ localParametersToPosition()

virtual Amg::Vector2D Trk::CylinderSurface::localParametersToPosition ( const LocalParameters & locpars) const
finaloverridevirtual

Specialized for CylinderSurface : LocalParameters to Vector2D.

Reimplemented from Trk::Surface.

◆ localToGlobal() [1/5]

ATH_FLATTEN void Trk::CylinderSurface::localToGlobal ( const Amg::Vector2D & locp,
const Amg::Vector3D & mom,
Amg::Vector3D & glob ) const
overridevirtual

Specialized for CylinderSurface : LocalToGlobal method without dynamic memory allocation.

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface.

Definition at line 220 of file CylinderSurface.cxx.

223{
224 // create the position in the local 3d frame
225 double r = bounds().r();
226 double phi = locpos[Trk::locRPhi] / r;
227 glopos = Amg::Vector3D(r * cos(phi), r * sin(phi), locpos[Trk::locZ]);
228 // transform it to the globalframe: CylinderSurfaces are allowed to have 0
229 // pointer transform
231 glopos = transform() * glopos;
232}
@ locRPhi
Definition ParamDefs.h:40
@ locZ
local cylindrical
Definition ParamDefs.h:42

◆ localToGlobal() [2/5]

Amg::Vector3D Trk::Surface::localToGlobal ( const Amg::Vector2D & locpos) const
inherited

This method returns the GlobalPosition from a LocalPosition uses the per surface localToGlobal.

◆ localToGlobal() [3/5]

Amg::Vector3D Trk::Surface::localToGlobal ( const Amg::Vector2D & locpos,
const Amg::Vector3D & glomom ) const
inherited

This method returns the GlobalPosition from a LocalPosition The LocalPosition can be outside Surface bounds - for generality with momentum.

◆ localToGlobal() [4/5]

Amg::Vector3D Trk::Surface::localToGlobal ( const LocalParameters & locpars) const
inherited

This method returns the GlobalPosition from LocalParameters The LocalParameters can be outside Surface bounds.

◆ localToGlobal() [5/5]

Amg::Vector3D Trk::Surface::localToGlobal ( const LocalParameters & locpars,
const Amg::Vector3D & glomom ) const
inherited

This method returns the GlobalPosition from LocalParameters The LocalParameters can be outside Surface bounds - for generality with momentum.

◆ materialLayer() [1/2]

Trk::MaterialLayer * Trk::Surface::materialLayer ( )
inherited

◆ materialLayer() [2/2]

const Trk::MaterialLayer * Trk::Surface::materialLayer ( ) const
inherited

return the material Layer

◆ measurementFrame()

Amg::RotationMatrix3D Trk::CylinderSurface::measurementFrame ( const Amg::Vector3D & glopos,
const Amg::Vector3D & glomom ) const
finaloverridevirtual

Return the measurement frame - this is needed for alignment, in particular for StraightLine and Perigee Surface.

Reimplemented from Trk::Surface.

Definition at line 187 of file CylinderSurface.cxx.

189{
191 // construct the measurement frame
192 Amg::Vector3D measY(
193 transform().rotation().col(2)); // measured Y is the z axis
194 Amg::Vector3D measDepth =
195 Amg::Vector3D(pos.x(), pos.y(), 0.)
196 .unit(); // measured z is the position transverse normalized
197 Amg::Vector3D measX(
198 measY.cross(measDepth).unit()); // measured X is what comoes out of it
199 // the columnes
200 mFrame.col(0) = measX;
201 mFrame.col(1) = measY;
202 mFrame.col(2) = measDepth;
203 // return the rotation matrix
204 return mFrame;
205}

◆ name()

virtual std::string Trk::CylinderSurface::name ( ) const
overridevirtual

Return properly formatted class name for screen output.

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface, and Trk::SubtractedCylinderSurface.

◆ normal() [1/2]

virtual const Amg::Vector3D & Trk::Surface::normal ( ) const
virtual

Returns the normal vector of the Surface (i.e.

in generall z-axis of rotation)

Reimplemented from Trk::Surface.

◆ normal() [2/2]

virtual Amg::Vector3D Trk::CylinderSurface::normal ( const Amg::Vector2D & locpo) const
finaloverridevirtual

Return method for surface normal information at a given local point, overwrites the normal() from base class.

Reimplemented from Trk::Surface.

◆ numberOfInstantiations()

std::size_t Trk::ObjectCounter< Trk::Surface >::numberOfInstantiations ( )
inlinestaticinherited

Definition at line 25 of file TrkObjectCounter.h.

26 {
27#ifndef NDEBUG
28 return s_numberOfInstantiations.load();
29#endif
30 return 0;
31 }
Helper to enable counting number of instantiations in debug builds.

◆ onSurface()

template<class T>
bool Trk::Surface::onSurface ( const T & parameters,
const BoundaryCheck & bchk = BoundaryCheck(true) ) const
inherited

The templated Parameters OnSurface method - checks on surface pointer first.

◆ operator!=()

bool Trk::Surface::operator!= ( const Surface & sf) const
inherited

Non-equality operator.

◆ operator=() [1/2]

Trk::CylinderSurface & Trk::CylinderSurface::operator= ( const CylinderSurface & csf)

Assignment operator.

Definition at line 112 of file CylinderSurface.cxx.

113{
114 if (this != &csf) {
116 m_bounds = csf.m_bounds;
117 m_referencePoint.store(nullptr);
118 m_rotSymmetryAxis.store(nullptr);
119 }
120 return *this;
121}
Surface & operator=(const Surface &sf)
Definition Surface.cxx:91

◆ operator=() [2/2]

CylinderSurface & Trk::CylinderSurface::operator= ( CylinderSurface && csf)
defaultnoexcept

Move Assignment operator.

◆ operator==() [1/2]

bool Trk::CylinderSurface::operator== ( const CylinderSurface & cf) const

◆ operator==() [2/2]

bool Trk::CylinderSurface::operator== ( const Surface & sf) const
overridevirtual

Equality operator.

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface, and Trk::SubtractedCylinderSurface.

Definition at line 176 of file CylinderSurface.cxx.

177{
178 // first check the type not to compare apples with oranges
179 if (sf.type()!=Trk::SurfaceType::Cylinder){
180 return false;
181 }
182 return (*this) == static_cast<const Trk::CylinderSurface&>(sf);
183}

◆ owner()

SurfaceOwner Trk::Surface::owner ( ) const
inherited

return ownership

◆ pathCorrection()

virtual double Trk::CylinderSurface::pathCorrection ( const Amg::Vector3D & pos,
const Amg::Vector3D & mom ) const
overridevirtual

the pathCorrection for derived classes with thickness

Reimplemented from Trk::Surface.

◆ positionOnSurface()

std::optional< Amg::Vector2D > Surface::positionOnSurface ( const Amg::Vector3D & glopo,
const BoundaryCheck & bchk = true,
double tol1 = 0.,
double tol2 = 0. ) const
inherited

positionOnSurface() returns the LocalPosition on the Surface,
If BoundaryCheck==false it just returns the value of globalToLocal (including nullptr possibility), if BoundaryCheck==true it checks whether the point is inside bounds or not (returns std::nullopt in this case).

Definition at line 106 of file Surface.cxx.

110{
111 std::optional<Amg::Vector2D> posOnSurface = globalToLocal(glopo, tol1);
112 if (!bchk){
113 return posOnSurface;
114 }
115 if (posOnSurface && insideBounds(*posOnSurface, tol1, tol2)){
116 return posOnSurface;
117 }
118 return std::nullopt;
119}
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
virtual bool insideBounds(const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const =0
virtual methods to be overwritten by the inherited surfaces

◆ rotSymmetryAxis()

const Amg::Vector3D & Trk::CylinderSurface::rotSymmetryAxis ( ) const
virtual

Return method for the rotational symmetry axis - the z-Axis of the HepTransform.

Definition at line 208 of file CylinderSurface.cxx.

209{
210 if (!m_rotSymmetryAxis) {
212 m_rotSymmetryAxis.set(std::make_unique<Amg::Vector3D>(zAxis));
213 }
214 return (*m_rotSymmetryAxis);
215}

◆ setMaterialLayer()

void Trk::Surface::setMaterialLayer ( std::shared_ptr< Trk::MaterialLayer > mlay)
inherited

set material layer

◆ setOwner()

void Trk::Surface::setOwner ( SurfaceOwner x)
inherited

set Ownership

◆ setTransform()

void Trk::Surface::setTransform ( const Amg::Transform3D & trans)
inherited

Set the transform updates center and normal.

◆ straightLineDistanceEstimate() [1/2]

ATH_FLATTEN Trk::DistanceSolution Trk::CylinderSurface::straightLineDistanceEstimate ( const Amg::Vector3D & pos,
const Amg::Vector3D & dir ) const
overridevirtual

fast distance to Surface

distance to surface

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface.

Definition at line 374 of file CylinderSurface.cxx.

377{
378 double tol = 0.001;
379
380 const Amg::Vector3D& X = center(); // point
381 const Amg::Vector3D& S = normal(); // vector
382
383 double radius = bounds().r();
384 double sp = pos.dot(S);
385 double sc = X.dot(S);
386 double dp = dir.dot(S);
387 Amg::Vector3D dx = X - pos - (sc - sp) * S; // vector
388 Amg::Vector3D ax = dir - dp * S; // vector
389
390 double A = ax.dot(ax); // size of projected direction (squared)
391 double B = ax.dot(dx); // dot product (->cos angle)
392 double C = dx.dot(dx); // distance to axis (squared)
393 double currDist = radius - sqrt(C);
394
395 if (A == 0.) { // direction parallel to cylinder axis
396 if (fabs(currDist) < tol) {
397 return {1, 0., true, 0.}; // solution at surface
398 }
399 return {
400 0, currDist, true, 0.}; // point of closest approach without intersection
401 }
402
403 // minimal distance to cylinder axis
404 // The [[maybe_unused]] declaration is to suppress redundant division checking
405 // here. Even a tiny change in rmin (~1e-13) can cause huge changes in the
406 // reconstructed output, so don't change how it's evaluated.
407 [[maybe_unused]] const double rmin_tmp = B * B / A;
408 const double rmin2 = C - rmin_tmp;
409 const double rmin = rmin2 < 0 ? 0 : sqrt(rmin2);
410
411 if (rmin > radius) { // no intersection
412 double first = B / A;
413 return {
414 0,
415 currDist,
416 true,
417 first}; // point of closest approach without intersection
418 }
419 if (fabs(rmin - radius) <
420 tol) { // tangential 'intersection' - return double solution
421 double first = B / A;
422 return {2, currDist, true, first, first};
423 }
424 // The [[maybe_unused]] declaration here suppresses redundant division
425 // checking. We don't want to rewrite how this is evaluated due to
426 // instabilities.
427 [[maybe_unused]] const double b_a = B / A;
428 const double x = sqrt((radius - rmin) * (radius + rmin) / A);
429 double first = b_a - x;
430 double second = b_a + x;
431 if (first >= 0.) {
432 return {2, currDist, true, first, second};
433 }
434 if (second <= 0.) {
435 return {2, currDist, true, second, first};
436 } // inside cylinder
437 return {2, currDist, true, second, first};
438}
virtual Amg::Vector3D normal(const Amg::Vector2D &locpo) const override final
Return method for surface normal information at a given local point, overwrites the normal() from bas...
struct color C
bool first
Definition DeMoScan.py:534
@ x
Definition ParamDefs.h:55

◆ straightLineDistanceEstimate() [2/2]

Trk::DistanceSolution Trk::CylinderSurface::straightLineDistanceEstimate ( const Amg::Vector3D & pos,
const Amg::Vector3D & dir,
bool bound ) const
overridevirtual

fast distance to Surface - with bounds directive

Implements Trk::Surface.

Reimplemented in Trk::SlidingCylinderSurface.

Definition at line 441 of file CylinderSurface.cxx.

444{
445 const double tolb = .01;
446
447 const Amg::Transform3D& T = transform();
448 // double Ax[3] = {T.xx(),T.yx(),T.zx()};
449 // double Ay[3] = {T.xy(),T.yy(),T.zy()};
450 // double Az[3] = {T.xz(),T.yz(),T.zz()};
451
452 // Transformation to cylinder system coordinates
453 //
454
455 // BEGIN here is what i guess this might mean: BEGIN
456 Amg::Vector3D Ax = T.rotation().col(0);
457 Amg::Vector3D Ay = T.rotation().col(1);
458 Amg::Vector3D Az = T.rotation().col(2);
459
460 Amg::Vector3D dxyz = pos - T.translation();
461 double x = dxyz.dot(Ax);
462 double y = dxyz.dot(Ay);
463 double z = dxyz.dot(Az);
464 double ax = dir.dot(Ax);
465 double ay = dir.dot(Ay);
466 double at = ax * ax + ay * ay;
467 double r = sqrt(x * x + y * y);
468 double R = bounds().r();
469
470 // END here is what i guessed this means END
471
472 // double dx = pos[0]-T.dx() ;
473 // double dy = pos[1]-T.dy() ;
474 // double dz = pos[2]-T.dz() ;
475 // double x = dx*Ax[0]+dy*Ax[1]+dz*Ax[2] ;
476 // double y = dx*Ay[0]+dy*Ay[1]+dz*Ay[2] ;
477 // double z = dx*Az[0]+dy*Az[1]+dz*Az[2] ;
478 // double ax = dir[0]*Ax[0]+dir[1]*Ax[1]+dir[2]*Ax[2];
479 // double ay = dir[0]*Ay[0]+dir[1]*Ay[1]+dir[2]*Ay[2];
480 // double at = ax*ax+ay*ay ;
481 // double r = sqrt(x*x+y*y) ;
482 // double R = bounds().r() ;
483
484 // Step to surface
485 //
486 int ns = 0;
487 double s1 = 0.;
488 double s2 = 0.;
489
490 if (at != 0.) {
491
492 const double inv_at = 1. / at;
493 double A = -(ax * x + ay * y) * inv_at;
494 double B = A * A + (R - r) * (R - r) * inv_at;
495
496 if (B >= 0.) {
497
498 B = sqrt(B);
499 if (B > tolb) {
500 if (A > 0.) {
501 s1 = A - B;
502 s2 = A + B;
503 } else {
504 s1 = A + B;
505 s2 = A - B;
506 }
507 ns = 2;
508 } else {
509 s1 = A;
510 ns = 1;
511 }
512 }
513 }
514 double sr = r - R;
515 if (!bound)
516 return {ns, fabs(sr), true, s1, s2};
517
518 // Min distance to surface
519 //
520 Amg::Vector2D lp(atan2(y, x) * R, 0.);
521
522 double d = bounds().minDistance(lp);
523 double sz = fabs(z) - bounds().halflengthZ();
524 if (sz <= 0.)
525 sz = 0.;
526 double dist = sr * sr + sz * sz;
527 if (d > 0.)
528 dist += ((d * d) * (sr / R + 1.));
529
530 return {ns, sqrt(dist), true, s1, s2};
531}
virtual double minDistance(const Amg::Vector2D &pos) const override final
Minimal distance to boundary ( > 0 if outside and <=0 if inside)
double halflengthZ() const
This method returns the halflengthZ.
Eigen::Affine3d Transform3D
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
unsigned long long T
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ y
Definition ParamDefs.h:56

◆ straightLineIntersection() [1/2]

Trk::Intersection Trk::CylinderSurface::straightLineIntersection ( const Amg::Vector3D & pos,
const Amg::Vector3D & dir,
bool forceDir = false,
Trk::BoundaryCheck bchk = false ) const
finaloverridevirtual

fast straight line intersection schema - provides closest intersection and (signed) path length

mathematical motivation:

The calculation will be done in the 3-dim frame of the cylinder, i.e. the symmetry axis of the cylinder is the z-axis, x- and y-axis are perpenticular to the the z-axis. In this frame the cylinder is centered around the origin. Therefore the two points describing the line have to be first recalculated into the new frame. Suppose, this is done, the intersection is straight forward:
may \(p_{1}=(p_{1x}, p_{1y}, p_{1z}), p_{2}=(p_{2x}, p_{2y}, p_{2z}) \)@_fakenlthe two points describing the 3D-line, then the line in the \(x-y\)plane can be written as \(y=kx+d\), where \(k =\frac{p_{2y}-p_{1y}}{p_{2x}-p_{1x}}\)such as \(d=\frac{p_{2x}p_{1y}-p_{1x}p_{2y}}{p_{2x}-p_{1x}},\)
and intersects with the corresponding circle \(x^{2}+y^{2} = R^{2}. \)
The solutions can then be found by a simple quadratic equation and reinsertion into the line equation.

Implements Trk::Surface.

Definition at line 274 of file CylinderSurface.cxx.

278{
279 bool needsTransform = m_transforms || m_associatedDetElement;
280 // create the hep points
281 Amg::Vector3D point1 = pos;
282 Amg::Vector3D direction = dir;
283 if (needsTransform) {
285 point1 = invTrans * pos;
286 direction = invTrans.linear() * dir;
287 }
288 // the bounds radius
289 double R = bounds().r();
290 double t1 = 0.;
291 double t2 = 0.;
292 if (direction.x()) {
293 // get line and circle constants
294 double idirx = 1. / direction.x();
295 double k = direction.y() * idirx;
296 double d = point1.y() - point1.x() * k;
297 // and solve the qaudratic equation
298 Trk::RealQuadraticEquation pquad(1 + k * k, 2 * k * d, d * d - R * R);
299 if (pquad.solutions != Trk::none) {
300 // the solutions in the 3D frame of the cylinder
301 t1 = (pquad.first - point1.x()) * idirx;
302 t2 = (pquad.second - point1.x()) * idirx;
303 } else // bail out if no solution exists
304 return {pos, 0., false};
305 } else if (direction.y()) {
306 // x value is the one of point1
307 // x^2 + y^2 = R^2
308 // y = sqrt(R^2-x^2)
309 double x = point1.x();
310 double r2mx2 = R * R - x * x;
311 // bail out if no solution
312 if (r2mx2 < 0.)
313 return {pos, 0., false};
314 double y = sqrt(r2mx2);
315 // assign parameters and solutions
316 double idiry = 1. / direction.y();
317 t1 = (y - point1.y()) * idiry;
318 t2 = (-y - point1.y()) * idiry;
319 } else {
320 return {pos, 0., false};
321 }
322 Amg::Vector3D sol1raw(point1 + t1 * direction);
323 Amg::Vector3D sol2raw(point1 + t2 * direction);
324 // now reorder and return
325 Amg::Vector3D solution(0, 0, 0);
326 double path = 0.;
327
328 // first check the validity of the direction
329 bool isValid = true;
330
331 // both solutions are of same sign, take the smaller, but flag as false if not
332 // forward
333 if (t1 * t2 > 0 || !forceDir) {
334 // asign validity
335 isValid = forceDir ? (t1 > 0.) : true;
336 // assign the right solution
337 if (t1 * t1 < t2 * t2) {
338 solution = sol1raw;
339 path = t1;
340 } else {
341 solution = sol2raw;
342 path = t2;
343 }
344 } else {
345 if (t1 > 0.) {
346 solution = sol1raw;
347 path = t1;
348 } else {
349 solution = sol2raw;
350 path = t2;
351 }
352 }
353 // the solution is still in the local 3D frame, direct check
354 isValid =
355 bchk ? (isValid && m_bounds->inside3D(solution,
358 : isValid;
359
360 // now return
361 return needsTransform ? Intersection(transform() * solution, path, isValid)
362 : Intersection(solution, path, isValid);
363}
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
Amg::Transform3D inverseTransformHelper() const
Helper method to factorize in one place common operations calculate inverse transofrm and multiply wi...
const TrkDetElementBase * m_associatedDetElement
Not owning Pointer to the Detector Element.
std::vector< ALFA_RawDataContainer_p1 > t2
std::vector< ALFA_RawDataCollection_p1 > t1
path
python interpreter configuration --------------------------------------—
Definition athena.py:128

◆ straightLineIntersection() [2/2]

template<typename T>
Intersection Trk::Surface::straightLineIntersection ( const T & pars,
bool forceDir = false,
const Trk::BoundaryCheck & bchk = false ) const
inlineinherited

fst straight line intersection schema - templated for charged and neutral parameters

Definition at line 352 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

356 {
358 pars.position(), pars.momentum().unit(), forceDir, bchk);
359 }
Intersection straightLineIntersection(const T &pars, bool forceDir=false, const Trk::BoundaryCheck &bchk=false) const
fst straight line intersection schema - templated for charged and neutral parameters

◆ transform()

const Amg::Transform3D & Trk::Surface::transform ( ) const
inherited

Returns HepGeom::Transform3D by reference.

◆ type()

virtual constexpr SurfaceType Trk::CylinderSurface::type ( ) const
constexprfinaloverridevirtual

Return the surface type.

Implements Trk::Surface.

◆ uniqueClone()

std::unique_ptr< Surface > Trk::Surface::uniqueClone ( ) const
inherited

NVI method returning unique_ptr clone.

◆ ::BoundSurfaceCnv_p1

template<class SURFACE, class BOUNDS_CNV>
friend class ::BoundSurfaceCnv_p1
friend

< data members

Definition at line 284 of file CylinderSurface.h.

◆ ::BoundSurfaceCnv_p2

template<class SURFACE, class BOUNDS_CNV>
friend class ::BoundSurfaceCnv_p2
friend

bounds (shared)

Definition at line 286 of file CylinderSurface.h.

Member Data Documentation

◆ m_associatedDetElement

const TrkDetElementBase* Trk::Surface::m_associatedDetElement {}
protectedinherited

Not owning Pointer to the Detector Element.

Definition at line 441 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

441{};

◆ m_associatedDetElementId

Identifier Trk::Surface::m_associatedDetElementId {}
protectedinherited

Identifier to the Detector Element.

Definition at line 443 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

443{};

◆ m_associatedLayer

const Layer* Trk::Surface::m_associatedLayer {}
protectedinherited

The associated layer Trk::Layer This is the layer in which the Surface is embedded.

so not owning pointer.

Definition at line 448 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

448{};

◆ m_bounds

std::shared_ptr<const CylinderBounds> Trk::CylinderSurface::m_bounds
protected

The global reference point (== a point on the surface)

Definition at line 289 of file CylinderSurface.h.

◆ m_materialLayer

std::shared_ptr<MaterialLayer> Trk::Surface::m_materialLayer {}
protectedinherited

Possibility to attach a material description to the surface.

In this case the surface is what holds the MaterialLayer. This is usually done for boundary surfaces so shared ptr.

Definition at line 453 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

453{};

◆ m_owner

SurfaceOwner Trk::Surface::m_owner {SurfaceOwner::noOwn}
protectedinherited

enum for surface owner : default free surface

Definition at line 455 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

◆ m_referencePoint

CxxUtils::CachedUniquePtr<Amg::Vector3D> Trk::CylinderSurface::m_referencePoint
protected

The rotational symmetry axis.

Definition at line 291 of file CylinderSurface.h.

◆ m_rotSymmetryAxis

CxxUtils::CachedUniquePtr<Amg::Vector3D> Trk::CylinderSurface::m_rotSymmetryAxis
protected

Definition at line 293 of file CylinderSurface.h.

◆ m_transforms

std::unique_ptr<Transforms> Trk::Surface::m_transforms {}
protectedinherited

Unique Pointer to the Transforms struct.

Definition at line 439 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

439{};

◆ s_numberOfInstantiations

std::atomic_size_t Trk::ObjectCounter< Trk::Surface >::s_numberOfInstantiations
inlinestaticinherited

Definition at line 22 of file TrkObjectCounter.h.

◆ s_onSurfaceTolerance

double Trk::Surface::s_onSurfaceTolerance = 10e-5
staticconstexprprotectedinherited

Tolerance for being on Surface.

Definition at line 458 of file Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h.

◆ staticType

SurfaceType Trk::CylinderSurface::staticType = SurfaceType::Cylinder
staticconstexpr

The surface type static constexpr.

Definition at line 59 of file CylinderSurface.h.


The documentation for this class was generated from the following files: