]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectronV0Cuts.cxx
including switch to set on/off iso-track core removal, cleaning and bug fix
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronV0Cuts.cxx
index 10e218dbccf4a98e6f787d4f0cb50b540e7fa067..24609217f9f9119aeee59a9ed31260eb3cfbff73 100644 (file)
 //   Julian Book <Julian.Book@cern.ch>                                   //
 /*
 
+Class to provide some V0 selection using exactley the same cuts in ESDs as in AODs.
+It implements the PID cut class AliDielectronPID and the standard AliDielectronVarCuts for
+the configuration of leg respective pair cuts. These pair cuts are applied on the KFparticle
+build by the legs.
 
+Some QA cuts for the tracks are applied before the V0 pair is build. These cuts are:
+AliDielectronVarCuts dauQAcuts1;
+dauQAcuts1.AddCut(AliDielectronVarManager::kPt,            0.05, 100.0);
+dauQAcuts1.AddCut(AliDielectronVarManager::kEta,          -0.9,    0.9);
+dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC,      50.0,  160.0);
+dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl,     0.0,    4.0);
+AliDielectronTrackCuts dauQAcuts2;
+dauQAcuts2.SetRequireTPCRefit(kTRUE);
+
+
+
+Example configuration:
+
+  AliDielectronV0Cuts *gammaV0Cuts = new AliDielectronV0Cuts("IsGamma","IsGamma");
+
+  // which V0 finder you want to use
+  gammaV0Cuts->SetV0finder(kOnTheFly);  // kAll(default), kOffline or kOnTheFly
+
+  // add some pdg codes (they are used then by the KF package and important for gamma conversions)
+  gammaV0Cuts->SetPdgCodes(22,11,11); // mother, daughter1 and 2
+
+  // add default PID cuts (defined in AliDielectronPID)
+  // requirement can be set to at least one(kAny) of the tracks or to both(kBoth)
+  gammaV0Cuts->SetDefaultPID(16, AliDielectronV0Cuts::kAny);
+
+  // add the pair cuts for V0 candidates
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kCosPointingAngle, TMath::Cos(0.02),   1.0, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kChi2NDF,                       0.0,  10.0, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kLegDist,                       0.0,   0.25, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kR,                             3.0,  90.0, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kPsiPair,                       0.0,   0.05, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kM,                             0.0,   0.05, kFALSE);
+  gammaV0Cuts->AddCut(AliDielectronVarManager::kArmPt,                         0.0,   0.05, kFALSE);
+
+  // selection or rejection of V0 tracks
+  gammaV0Cuts->SetExcludeTracks(kTRUE);
+
+  // add the V0cuts directly to the track filter or to some cut group of it
 
 */
 //                                                                       //
@@ -33,6 +75,7 @@
 #include "AliDielectronTrackCuts.h"
 #include "AliDielectronPID.h"
 #include "AliESDv0.h"
+#include "AliAODv0.h"
 
 ClassImp(AliDielectronV0Cuts)
 
@@ -41,10 +84,12 @@ AliDielectronV0Cuts::AliDielectronV0Cuts() :
   AliDielectronVarCuts(),
   fV0TrackArr(0),
   fExcludeTracks(kTRUE),
+  fV0finder(kAll),
   fMotherPdg(0),
   fNegPdg(0),
   fPosPdg(0),
   fPID(-1),
+  fPIDCutType(kBoth),
   fOrbit(0),
   fPeriod(0),
   fBunchCross(0)
@@ -59,10 +104,12 @@ AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
   AliDielectronVarCuts(name,title),
   fV0TrackArr(0),
   fExcludeTracks(kTRUE),
+  fV0finder(kAll),
   fMotherPdg(0),
   fNegPdg(0),
   fPosPdg(0),
   fPID(-1),
+  fPIDCutType(kBoth),
   fOrbit(0),
   fPeriod(0),
   fBunchCross(0)
@@ -107,12 +154,14 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
   // rest booleans
   fV0TrackArr.ResetAllBits();
 
-  // basic quality cut, at least one of the V0 daughters has to fullfill
+  // basic quality cut, /*at least one*/ both of the V0 daughters has to fullfill
+  // always update ::Print accordingly
   AliDielectronVarCuts dauQAcuts1;
-  dauQAcuts1.AddCut(AliDielectronVarManager::kPt,            0.05, 100.0);
-  dauQAcuts1.AddCut(AliDielectronVarManager::kEta,          -0.9,    0.9);
-  dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC,      50.0,  160.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC,      70.0,  160.0);
   dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl,     0.0,    4.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kKinkIndex0,            0.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kEta,          -0.9,    0.9);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kPt,            0.05, 100.0);
   AliDielectronTrackCuts dauQAcuts2;
   //  dauQAcuts2.SetRequireITSRefit(kTRUE);
   dauQAcuts2.SetRequireTPCRefit(kTRUE);
@@ -134,6 +183,10 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
       AliESDv0 *v = esdev->GetV0(iv);
       if(!v) continue;
 
+      // check the v0 finder
+      if( v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOffline  ) continue;
+      if(!v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOnTheFly ) continue;
+
       // should we make use of AliESDv0Cuts::GetPdgCode() to preselect candiadtes, e.g.:
       // if(fMotherPdg!=v->GetPdgCode()) continue;
 
@@ -144,10 +197,16 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
        continue;
       }
 
+      // protection against LS v0s
+      if(trNeg->Charge() == trPos->Charge()) continue;
+
       // PID default cuts
       if(fPID>=0) {
-       if( !dauPIDcuts.IsSelected(trNeg) ) continue;
-       if( !dauPIDcuts.IsSelected(trPos) ) continue;
+       Bool_t selected=kFALSE;
+       selected=dauPIDcuts.IsSelected(trNeg);
+       if(fPIDCutType==kBoth) selected &= dauPIDcuts.IsSelected(trPos);
+       if(fPIDCutType==kAny)  selected |= dauPIDcuts.IsSelected(trPos);
+       if(!selected) continue;
       }
 
       // basic track cuts
@@ -157,7 +216,7 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
       if( !dauQAcuts1.IsSelected(trPos) ) continue;
 
       if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
-      else candidate.SetTracks(trNeg, fNegPdg, trPos, fPosPdg);
+      else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
       // eventually take the external trackparam and build the KFparticles by hand (see AliESDv0::GetKFInfo)
       // the folowing is not needed, because the daughters where used in the v0 vertex fit (I guess)
       //      AliKFVertex v0vtx = *v;
@@ -174,12 +233,16 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
   }
   else if(ev->IsA() == AliAODEvent::Class()) {
     const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
+    if(!aodEv->GetV0s()) return; // protection for nano AODs
 
     // loop over vertices
-    for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfVertices(); ++ivertex){
-      AliAODVertex *v=aodEv->GetVertex(ivertex);
-      if(v->GetType()!=AliAODVertex::kV0) continue;
-      if(v->GetNDaughters()!=2) continue;
+    for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfV0s(); ++ivertex){
+      AliAODv0 *v=aodEv->GetV0(ivertex);
+      if(!v) continue;
+
+      // check the v0 finder
+      if( v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOffline  ) continue;
+      if(!v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOnTheFly ) continue;
 
       AliAODTrack *trNeg=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
       AliAODTrack *trPos=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
@@ -189,10 +252,16 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
       }
       nV0stored++;
 
+      // protection against LS v0s
+      if(trNeg->Charge() == trPos->Charge()) continue;
+
       // PID default cuts
       if(fPID>=0) {
-       if( !dauPIDcuts.IsSelected(trNeg) ) continue;
-       if( !dauPIDcuts.IsSelected(trPos) ) continue;
+       Bool_t selected=kFALSE;
+       selected=dauPIDcuts.IsSelected(trNeg);
+       if(fPIDCutType==kBoth) selected &= dauPIDcuts.IsSelected(trPos);
+       if(fPIDCutType==kAny)  selected |= dauPIDcuts.IsSelected(trPos);
+       if(!selected) continue;
       }
 
       // basic track cuts
@@ -201,7 +270,7 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
       if( !dauQAcuts1.IsSelected(trNeg) ) continue;
       if( !dauQAcuts1.IsSelected(trPos) ) continue;
 
-      AliKFVertex v0vtx = *v;
+      AliKFVertex v0vtx = *(v->GetSecondaryVtx());
       if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
       else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
       candidate.SetProductionVertex(v0vtx);
@@ -213,7 +282,7 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
        fV0TrackArr.SetBitNumber(trPos->GetID());
       }
     }
-    //printf("there are %d V0s in the event \n",nV0stored);
+    //    printf("there are %d V0s in the event \n",nV0stored);
   }
   else
     return;
@@ -259,3 +328,37 @@ Bool_t AliDielectronV0Cuts::IsNewEvent(const AliVEvent *ev)
   fPeriod     = ev->GetPeriodNumber();
   return kTRUE;
 }
+
+//________________________________________________________________________
+void AliDielectronV0Cuts::Print(const Option_t* /*option*/) const
+{
+  //
+  // Print cuts and the range
+  //
+  printf(" V0 cuts:\n");
+  printf(" V0 finder mode: %s \n",(fV0finder ==kOnTheFly ? "One-The-Fly":
+                                  (fV0finder==kOffline  ? "Offline":
+                                   "One-The-Fly+Offline") ) );
+  AliDielectronVarCuts::Print();
+
+  printf(" V0 daughter cuts (applied to both):\n");
+  AliDielectronVarCuts dauQAcuts1;
+  dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC,      70.0,  160.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl,     0.0,    4.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kKinkIndex0,            0.0);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kEta,          -0.9,    0.9);
+  dauQAcuts1.AddCut(AliDielectronVarManager::kPt,            0.05, 100.0);
+  dauQAcuts1.Print();
+  AliDielectronTrackCuts dauQAcuts2;
+  //  dauQAcuts2.SetRequireITSRefit(kTRUE);
+  dauQAcuts2.SetRequireTPCRefit(kTRUE);
+  //  dauQAcuts2.Print(); //TODO activate as soon as implemented
+
+  if(fPID>=0) {
+    printf(" V0 daughter PID cuts (applied to %s):\n",(fPIDCutType==kBoth?"both":"any"));
+    AliDielectronPID dauPIDcuts;
+    dauPIDcuts.SetDefaults(fPID);
+    dauPIDcuts.Print(); //TODO activate as soon as implemented
+  }
+
+}