#ifndef ALIHFECUTS_H
#define ALIHFECUTS_H
#ifndef ROOT_TNamed
#include <TNamed.h>
#endif
#ifndef ALIHFEEXTRACUTS_H
#include "AliHFEextraCuts.h"
#endif
class AliCFManager;
class AliESDtrack;
class AliMCEvent;
class AliMCParticle;
class AliVEvent;
class TObjArray;
class TList;
class AliHFEcuts : public TNamed{
public:
typedef enum{
kStepRecNoCut = 0,
kStepRecKineITSTPC = 1,
kStepRecPrim = 2,
kStepHFEcutsITS = 3,
kStepHFEcutsTOF = 4,
kStepHFEcutsTPC = 5,
kStepHFEcutsTRD = 6,
kNcutStepsRecTrack = 7
} RecoCutStep_t;
typedef enum{
kStepHFEcutsDca = 0,
kNcutStepsDETrack = 1
} DECutStep_t;
typedef enum{
kStepHFEcutsSecvtx = 0,
kNcutStepsSecvtxTrack = 1
} SecvtxCutStep_t;
typedef enum{
kStepMCGenerated = 0,
kStepMCGeneratedZOutNoPileUpCentralityFine = 1,
kStepMCGeneratedEventCut = 2,
kStepMCInAcceptance = 3,
kNcutStepsMCTrack = 4
} MCCutStep_t;
typedef enum{
kEventStepGenerated = 0,
kEventStepRecNoCut = 1,
kEventStepRecNoPileUp = 2,
kEventStepRecCentralityOk = 3,
kEventStepZRange = 4,
kEventStepReconstructed = 5,
kNcutStepsEvent = 6
} EventCutStep_t;
AliHFEcuts();
AliHFEcuts(const Char_t *name, const Char_t *title);
AliHFEcuts(const AliHFEcuts &c);
AliHFEcuts &operator=(const AliHFEcuts &c);
void Copy(TObject &o) const;
Long64_t Merge(const TCollection *list);
~AliHFEcuts();
void Initialize(AliCFManager *cfm);
void Initialize();
Bool_t CheckParticleCuts(UInt_t step, TObject *o);
Bool_t CheckEventCuts(const char*namestep, TObject *o);
void SetRecEvent(const AliVEvent *ev);
void SetMCEvent(const AliVEvent *ev);
TList *GetQAhistograms() const { return fHistQA; }
void SetQAOn() {SetBit(kDebugMode, kTRUE); };
void UnsetQA() {SetBit(kDebugMode, kFALSE); };
Bool_t IsQAOn() const { return TestBit(kDebugMode); };
void SetAOD() { SetBit(kAOD, kTRUE); }
void SetESD() { SetBit(kAOD, kFALSE); }
Bool_t IsAOD() const { return TestBit(kAOD); }
Bool_t IsESD() const { return !TestBit(kAOD); }
static const Char_t *MCCutName(UInt_t step){
if(step >= kNcutStepsMCTrack) return fgkUndefined;
return fgkMCCutName[step];
};
static const Char_t *RecoCutName(UInt_t step){
if(step >= kNcutStepsRecTrack) return fgkUndefined;
return fgkRecoCutName[step];
}
static const Char_t *DECutName(UInt_t step){
if(step >= kNcutStepsDETrack) return fgkUndefined;
return fgkDECutName[step];
}
static const Char_t *SecvtxCutName(UInt_t step){
if(step >= kNcutStepsSecvtxTrack) return fgkUndefined;
return fgkSecvtxCutName[step];
}
static const Char_t *EventCutName(UInt_t step){
if(step >= kNcutStepsEvent) return fgkUndefined;
return fgkEventCutName[step];
}
Bool_t IsRequireITSpixel() const { return TESTBIT(fRequirements, kITSPixel); };
Bool_t IsRequireITSdrift() const { return TESTBIT(fRequirements, kITSDrift); };
Bool_t IsRequireMaxImpactParam() const { return TESTBIT(fRequirements, kMaxImpactParam); };
Bool_t IsRequirePrimary() const { return TESTBIT(fRequirements, kPrimary); };
Bool_t IsRequireProdVertex() const { return TESTBIT(fRequirements, kProductionVertex); };
Bool_t IsRequireSigmaToVertex() const { return TESTBIT(fRequirements, kSigmaToVertex); };
Bool_t IsRequireDCAToVertex() const {return TESTBIT(fRequirements, kDCAToVertex); };
Bool_t IsRequireKineMCCuts() const {return TESTBIT(fRequirements, kKineMCCuts); };
Double_t GetVertexRange() const {return fVertexRangeZ; };
Int_t GetMinTrackletsTRD() const { return fMinTrackletsTRD; }
Bool_t GetUseMixedVertex() const { return fUseMixedVertex;};
inline void SetCutITSpixel(UChar_t cut);
inline void SetCutITSdrift(UChar_t cut);
void SetCheckITSLayerStatus(Bool_t checkITSLayerStatus) { fCheckITSLayerStatus = checkITSLayerStatus; }
void SetMinNClustersTPC(UChar_t minClustersTPC) { fMinClustersTPC = minClustersTPC; }
void SetMinNClustersTPCPID(UChar_t minClustersTPC) { fMinClustersTPCPID = minClustersTPC; }
void SetMinNClustersITS(UChar_t minClustersITS) { fMinClustersITS = minClustersITS; }
void SetMinNTrackletsTRD(UChar_t minNtrackletsTRD, Bool_t exact = kFALSE) { fMinTrackletsTRD = minNtrackletsTRD; fTRDtrackletsExact = exact; }
void SetMaxChi2perTrackletTRD(Float_t maxchi2trackletTRD) { fMaxChi2TRD = maxchi2trackletTRD; }
void SetMaxChi2perClusterITS(Double_t chi2) { fMaxChi2clusterITS = chi2; };
void SetMaxChi2perClusterTPC(Double_t chi2) { fMaxChi2clusterTPC = chi2; };
inline void SetMaxImpactParam(Double_t radial, Double_t z);
inline void SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma, Bool_t isIPcharge , Bool_t isopp);
void SetMinRatioTPCclusters(Double_t minRatioTPC) { fMinClusterRatioTPC = minRatioTPC; };
void SetPtRange(Double_t ptmin, Double_t ptmax){fPtRange[0] = ptmin; fPtRange[1] = ptmax;};
void SetTOFsignaldxz(Double_t tofsignaldx, Double_t tofsignaldz){fTOFsignaldx = tofsignaldx; fTOFsignaldz = tofsignaldz;};
void SetAODFilterBit(Int_t bit) { fAODFilterBit = bit; };
inline void SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax);
void SetProductionVertexZ(Double_t zmin, Double_t zmax) { fProdVtxZ[0] = zmin; fProdVtxZ[1] = zmax; }
inline void SetSigmaToVertex(Double_t sig);
inline void SetSigmaToVertexXY(Double_t sig);
inline void SetSigmaToVertexZ(Double_t sig);
void SetTPCmodes(UChar_t clusterDef, UChar_t ratioDef) {
fTPCclusterDef= clusterDef;
fTPCratioDef = ratioDef;
}
void SetEtaRange(Double_t etaRange){fEtaRange[0] = -etaRange; fEtaRange[1] = etaRange;};
void SetEtaRange(Double_t etamin, Double_t etamax){fEtaRange[0] = etamin; fEtaRange[1] = etamax;};
void SetPhiRange(Double_t phimin, Double_t phimax){fPhiRange[0] = phimin; fPhiRange[1] = phimax;};
void SetVertexRange(Double_t zrange){fVertexRangeZ = zrange;};
void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};
void SetTOFMISMATCHStep(Bool_t tofMismatchStep) {fTOFMISMATCHStep = tofMismatchStep;};
void SetMatchTOFLabel(Bool_t match) { fMatchTOFLabel = match; }
void SetTPCPIDCleanUpStep(Bool_t tpcPIDCleanUpStep) {fTPCPIDCLEANUPStep = tpcPIDCleanUpStep;};
void SetITSpatternCut() { fITSpatternCut = kTRUE; }
inline void SetUseMixedVertex(Bool_t useMixedVertex);
inline void SetUseSPDVertex(Bool_t useSPDVertex);
void SetUseCorrelationVertex() { fUseCorrelationVertex = kTRUE;};
void SetSPDVtxResolutionCut() {fSPDVtxResolution = kTRUE;}
void SetpApileupCut() { fPApileupCut = kTRUE; }
void SetFractionOfSharedTPCClusters(Double_t fractionOfSharedTPCClusters) {fFractionOfSharedTPCClusters = fractionOfSharedTPCClusters;};
void SetMaxImpactParameterRpar(Bool_t maxImpactParameterRpar) { fMaxImpactParameterRpar = maxImpactParameterRpar; };
inline void CreateStandardCuts();
void SetAdditionalStatusRequirement(Long_t requirement) {fAdditionalStatusRequirement = requirement;}
void SetRequireDCAToVertex() { SETBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); };
void SetRequireIsPrimary() { SETBIT(fRequirements, kPrimary); };
void SetRequireITSPixel() { SETBIT(fRequirements, kITSPixel); }
void SetRequireITSDrift() { SETBIT(fRequirements, kITSDrift); }
void UnsetRequireITSPixel() { CLRBIT(fRequirements, kITSPixel); }
void SetRequireProdVertex() { SETBIT(fRequirements, kProductionVertex); };
void SetRequireSigmaToVertex() { SETBIT(fRequirements, kSigmaToVertex); CLRBIT(fRequirements, kDCAToVertex); };
void UnsetVertexRequirement() { CLRBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); }
void SetRequireKineMCCuts() { SETBIT(fRequirements, kKineMCCuts); };
void SetRejectKinkDaughters() { fRejectKinkDaughters = kTRUE; }
void SetAcceptKinkDaughters() { fRejectKinkDaughters = kFALSE; }
void SetRejectKinkMothers() { fRejectKinkMothers = kTRUE; }
void SetAcceptKinkMothers() { fRejectKinkMothers = kFALSE; }
void SetDebugLevel(Int_t level) { fDebugLevel = level; };
Int_t GetDebugLevel() const { return fDebugLevel; };
private:
enum{
kDebugMode = BIT(14),
kAOD = BIT(15)
};
typedef enum{
kPrimary = 0,
kProductionVertex = 1,
kSigmaToVertex = 2,
kDCAToVertex = 3,
kITSPixel = 4,
kMaxImpactParam = 5,
kKineMCCuts = 6,
kITSDrift = 7
} Require_t;
void SetParticleGenCutList();
void SetAcceptanceCutList();
void SetRecKineITSTPCCutList();
void SetRecPrimaryCutList();
void SetHFElectronITSCuts();
void SetHFElectronTOFCuts();
void SetHFElectronTPCCuts();
void SetHFElectronTRDCuts();
void SetHFElectronDcaCuts();
void SetEventCutList(Int_t istep);
static const Char_t* fgkMCCutName[kNcutStepsMCTrack];
static const Char_t* fgkRecoCutName[kNcutStepsRecTrack];
static const Char_t* fgkDECutName[kNcutStepsDETrack];
static const Char_t* fgkSecvtxCutName[kNcutStepsSecvtxTrack];
static const Char_t* fgkEventCutName[kNcutStepsEvent];
static const Char_t* fgkUndefined;
ULong64_t fRequirements;
UChar_t fTPCclusterDef;
UChar_t fTPCratioDef;
Double_t fEtaRange[2];
Double_t fPhiRange[2];
Double_t fDCAtoVtx[2];
Double_t fProdVtx[4];
Double_t fProdVtxZ[2];
Double_t fPtRange[2];
UChar_t fMinClustersTPC;
UChar_t fMinClustersTPCPID;
UChar_t fMinClustersITS;
UChar_t fMinTrackletsTRD;
Float_t fMaxChi2TRD;
UChar_t fCutITSPixel;
Bool_t fCheckITSLayerStatus;
UChar_t fCutITSDrift;
Double_t fMaxChi2clusterITS;
Double_t fMaxChi2clusterTPC;
Double_t fMinClusterRatioTPC;
Double_t fSigmaToVtx[3];
Double_t fVertexRangeZ;
Bool_t fTRDtrackletsExact;
Bool_t fTOFPIDStep;
Bool_t fMatchTOFLabel;
Bool_t fTOFMISMATCHStep;
Bool_t fTPCPIDCLEANUPStep;
Bool_t fITSpatternCut;
Bool_t fUseMixedVertex;
Bool_t fUseSPDVertex;
Bool_t fUseCorrelationVertex;
Bool_t fSPDVtxResolution;
Bool_t fPApileupCut;
Float_t fIPCutParams[4];
Bool_t fIsIPSigmacut;
Bool_t fIsIPcharge;
Bool_t fIsIPOpp;
Double_t fFractionOfSharedTPCClusters;
Bool_t fMaxImpactParameterRpar;
Long_t fAdditionalStatusRequirement;
Double_t fTOFsignaldx;
Double_t fTOFsignaldz;
Int_t fAODFilterBit;
Bool_t fRejectKinkDaughters;
Bool_t fRejectKinkMothers;
TList *fHistQA;
TObjArray *fCutList;
Int_t fDebugLevel;
ClassDef(AliHFEcuts, 6)
};
void AliHFEcuts::SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax){
SetRequireProdVertex();
fProdVtx[0] = xmin;
fProdVtx[1] = xmax;
fProdVtx[2] = ymin;
fProdVtx[3] = ymax;
}
void AliHFEcuts::SetSigmaToVertex(Double_t sig){
SetRequireSigmaToVertex();
fSigmaToVtx[0] = sig;
}
void AliHFEcuts::SetSigmaToVertexXY(Double_t sig){
SetRequireSigmaToVertex();
fSigmaToVtx[1] = sig;
}
void AliHFEcuts::SetSigmaToVertexZ(Double_t sig){
SetRequireSigmaToVertex();
fSigmaToVtx[2] = sig;
}
void AliHFEcuts::SetMaxImpactParam(Double_t radial, Double_t z){
SetRequireDCAToVertex();
fDCAtoVtx[0] = radial;
fDCAtoVtx[1] = z;
}
void AliHFEcuts::SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma, Bool_t isIPcharge, Bool_t isopp){
fIPCutParams[0] = p0;
fIPCutParams[1] = p1;
fIPCutParams[2] = p2;
fIPCutParams[3] = p3;
fIsIPSigmacut = isipsigma;
fIsIPcharge = isIPcharge;
fIsIPOpp = isopp;
}
void AliHFEcuts::SetCutITSpixel(UChar_t cut){
SetRequireITSPixel();
fCutITSPixel = cut;
}
void AliHFEcuts::SetCutITSdrift(UChar_t cut){
SetRequireITSDrift();
fCutITSDrift = cut;
}
void AliHFEcuts::SetUseMixedVertex(Bool_t useMixedVertex){
fUseMixedVertex = useMixedVertex;
if(useMixedVertex) fUseSPDVertex = kFALSE;
}
void AliHFEcuts::SetUseSPDVertex(Bool_t useSPDVertex){
fUseSPDVertex = useSPDVertex;
if(useSPDVertex) fUseMixedVertex = kFALSE;
}
void AliHFEcuts::CreateStandardCuts(){
SetRequireProdVertex();
fProdVtx[0] = 0;
fProdVtx[1] = 3;
fProdVtx[2] = 0;
fProdVtx[3] = 3;
fProdVtxZ[0] = -15;
fProdVtxZ[1] = 15;
fMinClustersTPC = 80;
fMinClustersITS = 4;
fMinTrackletsTRD = 0;
SetRequireITSPixel();
fCutITSPixel = AliHFEextraCuts::kFirst;
fMaxChi2clusterITS = -1.;
fMaxChi2clusterTPC = 4.;
fMinClusterRatioTPC = 0.6;
fPtRange[0] = 0.1;
fPtRange[1] = 100.;
fRejectKinkDaughters = kTRUE;
fRejectKinkMothers = kTRUE;
SetRequireKineMCCuts();
}
#endif