_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()).
HKalRungeKutta() | |
virtual | ~HKalRungeKutta() |
void | TObject::AbstractMethod(const char* method) const |
virtual void | TObject::AppendPad(Option_t* option = "") |
virtual void | TObject::Browse(TBrowser* b) |
virtual Double_t | calcDEDXBetheBloch(Double_t beta, Double_t mass, Double_t ZoverA, Double_t density, Double_t exciteEner, Double_t z = 1.) |
virtual Double_t | calcDEDXIonLepton(Double_t qp, Double_t ZoverA, Double_t density, Double_t exciteEner, Int_t pid) const |
virtual 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) |
virtual void | calcField_mm(const TVector3& xv, TVector3& btos, Double_t fpol) const |
virtual void | calcField_mm(Double_t* xv, Double_t* btos, Double_t fpol) const |
virtual TVector3 | calcFieldIntegral() const |
virtual 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 |
virtual void | calcMultScat(TMatrixD& fProc, const TVectorD& stateVec, Double_t length, Double_t radLength, Double_t beta, Int_t pid) const |
virtual Double_t | calcRadLoss(TMatrixD& fProc, Double_t length, Double_t mass, Double_t qp, Double_t radLength) const |
virtual Bool_t | checkPropMat(TMatrixD& fProp) const |
virtual Bool_t | checkTrack(TVectorD& stateVec) const |
static TClass* | Class() |
virtual const char* | TObject::ClassName() const |
virtual void | clear() |
virtual void | TObject::Clear(Option_t* = "") |
virtual TObject* | TObject::Clone(const char* newname = "") const |
virtual Int_t | TObject::Compare(const TObject* obj) const |
virtual void | TObject::Copy(TObject& object) const |
virtual void | TObject::Delete(Option_t* option = "")MENU |
virtual Int_t | TObject::DistancetoPrimitive(Int_t px, Int_t py) |
virtual void | TObject::Draw(Option_t* option = "") |
virtual void | TObject::DrawClass() constMENU |
virtual TObject* | TObject::DrawClone(Option_t* option = "") constMENU |
virtual void | TObject::Dump() constMENU |
virtual void | TObject::Error(const char* method, const char* msgfmt) const |
virtual void | TObject::Execute(const char* method, const char* params, Int_t* error = 0) |
virtual void | TObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0) |
virtual void | TObject::ExecuteEvent(Int_t event, Int_t px, Int_t py) |
virtual void | TObject::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_t | TObject::GetDtorOnly() |
virtual Double_t | getEnergyLoss() const |
virtual const TObjArray& | getFieldTrack() const |
virtual const char* | TObject::GetIconName() const |
virtual const char* | TObject::GetName() const |
virtual Int_t | getNrStep() const |
virtual char* | TObject::GetObjectInfo(Int_t px, Int_t py) const |
static Bool_t | TObject::GetObjectStat() |
virtual Option_t* | TObject::GetOption() const |
virtual const TObjArray& | getPointsTrack() const |
virtual Double_t | getStepLength() const |
virtual const char* | TObject::GetTitle() const |
virtual Double_t | getTrackLength() const |
virtual UInt_t | TObject::GetUniqueID() const |
virtual Bool_t | TObject::HandleTimer(TTimer* timer) |
virtual ULong_t | TObject::Hash() const |
virtual void | TObject::Info(const char* method, const char* msgfmt) const |
virtual Bool_t | TObject::InheritsFrom(const char* classname) const |
virtual Bool_t | TObject::InheritsFrom(const TClass* cl) const |
virtual void | TObject::Inspect() constMENU |
void | TObject::InvertBit(UInt_t f) |
virtual TClass* | IsA() const |
virtual Bool_t | TObject::IsEqual(const TObject* obj) const |
virtual Bool_t | TObject::IsFolder() const |
Bool_t | TObject::IsOnHeap() const |
virtual Bool_t | TObject::IsSortable() const |
Bool_t | TObject::IsZombie() const |
virtual void | TObject::ls(Option_t* option = "") const |
void | TObject::MayNotUse(const char* method) const |
virtual Bool_t | TObject::Notify() |
void | TObject::Obsolete(const char* method, const char* asOfVers, const char* removedFromVers) const |
static void | TObject::operator delete(void* ptr) |
static void | TObject::operator delete(void* ptr, void* vp) |
static void | TObject::operator delete[](void* ptr) |
static void | TObject::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 void | TObject::Paint(Option_t* option = "") |
virtual void | TObject::Pop() |
virtual void | TObject::Print(Option_t* option = "") const |
virtual void | propagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, Double_t dz) |
virtual Bool_t | propagateStraightLine(TVectorD& stateVec, TMatrixD& DF, Double_t& zPos, const HKalPlane& planeTo, Bool_t propDir) |
virtual 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) |
virtual Int_t | TObject::Read(const char* name) |
virtual void | TObject::RecursiveRemove(TObject* obj) |
void | TObject::ResetBit(UInt_t f) |
virtual void | TObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU |
virtual void | TObject::SavePrimitive(ostream& out, Option_t* option = "") |
void | TObject::SetBit(UInt_t f) |
void | TObject::SetBit(UInt_t f, Bool_t set) |
virtual void | setDirection(Bool_t dir) |
virtual void | setDoEnerLoss(Bool_t dedx) |
virtual void | setDoMultScat(Bool_t ms) |
virtual void | TObject::SetDrawOption(Option_t* option = "")MENU |
static void | TObject::SetDtorOnly(void* obj) |
virtual void | setFieldFact(Double_t fpol) |
virtual void | setFieldMap(HMdcTrackGField* fpField, Double_t fpol) |
virtual void | setFieldVector(const TVector3& B) |
virtual void | setFillPointsArrays(Bool_t fill) |
static void | TObject::SetObjectStat(Bool_t stat) |
virtual void | setPrintErrors(Bool_t print) |
virtual void | setPrintWarnings(Bool_t print) |
virtual void | setRotateBfieldVecs(Bool_t rotB) |
virtual void | setRotationMatrix(TRotation* pRM) |
virtual 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) |
virtual void | TObject::SetUniqueID(UInt_t uid) |
virtual void | setUseConstField(Bool_t constField) |
virtual void | ShowMembers(TMemberInspector&) |
virtual void | Streamer(TBuffer&) |
void | StreamerNVirtual(TBuffer& ClassDef_StreamerNVirtual_b) |
virtual void | TObject::SysError(const char* method, const char* msgfmt) const |
Bool_t | TObject::TestBit(UInt_t f) const |
Int_t | TObject::TestBits(UInt_t f) const |
virtual void | TObject::UseCurrentStyle() |
virtual void | TObject::Warning(const char* method, const char* msgfmt) const |
virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) |
virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const |
virtual void | TObject::DoError(int level, const char* location, const char* fmt, va_list va) const |
void | TObject::MakeZombie() |
virtual Double_t | rkSingleStep(TVectorD& stateVec, TMatrixD& fPropStep, Double_t stepSize, Bool_t bCalcJac = kTRUE) |
enum TObject::EStatusBits { | kCanDelete | |
kMustCleanup | ||
kObjInCanvas | ||
kIsReferenced | ||
kHasUUID | ||
kCannotPick | ||
kNoContextMenu | ||
kInvalidObject | ||
}; | ||
enum TObject::[unnamed] { | kIsOnHeap | |
kNotDeleted | ||
kZombie | ||
kBitMask | ||
kSingleKey | ||
kOverwrite | ||
kWriteDelete | ||
}; |
Bool_t | bConstField | Use a constant magnetic field instead of fieldMap. |
Bool_t | bDoDEDX | Calculate energy loss. |
Bool_t | bDoMS | Calculate coulomb multiple scattering. |
Bool_t | bElossErr | Encountered errors during energy loss calculation. Reset in every propagateToPlane() call. |
Bool_t | bFillPointArrays | == kTRUE if point arrays should be filled |
Bool_t | bPrintElossErr | Avoid repeated prints of the same error message. |
Bool_t | bPrintErr | Show error messages. |
Bool_t | bPrintWarn | Show warning messages. |
Bool_t | bRotBfield | ! Do/Don't do coordinate transformation of B-field vectors. |
Bool_t | direction | Propagation direction: kIterForward/kIterBackward. |
Double_t | energyLoss | ! Energy loss during stepping in MeV/particle charge. |
HMdcTrackGField* | fieldMap | ! Pointer to B-field map. |
Double_t | fieldScaleFact | ! Factor of the magnetic field strength. |
TObjArray | fieldTrack | Field at Points along trajectory stored |
Float_t | initialStepSize | ! initial RK step size |
Int_t | jstep | ! Step number. |
TVector3 | magField | ! Use a constant magnetic field instead of fieldMap. |
Float_t | maxDist | ! maximum distance for straight line approximation |
Int_t | maxNumSteps | ! maximum number of Runge-Kutta steps |
Int_t | maxNumStepsPCA | ! maximum number of attempts to find the point of closest approach of the track to a wire |
Double_t | maxPos | Maximum allowed values for x and y coordinates. |
Float_t | maxPrecision | ! maximum required precision for a single step |
Double_t | maxPropMat | Maximmum allowed value for an element of the propagator matrix. |
Float_t | maxStepSize | ! maximum stepsize |
Double_t | maxTan | Maximum allowed values for tx and ty. |
Double_t | minLengthCalcQ | ! minimum step length where process noise is still calculated. |
Double_t | minMom | Minimum required value for momentum in MeV/c. |
Float_t | minPrecision | ! minimum required precision for a single step |
Float_t | minStepSize | ! minimum stepsize |
TRotation* | pRotMat | ! Rotation matrix for possible coordinate transformations of B-field vectors. |
TObjArray | pointsTrack | Points along trajectory stored |
Double_t | stepLength | ! Length of last RK step in mm. |
Float_t | stepSizeDec | ! factor to decrease stepsize |
Float_t | stepSizeInc | ! factor to increase stepsize |
Double_t | trackLength | ! Track length in mm. |
Bool_t | trackOk | Encountered errors during track propagation. |
Double_t | trackPosAtZ | ! Store z position of track during Runge-Kutta propagation. |
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.
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.
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
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)
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.
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.
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.
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.
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.
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.
Resets error flags and clears arrays that store points/field along the trajectory. Call this every time when fitting a new track.
Check propagator matrix for INFs/NaNs or too large entries.
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.
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.
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.
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.
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).
{ fieldMap = fpField; fieldScaleFact = fpol; }