///////////////////////////////////////////////////////////////////////////
+#include <TMath.h>
#include "AliDielectronTrackCuts.h"
#include "AliVTrack.h"
-#include "AliESDtrack.h"
+#include "AliAODTrack.h"
ClassImp(AliDielectronTrackCuts)
AliAnalysisCuts(),
fV0DaughterCut(0),
fNegateV0DauterCut(kFALSE),
+ fITSclusterBitMap(0),
+ fITSclusterCutType(kOneOf),
fRequireITSRefit(kFALSE),
fRequireTPCRefit(kFALSE),
- fTPCNclRobustCut(-1)
+ fTPCNclRobustCut(-1),
+ fTPCcrossedOverFindable(-1.),
+ fAODFilterBit(kSwitchOff),
+ fWaiveITSNcls(-1)
{
//
// Default Constructor
AliAnalysisCuts(name, title),
fV0DaughterCut(0),
fNegateV0DauterCut(kFALSE),
+ fITSclusterBitMap(0),
+ fITSclusterCutType(kOneOf),
fRequireITSRefit(kFALSE),
fRequireTPCRefit(kFALSE),
- fTPCNclRobustCut(-1)
+ fTPCNclRobustCut(-1),
+ fTPCcrossedOverFindable(-1.),
+ fAODFilterBit(kSwitchOff),
+ fWaiveITSNcls(-1)
{
//
// Named Constructor
accept*=isV0;
}
+ //ESD track cut like ITS cluster cut
for (Int_t i=0;i<3;++i){
Bool_t layer1=TESTBIT(vtrack->GetITSClusterMap(),i*2);
Bool_t layer2=TESTBIT(vtrack->GetITSClusterMap(),i*2+1);
accept*=CheckITSClusterRequirement(fCutClusterRequirementITS[i], layer1, layer2);
}
- if (fRequireITSRefit) accept*=(vtrack->GetStatus()&kITSrefit)>0;
- if (fRequireTPCRefit) accept*=(vtrack->GetStatus()&kTPCrefit)>0;
+ //more flexible ITS cluster cut
+ if (fITSclusterBitMap) accept*=CheckITSClusterCut(vtrack->GetITSClusterMap());
+
+ //different its cluster cut
+ if (fWaiveITSNcls > -1) {
+ Int_t nITScls = 0;
+ Int_t requiredNcls = 7;
+ for(Int_t i=5; i>=0; i--) {
+ if(TESTBIT(vtrack->GetITSClusterMap(),i)) {
+ nITScls++;
+ requiredNcls=6-fWaiveITSNcls-i;
+ }
+ }
+ accept*=(requiredNcls<=nITScls);
+ }
+ //its and tpc refit
+ if (fRequireITSRefit) accept*=(vtrack->GetStatus()&AliVTrack::kITSrefit)>0;
+ if (fRequireTPCRefit) accept*=(vtrack->GetStatus()&AliVTrack::kTPCrefit)>0;
+
+ Int_t nclr=TMath::Nint(vtrack->GetTPCClusterInfo(2,1));
if (fTPCNclRobustCut>0){
- AliESDtrack *tr=dynamic_cast<AliESDtrack*>(track);
- if (tr){
- Int_t nclr=TMath::Nint(tr->GetTPCClusterInfo(2,1));
- accept*=(nclr>fTPCNclRobustCut);
- }
+ accept*=(nclr>fTPCNclRobustCut);
}
+ if (fTPCcrossedOverFindable > 0.) {
+ Int_t tpcNclsF = vtrack->GetTPCNclsF();
+ accept*=(tpcNclsF); //ESDtrackCut would return here true
+ if (tpcNclsF != 0) {//'accept' already negated above in this case above
+ accept*=(((Double_t)nclr/(Double_t)vtrack->GetTPCNclsF()) >= fTPCcrossedOverFindable);
+ }
+ }
+
+
+ // use filter bit to speed up the AOD analysis (track pre-filter)
+ // relevant filter bits are:
+ // kTPCqual==1 -> TPC quality cuts
+ // kTPCqualSPDany==4 -> + SPD any
+ // kTPCqualSPDanyPIDele==8 -> + nSigmaTPCele +-3 (inclusion)
+ if (track->IsA()==AliAODTrack::Class() && fAODFilterBit!=kSwitchOff) {
+ accept*=((AliAODTrack*)track)->TestFilterBit(fAODFilterBit);
+ }
+
return accept;
}
return kFALSE;
}
+//______________________________________________
+Bool_t AliDielectronTrackCuts::CheckITSClusterCut(UChar_t itsBits) const
+{
+ // check the its cluster cut
+ switch (fITSclusterCutType){
+ case kOneOf: return itsBits & fITSclusterBitMap;
+ case kAtLeast: return (itsBits & fITSclusterBitMap)==fITSclusterBitMap;
+ case kExact: return (itsBits==fITSclusterBitMap);
+ }
+ return kTRUE;
+}