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

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

#include <CylinderSurface.h>

Inheritance diagram for GXF::CylinderSurface:
Collaboration diagram for GXF::CylinderSurface:

Public Member Functions

 CylinderSurface ()
 Default Constructor.
 CylinderSurface (const CylinderSurface &csf)
 Copy constructor.
 CylinderSurface (CylinderSurface &&csf) noexcept=default
 Move constructor.
 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.
CylinderSurfaceoperator= (const CylinderSurface &csf)
 Assignment operator.
CylinderSurfaceoperator= (CylinderSurface &&csf) noexcept=default
 Move Assignment operator.
virtual ~CylinderSurface ()
 Destructor.
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::Vector3Dnormal () const
 Returns the normal vector of the Surface (i.e.
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.

Static Public Attributes

static constexpr SurfaceType staticType = SurfaceType::Cylinder
 The surface type static constexpr.

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

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.

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() [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{}

◆ ~CylinderSurface()

Trk::CylinderSurface::~CylinderSurface ( )
virtualdefault

Destructor.

Member Function Documentation

◆ 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.

◆ 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 159 of file CylinderSurface.cxx.

161 {
162 return std::make_unique<ParametersT<5, Neutral, CylinderSurface>>(
163 position, momentum, charge, *this, std::move(cov));
164}
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 149 of file CylinderSurface.cxx.

151 {
152 return std::make_unique<ParametersT<5, Neutral, CylinderSurface>>(
153 l1, l2, phi, theta, qop, *this, std::move(cov));
154}
@ 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 139 of file CylinderSurface.cxx.

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

◆ 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 129 of file CylinderSurface.cxx.

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

◆ 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 167 of file CylinderSurface.cxx.

168{
169 if (!m_referencePoint) {
170 double rMedium = bounds().r();
171 double phi = bounds().averagePhi();
172 Amg::Vector3D gp(rMedium * cos(phi), rMedium * sin(phi), 0.);
173 m_referencePoint.set(std::make_unique<Amg::Vector3D>(transform() * gp));
174 }
175 return (*m_referencePoint);
176}
CxxUtils::CachedUniquePtr< Amg::Vector3D > m_referencePoint
The rotational symmetry axis.
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)
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Eigen::Matrix< double, 3, 1 > Vector3D

◆ globalToLocal()

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.

Definition at line 238 of file CylinderSurface.cxx.

241{
242 // get the transform & transform global position into cylinder frame
243 // transform it to the globalframe: CylinderSurfaces are allowed to have 0
244 // pointer transform
245 double radius = 0.;
246 double inttol = bounds().r() * 0.0001;
247 if (inttol < 0.01)
248 inttol = 0.01;
249 // do the transformation or not
251 Amg::Vector3D loc3Dframe(inverseTransformMultHelper(glopos));
252 locpos = Amg::Vector2D(bounds().r() * loc3Dframe.phi(), loc3Dframe.z());
253 radius = loc3Dframe.perp();
254 } else {
255 locpos = Amg::Vector2D(bounds().r() * glopos.phi(), glopos.z());
256 radius = glopos.perp();
257 }
258 // return true or false
259 return (fabs(radius - bounds().r()) <= inttol);
260}
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

◆ 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.

◆ insideBoundsCheck()

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

◆ 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.

Definition at line 263 of file CylinderSurface.cxx.

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

◆ localParametersToPosition()

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

◆ localToGlobal()

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.

Definition at line 223 of file CylinderSurface.cxx.

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

◆ 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 190 of file CylinderSurface.cxx.

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

◆ name()

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

Return properly formatted class name for screen output.

Implements Trk::Surface.

◆ 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.

◆ operator=() [1/2]

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

Assignment operator.

Definition at line 115 of file CylinderSurface.cxx.

116{
117 if (this != &csf) {
119 m_bounds = csf.m_bounds;
120 m_referencePoint.store(nullptr);
121 m_rotSymmetryAxis.store(nullptr);
122 }
123 return *this;
124}
std::shared_ptr< const CylinderBounds > m_bounds
The global reference point (== a point on the surface)
CxxUtils::CachedUniquePtr< Amg::Vector3D > m_rotSymmetryAxis
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.

Definition at line 179 of file CylinderSurface.cxx.

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

◆ 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.

◆ 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 211 of file CylinderSurface.cxx.

212{
213 if (!m_rotSymmetryAxis) {
215 m_rotSymmetryAxis.set(std::make_unique<Amg::Vector3D>(zAxis));
216 }
217 return (*m_rotSymmetryAxis);
218}

◆ 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.

Definition at line 377 of file CylinderSurface.cxx.

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

Definition at line 444 of file CylinderSurface.cxx.

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

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 277 of file CylinderSurface.cxx.

281{
282 bool needsTransform = m_transforms || m_associatedDetElement;
283 // create the hep points
284 Amg::Vector3D point1 = pos;
285 Amg::Vector3D direction = dir;
286 if (needsTransform) {
288 point1 = invTrans * pos;
289 direction = invTrans.linear() * dir;
290 }
291 // the bounds radius
292 double R = bounds().r();
293 double t1 = 0.;
294 double t2 = 0.;
295 if (direction.x()) {
296 // get line and circle constants
297 double idirx = 1. / direction.x();
298 double k = direction.y() * idirx;
299 double d = point1.y() - point1.x() * k;
300 // and solve the qaudratic equation
301 Trk::RealQuadraticEquation pquad(1 + k * k, 2 * k * d, d * d - R * R);
302 if (pquad.solutions != Trk::none) {
303 // the solutions in the 3D frame of the cylinder
304 t1 = (pquad.first - point1.x()) * idirx;
305 t2 = (pquad.second - point1.x()) * idirx;
306 } else // bail out if no solution exists
307 return {pos, 0., false};
308 } else if (direction.y()) {
309 // x value is the one of point1
310 // x^2 + y^2 = R^2
311 // y = sqrt(R^2-x^2)
312 double x = point1.x();
313 double r2mx2 = R * R - x * x;
314 // bail out if no solution
315 if (r2mx2 < 0.)
316 return {pos, 0., false};
317 double y = sqrt(r2mx2);
318 // assign parameters and solutions
319 double idiry = 1. / direction.y();
320 t1 = (y - point1.y()) * idiry;
321 t2 = (-y - point1.y()) * idiry;
322 } else {
323 return {pos, 0., false};
324 }
325 Amg::Vector3D sol1raw(point1 + t1 * direction);
326 Amg::Vector3D sol2raw(point1 + t2 * direction);
327 // now reorder and return
328 Amg::Vector3D solution(0, 0, 0);
329 double path = 0.;
330
331 // first check the validity of the direction
332 bool isValid = true;
333
334 // both solutions are of same sign, take the smaller, but flag as false if not
335 // forward
336 if (t1 * t2 > 0 || !forceDir) {
337 // asign validity
338 isValid = forceDir ? (t1 > 0.) : true;
339 // assign the right solution
340 if (t1 * t1 < t2 * t2) {
341 solution = sol1raw;
342 path = t1;
343 } else {
344 solution = sol2raw;
345 path = t2;
346 }
347 } else {
348 if (t1 > 0.) {
349 solution = sol1raw;
350 path = t1;
351 } else {
352 solution = sol2raw;
353 path = t2;
354 }
355 }
356 // the solution is still in the local 3D frame, direct check
357 isValid =
358 bchk ? (isValid && m_bounds->inside3D(solution,
361 : isValid;
362
363 // now return
364 return needsTransform ? Intersection(transform() * solution, path, isValid)
365 : Intersection(solution, path, isValid);
366}
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:126

◆ type()

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

Return the surface type.

Implements Trk::Surface.

◆ ::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_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_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.

◆ 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: