ROOT logo
#ifndef HKalIFilt_h
#define HKalIFilt_h

// from ROOT
#include "TRotation.h"
#include "TMatrixD.h"
class     TVector3;
#include "TVectorD.h"

// from hydra
class HCategory;
class HMdcTrackGField;

#include "hkaldef.h"
#include "hkalrungekutta.h"
#include "hkaltracksite.h"


class HKalIFilt : 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   bPrintErr;      //! Print error messages.
    Bool_t   bTrackAccepted; // Track filtering done without errors.
    Double_t betaInput;      // Beta value used for initial particle hypothesis.
    Double_t chi2;           // chi2 of track. Will be -1 if fit failed.
    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    nCondErrs;      // Number of times when a matrix was ill-conditioned for inversion. Only filled if kalDebug > 0.
    Int_t    nCovSymErrs;    // Number of symmetry breaking in the covariance matrix. Only filled if kalDebug > 0.
    Int_t    nCovPosDefErrs; // Number of times the covariance matrix was not positive definite. Only filled if kalDebug > 0.
    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 from target.
    Double_t trackLengthAtLastMdc; // Track length from target to last MDC.
    Int_t    trackNum;       // Number of tracks fitted.

    HKalTrackSite  **sites;           //! Array of MDC track sites.
    TVector3         posVertex;       //! Position information at vertex.
    TVectorD         svVertex;        //! Track state at vertex.
    TVector3         posMeta;         //! Position information at meta detector.
    TVectorD         svMeta;          //! Track state at META detector.
    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

protected:

    virtual Bool_t calcProjector      (Int_t iSite) const = 0;

    virtual Bool_t checkSitePreFilter (Int_t iSite) const;

    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   filterUD           (Int_t iSite);

    virtual void   newTrack           (const TObjArray &hits, const TVectorD &iniSv,
				       const TMatrixD &iniCovMat, Int_t pid);

    virtual void   propagateCovUD     (Int_t iFromSite, Int_t iToSite);

    virtual void   propagateCovConv   (Int_t iFromSite, Int_t iToSite);

    virtual Bool_t propagateTrack     (Int_t iFromSite, Int_t iToSite);

    virtual void   updateChi2Filter   (Int_t iSite);

    virtual Kalman::coordSys    getFilterInCoordSys() const { return Kalman::kSecCoord; }

    virtual TRotation*          getRotMat()           const { return pRotMat; }

    virtual void   setChi2            (Double_t c)    { chi2 = c; }

    virtual void   setNSites          (Int_t n)       { nSites = n; }

    virtual void   setNHitsInTrack    (Int_t n)       { nHitsInTrack = n; }

    virtual void   setTrackChi2       (Double_t c)    { chi2 = c; }

    virtual void   setTrackLength     (Double_t l)    { trackLength = l; }

    virtual void   setTrackLengthAtLastMdc (Double_t l)    { trackLengthAtLastMdc = l; }

public:

    HKalIFilt(Int_t nHits, Int_t measDim, Int_t stateDim, HMdcTrackGField *fMap, Double_t fpol);

    virtual ~HKalIFilt();

    virtual Bool_t calcMeasVecFromState      (TVectorD &projMeasVec, HKalTrackSite const* const site,
                                              Kalman::kalFilterTypes stateType, Kalman::coordSys sys) const;

    virtual Bool_t checkCovMat               (const TMatrixD &fCov) const;

    virtual Bool_t excludeSite               (Int_t iSite);

    virtual Bool_t filter                    (Int_t iSite);

    virtual Bool_t fitTrack                  (const TObjArray &hits, const TVectorD &iniStateVec,
					      const TMatrixD &iniCovMat, Int_t pId);

    virtual Bool_t propagate                 (Int_t iFromSite, Int_t iToSite);

    virtual Bool_t propagateToPlane          (TVectorD& svTo, const TVectorD &svFrom,
					      const HKalMdcMeasLayer &measLayFrom, const HKalMdcMeasLayer &measLayTo,
					      Int_t pid, Bool_t dir);

    virtual Bool_t runFilter                 (Int_t fromSite, Int_t toSite);

    virtual Bool_t smooth                    ();

    virtual void   sortHits                  ();

    virtual Bool_t traceToMeta               (const TVector3& metaHit, const TVector3& metaNormVec);

    virtual Bool_t traceToVertex             ();

    virtual void   transformFromSectorToTrack();

    virtual void   transformFromTrackToSector();

    virtual void   updateSites               (const TObjArray &hits);

    virtual Double_t            getBetaInput    () const           { return betaInput; }

    virtual Double_t            getChi2         () const           { return chi2; }

    virtual void                getCovErrs      (Int_t &nSymErrs, Int_t &nPosDefErrs) const { nSymErrs = nCovSymErrs; nPosDefErrs = nCovPosDefErrs; }

    virtual Double_t            getDafChi2Cut   () const           { return -1.; }

    virtual const Double_t*     getDafT         () const           { return NULL; }

    virtual Bool_t              getDirection    () const           { return direction; }

    virtual Bool_t              getDoDaf        () const           { return kFALSE; }

    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 Int_t               getFilterMethod () const           { return filtType; }

    virtual TVectorD  const&    getIniStateVec  () const           { return iniStateVec; }

    virtual TObjArray const&    getFieldTrack   () const           { return fieldTrack; }

    virtual TMatrixD  const&    getHitErrMat    (HKalTrackSite* const site) const;

    virtual Int_t               getHitType      () const           { return hitType; }

    virtual TVectorD  const&    getHitVec       (HKalTrackSite* const site) const;

    virtual Bool_t              getLastTrackAccepted() const       { return bTrackAccepted; }

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

    virtual void                getMetaPos      (Double_t &x, Double_t &y, Double_t &z) const;

    virtual Int_t               getNdafs        () const           { return 0; }

    virtual Double_t            getNdf          () const;

    virtual Int_t               getNhits        () const           { return nHitsInTrack; }

    virtual Int_t               getNiter        () const           { return nKalRuns; }

    virtual Int_t               getNmaxSites    () const           { return nMaxSites; }

    virtual Int_t               getNsites       () const           { return nSites; }

    virtual Int_t               getPid          () const           { return pid; }

    virtual TObjArray const&    getPointsTrack  () const           { return pointsTrack; }

    virtual const HKalRungeKutta* getTrackPropagator()  const      { return &trackPropagator; }

    virtual inline HKalTrackSite* getSite       (UInt_t site) const {

#if kalDebug > 0
        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 Bool_t              getPrintErr     () const           { return bPrintErr; }

    virtual Bool_t              getPrintWarn    () const           { return bPrintWarn; }

    virtual Int_t               getRotation     () const           { return rotCoords; }

    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                getVertexPos    (Double_t &x, Double_t &y, Double_t &z) const;

    virtual void setBetaInput       (Double_t b)                              { betaInput = b; }

    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 setFilterMethod    (Kalman::filtMethod type)                 { filtType = type; }

    virtual void setHitType         (Kalman::kalHitTypes hType)               { hitType = hType; }

    virtual void setNumIterations   (Int_t kalRuns)                           { nKalRuns = kalRuns; }

    virtual void setPrintWarnings   (Bool_t print);

    virtual void setPrintErrors     (Bool_t print);

    virtual void setRotationAngles  (Double_t rotXAngle, Double_t rotYAngle);

    virtual void setRotation        (Kalman::kalRotateOptions rotate);

    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) { trackPropagator.setRungeKuttaParams(initialStpSize, stpSizeDec, stpSizeInc, maxStpSize, minStpSize, minPrec, maxPrec, maxNumStps, maxNumStpsPCA, maxDst, minLngthCalcQ); }

    virtual void setSmoothing       (Bool_t smooth)                           { bDoSmooth = smooth; }

    ClassDef(HKalIFilt,0)
};

#endif // HKalIFilt_h
 hkalifilt.h:1
 hkalifilt.h:2
 hkalifilt.h:3
 hkalifilt.h:4
 hkalifilt.h:5
 hkalifilt.h:6
 hkalifilt.h:7
 hkalifilt.h:8
 hkalifilt.h:9
 hkalifilt.h:10
 hkalifilt.h:11
 hkalifilt.h:12
 hkalifilt.h:13
 hkalifilt.h:14
 hkalifilt.h:15
 hkalifilt.h:16
 hkalifilt.h:17
 hkalifilt.h:18
 hkalifilt.h:19
 hkalifilt.h:20
 hkalifilt.h:21
 hkalifilt.h:22
 hkalifilt.h:23
 hkalifilt.h:24
 hkalifilt.h:25
 hkalifilt.h:26
 hkalifilt.h:27
 hkalifilt.h:28
 hkalifilt.h:29
 hkalifilt.h:30
 hkalifilt.h:31
 hkalifilt.h:32
 hkalifilt.h:33
 hkalifilt.h:34
 hkalifilt.h:35
 hkalifilt.h:36
 hkalifilt.h:37
 hkalifilt.h:38
 hkalifilt.h:39
 hkalifilt.h:40
 hkalifilt.h:41
 hkalifilt.h:42
 hkalifilt.h:43
 hkalifilt.h:44
 hkalifilt.h:45
 hkalifilt.h:46
 hkalifilt.h:47
 hkalifilt.h:48
 hkalifilt.h:49
 hkalifilt.h:50
 hkalifilt.h:51
 hkalifilt.h:52
 hkalifilt.h:53
 hkalifilt.h:54
 hkalifilt.h:55
 hkalifilt.h:56
 hkalifilt.h:57
 hkalifilt.h:58
 hkalifilt.h:59
 hkalifilt.h:60
 hkalifilt.h:61
 hkalifilt.h:62
 hkalifilt.h:63
 hkalifilt.h:64
 hkalifilt.h:65
 hkalifilt.h:66
 hkalifilt.h:67
 hkalifilt.h:68
 hkalifilt.h:69
 hkalifilt.h:70
 hkalifilt.h:71
 hkalifilt.h:72
 hkalifilt.h:73
 hkalifilt.h:74
 hkalifilt.h:75
 hkalifilt.h:76
 hkalifilt.h:77
 hkalifilt.h:78
 hkalifilt.h:79
 hkalifilt.h:80
 hkalifilt.h:81
 hkalifilt.h:82
 hkalifilt.h:83
 hkalifilt.h:84
 hkalifilt.h:85
 hkalifilt.h:86
 hkalifilt.h:87
 hkalifilt.h:88
 hkalifilt.h:89
 hkalifilt.h:90
 hkalifilt.h:91
 hkalifilt.h:92
 hkalifilt.h:93
 hkalifilt.h:94
 hkalifilt.h:95
 hkalifilt.h:96
 hkalifilt.h:97
 hkalifilt.h:98
 hkalifilt.h:99
 hkalifilt.h:100
 hkalifilt.h:101
 hkalifilt.h:102
 hkalifilt.h:103
 hkalifilt.h:104
 hkalifilt.h:105
 hkalifilt.h:106
 hkalifilt.h:107
 hkalifilt.h:108
 hkalifilt.h:109
 hkalifilt.h:110
 hkalifilt.h:111
 hkalifilt.h:112
 hkalifilt.h:113
 hkalifilt.h:114
 hkalifilt.h:115
 hkalifilt.h:116
 hkalifilt.h:117
 hkalifilt.h:118
 hkalifilt.h:119
 hkalifilt.h:120
 hkalifilt.h:121
 hkalifilt.h:122
 hkalifilt.h:123
 hkalifilt.h:124
 hkalifilt.h:125
 hkalifilt.h:126
 hkalifilt.h:127
 hkalifilt.h:128
 hkalifilt.h:129
 hkalifilt.h:130
 hkalifilt.h:131
 hkalifilt.h:132
 hkalifilt.h:133
 hkalifilt.h:134
 hkalifilt.h:135
 hkalifilt.h:136
 hkalifilt.h:137
 hkalifilt.h:138
 hkalifilt.h:139
 hkalifilt.h:140
 hkalifilt.h:141
 hkalifilt.h:142
 hkalifilt.h:143
 hkalifilt.h:144
 hkalifilt.h:145
 hkalifilt.h:146
 hkalifilt.h:147
 hkalifilt.h:148
 hkalifilt.h:149
 hkalifilt.h:150
 hkalifilt.h:151
 hkalifilt.h:152
 hkalifilt.h:153
 hkalifilt.h:154
 hkalifilt.h:155
 hkalifilt.h:156
 hkalifilt.h:157
 hkalifilt.h:158
 hkalifilt.h:159
 hkalifilt.h:160
 hkalifilt.h:161
 hkalifilt.h:162
 hkalifilt.h:163
 hkalifilt.h:164
 hkalifilt.h:165
 hkalifilt.h:166
 hkalifilt.h:167
 hkalifilt.h:168
 hkalifilt.h:169
 hkalifilt.h:170
 hkalifilt.h:171
 hkalifilt.h:172
 hkalifilt.h:173
 hkalifilt.h:174
 hkalifilt.h:175
 hkalifilt.h:176
 hkalifilt.h:177
 hkalifilt.h:178
 hkalifilt.h:179
 hkalifilt.h:180
 hkalifilt.h:181
 hkalifilt.h:182
 hkalifilt.h:183
 hkalifilt.h:184
 hkalifilt.h:185
 hkalifilt.h:186
 hkalifilt.h:187
 hkalifilt.h:188
 hkalifilt.h:189
 hkalifilt.h:190
 hkalifilt.h:191
 hkalifilt.h:192
 hkalifilt.h:193
 hkalifilt.h:194
 hkalifilt.h:195
 hkalifilt.h:196
 hkalifilt.h:197
 hkalifilt.h:198
 hkalifilt.h:199
 hkalifilt.h:200
 hkalifilt.h:201
 hkalifilt.h:202
 hkalifilt.h:203
 hkalifilt.h:204
 hkalifilt.h:205
 hkalifilt.h:206
 hkalifilt.h:207
 hkalifilt.h:208
 hkalifilt.h:209
 hkalifilt.h:210
 hkalifilt.h:211
 hkalifilt.h:212
 hkalifilt.h:213
 hkalifilt.h:214
 hkalifilt.h:215
 hkalifilt.h:216
 hkalifilt.h:217
 hkalifilt.h:218
 hkalifilt.h:219
 hkalifilt.h:220
 hkalifilt.h:221
 hkalifilt.h:222
 hkalifilt.h:223
 hkalifilt.h:224
 hkalifilt.h:225
 hkalifilt.h:226
 hkalifilt.h:227
 hkalifilt.h:228
 hkalifilt.h:229
 hkalifilt.h:230
 hkalifilt.h:231
 hkalifilt.h:232
 hkalifilt.h:233
 hkalifilt.h:234
 hkalifilt.h:235
 hkalifilt.h:236
 hkalifilt.h:237
 hkalifilt.h:238
 hkalifilt.h:239
 hkalifilt.h:240
 hkalifilt.h:241
 hkalifilt.h:242
 hkalifilt.h:243
 hkalifilt.h:244
 hkalifilt.h:245
 hkalifilt.h:246
 hkalifilt.h:247
 hkalifilt.h:248
 hkalifilt.h:249
 hkalifilt.h:250
 hkalifilt.h:251
 hkalifilt.h:252
 hkalifilt.h:253
 hkalifilt.h:254
 hkalifilt.h:255
 hkalifilt.h:256
 hkalifilt.h:257
 hkalifilt.h:258
 hkalifilt.h:259
 hkalifilt.h:260
 hkalifilt.h:261
 hkalifilt.h:262
 hkalifilt.h:263
 hkalifilt.h:264
 hkalifilt.h:265
 hkalifilt.h:266
 hkalifilt.h:267
 hkalifilt.h:268
 hkalifilt.h:269
 hkalifilt.h:270
 hkalifilt.h:271
 hkalifilt.h:272
 hkalifilt.h:273
 hkalifilt.h:274