ROOT logo
#ifndef HMDCTRACKPARAM_H
#define HMDCTRACKPARAM_H

#include "hsymmat.h"
#include "hmdcgeomobj.h"
#include "TMatrixD.h"

class HMdcClusFit;
class HMdcWireData;

class HMdcTrackParam : public HMdcLineParam {
  // Track parameters for track fitter:
  protected:
    Double_t funct;             // functional
    Double_t oldFunct;          // previous value of functional
    Double_t sumWeight;         // sum of weights
    Int_t    nParam;            // number of parameters
    HSymMat4 errMatr;           // Matrix of errors
    Int_t    nMods;             // =4 - normal data; =8 - cosmic two sectors

    Int_t    numOfGoodWires;    // number of wires passed fit
    Double_t chi2perDF;         // =funct/(numOfGoodWires-nParam+1)
    Int_t    iterNumb;          // number of iteration

    Int_t    timeOffsetFlag;    // 1 - calc. time offset for each MDC
                                // 2 - calc. time offset for each segment
                                // else - calc. one time offset for all MDC's
    Double_t timeOffset[16];    // time offsets for each MDC in sec.
    Double_t errTimeOffset[16]; // errors of time offsets for each MDC in sec.
    Int_t   isTmoffFixed;       // if bit 0-15 eq.1 timeOffset for mdc is fixed

    // Variable data mambers:
    Double_t sDev[16];          // For timeOffset calculation.
    Double_t sWht[16];          // [4] - for each module.
    Double_t dTdPar[4][16];     // [nParam!][nMod]

  public:
    HMdcTrackParam(void);
    ~HMdcTrackParam(void){}
    void printParam(const Char_t* title=0) const;
    void printFunctChange(const Char_t* title=0) const;
    void printErrors(void);

    inline void copyLine(HMdcTrackParam& tp);
    inline void copyTimeOffsets(const HMdcTrackParam& tp);
    inline void copyAllParam(const HMdcTrackParam& tp);
    void      setTimeOffsets(Double_t* tos,Int_t size=4);
    void      copyNewParam(const HMdcTrackParam& tp);
    void      setOneSecData(void)                  {nMods = 4; cleanTO();}
    void      setTwoSecData(void)                  {nMods = 8; cleanTO();}
    void      setNMods(Int_t ns)                   {nMods = ns<=4 ? ns*4:16; cleanTO();}
    void      copyNMods(HMdcTrackParam& p)         {nMods = p.nMods; cleanTO();}
    void      copyPlanes(HMdcTrackParam& p);

    void      setIterNumb(Int_t it=0)              {iterNumb=it;}
    void      incIterNumb(void)                    {iterNumb++;}
    Int_t     getIterNumb(void) const              {return iterNumb;}
    Int_t     getNumParam(void) const              {return nParam;}

    void      setOldFunct(HMdcTrackParam& par)     {oldFunct=par.funct;} // for print !?
    void      saveFunct(void) {oldFunct=funct;} // for print !?
    void      clearFunct(void);
    void      addToSumsDevWt(Int_t mod, Double_t dev, Double_t wtNorm) {
                             sDev[mod] += dev*wtNorm; sWht[mod] += wtNorm;}
    void      calcTimeOffsets(Int_t tofFlag);
    void      correctMinTimeOffsets(Double_t minTos);

    Double_t* getTimeOffset(void)                  {return timeOffset;}
    Double_t  getTimeOffset(Int_t m) const         {return timeOffset[m];}
    Int_t     isMdcTimeOffsetFixed(Int_t m) const  {return (isTmoffFixed>>m)&1;}
    Int_t     isSegTimeOffsetFixed(Int_t s) const  {return (isTmoffFixed>>(s*2))&3;}
    Int_t     isTrackTimeOffsetFixed(void) const   {return isTmoffFixed ? 1:0;}
    void      getTimeOffsetDer(Double_t* der);
    void      addToTOffsetErr(Int_t m, Double_t* dTdA, Double_t wtNorm);
    void      clearTOffsetDer(void);
    void      addToTOffsetDer(Int_t m, Int_t k, Double_t add) {dTdPar[k][m]+=add;}
    void      addTimeOffsetDer1(TMatrixD& grad2);
    void      addTimeOffsetDer2(TMatrixD& grad2);
    Double_t  getSumWtNorm(Int_t m) const;
    void      calcTimeOffsetsErr(void);
    void      fillErrorsMatr(TMatrixD& matrH);

    void      addToFunct(Double_t add,Double_t wt) {funct+=add; sumWeight+=wt;}
    Double_t  getSumWeight(void) const             {return sumWeight;}
    void      copyParAndAdd(const HMdcTrackParam& tp, Int_t ip, Double_t add);
    void      copyParAndAdd(const HMdcTrackParam& tp, Int_t ip1, Double_t add1,
                            Int_t ip2, Double_t add2);

    Double_t* getErrTimeOffset(void)               {return errTimeOffset;}

    HSymMat4& getErrMatr(void)                     {return errMatr;}
    inline Float_t getParErr(Int_t i) const;
    Double_t  functional(void) const               {return funct;}
    Double_t  getNormFunctional(void) const        {return funct/sumWeight;}
    Double_t  oldFunctional(void) const            {return oldFunct;}
    Int_t     getNumOfGoodWires(void) const        {return numOfGoodWires;}
    Double_t  calcChi2PerDF(Int_t nGWires=0);
    Double_t  getChi2(void)const                   {return chi2perDF;}

    void      fillClusFit(HMdcClusFit* fClusFit);

    inline Bool_t operator > (const HMdcTrackParam& f) const;
    inline Bool_t operator < (const HMdcTrackParam& f) const;
    inline Bool_t operator < (Double_t f) const;
    inline Bool_t operator > (Double_t f) const;
    inline HMdcTrackParam& operator()(const HMdcTrackParam& tp,
        Int_t ip, Double_t add);
    inline HMdcTrackParam& operator()(const HMdcTrackParam& tp,
        Int_t ip1, Double_t add1, Int_t ip2, Double_t add2);

    inline Double_t isFunctRelChangLess(Double_t lim) const;
    Bool_t testParameters(Double_t tosMin, Double_t tosMax);
    void setFixedTimeOffset(Double_t o1,Double_t o2,Double_t o3,Double_t o4);
    void unfixTimeOffset(void) {isTmoffFixed = 0;}

  private:
    Double_t calcTosErr(Int_t m);
    Double_t calcTosErr(Int_t m1, Int_t m2);
    Double_t calcTosErr(void);
    Double_t calcTosErr(Double_t sc1, Double_t sc2, Double_t erri2) {
                        Double_t sc21=sc2/sc1; return sc21*sc21*erri2;}
    void cleanTO(void);

  ClassDef(HMdcTrackParam,0) // Track piece parameters for Dubna fitter
};

inline void HMdcTrackParam::copyAllParam(const HMdcTrackParam& tp) {
  copyNewParam(tp);
  oldFunct = tp.oldFunct;
}

inline void HMdcTrackParam::copyLine(HMdcTrackParam& tp) {
  (HMdcLineParam&)(*this)=(HMdcLineParam&)tp;
  nParam = tp.nParam;
}

inline void HMdcTrackParam::copyTimeOffsets(const HMdcTrackParam& tp) {
  for(Int_t m=0;m<16;m++) timeOffset[m]=tp.timeOffset[m];
  isTmoffFixed = tp.isTmoffFixed;
  nMods        = tp.nMods;
}

inline Float_t HMdcTrackParam::getParErr(Int_t i) const {
  return (i<0||i>=nParam) ? 0.:sqrt(errMatr.getElement(i,i));
}

inline Bool_t HMdcTrackParam::operator > (const HMdcTrackParam& f) const {
  return funct > f.funct;
}

inline Bool_t HMdcTrackParam::operator < (const HMdcTrackParam& f) const {
  return funct < f.funct;
}

inline Bool_t HMdcTrackParam::operator < (Double_t f) const {
  return funct < f;
}

inline Bool_t HMdcTrackParam::operator > (Double_t f) const {
  return funct > f;
}

inline HMdcTrackParam& HMdcTrackParam::operator()(const HMdcTrackParam& tp,
    Int_t ip, Double_t add) {
  copyParam(tp);
  addToParam(ip,add);
  isTmoffFixed = tp.isTmoffFixed;
  nMods        = tp.nMods;
  return *this;
}

inline HMdcTrackParam& HMdcTrackParam::operator()(const HMdcTrackParam& tp,
    Int_t ip1, Double_t add1, Int_t ip2, Double_t add2) {
  copyParam(tp);
  addToParam(ip1,add1,ip2,add2);
  isTmoffFixed = tp.isTmoffFixed;
  nMods        = tp.nMods;
  return *this;
}

inline Double_t HMdcTrackParam::isFunctRelChangLess(Double_t lim) const {
  return fabs((oldFunct-funct)/oldFunct) < lim;
}

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