#ifndef ALITOFCALIB_H
#define ALITOFCALIB_H
#define CHENTRIESSMALL 300 // number of entries per TOF channel per run
#define MAXCHENTRIESSMALL 10000 // max number of entries per TOF channel
#define NIDXSMALL 3 // number of values stored
#define DELTAIDXTOT 0 // index for ToT in bigarray
#define DELTAIDXTIME 1 // index for TOF time in big/smallarray
#define DELTAIDXPID 2 // index for Exp Time after Comb PID
#define MEANENTRIES 15 // Mean number of entries per channel
#include "TTask.h"
class TArrayF;
class TF1;
class TH1F;
class TH1C;
class TObjArray;
class TTree;
class TChain;
class TMap;
class AliTOFCal;
class AliTOFRecoParam;
class AliTOFChannelOnlineStatusArray;
class AliTOFChannelOnlineArray;
class AliTOFDeltaBCOffset;
class AliTOFCTPLatency;
class AliTOFT0Fill;
class AliTOFRunParams;
class AliTOFResponseParams;
class AliESDEvent;
class AliLHCClockPhase;
class AliTOFcalib:public TTask{
public:
AliTOFcalib();
AliTOFcalib(const AliTOFcalib & calib);
AliTOFcalib& operator=(const AliTOFcalib & calib);
virtual ~AliTOFcalib() ;
void CreateCalArrays();
void CreateCalObjects();
TObjArray * GetTOFCalArrayOnline() const {return fTOFCalOnline;}
AliTOFChannelOnlineArray * GetTOFOnlineDelay() const {return fCal;}
AliTOFChannelOnlineStatusArray * GetTOFOnlineStatus() const {return fStatus;}
TObjArray * GetTOFCalArrayOnlinePulser() const {return fTOFCalOnlinePulser;}
TObjArray * GetTOFCalArrayOnlineNoise() const {return fTOFCalOnlineNoise;}
TObjArray * GetTOFCalArrayOnlineHW() const {return fTOFCalOnlineHW;}
TObjArray * GetTOFCalArrayOffline() const {return fTOFCalOffline;}
TMap * GetConfigMap() const {return fConfigMap;}
TH1F * GetTOFSimToT() const {return fTOFSimToT;}
TTree * GetTOFCalibTree() const {return fTree;}
TChain * GetTOFCalibChain() const {return fChain;}
const char * GetOfflineValidity() const {return fkValidity;}
void SetOfflineValidity(const char* validity) {fkValidity = validity;}
Int_t NChannels()const{return fNChannels;}
void CreateDeltaBCOffset();
void CreateCTPLatency();
void CreateT0Fill();
void CreateRunParams();
AliTOFDeltaBCOffset *GetDeltaBCOffset() const {return fDeltaBCOffset;};
AliTOFCTPLatency *GetCTPLatency() const {return fCTPLatency;};
AliTOFT0Fill *GetT0Fill() const {return fT0Fill;};
AliTOFRunParams *GetRunParams() const {return fRunParams;};
AliTOFResponseParams *GetResponseParams() const {return fResponseParams;};
void WriteSimHistoOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, TH1F *histo);
void WriteConfigMapOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteConfigMapOnCDB(const Char_t *sel);
void WriteParOnlineDelayOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOnlineStatusOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOnlineDelayOnCDB(const Char_t *sel);
void WriteParOnlineStatusOnCDB(const Char_t *sel);
void WriteParOnlineOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOnlinePulserOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOnlineNoiseOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOnlineHWOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity, Int_t minrun, Int_t maxrun);
void WriteParOnlineOnCDB(const Char_t *sel);
void WriteParOnlinePulserOnCDB(const Char_t *sel);
void WriteParOnlineNoiseOnCDB(const Char_t *sel);
void WriteParOnlineHWOnCDB(const Char_t *sel);
void WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity);
void WriteDeltaBCOffsetOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteCTPLatencyOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteT0FillOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteRunParamsOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteReadoutEfficiencyOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
void WriteProblematicOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun);
Bool_t ReadSimHistoFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadConfigMapFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlineDelayFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlineStatusFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlineFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlinePulserFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlineNoiseFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOnlineHWFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadParOfflineFromCDB(const Char_t *sel, Int_t nrun);
void WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, AliTOFRecoParam *param);
void WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, TObjArray *arr);
AliTOFRecoParam * ReadRecParFromCDB(const Char_t *sel, Int_t nrun, Int_t eventType=0);
void CreateTreeFromCDB(Int_t minrun, Int_t maxrun);
void CreateTreeFromFile(Int_t minrun, Int_t maxrun);
void CreateTreeFromGrid(Int_t minrun, Int_t maxrun);
void CreateChainFromGrid(Int_t minrun, Int_t maxrun);
Int_t Calibrate(Option_t *optionSave="", Option_t *optionFit="RQ");
Int_t Calibrate(Int_t nch,Int_t *ich, Option_t *optionSave="", Option_t *optionFit="RQ");
Int_t Calibrate(Int_t ichmin, Int_t ichmax, Option_t *optionSave="", Option_t *optionFit="RQ");
Int_t Calibrate(Int_t ich, Option_t *optionSave="", Option_t *optionFit="RQ");
Int_t CalibrateFromProfile(Int_t ich, Option_t *optionSave="", Option_t *optionFit="RQ");
TH1F* Profile(Int_t i);
Int_t FindBins (TH1F* h, Double_t *bins) const;
void SetNruns(Int_t nruns) {fNruns=nruns;}
Int_t GetNruns() const {return fNruns;}
void SetFirstRun(Int_t firstRun) {fFirstRun=firstRun;}
Int_t GetFirstRun() const {return fFirstRun;}
void SetLastRun(Int_t lastRun) {fLastRun=lastRun;}
Int_t GetLastRun() const {return fLastRun;}
Bool_t ReadDeltaBCOffsetFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadCTPLatencyFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadT0FillFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadRunParamsFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadLHCClockPhaseFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadReadoutEfficiencyFromCDB(const Char_t *sel, Int_t nrun);
Bool_t ReadProblematicFromCDB(const Char_t *sel, Int_t nrun);
Bool_t Init(Int_t run = -1);
Double_t GetTimeCorrection(Int_t index, Double_t tot, Int_t deltaBC, Int_t l0l1, UInt_t timestamp);
void CalibrateESD(AliESDEvent *event);
void CalibrateTExp(AliESDEvent *event) const;
void SetRemoveMeanT0(Bool_t value) {fRemoveMeanT0 = value;};
void SetUseLHCClockPhase(Bool_t value) {fUseLHCClockPhase = value;};
Bool_t GetUseLHCClockPhase() const {return fUseLHCClockPhase;};
void SetCalibrateTOFsignal(Bool_t value) {fCalibrateTOFsignal = value;};
void SetCorrectTExp(Bool_t value) {fCorrectTExp = value;};
Bool_t IsChannelEnabled(Int_t index, Bool_t checkEfficiency = kTRUE, Bool_t checkProblematic = kTRUE);
Bool_t IsChannelEfficient(Int_t index);
Bool_t IsChannelProblematic(Int_t index);
Double_t TuneForMC(AliESDEvent *event, Double_t resolution);
void SetRunParamsSpecificVersion(Int_t value) {fRunParamsSpecificVersion = value;};
private:
Int_t fNChannels;
TObjArray *fTOFCalOnline;
TObjArray *fTOFCalOnlinePulser;
TObjArray *fTOFCalOnlineNoise;
TObjArray *fTOFCalOnlineHW;
TObjArray *fTOFCalOffline;
AliTOFChannelOnlineArray *fCal;
AliTOFChannelOnlineStatusArray *fStatus;
TH1F *fTOFSimToT;
const char *fkValidity;
TTree *fTree;
TChain *fChain;
Int_t fNruns;
Int_t fFirstRun;
Int_t fLastRun;
TMap* fConfigMap;
AliTOFDeltaBCOffset *fDeltaBCOffset;
AliTOFCTPLatency *fCTPLatency;
AliTOFT0Fill *fT0Fill;
AliTOFRunParams *fRunParams;
AliLHCClockPhase *fLHCClockPhase;
AliTOFResponseParams *fResponseParams;
TH1F *fReadoutEfficiency;
TH1C *fProblematic;
Bool_t fInitFlag;
Bool_t fRemoveMeanT0;
Bool_t fUseLHCClockPhase;
Bool_t fCalibrateTOFsignal;
Bool_t fCorrectTExp;
Int_t fRunParamsSpecificVersion;
ClassDef(AliTOFcalib,11);
};
#endif // AliTOFcalib_H