ROOT logo
#ifndef HKALFILTER_H
#define HKALFILTER_H

// from ROOT
class TArrayI;
class TF1;
#include "TString.h"
class TObjArray;

// from hydra
#include "hcategory.h"
class    HMetaMatch2;
class    HMdcTrkCand;
#include "hreconstructor.h"

#include "hkaldef.h"
#include "hkalifilt.h"
#include "hkalinput.h"
#include "hkalmetamatcher.h"
#include "hkaltrack.h"

class  HKalDetCradle;


class HKalFilterTask : public HReconstructor {

private:

    HKalIFilt*  kalsys;            //! Kalman filter object.
    HKalInput*  input;             //! Retrieves measurements of the next track.
    HKalMetaMatcher metaMatcher;   // Matches track with Meta detector.
    const TString noKalman;

    HCategory*  fCatKalTrack;      //! Output category.
    HCategory*  fCatKalSite;       //! Output category.
    HCategory*  fCatKalHit2d;      //! Output category. Filled when fitting segments.
    HCategory*  fCatKalHitWire;    //! Output category. Filled when fitting wire hits.
    HCategory*  fCatMetaMatch;     //! Meta match category.
    HCategory*  fCatTofHit;        //! TofHit categeory.
    HCategory*  fCatRpcClst;       //! RpcCluster category.
    HCategory*  fCatSplineTrack;   //1 Retrieve momentum estimate from spline.

    TF1*        fMomErr;           //! Function to calculate the initial momentum error. Depends on theta in degrees.
    TF1*        fTxErr;            //! Function to calculate the initial parameter tan(p_x/p_z). Depends on theta in degrees.
    TF1*        fTyErr;            //! Function to calculate the initial parameter tan(p_x/p_z). Depends on theta in degrees.

    TObjArray*  materials;         //! Optional pointer to array with materials for the MDCs.

    Bool_t      bCompHits;         // Consider competing hits for the DAF.
    Bool_t      bDaf;              // Apply the Deterministic Annealing Filter (DAF).
    Bool_t      bGeantPid;         // Run with Geant PID.
    Bool_t      bSim;              // Simulation/real data.
    Bool_t      bWire;             // Fit wire or segment hits.

    Bool_t      bFillSites;        // Fill Kalman categories for measurement sites and hits. Turned off by default.

    Int_t       iniSvMethod;       // Input for initial state vector. default = Spline, 1 = Geant, 2 = smeared Geant, 2 = Runge-Kutta
    Int_t       numTracks;         // Number of reconstructed tracks
    Int_t       numTracksErr;      // Number of tracks where reconstruction failed
    Int_t       measDim;           // Dimension of measurement vector.
    Int_t       stateDim;          // Dimension of track state vector.

    TArrayI     dopid;             // Fit only tracks with certain pids.
    Double_t    errMom;            // Error of initial momentum estimate as a fraction: 0.05 <=> 5% uncertainty.  Will only be used if fMomErr is not defined or if the initial state estimate is from Geant.
    Double_t    errX;              // Error of track state x-position in sector coordinates and mm.
    Double_t    errY;              // Error of track state y-position in sector coordinates and mm.
    Double_t    errTx;             // Error of track state Tan(p_x/p_z) in sector coordinates and radians. Will only be used if fTxErr is not defined or if the initial state estimate is from Geant.
    Double_t    errTy;             // Error of track state Tan(p_y/p_z) in sector coordinates and radians. Will only be used if fTyErr is not defined or if the initial state estimate is from Geant.

    Int_t       counterstep;       // Print out after fitting this amount of events.
    Bool_t      bPrintWarn;        // Print/suppress warnings during tracking.
    Bool_t      bPrintErr;         // Print/suppress error messages during tracking.

    Int_t       refId;             // Runtime reference ID.

    Int_t       (*fGetPid)(HMdcTrkCand*); //! Function for initial PID hypothesis.

protected:

    virtual Bool_t       createKalSystem();

    virtual void         fillData       (HMetaMatch2* const pMetaMatch, const TObjArray &allhitsGeantMdc,
					 HMdcSeg* const inSeg, HMdcSeg* const outSeg);

    virtual void         fillDataSites  (Int_t &iFirstSite, Int_t &iLastSite,
                                         const TObjArray &allhitsGeantMdc);

    virtual HKalTrack*   fillDataTrack(Int_t &iKalTrack, HMetaMatch2* const pMetaMatch,
                                       Int_t iCatSiteFist, Int_t iCatSiteLast,
                                       HMdcSeg* const inSeg, HMdcSeg* const outSeg,
				       const HKalMetaMatch &kalMatch) const;

public:

    HKalFilterTask(Int_t refid, Bool_t sim=kFALSE, Bool_t wire=kFALSE,
		   Bool_t daf=kFALSE, Bool_t comp=kFALSE);

    ~HKalFilterTask();

    virtual Int_t        getIniPid   (HMdcTrkCand const* const cand) const;

    virtual Bool_t       getIniSv    (TVectorD &inisv, TMatrixD &iniC,
				      Int_t pid, const TObjArray &allhits,
				      HMetaMatch2 const* const pMetaMatch,
				      HMdcSeg const* const inSeg,
				      HMdcSeg const* const outSeg) const;

    virtual Bool_t       getIniSvGeant(TVectorD &inisv, TMatrixD &iniC,
				       const TObjArray &allhitsGeantMdc,
				       Int_t pid, Bool_t bSmear) const;

    virtual Bool_t       getIniSvRungeKutta(TVectorD &inisv, TMatrixD &iniC, Int_t pid,
				      const TObjArray& allhits,
				      HMetaMatch2 const* const pMetaMatch) const;

    virtual Bool_t       doPid       (Int_t pid);

    virtual Int_t        execute     (void);

    virtual Bool_t       init        (void);

    virtual Bool_t       reinit      (void);

    virtual Bool_t       finalize    (void);

    virtual HMdcTrkCand* nextTrack   (TObjArray& allhits);

    virtual Double_t             getChi2         () const            { return kalsys->getChi2(); }

    virtual void                 getCovErrs      (Int_t &nSymErrs, Int_t &nPosDefErrs) const { kalsys->getCovErrs(nSymErrs, nPosDefErrs); }

    virtual Double_t             getFieldIntegral() const            { return kalsys->getFieldIntegral(); }

    virtual Int_t                getHitType      () const            { return kalsys->getHitType(); }

    virtual Int_t                getNhits        () const            { return kalsys->getNhits(); }

    virtual Double_t             getNdf          () const            { return kalsys->getNdf(); }

    virtual Int_t                getNsites       () const            { return kalsys->getNsites(); }

    virtual Int_t                getMeasDim      () const            { return kalsys->getMeasDim(); }

    virtual TObjArray const&     getPointsTrack  () const            { return kalsys->getPointsTrack(); }

    virtual TObjArray const&     getFieldTrack   () const            { return kalsys->getFieldTrack(); }

    virtual const HKalIFilt*       getKalSys         () const            { return kalsys; }
    virtual const HKalInput*       getKalInput       () const            { return input; }
    virtual const HKalMetaMatcher* getKalMetaMatcher () const            { return &metaMatcher; }

    virtual Int_t                getStateDim     (Kalman::coordSys coord=kSecCoord) const { return kalsys->getStateDim(coord); }

    virtual Double_t             getTrackLength  () const            { return kalsys->getTrackLength(); }

    virtual Int_t                getTrackNum     () const            { return kalsys->getTrackNum(); }

    virtual void   setConstField      (Bool_t constField)                       { (kalsys) ?   kalsys->setConstField(constField) : Warning("setConstField()","%s", noKalman.Data()); }

    virtual void   setCounterStep     (Int_t  c)                                { counterstep = c; }

    virtual void   setDafPars         (Double_t chi2cut, const Double_t *T, Int_t n) { kalsys->setDafPars(chi2cut, &T[0], n); }

    virtual void   setDirection       (Bool_t dir)                              { (kalsys) ? kalsys->setDirection(dir)          : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setDoEnerLoss      (Bool_t dedx)                             { (kalsys) ? kalsys->setDoEnerLoss(dedx)        : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setDoMultScat      (Bool_t ms)                               { (kalsys) ? kalsys->setDoMultScat(ms)          : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setDoPid           (Int_t pid[], Int_t n);

    virtual void   setErrors          (Double_t dx, Double_t dy, Double_t dtx, Double_t dty, Double_t dmom);

    virtual void   setFillPointsArrays(Bool_t fill)                             { (kalsys) ? kalsys->setFillPointsArrays(fill)  : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setFillSites       (Bool_t fill)                             { bFillSites = fill; }

    virtual void   setFieldMap        (HMdcTrackGField *fMap, Double_t scale)   { (kalsys) ? kalsys->setFieldMap(fMap, scale)   : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setFieldVector     (const TVector3 &B)                       { (kalsys) ? kalsys->setFieldVector(B)          : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setFilterMethod    (Kalman::filtMethod type)                 { (kalsys) ? kalsys->setFilterMethod(type)      : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual Bool_t setFilterPars      (Bool_t wire, Bool_t daf, Bool_t comp);

    virtual void   setFuncMomErr      (TF1* f)                                  { fMomErr = f; }

    virtual void   setFuncTxErr       (TF1* f)                                  { fTxErr = f; }

    virtual void   setFunKyErr        (TF1* f)                                  { fTyErr = f; }

    virtual void   setIniStateMethod  (Int_t value) { iniSvMethod = value; }

    virtual void   setMdcMaterials    (TObjArray *mats) { materials = mats; }

    virtual void   setNumIterations   (Int_t kalRuns)                           { (kalsys) ? kalsys->setNumIterations(kalRuns)  : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setPid             (Int_t (*fPid)(HMdcTrkCand*)) { fGetPid = fPid; }

    virtual void   setRotation        (Kalman::kalRotateOptions rotate)         { (kalsys) ? kalsys->setRotation(rotate)        : Warning("setConstField()","%s",  noKalman.Data()); }

    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) {
	(kalsys) ? kalsys->setRungeKuttaParams(initialStpSize, stpSizeDec, stpSizeInc, maxStpSize, minStpSize, minPrec, maxPrec, maxNumStps, maxNumStpsPCA, maxDst, minLngthCalcQ)       : Warning("setRungeKuttaParams()","%s",  noKalman.Data()); }

    virtual void   setSmoothing       (Bool_t smooth)                           { (kalsys) ? kalsys->setSmoothing(smooth)       : Warning("setConstField()","%s",  noKalman.Data()); }

    virtual void   setUseGeantPid     (Bool_t geant)                            { bGeantPid = geant; }

    virtual void   setVerbose         (Int_t v);

    ClassDef(HKalFilterTask, 0);
};
#endif
 hkalfiltertask.h:1
 hkalfiltertask.h:2
 hkalfiltertask.h:3
 hkalfiltertask.h:4
 hkalfiltertask.h:5
 hkalfiltertask.h:6
 hkalfiltertask.h:7
 hkalfiltertask.h:8
 hkalfiltertask.h:9
 hkalfiltertask.h:10
 hkalfiltertask.h:11
 hkalfiltertask.h:12
 hkalfiltertask.h:13
 hkalfiltertask.h:14
 hkalfiltertask.h:15
 hkalfiltertask.h:16
 hkalfiltertask.h:17
 hkalfiltertask.h:18
 hkalfiltertask.h:19
 hkalfiltertask.h:20
 hkalfiltertask.h:21
 hkalfiltertask.h:22
 hkalfiltertask.h:23
 hkalfiltertask.h:24
 hkalfiltertask.h:25
 hkalfiltertask.h:26
 hkalfiltertask.h:27
 hkalfiltertask.h:28
 hkalfiltertask.h:29
 hkalfiltertask.h:30
 hkalfiltertask.h:31
 hkalfiltertask.h:32
 hkalfiltertask.h:33
 hkalfiltertask.h:34
 hkalfiltertask.h:35
 hkalfiltertask.h:36
 hkalfiltertask.h:37
 hkalfiltertask.h:38
 hkalfiltertask.h:39
 hkalfiltertask.h:40
 hkalfiltertask.h:41
 hkalfiltertask.h:42
 hkalfiltertask.h:43
 hkalfiltertask.h:44
 hkalfiltertask.h:45
 hkalfiltertask.h:46
 hkalfiltertask.h:47
 hkalfiltertask.h:48
 hkalfiltertask.h:49
 hkalfiltertask.h:50
 hkalfiltertask.h:51
 hkalfiltertask.h:52
 hkalfiltertask.h:53
 hkalfiltertask.h:54
 hkalfiltertask.h:55
 hkalfiltertask.h:56
 hkalfiltertask.h:57
 hkalfiltertask.h:58
 hkalfiltertask.h:59
 hkalfiltertask.h:60
 hkalfiltertask.h:61
 hkalfiltertask.h:62
 hkalfiltertask.h:63
 hkalfiltertask.h:64
 hkalfiltertask.h:65
 hkalfiltertask.h:66
 hkalfiltertask.h:67
 hkalfiltertask.h:68
 hkalfiltertask.h:69
 hkalfiltertask.h:70
 hkalfiltertask.h:71
 hkalfiltertask.h:72
 hkalfiltertask.h:73
 hkalfiltertask.h:74
 hkalfiltertask.h:75
 hkalfiltertask.h:76
 hkalfiltertask.h:77
 hkalfiltertask.h:78
 hkalfiltertask.h:79
 hkalfiltertask.h:80
 hkalfiltertask.h:81
 hkalfiltertask.h:82
 hkalfiltertask.h:83
 hkalfiltertask.h:84
 hkalfiltertask.h:85
 hkalfiltertask.h:86
 hkalfiltertask.h:87
 hkalfiltertask.h:88
 hkalfiltertask.h:89
 hkalfiltertask.h:90
 hkalfiltertask.h:91
 hkalfiltertask.h:92
 hkalfiltertask.h:93
 hkalfiltertask.h:94
 hkalfiltertask.h:95
 hkalfiltertask.h:96
 hkalfiltertask.h:97
 hkalfiltertask.h:98
 hkalfiltertask.h:99
 hkalfiltertask.h:100
 hkalfiltertask.h:101
 hkalfiltertask.h:102
 hkalfiltertask.h:103
 hkalfiltertask.h:104
 hkalfiltertask.h:105
 hkalfiltertask.h:106
 hkalfiltertask.h:107
 hkalfiltertask.h:108
 hkalfiltertask.h:109
 hkalfiltertask.h:110
 hkalfiltertask.h:111
 hkalfiltertask.h:112
 hkalfiltertask.h:113
 hkalfiltertask.h:114
 hkalfiltertask.h:115
 hkalfiltertask.h:116
 hkalfiltertask.h:117
 hkalfiltertask.h:118
 hkalfiltertask.h:119
 hkalfiltertask.h:120
 hkalfiltertask.h:121
 hkalfiltertask.h:122
 hkalfiltertask.h:123
 hkalfiltertask.h:124
 hkalfiltertask.h:125
 hkalfiltertask.h:126
 hkalfiltertask.h:127
 hkalfiltertask.h:128
 hkalfiltertask.h:129
 hkalfiltertask.h:130
 hkalfiltertask.h:131
 hkalfiltertask.h:132
 hkalfiltertask.h:133
 hkalfiltertask.h:134
 hkalfiltertask.h:135
 hkalfiltertask.h:136
 hkalfiltertask.h:137
 hkalfiltertask.h:138
 hkalfiltertask.h:139
 hkalfiltertask.h:140
 hkalfiltertask.h:141
 hkalfiltertask.h:142
 hkalfiltertask.h:143
 hkalfiltertask.h:144
 hkalfiltertask.h:145
 hkalfiltertask.h:146
 hkalfiltertask.h:147
 hkalfiltertask.h:148
 hkalfiltertask.h:149
 hkalfiltertask.h:150
 hkalfiltertask.h:151
 hkalfiltertask.h:152
 hkalfiltertask.h:153
 hkalfiltertask.h:154
 hkalfiltertask.h:155
 hkalfiltertask.h:156
 hkalfiltertask.h:157
 hkalfiltertask.h:158
 hkalfiltertask.h:159
 hkalfiltertask.h:160
 hkalfiltertask.h:161
 hkalfiltertask.h:162
 hkalfiltertask.h:163
 hkalfiltertask.h:164
 hkalfiltertask.h:165
 hkalfiltertask.h:166
 hkalfiltertask.h:167
 hkalfiltertask.h:168
 hkalfiltertask.h:169
 hkalfiltertask.h:170
 hkalfiltertask.h:171
 hkalfiltertask.h:172
 hkalfiltertask.h:173
 hkalfiltertask.h:174
 hkalfiltertask.h:175
 hkalfiltertask.h:176
 hkalfiltertask.h:177
 hkalfiltertask.h:178
 hkalfiltertask.h:179
 hkalfiltertask.h:180
 hkalfiltertask.h:181
 hkalfiltertask.h:182
 hkalfiltertask.h:183
 hkalfiltertask.h:184
 hkalfiltertask.h:185
 hkalfiltertask.h:186
 hkalfiltertask.h:187
 hkalfiltertask.h:188
 hkalfiltertask.h:189
 hkalfiltertask.h:190
 hkalfiltertask.h:191
 hkalfiltertask.h:192
 hkalfiltertask.h:193
 hkalfiltertask.h:194
 hkalfiltertask.h:195
 hkalfiltertask.h:196
 hkalfiltertask.h:197
 hkalfiltertask.h:198
 hkalfiltertask.h:199
 hkalfiltertask.h:200
 hkalfiltertask.h:201
 hkalfiltertask.h:202
 hkalfiltertask.h:203
 hkalfiltertask.h:204
 hkalfiltertask.h:205
 hkalfiltertask.h:206
 hkalfiltertask.h:207
 hkalfiltertask.h:208
 hkalfiltertask.h:209
 hkalfiltertask.h:210
 hkalfiltertask.h:211
 hkalfiltertask.h:212
 hkalfiltertask.h:213
 hkalfiltertask.h:214
 hkalfiltertask.h:215
 hkalfiltertask.h:216
 hkalfiltertask.h:217
 hkalfiltertask.h:218