#ifndef ALIESDTRACKCUTS_H
#define ALIESDTRACKCUTS_H
#include <TString.h>
#include "AliAnalysisCuts.h"
class AliESDEvent;
class AliESDtrack;
class AliLog;
class TTree;
class TH1;
class TH1F;
class TH2F;
class TF1;
class TCollection;
class TFormula;
class AliESDtrackCuts : public AliAnalysisCuts
{
public:
enum ITSClusterRequirement { kOff = 0, kNone, kAny, kFirst, kOnlyFirst, kSecond, kOnlySecond, kBoth };
enum Detector { kSPD = 0, kSDD, kSSD };
enum ITSULayers { kITSU012 = 0, kITSU34, kITSU56 };
enum MultEstTrackCuts { kMultEstTrackCutGlobal = 0, kMultEstTrackCutITSSA, kMultEstTrackCutDCAwSPD, kMultEstTrackCutDCAwoSPD, kNMultEstTrackCuts };
enum MultEstTrackType { kTrackletsITSTPC = 0, kTrackletsITSSA, kTracklets };
enum VertexType { kVertexTracks = 0x1, kVertexSPD = 0x2, kVertexTPC = 0x4 };
AliESDtrackCuts(const Char_t* name = "AliESDtrackCuts", const Char_t* title = "");
virtual ~AliESDtrackCuts();
virtual Bool_t IsSelected(TObject* obj)
{return AcceptTrack((AliESDtrack*)obj);}
virtual Bool_t IsSelected(TList* ) {return kTRUE;}
Bool_t AcceptTrack(const AliESDtrack* esdTrack);
TObjArray* GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTPC = kFALSE);
Int_t CountAcceptedTracks(const AliESDEvent* const esd);
static Int_t GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly);
static Int_t GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType = kTrackletsITSTPC, Float_t etaRange = 0.5, Float_t etaCent=0.);
static AliESDtrackCuts* GetMultEstTrackCuts(MultEstTrackCuts cut);
static AliESDtrack* GetTPCOnlyTrack(const AliESDEvent* esd, Int_t iTrack);
static AliESDtrackCuts* GetStandardTPCOnlyTrackCuts();
static AliESDtrackCuts* GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries=kTRUE);
static AliESDtrackCuts* GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries=kTRUE, Int_t clusterCut=0);
static AliESDtrackCuts* GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries=kTRUE, Int_t clusterCut=1);
static AliESDtrackCuts* GetStandardITSSATrackCuts2009(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE);
static AliESDtrackCuts* GetStandardITSSATrackCuts2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE);
static AliESDtrackCuts* GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE);
static AliESDtrackCuts* GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE);
static AliESDtrackCuts* GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE);
static AliESDtrackCuts* GetStandardV0DaughterCuts();
virtual Long64_t Merge(TCollection* list);
virtual void Copy(TObject &c) const;
AliESDtrackCuts(const AliESDtrackCuts& pd);
AliESDtrackCuts &operator=(const AliESDtrackCuts &c);
void SetMinNClustersTPC(Int_t min=-1) {fCutMinNClusterTPC=min;}
void SetMinNClustersTPCPtDep(TFormula *f1=0x0, Float_t ptmax=0.);
void SetMinNClustersITS(Int_t min=-1) {fCutMinNClusterITS=min;}
void SetMinNCrossedRowsTPC(Float_t min=-1) { fCutMinNCrossedRowsTPC=min;}
void SetMinRatioCrossedRowsOverFindableClustersTPC(Float_t min = -1) { fCutMinRatioCrossedRowsOverFindableClustersTPC=min;}
void SetMinLengthActiveVolumeTPC(Float_t min = 120.) {fCutMinLengthActiveVolumeTPC=min;}
void SetClusterRequirementITS(Detector det, ITSClusterRequirement req = kOff) { fCutClusterRequirementITS[det] = req; }
void SetClusterRequirementITS(ITSULayers det, ITSClusterRequirement req = kOff) { fCutClusterRequirementITS[det] = req; }
void SetMaxChi2PerClusterTPC(Float_t max=1e10) {fCutMaxChi2PerClusterTPC=max;}
void SetMaxChi2PerClusterITS(Float_t max=1e10) {fCutMaxChi2PerClusterITS=max;}
void SetMaxChi2TPCConstrainedGlobal(Float_t max=1e10) {fCutMaxChi2TPCConstrainedVsGlobal = max; }
void SetMaxChi2TPCConstrainedGlobalVertexType(Int_t vertexType = kVertexTracks | kVertexSPD) { fCutMaxChi2TPCConstrainedVsGlobalVertexType = vertexType; }
void SetMaxNOfMissingITSPoints(Int_t max=6) {fCutMaxMissingITSPoints=max;}
void SetRequireTPCRefit(Bool_t b=kFALSE) {fCutRequireTPCRefit=b;}
void SetRequireTPCStandAlone(Bool_t b=kFALSE) {fCutRequireTPCStandAlone=b;}
void SetRequireITSRefit(Bool_t b=kFALSE) {fCutRequireITSRefit=b;}
void SetRequireITSPid(Bool_t b=kFALSE) {fCutRequireITSPid=b;}
void SetRequireITSStandAlone(Bool_t b=kFALSE) {fCutRequireITSStandAlone = b;}
void SetRequireITSPureStandAlone(Bool_t b=kFALSE){fCutRequireITSpureSA = b;}
void SetAcceptKinkDaughters(Bool_t b=kTRUE) {fCutAcceptKinkDaughters=b;}
void SetAcceptSharedTPCClusters(Bool_t b=kTRUE){fCutAcceptSharedTPCClusters=b;}
void SetMaxFractionSharedTPCClusters(Float_t max=1e10) {fCutMaxFractionSharedTPCClusters=max;}
void SetMaxCovDiagonalElements(Float_t c1=1e10, Float_t c2=1e10, Float_t c3=1e10, Float_t c4=1e10, Float_t c5=1e10)
{fCutMaxC11=c1; fCutMaxC22=c2; fCutMaxC33=c3; fCutMaxC44=c4; fCutMaxC55=c5;}
void SetMaxRel1PtUncertainty(Float_t max=1e10) {fCutMaxRel1PtUncertainty=max;}
void SetMaxNsigmaToVertex(Float_t sigma=1e10) {fCutNsigmaToVertex = sigma; SetRequireSigmaToVertex(kTRUE);}
void SetRequireSigmaToVertex(Bool_t b=kTRUE) {fCutSigmaToVertexRequired = b;}
void SetMaxDCAToVertexXY(Float_t dist=1e10) {fCutMaxDCAToVertexXY = dist;}
void SetMaxDCAToVertexZ(Float_t dist=1e10) {fCutMaxDCAToVertexZ = dist;}
void SetMinDCAToVertexXY(Float_t dist=0.) {fCutMinDCAToVertexXY = dist;}
void SetMinDCAToVertexZ(Float_t dist=0.) {fCutMinDCAToVertexZ = dist;}
void SetMaxDCAToVertexXYPtDep(const char *dist="");
void SetMaxDCAToVertexZPtDep(const char *dist="");
void SetMinDCAToVertexXYPtDep(const char *dist="");
void SetMinDCAToVertexZPtDep(const char *dist="");
void SetDCAToVertex2D(Bool_t b=kFALSE) {fCutDCAToVertex2D = b;}
Int_t GetMinNClusterTPC() const { return fCutMinNClusterTPC;}
Float_t GetMinNCrossedRowsTPC() const { return fCutMinNCrossedRowsTPC;}
Float_t GetMinRatioCrossedRowsOverFindableClustersTPC() const { return fCutMinRatioCrossedRowsOverFindableClustersTPC;}
Float_t GetMinLengthActiveVolumeTPC() const { return fCutMinLengthActiveVolumeTPC;}
Int_t GetMinNClustersITS() const { return fCutMinNClusterITS;}
TFormula *GetMinNClustersTPCPtDep() const { return f1CutMinNClustersTPCPtDep;}
ITSClusterRequirement GetClusterRequirementITS(Detector det) const { return fCutClusterRequirementITS[det]; }
ITSClusterRequirement GetClusterRequirementITS(ITSULayers det) const { return fCutClusterRequirementITS[det]; }
Float_t GetMaxChi2PerClusterTPC() const { return fCutMaxChi2PerClusterTPC;}
Float_t GetMaxChi2PerClusterITS() const { return fCutMaxChi2PerClusterITS;}
Float_t GetMaxChi2TPCConstrainedGlobal() const { return fCutMaxChi2TPCConstrainedVsGlobal; }
Int_t GetMaxChi2TPCConstrainedGlobalVertexType() const { return fCutMaxChi2TPCConstrainedVsGlobalVertexType; }
Int_t GetMaxNOfMissingITSPoints() const { return fCutMaxMissingITSPoints;}
Bool_t GetRequireTPCRefit() const { return fCutRequireTPCRefit;}
Bool_t GetRequireTPCStandAlone() const { return fCutRequireTPCStandAlone;}
Bool_t GetRequireITSRefit() const { return fCutRequireITSRefit;}
Bool_t GetRequireITSStandAlone() const { return fCutRequireITSStandAlone; }
Bool_t GetAcceptKinkDaughters() const { return fCutAcceptKinkDaughters;}
Bool_t GetAcceptSharedTPCClusters() const {return fCutAcceptSharedTPCClusters;}
Float_t GetMaxFractionSharedTPCClusters() const {return fCutMaxFractionSharedTPCClusters;}
void GetMaxCovDiagonalElements(Float_t& c1, Float_t& c2, Float_t& c3, Float_t& c4, Float_t& c5) const
{c1 = fCutMaxC11; c2 = fCutMaxC22; c3 = fCutMaxC33; c4 = fCutMaxC44; c5 = fCutMaxC55;}
Float_t GetMaxRel1PtUncertainty() const { return fCutMaxRel1PtUncertainty;}
Float_t GetMaxNsigmaToVertex() const { return fCutNsigmaToVertex;}
Float_t GetMaxDCAToVertexXY() const { return fCutMaxDCAToVertexXY;}
Float_t GetMaxDCAToVertexZ() const { return fCutMaxDCAToVertexZ;}
Float_t GetMinDCAToVertexXY() const { return fCutMinDCAToVertexXY;}
Float_t GetMinDCAToVertexZ() const { return fCutMinDCAToVertexZ;}
const char* GetMaxDCAToVertexXYPtDep() const { return fCutMaxDCAToVertexXYPtDep;}
const char* GetMaxDCAToVertexZPtDep() const { return fCutMaxDCAToVertexZPtDep;}
const char* GetMinDCAToVertexXYPtDep() const { return fCutMinDCAToVertexXYPtDep;}
const char* GetMinDCAToVertexZPtDep() const { return fCutMinDCAToVertexZPtDep;}
Bool_t GetDCAToVertex2D() const { return fCutDCAToVertex2D;}
Bool_t GetRequireSigmaToVertex( ) const { return fCutSigmaToVertexRequired;}
void GetPRange(Float_t& r1, Float_t& r2) const {r1=fPMin; r2=fPMax;}
void GetPtRange(Float_t& r1, Float_t& r2) const {r1=fPtMin; r2=fPtMax;}
void GetPxRange(Float_t& r1, Float_t& r2) const {r1=fPxMin; r2=fPxMax;}
void GetPyRange(Float_t& r1, Float_t& r2) const {r1=fPyMin; r2=fPyMax;}
void GetPzRange(Float_t& r1, Float_t& r2) const {r1=fPzMin; r2=fPzMax;}
void GetEtaRange(Float_t& r1, Float_t& r2) const {r1=fEtaMin; r2=fEtaMax;}
void GetRapRange(Float_t& r1, Float_t& r2) const {r1=fRapMin; r2=fRapMax;}
void SetPRange(Float_t r1=0, Float_t r2=1e10) {fPMin=r1; fPMax=r2;}
void SetPtRange(Float_t r1=0, Float_t r2=1e10) {fPtMin=r1; fPtMax=r2;}
void SetPxRange(Float_t r1=-1e10, Float_t r2=1e10) {fPxMin=r1; fPxMax=r2;}
void SetPyRange(Float_t r1=-1e10, Float_t r2=1e10) {fPyMin=r1; fPyMax=r2;}
void SetPzRange(Float_t r1=-1e10, Float_t r2=1e10) {fPzMin=r1; fPzMax=r2;}
void SetEtaRange(Float_t r1=-1e10, Float_t r2=1e10) {fEtaMin=r1; fEtaMax=r2;}
void SetRapRange(Float_t r1=-1e10, Float_t r2=1e10) {fRapMin=r1; fRapMax=r2;}
void SetHistogramsOn(Bool_t b=kFALSE) {fHistogramsOn = b;}
void DefineHistograms(Int_t color=1);
virtual Bool_t LoadHistograms(const Char_t* dir = 0);
void SaveHistograms(const Char_t* dir = 0);
void DrawHistograms();
static Float_t GetSigmaToVertex(const AliESDtrack* const esdTrack);
static void EnableNeededBranches(TTree* tree);
TH1F* GetDZNormalized(Int_t i) const { return fhDZNormalized[i]; }
TH1F* GetNClustersTPC(Int_t i) const { return fhNClustersTPC[i]; }
TH1F* GetPtHist(Int_t i) const { return fhPt[i]; }
void SetFlagCutTOFdistance(Bool_t flagTOFcut) { fFlagCutTOFdistance = flagTOFcut;}
Bool_t GetFlagCutTOFdistance() const { return fFlagCutTOFdistance;}
void SetCutTOFdistance(Float_t cut) { fCutTOFdistance = cut;}
Float_t GetCutTOFdistance() const { return fCutTOFdistance;}
void SetRequireTOFout(Bool_t b = kFALSE) {fCutRequireTOFout = b;}
void SetRequireStandardTOFmatchCuts();
protected:
void Init();
Bool_t CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2);
Bool_t CheckPtDepDCA(TString dist,Bool_t print=kFALSE) const;
void SetPtDepDCACuts(Double_t pt);
enum { kNCuts = 43 };
static const Char_t* fgkCutNames[kNCuts];
static AliESDtrackCuts* fgMultEstTrackCuts[kNMultEstTrackCuts];
Int_t fCutMinNClusterTPC;
Int_t fCutMinNClusterITS;
Float_t fCutMinNCrossedRowsTPC;
Float_t fCutMinRatioCrossedRowsOverFindableClustersTPC;
TFormula *f1CutMinNClustersTPCPtDep;
Float_t fCutMaxPtDepNClustersTPC;
Float_t fCutMinLengthActiveVolumeTPC;
ITSClusterRequirement fCutClusterRequirementITS[3];
Float_t fCutMaxChi2PerClusterTPC;
Float_t fCutMaxChi2PerClusterITS;
Float_t fCutMaxChi2TPCConstrainedVsGlobal;
Int_t fCutMaxChi2TPCConstrainedVsGlobalVertexType;
Int_t fCutMaxMissingITSPoints;
Float_t fCutMaxC11;
Float_t fCutMaxC22;
Float_t fCutMaxC33;
Float_t fCutMaxC44;
Float_t fCutMaxC55;
Float_t fCutMaxRel1PtUncertainty;
Bool_t fCutAcceptKinkDaughters;
Bool_t fCutAcceptSharedTPCClusters;
Float_t fCutMaxFractionSharedTPCClusters;
Bool_t fCutRequireTPCRefit;
Bool_t fCutRequireTPCStandAlone;
Bool_t fCutRequireITSRefit;
Bool_t fCutRequireITSPid;
Bool_t fCutRequireITSStandAlone;
Bool_t fCutRequireITSpureSA;
Float_t fCutNsigmaToVertex;
Bool_t fCutSigmaToVertexRequired;
Float_t fCutMaxDCAToVertexXY;
Float_t fCutMaxDCAToVertexZ;
Float_t fCutMinDCAToVertexXY;
Float_t fCutMinDCAToVertexZ;
TString fCutMaxDCAToVertexXYPtDep;
TString fCutMaxDCAToVertexZPtDep;
TString fCutMinDCAToVertexXYPtDep;
TString fCutMinDCAToVertexZPtDep;
TFormula *f1CutMaxDCAToVertexXYPtDep;
TFormula *f1CutMaxDCAToVertexZPtDep;
TFormula *f1CutMinDCAToVertexXYPtDep;
TFormula *f1CutMinDCAToVertexZPtDep;
Bool_t fCutDCAToVertex2D;
Float_t fPMin, fPMax;
Float_t fPtMin, fPtMax;
Float_t fPxMin, fPxMax;
Float_t fPyMin, fPyMax;
Float_t fPzMin, fPzMax;
Float_t fEtaMin, fEtaMax;
Float_t fRapMin, fRapMax;
Bool_t fCutRequireTOFout;
Bool_t fFlagCutTOFdistance;
Float_t fCutTOFdistance;
static Char_t fgBeamTypeFlag;
Bool_t fHistogramsOn;
TH1F* fhNClustersITS[2];
TH1F* fhNClustersTPC[2];
TH1F* fhNSharedClustersTPC[2];
TH1F* fhNCrossedRowsTPC[2];
TH1F* fhRatioCrossedRowsOverFindableClustersTPC[2];
TH1F* fhChi2PerClusterITS[2];
TH1F* fhChi2PerClusterTPC[2];
TH1F* fhChi2TPCConstrainedVsGlobal[2];
TH1F* fhNClustersForITSPID[2];
TH1F* fhNMissingITSPoints[2];
TH1F* fhC11[2];
TH1F* fhC22[2];
TH1F* fhC33[2];
TH1F* fhC44[2];
TH1F* fhC55[2];
TH1F* fhRel1PtUncertainty[2];
TH1F* fhDXY[2];
TH1F* fhDZ[2];
TH1F* fhDXYDZ[2];
TH2F* fhDXYvsDZ[2];
TH1F* fhDXYNormalized[2];
TH1F* fhDZNormalized[2];
TH2F* fhDXYvsDZNormalized[2];
TH1F* fhNSigmaToVertex[2];
TH1F* fhPt[2];
TH1F* fhEta[2];
TF1* ffDTheoretical;
TH1F* fhCutStatistics;
TH2F* fhCutCorrelation;
TH2F* fhTOFdistance[2];
ClassDef(AliESDtrackCuts, 21)
};
#endif