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

Class providing comparison function, or relational definition, for sorting MeasurementBase objects. More...

#include <TrackStateOnSurfaceComparisonFunction.h>

Collaboration diagram for Trk::TrackStateOnSurfaceComparisonFunction:

Public Member Functions

 TrackStateOnSurfaceComparisonFunction (double cradius)
 Default Constructor, using a given radius.
 TrackStateOnSurfaceComparisonFunction (const Amg::Vector3D &dir)
 Simple relation definition using a 3d distance to the reference point.
 TrackStateOnSurfaceComparisonFunction (const Amg::Vector3D &sp, const Amg::Vector3D &dir)
 Full relation definition using a straight line propagation.
bool operator() (const Trk::TrackStateOnSurface *one, const Trk::TrackStateOnSurface *two) const
 The comparison function defining in what case a PRD is 'smaller' than a second one.

Private Types

enum  ComparisonMode {
  RADIAL_TO_ZERO , TO_GIVEN_RADIUS , DIRECTIONAL_TO_ZERO , DIRECTIONAL_TO_POINT ,
  NMODES
}

Private Member Functions

double calculateAppropriatePath (const Trk::Surface *pSurface, const Amg::Vector3D gp) const
double pathIntersectWithPlane (const Trk::PlaneSurface *psf) const
double pathIntersectWithLine (const Trk::StraightLineSurface *lsf) const
double pathIntersectWithLine (const Trk::PerigeeSurface *pgsf) const
double pathIntersectWithDisc (const Trk::DiscSurface *dsf) const
double pathIntersectWithCylinder (const Trk::CylinderSurface *csf, const Amg::Vector3D &globalHit) const

Private Attributes

const Amg::Vector3D m_point {0.,0.,0.}
const Amg::Vector3D m_direction {0.,0.,0.}
const double m_radius {0.}
const ComparisonMode m_mode {RADIAL_TO_ZERO}

Detailed Description

Class providing comparison function, or relational definition, for sorting MeasurementBase objects.

Definition at line 37 of file TrackStateOnSurfaceComparisonFunction.h.

Member Enumeration Documentation

◆ ComparisonMode

Constructor & Destructor Documentation

◆ TrackStateOnSurfaceComparisonFunction() [1/3]

Trk::TrackStateOnSurfaceComparisonFunction::TrackStateOnSurfaceComparisonFunction ( double cradius)
inline

Default Constructor, using a given radius.

Definition at line 41 of file TrackStateOnSurfaceComparisonFunction.h.

◆ TrackStateOnSurfaceComparisonFunction() [2/3]

Trk::TrackStateOnSurfaceComparisonFunction::TrackStateOnSurfaceComparisonFunction ( const Amg::Vector3D & dir)
inline

Simple relation definition using a 3d distance to the reference point.

Definition at line 47 of file TrackStateOnSurfaceComparisonFunction.h.

◆ TrackStateOnSurfaceComparisonFunction() [3/3]

Trk::TrackStateOnSurfaceComparisonFunction::TrackStateOnSurfaceComparisonFunction ( const Amg::Vector3D & sp,
const Amg::Vector3D & dir )
inline

Full relation definition using a straight line propagation.

Definition at line 52 of file TrackStateOnSurfaceComparisonFunction.h.

Member Function Documentation

◆ calculateAppropriatePath()

double Trk::TrackStateOnSurfaceComparisonFunction::calculateAppropriatePath ( const Trk::Surface * pSurface,
const Amg::Vector3D gp ) const
inlineprivate

Definition at line 118 of file TrackStateOnSurfaceComparisonFunction.h.

118 {
119 double path{0.};
120 switch (pSurface->type()){
122 path = pathIntersectWithPlane(static_cast <const Trk::PlaneSurface*>(pSurface));
123 break;
125 path = pathIntersectWithLine(static_cast <const Trk::StraightLineSurface*>(pSurface));
126 break;
128 path = pathIntersectWithDisc(static_cast <const Trk::DiscSurface*>(pSurface));
129 break;
131 path = pathIntersectWithCylinder(static_cast <const Trk::CylinderSurface*>(pSurface), gp);
132 break;
134 path = pathIntersectWithLine(static_cast <const Trk::PerigeeSurface*>(pSurface));
135 break;
136 default:
137 std::cout << "TrackStateOnSurfaceComparisonFunction: surface type error" << std::endl;
138 }
139 return path;
140 }
virtual constexpr SurfaceType type() const =0
Returns the Surface type to avoid dynamic casts.
double pathIntersectWithPlane(const Trk::PlaneSurface *psf) const
double pathIntersectWithCylinder(const Trk::CylinderSurface *csf, const Amg::Vector3D &globalHit) const
double pathIntersectWithLine(const Trk::StraightLineSurface *lsf) const
double pathIntersectWithDisc(const Trk::DiscSurface *dsf) const
path
python interpreter configuration --------------------------------------—
Definition athena.py:128

◆ operator()()

bool Trk::TrackStateOnSurfaceComparisonFunction::operator() ( const Trk::TrackStateOnSurface * one,
const Trk::TrackStateOnSurface * two ) const
inline

The comparison function defining in what case a PRD is 'smaller' than a second one.

Definition at line 61 of file TrackStateOnSurfaceComparisonFunction.h.

61 {
62 Amg::Vector3D gp1;
63 Amg::Vector3D gp2;
64 gp1.setZero();
65 gp2.setZero();
66 const Trk::Surface* surf1 = 0;
67 const Trk::Surface* surf2 = 0;
68 if ( ! ( one->trackParameters() || one->measurementOnTrack() ) ){
69 std::cout << "TrackStateOnSurfaceComparisonFunction: input TSOS one not sufficient" << std::endl;
70 return true;
71 }
72 if ( ! ( two->trackParameters() || two->measurementOnTrack() ) ){
73 std::cout << "TrackStateOnSurfaceComparisonFunction: input TSOS two not sufficient" << std::endl;
74 return false;
75 }
76 if (one->trackParameters()){
77 gp1 = one->trackParameters()->position();
78 surf1 = &one->trackParameters()->associatedSurface();
79 if (!surf1 && one->measurementOnTrack() ) surf1 = &(one->measurementOnTrack()->associatedSurface());
80 } else if (one->measurementOnTrack()){
81 gp1 = one->measurementOnTrack()->globalPosition();
82 surf1 = &(one->measurementOnTrack()->associatedSurface());
83 }
84 if (two->trackParameters()){
85 gp2 = two->trackParameters()->position();
86 surf2 = &two->trackParameters()->associatedSurface();
87 if (!surf2 && two->measurementOnTrack() ) surf2 = &(two->measurementOnTrack()->associatedSurface());
88 } else if (two->measurementOnTrack()) {
89 gp2 = two->measurementOnTrack()->globalPosition();
90 surf2 = &(two->measurementOnTrack()->associatedSurface());
91 }
92 // --- very simple case, check radial distances
93 if (m_mode == RADIAL_TO_ZERO) {
94 return ( std::abs(gp1.perp() - m_radius)< std::abs(gp2.perp() - m_radius) );
95 }
96 // --- simple case, just use global position distances
97 else if (m_mode == TO_GIVEN_RADIUS) {
98 return ( (gp1 - m_point).mag() < (gp2 - m_point).mag());
99 } else {// --- flexible sorting along a predicted direction
100 if ( ! ( surf1 && surf2 ) ){
101 std::cout << "TrackStateOnSurfaceComparisonFunction: surface missing" << std::endl;
102 return false;
103 }
104 double path1 = calculateAppropriatePath(surf1, gp1); //note: only cylinder needs
105 double path2 = calculateAppropriatePath(surf2, gp2); //the second param.
106 return path1 < path2;
107 }
108 }
Scalar mag() const
mag method
double calculateAppropriatePath(const Trk::Surface *pSurface, const Amg::Vector3D gp) const
Eigen::Matrix< double, 3, 1 > Vector3D

◆ pathIntersectWithCylinder()

double Trk::TrackStateOnSurfaceComparisonFunction::pathIntersectWithCylinder ( const Trk::CylinderSurface * csf,
const Amg::Vector3D & globalHit ) const
inlineprivate

Definition at line 180 of file TrackStateOnSurfaceComparisonFunction.h.

181 {
182 // --- code from TrkExSlPropagator/LineCylinderIntersection.cxx
183 // get the rotation by reference
184 const Amg::Transform3D& locTrans = csf->transform();
185 // take two points of line and calculate them to the 3D frame of the cylinder
186 Amg::Vector3D point1(locTrans.inverse() * m_point);
187 Amg::Vector3D point2raw = m_point + m_direction;
188 Amg::Vector3D point2(locTrans.inverse() * point2raw); // do it in two steps - CLHEP stability
189 // new direction in 3D frame of cylinder
190 Amg::Vector3D direc((point2 - point1).unit());
191 if (!direc.x()){
192 return 0.;
193 } else {
194 // get line and circle constants
195 double k = (direc.y())/(direc.x());
196 double d = (point2.x()*point1.y() - point1.x()*point2.y())/(point2.x() - point1.x());
197 double R = csf->bounds().r();
198 double first = 0.;
199 double second= 0.;
200
201 // and solve the quadratic equation Trk::RealQuadraticEquation pquad(1+k*k, 2*k*d, d*d-R*R);
202 double a = 1 + k*k;
203 double p = 2*k*d;
204 double q = d*d - R*R;
205 double discriminant = p*p - 4*a*q;
206 if (discriminant<0) {
207 return 0.;
208 } else {
209 // solutions = (discriminant==0) ? one : two;
210 double x0 = -0.5*(p + (p>0 ? std::sqrt(discriminant) : -std::sqrt(discriminant)));
211 first = x0/a;
212 second = q/x0;
213 }
214 double t1 = (first - point1.x())/direc.x();
215 double t2 = (second - point1.x())/direc.x();
216 // the solutions in the 3D frame of the cylinder
217 Amg::Vector3D dist1raw(point1 + t1 * direc - globalHit);
218 Amg::Vector3D dist2raw(point1 + t2 * direc - globalHit);
219 // return the solution which is closer to Meas'Base's global coordinates
220 if ( dist1raw.mag() < dist2raw.mag() ) {
221 return t1; // FIXME - wrong line parameterisation
222 } else {
223 return t2;
224 }
225 }
226 }
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
static Double_t a
virtual double r() const override final
This method returns the radius.
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.
std::vector< ALFA_RawDataContainer_p1 > t2
std::vector< ALFA_RawDataCollection_p1 > t1
Eigen::Affine3d Transform3D
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
bool first
Definition DeMoScan.py:534

◆ pathIntersectWithDisc()

double Trk::TrackStateOnSurfaceComparisonFunction::pathIntersectWithDisc ( const Trk::DiscSurface * dsf) const
inlineprivate

Definition at line 173 of file TrackStateOnSurfaceComparisonFunction.h.

173 {
174 double denom = m_direction.dot(dsf->normal());
175 return denom ? dsf->normal().dot(dsf->center() - m_point)/denom :
176 denom;
177 }
virtual const Amg::Vector3D & normal() const
Returns the normal vector of the Surface (i.e.
const Amg::Vector3D & center() const
Returns the center position of the Surface.

◆ pathIntersectWithLine() [1/2]

double Trk::TrackStateOnSurfaceComparisonFunction::pathIntersectWithLine ( const Trk::PerigeeSurface * pgsf) const
inlineprivate

Definition at line 163 of file TrackStateOnSurfaceComparisonFunction.h.

163 {
164 Amg::Vector3D trackToWire(pgsf->center() - m_point);
165 double parallelity = m_direction.dot(Trk::s_zAxis);
166 double denom = 1 - parallelity*parallelity;
167 return (std::abs(denom)>10e-7) ?
168 (trackToWire.dot(m_direction)- trackToWire.dot(Trk::s_zAxis) * parallelity)/denom :
169 0.;
170 }
static const Amg::Vector3D s_zAxis(0, 0, 1)
global z Axis;

◆ pathIntersectWithLine() [2/2]

double Trk::TrackStateOnSurfaceComparisonFunction::pathIntersectWithLine ( const Trk::StraightLineSurface * lsf) const
inlineprivate

Definition at line 151 of file TrackStateOnSurfaceComparisonFunction.h.

151 {
152 Amg::Vector3D dirWire(lsf->transform().rotation().col(2).unit());
153 Amg::Vector3D trackToWire(lsf->center() - m_point);
154 double parallelity = m_direction.dot(dirWire);
155 double denom = 1 - parallelity*parallelity;
156 return (std::abs(denom)>10e-7) ?
157 (trackToWire.dot(m_direction)
158 - trackToWire.dot(dirWire)*parallelity)/denom :
159 0. ;
160 }

◆ pathIntersectWithPlane()

double Trk::TrackStateOnSurfaceComparisonFunction::pathIntersectWithPlane ( const Trk::PlaneSurface * psf) const
inlineprivate

Definition at line 144 of file TrackStateOnSurfaceComparisonFunction.h.

144 {
145 double denom = m_direction.dot(psf->normal()); // c++ can be unreadable
146 return denom ?psf->normal().dot(psf->center() - m_point)/denom :
147 denom ;
148 }

Member Data Documentation

◆ m_direction

const Amg::Vector3D Trk::TrackStateOnSurfaceComparisonFunction::m_direction {0.,0.,0.}
private

Definition at line 113 of file TrackStateOnSurfaceComparisonFunction.h.

113{0.,0.,0.};

◆ m_mode

const ComparisonMode Trk::TrackStateOnSurfaceComparisonFunction::m_mode {RADIAL_TO_ZERO}
private

Definition at line 115 of file TrackStateOnSurfaceComparisonFunction.h.

◆ m_point

const Amg::Vector3D Trk::TrackStateOnSurfaceComparisonFunction::m_point {0.,0.,0.}
private

Definition at line 112 of file TrackStateOnSurfaceComparisonFunction.h.

112{0.,0.,0.};

◆ m_radius

const double Trk::TrackStateOnSurfaceComparisonFunction::m_radius {0.}
private

Definition at line 114 of file TrackStateOnSurfaceComparisonFunction.h.

114{0.};

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