#ifndef HKalRungeKutta_h
#define HKalRungeKutta_h
#include "TMatrixD.h"
#include "TObjArray.h"
#include "TRotation.h"
class TVector3;
#include "TVectorD.h"
#include "hmdctrackgfield.h"
#include "hkaldef.h"
class HKalMdcMeasLayer;
class HKalPlane;
class HKalRungeKutta : public TObject {
private:
Bool_t bConstField;
Bool_t bDoDEDX;
Bool_t bDoMS;
Bool_t bRotBfield;
Bool_t direction;
Double_t fieldScaleFact;
TVector3 magField;
TRotation *pRotMat;
Double_t trackPosAtZ;
Double_t energyLoss;
Double_t trackLength;
Double_t stepLength;
Int_t jstep;
Float_t initialStepSize;
Float_t stepSizeInc;
Float_t stepSizeDec;
Float_t maxStepSize;
Float_t minStepSize;
Float_t maxPrecision;
Float_t minPrecision;
Float_t maxDist;
Int_t maxNumSteps;
Int_t maxNumStepsPCA;
Double_t minLengthCalcQ;
Bool_t bFillPointArrays;
TObjArray pointsTrack;
TObjArray fieldTrack;
Bool_t bElossErr;
Bool_t bPrintElossErr;
Bool_t bPrintErr;
Bool_t bPrintWarn;
Bool_t trackOk;
Double_t maxTan;
Double_t maxPos;
Double_t maxPropMat;
Double_t minMom;
HMdcTrackGField *fieldMap;
protected:
virtual Double_t rkSingleStep(TVectorD &stateVec, TMatrixD &fPropStep, Double_t stepSize, Bool_t bCalcJac=kTRUE);
public:
HKalRungeKutta();
virtual ~HKalRungeKutta();
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 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 calcRadLoss (TMatrixD &fProc, Double_t length, Double_t mass, Double_t qp, Double_t radLength) const;
virtual TVector3 calcFieldIntegral () const;
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 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 void clear ();
virtual Bool_t checkPropMat (TMatrixD &fProp) const;
virtual Bool_t checkTrack (TVectorD &stateVec) const;
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 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 Double_t getEnergyLoss () const { return energyLoss; }
virtual Int_t getNrStep () const { return jstep; }
virtual Double_t getTrackLength() const { return trackLength; }
virtual Double_t getStepLength () const { return stepLength; }
virtual TObjArray const& getPointsTrack() const { return pointsTrack; }
virtual TObjArray const& getFieldTrack () const { return fieldTrack; }
virtual void setDirection (Bool_t dir) { direction = dir; }
virtual void setDoEnerLoss (Bool_t dedx) { bDoDEDX = dedx; }
virtual void setDoMultScat (Bool_t ms) { bDoMS = ms; }
virtual void setFieldFact (Double_t fpol) { fieldScaleFact = fpol; }
virtual void setFieldMap (HMdcTrackGField *fpField, Double_t fpol) { fieldMap = fpField; fieldScaleFact = fpol; }
virtual void setFieldVector (const TVector3 &B) { magField = B; }
virtual void setFillPointsArrays (Bool_t fill) { bFillPointArrays = fill; }
virtual void setPrintErrors (Bool_t print) { bPrintErr = print; }
virtual void setPrintWarnings (Bool_t print) { bPrintWarn = print; }
virtual void setRotationMatrix (TRotation *pRM) { pRotMat = pRM; }
virtual void setRotateBfieldVecs (Bool_t rotB) { bRotBfield = rotB; }
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 setUseConstField (Bool_t constField) { bConstField = constField; }
ClassDef(HKalRungeKutta,0)
};
#endif // HKalRungeKutta_h