#ifndef HMDCTARGETMON_H
#define HMDCTARGETMON_H
#include "hreconstructor.h"
#include "hgeomvector.h"
#include "TStopwatch.h"
#include "TString.h"
#include "hlocation.h"
class HIterator;
class HCategory;
class HMdcTimeCut;
class TH1F;
class TH2F;
class TFile;
class HEventHeader;
class HGeomTransform;
class TPad;
class TPaveLabel;
class TCanvas;
class HMdcTargetMon : public HReconstructor {
protected:
Bool_t mode;
TString typePrintFile;
HCategory* fMdcHitCat;
HIterator* iterMdcHit;
HLocation locHit;
HEventHeader* evHeader;
HGeomVector target[6];
Bool_t useRtdbTarget[6];
Bool_t isCoilOff;
Bool_t firstEvent;
UInt_t dateFEvent;
UInt_t timeFEvent;
UInt_t dateLEvent;
UInt_t timeLEvent;
UInt_t runId;
TString fileName;
TString fileNameR;
TString dateTime;
HGeomTransform* transf[24];
Int_t nPads[6];
TPad* fPads[6][18];
TPaveLabel* label;
TPaveLabel* labelNR;
Int_t mdcInSec[6];
Bool_t listMdc[24];
Int_t selectEvByTBits;
Double_t phi[24][1000];
Double_t x[24][1000];
Double_t y[24][1000];
Double_t z[24][1000];
Short_t nhits[24];
struct TrackPar {
Double_t z;
Double_t theta;
Double_t x0;
Double_t y0;
};
TrackPar trArr[10000];
Bool_t normalizeHists;
Double_t dPhiCut;
Double_t r0Cut;
Int_t combToMdc[6][2];
TH1F* dPhiH[7];
TH1F* r0H[7];
TH1F* zVerH[6][7];
TH1F* zVerDscH[6][7][10];
TH2F* zVerVsEventH[6][7];
Int_t histsMode;
Int_t nZmBins;
Double_t zmin;
Double_t zmax;
Int_t canvasWidth;
Int_t canvasHeight;
Char_t cnComb[6][100];
Char_t ctComb[6][100];
TCanvas* canvs[6];
TString addCnName;
TStopwatch timer;
UInt_t plotType;
Double_t timeStep;
Stat_t stat;
Bool_t sumOfFiles;
Int_t eventCounter;
Int_t numEventsSave;
Int_t numRunEvents;
Int_t numNRunsEvents;
Int_t collectNRuns;
Int_t runsCounter;
TString firstRunName;
TString lastRunName;
TH1F* dPhiForNR[7];
TH1F* r0ForNR[7];
TH1F* zVerForNR[6][7];
TH1F* zVerDscForNR[6][7][10];
TH2F* zVerVsEventForNR[6][7];
TCanvas* canvsForNR[6];
Char_t cnCombForNR[6][100];
Char_t ctCombForNR[6][100];
TPad* fPadsForNR[6][12];
Bool_t drawInOutTracks;
Int_t nRunsDraw;
Double_t firstTarPnt[6];
Double_t lastTarPnt[6];
Double_t* inTargetArr;
Double_t* allTargetArr;
Int_t inOutTargCurrRun;
TH1F* hTargTrFraction;
TString pathHistOneRun;
TString pathHistSumRun;
Bool_t fillSeg;
HCategory* fSegCat;
HLocation locSeg;
TCanvas *currCanvas;
TPad *currPad;
Int_t pad;
Int_t comb;
public:
HMdcTargetMon(Bool_t isClOff=kFALSE, UInt_t pt=0);
HMdcTargetMon(const Text_t *name,const Text_t *title, Bool_t isClOff=kFALSE,
UInt_t pt=0);
~HMdcTargetMon(void);
virtual Int_t execute(void);
virtual Bool_t init(void);
virtual Bool_t reinit(void);
virtual Bool_t finalize(void);
void drawCanvases(void);
void drawCanvasesRunsSum(void);
void setMode(Bool_t m) {mode = m;}
void setGraphicFormat(const Char_t* fileType);
void setHistPar(Int_t nb, Double_t z1, Double_t z2);
void setTargPos(Double_t xt, Double_t yt, Double_t zt,Int_t sec=-1);
void setTimeStep(Double_t tst) {timeStep = (tst<3.) ? 3.:tst;}
void setHistsMode(Int_t hMode) {histsMode = hMode;}
void drawDownScalHist(void) {histsMode = 1;}
void drawTrigCondHist(void) {histsMode = 2;}
void setFillSegFlag(Bool_t f=kTRUE) {fillSeg = f;}
void setRCut(Double_t rCut) {r0Cut = rCut;}
void setDPhiCut(Double_t dPh) {dPhiCut = dPh;}
void setDrawEachRun(void) {sumOfFiles = kFALSE;}
void setDrawSumOfRuns(void) {sumOfFiles = kTRUE;}
void setEachNEventsSave(Int_t nev) {numEventsSave = nev;}
void setCollectNRuns(Int_t nf) {collectNRuns = nf;}
void addToCanvasName(const Char_t* add) {addCnName = add;}
TH1F* setTargetZRegion(Double_t fpoint,Double_t lpoint,Int_t nRuns=100,Int_t sec=-1);
void setCanvasSize(Int_t ww, Int_t wh);
void set2DhistType(Int_t pt) {plotType = pt;}
void setPathOneRunHist(const Char_t* p) {pathHistOneRun = p;}
void setPathSumRunsHist(const Char_t* p) {pathHistSumRun = p;}
void selectEventWithTBits(Int_t tb) {selectEvByTBits = tb;}
void doNormalization(Bool_t fl=kTRUE) {normalizeHists = fl;}
Bool_t readMonParam(TString fileMonParam);
TH1F** getDPhiH(void) {return dPhiH;}
TH1F** getZ0H(void) {return r0H;}
TH1F** getZVerH(void) {return zVerH[0];}
TH1F** getZVerDscH(void) {return zVerDscH[0][0];}
TH2F** getZVerVsEventH(void) {return zVerVsEventH[0];}
TH1F* getDPhiH(Int_t s,Int_t m1,Int_t m2) {return dPhiH[combInd(m1,m2)];}
TH1F* getZ0H(Int_t m1,Int_t m2) {return r0H[combInd(m1,m2)];}
TH1F* getZVerH(Int_t s,Int_t m1,Int_t m2) {return zVerH[s][combInd(m1,m2)];}
TH1F* getZVerDscH(Int_t s,Int_t m1,Int_t m2,Int_t tr) {return zVerDscH[s][combInd(m1,m2)][tr];}
TH2F* getZVerVsEventH(Int_t s,Int_t m1,Int_t m2) {return zVerVsEventH[s][combInd(m1,m2)];}
TH1F* getTargTrFraction(void) {return hTargTrFraction;}
private:
Int_t combInd(Int_t m1,Int_t m2) const { if(m1<0||m1>=m2||m2>3) return 6;
return m1==0 ? m1+m2-1 : m1+m2;}
void setDefParam(UInt_t pt=0);
Bool_t initHists(void);
void initRunsSumHists(void);
void extractFileInfo(void);
void fillDateTime(void);
void setCanvName(void);
void setCanvNameForNR(void);
Int_t eventTime(void);
void saveCanvases(void);
void saveCanvasesForNR(void);
void saveCanvas(TCanvas* canv,TString& path);
void resetHists(void);
void resetHistsRunsSum(void);
void addHistsToRunsSum(void);
void shiftArrays(void);
void fillTargTrFraction(void);
void fillInOutTarHistBin(Int_t bin);
void setEntriesInOutTHist(void);
void drawPad(Double_t x1,Double_t y1,Double_t x2,Double_t y2);
void drawPadS(Double_t x1,Double_t y1,Double_t x2,Double_t y2);
ClassDef(HMdcTargetMon,0)
};
#endif