Belle II Software  release-06-02-00
Helix.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #pragma once
9 
10 #include <framework/datastore/RelationsObject.h>
11 
12 #include <TVector3.h>
13 #include <TMatrixDfwd.h>
14 
15 #include <cmath>
16 
17 namespace Belle2 {
23  namespace HelixParameterIndex {
25  enum HelixParameterIndex {
26  iD0 = 0,
27  iPhi0 = 1,
28  iOmega = 2,
29  iZ0 = 3,
30  iTanLambda = 4,
34  iArcLength2D = 5,
35  };
36  }
37 
59  class Helix : public RelationsObject {
60  public:
61 
63  Helix();
64 
75  Helix(const TVector3& position,
76  const TVector3& momentum,
77  const short int charge,
78  const double bZ);
79 
90  Helix(const double& d0,
91  const double& phi0,
92  const double& omega,
93  const double& z0,
94  const double& tanLambda);
95 
97  friend std::ostream& operator<<(std::ostream& output, const Helix& helix);
98 
99 
100  //---------------------------------------------------------------------------------------------------------------------------
103  //---------------------------------------------------------------------------------------------------------------------------
104  public:
106  double getPerigeeX() const;
107 
109  double getPerigeeY() const;
110 
112  double getPerigeeZ() const;
113 
115  TVector3 getPerigee() const;
116 
120  double getMomentumX(const double bZ) const;
121 
125  double getMomentumY(const double bZ) const;
126 
130  double getMomentumZ(const double bZ) const;
131 
138  TVector3 getMomentum(const double bZ) const;
139 
144  TVector3 getDirection() const;
145 
150  double getTransverseMomentum(const double bZ) const;
151 
153  double getKappa(const double bZ) const;
154 
156  static double getAlpha(const double bZ);
157 
159  short getChargeSign() const;
161 
162 
163  //---------------------------------------------------------------------------------------------------------------------------
166  //---------------------------------------------------------------------------------------------------------------------------
167  public:
181  double getArcLength2DAtCylindricalR(const double& cylindricalR) const;
182 
194  double getArcLength2DAtXY(const double& x, const double& y) const;
195 
206  double getArcLength2DAtNormalPlane(const double& x, const double& y,
207  const double& nX, const double& nY) const;
208 
213  TVector3 getPositionAtArcLength2D(const double& arcLength2D) const;
214 
225  TVector3 getTangentialAtArcLength2D(const double& arcLength2D) const;
226 
231  TVector3 getUnitTangentialAtArcLength2D(const double& arcLength2D) const;
232 
238  TVector3 getMomentumAtArcLength2D(const double& arcLength2D, const double& bz) const;
239 
245  double passiveMoveBy(const TVector3& by)
246  { return passiveMoveBy(by.X(), by.Y(), by.Z()); }
247 
256  double passiveMoveBy(const double& byX,
257  const double& byY,
258  const double& byZ);
259 
260 
271  TMatrixD calcPassiveMoveByJacobian(const TVector3& by, const double expandBelowChi = M_PI / 8) const;
272 
273 
274  protected:
275  public:
295  void calcPassiveMoveByJacobian(const double& byX,
296  const double& byY,
297  TMatrixD& jacobian,
298  const double expandBelowChi = M_PI / 8) const;
299 
300  public:
308  void reverse();
309 
315  static double reversePhi(const double& phi);
316 
322  double calcArcLength2DFromSecantLength(const double& secantLength2D) const;
323 
326  double calcSecantLengthToArcLength2DFactor(const double& secantLength2D) const;
328 
329  protected:
331  static double calcASinXDividedByX(const double& x);
332 
334  static double calcATanXDividedByX(const double& x);
335 
337  static double calcDerivativeOfATanXDividedByX(const double& x);
338 
348  void calcArcLength2DAndDrAtXY(const double& x, const double& y, double& arcLength2D, double& dr) const;
349 
358  double calcArcLength2DAtDeltaCylindricalRAndDr(const double& deltaCylindricalR, const double& dr) const;
359 
360 
361  //---------------------------------------------------------------------------------------------------------------------------
364  //---------------------------------------------------------------------------------------------------------------------------
365  public:
372  double getD0() const { return m_d0; }
373 
378  double getPhi0() const { return m_phi0; }
379 
381  double getCosPhi0() const { return std::cos(getPhi0()); }
382 
384  double getSinPhi0() const { return std::sin(getPhi0()); }
385 
387  double getOmega() const { return m_omega; }
388 
390  double getZ0() const { return m_z0; }
391 
393  double getTanLambda() const { return m_tanLambda; }
394 
396  double getCotTheta() const { return m_tanLambda; }
398 
400  private:
401  //---------------------------------------------------------------------------------------------------------------------------
402  //--- Functions for internal conversions between cartesian and perigee helix parameters
403  //--- This can be placed in a seperate header which handles all the conversion stuff
404  //---------------------------------------------------------------------------------------------------------------------------
405 
408  void setCartesian(const TVector3& position,
409  const TVector3& momentum,
410  const short int charge,
411  const double bZ);
412 
414  Double32_t m_d0;
415 
417  Double32_t m_phi0;
418 
420  Double32_t m_omega;
421 
423  Double32_t m_z0;
424 
426  Double32_t m_tanLambda;
427 
429  };
431 }
432 
Helix parameter class.
Definition: Helix.h:48
Helix(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
Constructor with pivot, helix parameter a, and its error matrix.
Definition: Helix.cc:132
double phi0(void) const
Return helix parameter phi0.
Definition: Helix.h:388
double dr(void) const
Return helix parameter dr.
Definition: Helix.h:380
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
Definition: Helix.cc:259
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
Definition: Helix.cc:197
TMatrixD calcPassiveMoveByJacobian(const TVector3 &by, const double expandBelowChi=M_PI/8) const
Calculate the 5x5 jacobian matrix for the transport of the helix parameters, when moving the origin o...
Double32_t m_tanLambda
Memory for the slope of the track in the z coordinate over the two dimensional arc length (dz/ds)
Definition: Helix.h:426
double getPerigeeX() const
Calculates the x coordinate of the perigee point.
Definition: Helix.cc:53
double getSinPhi0() const
Getter for the cosine of the azimuth angle of travel direction at the perigee.
Definition: Helix.h:384
double getMomentumZ(const double bZ) const
Calculates the z momentum of the particle at the perigee point.
Definition: Helix.cc:83
Double32_t m_omega
Memory for the curvature of the signed curvature.
Definition: Helix.h:420
double getMomentumY(const double bZ) const
Calculates the y momentum of the particle at the perigee point.
Definition: Helix.cc:78
void reverse()
Reverses the direction of travel of the helix in place.
double getCosPhi0() const
Getter for the cosine of the azimuth angle of travel direction at the perigee.
Definition: Helix.h:381
double getArcLength2DAtCylindricalR(const double &cylindricalR) const
Calculates the transverse travel distance at the point the helix first reaches the given cylindrical ...
Definition: Helix.cc:127
static double calcASinXDividedByX(const double &x)
Implementation of the function asin(x) / x which handles small x values smoothly.
Definition: Helix.cc:437
static double reversePhi(const double &phi)
Reverses an azimuthal angle to the opposite direction.
Definition: Helix.cc:420
short getChargeSign() const
Return track charge sign (1, 0 or -1).
Definition: Helix.cc:113
TVector3 getTangentialAtArcLength2D(const double &arcLength2D) const
Calculates the tangential vector to the helix curve at the given two dimensional arc length.
Definition: Helix.cc:244
double getArcLength2DAtXY(const double &x, const double &y) const
Calculates the two dimensional arc length at which the circle in the xy projection is closest to the ...
Definition: Helix.cc:140
TVector3 getMomentumAtArcLength2D(const double &arcLength2D, const double &bz) const
Calculates the momentum vector at the given two dimensional arc length.
Definition: Helix.cc:269
Double32_t m_z0
Memory for the z coordinate of the perigee.
Definition: Helix.h:423
static double getAlpha(const double bZ)
Calculates the alpha value for a given magnetic field in Tesla.
Definition: Helix.cc:108
double getCotTheta() const
Getter for cot theta, which is the z over two dimensional arc length slope of the track.
Definition: Helix.h:396
TVector3 getPerigee() const
Getter for the perigee position.
Definition: Helix.cc:68
double getOmega() const
Getter for omega, which is a signed curvature measure of the track.
Definition: Helix.h:387
Double32_t m_d0
Memory for the signed distance to the perigee.
Definition: Helix.h:414
double getPerigeeZ() const
Calculates the z coordinate of the perigee point.
Definition: Helix.cc:63
double getD0() const
Getter for d0, which is the signed distance to the perigee in the r-phi plane.
Definition: Helix.h:372
void calcPassiveMoveByJacobian(const double &byX, const double &byY, TMatrixD &jacobian, const double expandBelowChi=M_PI/8) const
Calculate the jacobian matrix for the transport of the helix parameters, when moving the origin of th...
void calcArcLength2DAndDrAtXY(const double &x, const double &y, double &arcLength2D, double &dr) const
Helper method to calculate the signed two dimensional arc length and the signed distance to the circl...
Definition: Helix.cc:544
double getArcLength2DAtNormalPlane(const double &x, const double &y, const double &nX, const double &nY) const
Calculates the arc length to reach a plane parallel to the z axes.
Definition: Helix.cc:148
double getMomentumX(const double bZ) const
Calculates the x momentum of the particle at the perigee point.
Definition: Helix.cc:73
double getTanLambda() const
Getter for tan lambda, which is the z over two dimensional arc length slope of the track.
Definition: Helix.h:393
TVector3 getPositionAtArcLength2D(const double &arcLength2D) const
Calculates the position on the helix at the given two dimensional arc length.
Definition: Helix.cc:200
double getPerigeeY() const
Calculates the y coordinate of the perigee point.
Definition: Helix.cc:58
double calcSecantLengthToArcLength2DFactor(const double &secantLength2D) const
Helper function to calculate the factor between the dimensional secant length and the two dimensional...
Definition: Helix.cc:431
Double32_t m_phi0
Memory for the azimuth angle between the transverse momentum and the x axis, which is in [-pi,...
Definition: Helix.h:417
TVector3 getUnitTangentialAtArcLength2D(const double &arcLength2D) const
Calculates the unit tangential vector to the helix curve at the given two dimensional arc length.
Definition: Helix.cc:260
double calcArcLength2DAtDeltaCylindricalRAndDr(const double &deltaCylindricalR, const double &dr) const
Helper method to calculate the two dimensional arc length from the perigee to a point at cylindrical ...
Definition: Helix.cc:580
double calcArcLength2DFromSecantLength(const double &secantLength2D) const
Helper function to calculate the two dimensional arc length from the length of a secant.
Definition: Helix.cc:425
double getZ0() const
Getter for z0, which is the z coordinate of the perigee.
Definition: Helix.h:390
double passiveMoveBy(const TVector3 &by)
Moves origin of the coordinate system (passive transformation) by the given vector.
Definition: Helix.h:245
double getKappa(const double bZ) const
Getter for kappa, which is charge / transverse momentum or equivalently omega * alpha.
Definition: Helix.cc:103
static double calcDerivativeOfATanXDividedByX(const double &x)
Implementation of the function d / dx (atan(x) / x) which handles small x values smoothly.
Definition: Helix.cc:508
Helix()
Constructor initializing all perigee parameters to zero.
ClassDef(Helix, 2)
This class represents an ideal helix in perigee parameterization.
double getTransverseMomentum(const double bZ) const
Getter for the absolute value of the transverse momentum at the perigee.
Definition: Helix.cc:98
TVector3 getMomentum(const double bZ) const
Getter for vector of momentum at the perigee position.
Definition: Helix.cc:88
double getPhi0() const
Getter for phi0, which is the azimuth angle of the transverse momentum at the perigee.
Definition: Helix.h:378
static double calcATanXDividedByX(const double &x)
Implementation of the function atan(x) / x which handles small x values smoothly.
Definition: Helix.cc:476
TVector3 getDirection() const
Getter for unit vector of momentum at the perigee position.
Definition: Helix.cc:93
Defines interface for accessing relations of objects in StoreArray.
std::ostream & operator<<(std::ostream &output, const IntervalOfValidity &iov)
Abstract base class for different kinds of events.