#ifndef ALIFLOWEVENTCUTS_H
#define ALIFLOWEVENTCUTS_H
#include <float.h>
#include <limits.h>
#include "TNamed.h"
class AliVEvent;
class AliMCEvent;
class TBrowser;
#include "TList.h"
#include "TH1.h"
#include "AliTriggerAnalysis.h"
#include "AliFlowTrackCuts.h"
#include "AliFlowEventSimpleCuts.h"
class AliFlowEventCuts : public AliFlowEventSimpleCuts {
public:
enum refMultMethod { kTPConly, kSPDtracklets, kVZERO, kV0=kVZERO, kSPD1clusters };
AliFlowEventCuts();
AliFlowEventCuts(const char* name, const char* title = "AliFlowEventCuts");
AliFlowEventCuts(const AliFlowEventCuts& someCuts);
AliFlowEventCuts& operator=(const AliFlowEventCuts& someCuts);
virtual ~AliFlowEventCuts();
virtual Bool_t IsSelected(TObject* obj, TObject *objmc);
Bool_t PassesCuts(AliVEvent* event, AliMCEvent *mcevent);
static AliFlowEventCuts* StandardCuts();
void SetNumberOfTracksMax(Int_t value) {fNumberOfTracksMax=value;fCutNumberOfTracks=kTRUE;}
void SetNumberOfTracksMin(Int_t value) {fNumberOfTracksMin=value;fCutNumberOfTracks=kTRUE;}
void SetNumberOfTracksRange(Int_t min, Int_t max) {fNumberOfTracksMin=min;fNumberOfTracksMax=max;fCutNumberOfTracks=kTRUE;}
void SetRefMultMax(Int_t value) {fRefMultMax=value;fCutRefMult=kTRUE;}
void SetRefMultMin(Int_t value) {fRefMultMin=value;fCutRefMult=kTRUE;}
void SetRefMultRange(Int_t min, Int_t max) {fRefMultMin=min;fRefMultMax=max;fCutRefMult=kTRUE;}
void SetImpactParameterMax(Double_t value) {fImpactParameterMax=value;fCutImpactParameter=kTRUE;}
void SetImpactParameterMin(Double_t value) {fImpactParameterMin=value;fCutImpactParameter=kTRUE;}
void SetImpactParameterRange(Double_t min, Double_t max) {fImpactParameterMin=min;fImpactParameterMax=max;fCutImpactParameter=kTRUE;}
void SetPrimaryVertexXrange(Double_t min, Double_t max)
{fCutPrimaryVertexX=kTRUE; fPrimaryVertexXmin=min; fPrimaryVertexXmax=max;}
void SetPrimaryVertexYrange(Double_t min, Double_t max)
{fCutPrimaryVertexY=kTRUE; fPrimaryVertexYmin=min; fPrimaryVertexYmax=max;}
void SetPrimaryVertexZrange(Double_t min, Double_t max)
{fCutPrimaryVertexZ=kTRUE; fPrimaryVertexZmin=min; fPrimaryVertexZmax=max;}
void SetNContributorsRange(Int_t min, Int_t max=INT_MAX)
{fCutNContributors=kTRUE; fNContributorsMin=min; fNContributorsMax=max;}
void SetMeanPtRange(Double_t min, Double_t max) {fCutMeanPt=kTRUE; fMeanPtMax=max; fMeanPtMin=min;}
void SetCutSPDvertexerAnomaly(Bool_t b=kTRUE) {fCutSPDvertexerAnomaly=b;}
void SetCutZDCtiming(Bool_t c=kTRUE) {fCutZDCtiming=c;}
void SetCutSPDTRKVtxZ(Bool_t b=kTRUE) {fCutSPDTRKVtxZ=b;}
void SetCutTPCmultiplicityOutliers(Bool_t b=kTRUE) {fCutTPCmultiplicityOutliers=b;}
void SetCutTPCmultiplicityOutliersAOD(Bool_t b=kTRUE) {fCutTPCmultiplicityOutliersAOD=b;}
Int_t GetNumberOfTracksMax() const {return fNumberOfTracksMax;}
Int_t GetNumberOfTracksMin() const {return fNumberOfTracksMin;}
Int_t GetRefMultMax() const {return fRefMultMax;}
Int_t GetRefMultMin() const {return fRefMultMin;}
void SetRefMultMethod(refMultMethod m) {fRefMultMethod=m;}
void SetRefMultMethod(AliESDtrackCuts::MultEstTrackType m) { fRefMultMethodAliESDtrackCuts=m;
fUseAliESDtrackCutsRefMult=kTRUE; }
refMultMethod GetRefMultMethod() const {return fRefMultMethod;}
void SetRefMultCuts( AliFlowTrackCuts* cuts ) {fRefMultCuts=static_cast<AliFlowTrackCuts*>(cuts->Clone());}
void SetMeanPtCuts( AliFlowTrackCuts* cuts ) {fMeanPtCuts=static_cast<AliFlowTrackCuts*>(cuts->Clone());}
AliFlowTrackCuts* GetRefMultCuts() const {return fRefMultCuts;}
void DefineHistograms();
void SetQA(Bool_t b=kTRUE) {if (b) DefineHistograms();}
TList* GetQA() const {return fQA;}
TH1* QAbefore(Int_t i) {return static_cast<TH1*>(static_cast<TList*>(fQA->At(0))->At(i));}
TH1* QAafter(Int_t i) {return static_cast<TH1*>(static_cast<TList*>(fQA->At(1))->At(i));}
Int_t RefMult(AliVEvent* event, AliMCEvent *mcEvent = 0x0);
Int_t GetReferenceMultiplicity(AliVEvent* event, AliMCEvent *mcEvent) {return RefMult(event,mcEvent);}
const char* CentrMethName(refMultMethod method) const;
void SetCentralityPercentileMethod( refMultMethod m) {fCentralityPercentileMethod=m;}
void SetUseCentralityUnchecked(Bool_t b=kTRUE) {fUseCentralityUnchecked=b;}
Float_t GetCentrality(AliVEvent* event, AliMCEvent* mcEvent);
void SetUsedDataset(Bool_t b=kTRUE) {fData2011=b;}
void SetLHC10h(Bool_t b=kTRUE) {fData2011=(!b);}
void SetLHC11h(Bool_t b=kTRUE) {fData2011=b;}
void Browse(TBrowser* b);
Long64_t Merge(TCollection* list);
TH2F *GetCorrelationTPCvsGlobalMultiplicity() {return fhistTPCvsGlobalMult;}
private:
TList* fQA;
Bool_t fCutNumberOfTracks;
Int_t fNumberOfTracksMax;
Int_t fNumberOfTracksMin;
Bool_t fCutRefMult;
refMultMethod fRefMultMethod;
Bool_t fUseAliESDtrackCutsRefMult;
AliESDtrackCuts::MultEstTrackType fRefMultMethodAliESDtrackCuts;
Int_t fRefMultMax;
Int_t fRefMultMin;
AliFlowTrackCuts* fRefMultCuts;
AliFlowTrackCuts* fMeanPtCuts;
AliFlowTrackCuts* fStandardTPCcuts;
AliFlowTrackCuts* fStandardGlobalCuts;
Bool_t fCutPrimaryVertexX;
Double_t fPrimaryVertexXmax;
Double_t fPrimaryVertexXmin;
Bool_t fCutPrimaryVertexY;
Double_t fPrimaryVertexYmax;
Double_t fPrimaryVertexYmin;
Bool_t fCutPrimaryVertexZ;
Double_t fPrimaryVertexZmax;
Double_t fPrimaryVertexZmin;
Bool_t fCutNContributors;
Int_t fNContributorsMax;
Int_t fNContributorsMin;
Bool_t fCutMeanPt;
Double_t fMeanPtMax;
Double_t fMeanPtMin;
Bool_t fCutSPDvertexerAnomaly;
Bool_t fCutSPDTRKVtxZ;
Bool_t fCutTPCmultiplicityOutliers;
Bool_t fCutTPCmultiplicityOutliersAOD;
Bool_t fUseCentralityUnchecked;
refMultMethod fCentralityPercentileMethod;
Bool_t fCutZDCtiming;
AliTriggerAnalysis fTrigAna;
Bool_t fCutImpactParameter;
Double_t fImpactParameterMin;
Double_t fImpactParameterMax;
TH2F *fhistTPCvsGlobalMult;
Bool_t fData2011;
ClassDef(AliFlowEventCuts,6)
};
#endif