#ifndef HMDSLOPE_H
#define HMDSLOPE_H
#include "hreconstructor.h"
#include "TH1.h"
#include "TH2.h"
#include "TNtuple.h"
typedef Int_t   MyInt;
typedef Float_t MyFloat;
class TFile;
class HCategory;
class HIterator;
class HMdcCalPar;
class HMdcCalParRaw;
typedef MyFloat MyFloatField [6][4][16][96];
typedef MyInt   MyIntField   [6][4][16][96];
typedef MyInt   MboSlopeTrendIntField[16][96][5000]; 
typedef MyInt   MboErrorTrendIntField[16][96][600];  
class HMdcSlope : public HReconstructor {
protected:
    HCategory     *rawCat;     
    HCategory     *slopeCat;   
    HIterator     *iter;       
    HMdcCalParRaw *calparraw;  
    
    Char_t *fNameRoot;         
    Char_t *fNameNtuple;       
    MyFloatField *avgSlope;
    MyFloatField *avgSlopeErr;
    MyIntField   *nEvt;
    
    
    Int_t slopeTrend[6][4][16][96][5000];
    Bool_t trendCalculationActive;
    Int_t  calibrationAlgorithm;
    Int_t  nTimeValues;
    Int_t  debugActive;   
    Int_t  fitHistMethod;
 
    Bool_t linRegActive;
    Bool_t histFitActive;
    Bool_t graphFitActive;
    Int_t  binError;
    Bool_t selectorActive;
    Int_t  mbSelector;
    Int_t  tdcSelector;
    Bool_t createNtupleActive;
    TFile *ntupleOutputFile;
    TNtuple *ntuple;
    TFile *file;
    TH1F *hSlope;
    TH1F *hTime;
    
    enum calibrationMethod {HMDC_SLOPE_LIN_REG_6   = 1, 
			    HMDC_SLOPE_HIST_FIT_5  = 2,
			    HMDC_SLOPE_GRAPH_FIT_5 = 3,
			    HMDC_SLOPE_LIN_REG_5   = 4 };
public:
    HMdcSlope();
    HMdcSlope(const Text_t* name,const Text_t* title);
    ~HMdcSlope();
    Bool_t init();
    Bool_t finalize();
    Int_t  execute();
    
    Int_t calcBinNr(Double_t, Double_t, Double_t, Int_t);
    
    void setOutputRoot (Char_t*);
    void setOutputNtuple(Char_t*);
    void selectCalibrationAlgorithm(Int_t);
    void selectHistFitMethod(Int_t);
    void setBinError(Int_t);
    void setCreateNtupleActive(Bool_t);
    void setDebugActive(Int_t);
    void setGraphFitActive(Bool_t);
    void setHistFitActive(Bool_t);
    void setLinRegActive(Bool_t);
    void setMbSelector(Int_t);
    void setnTimeValues(Int_t);
    void setTrendCalculationActive(Bool_t);
    void setSelectorActive(Bool_t);
    void setTdcSelector(Int_t);
    
protected:
    void calc     (Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Float_t, Float_t*, Float_t*);
    void calc5    (Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Float_t, Float_t*, Float_t*);
    void calcCHI  (Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Float_t, Float_t*, Float_t*);
    void calcGraph(Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Float_t, Float_t*, Float_t*);
    void calcSlope(Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Float_t, Float_t*, Float_t*, Float_t*, Int_t, Int_t);
    void fitHistogramm(Float_t*, Float_t*, Int_t, Int_t, Int_t, Int_t, Int_t);
    void fitHistogrammMeanCondition(Float_t*, Float_t*, Int_t, Int_t, Int_t, Int_t);
    void fitHistogrammMaxCondition(Float_t*, Float_t*, Int_t, Int_t, Int_t, Int_t);
public: 
    ClassDef(HMdcSlope, 0) 
};
#endif /* !HMDCSLOPE_H */