ROOT logo
#ifndef HMDCCALIBRATER1_H
#define HMDCCALIBRATER1_H

#include "hreconstructor.h"
#include "hlocation.h"
#include "TRandom.h"
#include "hstartdef.h"

class HCategory;
class HIterator;
class HMdcCalParRaw;
class HMdcLookupGeom;
class HMdcTimeCut;
class HMdcCutStat;
class HMdcWireStat;
class HMdcRaw;
class HMdcCal1;
class HMdcCalParTdc;

class HMdcCalibrater1 : public HReconstructor {
protected:
  HCategory* rawCat;       //! pointer to the raw data
  HCategory* calCat;       //! pointer to the cal data
  HCategory* startHitCat;  //! pointer to the start cal data
  HMdcRaw* raw;            //! pointer to raw data word
  HMdcCal1* cal;           //! pointer to cal1 data word

  Bool_t StartandCal;      // switch between Cal&&Start,noCal&&Start,noCal&&noStart
  Bool_t NoStartandNoCal;  // switch between Cal&&Start,noCal&&Start,noCal&&noStart
  Bool_t NoStartandCal;    // switch between Cal&&Start,noCal&&Start,noCal&&noStart
  Bool_t setTimeCut;       // switch on/off cuts on time1, time2 and time2-time1
  Bool_t hasPrinted;       // flag is set if printStatus is called
  Int_t  embedding;        // flag is set if real data should be embedded into simulation data
  HLocation loc;           //! location for new object.
  HIterator* iter;         //! iterator on raw data.
  HIterator* iterstart;    //! iterator on start data.

  HMdcCalParRaw* calparraw;//! calibration parameters
  HMdcLookupGeom* lookup;  //! lookup table for mapping
  HMdcTimeCut* timecut;    //! container for cuts on time1,time2,time2-time1
  HMdcCutStat* cutStat;    //! container for statistics on cuts
  HMdcWireStat* wireStat;  //! container for statistics on cuts

  static Float_t globalOffset[4]; //!  global offset per plane
  static Float_t globalSecOffset[6][4]; //!  global offset per plane
  static Float_t globalSlope;     //!  global tdc slope
  static Int_t countNrWiresPerMod[6][4];    //! counter array for wires /module/event
  static Int_t countNrWiresPerModCal[6][4]; //! counter array for wires /module/event on cal after cuts
  static Int_t countNrFlashWiresPerMod[6][4];  //! counter array for "flash" wires /module/event
  static Int_t countNDeltaElWiresPerMod[6][4]; //! counter array for "DeltaElectron" wires /module/event


  Int_t cuts[5];          //! counter array passed/not passed time and multiplicity cuts
  Int_t cutthreshold;     //! max number of wires in Cal1
  Bool_t useMultCut;      //! use/ don't use mult cut
  Bool_t useMultCutTot;   //! use/ don't use mult cut with tot < 30ns
  Bool_t doSkipMultCut;   //! skip events detected by mult cut
  Bool_t doprint;         //! print flag for mult cut option
  Bool_t skipCal;         //! skip all mdc cal events
  static Bool_t useWireStat;  //! skip wires which are broken
  Int_t ctEvent;              //! event counter
  Int_t ctEventSkip;          //! event counter for skipped events
  
  Float_t flashTotCut;        //! "Flash" wires are wires with ToT < flashTotCut
  Float_t flashT1Cut[4];      //!                          and t1  < flashT1Cut[module]
  Int_t   flashMultCut;       //! max number of "flash" wires
  Bool_t  skipFlashEvent;     //! skip events detected by number of "flash" wires
  Float_t timeT1Cut;          //! wires with t1<timeT1Cut and ToT > flashTotCut will be added to countNDeltaElWiresPerMod
  Int_t   deltaElMultCut;     //! max number of "delaElectron" wires
  Bool_t  skipDeltaElEvt;     //! skip events detected by number of "delaElectron" wires

  void initParameters(void);
  void initCounters()
  {
      for(Int_t i=0;i<6;i++)
      {
	  for(Int_t j=0;j<4;j++)
	  {
           countNrWiresPerMod[i][j]       = 0;
           countNrFlashWiresPerMod[i][j]  = 0;
           countNDeltaElWiresPerMod[i][j] = 0;
	  }
      }

  };
  void initCountersCal()
  {
      for(Int_t i=0;i<6;i++)
      {
	  for(Int_t j=0;j<4;j++)
	  {
           countNrWiresPerModCal[i][j]=0;
	  }
      }

  };
  Bool_t doMultCut()
  {
      for(Int_t i=0;i<6;i++)
      {
	  for(Int_t j=0;j<4;j++)
	  {
	      if(countNrWiresPerModCal[i][j]>cutthreshold) return kTRUE;
	  }
      }
      return kFALSE;
  }
  Bool_t doFlashCut()
  {
      for(Int_t i=0;i<6;i++)
      {
	  if(countNrFlashWiresPerMod[i][0]+countNrFlashWiresPerMod[i][1] > flashMultCut) return kTRUE;
          if(countNrFlashWiresPerMod[i][2]+countNrFlashWiresPerMod[i][3] > flashMultCut) return kTRUE;
      }
      return kFALSE;
  }
  Bool_t doDeltaElCut()
  {
      for(Int_t i=0;i<6;i++)
      {
	  if(countNDeltaElWiresPerMod[i][0]+countNDeltaElWiresPerMod[i][1] > deltaElMultCut) return kTRUE;
          if(countNDeltaElWiresPerMod[i][2]+countNDeltaElWiresPerMod[i][3] > deltaElMultCut) return kTRUE;
      }
      return kFALSE;
  }
  void setParContainers(void);
  Float_t getstarttime();
  Bool_t testTimeCuts(Float_t,Float_t);
  Bool_t translateAddress(Int_t*,Int_t*);
  void calcTimes(Float_t*,Float_t*,Float_t,Int_t,HMdcCalParTdc*);
  void fillCal1(Float_t ,Float_t ,Int_t );
  void countWiresPerMod();
  void printWires();

public:
  HMdcCalibrater1(void);
  HMdcCalibrater1(const Text_t* name,const Text_t* title,Int_t vers=1,Int_t cut=1,Int_t domerge=0);
  ~HMdcCalibrater1(void);
  Bool_t init(void);
  void setDoPrint(Bool_t dopr)       {doprint=dopr;}
  void setSkipCal(Bool_t skip=kTRUE) {skipCal=skip;}
  void setUseMultCut(Int_t thresh,Bool_t use=kTRUE,Bool_t tot=kTRUE,Bool_t skip=kTRUE)  {cutthreshold=thresh;useMultCut=use; useMultCutTot=tot; doSkipMultCut=skip;}
  void setSkipFlashEvent(Int_t threshold)
  {
    flashMultCut   = threshold;
    skipFlashEvent = flashMultCut > 10;    // if flashMultCut(=thresh) < 10 (default value =0) no events will be skipped
  }
  void setFlashWiresCut(Float_t tot=30.,Float_t t1m1=-5.,Float_t t1m2=-5.,Float_t t1m3=-5.,Float_t t1m4=-5.)
  {
    flashTotCut    = tot;
    flashT1Cut[0]  = t1m1;
    flashT1Cut[1]  = t1m2;
    flashT1Cut[2]  = t1m3;
    flashT1Cut[3]  = t1m4;
  }
  void setDeltaElectCut(Int_t thresh,Float_t t1c=-10.)
  {
    timeT1Cut      = t1c;
    deltaElMultCut = thresh;
    skipDeltaElEvt = deltaElMultCut > 10;    // if deltaElMultCut(=thresh) < 10 (default value =0) no events will be skipped
  }

  static Int_t getFlashWiresMod(Int_t s,Int_t m)  { return countNrFlashWiresPerMod[s][m]; }
  static Int_t getFlashWiresSeg(Int_t s,Int_t g)  { return countNrFlashWiresPerMod[s][g*2]+countNrFlashWiresPerMod[s][g*2+1]; }
  static Int_t getMaxNrFlashWiresPerSeg (void)       
  {
      Int_t maxn = 0;
      for(Int_t s=0;s<6;s++) for(Int_t g=0;g<2;g++) {
          Int_t n = getFlashWiresSeg(s,g);
          if(n > maxn) maxn = n;
      } 
      return maxn;
  }
  
  static Int_t getDeltaElWiresMod(Int_t s,Int_t m)  { return countNDeltaElWiresPerMod[s][m]; }
  static Int_t getDeltaElWiresSeg(Int_t s,Int_t g)  { return countNDeltaElWiresPerMod[s][g*2]+countNDeltaElWiresPerMod[s][g*2+1]; }
  static Int_t getMaxNrDeltaElWiresPerSeg (void)       
  {
      Int_t maxn = 0;
      for(Int_t s=0;s<6;s++) for(Int_t g=0;g<2;g++) {
          Int_t n = getDeltaElWiresSeg(s,g);
          if(n > maxn) maxn = n;
      } 
      return maxn;
  }
  
  static void setUseWireStat(Bool_t doit) { useWireStat=doit; }

  void switchArguments(Int_t,Int_t,Int_t);
  void setGlobalOffset(Float_t o0,Float_t o1,Float_t o2,Float_t o3)
  {
    for(Int_t s=0;s<6;s++) {
      globalSecOffset[s][0]=o0;
      globalSecOffset[s][1]=o1;
      globalSecOffset[s][2]=o2;
      globalSecOffset[s][3]=o3;
    }
  }
  void setSecGlobalOffset(Int_t s,Float_t o0,Float_t o1,Float_t o2,Float_t o3)
  {
      if(s<0 || s>5) return;
      globalSecOffset[s][0]=o0;
      globalSecOffset[s][1]=o1;
      globalSecOffset[s][2]=o2;
      globalSecOffset[s][3]=o3;
  }
  void setGlobalSlope(Float_t s){globalSlope=s;}
  Bool_t finalize(void) {return kTRUE;}
  void printStatus();
  Int_t execute(void);

  ClassDef(HMdcCalibrater1,0) // Calibrater raw->cal1 for Mdc data
};

#endif /* !HMDCCALIBRATER1_H */

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