#include "AliInputEventHandler.h"
#include "AliPIDResponse.h"
#include "TRandom.h"
+#include <TF1.h>
using std::cout;
using std::endl;
fRemoveTrackletOutliers(kFALSE),
fCutOnzVertexSPD(0),
fKinkReject(kFALSE),
- fUseTrackSelectionWithFilterBits(kTRUE),
- fUseCentrFlatteningInMC(kFALSE),
- fHistCentrDistr(0x0)
+fUseTrackSelectionWithFilterBits(kTRUE),
+fUseCentrFlatteningInMC(kFALSE),
+fHistCentrDistr(0x0),
+fCutRatioClsOverCrossRowsTPC(0),
+fCutRatioSignalNOverCrossRowsTPC(0),
+fCutMinCrossedRowsTPCPtDep(""),
+f1CutMinNCrossedRowsTPCPtDep(0x0)
{
//
// Default Constructor
fKinkReject(source.fKinkReject),
fUseTrackSelectionWithFilterBits(source.fUseTrackSelectionWithFilterBits),
fUseCentrFlatteningInMC(source.fUseCentrFlatteningInMC),
- fHistCentrDistr(0x0)
+ fHistCentrDistr(0x0),
+ fCutRatioClsOverCrossRowsTPC(source.fCutRatioClsOverCrossRowsTPC),
+ fCutRatioSignalNOverCrossRowsTPC(source.fCutRatioSignalNOverCrossRowsTPC),
+ f1CutMinNCrossedRowsTPCPtDep(0x0)
+
+
{
//
// Copy constructor
if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
if(source.fPidHF) SetPidHF(source.fPidHF);
if(source.fHistCentrDistr) fHistCentrDistr=(TH1F*)(source.fHistCentrDistr->Clone());
+ if(source.fCutMinCrossedRowsTPCPtDep) fCutMinCrossedRowsTPCPtDep=source.fCutMinCrossedRowsTPCPtDep;
+ if(source.f1CutMinNCrossedRowsTPCPtDep) f1CutMinNCrossedRowsTPCPtDep=new TFormula(*(source.f1CutMinNCrossedRowsTPCPtDep));
PrintAll();
}
if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
+
+ if(fCutMinCrossedRowsTPCPtDep) fCutMinCrossedRowsTPCPtDep=source.fCutMinCrossedRowsTPCPtDep;
+ if(f1CutMinNCrossedRowsTPCPtDep) delete f1CutMinNCrossedRowsTPCPtDep;
+ if(source.f1CutMinNCrossedRowsTPCPtDep) f1CutMinNCrossedRowsTPCPtDep=new TFormula(*(source.f1CutMinNCrossedRowsTPCPtDep));
+ fCutRatioClsOverCrossRowsTPC=source.fCutRatioClsOverCrossRowsTPC;
+ fCutRatioSignalNOverCrossRowsTPC=source.fCutRatioSignalNOverCrossRowsTPC;
PrintAll();
return *this;
fPidHF=0;
}
if(fHistCentrDistr)delete fHistCentrDistr;
+
+ if(f1CutMinNCrossedRowsTPCPtDep) {
+ delete f1CutMinNCrossedRowsTPCPtDep;
+ f1CutMinNCrossedRowsTPCPtDep = 0;
+ }
+
}
//---------------------------------------------------------------------------
Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
return accept;
}
//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
+Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const{
//
// Daughter tracks selection
//
return retval;
}
//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
+Bool_t AliRDHFCuts::CheckPtDepCrossedRows(TString rows,Bool_t print) const {
+ //
+ // Check the correctness of the string syntax
+ //
+ Bool_t retval=kTRUE;
+
+ if(!rows.Contains("pt")) {
+ if(print) AliError("string must contain \"pt\"");
+ retval= kFALSE;
+ }
+ return retval;
+}
+//---------------------------------------------------------------------------
+void AliRDHFCuts::SetMinCrossedRowsTPCPtDep(const char *rows){
+ //
+ //Create the TFormula from TString for TPC crossed rows pT dependent cut
+ //
+
+
+ // setting data member that describes the TPC crossed rows pT dependent cut
+ fCutMinCrossedRowsTPCPtDep = rows;
+
+ // creating TFormula from TString
+ if(f1CutMinNCrossedRowsTPCPtDep){
+ delete f1CutMinNCrossedRowsTPCPtDep;
+ // resetting TFormula
+ f1CutMinNCrossedRowsTPCPtDep = 0;
+ }
+ if(!CheckPtDepCrossedRows(rows,kTRUE))return;
+
+ TString tmp(rows);
+ tmp.ReplaceAll("pt","x");
+ f1CutMinNCrossedRowsTPCPtDep = new TFormula("f1CutMinNCrossedRowsTPCPtDep",tmp.Data());
+
+
+}
+//---------------------------------------------------------------------------
+Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const{
//
// Convert to ESDtrack, relate to vertex and check cuts
//
if(cuts->GetFlagCutTOFdistance()) cuts->SetFlagCutTOFdistance(kFALSE);
- Bool_t retval=kTRUE;
// convert to ESD track here
AliESDtrack esdTrack(track);
esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
esdTrack.SetTPCPointsF(track->GetTPCNclsF());
// needed to calculate the impact parameters
- esdTrack.RelateToVertex(primary,0.,3.);
-
- if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
+ esdTrack.RelateToVertex(primary,0.,3.);
+ //applying ESDtrackCut
+ if(!cuts->IsSelected(&esdTrack)) return kFALSE;
+ //appliyng kink rejection
if(fKinkReject){
AliAODVertex *maybeKink=track->GetProdVertex();
- if(maybeKink->GetType()==AliAODVertex::kKink) retval=kFALSE;
+ if(maybeKink->GetType()==AliAODVertex::kKink) return kFALSE;
+ }
+
+ //appliyng TPC crossed rows pT dependent cut
+ if(f1CutMinNCrossedRowsTPCPtDep){
+ Float_t nCrossedRowsTPC = esdTrack.GetTPCCrossedRows();
+ if(nCrossedRowsTPC<f1CutMinNCrossedRowsTPCPtDep->Eval(esdTrack.Pt())) return kFALSE;
}
+
+ //appliyng NTPCcls/NTPCcrossedRows cut
+ if(fCutRatioClsOverCrossRowsTPC){
+ Float_t nCrossedRowsTPC = esdTrack.GetTPCCrossedRows();
+ Float_t nClustersTPC = esdTrack.GetTPCNcls();
+ if(nCrossedRowsTPC!=0){
+ Float_t ratio = nClustersTPC/nCrossedRowsTPC;
+ if(ratio<fCutRatioClsOverCrossRowsTPC) return kFALSE;
+ }
+ else return kFALSE;
+ }
+
+ //appliyng TPCsignalN/NTPCcrossedRows cut
+ if(fCutRatioSignalNOverCrossRowsTPC){
+ Float_t nCrossedRowsTPC = esdTrack.GetTPCCrossedRows();
+ Float_t nTPCsignal = esdTrack.GetTPCsignalN();
+ if(nCrossedRowsTPC!=0){
+ Float_t ratio = nTPCsignal/nCrossedRowsTPC;
+ if(ratio<fCutRatioSignalNOverCrossRowsTPC) return kFALSE;
+ }
+ else return kFALSE;
+ }
+
if(fOptPileup==kRejectTracksFromPileupVertex){
// to be implemented
if(mod2>=0 && mod2<4 && lad2<40){
lay2ok=deadSPDLay2PbPb2011[lad2][mod2];
}
- if(!lay1ok && !lay2ok) retval=kFALSE;
+ if(!lay1ok && !lay2ok) return kFALSE;
}
- return retval;
+ return kTRUE;
}
//---------------------------------------------------------------------------
void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
if(fUseCentrality==2) estimator = "Tracks";
if(fUseCentrality==3) estimator = "Tracklets";
if(fUseCentrality==4) estimator = "SPD clusters outer";
- printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
+ printf("Centrality class considered: %.1f-%.1f, estimated with %s\n",fMinCentrality,fMaxCentrality,estimator.Data());
}
if(fIsCandTrackSPDFirst) printf("Check for candidates with pt < %2.2f, that daughters fullfill kFirst criteria\n",fMaxPtCandTrackSPDFirst);
+ if(fCutRatioClsOverCrossRowsTPC) printf("N TPC Clusters > %f N TPC Crossed Rows\n", fCutRatioClsOverCrossRowsTPC);
+ if(fCutRatioSignalNOverCrossRowsTPC) printf("N TPC Points for dE/dx > %f N TPC Crossed Rows\n", fCutRatioSignalNOverCrossRowsTPC);
+ if(f1CutMinNCrossedRowsTPCPtDep) printf("N TPC Crossed Rows pT-dependent cut: %s\n", fCutMinCrossedRowsTPCPtDep.Data());
+
if(fVarNames){
cout<<"Array of variables"<<endl;
for(Int_t iv=0;iv<fnVars;iv++){
class AliAODTrack;
class AliAODRecoDecayHF;
class AliESDVertex;
+class TF1;
+class TFormula;
class AliRDHFCuts : public AliAnalysisCuts
{
fMinContrPileup=minContrib;
fMinDzPileup=minDz;
}
-
+ void SetMinCrossedRowsTPCPtDep(const char *rows="");
+ void SetMinRatioClsOverCrossRowsTPC(Float_t ratio=0.) {fCutRatioClsOverCrossRowsTPC = ratio;}
+ void SetMinRatioSignalNOverCrossRowsTPC(Float_t ratio=0.) {fCutRatioSignalNOverCrossRowsTPC = ratio;}
AliAODPidHF* GetPidHF() const {return fPidHF;}
Float_t *GetPtBinLimits() const {return fPtBinLimits;}
Double_t GetMaxPtCandidate() const {return fMaxPtCand;}
TH1F *GetHistoForCentralityFlattening(){return fHistCentrDistr;}
void SetUseCentralityFlatteningInMC(Bool_t opt){fUseCentrFlatteningInMC=opt;}
+ const char* GetMinCrossedRowsTPCPtDep() const {return fCutMinCrossedRowsTPCPtDep;}
+ Float_t GetMinRatioClsOverCrossRowsTPC() const {return fCutRatioClsOverCrossRowsTPC;}
+ Float_t GetMinRatioSignalNOverCrossRowsTPC() const {return fCutRatioSignalNOverCrossRowsTPC;}
Bool_t IsSelected(TObject *obj) {return IsSelected(obj,AliRDHFCuts::kAll);}
Bool_t IsSelected(TList *list) {if(!list) return kTRUE; return kFALSE;}
Int_t IsEventSelectedInCentrality(AliVEvent *event);
Bool_t IsSelectCandTrackSPDFirst() const { return fIsCandTrackSPDFirst; }
Double_t IsMaxCandTrackSPDFirst() const { return fMaxPtCandTrackSPDFirst; }
+ Bool_t CheckPtDepCrossedRows(TString rows,Bool_t print=kFALSE) const;
+
+
protected:
Bool_t fUseTrackSelectionWithFilterBits; // flag to enable/disable the check on filter bits
Bool_t fUseCentrFlatteningInMC; // flag for enabling/diabling centrality flattening in MC
TH1F *fHistCentrDistr; // histogram with reference centrality distribution for centrality distribution flattening
+ Float_t fCutRatioClsOverCrossRowsTPC; // min. value ratio NTPCClusters/NTPCCrossedRows, cut if !=0
+ Float_t fCutRatioSignalNOverCrossRowsTPC; // min. value ratio TPCPointsUsedForPID/NTPCCrossedRows, cut if !=0
+ TString fCutMinCrossedRowsTPCPtDep; // pT-dep cut in TPC minimum n crossed rows
+ TFormula *f1CutMinNCrossedRowsTPCPtDep; // pT-dep cut in TPC minimum n crossed rows
+
- ClassDef(AliRDHFCuts,32); // base class for cuts on AOD reconstructed heavy-flavour decays
+ ClassDef(AliRDHFCuts,33); // base class for cuts on AOD reconstructed heavy-flavour decays
};
#endif