]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/RESONANCES/AliRsnCutPrimaryVertex.cxx
Added check of pileup in event cuts
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPrimaryVertex.cxx
index 8b8dc5393fd2de5d36031601c79e168a9854c304..3837637faffe03d3dcd13bed792b73046cee0022 100644 (file)
 
 ClassImp(AliRsnCutPrimaryVertex)
 
-//_________________________________________________________________________________________________
-AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex() :
-  AliRsnCut(AliRsnCut::kEvent),
-  fAcceptTPC(kFALSE)
-{
-//
-// Default constructor.
-//
-}
-
 //_________________________________________________________________________________________________
 AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
 (const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC) :
-  AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1),
-  fAcceptTPC(acceptTPC)
+  AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1, 0.0, maxVz),
+  fAcceptTPC(acceptTPC),
+  fCheckPileUp(kFALSE)
 {
 //
 // Main constructor.
@@ -44,58 +35,92 @@ AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
 //
 
   fMinD = 0.0;
-  fMaxD = maxVz;
+  fMaxD = maxVz + 1E-6;
 }
 
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *obj1, TObject* /*obj2*/)
+Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
 {
 //
 // Cut checker
 //
 
+  static Int_t evNum = 0;
+  evNum++;
+  
   // retrieve ESD event
-  AliRsnEvent *rsn = dynamic_cast<AliRsnEvent*>(obj1);
+  AliRsnEvent *rsn = dynamic_cast<AliRsnEvent*>(object);
   if (!rsn) return kFALSE;
-  AliESDEvent *esd = dynamic_cast<AliESDEvent*>(rsn->GetRef());
-  if (!esd) 
-  {
-    AliDebug(AliLog::kDebug+2, "NO ESD");
-    return kFALSE;
-  }
-
-  // get the best primary vertex:
-  // first try the one with tracks
-  const AliESDVertex *vTrk  = esd->GetPrimaryVertexTracks();
-  const AliESDVertex *vSPD  = esd->GetPrimaryVertexSPD();
-  const AliESDVertex *vTPC  = esd->GetPrimaryVertexTPC();
-  Double_t            vzTrk = 2.0 * fMaxD;
-  Double_t            vzSPD = 2.0 * fMaxD;
-  Double_t            vzTPC = 2.0 * fMaxD;
-  if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
-  if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
-  if (vTPC) vzTPC = TMath::Abs(vTPC->GetZv());
-  AliDebug(AliLog::kDebug + 1, Form("Vertex with tracks: contributors = %d, abs(vz) = %f", vTrk->GetNContributors(), vzTrk));
-  AliDebug(AliLog::kDebug + 1, Form("Vertex with SPD,    contributors = %d, abs(vz) = %f", vSPD->GetNContributors(), vzSPD));
-  AliDebug(AliLog::kDebug + 1, Form("Vertex with TPC,    contributors = %d, abs(vz) = %f", vTPC->GetNContributors(), vzTPC));
-  if(vTrk->GetStatus())
-  {
-    fCutValueI = vTrk->GetNContributors();
-    fCutValueD = vzTrk;
-  }
-  else if (vSPD->GetStatus())
+  AliESDEvent *esd = rsn->GetRefESD();
+  AliAODEvent *aod = rsn->GetRefAOD();
+  
+  if (esd)
   {
-    fCutValueI = vSPD->GetNContributors();
-    fCutValueD = vzSPD;
+    // pile-up check
+    if (fCheckPileUp)
+    {
+      if (esd->IsPileupFromSPD()) return kFALSE;
+    }
+    
+    // get the best primary vertex:
+    // first try the one with tracks
+    const AliESDVertex *vTrk  = esd->GetPrimaryVertexTracks();
+    const AliESDVertex *vSPD  = esd->GetPrimaryVertexSPD();
+    const AliESDVertex *vTPC  = esd->GetPrimaryVertexTPC();
+    Int_t               ncTrk = -1;
+    Int_t               ncSPD = -1;
+    Int_t               ncTPC = -1;
+    Double_t            vzTrk = 2.0 * fMaxD;
+    Double_t            vzSPD = 2.0 * fMaxD;
+    Double_t            vzTPC = 2.0 * fMaxD;
+    if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
+    if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
+    if (vTPC) vzTPC = TMath::Abs(vTPC->GetZv());
+    if (vTrk) ncTrk = (Int_t)vTrk->GetNContributors();
+    if (vSPD) ncSPD = (Int_t)vSPD->GetNContributors();
+    if (vTPC) ncTPC = (Int_t)vTPC->GetNContributors();
+    if(vTrk && ncTrk > 0)
+    {
+      fCutValueI = ncTrk;
+      fCutValueD = vzTrk;
+    }
+    else if (vSPD && ncSPD > 0)
+    {
+      fCutValueI = ncSPD;
+      fCutValueD = vzSPD;
+    }
+    else if (vTPC && fAcceptTPC && ncTPC > 0)
+    {
+      fCutValueI = ncTPC;
+      fCutValueD = vzTPC;
+    }
+    else
+    {
+      fCutValueI = -1;
+      fCutValueD = 2.0 * fMaxD;
+    }
   }
-  else if (vTPC->GetStatus() && fAcceptTPC)
+  else if (aod)
   {
-    fCutValueI = vTPC->GetNContributors();
-    fCutValueD = vzTPC;
+    // pile-up check is not yet available for AODs
+    
+    // lines suggested by Andrea to reject TPC-only events
+    if(!fAcceptTPC)
+    {
+      if (!aod->GetPrimaryVertexSPD()) return kFALSE;
+      else if(aod->GetPrimaryVertexSPD()->GetNContributors() < 1) return kFALSE;
+    }
+    
+    AliAODVertex *prim = (AliAODVertex*)aod->GetPrimaryVertex();
+    if (!prim) return kFALSE;
+
+    fCutValueI = prim->GetNContributors();
+    fCutValueD = prim->GetZ();
   }
   else
     return kFALSE;
-  
-  return OkRangeI() && OkRangeD();
+    
+  // output
+  Bool_t result = ((!OkRangeI()) && OkRangeD());
+  return result;
 }
-