#ifndef ALIHFEEXTRACUTS_H
#define ALIHFEEXTRACUTS_H
#include "AliCFCutBase.h"
#ifndef ROOT_TArrayI
#include <TArrayI.h>
#endif
class TList;
class AliVEvent;
class AliVParticle;
class AliVTrack;
class AliVVertex;
class AliAODVertex;
class AliAODEvent;
class AliESDEvent;
class AliHFEextraCuts: public AliCFCutBase{
public:
typedef enum{
kFirst = 0,
kSecond = 1,
kBoth = 2,
kNone = 3,
kAny = 4,
kExclusiveSecond = 5
} ITSPixel_t;
typedef enum{
kFirstD = 0
} ITSDrift_t;
typedef enum{
kFound = 0,
kFoundIter1 = 1,
kCrossedRows = 2,
kFoundAll = 3
} ETPCclusterDef_t;
typedef enum{
kFoundOverFindable = 0,
kFoundOverFindableIter1 = 1,
kFoundOverCR = 2,
kCROverFindable = 3,
kFoundAllOverFindable = 4,
} ETPCclrDef_t;
AliHFEextraCuts(const Char_t *name, const Char_t *title);
AliHFEextraCuts(const AliHFEextraCuts &c);
AliHFEextraCuts &operator=(const AliHFEextraCuts &c);
virtual ~AliHFEextraCuts();
virtual Bool_t IsSelected(TObject *o);
virtual Bool_t IsSelected(TList *) { return kTRUE; };
virtual void SetRecEventInfo(const TObject *event);
inline void SetClusterRatioTPC(Double_t ratio, ETPCclrDef_t def);
inline void SetRequireITSpixel(ITSPixel_t pixel);
inline void SetRequireITSdrift(ITSDrift_t drift);
inline void SetMinImpactParamR(Double_t impactParam);
inline void SetMaxImpactParamR(Double_t impactParam);
inline void SetMinImpactParamZ(Double_t impactParam);
inline void SetMaxImpactParamZ(Double_t impactParam);
inline void SetMinHFEImpactParamR(Float_t ipcutParam[4], Bool_t issigmacut, Bool_t isipcharge, Bool_t isopp);
inline void SetMinTrackletsTRD(Int_t minTracklets, Bool_t exact = kFALSE);
inline void SetMaxChi2TRD(Float_t maxchi2);
inline void SetMinNClustersTPC(Int_t minclusters, ETPCclusterDef_t def);
void SetMinNClustersTPCPID(Int_t minclusters) { SETBIT(fRequirements, kMinNClustersTPCPID); fMinNClustersTPCPID = minclusters; }
void SetTOFPID(Bool_t tofPid) { tofPid ? SETBIT(fRequirements, kTOFPID) : CLRBIT(fRequirements, kTOFPID); }
void SetTOFMISMATCH(Bool_t tofMismatch) { tofMismatch ? SETBIT(fRequirements, kTOFmismatch) : CLRBIT(fRequirements, kTOFmismatch); }
void SetMatchTOFLabel(Bool_t match) {match ? SETBIT(fRequirements, kTOFlabel) : CLRBIT(fRequirements, kTOFlabel); }
void SetTPCPIDCleanUp(Bool_t tpcPIDCleanUp) { tpcPIDCleanUp ? SETBIT(fRequirements, kTPCPIDCleanUp) : CLRBIT(fRequirements, kTPCPIDCleanUp); }
void SetMaxImpactParameterRpar(Bool_t maxImpactParameterRpar) { maxImpactParameterRpar ? SETBIT(fRequirements, kMaxImpactParameterRpar) : CLRBIT(fRequirements, kMaxImpactParameterRpar); }
void SetFractionOfTPCSharedClusters(Double_t fractionShared) { fFractionTPCShared= fractionShared; SETBIT(fRequirements, kTPCfractionShared); }
void SetMinNbITScls(UChar_t minNbITScls) { fMinNbITScls = minNbITScls; SETBIT(fRequirements, kMinNbITScls); }
void SetTOFsignalDxz(Double_t tofsignalDx,Double_t tofsignalDz) { fTOFsignalDx=tofsignalDx; fTOFsignalDz=tofsignalDz; SETBIT(fRequirements, kTOFsignalDxy); }
void SetRejectKinkDaughter() { SETBIT(fRequirements, kRejectKinkDaughter);};
void SetRejectKinkMother() { SETBIT(fRequirements, kRejectKinkMother);};
void SetAODFilterBit(Int_t bit) {fAODFilterBit = bit; SETBIT(fRequirements, kAODFilterBit);};
void SetCheckITSstatus(Bool_t check) { fCheck = check; };
void SetITSpatternCut() { SETBIT(fRequirements, kITSpattern); }
void SetDebugLevel(Int_t level) { fDebugLevel = level; };
Bool_t GetCheckITSstatus() const { return fCheck; };
Int_t GetDebugLevel() const { return fDebugLevel; };
void GetHFEImpactParameters(const AliVTrack * const track, Double_t &dcaxy, Double_t &dcansigmaxy);
void GetHFEImpactParameters(const AliVTrack * const track, Double_t dcaD[2], Double_t covD[3]);
void GetImpactParameters(AliVTrack *track, Float_t &radial, Float_t &z);
const AliVVertex* RemoveDaughtersFromPrimaryVtx(const AliESDEvent * const esdevent, const AliVTrack * const track);
AliAODVertex* RemoveDaughtersFromPrimaryVtx(const AliAODEvent * const aod, const AliVTrack * const track);
Int_t GetITSstatus(const AliVTrack * const track, Int_t layer) const;
Bool_t CheckITSstatus(Int_t itsStatus) const;
Bool_t CheckITSpattern(const AliVTrack *const track) const;
Bool_t IsKinkDaughter(AliVTrack *track);
Bool_t IsKinkMother(AliVTrack *track);
void UnSetRejectKinkDaughter() { CLRBIT(fRequirements, kRejectKinkDaughter);};
void UnSetRejectKinkMother() { CLRBIT(fRequirements, kRejectKinkMother);};
protected:
virtual void AddQAHistograms(TList *qaList);
Bool_t CheckRecCuts(AliVTrack *track);
Bool_t CheckMCCuts(AliVParticle * ) const;
void FillQAhistosRec(AliVTrack *track, UInt_t when);
void FillCutCorrelation(ULong64_t survivedCut);
void PrintBitMap(Int_t bitmap);
UInt_t GetTPCncls(AliVTrack *track);
Bool_t GetTPCCountSharedMapBitsAboveThreshold(AliVTrack *track);
Double_t GetTPCclusterRatio(AliVTrack *track);
void GetHFEImpactParameterCuts(const AliVTrack * const track, Double_t &hfeimpactRcut, Double_t &hfeimpactnsigmaRcut);
void GetMaxImpactParameterCutR(const AliVTrack * const track, Double_t &maximpactRcut);
void GetTOFsignalDxDz(const AliVTrack * const track, Double_t &tofsignalDx, Double_t &tofsignalDz);
Float_t GetTPCsharedClustersRatio(AliVTrack *track);
Float_t GetTRDchi(AliVTrack *track);
Int_t GetITSNbOfcls(AliVTrack *track);
Bool_t MatchTOFlabel(const AliVTrack * const track) const;
private:
typedef enum{
kMinImpactParamR = 0,
kMaxImpactParamR = 1,
kMinImpactParamZ = 2,
kMaxImpactParamZ = 3,
kClusterRatioTPC = 4,
kMinTrackletsTRD = 5,
kPixelITS = 6,
kMinHFEImpactParamR = 7,
kMinHFEImpactParamNsigmaR = 8,
kMinNClustersTPC = 9,
kMinNClustersTPCPID = 10,
kTPCfractionShared = 11,
kTOFPID = 12,
kTOFmismatch = 13,
kTPCPIDCleanUp = 14,
kEMCALmatch = 15,
kMaxImpactParameterRpar = 16,
kMinNbITScls = 17,
kRejectKinkDaughter = 18,
kRejectKinkMother = 19,
kDriftITS = 20,
kTOFsignalDxy = 21,
kMaxTRDChi2 = 22,
kITSpattern = 23,
kMinHFEImpactParamRcharge = 24,
kAODFilterBit=25,
kTOFlabel=26,
kNcuts = 27
} Cut_t;
enum{
kBeforeCuts =0,
kAfterCuts = 1
};
static const Int_t fgkNQAhistos;
AliVEvent *fEvent;
ULong64_t fCutCorrelation;
ULong64_t fRequirements;
Float_t fImpactParamCut[4];
Float_t fIPcutParam[4];
UInt_t fMinNClustersTPC;
UInt_t fMinNClustersTPCPID;
Float_t fClusterRatioTPC;
UChar_t fMinTrackletsTRD;
Float_t fMaxChi2TRD;
UChar_t fMinNbITScls;
Bool_t fTRDtrackletsExact;
UChar_t fPixelITS;
UChar_t fDriftITS;
UChar_t fTPCclusterDef;
UChar_t fTPCclusterRatioDef;
Double_t fFractionTPCShared;
Bool_t fOppSideIPcut;
Double_t fTOFsignalDx;
Double_t fTOFsignalDz;
Double_t fMagField;
Int_t fAODFilterBit;
TArrayI fListKinkMothers;
Int_t fNumberKinkMothers;
Bool_t fCheck;
TList *fQAlist;
Int_t fDebugLevel;
ClassDef(AliHFEextraCuts, 5)
};
void AliHFEextraCuts::SetClusterRatioTPC(Double_t ratio, ETPCclrDef_t def) {
SETBIT(fRequirements, kClusterRatioTPC);
SETBIT(fTPCclusterRatioDef, def);
fClusterRatioTPC = ratio;
}
void AliHFEextraCuts::SetRequireITSpixel(ITSPixel_t pixel) {
SETBIT(fRequirements, kPixelITS);
fPixelITS = pixel;
}
void AliHFEextraCuts::SetRequireITSdrift(ITSDrift_t drift) {
SETBIT(fRequirements, kDriftITS);
fDriftITS = drift;
}
void AliHFEextraCuts::SetMinImpactParamR(Double_t impactParam){
SETBIT(fRequirements, kMinImpactParamR);
fImpactParamCut[0] = impactParam;
}
void AliHFEextraCuts::SetMaxImpactParamR(Double_t impactParam){
SETBIT(fRequirements, kMaxImpactParamR);
fImpactParamCut[2] = impactParam;
}
void AliHFEextraCuts::SetMinImpactParamZ(Double_t impactParam){
SETBIT(fRequirements, kMinImpactParamZ);
fImpactParamCut[1] = impactParam;
}
void AliHFEextraCuts::SetMaxImpactParamZ(Double_t impactParam){
SETBIT(fRequirements, kMaxImpactParamZ);
fImpactParamCut[3] = impactParam;
}
void AliHFEextraCuts::SetMinHFEImpactParamR(Float_t ipcutParam[4], Bool_t isSigmacut, Bool_t isIPcharge, Bool_t isopp){
if(isSigmacut){ SETBIT(fRequirements, kMinHFEImpactParamNsigmaR);}
else{
if(isIPcharge){ SETBIT(fRequirements, kMinHFEImpactParamRcharge);}
else {SETBIT(fRequirements, kMinHFEImpactParamR);}
fIPcutParam[0]=ipcutParam[0];
fIPcutParam[1]=ipcutParam[1];
fIPcutParam[2]=ipcutParam[2];
fIPcutParam[3]=ipcutParam[3];
fOppSideIPcut = isopp;
}
}
void AliHFEextraCuts::SetMinTrackletsTRD(Int_t minTracklets, Bool_t exact){
SETBIT(fRequirements, kMinTrackletsTRD);
fMinTrackletsTRD = minTracklets;
fTRDtrackletsExact = exact;
}
void AliHFEextraCuts::SetMaxChi2TRD(Float_t maxchi2){
SETBIT(fRequirements, kMaxTRDChi2);
fMaxChi2TRD = maxchi2;
}
void AliHFEextraCuts::SetMinNClustersTPC(Int_t minClusters, ETPCclusterDef_t tpcdef){
SETBIT(fRequirements, kMinNClustersTPC);
SETBIT(fTPCclusterDef, tpcdef);
fMinNClustersTPC = minClusters;
}
#endif