ROOT logo
HYDRA - THE HADES ANALYSIS PACKAGE » (UNKNOWN) » HKalRungeKutta

class HKalRungeKutta: public TObject

_HADES_CLASS_DESCRIPTION


 This is the track propagator for the Kalman filter. Propagation is done
 with the Runge-Kutta method. Track state updates are done like in CBM, also see:
 S. Gorbunov and I. Kisel,
 An analytic formula for track extrapolation in an inhomogeneous magnetic field.
 CBM-SOFT-note-2005-001, 18 March 2005
 http://www-linux.gsi.de/~ikisel/reco/CBM/DOC-2005-Mar-212-1.pdf

 Before doing track propagation, a pointer to the magnetic field map must
 be set using the function
 setFieldMap(HMdcTrackGField *fpField, Double_t fpol).

 The main function is propagateToPlane() that will propagate the track
 to a target plane and calculate the track state vector at that plane and
 the propagator matrix. It will return a boolean indicating whether
 problems were encountered during the Runge-Kutta stepping, like for example
 unrealistically hight track state parameters.

 All the points and B-field vectors may be stored in two arrays for
 debugging purposes or graphics output if that option has been enabled with
 setFillPointsArrays(kTRUE).
 The functions getPointsTrack() and getFieldTrack() will return these arrays.
 Each array element is a TVector3 object.

 The class also offers functions to calculate the material budget in each
 step (calcMaterialProperties()), the effects of multiple scattering
 (calcProcNoise()) and energy loss (calcEnergyLoss()).



Function Members (Methods)

public:
HKalRungeKutta()
virtual~HKalRungeKutta()
voidTObject::AbstractMethod(const char* method) const
virtual voidTObject::AppendPad(Option_t* option = "")
virtual voidTObject::Browse(TBrowser* b)
virtual Double_tcalcDEDXBetheBloch(Double_t beta, Double_t mass, Double_t ZoverA, Double_t density, Double_t exciteEner, Double_t z = 1.)
virtual Double_tcalcDEDXIonLepton(Double_t qp, Double_t ZoverA, Double_t density, Double_t exciteEner, Int_t pid) const
virtual Double_tcalcEnergyLoss(TMatrixD& fProc, TVectorD& stateVec, Double_t length, Double_t qp, Double_t Z, Double_t ZoverA, Double_t density, Double_t radLength, Double_t exciteEner, Int_t pid)
virtual voidcalcField_mm(const TVector3& xv, TVector3& btos, Double_t fpol) const
virtual voidcalcField_mm(Double_t* xv, Double_t* btos, Double_t fpol) const
virtual TVector3calcFieldIntegral() const
virtual Bool_tcalcMaterialProperties(Double_t& A, Double_t& Z, Double_t& density, Double_t& radLength, Double_t& exciteEner, const TVector3& posPreStep, const TVector3& posPostStep, const HKalMdcMeasLayer& layerFrom, const HKalMdcMeasLayer& layerTo) const
virtual voidcalcMultScat(TMatrixD& fProc, const TVectorD& stateVec, Double_t length, Double_t radLength, Double_t beta, Int_t pid) const
virtual Double_tcalcRadLoss(TMatrixD& fProc, Double_t length, Double_t mass, Double_t qp, Double_t radLength) const
virtual Bool_tcheckPropMat(TMatrixD& fProp) const
virtual Bool_tcheckTrack(TVectorD& stateVec) const
static TClass*Class()
virtual const char*TObject::ClassName() const
virtual voidclear()
virtual voidTObject::Clear(Option_t* = "")
virtual TObject*TObject::Clone(const char* newname = "") const
virtual Int_tTObject::Compare(const TObject* obj) const
virtual voidTObject::Copy(TObject& object) const
virtual voidTObject::Delete(Option_t* option = "")MENU
virtual Int_tTObject::DistancetoPrimitive(Int_t px, Int_t py)
virtual voidTObject::Draw(Option_t* option = "")
virtual voidTObject::DrawClass() constMENU
virtual TObject*TObject::DrawClone(Option_t* option = "") constMENU
virtual voidTObject::Dump() constMENU
virtual voidTObject::Error(const char* method, const char* msgfmt) const
virtual voidTObject::Execute(const char* method, const char* params, Int_t* error = 0)
virtual voidTObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0)
virtual voidTObject::ExecuteEvent(Int_t event, Int_t px, Int_t py)
virtual voidTObject::Fatal(const char* method, const char* msgfmt) const
virtual TObject*TObject::FindObject(const char* name) const
virtual TObject*TObject::FindObject(const TObject* obj) const
virtual Option_t*TObject::GetDrawOption() const
static Long_tTObject::GetDtorOnly()
virtual Double_tgetEnergyLoss() const
virtual const TObjArray&getFieldTrack() const
virtual const char*TObject::GetIconName() const
virtual const char*TObject::GetName() const
virtual Int_tgetNrStep() const
virtual char*TObject::GetObjectInfo(Int_t px, Int_t py) const
static Bool_tTObject::GetObjectStat()
virtual Option_t*TObject::GetOption() const
virtual const TObjArray&getPointsTrack() const
virtual Double_tgetStepLength() const
virtual const char*TObject::GetTitle() const
virtual Double_tgetTrackLength() const
virtual UInt_tTObject::GetUniqueID() const
virtual Bool_tTObject::HandleTimer(TTimer* timer)
virtual ULong_tTObject::Hash() const
virtual voidTObject::Info(const char* method, const char* msgfmt) const
virtual Bool_tTObject::InheritsFrom(const char* classname) const
virtual Bool_tTObject::InheritsFrom(const TClass* cl) const
virtual voidTObject::Inspect() constMENU
voidTObject::InvertBit(UInt_t f)
virtual TClass*IsA() const
virtual Bool_tTObject::IsEqual(const TObject* obj) const
virtual Bool_tTObject::IsFolder() const
Bool_tTObject::IsOnHeap() const
virtual Bool_tTObject::IsSortable() const
Bool_tTObject::IsZombie() const
virtual voidTObject::ls(Option_t* option = "") const
voidTObject::MayNotUse(const char* method) const
virtual Bool_tTObject::Notify()
voidTObject::Obsolete(const char* method, const char* asOfVers, const char* removedFromVers) const
static voidTObject::operator delete(void* ptr)
static voidTObject::operator delete(void* ptr, void* vp)
static voidTObject::operator delete[](void* ptr)
static voidTObject::operator delete[](void* ptr, void* vp)
void*TObject::operator new(size_t sz)
void*TObject::operator new(size_t sz, void* vp)
void*TObject::operator new[](size_t sz)
void*TObject::operator new[](size_t sz, void* vp)
TObject&TObject::operator=(const TObject& rhs)
virtual voidTObject::Paint(Option_t* option = "")
virtual voidTObject::Pop()
virtual voidTObject::Print(Option_t* option = "") const
virtual voidpropagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, Double_t dz)
virtual Bool_tpropagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, const HKalPlane& planeTo, Bool_t propDir)
virtual Bool_tpropagateToPlane(TMatrixD& fProp, TMatrixD& fProc, TVectorD& stateVecTo, const TVectorD& stateVecFrom, const HKalPlane& planeFrom, const HKalPlane& planeTo, const HKalMdcMeasLayer& measLayFrom, const HKalMdcMeasLayer& measLayTo, Int_t pid, Bool_t propDir, Bool_t bCalcJac = kTRUE)
virtual Int_tTObject::Read(const char* name)
virtual voidTObject::RecursiveRemove(TObject* obj)
voidTObject::ResetBit(UInt_t f)
virtual voidTObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU
virtual voidTObject::SavePrimitive(ostream& out, Option_t* option = "")
voidTObject::SetBit(UInt_t f)
voidTObject::SetBit(UInt_t f, Bool_t set)
virtual voidsetDirection(Bool_t dir)
virtual voidsetDoEnerLoss(Bool_t dedx)
virtual voidsetDoMultScat(Bool_t ms)
virtual voidTObject::SetDrawOption(Option_t* option = "")MENU
static voidTObject::SetDtorOnly(void* obj)
virtual voidsetFieldFact(Double_t fpol)
virtual voidsetFieldMap(HMdcTrackGField* fpField, Double_t fpol)
virtual voidsetFieldVector(const TVector3& B)
virtual voidsetFillPointsArrays(Bool_t fill)
static voidTObject::SetObjectStat(Bool_t stat)
virtual voidsetPrintErrors(Bool_t print)
virtual voidsetPrintWarnings(Bool_t print)
virtual voidsetRotateBfieldVecs(Bool_t rotB)
virtual voidsetRotationMatrix(TRotation* pRM)
virtual voidsetRungeKuttaParams(Float_t initialStpSize, Float_t stpSizeDec, Float_t stpSizeInc, Float_t maxStpSize, Float_t minStpSize, Float_t minPrec, Float_t maxPrec, Int_t maxNumStps, Int_t maxNumStpsPCA, Float_t maxDst, Double_t minLngthCalcQ)
virtual voidTObject::SetUniqueID(UInt_t uid)
virtual voidsetUseConstField(Bool_t constField)
virtual voidShowMembers(TMemberInspector&)
virtual voidStreamer(TBuffer&)
voidStreamerNVirtual(TBuffer& ClassDef_StreamerNVirtual_b)
virtual voidTObject::SysError(const char* method, const char* msgfmt) const
Bool_tTObject::TestBit(UInt_t f) const
Int_tTObject::TestBits(UInt_t f) const
virtual voidTObject::UseCurrentStyle()
virtual voidTObject::Warning(const char* method, const char* msgfmt) const
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0)
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const
protected:
virtual voidTObject::DoError(int level, const char* location, const char* fmt, va_list va) const
voidTObject::MakeZombie()
virtual Double_trkSingleStep(TVectorD& stateVec, TMatrixD& fPropStep, Double_t stepSize, Bool_t bCalcJac = kTRUE)

Data Members

private:
Bool_tbConstFieldUse a constant magnetic field instead of fieldMap.
Bool_tbDoDEDXCalculate energy loss.
Bool_tbDoMSCalculate coulomb multiple scattering.
Bool_tbElossErrEncountered errors during energy loss calculation. Reset in every propagateToPlane() call.
Bool_tbFillPointArrays== kTRUE if point arrays should be filled
Bool_tbPrintElossErrAvoid repeated prints of the same error message.
Bool_tbPrintErrShow error messages.
Bool_tbPrintWarnShow warning messages.
Bool_tbRotBfield! Do/Don't do coordinate transformation of B-field vectors.
Bool_tdirectionPropagation direction: kIterForward/kIterBackward.
Double_tenergyLoss! Energy loss during stepping in MeV/particle charge.
HMdcTrackGField*fieldMap! Pointer to B-field map.
Double_tfieldScaleFact! Factor of the magnetic field strength.
TObjArrayfieldTrackField at Points along trajectory stored
Float_tinitialStepSize! initial RK step size
Int_tjstep! Step number.
TVector3magField! Use a constant magnetic field instead of fieldMap.
Float_tmaxDist! maximum distance for straight line approximation
Int_tmaxNumSteps! maximum number of Runge-Kutta steps
Int_tmaxNumStepsPCA! maximum number of attempts to find the point of closest approach of the track to a wire
Double_tmaxPosMaximum allowed values for x and y coordinates.
Float_tmaxPrecision! maximum required precision for a single step
Double_tmaxPropMatMaximmum allowed value for an element of the propagator matrix.
Float_tmaxStepSize! maximum stepsize
Double_tmaxTanMaximum allowed values for tx and ty.
Double_tminLengthCalcQ! minimum step length where process noise is still calculated.
Double_tminMomMinimum required value for momentum in MeV/c.
Float_tminPrecision! minimum required precision for a single step
Float_tminStepSize! minimum stepsize
TRotation*pRotMat! Rotation matrix for possible coordinate transformations of B-field vectors.
TObjArraypointsTrackPoints along trajectory stored
Double_tstepLength! Length of last RK step in mm.
Float_tstepSizeDec! factor to decrease stepsize
Float_tstepSizeInc! factor to increase stepsize
Double_ttrackLength! Track length in mm.
Bool_ttrackOkEncountered errors during track propagation.
Double_ttrackPosAtZ! Store z position of track during Runge-Kutta propagation.

Class Charts

Inheritance Inherited Members Includes Libraries
Class Charts

Function documentation

HKalRungeKutta()
 Constructor that sets variables. It is still neccessary to set the field
 map pointer with
 setFieldMap(HMdcTrackGField *fpField, Double_t fpol)
 before Runge-Kutta propation can be used.
~HKalRungeKutta()
Double_t calcEnergyLoss(TMatrixD& fProc, TVectorD& stateVec, Double_t length, Double_t qp, Double_t Z, Double_t ZoverA, Double_t density, Double_t radLength, Double_t exciteEner, Int_t pid)
 Calculates energy loss due to bremsstrahlung and ionization.
 Radiation loss is done for electrons/positrons only.
 Only yields proper results if particle charge is +/- 1.
 Return value is energy loss in MeV/particle charge.

 Input and output:
 fProc:      Process noise matrix. Contribution of energy loss will be added.
 stateVec:   track state vector before energy loss. q/p of state will be modified.

 Input:
 length:     track length in mm
 qp:         charge/momentum before energy loss in MeV/c
 Z:          atomic number.
 ZoverA:     atomic number / atomic mass of passed material
 density:    density of passed material in g/mm^3
 radLength:  radiation length of passed material in mm
 exciteEner: mean excitation energy of passed material in MeV
 pid:        Geant particle ID.
Double_t calcDEDXBetheBloch(Double_t beta, Double_t mass, Double_t ZoverA, Double_t density, Double_t exciteEner, Double_t z = 1.)
 Returns the ionization energy loss for thin materials with Bethe-Bloch formula.
 - dE/dx = K/A * Z * z^2 / beta^2 * (0.5 * ln(2*me*beta^2*gamma^2*T_max/I^2) - beta^2)
 T_max = (2*me*beta^2*gamma^2) / (1 + 2*gamma*me/mass + me^2/mass^2)

 beta:       v/c of particle
 mass:       mass of the particle in MeV/c^2 traversing through the material
 ZoverA:     atomic number / atomic mass of passed material
 density:    density of passed material in g/mm^3
 exciteEner: mean excitation energy of passed material in MeV
 z:          atomic number of particle
Double_t calcDEDXIonLepton(Double_t qp, Double_t ZoverA, Double_t density, Double_t exciteEner, Int_t pid) const
 Calculates energy loss dE/dx in MeV/mm due to ionization for relativistic electrons/positrons.

 For formula used, see:
 Track fitting with energy loss
 Stampfer, Regler and Fruehwirth
 Computer Physics Communication 79 (1994), 157-164

 qp:         particle charge divided by momentum
 ZoverA:     atomic number / atomic mass of passed material
 density:    density of material in g/mm^3
 exciteEner: mean excitation energy in MeV
 pid:        Geant particle id (2 = positron, 3 = electron)
Double_t calcRadLoss(TMatrixD& fProc, Double_t length, Double_t mass, Double_t qp, Double_t radLength) const
 Calculates energy loss due to bremsstrahlung for electrons with Bethe-Heitler formula.
 Sign will be negative if propagating in forward direction, i.e. particle looses energy.

 Input and Output:
 fProc:     process noise matrix (will be modified)

 Input:
 length:    track length in mm
 mass:      particle mass in MeV/c^2
 qp:        charge/momentum before energy loss in MeV/c
 radLength: radiation length of material in mm.
TVector3 calcFieldIntegral() const
 Calculates the field integral (Tm) by numerical integration
 along the stepping points :  | sum over i  x(i+1)-x(i) x B(i) |
 where x and B are position and field vectors.
 setFillPointArrays(kTRUE) has to set before call propagate
 to fill the point and field arrays which are needed for
 the calculation.
void calcField_mm(const TVector3& xv, TVector3& btos, Double_t fpol) const
 Calculate B-field (T) in x,y,z (mm).

 Output:
 btos: field vector at position xv in Tesla.

 Input:
 xv:   return field at this position vector. Coordinates must be in mm.
 fpol: field scaling factor * polarity.
void calcField_mm(Double_t* xv, Double_t* btos, Double_t fpol) const
 Calculate B-field (T) in x,y,z (mm).

 Output:
 btos: field vector at position xv in Tesla.

 Input:
 xv:   return field at this position vector. Coordinates must be in mm.
 fpol: field scaling factor * polarity.
Bool_t calcMaterialProperties(Double_t& A, Double_t& Z, Double_t& density, Double_t& radLength, Double_t& exciteEner, const TVector3& posPreStep, const TVector3& posPostStep, const HKalMdcMeasLayer& layerFrom, const HKalMdcMeasLayer& layerTo) const
 Calculates material budget for a Runge-Kutta step between two points.

 Output:
 A:          mass number of mixture of passed material.
 Z:          atomic number of mixture of passed material.
 density:    density of mixture of passed material in g/mm^3.
 radLength:  radiation length of mixture of passed material in mm.
 exciteEner: mean excitation energy of mixture of passed material in MeV.

 Input:
 posFrom:    position of track before the Runge-Kutta step.
 posTo:      position of track after the Runge-Kutta step.
 layerFrom:  measurement layer at posFrom.
 layerTo:    measurement layer at posTo.
void calcMultScat(TMatrixD& fProc, const TVectorD& stateVec, Double_t length, Double_t radLength, Double_t beta, Int_t pid) const
 Add multiple scattering to the process noise covariance.

 Input and output:
 fProc:     Process noise covariance. Contribution of multiple scattering is added to this matrix.

 Input:
 stateVec:  Track state vector at start of an RK step.
 length:    Track length in mm.
 radLength: Radiation length of passed material in mm.
 beta:      v/c of particle.
 pid:       Geant particle ID.
void clear()
 Resets error flags and clears arrays that store points/field along the trajectory.
 Call this every time when fitting a new track.
Bool_t checkPropMat(TMatrixD& fProp) const
 Check propagator matrix for INFs/NaNs or too large entries.
Bool_t checkTrack(TVectorD& stateVec) const
 Reduces values in the state vector that have become too large to avoid
 overflows or underflows and print a warning.
 Returns whether track parameters have been reduced or not as a boolean.

 sv: 5-dimensional track state vector. May be modified in case of errors.
Bool_t propagateToPlane(TMatrixD& fProp, TMatrixD& fProc, TVectorD& stateVecTo, const TVectorD& stateVecFrom, const HKalPlane& planeFrom, const HKalPlane& planeTo, const HKalMdcMeasLayer& measLayFrom, const HKalMdcMeasLayer& measLayTo, Int_t pid, Bool_t propDir, Bool_t bCalcJac = kTRUE)
 Propagate a particle trajectory to a plane using a 4th order Runge-Kutta.
 Returns true if no errors were encountered during track propagation.

 Output:
 fProp:         Propagator matrix.
 fProc:         Process noise matrix with contributions of multiple scattering and energy loss.
 stateVecTo:    Track state vector (x,y,tx,ty,q/p) at target plane.

 Input:
 stateVecFrom:  Track state vector at (x,y,tx,ty,q/p) at source plane.
 planeFrom:     Plane to propagate from.
 planeTo:       Plane to propagate to.
 measLayerFrom: Detector element in which the track is currently in. Used to calculate passed materials.
 measLayerTo:   Detector element the track will move to. Used to calculate passed materials.
 pid:           Geant particle ID. Needed for process noise calculations.
 propDir:       propagation direction kIterForward or kIterBackward.
 bCalcJac:      Calculate the propagator matrix.
void propagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, Double_t dz)
 Propagate the track state along a straight line in its current direction.
 (x',y',z') = (x,y,z) + dz * (tx,ty,1)

 Output:
 fPropChange: Change in propagator matrix.

 Input & output:
 stateVec:    Current track state vector (x,y,tx,ty,qp).

 Input:
 zPos:        Current z position of track.
 dz:          Step length in z coordinate.
Bool_t propagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, const HKalPlane& planeTo, Bool_t propDir)
 From the position and direction stored in the track state vector, propagate the track
 to a target plane using a straight line. The track state and reference layer are updated
 and the propagator matrix is calculated. The function returns the length of the straight line.
 The class variable trackPosAtZ must contain the current z-value of the track.

 Output:
 fPropChange: Change in propagator matrix

 Input and output:
 stateVec:    Current Track state vector.
 zPos:        Current z-position of track.

 Input:
 planeTo:     Plane to propagate to.
 propDir:     Propagation direction.
Double_t rkSingleStep(TVectorD& stateVec, TMatrixD& fPropStep, Double_t stepSize, Bool_t bCalcJac = kTRUE)
 One step of track tracing from track state.

 Input and output:
 stateVec:  Starting track parameters.
 fPropStep: Change in propagator matrix for this step.

 Input:
 totStep:   Step size.
 bCalcJac:  Update the Jacobian (propagator matrix).
void setRungeKuttaParams(Float_t initialStpSize, Float_t stpSizeDec, Float_t stpSizeInc, Float_t maxStpSize, Float_t minStpSize, Float_t minPrec, Float_t maxPrec, Int_t maxNumStps, Int_t maxNumStpsPCA, Float_t maxDst, Double_t minLngthCalcQ)
Double_t getEnergyLoss() const
{ return energyLoss; }
Int_t getNrStep() const
{ return jstep; }
Double_t getTrackLength() const
{ return trackLength; }
Double_t getStepLength() const
{ return stepLength; }
TObjArray const& getPointsTrack() const
{ return pointsTrack; }
TObjArray const& getFieldTrack() const
{ return fieldTrack; }
void setDirection(Bool_t dir)
{ direction = dir; }
void setDoEnerLoss(Bool_t dedx)
{ bDoDEDX = dedx; }
void setDoMultScat(Bool_t ms)
{ bDoMS = ms; }
void setFieldFact(Double_t fpol)
{ fieldScaleFact = fpol; }
void setFieldMap(HMdcTrackGField* fpField, Double_t fpol)
{ fieldMap = fpField; fieldScaleFact = fpol; }
void setFieldVector(const TVector3& B)
{ magField = B; }
void setFillPointsArrays(Bool_t fill)
{ bFillPointArrays = fill; }
void setPrintErrors(Bool_t print)
{ bPrintErr = print; }
void setPrintWarnings(Bool_t print)
{ bPrintWarn = print; }
void setRotationMatrix(TRotation* pRM)
{ pRotMat = pRM; }
void setRotateBfieldVecs(Bool_t rotB)
{ bRotBfield = rotB; }
void setUseConstField(Bool_t constField)
{ bConstField = constField; }