#ifndef ALICFTRACKCUTPID_H
#define ALICFTRACKCUTPID_H
#include "AliCFCutBase.h"
#include "AliPID.h"
#include "AliESDtrack.h"
#include "AliAODTrack.h"
#include <TString.h>
#include <TObject.h>
#include <TH1F.h>
#include <TF1.h>
class AliESDtrack;
class AliCFTrackCutPid : public AliCFCutBase
{
public :
AliCFTrackCutPid() ;
AliCFTrackCutPid(const Char_t* name, const Char_t* title) ;
AliCFTrackCutPid(const AliCFTrackCutPid& c) ;
AliCFTrackCutPid& operator=(const AliCFTrackCutPid& c) ;
virtual ~AliCFTrackCutPid();
enum EDetType {kITS = 0, kTPC, kTRD, kTOF, kHMPID=4, kNoDet=-11};
enum EDetNum {kNdets=5};
enum ENoId {kCheckProb = -10, kCheckResp = -11, kDetRestr = -12};
void SetDetectors(TString dets);
void SetPriors(Double_t r[AliPID::kSPECIES]);
void SetProbabilityCut(Double_t cut) {fCut=cut;}
void SetParticleType(Int_t iType, Bool_t tocombine) {fgParticleType=iType; fgIsComb=tocombine;}
void SetMinDiffResp(Bool_t check, Double_t mindiff) {fCheckResponse=check; fMinDiffResponse=mindiff;}
void SetMinDiffProb(Bool_t check, Double_t mindiff) {fCheckSelection=check; fMinDiffProbability=mindiff;}
void SetPriorFunctions(TF1 *func[AliPID::kSPECIES]);
void SetANDstatus(TString dets);
void SetDetectorProbabilityRestriction(TString det, Int_t iPart, Double_t upperprob);
void SetHistogramAxis(Int_t nbins, Double_t xmin, Double_t xmax) {fNbins=nbins; fXmin = xmin; fXmax = xmax;}
void SetAODmode(Bool_t isaod = kFALSE) {fgIsAOD=isaod;}
void SetProbThreshold(Double_t value) {fProbThreshold=value;}
Int_t GetID(ULong_t status[kNdets+1], Double_t pid[kNdets+1][AliPID::kSPECIES]) const;
Int_t GetAODID(AliAODTrack *aodtrack) const;
virtual Bool_t IsSelected(TObject *track);
Bool_t IsSelected(TList* ) {return kTRUE;}
void AddQAHistograms(TList *qalist);
private:
void TrackInfo(const AliESDtrack *pTrk,ULong_t status[kNdets+1], Double_t pid[kNdets+1][AliPID::kSPECIES]) const;
Int_t Identify(Double_t pid[AliPID::kSPECIES]) const;
Int_t IdentifyQA(const Double_t pid[AliPID::kSPECIES],Int_t idets) const;
void SetPPriors(AliESDtrack *pTrk);
ULong_t StatusForAND(ULong_t status[kNdets+1]) const;
void InitialiseHisto();
void DefineHistograms();
Bool_t Check(const Double_t *p, Int_t iPsel, Double_t minDiff) const;
void CombPID(ULong_t status[kNdets+1],Double_t pid[kNdets+1][AliPID::kSPECIES],Double_t *combpid) const;
Double_t fCut;
Double_t fMinDiffResponse;
Double_t fMinDiffProbability;
Int_t fgParticleType;
Bool_t fgIsComb;
Bool_t fgIsAOD;
Bool_t fCheckResponse;
Bool_t fCheckSelection;
Bool_t fIsPpriors;
Bool_t fIsDetAND;
Double_t fXmin;
Double_t fXmax;
Int_t fNbins;
Int_t fDetRestr;
Int_t fiPartRestr;
Double_t fDetProbRestr;
Double_t fProbThreshold;
Double_t fPriors[AliPID::kSPECIES];
TF1 *fPriorsFunc[AliPID::kSPECIES];
Bool_t fDets[kNdets];
Bool_t fDetsInAnd[kNdets];
TH1F *fhResp[kNdets][AliPID::kSPECIES];
TH1F *fhProb[kNdets][AliPID::kSPECIES];
TH1F *fhCombResp[AliPID::kSPECIES];
TH1F *fhCombProb[AliPID::kSPECIES];
ClassDef(AliCFTrackCutPid,1);
};
#endif