|  | 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"};
 
  223     double& stepLength)
 const {
 
  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);
 
  238     double& stepLength)
 const {
 
  249     const Amg::Vector3D& lineDirection, 
double& stepLength)
 const {
 
  260   double cosAngle = lineDirection.dot(
dir);
 
  261   stepLength = (linePosition - 
pos).
dot(
dir - lineDirection * cosAngle) /
 
  262                (1. - cosAngle * cosAngle);
 
  263   return std::abs(stepLength);
 
  268     const Amg::Vector3D& planeNormal, 
double& stepLength)
 const {
 
  275   double distance = planeNormal.dot(planePosition - 
pos);
 
  284   if (!fieldCondObj.isValid()) {
 
  285     ATH_MSG_FATAL(
"Failed to get magnetic field conditions data " 
  288   fieldCondObj->getInitializedCache(fieldCache);
 
  301     const double qOverP, 
const double rStart, 
const double zStart)
 const {
 
  304       isect.position(), isect.direction(), 
false, 
false);
 
  305   if (SLIntersect.
valid) {
 
  307     return std::move(isect);
 
  320 #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
BooleanProperty m_productionMode
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