|
ATLAS Offline Software
|
Go to the documentation of this file.
10 #ifndef TRKEXRUNGEKUTTAINTERSECTOR_RUNGEKUTTAINTERSECTOR_H
11 #define TRKEXRUNGEKUTTAINTERSECTOR_RUNGEKUTTAINTERSECTOR_H
17 #include "GaudiKernel/PhysicalConstants.h"
18 #include "GaudiKernel/ToolHandle.h"
41 const double qOverP)
const override;
47 const double qOverP)
const override;
54 const double qOverP)
const override;
61 const double qOverP)
const override;
67 const double qOverP)
const override;
73 const double qOverP)
const override;
85 double& stepLength)
const;
88 const double rStart,
const double zStart,
89 const bool trapped)
const;
91 const double cylinderRadius,
92 const double offsetRadius,
94 double& stepLength)
const;
96 const double discZ,
double& stepLength)
const;
101 double& stepLength)
const;
106 double& stepLength)
const;
115 const double qOverP,
const double rStart,
const double zStart)
const;
119 const double qOverP)
const;
122 double& stepLength,
const double qOverP,
126 this,
"AtlasFieldCacheCondObj",
"fieldCondObj",
127 "Name of the Magnetic Field conditions object key"};
189 double& stepLength)
const {
192 double sinThsqinv = 1. /
dir.perp2();
194 double deltaRSq = (cylinderRadius - offsetRadius) *
195 (cylinderRadius + offsetRadius) * sinThsqinv +
196 stepLength * stepLength;
198 stepLength += sqrt(deltaRSq);
199 return std::abs(stepLength);
204 double& stepLength)
const {
215 const Amg::Vector3D& lineDirection,
double& stepLength)
const {
226 double cosAngle = lineDirection.dot(
dir);
227 stepLength = (linePosition -
pos).
dot(
dir - lineDirection * cosAngle) /
228 (1. - cosAngle * cosAngle);
229 return std::abs(stepLength);
234 const Amg::Vector3D& planeNormal,
double& stepLength)
const {
241 double distance = planeNormal.dot(planePosition -
pos);
250 if (!fieldCondObj.isValid()) {
251 ATH_MSG_FATAL(
"Failed to get magnetic field conditions data "
254 fieldCondObj->getInitializedCache(fieldCache);
267 const double qOverP,
const double rStart,
const double zStart)
const {
270 isect.position(), isect.direction(),
false,
false);
271 if (SLIntersect.
valid) {
273 return std::move(isect);
286 #endif // TRKEXRUNGEKUTTAINTERSECTOR_RUNGEKUTTAINTERSECTOR_H
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
Intersection straightLineIntersection(const T &pars, bool forceDir=false, const Trk::BoundaryCheck &bchk=false) const
fst straight line intersection schema - templated for charged and neutral parameters
std::atomic< unsigned long long > m_countExtrapolations
virtual StatusCode finalize() override
virtual ~RungeKuttaIntersector()=default
virtual std::optional< TrackSurfaceIntersection > intersectPlaneSurface(const PlaneSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : PlaneSurface.
virtual StatusCode initialize() override
double distanceToCylinder(const TrackSurfaceIntersection &isect, const double cylinderRadius, const double offsetRadius, const Amg::Vector3D &offset, double &stepLength) const
RungeKuttaIntersector(const std::string &type, const std::string &name, const IInterface *parent)
Amg::Vector3D field(const Amg::Vector3D &point, MagField::AtlasFieldCache &fieldCache) const
const std::string & key() const
Return the StoreGate ID for the referenced object.
const double m_momentumThreshold
double distanceToDisc(const TrackSurfaceIntersection &isect, const double discZ, double &stepLength) const
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.
::StatusCode StatusCode
StatusCode definition for legacy code.
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=[])
Ensure that the ATLAS eigen extensions are properly loaded.
virtual bool isValid(Amg::Vector3D, Amg::Vector3D) const override
IIntersector interface method for validity check over a particular extrapolation range.
void assignStepLength(const TrackSurfaceIntersection &isect, double &stepLength) const
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Eigen::Matrix< double, 3, 1 > Vector3D
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.
virtual std::optional< TrackSurfaceIntersection > intersectCylinderSurface(const CylinderSurface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for specific Surface type : CylinderSurface.
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 > intersectSurface(const Surface &surface, const TrackSurfaceIntersection &trackIntersection, const double qOverP) const override
IIntersector interface method for general Surface type.
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
void debugFailure(TrackSurfaceIntersection &&isect, const Surface &surface, const double qOverP, const double rStart, const double zStart, const bool trapped) const