#ifndef ALITOFTRIGGER_H
#define ALITOFTRIGGER_H
#include "AliTriggerDetector.h"
#include "AliLog.h"
#include "TTree.h"
class AliTOFrawData;
class AliTOFTriggerMask;
class AliTOFTrigger : public AliTriggerDetector
{
public:
AliTOFTrigger();
AliTOFTrigger(Int_t HighMultTh, Int_t ppMBTh, Int_t MultiMuonTh, Int_t UPTh, Float_t deltaminpsi, Float_t deltamaxpsi, Float_t deltaminro, Float_t deltamaxro, Int_t stripWindow,Float_t startTimeWindow=0.0,Float_t widthTimeWindow=25.);
virtual ~AliTOFTrigger();
virtual void CreateInputs();
virtual void Trigger();
Int_t GetHighMultTh() const {return fHighMultTh;}
Int_t GetppMBTh() const {return fppMBTh;}
Int_t GetMultiMuonTh() const {return fMultiMuonTh;}
Int_t GetUPTh() const {return fUPTh;}
Float_t Getdeltaminpsi() const {return fdeltaminpsi;}
Float_t Getdeltamaxpsi() const {return fdeltamaxpsi;}
Float_t Getdeltaminro() const {return fdeltaminro;}
Float_t Getdeltamaxro() const {return fdeltamaxro;}
Int_t GetstripWindow() const {return fstripWindow;}
static void LoadActiveMask();
void GetMapMatrix(Bool_t map[][24]) const;
void GetMap(Bool_t **map) const;
void GetTRDmapMatrix(Bool_t map[][8]) const;
void GetTRDmap(Bool_t **map) const;
Bool_t GetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,Int_t iTDC, Int_t iCH);
Bool_t GetBit(Int_t *detind);
void SetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,Int_t iTDC, Int_t iCH);
void SetBit(Int_t *detind);
void ResetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,Int_t iTDC, Int_t iCH);
void ResetBit(Int_t *detind);
void SetHighMultTh(Int_t HighMultTh){fHighMultTh = HighMultTh;}
void SetppMBTh(Int_t ppMBTh){fppMBTh = ppMBTh;}
void SetMultiMuonTh(Int_t MultiMuonTh){fMultiMuonTh = MultiMuonTh;}
void SetUPTh(Int_t UPTh){fUPTh = UPTh;}
void Setdeltaminpsi(Float_t deltaminpsi){fdeltaminpsi = deltaminpsi;}
void Setdeltamaxpsi(Float_t deltamaxpsi){fdeltamaxpsi = deltamaxpsi;}
void Setdeltaminro(Float_t deltaminro){fdeltaminro = deltaminro;}
void Setdeltamaxro(Float_t deltamaxro){fdeltamaxro = deltamaxro;}
void SetstripWindow(Int_t stripWindow){fstripWindow = stripWindow;}
Bool_t Return(Int_t i){if(i==0) return fSel1;
else if(i==1) return fSel2;
else if(i==2) return fSel3;
else if(i==3) return fSel4;
else { AliWarning(Form(" Index out of range: %d not in [0,3]",i)); return kFALSE; }
};
Float_t GetStartTimeWindow() const {return fStartTimeHit;};
Float_t GetTimeWidthWindow() const {return fTimeWidthTrigger;};
void SetStartTimeWindow(Float_t val) {fStartTimeHit = val;};
void SetTimeWidthWindow(Float_t val) {fTimeWidthTrigger = val;};
Int_t GetNumberOfCrateOn(){return fNCrateOn;};
Int_t GetNumberOfMaxipadOn(){return fNMaxipadOn;};
Int_t GetNumberOfMaxipadOnAll(){return fNMaxipadOnAll;};
Bool_t *GetLTMarray(){return fLTMarray;};
void CreateCTTMMatrix();
void CreateLTMMatrix();
void CreateLTMMatrixFromDigits();
void CreateLTMMatrixFromRaw(AliRawReader *fRawReader);
static AliTOFTriggerMask *GetTOFTriggerMap() {return fTOFTrigMap;}
static void PrepareTOFMapFromRaw(AliRawReader *fRawReader,Int_t deltaBC=13600);
static void PrepareTOFMapFromDigit(TTree *treeD);
private:
enum{
kNLTM = 72,
kNLTMchannels = 48,
kNCTTM = 36,
kNCTTMchannels = 24,
kNLTMtoTRDchannels = 8
};
static AliTOFTriggerMask *fTOFTrigMap;
static AliTOFTriggerMask *fTOFTrigMask;
AliTOFTrigger& operator=(const AliTOFTrigger &);
AliTOFTrigger(const AliTOFTrigger & tr);
void GetCTTMIndex(Int_t *detind, Int_t *indexCTTM);
static void GetLTMIndex(const Int_t * const detind, Int_t *LTMIndex);
Bool_t fLTMmatrix[kNLTM][kNLTMchannels];
Bool_t fLTMarray[kNCTTM];
Bool_t fCTTMmatrixFront[kNCTTM][kNCTTMchannels];
Bool_t fCTTMmatrixBack[kNCTTM][kNCTTMchannels];
Int_t fHighMultTh;
Int_t fppMBTh;
Int_t fMultiMuonTh;
Int_t fUPTh;
Float_t fdeltaminpsi;
Float_t fdeltamaxpsi;
Float_t fdeltaminro;
Float_t fdeltamaxro;
Int_t fstripWindow;
Bool_t fSel1,fSel2,fSel3,fSel4;
UInt_t fPowerMask[kNCTTMchannels+1];
Int_t fNCrateOn;
Int_t fNMaxipadOn;
Int_t fNMaxipadOnAll;
Float_t fStartTimeHit;
Float_t fTimeWidthTrigger;
ClassDef(AliTOFTrigger,3)
};
#endif