ATLAS Offline Software
Loading...
Searching...
No Matches
TrackPropagationHelper::Imp Class Reference
Collaboration diagram for TrackPropagationHelper::Imp:

Public Member Functions

 Imp (TrackPropagationHelper *tc)
bool outsideIDVolume (const Amg::Vector3D &p) const
void movePoint1ToZPlaneAndPoint2 (Amg::Vector3D &p1, const Amg::Vector3D &p2, const double &z) const
void movePoint1ToInfiniteCylinderAndPoint2 (Amg::Vector3D &p1, const Amg::Vector3D &p2, const double &r) const
bool makePointsNeutral_SinglePar (std::vector< Amg::Vector3D > &points, const Trk::Track *)
bool makePointsCharged_SinglePar (std::vector< Amg::Vector3D > &points, const Trk::Track *, Trk::IExtrapolator *extrapolator, Trk::ParticleHypothesis hypo)
bool addPointsBetweenParameters_Charged (std::vector< Amg::Vector3D > &points, const Trk::Track *, const Trk::TrackParameters *par1, const Trk::TrackParameters *par2, Trk::IExtrapolator *extrapolator, Trk::ParticleHypothesis hypo)
const Trk::TrackParametersextrapolateToNewPar (Trk::IExtrapolator *extrapolator, const Trk::Track *trk, const Trk::TrackParameters *prevpars, Trk::ParticleHypothesis hypo, const double &dist)

Static Public Member Functions

static double maxPointDistSq (const Amg::Vector3D &)

Public Attributes

TrackPropagationHelpertheclass {}
std::unique_ptr< VP1TrackSanitytracksanity {}
const double maxInDetr {}
const double maxInDetrsq {}
const double maxz {}
const double fallback_flydist {}
std::vector< Trk::PlaneSurfacesurfaces
 For debugging.
bool showExtrapSurfaces

Detailed Description

Definition at line 36 of file TrackPropagationHelper.cxx.

Constructor & Destructor Documentation

◆ Imp()

TrackPropagationHelper::Imp::Imp ( TrackPropagationHelper * tc)
inline

Definition at line 38 of file TrackPropagationHelper.cxx.

39 : theclass(tc),
40 tracksanity(new VP1TrackSanity(tc?tc->systemBase():nullptr)),
41 maxInDetr(1.1*CLHEP::m),
43 maxz(3.5*CLHEP::m),
44 fallback_flydist(10.0*CLHEP::cm),
45 showExtrapSurfaces(VP1QtUtils::environmentVariableIsOn("VP1_TRKSYS_SHOWEXTRAPSURFACES"))
46 {
47 }
static Double_t tc
TrackPropagationHelper * theclass
std::unique_ptr< VP1TrackSanity > tracksanity
static bool environmentVariableIsOn(const QString &name)

Member Function Documentation

◆ addPointsBetweenParameters_Charged()

bool TrackPropagationHelper::Imp::addPointsBetweenParameters_Charged ( std::vector< Amg::Vector3D > & points,
const Trk::Track * trk,
const Trk::TrackParameters * par1,
const Trk::TrackParameters * par2,
Trk::IExtrapolator * extrapolator,
Trk::ParticleHypothesis hypo )

Definition at line 446 of file TrackPropagationHelper.cxx.

449{
450 double distbetween = sqrt((par2->position()-par1->position()).mag2());
451 if (distbetween<0.001) {
452 theclass->messageVerbose("TrackPropagationHelper::Imp::addPointsBetweenParameters_Charged: parameters on top of each other. Skip, but no error.");
453 return true;
454 }
455 // theclass->messageVerbose("TrackPropagationHelper::Imp::addPointsBetweenParameters_Charged: par1="
456 // +str(par1->position())+", par2=" +str(par2->position())+", dist="+str(distbetween));
457
458 Amg::Vector3D p2(par2->position());
459 const Trk::TrackParameters * prevpars = par1;
460
461 double olddistsq(1.0e99);
462 double distadded(0);
463 const double maxdistadded = std::max(2*CLHEP::m,(par1->position()-p2).mag()*1.5);
464 while ( (prevpars->position()-p2).mag()> maxPointDistSq(prevpars->position()) && distadded<maxdistadded ) {
465
466 // theclass->messageVerbose("distadded: "+str(distadded)+", distance left="+str(sqrt((prevpars->position()-p2).mag2()))+", jump="+str(maxPointDistSq(prevpars->position())));
467 const Trk::TrackParameters * newpars = extrapolateToNewPar( extrapolator, trk, prevpars, hypo, maxPointDistSq(prevpars->position()) );
468 if (!newpars){
469 if (VP1Msg::verbose())
470 theclass->messageVerbose("TrackPropagationHelper::Imp::addPointsBetweenParameters_Charged: Extrapolation failed.");
471 return false;
472 }
473 const double distsq = (par2->position()-newpars->position()).mag2();
474 if (distsq>olddistsq) {
475 delete newpars;
476 if (VP1Msg::verbose())
477 theclass->messageVerbose("TrackPropagationHelper::Imp::addPointsBetweenParameters_Charged: distq("+str(distsq)+")>olddistsq ("+str(olddistsq)+") so overshot?");
478 return false;
479 }
480 olddistsq = distsq;
481 // if ((prevpars->position()-newpars->position()).mag2() > 4*maxpointdistsq) {
482 // delete newpars;
483 // return false;
484 // }
485 points.push_back(newpars->position());
486 distadded += (newpars->position()-prevpars->position()).mag();
487 if (prevpars!=par1)
488 delete prevpars;
489 prevpars = newpars;
490 }
491 if (prevpars!=par1)
492 delete prevpars;
493 return (distadded<maxdistadded);
494}
const Trk::TrackParameters * extrapolateToNewPar(Trk::IExtrapolator *extrapolator, const Trk::Track *trk, const Trk::TrackParameters *prevpars, Trk::ParticleHypothesis hypo, const double &dist)
static double maxPointDistSq(const Amg::Vector3D &)
const Amg::Vector3D & position() const
Access method for the position.
static bool verbose()
Definition VP1Msg.h:31
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ extrapolateToNewPar()

const Trk::TrackParameters * TrackPropagationHelper::Imp::extrapolateToNewPar ( Trk::IExtrapolator * extrapolator,
const Trk::Track * trk,
const Trk::TrackParameters * prevpars,
Trk::ParticleHypothesis hypo,
const double & dist )

Definition at line 337 of file TrackPropagationHelper.cxx.

342{
343 if (!trk||!prevpars||!extrapolator)
344 return nullptr;
345
346 Trk::CurvilinearUVT uvt(prevpars->momentum().unit());
347
348
349 Amg::Transform3D t(uvt.curvU(),uvt.curvV(),uvt.curvT(), prevpars->position()+(prevpars->momentum().unit()*dist));
350
351 Trk::PlaneSurface surf(t);
352
353
354 if (showExtrapSurfaces) surfaces.push_back(surf);
355
356
357 const Trk::TrackParameters *newpars(nullptr);
358 try {
359 newpars = extrapolator->extrapolate(Gaudi::Hive::currentContext(),
360 *prevpars,
361 surf,
362 Trk::alongMomentum,false,hypo).release(); // change this to extrapolate current param to surface.
363 } catch (const std::runtime_error& e) {
364 theclass->message("Failure trying to use extrapolator for track (Exception thrown: " + QString(e.what())+")");
365 return nullptr;
366 }
367 if (!newpars) {
368 theclass->message("Failure trying to use extrapolator for track");
369 return nullptr;
370 }
371 if (!newpars) {
372 theclass->message("Failure trying to use extrapolator for track");
373 return nullptr;
374 }
375 return newpars;
376}
std::vector< Trk::PlaneSurface > surfaces
For debugging.
virtual std::unique_ptr< NeutralParameters > extrapolate(const NeutralParameters &parameters, const Surface &sf, PropDirection dir=anyDirection, const BoundaryCheck &bcheck=true) const =0
Main extrapolation Interface starting from neutral parameters and aiming at surface.
const Amg::Vector3D & momentum() const
Access method for the momentum.
Eigen::Affine3d Transform3D
@ alongMomentum

◆ makePointsCharged_SinglePar()

bool TrackPropagationHelper::Imp::makePointsCharged_SinglePar ( std::vector< Amg::Vector3D > & points,
const Trk::Track * track,
Trk::IExtrapolator * extrapolator,
Trk::ParticleHypothesis hypo )

Definition at line 384 of file TrackPropagationHelper.cxx.

386{
387 if (VP1Msg::verbose())
388 theclass->messageVerbose("makePointsCharged_SinglePar start");
389 points.clear();
390 if (!extrapolator) {
391 theclass->message("makePointsCharged_SinglePar ERROR: Null extrapolator tool provided!");
392 return false;
393 }
394 const Trk::TrackParameters * par = *(track->trackParameters()->begin());
395 if (!tracksanity->isSafe(par)) {
396 theclass->messageDebug("makePointsCharged_SinglePar called with unsafe track parameter");
397 return false;
398 }
399
400 Amg::Vector3D p0(par->position());
401 points.push_back(p0);
402 const bool startoutsideID(outsideIDVolume(p0));
403
404 double distadded(0);
405 const double maxdistadded = 2*CLHEP::m;
406 points.reserve(20);//skip a few reallocs
407 const Trk::TrackParameters * prevpars = par;
408 const Trk::TrackParameters * temppars(nullptr);
409
410 while (distadded<maxdistadded) {
411 temppars = extrapolateToNewPar( extrapolator, track, prevpars, hypo, maxPointDistSq(prevpars->position()));
412 if (temppars)
413 distadded += (temppars->position()-prevpars->position()).mag();
414 if (prevpars!=par)
415 delete prevpars;
416 prevpars = nullptr;
417 if (!temppars) {
418 theclass->messageDebug("makePointsCharged_SinglePar ERROR: Failed to use extrapolator for next point");
419 if (points.size()<2) {
420 points.clear();
421 return false;
422 }
423 return true;//Fixme??
424 }
425 Amg::Vector3D p(temppars->position());
426 points.push_back(p);
427 prevpars = temppars;
428 temppars = nullptr;
429 if (!startoutsideID && outsideIDVolume(p)) {
430 if (prevpars!=par)
431 delete prevpars;
432 prevpars = nullptr;
433 break;
434 }
435 }
436 if (prevpars!=par)
437 delete prevpars;
438
439 if (VP1Msg::verbose())
440 theclass->messageVerbose("makePointsCharged_SinglePar end");
441 return true;
442
443}
bool outsideIDVolume(const Amg::Vector3D &p) const

◆ makePointsNeutral_SinglePar()

bool TrackPropagationHelper::Imp::makePointsNeutral_SinglePar ( std::vector< Amg::Vector3D > & points,
const Trk::Track * track )

Definition at line 204 of file TrackPropagationHelper.cxx.

205{
206 if (VP1Msg::verbose())
207 theclass->messageVerbose("makePointsNeutral_SinglePar start");
208 points.clear();
209 const Trk::TrackParameters * par = *(track->trackParameters()->begin());
210 if (!tracksanity->isSafe(par)) {
211 theclass->messageDebug("makePointsNeutral_SinglePar called with unsafe track parameter");
212 return false;
213 }
214 Amg::Vector3D u(par->momentum().unit());
215 Amg::Vector3D a(par->position()),b;
216 if (outsideIDVolume(a)) {
217 //We start outside. We just add fallback_flydist. (fixme: warn?)
219 } else {
220 //Make a second point, where trajectory hits maxInDetr,maxz
221 b = a +999*CLHEP::m*u;
222 if (b.z()<-maxz)
224 else
225 if (b.z()>maxz)
227 if (b.perp2()>maxInDetrsq)
229 }
230 points.reserve(2);
231 points.push_back(a);
232 points.push_back(b);
233 if (VP1Msg::verbose())
234 theclass->messageVerbose("makePointsNeutral_SinglePar (single track parameter) end");
235 return true;
236}
static Double_t a
void movePoint1ToZPlaneAndPoint2(Amg::Vector3D &p1, const Amg::Vector3D &p2, const double &z) const
void movePoint1ToInfiniteCylinderAndPoint2(Amg::Vector3D &p1, const Amg::Vector3D &p2, const double &r) const
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ maxPointDistSq()

double TrackPropagationHelper::Imp::maxPointDistSq ( const Amg::Vector3D & )
inlinestatic

all paths return the same number const double absz(fabs(p.z())), absrsq(p.perp2()); if ( (absz<2.75*CLHEP::m) and (absrsq<(1.2*CLHEP::m)*(1.2*CLHEP::m)) ) { if ( (absz<0.67*CLHEP::m) and (absrsq<(0.16*CLHEP::m)*(0.16*CLHEP::m)) ) { return 2*CLHEPcm;//inside pixel } return 2*CLHEPcm;//ID outside pixel }

Definition at line 78 of file TrackPropagationHelper.cxx.

78 {
79 //Vertex region:
89 return 2*CLHEP::cm;//Outside ID
90 }

◆ movePoint1ToInfiniteCylinderAndPoint2()

void TrackPropagationHelper::Imp::movePoint1ToInfiniteCylinderAndPoint2 ( Amg::Vector3D & p1,
const Amg::Vector3D & p2,
const double & r ) const

Definition at line 117 of file TrackPropagationHelper.cxx.

118{
119 //Fixme: what happens here if we don't cross? And how can we be sure
120 //that we don't move FURTHER than the other point? (i.e. if the
121 //infinite line with p1 and p2 crosses, but the segment p1p2 does
122 //not!?
123 double p1r(p1.perp());
124 double dr(p2.perp()-p1r);
125 if (dr==0.0) {
126 theclass->message("movePoint1ToInfiniteCylinderAndPoint2 Error: Points have same r!!");
127 return;
128 }
129 double s((r-p1r)/dr);
130 double t(1.0-s);
131 // p1.set( p1.x()*t + p2.x()*s, p1.y()*t + p2.y()*s, p1.z()*t + p2.z()*s );
132 p1[0]= p1.x()*t + p2.x()*s;
133 //p1[1]= p2.y()*s, p1.z()*t; original
134 p1[1]= p1.y()*t + p2.y()*s; //sroe, compiler warning fix
135 p1[2]= p1.z()*t + p2.z()*s;
136}
int r
Definition globals.cxx:22

◆ movePoint1ToZPlaneAndPoint2()

void TrackPropagationHelper::Imp::movePoint1ToZPlaneAndPoint2 ( Amg::Vector3D & p1,
const Amg::Vector3D & p2,
const double & z ) const

Definition at line 101 of file TrackPropagationHelper.cxx.

102{
103 double dx(p2.x()-p1.x()), dy(p2.y()-p1.y()), dz(p2.z()-p1.z());
104 if (dz==0.0) {
105 theclass->message("movePoint1ToZPlaneAndPoint2 Error: Points have same z!!");
106 return;
107 }
108 double s( (z-p1.z())/dz );
109 // p1.set( p1.x()+dx*s, p1.y()+dy*s, z );
110 p1[0]= p1.x()+dx*s;
111 p1[1]= p1.y()+dy*s;
112 p1[2]= z;
113
114}
#define z

◆ outsideIDVolume()

bool TrackPropagationHelper::Imp::outsideIDVolume ( const Amg::Vector3D & p) const
inline

Definition at line 56 of file TrackPropagationHelper.cxx.

56 {
57 return fabs(p.z())>maxz||p.perp2()>maxInDetrsq;
58 }

Member Data Documentation

◆ fallback_flydist

const double TrackPropagationHelper::Imp::fallback_flydist {}

Definition at line 54 of file TrackPropagationHelper.cxx.

54{};

◆ maxInDetr

const double TrackPropagationHelper::Imp::maxInDetr {}

Definition at line 51 of file TrackPropagationHelper.cxx.

51{};

◆ maxInDetrsq

const double TrackPropagationHelper::Imp::maxInDetrsq {}

Definition at line 52 of file TrackPropagationHelper.cxx.

52{};

◆ maxz

const double TrackPropagationHelper::Imp::maxz {}

Definition at line 53 of file TrackPropagationHelper.cxx.

53{};

◆ showExtrapSurfaces

bool TrackPropagationHelper::Imp::showExtrapSurfaces

Definition at line 93 of file TrackPropagationHelper.cxx.

◆ surfaces

std::vector<Trk::PlaneSurface> TrackPropagationHelper::Imp::surfaces

For debugging.

Definition at line 92 of file TrackPropagationHelper.cxx.

◆ theclass

TrackPropagationHelper* TrackPropagationHelper::Imp::theclass {}

Definition at line 49 of file TrackPropagationHelper.cxx.

49{};

◆ tracksanity

std::unique_ptr<VP1TrackSanity> TrackPropagationHelper::Imp::tracksanity {}

Definition at line 50 of file TrackPropagationHelper.cxx.

50{};

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