#ifndef HKalSystem_h #define HKalSystem_h // from ROOT #include "TRotation.h" #include "TMatrixD.h" class TVector3; #include "TVectorD.h" //? daf output files #include "TFile.h" #include "TNtupleD.h" // from hydra class HCategory; class HMdcTrackGField; #include "hkaldef.h" #include "hkalrungekutta.h" #include "hkaltracksite.h" class HKalSystem : public TObject { private: Bool_t bDoDEDX; // Energy loss. Bool_t bDoMS; // Multiple scattering. Bool_t bDoSmooth; //! Do smoothing. Bool_t bPrintWarn; //! Print warning messages. Bool_t bDoDaf; // Run the Deterministic Annealing Filter. Bool_t bTrackAccepted; // Track filtering done without errors. Double_t chi2; // chi2 of track. Double_t chi2High; //! The maximum chi^2 where the track fitting is still accepted. Double_t dafChi2Cut; // Cut-off parameter for the annealing filter. TArrayD dafT; // Annealing factors ("temperatures") used in the DAF iterations. Bool_t direction; // Propagation direction: kIterForward/kIterBackward Int_t filtType; // Switch between alternate formulations of the Kalman equations. Int_t hitType; // Wire or segment hits. TVectorD iniStateVec; // Estimation of the track state vector at the first measurement site. Int_t nKalRuns; // Number of Kalman filter iterations. Int_t nHitsInTrack; // Number of sites in current track. Int_t nMaxSites; // Maximum number of sites that can be stored. Int_t pid; // Geant particle id. Int_t rotCoords; // Option to tilt coordinate system for track fitting. Int_t nSites; // Number of measurement sites in track. Double_t trackLength; // Track length. Int_t trackNum; // Number of tracks fitted. HKalTrackSite **sites; //! Array of track sites. HKalRungeKutta trackPropagator; //! The object that realizes the track propagation. TRotation *pRotMat; //! Rotation matrix for possible coordinate tilting. TVector3 *pTransVec; //! Translation vector for possible coordinate transformations. Bool_t bFillPointArrays; // == kTRUE if point arrays should be filled TObjArray pointsTrack; // Points from Runge-Kutta stepping along trajectory stored TObjArray fieldTrack; // Field from Runge-Kutta stepping at Points along trajectory stored TNtupleD *hDafMonitor; //? daf test protected: virtual void filterConventional (Int_t iSite); virtual void filterJoseph (Int_t iSite); virtual void filterSequential (Int_t iSite); virtual void filterSwerling (Int_t iSite); virtual void covUpdateUD (Int_t iFromSite, Int_t iToSite); virtual void filterUD (Int_t iSite); virtual void updateChi2Filter (Int_t iSite); virtual Kalman::coordSys getFilterInCoordSys() const; public: TNtupleD *hKalMon; HKalSystem(Int_t nHits, Int_t measDim, Int_t stateDim, HMdcTrackGField *fMap, Double_t fpol, Double_t chiHigh=50.); virtual ~HKalSystem(); void calcMeasVecFromState (TVectorD &projMeasVec, const HKalTrackSite *site, Kalman::kalFilterTypes stateType, Kalman::coordSys sys, Int_t iHit=0) const; virtual void calcProjector (HKalTrackSite *site); virtual Bool_t checkCovMat (const TMatrixD &fCov) const; virtual Bool_t fitTrack (const TObjArray &hits, const TVectorD &iniStateVec, const TMatrixD &iniCovMat, Int_t pId); virtual Bool_t fitWithDaf (); virtual Bool_t predictAndFilter (Int_t fromSite, Int_t toSite); virtual Bool_t predictAndFilter2Dhits (Int_t fromSite, Int_t toSite); virtual Bool_t predictAndFilterWireHits (Int_t fromSite, Int_t toSite); virtual Bool_t filter (Int_t iSite); virtual Bool_t filterWireHit (Int_t iSite); virtual Bool_t smoothAll (); virtual Bool_t excludeSite (Int_t iSite); virtual void sortHits (); virtual void transformFromSectorToTrack(); virtual void transformFromTrackToSector(); virtual void updateSites (const TObjArray &hits); virtual Double_t getChi2 () const { return chi2 / getNdf(); } virtual Double_t getDafChi2Cut () const { return dafChi2Cut; } virtual TNtupleD* getDafResults () const { return hDafMonitor; } virtual const Double_t* getDafT () const { return dafT.GetArray(); } virtual Bool_t getDirection () const { return direction; } virtual Bool_t getDoDaf () const { return bDoDaf; } virtual Bool_t getDoEnerLoss () const { return bDoDEDX; } virtual Bool_t getDoMultScat () const { return bDoMS; } virtual Bool_t getDoSmooth () const { return bDoSmooth; } virtual Double_t getFieldIntegral() const { return trackPropagator.calcFieldIntegral().Mag(); } virtual Bool_t getImpact (Double_t& alpha, Double_t& mindist, const TVector3 &pos, const TVector3 dir, Int_t sec, Int_t mod, Int_t lay, Int_t cell) const; virtual TVectorD const& getIniStateVec () const { return iniStateVec; } virtual TObjArray const& getFieldTrack () const { return fieldTrack; } virtual Int_t getHitType () const { return hitType; } virtual Bool_t getLastTrackAccepted() const { return bTrackAccepted; } virtual Int_t getNdafs () const { return dafT.GetSize(); } virtual Int_t getNhits () const { return nHitsInTrack; } virtual Int_t getNiter () const { return nKalRuns; } virtual Double_t getNdf () const; virtual Int_t getNsites () const { return nSites; } virtual inline HKalTrackSite* getSite (UInt_t site) const { #ifdef kalDebug if(site < (UInt_t)nMaxSites) { return sites[site]; } else { Warning("getSite()", Form("Index %i out of range.", site)); return NULL; } #else return sites[site]; #endif } virtual Int_t getMeasDim () const { return getSite(0)->getMeasDim(); } virtual Int_t getPid () const { return pid; } virtual TObjArray const& getPointsTrack () const { return pointsTrack; } virtual Int_t getStateDim (Kalman::coordSys coord=kSecCoord) const { return getSite(0)->getStateDim(coord); } virtual Double_t getTrackLength () const { return trackLength; } virtual Int_t getTrackNum () const { return trackNum; } virtual void setConstField (Bool_t constField) { trackPropagator.setUseConstField(constField); } virtual void setDafPars (Double_t chi2cut, const Double_t *T, Int_t n); virtual void setDirection (Bool_t dir) { direction = dir; trackPropagator.setDirection(dir); } virtual void setDoEnerLoss (Bool_t dedx) { bDoDEDX = dedx; trackPropagator.setDoEnerLoss(dedx); } virtual void setDoMultScat (Bool_t ms) { bDoMS = ms; trackPropagator.setDoMultScat(ms); } virtual void setFillPointsArrays(Bool_t fill) { bFillPointArrays = fill; trackPropagator.setFillPointsArrays(fill); } virtual void setFieldMap (HMdcTrackGField *fMap, Double_t fpol) { trackPropagator.setFieldMap(fMap, fpol); } virtual void setFieldVector (const TVector3 &B) { trackPropagator.setFieldVector(B); } virtual void setHitType (Kalman::kalHitTypes hType) { hitType = hType; } virtual void setFilterMethod (Kalman::filtMethod type) { filtType = type; } virtual void setNumIterations (Int_t kalRuns) { nKalRuns = kalRuns; } virtual void setPrintWarnings (Bool_t print); virtual void setRotationAngles (Double_t rotXAngle, Double_t rotYAngle); virtual void setRotation (Kalman::kalRotateOptions rotate); virtual void setSmoothing (Bool_t smooth) { bDoSmooth = smooth; } ClassDef(HKalSystem,0) }; #endif // HKalSystem_h