ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::StraightLineIntersector Class Referencefinal

#include <StraightLineIntersector.h>

Inheritance diagram for Trk::StraightLineIntersector:
Collaboration diagram for Trk::StraightLineIntersector:

Public Member Functions

 StraightLineIntersector (const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode finalize () override
virtual std::optional< TrackSurfaceIntersectionintersectSurface (const Surface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double qOverP) const override
 IIntersector interface method for general Surface type.
virtual std::optional< TrackSurfaceIntersectionapproachPerigeeSurface (const PerigeeSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
 IIntersector interface method for specific Surface type : PerigeeSurface.
virtual std::optional< TrackSurfaceIntersectionapproachStraightLineSurface (const StraightLineSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
 IIntersector interface method for specific Surface type : StraightLineSurface.
virtual std::optional< TrackSurfaceIntersectionintersectCylinderSurface (const CylinderSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
 IIntersector interface method for specific Surface type : CylinderSurface.
virtual std::optional< TrackSurfaceIntersectionintersectDiscSurface (const DiscSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
 IIntersector interface method for specific Surface type : DiscSurface.
virtual std::optional< TrackSurfaceIntersectionintersectPlaneSurface (const PlaneSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
 IIntersector interface method for specific Surface type : PlaneSurface.
virtual bool isValid (Amg::Vector3D, Amg::Vector3D) const override
 IIntersector interface method for validity check over a particular extrapolation range.

Private Member Functions

double distanceToCylinder (const TrackSurfaceIntersection &isect, const double cylinderRadius) const
double distanceToDisc (const TrackSurfaceIntersection &isect, const double discZ) const
double distanceToLine (const TrackSurfaceIntersection &isect, const Amg::Vector3D &linePosition, const Amg::Vector3D &lineDirection) const
double distanceToPlane (const TrackSurfaceIntersection &isect, const Amg::Vector3D &planePosition, const Amg::Vector3D &planeNormal) const
void step (TrackSurfaceIntersection &isect, double stepLength) const

Private Attributes

std::atomic< unsigned long long > m_countExtrapolations

Detailed Description

Definition at line 22 of file StraightLineIntersector.h.

Constructor & Destructor Documentation

◆ StraightLineIntersector()

Trk::StraightLineIntersector::StraightLineIntersector ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 26 of file StraightLineIntersector.cxx.

29 : base_class (type, name, parent),
31{
32}
std::atomic< unsigned long long > m_countExtrapolations

Member Function Documentation

◆ approachPerigeeSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::approachPerigeeSurface ( const PerigeeSurface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double  ) const
overridevirtual

IIntersector interface method for specific Surface type : PerigeeSurface.

Definition at line 78 of file StraightLineIntersector.cxx.

81{
82 TrackSurfaceIntersection isect = trackIntersection;
84
85 // straight line distance along track to closest approach to line
86 const Amg::Vector3D& lineDirection = surface.transform().rotation().col(2);
87 double stepLength = distanceToLine (isect, surface.center(),lineDirection);
88 step(isect, stepLength);
89
90 return isect;
91}
void step(TrackSurfaceIntersection &isect, double stepLength) const
double distanceToLine(const TrackSurfaceIntersection &isect, const Amg::Vector3D &linePosition, const Amg::Vector3D &lineDirection) const
Eigen::Matrix< double, 3, 1 > Vector3D

◆ approachStraightLineSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::approachStraightLineSurface ( const StraightLineSurface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double  ) const
overridevirtual

IIntersector interface method for specific Surface type : StraightLineSurface.

Definition at line 95 of file StraightLineIntersector.cxx.

98{
99 TrackSurfaceIntersection isect = trackIntersection;
101
102 // straight line distance along track to closest approach to line
103 const Amg::Vector3D& lineDirection = surface.transform().rotation().col(2);
104 double stepLength = distanceToLine (isect, surface.center(),lineDirection);
105 step(isect, stepLength);
106
107 return isect;
108}

◆ distanceToCylinder()

double Trk::StraightLineIntersector::distanceToCylinder ( const TrackSurfaceIntersection & isect,
const double cylinderRadius ) const
inlineprivate

Definition at line 95 of file StraightLineIntersector.h.

96 {
97 const Amg::Vector3D& pos = isect.position();
98 const Amg::Vector3D& dir = isect.direction();
99 double sinThsqinv = 1. / dir.perp2();
100 double stepLength = (-pos.x() * dir.x() - pos.y() * dir.y()) * sinThsqinv;
101 double deltaRSq =
102 (cylinderRadius * cylinderRadius - pos.perp2()) * sinThsqinv +
103 stepLength * stepLength;
104 if (deltaRSq > 0.)
105 stepLength += sqrt(deltaRSq);
106 return stepLength;
107}

◆ distanceToDisc()

double Trk::StraightLineIntersector::distanceToDisc ( const TrackSurfaceIntersection & isect,
const double discZ ) const
inlineprivate

Definition at line 109 of file StraightLineIntersector.h.

110 {
111 const Amg::Vector3D& pos = isect.position();
112 const Amg::Vector3D& dir = isect.direction();
113 return (discZ - pos.z()) / dir.z();
114}

◆ distanceToLine()

double Trk::StraightLineIntersector::distanceToLine ( const TrackSurfaceIntersection & isect,
const Amg::Vector3D & linePosition,
const Amg::Vector3D & lineDirection ) const
inlineprivate

Definition at line 116 of file StraightLineIntersector.h.

118 {
119 // offset joining track to line is given by
120 // offset = linePosition + a*lineDirection - trackPosition -
121 // b*trackDirection
122 //
123 // offset is perpendicular to both line and track at solution i.e.
124 // lineDirection.dot(offset) = 0
125 // trackDirection.dot(offset) = 0
126 const Amg::Vector3D& pos = isect.position();
127 const Amg::Vector3D& dir = isect.direction();
128 double cosAngle = lineDirection.dot(dir);
129 return (linePosition - pos).dot(dir - lineDirection * cosAngle) /
130 (1. - cosAngle * cosAngle);
131}

◆ distanceToPlane()

double Trk::StraightLineIntersector::distanceToPlane ( const TrackSurfaceIntersection & isect,
const Amg::Vector3D & planePosition,
const Amg::Vector3D & planeNormal ) const
inlineprivate

Definition at line 133 of file StraightLineIntersector.h.

135 {
136 // take the normal component of the offset from track position to plane
137 // position this is equal to the normal component of the required distance
138 // along the track direction
139 const Amg::Vector3D& pos = isect.position();
140 const Amg::Vector3D& dir = isect.direction();
141 return planeNormal.dot(planePosition - pos) / planeNormal.dot(dir);
142}

◆ finalize()

StatusCode Trk::StraightLineIntersector::finalize ( )
overridevirtual

Definition at line 35 of file StraightLineIntersector.cxx.

36{
37 ATH_MSG_DEBUG( "finalized after " << m_countExtrapolations << " extrapolations" );
38 return StatusCode::SUCCESS;
39}
#define ATH_MSG_DEBUG(x)

◆ intersectCylinderSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::intersectCylinderSurface ( const CylinderSurface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double  ) const
overridevirtual

IIntersector interface method for specific Surface type : CylinderSurface.

Definition at line 112 of file StraightLineIntersector.cxx.

115{
116 TrackSurfaceIntersection isect = trackIntersection;
118
119 // calculate straight line distance along track to intersect with cylinder radius
120 double cylinderRadius = surface.globalReferencePoint().perp();
121 double stepLength = distanceToCylinder(isect, cylinderRadius);
122 step(isect, stepLength);
123
124 return isect;
125}
double distanceToCylinder(const TrackSurfaceIntersection &isect, const double cylinderRadius) const

◆ intersectDiscSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::intersectDiscSurface ( const DiscSurface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double  ) const
overridevirtual

IIntersector interface method for specific Surface type : DiscSurface.

Definition at line 129 of file StraightLineIntersector.cxx.

132{
133 TrackSurfaceIntersection isect = trackIntersection;
135
136 // straight line distance along track to intersect with disc
137 double stepLength = distanceToDisc(isect, surface.center().z());
138 step(isect, stepLength);
139
140 return isect;
141}
double distanceToDisc(const TrackSurfaceIntersection &isect, const double discZ) const

◆ intersectPlaneSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::intersectPlaneSurface ( const PlaneSurface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double  ) const
overridevirtual

IIntersector interface method for specific Surface type : PlaneSurface.

Definition at line 145 of file StraightLineIntersector.cxx.

148{
149 TrackSurfaceIntersection isect = trackIntersection;
151
152 // straight line distance along track to intersect with plane
153 double stepLength = distanceToPlane (isect, surface.center(),surface.normal());
154 step(isect, stepLength);
155 stepLength = distanceToPlane (isect, surface.center(),surface.normal());
156
157 return isect;
158}
double distanceToPlane(const TrackSurfaceIntersection &isect, const Amg::Vector3D &planePosition, const Amg::Vector3D &planeNormal) const

◆ intersectSurface()

std::optional< Trk::TrackSurfaceIntersection > Trk::StraightLineIntersector::intersectSurface ( const Surface & surface,
const TrackSurfaceIntersection & trackTrackSurfaceIntersection,
const double qOverP ) const
overridevirtual

IIntersector interface method for general Surface type.

Definition at line 43 of file StraightLineIntersector.cxx.

46{
47
48 const auto surfaceType = surface.type();
49 if (surfaceType == Trk::SurfaceType::Plane) {
50 return intersectPlaneSurface(static_cast<const PlaneSurface&>(surface),
51 trackIntersection, qOverP);
52 }
53 if (surfaceType == Trk::SurfaceType::Line) {
55 static_cast<const StraightLineSurface&>(surface), trackIntersection,
56 qOverP);
57 }
58 if (surfaceType == Trk::SurfaceType::Cylinder) {
60 static_cast<const CylinderSurface&>(surface), trackIntersection,
61 qOverP);
62 }
63 if (surfaceType == Trk::SurfaceType::Disc) {
64 return intersectDiscSurface(static_cast<const DiscSurface&>(surface),
65 trackIntersection, qOverP);
66 }
67 if (surfaceType == Trk::SurfaceType::Perigee) {
68 return approachPerigeeSurface(static_cast<const PerigeeSurface&>(surface),
69 trackIntersection, qOverP);
70 }
71
72 ATH_MSG_WARNING( " unrecognized Surface" );
73 return std::nullopt;
74}
#define ATH_MSG_WARNING(x)
virtual std::optional< TrackSurfaceIntersection > approachStraightLineSurface(const StraightLineSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
IIntersector interface method for specific Surface type : StraightLineSurface.
virtual std::optional< TrackSurfaceIntersection > approachPerigeeSurface(const PerigeeSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
IIntersector interface method for specific Surface type : PerigeeSurface.
virtual std::optional< TrackSurfaceIntersection > intersectPlaneSurface(const PlaneSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
IIntersector interface method for specific Surface type : PlaneSurface.
virtual std::optional< TrackSurfaceIntersection > intersectCylinderSurface(const CylinderSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
IIntersector interface method for specific Surface type : CylinderSurface.
virtual std::optional< TrackSurfaceIntersection > intersectDiscSurface(const DiscSurface &surface, const TrackSurfaceIntersection &trackTrackSurfaceIntersection, const double) const override
IIntersector interface method for specific Surface type : DiscSurface.
@ qOverP
perigee
Definition ParamDefs.h:67

◆ isValid()

virtual bool Trk::StraightLineIntersector::isValid ( Amg::Vector3D ,
Amg::Vector3D  ) const
inlineoverridevirtual

IIntersector interface method for validity check over a particular extrapolation range.

Definition at line 70 of file StraightLineIntersector.h.

71 {
72 return true;
73 }

◆ step()

void Trk::StraightLineIntersector::step ( TrackSurfaceIntersection & isect,
double stepLength ) const
inlineprivate

Definition at line 144 of file StraightLineIntersector.h.

145 {
146 isect.position() += stepLength * isect.direction();
147 isect.pathlength() += stepLength;
148}

Member Data Documentation

◆ m_countExtrapolations

std::atomic<unsigned long long> Trk::StraightLineIntersector::m_countExtrapolations
mutableprivate

Definition at line 90 of file StraightLineIntersector.h.


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