#ifndef HTOFWALKPAR_H
#define HTOFWALKPAR_H
#include "hparcond.h"
#include "TArrayF.h"
#include "TArrayD.h"
#include "TF1.h"
class  HTofDigiPar;
class  HTofCalPar;
class  HTofGeomPar;
class  HParamList;
class  HTofRaw;
class HTofWalkPar : public HParCond {
protected:
    TArrayF fWPars;      
    TArrayF fWErrors;    
    TArrayI fSideIsUsed; 
    
    
    TArrayD fParsSX;               
    TArrayD fParsDX;               
    TArrayD fParsGeantToData;      
    TArrayD fParsGroupVelocityData;
    TArrayD fParsGroupVelocityScale; 
    
    
    HTofDigiPar *fDigiPar;                        
    HTofCalPar  *fCalPar;                         
    HTofGeomPar *fTofGeometry;                    
    TF1* func;                                    
    static Double_t ffunc(Double_t* x, Double_t* par);
    TF1* fdxsigma;           
    TF1* fdxoffset;          
    TF1* fscaleDxSigma;      
public:
    HTofWalkPar(const Char_t* name   ="TofWalkPar",
		const Char_t* title  ="Walking correciton parameters for the TOF Detector",
		const Char_t* context="TofWalkParProduction");
    ~HTofWalkPar();
    const   Float_t*  getPars  (Int_t sec, Int_t mod, Int_t cell, Int_t side, Int_t bin) { return &fWPars     [8*8*4*20*9*sec + 8*4*20*9*mod + 4*20*9*cell + 20*9*side + 9*bin];}
            Float_t   getError (Int_t sec, Int_t mod, Int_t cell, Int_t side, Int_t bin) { return  fWErrors   [8*8*4*20  *sec + 8*4*20  *mod + 4*20  *cell + 20  *side + bin];}
            Float_t   getIsUsed(Int_t sec, Int_t mod, Int_t cell, Int_t side)            { return  fSideIsUsed[8*8*2     *sec + 8*2     *mod + 2     *cell +      side];}
    const   Double_t* getParsSX(Int_t sec, Int_t mod, Int_t cell)                        { return &fParsSX    [8*8*3*sec + 8*3*mod + 3*cell];}
    const   Double_t* getParsDX(Int_t sec, Int_t mod, Int_t cell)                        { return &fParsDX    [8*8*5*sec + 8*5*mod + 5*cell];}
    const   Double_t* getParsGeantToData()                                               { return &fParsGeantToData [0];}
            Double_t  getGroupVelocity(Int_t sec, Int_t mod, Int_t cell)                 { return  fParsGroupVelocityData[8*8*sec + 8*mod + cell];}
            Double_t* getGroupVelocityScale()                                            { return &fParsGroupVelocityScale[0]; }
    void    setPars  (Int_t sec, Int_t mod, Int_t cell, Int_t side, Int_t bin, Int_t npar, Float_t* pars)  { for(Int_t i =0;i<npar;i++){ fWPars[8*8*4*20*9*sec + 8*4*20*9*mod + 4*20*9*cell + 20*9*side + 9*bin + i ] = pars[i];} }
    void    setErrors(Int_t sec, Int_t mod, Int_t cell, Int_t side, Int_t bin, Float_t par)  { fWErrors   [8*8*4*20*sec + 8*4*20*mod + 4*20*cell + 20*side + bin] = par; }
    void    setIsUsed(Int_t sec, Int_t mod, Int_t cell, Int_t side,Float_t par)              { fSideIsUsed[8*8*2   *sec + 8*2   *mod + 2   *cell +    side] = par; }
    void    setParsSX(Int_t sec, Int_t mod, Int_t cell, Double_t* pars)                      { for(Int_t i =0;i<3;i++){ fParsSX[8*8*3*sec + 8*3*mod + 3*cell + i ] = pars[i];} }
    void    setParsDX(Int_t sec, Int_t mod, Int_t cell, Double_t* pars)                      { for(Int_t i =0;i<5;i++){ fParsDX[8*8*5*sec + 8*5*mod + 5*cell + i ] = pars[i];} }
    void    setParsGeantToData( Double_t* pars)                                              { for(Int_t i =0;i<2;i++){ fParsGeantToData[ i ] = pars[i];} }
    void    setGroupVelocity(Int_t sec, Int_t mod, Int_t cell,Double_t vel)                  { fParsGroupVelocityData[8*8*sec + 8*mod + cell] = vel;}
    void    setGroupVelocityScale(Double_t* scale)                                           { for(Int_t i =0;i<3;i++) {fParsGroupVelocityScale[i] = scale[i]; }  }
    void    putParams(HParamList*);
    Bool_t  getParams(HParamList*);
    void    clear();
    
    void    getContainers();
    Float_t getOffset (Float_t x, Int_t side, Float_t q, Int_t sector, Int_t module, Int_t cell);
    void    getOffsets(Float_t x, Float_t ql, Float_t qr,Int_t sector, Int_t module, Int_t cell, Float_t& const1,Float_t& const2,Float_t& const3,Float_t& const4);
    void    getErrors (Float_t x, Float_t ql, Float_t qr,Int_t sector, Int_t module, Int_t cell, Float_t& const1,Float_t& const2,Float_t& const3,Float_t& const4);
    void    getTofPos (HTofRaw* tofraw,Float_t& tof,Float_t& pos, Float_t x, Float_t startTMP);
    Double_t getDxSigma (Int_t s,Int_t m,Int_t c,Double_t eloss);
    Double_t getDxSigmaDigi (Int_t s,Int_t m,Int_t c,Double_t eloss,Double_t vgroup,Double_t beta);
    Double_t getDxOffset(Int_t s,Int_t m,Int_t c,Double_t eloss);
    Double_t getNormedDX(Int_t s,Int_t m,Int_t c,Double_t eloss,Double_t rkDX,Bool_t sim);
    Double_t scaleGeantToData(Double_t charge){ return charge*fParsGeantToData[0]+fParsGeantToData[1]; }
    ClassDef(HTofWalkPar,2) 
};
#endif  /*!HTOFWALKPAR_H*/