Loading [MathJax]/extensions/tex2jax.js
 |
ATLAS Offline Software
|
#include <RungeKuttaIntersector.h>
|
| RungeKuttaIntersector (const std::string &type, const std::string &name, const IInterface *parent) |
|
virtual | ~RungeKuttaIntersector ()=default |
|
virtual StatusCode | initialize () override |
|
virtual StatusCode | finalize () override |
|
virtual std::optional< TrackSurfaceIntersection > | intersectSurface (const Surface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for general Surface type. More...
|
|
virtual std::optional< TrackSurfaceIntersection > | approachPerigeeSurface (const PerigeeSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for specific Surface type : PerigeeSurface. More...
|
|
virtual std::optional< TrackSurfaceIntersection > | approachStraightLineSurface (const StraightLineSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for specific Surface type : StraightLineSurface. More...
|
|
virtual std::optional< TrackSurfaceIntersection > | intersectCylinderSurface (const CylinderSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for specific Surface type : CylinderSurface. More...
|
|
virtual std::optional< TrackSurfaceIntersection > | intersectDiscSurface (const DiscSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for specific Surface type : DiscSurface. More...
|
|
virtual std::optional< TrackSurfaceIntersection > | intersectPlaneSurface (const PlaneSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override |
| IIntersector interface method for specific Surface type : PlaneSurface. More...
|
|
virtual bool | isValid (Amg::Vector3D, Amg::Vector3D) const override |
| IIntersector interface method for validity check over a particular extrapolation range. More...
|
|
|
void | assignStepLength (const TrackSurfaceIntersection &isect, double &stepLength) const |
|
void | debugFailure (TrackSurfaceIntersection &&isect, const Surface &surface, const double qOverP, const double rStart, const double zStart, const bool trapped) const |
|
double | distanceToCylinder (const TrackSurfaceIntersection &isect, const double cylinderRadius, const double offsetRadius, const Amg::Vector3D &offset, double &stepLength) const |
|
double | distanceToDisc (const TrackSurfaceIntersection &isect, const double discZ, double &stepLength) const |
|
double | distanceToLine (const TrackSurfaceIntersection &isect, const Amg::Vector3D &linePosition, const Amg::Vector3D &lineDirection, double &stepLength) const |
|
double | distanceToPlane (const TrackSurfaceIntersection &isect, const Amg::Vector3D &planePosition, const Amg::Vector3D &planeNormal, double &stepLength) const |
|
Amg::Vector3D | field (const Amg::Vector3D &point, MagField::AtlasFieldCache &fieldCache) const |
|
void | initializeFieldCache (MagField::AtlasFieldCache &fieldCache) const |
|
std::optional< TrackSurfaceIntersection > | newIntersection (TrackSurfaceIntersection &&isect, const Surface &surface, const double qOverP, const double rStart, const double zStart) const |
|
void | shortStep (TrackSurfaceIntersection &isect, const Amg::Vector3D &fieldValue, const double stepLength, const double qOverP) const |
|
void | step (TrackSurfaceIntersection &isect, Amg::Vector3D &fieldValue, double &stepLength, const double qOverP, MagField::AtlasFieldCache &fieldCache) const |
|
Definition at line 28 of file RungeKuttaIntersector.h.
◆ RungeKuttaIntersector()
Trk::RungeKuttaIntersector::RungeKuttaIntersector |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
const IInterface * |
parent |
|
) |
| |
◆ ~RungeKuttaIntersector()
virtual Trk::RungeKuttaIntersector::~RungeKuttaIntersector |
( |
| ) |
|
|
virtualdefault |
◆ approachPerigeeSurface()
IIntersector interface method for specific Surface type : PerigeeSurface.
Definition at line 142 of file RungeKuttaIntersector.cxx.
147 TrackSurfaceIntersection isect = trackIntersection;
149 const double rStart =
pos.perp();
150 const double zStart =
pos.z();
156 const Amg::Vector3D& lineDirection = (surface.transform().rotation()).
col(2);
157 double stepLength = 0;
160 double previousDistance = 1.1*
distance;
165 if (isTrapped(
distance, previousDistance, stepsUntilTrapped)) {
168 rStart, zStart,
true);
◆ approachStraightLineSurface()
◆ assignStepLength()
Definition at line 382 of file RungeKuttaIntersector.cxx.
386 const double sinTheta = isect.direction().perp();
391 const double zCurrent = std::abs(
pos.z());
392 const double rCurrent =
pos.perp();
406 }
else if (zCurrent >
m_inDetZ2 || sinTheta < 0.35) {
412 else if (zCurrent >
m_inDetZ1 && sinTheta < 0.60) {
435 else if (rCurrent < 1000.)
437 if (zCurrent > 700.) {
444 else if (zCurrent > 420. && sinTheta < 0.60) {
449 if (rCurrent > 900.) {
460 if (zCurrent < 3000.)
491 }
else if (
radius < 5300.) {
499 else if (
phi > 0.04 ||
550 }
else if (zCurrent < m_toroidZ0 || zCurrent >
m_toroidZ1 ||
575 if (std::abs(stepLength) < stepMax)
577 if (stepLength > 0.) {
578 stepLength = stepMax;
580 stepLength = -stepMax;
◆ debugFailure()
Definition at line 585 of file RungeKuttaIntersector.cxx.
596 const double sinTheta = isect.direction().perp();
599 const double rCurrent = isect.position().perp();
602 if (rCurrent > rStart)
604 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right)
605 <<
" fail to intersect surface when extrapolating outwards from R,Z"
606 << std::setw(8) << std::setprecision(1) << rStart <<
","
607 << std::setw(7) << std::setprecision(0) << zStart <<
" mm, with pt"
608 << std::setw(7) << std::setprecision(2) <<
pt <<
" GeV, direction eta"
609 << std::setw(5) << std::setprecision(2) << isect.direction().eta();
613 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right)
614 <<
" fail to intersect surface when extrapolating inwards from R,Z"
615 << std::setw(8) << std::setprecision(1) << rStart <<
","
616 << std::setw(7) << std::setprecision(0) << zStart <<
" mm, with pt"
617 << std::setw(7) << std::setprecision(2) <<
pt <<
" GeV, direction eta"
618 << std::setw(5) << std::setprecision(2) << isect.direction().eta();
623 if (
dynamic_cast<const PlaneSurface*
>(&surface))
625 double stepLength = 0;
626 (void)
distanceToPlane (isect, surface.center(),surface.normal(), stepLength);
627 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right) <<
" PlaneSurface"
628 <<
" at R,Z" << std::setw(8) << std::setprecision(1) << surface.center().perp() <<
","
629 << std::setw(7) << std::setprecision(0) << surface.center().z()
630 <<
" at line distance " << std::setw(9) << std::setprecision(1) << stepLength;
634 else if (
dynamic_cast<const CylinderSurface*
>(&surface))
636 double cylinderRadius = (surface.globalReferencePoint() - surface.center()).
perp();
638 double rCurrent =
offset.perp();
639 double stepLength = 0;
643 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right)
644 <<
" closest approach to CylinderSurface at radius "
645 << std::setw(9) << std::setprecision(4) << rCurrent
646 <<
" mm. Cylinder radius " << std::setw(9) << std::setprecision(4) << cylinderRadius <<
" mm"
651 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right) <<
" CylinderSurface"
652 <<
" radius " << std::setw(6) << std::setprecision(1) << cylinderRadius
653 <<
" rCurrent " << std::setw(6) << std::setprecision(1) << rCurrent
654 <<
" distance " << std::setw(6) << std::setprecision(1) << stepLength;
659 else if (
dynamic_cast<const DiscSurface*
>(&surface))
661 double stepLength = 0;
663 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right) <<
" DiscSurface"
664 <<
" at R,Z" << std::setw(8) << std::setprecision(1) << surface.center().perp() <<
","
665 << std::setw(7) << std::setprecision(0) << surface.center().z()
666 <<
" at line distance " << std::setw(9) << std::setprecision(1) << stepLength;
670 else if (
dynamic_cast<const PerigeeSurface*
>(&surface))
672 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right) <<
" PerigeeSurface "
675 else if (
dynamic_cast<const StraightLineSurface*
>(&surface))
677 log <<
MSG::DEBUG << std::setiosflags(std::ios::fixed|std::ios::right) <<
" StraightLineSurface "
◆ distanceToCylinder()
Definition at line 220 of file RungeKuttaIntersector.h.
226 double sinThsqinv = 1. /
dir.perp2();
228 double deltaRSq = (cylinderRadius - offsetRadius) *
229 (cylinderRadius + offsetRadius) * sinThsqinv +
230 stepLength * stepLength;
232 stepLength += sqrt(deltaRSq);
233 return std::abs(stepLength);
◆ distanceToDisc()
◆ distanceToLine()
Definition at line 247 of file RungeKuttaIntersector.h.
260 double cosAngle = lineDirection.dot(
dir);
261 stepLength = (linePosition -
pos).
dot(
dir - lineDirection * cosAngle) /
262 (1. - cosAngle * cosAngle);
263 return std::abs(stepLength);
◆ distanceToPlane()
◆ field()
◆ finalize()
StatusCode Trk::RungeKuttaIntersector::finalize |
( |
| ) |
|
|
overridevirtual |
Definition at line 79 of file RungeKuttaIntersector.cxx.
85 msg(MSG::INFO) << std::setiosflags(std::ios::fixed)
86 <<
" taking an average" << std::setw(7) << std::setprecision(1)
88 <<
" full steps," << std::setw(5) << std::setprecision(2)
90 <<
" step reductions and" << std::setw(5) << std::setprecision(2)
92 <<
" short final steps";
96 return StatusCode::SUCCESS;
◆ initialize()
StatusCode Trk::RungeKuttaIntersector::initialize |
( |
| ) |
|
|
overridevirtual |
◆ initializeFieldCache()
Definition at line 280 of file RungeKuttaIntersector.h.
284 if (!fieldCondObj.isValid()) {
285 ATH_MSG_FATAL(
"Failed to get magnetic field conditions data "
288 fieldCondObj->getInitializedCache(fieldCache);
◆ intersectCylinderSurface()
IIntersector interface method for specific Surface type : CylinderSurface.
Definition at line 226 of file RungeKuttaIntersector.cxx.
231 TrackSurfaceIntersection isect = trackIntersection;
233 const double rStart =
pos.perp();
234 const double zStart =
pos.z();
240 double cylinderRadius = (surface.globalReferencePoint() - surface.center()).
perp();
242 double rCurrent =
offset.perp();
243 double stepLength = 0;
246 double previousDistance = 1.1*
distance;
247 bool trapped =
false;
252 if (isTrapped(
distance, previousDistance, stepsUntilTrapped)) {
257 double rPrevious= rCurrent;
259 offset = surface.center() - isect.position();
261 double deltaR1 = rCurrent - rPrevious;
262 double deltaR2 = cylinderRadius - rCurrent;
292 rStart, zStart,
true);
◆ intersectDiscSurface()
IIntersector interface method for specific Surface type : DiscSurface.
Definition at line 298 of file RungeKuttaIntersector.cxx.
303 TrackSurfaceIntersection isect = trackIntersection;
305 const double rStart =
pos.perp();
306 const double zStart =
pos.z();
312 double stepLength = 0;
315 double previousDistance = 1.1*
distance;
320 if (isTrapped(
distance, previousDistance, stepsUntilTrapped)) {
323 rStart, zStart,
true);
◆ intersectPlaneSurface()
IIntersector interface method for specific Surface type : PlaneSurface.
Definition at line 339 of file RungeKuttaIntersector.cxx.
344 TrackSurfaceIntersection isect = trackIntersection;
346 const double rStart =
pos.perp();
347 const double zStart =
pos.z();
353 double stepLength = 0;
356 double previousDistance = 1.1*
distance;
361 if (isTrapped(
distance, previousDistance, stepsUntilTrapped)) {
364 rStart, zStart,
true);
◆ intersectSurface()
IIntersector interface method for general Surface type.
Definition at line 101 of file RungeKuttaIntersector.cxx.
112 const auto surfaceType = surface.type();
115 trackIntersection,
qOverP);
119 static_cast<const StraightLineSurface&
>(surface), trackIntersection,
124 static_cast<const CylinderSurface&
>(surface), trackIntersection,
129 trackIntersection,
qOverP);
133 trackIntersection,
qOverP);
◆ isValid()
◆ newIntersection()
Definition at line 299 of file RungeKuttaIntersector.h.
303 Intersection SLIntersect = surface.straightLineIntersection(
304 isect.position(), isect.direction(),
false,
false);
305 if (SLIntersect.valid) {
306 isect.position() = SLIntersect.position;
307 return std::move(isect);
◆ shortStep()
Definition at line 684 of file RungeKuttaIntersector.cxx.
694 double stepOverP = 0.5*stepLength*cOverP;
702 pos += stepLength*(
dir +
m_third*(product0+product1+product2));
705 dir +=
m_third*(product0+product3 + 2.*(product1+product2));
706 isect.pathlength() += stepLength;
◆ step()
Definition at line 711 of file RungeKuttaIntersector.cxx.
721 double stepOverP = 0.5*stepLength*cOverP;
728 Amg::Vector3D product1 = stepOverP*direction1.cross(fieldValue1);
730 Amg::Vector3D product2 = stepOverP*direction2.cross(fieldValue1);
737 if ((fieldValue1 - 0.5 * (
fieldValue + fieldAtEnd)).
mag() > 0.00001 &&
739 if (stepLength > 0.) {
745 stepOverP = 0.5 * stepLength * cOverP;
749 pos + 0.5 * stepLength * (
dir + 0.5 * product0);
752 product1 = stepOverP * direction1p.cross(fieldValue1p);
754 product2 = stepOverP * direction2p.cross(fieldValue1p);
757 stepLength * (
dir +
m_third * (product0 + product1 + product2));
758 fieldAtEnd =
field(
pos + offsetAtEnd, fieldCache);
762 Amg::Vector3D product3 = stepOverP * direction3.cross(fieldAtEnd);
763 dir +=
m_third * (product0 + product3 + 2. * (product1 + product2));
766 isect.pathlength() += stepLength;
◆ m_caloR0
const double Trk::RungeKuttaIntersector::m_caloR0 = 1900.*Gaudi::Units::mm |
|
private |
◆ m_caloR1
const double Trk::RungeKuttaIntersector::m_caloR1 = 2500.*Gaudi::Units::mm |
|
private |
◆ m_caloR2
const double Trk::RungeKuttaIntersector::m_caloR2 = 3500.*Gaudi::Units::mm |
|
private |
◆ m_caloR3
const double Trk::RungeKuttaIntersector::m_caloR3 = 3700.*Gaudi::Units::mm |
|
private |
◆ m_caloR4
const double Trk::RungeKuttaIntersector::m_caloR4 = 3800.*Gaudi::Units::mm |
|
private |
◆ m_caloZ0
const double Trk::RungeKuttaIntersector::m_caloZ0 = 2350.*Gaudi::Units::mm |
|
private |
◆ m_caloZ1
const double Trk::RungeKuttaIntersector::m_caloZ1 = 2600.*Gaudi::Units::mm |
|
private |
◆ m_caloZ2
const double Trk::RungeKuttaIntersector::m_caloZ2 = 3600.*Gaudi::Units::mm |
|
private |
◆ m_caloZ3
const double Trk::RungeKuttaIntersector::m_caloZ3 = 6000.*Gaudi::Units::mm |
|
private |
◆ m_countExtrapolations
std::atomic<unsigned long long> Trk::RungeKuttaIntersector::m_countExtrapolations = 0 |
|
mutableprivate |
◆ m_countShortStep
std::atomic<unsigned long long> Trk::RungeKuttaIntersector::m_countShortStep = 0 |
|
mutableprivate |
◆ m_countStep
std::atomic<unsigned long long> Trk::RungeKuttaIntersector::m_countStep = 0 |
|
mutableprivate |
◆ m_countStepReduction
std::atomic<unsigned long long> Trk::RungeKuttaIntersector::m_countStepReduction = 0 |
|
mutableprivate |
◆ m_fieldCacheCondObjInputKey
Initial value:{
this, "AtlasFieldCacheCondObj", "fieldCondObj",
"Name of the Magnetic Field conditions object key"}
Definition at line 125 of file RungeKuttaIntersector.h.
◆ m_inDetR0
const double Trk::RungeKuttaIntersector::m_inDetR0 = 400.*Gaudi::Units::mm |
|
private |
◆ m_inDetR1
const double Trk::RungeKuttaIntersector::m_inDetR1 = 350.*Gaudi::Units::mm |
|
private |
◆ m_inDetR2
const double Trk::RungeKuttaIntersector::m_inDetR2 = 800.*Gaudi::Units::mm |
|
private |
◆ m_inDetZ0
const double Trk::RungeKuttaIntersector::m_inDetZ0 = 350.*Gaudi::Units::mm |
|
private |
◆ m_inDetZ1
const double Trk::RungeKuttaIntersector::m_inDetZ1 = 420.*Gaudi::Units::mm |
|
private |
◆ m_inDetZ2
const double Trk::RungeKuttaIntersector::m_inDetZ2 = 700.*Gaudi::Units::mm |
|
private |
◆ m_momentumThreshold
const double Trk::RungeKuttaIntersector::m_momentumThreshold = 1./20.*Gaudi::Units::MeV |
|
private |
◆ m_momentumWarnThreshold
const double Trk::RungeKuttaIntersector::m_momentumWarnThreshold = 1./450.*Gaudi::Units::MeV |
|
private |
◆ m_muonR0
const double Trk::RungeKuttaIntersector::m_muonR0 = 4300.*Gaudi::Units::mm |
|
private |
◆ m_muonZ0
const double Trk::RungeKuttaIntersector::m_muonZ0 = 6600.*Gaudi::Units::mm |
|
private |
◆ m_productionMode
BooleanProperty Trk::RungeKuttaIntersector::m_productionMode {this, "ProductionMode", true} |
|
private |
◆ m_shortStepMax
double Trk::RungeKuttaIntersector::m_shortStepMax = 3.0*Gaudi::Units::mm |
|
private |
◆ m_shortStepMin
const double Trk::RungeKuttaIntersector::m_shortStepMin = 10.*Gaudi::Units::nanometer |
|
private |
◆ m_solenoidR
const double Trk::RungeKuttaIntersector::m_solenoidR = 1300.*Gaudi::Units::mm |
|
private |
◆ m_solenoidZ
const double Trk::RungeKuttaIntersector::m_solenoidZ = 3500.*Gaudi::Units::mm |
|
private |
◆ m_stepMax0
double Trk::RungeKuttaIntersector::m_stepMax0 = 8.0*Gaudi::Units::mm |
|
private |
◆ m_stepMax1
double Trk::RungeKuttaIntersector::m_stepMax1 = 40.0*Gaudi::Units::mm |
|
private |
◆ m_stepMax2
double Trk::RungeKuttaIntersector::m_stepMax2 = 80.0*Gaudi::Units::mm |
|
private |
◆ m_stepMax3
double Trk::RungeKuttaIntersector::m_stepMax3 = 160.0*Gaudi::Units::mm |
|
private |
◆ m_stepMax4
double Trk::RungeKuttaIntersector::m_stepMax4 = 320.0*Gaudi::Units::mm |
|
private |
◆ m_stepsUntilTrapped
int Trk::RungeKuttaIntersector::m_stepsUntilTrapped = 2000 |
|
private |
◆ m_third
const double Trk::RungeKuttaIntersector::m_third = 1./3. |
|
private |
◆ m_toroidR0
const double Trk::RungeKuttaIntersector::m_toroidR0 = 1850.0*Gaudi::Units::mm |
|
private |
◆ m_toroidR1
const double Trk::RungeKuttaIntersector::m_toroidR1 = 3500.0*Gaudi::Units::mm |
|
private |
◆ m_toroidR2
const double Trk::RungeKuttaIntersector::m_toroidR2 = 6000.0*Gaudi::Units::mm |
|
private |
◆ m_toroidR3
const double Trk::RungeKuttaIntersector::m_toroidR3 = 6500.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ0
const double Trk::RungeKuttaIntersector::m_toroidZ0 = 7000.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ1
const double Trk::RungeKuttaIntersector::m_toroidZ1 = 8000.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ2
const double Trk::RungeKuttaIntersector::m_toroidZ2 = 8700.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ3
const double Trk::RungeKuttaIntersector::m_toroidZ3 = 9100.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ4
const double Trk::RungeKuttaIntersector::m_toroidZ4 = 9500.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ5
const double Trk::RungeKuttaIntersector::m_toroidZ5 = 9800.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ6
const double Trk::RungeKuttaIntersector::m_toroidZ6 = 11400.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ7
const double Trk::RungeKuttaIntersector::m_toroidZ7 = 12900.0*Gaudi::Units::mm |
|
private |
◆ m_toroidZ8
const double Trk::RungeKuttaIntersector::m_toroidZ8 = 14000.0*Gaudi::Units::mm |
|
private |
The documentation for this class was generated from the following files:
double distanceToPlane(const TrackSurfaceIntersection &isect, const Amg::Vector3D &planePosition, const Amg::Vector3D &planeNormal, double &stepLength) const
const double m_momentumWarnThreshold
std::atomic< unsigned long long > m_countStepReduction
Scalar perp() const
perp method - perpenticular length
std::atomic< unsigned long long > m_countExtrapolations
BooleanProperty m_productionMode
virtual std::optional< TrackSurfaceIntersection > intersectPlaneSurface(const PlaneSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : PlaneSurface.
double distanceToCylinder(const TrackSurfaceIntersection &isect, const double cylinderRadius, const double offsetRadius, const Amg::Vector3D &offset, double &stepLength) const
Amg::Vector3D field(const Amg::Vector3D &point, MagField::AtlasFieldCache &fieldCache) const
const std::string & key() const
Return the StoreGate ID for the referenced object.
double deltaR2(double rapidity1, double phi1, double rapidity2, double phi2)
from bare rapidity,phi
const double m_momentumThreshold
msgSvc
Provide convenience handles for various services.
double distanceToDisc(const TrackSurfaceIntersection &isect, const double discZ, double &stepLength) const
void step(TrackSurfaceIntersection &isect, Amg::Vector3D &fieldValue, double &stepLength, const double qOverP, MagField::AtlasFieldCache &fieldCache) const
void shortStep(TrackSurfaceIntersection &isect, const Amg::Vector3D &fieldValue, const double stepLength, const double qOverP) const
double distanceToLine(const TrackSurfaceIntersection &isect, const Amg::Vector3D &linePosition, const Amg::Vector3D &lineDirection, double &stepLength) const
void initializeFieldCache(MagField::AtlasFieldCache &fieldCache) const
std::atomic< unsigned long long > m_countShortStep
def dot(G, fn, nodesToHighlight=[])
void assignStepLength(const TrackSurfaceIntersection &isect, double &stepLength) const
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
StatusCode initialize(bool used=true)
Eigen::Matrix< double, 3, 1 > Vector3D
virtual std::optional< TrackSurfaceIntersection > intersectCylinderSurface(const CylinderSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : CylinderSurface.
#define ATH_MSG_WARNING(x)
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...
virtual std::optional< TrackSurfaceIntersection > approachPerigeeSurface(const PerigeeSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : PerigeeSurface.
std::atomic< unsigned long long > m_countStep
virtual std::optional< TrackSurfaceIntersection > approachStraightLineSurface(const StraightLineSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : StraightLineSurface.
virtual std::optional< TrackSurfaceIntersection > intersectDiscSurface(const DiscSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : DiscSurface.
std::optional< TrackSurfaceIntersection > newIntersection(TrackSurfaceIntersection &&isect, const Surface &surface, const double qOverP, const double rStart, const double zStart) const
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
const double m_shortStepMin
Scalar mag() const
mag method
void debugFailure(TrackSurfaceIntersection &&isect, const Surface &surface, const double qOverP, const double rStart, const double zStart, const bool trapped) const