#ifndef ALIDIELECTRONPID_H
#define ALIDIELECTRONPID_H
#include <TBits.h>
#include <AliPID.h>
#include <AliAnalysisCuts.h>
#include <AliTRDPIDResponse.h>
class TF1;
class TList;
class AliVTrack;
class TGraph;
class THnBase;
class AliPIDResponse;
class AliDielectronVarManager;
class AliDielectronVarCuts;
class AliDielectronPID : public AliAnalysisCuts {
public:
enum DetType {kITS, kTPC, kTRD, kTRDeleEff, kTRDeleEff2D, kTOF, kEMCAL};
enum PIDbitType {kIgnore=0, kRequire, kIfAvailable};
AliDielectronPID();
AliDielectronPID(const char*name, const char* title);
virtual ~AliDielectronPID();
void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp=-99999.,
Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
Int_t var=-1);
void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, TF1 * const funUp,
Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
Int_t var=-1);
void AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, Double_t nSigmaUp,
Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
Int_t var=-1);
void AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, TF1 * const funUp,
Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
Int_t var=-1);
void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp, Double_t min, Double_t max, Bool_t exclude, UInt_t pidBitType, TF1 * const funSigma);
void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
AliDielectronVarCuts *varcuts, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire );
void AddCut(DetType det, AliPID::EParticleType type, THnBase * const histLow, Double_t nSigmaUp,
Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE,
UInt_t pidBitType=AliDielectronPID::kRequire, Int_t var=-1);
void SetDefaults(Int_t def);
Int_t GetNCuts() { return fNcuts;}
virtual Bool_t IsSelected(TObject* track);
virtual Bool_t IsSelected(TList* ) {return kFALSE;}
static void SetCorrGraph(TGraph * const gr) { fgFitCorr=gr; }
static TGraph *GetCorrGraph() { return fgFitCorr; }
static void SetCorrVal(Double_t run);
static Double_t GetCorrVal() { return fgCorr; }
static Double_t GetCorrValdEdx() { return fgCorrdEdx; }
static void SetCorrGraphdEdx(TGraph * const gr) { fgdEdxRunCorr=gr; }
static TGraph *GetCorrGraphdEdx() { return fgdEdxRunCorr; }
static void SetEtaCorrFunction(TF1 *fun) {fgFunEtaCorr=fun;}
static void SetCentroidCorrFunction(TH1 *fun) { fgFunCntrdCorr=fun; }
static void SetWidthCorrFunction(TH1 *fun) { fgFunWdthCorr=fun; }
static TF1* GetEtaCorrFunction() { return fgFunEtaCorr; }
static Double_t GetEtaCorr(const AliVTrack *track);
static Double_t GetCntrdCorr(const AliVTrack *track) { return (fgFunCntrdCorr ? GetPIDCorr(track,fgFunCntrdCorr) : 0.0); }
static Double_t GetWdthCorr(const AliVTrack *track) { return (fgFunWdthCorr ? GetPIDCorr(track,fgFunWdthCorr) : 1.0); }
private:
enum {kNmaxPID=30};
TBits *fUsedVars;
DetType fDetType[kNmaxPID];
AliPID::EParticleType fPartType[kNmaxPID];
Float_t fNsigmaLow[kNmaxPID];
Float_t fNsigmaUp[kNmaxPID];
Double_t fmin[kNmaxPID];
Double_t fmax[kNmaxPID];
Bool_t fExclude[kNmaxPID];
TF1 *fFunUpperCut[kNmaxPID];
TF1 *fFunLowerCut[kNmaxPID];
UChar_t fNcuts;
UChar_t fRequirePIDbit[kNmaxPID];
UShort_t fActiveCuts[kNmaxPID];
Double_t fSigmaFunLow[kNmaxPID];
Double_t fSigmaFunUp[kNmaxPID];
TF1 *fFunSigma[kNmaxPID];
AliDielectronVarCuts *fVarCuts[kNmaxPID];
AliPIDResponse *fPIDResponse;
static TGraph *fgFitCorr;
static Double_t fgCorr;
static Double_t fgCorrdEdx;
static TF1 *fgFunEtaCorr;
static TH1 *fgFunCntrdCorr;
static TH1 *fgFunWdthCorr;
static TGraph *fgdEdxRunCorr;
static Double_t GetPIDCorr(const AliVTrack *track, TH1 *hist);
THnBase* fMapElectronCutLow[kNmaxPID];
Bool_t IsSelectedITS(AliVTrack * const part, Int_t icut);
Bool_t IsSelectedTPC(AliVTrack * const part, Int_t icut, Double_t *values);
Bool_t IsSelectedTRD(AliVTrack * const part, Int_t icut);
Bool_t IsSelectedTRDeleEff(AliVTrack * const part, Int_t icut, AliTRDPIDResponse::ETRDPIDMethod PIDmethod=AliTRDPIDResponse::kLQ1D);
Bool_t IsSelectedTOF(AliVTrack * const part, Int_t icut);
Bool_t IsSelectedEMCAL(AliVTrack * const part, Int_t icut);
AliDielectronPID(const AliDielectronPID &c);
AliDielectronPID &operator=(const AliDielectronPID &c);
ClassDef(AliDielectronPID,7)
};
#endif