]> 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 3a539d7613cb49c6e27a0bc34bea48be2259ae6d..5e0f2d9973b2c435f721f6d6b1007754492460ec 100644 (file)
 
 #include <limits.h>
 #include <float.h>
+#include "TMath.h"
 #include "TNamed.h"
 #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)
 
@@ -44,6 +48,7 @@ AliFlowEventCuts::AliFlowEventCuts():
   fRefMultMax(INT_MAX),
   fRefMultMin(INT_MIN),
   fRefMultCuts(NULL),
+  fMeanPtCuts(NULL),
   fCutPrimaryVertexX(kFALSE),
   fPrimaryVertexXmax(INT_MAX),
   fPrimaryVertexXmin(INT_MIN),
@@ -55,7 +60,17 @@ AliFlowEventCuts::AliFlowEventCuts():
   fPrimaryVertexZmin(INT_MIN),
   fCutNContributors(kFALSE),
   fNContributorsMax(INT_MAX),
-  fNContributorsMin(INT_MIN)
+  fNContributorsMin(INT_MIN),
+  fCutMeanPt(kFALSE),
+  fMeanPtMax(-DBL_MAX),
+  fMeanPtMin(DBL_MAX),
+  fCutSPDvertexerAnomaly(kTRUE),
+  fCutCentralityPercentile(kFALSE),
+  fCentralityPercentileMethod(kTPConly),
+  fCentralityPercentileMax(100.),
+  fCentralityPercentileMin(0.),
+  fCutZDCtiming(kTRUE),
+  fTrigAna()
 {
   //constructor 
 }
@@ -71,6 +86,7 @@ AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
   fRefMultMax(INT_MAX),
   fRefMultMin(INT_MIN),
   fRefMultCuts(NULL),
+  fMeanPtCuts(NULL),
   fCutPrimaryVertexX(kFALSE),
   fPrimaryVertexXmax(INT_MAX),
   fPrimaryVertexXmin(INT_MIN),
@@ -82,7 +98,17 @@ AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
   fPrimaryVertexZmin(INT_MIN),
   fCutNContributors(kFALSE),
   fNContributorsMax(INT_MAX),
-  fNContributorsMin(INT_MIN)
+  fNContributorsMin(INT_MIN),
+  fCutMeanPt(kFALSE),
+  fMeanPtMax(-DBL_MAX),
+  fMeanPtMin(DBL_MAX),
+  fCutSPDvertexerAnomaly(kTRUE),
+  fCutCentralityPercentile(kFALSE),
+  fCentralityPercentileMethod(kTPConly),
+  fCentralityPercentileMax(100.),
+  fCentralityPercentileMin(0.),
+  fCutZDCtiming(kTRUE),
+  fTrigAna()
 {
   //constructor 
 }
@@ -98,6 +124,7 @@ AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
   fRefMultMax(that.fRefMultMax),
   fRefMultMin(that.fRefMultMin),
   fRefMultCuts(NULL),
+  fMeanPtCuts(NULL),
   fCutPrimaryVertexX(that.fCutPrimaryVertexX),
   fPrimaryVertexXmax(that.fPrimaryVertexXmax),
   fPrimaryVertexXmin(that.fPrimaryVertexXmin),
@@ -109,11 +136,31 @@ AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
   fPrimaryVertexZmin(that.fPrimaryVertexZmin),
   fCutNContributors(that.fCutNContributors),
   fNContributorsMax(that.fNContributorsMax),
-  fNContributorsMin(that.fNContributorsMin)
+  fNContributorsMin(that.fNContributorsMin),
+  fCutMeanPt(that.fCutMeanPt),
+  fMeanPtMax(that.fMeanPtMax),
+  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)
     fRefMultCuts = new AliFlowTrackCuts(*(that.fRefMultCuts));
+  if (that.fMeanPtCuts)
+    fMeanPtCuts = new AliFlowTrackCuts(*(that.fMeanPtCuts));
+}
+
+////-----------------------------------------------------------------------
+AliFlowEventCuts::~AliFlowEventCuts()
+{
+  //dtor
+  delete fMeanPtCuts;
+  delete fRefMultCuts;
 }
 
 ////-----------------------------------------------------------------------
@@ -128,6 +175,7 @@ AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
   fRefMultMax=that.fRefMultMax;
   fRefMultMin=that.fRefMultMin;
   if (that.fRefMultCuts) *fRefMultCuts=*(that.fRefMultCuts);
+  if (that.fMeanPtCuts) *fMeanPtCuts=*(that.fMeanPtCuts);
   fCutPrimaryVertexX=that.fCutPrimaryVertexX;
   fPrimaryVertexXmin=that.fPrimaryVertexXmin;
   fPrimaryVertexXmax=that.fPrimaryVertexXmax;
@@ -138,22 +186,56 @@ AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
   fCutNContributors=that.fCutNContributors;
   fNContributorsMax=that.fNContributorsMax;
   fNContributorsMin=that.fNContributorsMin;
+  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
@@ -186,9 +268,48 @@ Bool_t AliFlowEventCuts::PassesCuts(const AliVEvent *event)
     if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
       return kFALSE;
   }
+  if (fCutMeanPt)
+  {
+    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();
+        nselected++;
+      }
+    }
+    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()
 {
@@ -198,30 +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
-  if (!fRefMultCuts)
+  AliESDVZERO* vzero = NULL;
+  AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
+  const AliMultiplicity* mult = esdevent->GetMultiplicity();
+  Int_t refmult=0;
+
+  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;
-      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));
-  Int_t refmult=0;
+  fRefMultCuts->SetEvent(event);
   for (Int_t i=0; i<fRefMultCuts->GetNumberOfInputObjects(); i++)
   {
     if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))