]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/FLOW/AliFlowTasks/AliFlowEventCuts.cxx
correct bug in case of conversion removal-recombination from analysis
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowTasks / AliFlowEventCuts.cxx
index d1c91000b3515b5fedc9f76f23b77cba595d7d3e..5e0f2d9973b2c435f721f6d6b1007754492460ec 100644 (file)
 #include "AliVVertex.h"
 #include "AliVEvent.h"
 #include "AliESDEvent.h"
+#include "AliESDCentrality.h"
 #include "AliESDVZERO.h"
 #include "AliMultiplicity.h"
 #include "AliMCEvent.h"
 #include "AliFlowEventCuts.h"
 #include "AliFlowTrackCuts.h"
+#include "AliTriggerAnalysis.h"
 
 ClassImp(AliFlowEventCuts)
 
@@ -60,8 +62,15 @@ AliFlowEventCuts::AliFlowEventCuts():
   fNContributorsMax(INT_MAX),
   fNContributorsMin(INT_MIN),
   fCutMeanPt(kFALSE),
-  fMeanPtMax(INT_MAX),
-  fMeanPtMin(INT_MIN)
+  fMeanPtMax(-DBL_MAX),
+  fMeanPtMin(DBL_MAX),
+  fCutSPDvertexerAnomaly(kTRUE),
+  fCutCentralityPercentile(kFALSE),
+  fCentralityPercentileMethod(kTPConly),
+  fCentralityPercentileMax(100.),
+  fCentralityPercentileMin(0.),
+  fCutZDCtiming(kTRUE),
+  fTrigAna()
 {
   //constructor 
 }
@@ -91,8 +100,15 @@ AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
   fNContributorsMax(INT_MAX),
   fNContributorsMin(INT_MIN),
   fCutMeanPt(kFALSE),
-  fMeanPtMax(INT_MAX),
-  fMeanPtMin(INT_MIN)
+  fMeanPtMax(-DBL_MAX),
+  fMeanPtMin(DBL_MAX),
+  fCutSPDvertexerAnomaly(kTRUE),
+  fCutCentralityPercentile(kFALSE),
+  fCentralityPercentileMethod(kTPConly),
+  fCentralityPercentileMax(100.),
+  fCentralityPercentileMin(0.),
+  fCutZDCtiming(kTRUE),
+  fTrigAna()
 {
   //constructor 
 }
@@ -123,7 +139,14 @@ AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
   fNContributorsMin(that.fNContributorsMin),
   fCutMeanPt(that.fCutMeanPt),
   fMeanPtMax(that.fMeanPtMax),
-  fMeanPtMin(that.fMeanPtMin)
+  fMeanPtMin(that.fMeanPtMin),
+  fCutSPDvertexerAnomaly(that.fCutSPDvertexerAnomaly),
+  fCutCentralityPercentile(that.fCutCentralityPercentile),
+  fCentralityPercentileMethod(that.fCentralityPercentileMethod),
+  fCentralityPercentileMax(that.fCentralityPercentileMax),
+  fCentralityPercentileMin(that.fCentralityPercentileMin),
+  fCutZDCtiming(that.fCutZDCtiming),
+  fTrigAna()
 {
   //copy constructor 
   if (that.fRefMultCuts)
@@ -166,22 +189,53 @@ AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
   fCutMeanPt=that.fCutMeanPt;
   fMeanPtMax=that.fMeanPtMax;
   fMeanPtMin=that.fMeanPtMin;
+  fCutSPDvertexerAnomaly=that.fCutSPDvertexerAnomaly;
+  fCutCentralityPercentile=that.fCutCentralityPercentile;
+  fCentralityPercentileMethod=that.fCentralityPercentileMethod;
+  fCentralityPercentileMax=that.fCentralityPercentileMax;
+  fCentralityPercentileMin=that.fCentralityPercentileMin;
   return *this;
 }
 
 //----------------------------------------------------------------------- 
-Bool_t AliFlowEventCuts::IsSelected(const TObject* obj)
+Bool_t AliFlowEventCuts::IsSelected(TObject* obj)
 {
   //check cuts
-  const AliVEvent* vevent = dynamic_cast<const AliVEvent*>(obj);
+  AliVEvent* vevent = dynamic_cast<AliVEvent*>(obj);
   if (vevent) return PassesCuts(vevent);
   return kFALSE;  //when passed wrong type of object
 }
 //----------------------------------------------------------------------- 
-Bool_t AliFlowEventCuts::PassesCuts(const AliVEvent *event)
+Bool_t AliFlowEventCuts::PassesCuts(AliVEvent *event)
 {
   ///check if event passes cuts
-  if(fCutNumberOfTracks) {if (event->GetNumberOfTracks() < fNumberOfTracksMin || event->GetNumberOfTracks() >= fNumberOfTracksMax ) return kFALSE;}
+  AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
+  if (fCutCentralityPercentile)
+  {
+    AliESDCentrality* centr = esdevent->GetCentrality();
+    if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
+                                          fCentralityPercentileMax,
+                                          CentrMethName(fCentralityPercentileMethod) ))
+      return kFALSE;
+  }
+  if (fCutSPDvertexerAnomaly&&esdevent)
+  {
+    const AliESDVertex* sdpvertex = esdevent->GetPrimaryVertexSPD();
+    if (sdpvertex->GetNContributors()<1) return kFALSE;
+    if (sdpvertex->GetDispersion()>0.04) return kFALSE;
+    if (sdpvertex->GetZRes()>0.25) return kFALSE;
+    const AliESDVertex* tpcvertex = esdevent->GetPrimaryVertexTPC();
+    if (tpcvertex->GetNContributors()<1) return kFALSE;
+    const AliMultiplicity* tracklets = esdevent->GetMultiplicity();
+    if (tpcvertex->GetNContributors()<(-10.0+0.25*tracklets->GetNumberOfITSClusters(0)))
+      return kFALSE;
+  }
+  if (fCutZDCtiming)
+  {
+    if (!fTrigAna.ZDCTimeTrigger(esdevent)) return kFALSE;
+  }
+  if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
+                               event->GetNumberOfTracks() >= fNumberOfTracksMax ) return kFALSE;}
   if(fCutRefMult)
   {
     //reference multiplicity still to be defined
@@ -218,20 +272,44 @@ Bool_t AliFlowEventCuts::PassesCuts(const AliVEvent *event)
   {
     Float_t meanpt=0.0;
     Int_t ntracks=event->GetNumberOfTracks();
+    Int_t nselected=0;
     for (Int_t i=0; i<ntracks; i++)
     {
       AliVParticle* track = event->GetTrack(i);
       if (!track) continue;
       Bool_t pass=kTRUE;
       if (fMeanPtCuts) pass=fMeanPtCuts->IsSelected(track);
-      if (pass) meanpt += track->Pt();
+      if (pass) 
+      {
+        meanpt += track->Pt();
+        nselected++;
+      }
     }
-    meanpt=meanpt/ntracks;
+    meanpt=meanpt/nselected;
     if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) return kFALSE;
   }
   return kTRUE;
 }
 
+//----------------------------------------------------------------------- 
+const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
+{
+  //get the string for refmultmethod, for use with AliESDCentrality in
+  //the cut on centrality percentile
+  switch (method)
+  {
+    case kSPDtracklets:
+      return "TKL";
+    case kSPD1clusters:
+      return "CL1";
+    case kTPConly:
+      return "TRK";
+    case kV0:
+      return "V0M";
+    default:
+      return "";
+  }
+}
 //----------------------------------------------------------------------- 
 AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
 {
@@ -241,39 +319,43 @@ AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
 }
 
 //----------------------------------------------------------------------- 
-Int_t AliFlowEventCuts::RefMult(const AliVEvent* event)
+Int_t AliFlowEventCuts::RefMult(AliVEvent* event)
 {
   //calculate the reference multiplicity, if all fails return 0
   AliESDVZERO* vzero = NULL;
-  const AliESDEvent* esdevent = dynamic_cast<const AliESDEvent*>(event);
+  AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
+  const AliMultiplicity* mult = esdevent->GetMultiplicity();
   Int_t refmult=0;
-  if (!fRefMultCuts)
+
+  switch (fRefMultMethod)
   {
-    switch (fRefMultMethod)
-    {
-      case kTPConly:
-        fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
-        fRefMultCuts->SetEtaRange(-0.8,0.8);
-        fRefMultCuts->SetPtMin(0.15);
-        break;
-      case kSPDtracklets:
-        fRefMultCuts = new AliFlowTrackCuts();
-        fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
-        fRefMultCuts->SetEtaRange(-0.8,0.8);
-        break;
-      case kV0:
-        if (!esdevent) return 0;
-        vzero=esdevent->GetVZEROData();
-        if (!vzero) return 0;
-        refmult+=TMath::Nint(vzero->GetMTotV0A());
-        refmult+=TMath::Nint(vzero->GetMTotV0C());
-        return refmult;
-      default:
-        return 0;
-    }
+    case kTPConly:
+      if (fRefMultCuts) break;
+      fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
+      fRefMultCuts->SetEtaRange(-0.8,0.8);
+      fRefMultCuts->SetPtMin(0.15);
+      break;
+    case kSPDtracklets:
+      if (fRefMultCuts) break;
+      fRefMultCuts = new AliFlowTrackCuts();
+      fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
+      fRefMultCuts->SetEtaRange(-0.8,0.8);
+      break;
+    case kV0:
+      if (!esdevent) return 0;
+      vzero=esdevent->GetVZEROData();
+      if (!vzero) return 0;
+      refmult = TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
+      return refmult;
+    case kSPD1clusters:
+      if (!mult) return 0;
+      refmult = mult->GetNumberOfITSClusters(1);
+      return refmult;
+    default:
+      return 0;
   }
 
-  fRefMultCuts->SetEvent(const_cast<AliVEvent*>(event));
+  fRefMultCuts->SetEvent(event);
   for (Int_t i=0; i<fRefMultCuts->GetNumberOfInputObjects(); i++)
   {
     if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))