]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectronTrackCuts.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronTrackCuts.cxx
index 04e32728074212473f8f4c45a74572cc7b6a9ce2..64d61e7e2ec215b82bca81d2a1ba16a83aebbb37 100644 (file)
@@ -26,10 +26,11 @@ Detailed description
 ///////////////////////////////////////////////////////////////////////////
 
 
+#include <TMath.h>
 
 #include "AliDielectronTrackCuts.h"
 #include "AliVTrack.h"
-#include "AliESDtrack.h"
+#include "AliAODTrack.h"
 
 ClassImp(AliDielectronTrackCuts)
 
@@ -37,9 +38,14 @@ AliDielectronTrackCuts::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
@@ -55,9 +61,14 @@ AliDielectronTrackCuts::AliDielectronTrackCuts(const char* name, const char* tit
   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
@@ -94,22 +105,55 @@ Bool_t AliDielectronTrackCuts::IsSelected(TObject* track)
     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;
 }
 
@@ -144,3 +188,14 @@ Bool_t AliDielectronTrackCuts::CheckITSClusterRequirement(ITSClusterRequirement
   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;  
+}