ROOT logo
#ifndef HMDC12FIT_H
#define HMDC12FIT_H

#include "hreconstructor.h"
#include "hlocation.h"
#include "hmdctrackfitter.h"
#include "hmdchitsegfiller.h"

class HIterator;
class HMdcClus;
class HMdcHit;
class HMdcSegSim;
class HMdcGetContainers;
class HGeomVector;
class HGeomTransform;
class HCategory;
class HMdcTrackFitter;
class HMdcList12GroupCells;
class HMdcCellGroup;
class HMdc34ClFinder;
class HMdcTrkCand;
class HMdcTrackInfSim;
class HMdcSecListCells;

class HMdcFittersArray : public TObject {
  private:
    HMdcTrackFitter** fitterArr;  // array of point. to HMdcTrackFitterA(B) obj.
    Int_t size;                   // size of fitterArr
    Int_t nObj;                   // number of objects in fitterArr
    HMdcTrackFitInOut* fitpar;
    Int_t fitAuthor;
  public:
    HMdcFittersArray(void);
    ~HMdcFittersArray(void);
    void init(Int_t fitAut, HMdcTrackFitInOut* fpar);
    HMdcTrackFitter* getNewFitter(void);
    HMdcTrackFitter* getFitter(Int_t ind)  {return ind<0 || ind>=nObj ? NULL:fitterArr[ind];}
    HMdcTrackFitter* operator[](Int_t ind) {return ind<0 || ind>=nObj ? NULL:fitterArr[ind];}
    void reset(void)                       {nObj = 0;}
    Int_t getNumObjs(void)                 {return nObj;}
  private:
    void expand(void);
    
  ClassDef(HMdcFittersArray,0) // Array of HMdcTrackFitterA(B,...) objects
};

class HMdc12Fit : public HReconstructor {
  protected:
    HMdcTrackFitInOut fitpar;         // obj. keep pointer to param. and categ.
    HMdcFittersArray  fittersArr[2];  // arrays of HMdcTrackFitterH or A fitters
    HMdcTrackFitter  *fitter;         // carrent fitter.

    // Categories:
    HCategory* fClusCat;        // pointer to MdcClus data category
    HIterator* iterClus;        // iterator for catMdcClus
    HCategory* fSegCat;         // pointer to Segment data category
    HCategory* fHitCat;         // pointer to HMdcHit data category
    HCategory* fClusInfCat;     // pointer to HMdcSeg data category
    HCategory* fTrkCandCat;     // pointer to HMdcTrkCand data category
    HCategory* fClusFitCat;     // pointer to HMdcClusFit data category
    Int_t      indFirstSeg[6];  // [sector] index of the first segment in fSegCat
    Int_t      indLastSeg[6];   // [sector] index of the last segment in fSegCat
    Int_t      indFstTrCand[6]; // [sector] index of the first segment in fSegCat
    Int_t      indLstTrCand[6]; // [sector] index of the last segment in fSegCat
    HLocation  locSeg;          // location for new "segment" object
    HLocation  locHit;          // location for new "hit" object
    HLocation  locTrkCand;      // location for new HMdcTrkCand object
    HLocation  locClus;         // location for HMdcClus object
    HLocation  locClInf;        // location for new "HMdcWireFit" object
    Bool_t     isGeant;         // kTRUE for GEANT data

    Int_t      modForSeg[2];    // num. module for filling HMdcSeg
                                // if modForSeg[0]<0 and modForSeg[1]<0
                                // HMdcSeg will not filled
    
    // Fit variables:
    Int_t      nFitedTimes;     // Num. of hits with hitStatus==1
    Bool_t     isFitted;        // Fit result
    
    Bool_t     prntSt;          // kTRUE - status printed already
    Bool_t     notFillByClus;   // kTRUE - don't fill HMdcHit&HMdcSeg by cluster
    Int_t      clusFitAlg;      // clusters fitting algorithm
    Bool_t     isCosmicData;    // =kTRUE for cosmic data
    Bool_t     fillHitSeg;      // =kFALSE - don't fill HMdcHit and HMdcSeg category
    Bool_t     useFitted;       // =kTRUE - use fitted inner seg. only for finding outer seg.
    Bool_t     useFittedTrPar;  // =kTRUE - use fitted track param. of i.seg. for finding outer seg.
    
    Int_t      currSeg;         // Current segment
    Int_t      indFirst;        // = indFirstSeg[currSec]
    Int_t      indLast;         // = indLastSeg[currSec]
    Int_t      indFirstTrCand;  // = indFstTrCand[currSec]
    Int_t      indLastTrCand;   // = indLstTrCand[currSec]

    HMdcSecListCells *pSecListCells;
    HMdcHitSegFiller  hitSegFiller;    
    HMdc34ClFinder*   f34ClFinder;
    HMdcTrackInfSim  *pTrackInfSim;
    
    // Fake suppression parameters:
    Int_t      nSharedLayersCut[2];
    Int_t      nLayerOrientCut[2];
    Int_t      nDCellsMinCut[2];
    Int_t      nDCellsCut[2];
    Float_t    cutForReal[2][13]; // Cut for "real" segments
    Float_t    cutForFake[2][13]; // Cut for "fake" segments
     
    // Off vertex track finder parameters:
    Bool_t     findOffVertTrk;    // 
    Int_t      nLayersCutOVT;     // Minimal number of fired layers
    Int_t      nWiresCutOVT;      // Maximal number of wires per mdc

enum {kFake         = BIT(14),
      kInFittedList = BIT(15),
      kKeep         = BIT(16),
      kReal         = BIT(17),
      kRealKeep     = kReal | kKeep,
      kAllTypes     = kReal | kKeep | kFake};
    
  public:
    HMdc12Fit(Int_t type, Int_t ver, Int_t indep,Bool_t hst=kFALSE, Bool_t prnt=kFALSE);
    HMdc12Fit(const Text_t *name,const Text_t *title, Int_t type, Int_t ver, Int_t indep,
              Bool_t hst=kFALSE, Bool_t prnt=kFALSE);
    HMdc12Fit(const Text_t *name,const Text_t *title);
    HMdc12Fit();
    ~HMdc12Fit(void);
    Bool_t init(void);
    Bool_t reinit(void);
    Bool_t finalize(void);
    Int_t  execute(void);
    void   setSignalSpeed(Float_t sp)            {fitpar.setSignalSpeed(sp);}
    void   setNotFillByClus(void)                {notFillByClus = kTRUE;}
    void   printStatus(void)                     {}
    void   printStatusM(void);
    void   setCosmicData(Bool_t fHSCat=kFALSE)   {isCosmicData  = kTRUE; fillHitSeg = fHSCat;}
    void   fillHitSegCat(Bool_t fl)              {fillHitSeg    = fl;}
    void   useFittedISeg(Bool_t fl=kTRUE)        {useFitted     = fl;}
    HMdcTrackFitInOut& getFitInOutCont(void)     {return fitpar;}
    
    static void testGeantInf(HMdcSegSim* segFake,HMdcSegSim* segGood);
    void   setFakeSupprStep1Par(UInt_t seg,Int_t n1,Int_t n2,Int_t n3,Int_t n4);
    void   setFakeSupprStep2Par(UInt_t seg,Float_t *cutReal,Float_t *cutFake);

  protected:
    void     setParContainers(void);
    void     fitAlgorithm1(void);
    void     fitAlgorithm2(void);
    void     fitAlgorithm3(void);
    void     fitAlgorithm3b(void);
    void     fitAlgorithm4(void);
    Bool_t   fitMod(HMdcClus* fClst, Int_t arrInd=0);
    Bool_t   fitSeg(HMdcClus* fClst, Int_t arrInd=0);
    Bool_t   fitSec(HMdcClus* fClst1, HMdcClus* fClst2);
    Bool_t   fit2Sectors(HMdcClus* fClst1, HMdcClus* fClst2,
                         HMdcClus* fClst3, HMdcClus* fClst4);
    Bool_t   fitNSectors(HMdcClus* cl1, HMdcClus* cl2,HMdcClus* cl3, HMdcClus* cl4,
                         HMdcClus* cl5, HMdcClus* cl6,HMdcClus* cl7, HMdcClus* cl8);
    Bool_t   fitCombClusIndFit(HMdcClus* fClst, Int_t arrInd=0);
    Bool_t   fitChambClus(HMdcClus* fClst, Int_t arrInd=0);
    Bool_t   fitMixedClus(HMdcClus* fClst, Int_t arrInd=0);
    
    Int_t    fillHitByFit(Int_t mod);
    Bool_t   fillHitSegByFit(Int_t iMod=-99);
    Int_t    fillHitByClus(Int_t mod);
    Bool_t   fillHitSegByClus(Int_t iMod=-99);

    Bool_t   fillSegBy2Hits(Int_t ind1, Int_t ind2);
    void     fillClusInf(HMdcSeg* fSeg,Bool_t secondSec=kFALSE);
    void     fillClusInf(HMdcHit* fHit,Int_t iMod,Char_t fitSt,Int_t indClusFit=-1);

    Double_t calcVertexDist(Double_t x0, Double_t y0, Double_t z0,
	                    Double_t x1, Double_t y1, Double_t z1,
	                    Double_t x2, Double_t y2, Double_t z2);
    void     calcMinFunctional(void);
    HMdcHit* getHitSlot(Int_t sec, Int_t mod, Int_t& index);
    HMdcSeg* getSegSlot(Int_t sec,Int_t seg);
    void     setGroup(HMdcList24GroupCells* lCl, HMdcSeg* fSeg, Int_t seg);
    void     setGroup(HMdcList24GroupCells* lCl, HMdcHit* fHit, Int_t mod);
    Int_t    findSeg2Clusters(HMdcTrackFitter* fitter);
    void     copySignId(HMdcHit* hit,Int_t mod,Int_t lay,HMdcSeg* seg);
    HMdcTrkCand* fillTrkCandISeg(void);
    HMdcTrkCand* fillTrkCandOSeg(HMdcTrkCand* fTrkCand);
    void     sortGeantInf(void);
    void     suppressFakes(Int_t sec,Int_t seg);
    void     setFake(HMdcSeg* segFake);
    void     setFakeInd(Int_t index);
    HMdcSeg* getInnerSegment(Int_t clIndPar) const;
    Int_t    getInnerClusInd(HMdcSeg* outerSegment,HMdcClus* &outerClus) const;
    void     setFakeFlageAndIndexis(HMdcSeg* segOFake,Int_t indFakeSeg,HMdcSeg* segOGood,Int_t indGoodSeg);
    void     addToNFittedCounter(void);
    Float_t  calcWeight(HMdcSeg* pSeg, Float_t *cut) const;
    Int_t    markFakes(Int_t cutNMarked);
    Int_t    markReals(Int_t cutNMarked);
    Bool_t   testRestOfWires(Int_t sec);
    
  ClassDef(HMdc12Fit,0) // Manager class for Dubna track straight piece fitter.
};

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