]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectronEventCuts.cxx
New train files for Ashutosh's analysis
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronEventCuts.cxx
index 79766f17825394a0d93e28e377630707bc469013..322507862d08e8542ae4c7785ec0361af0912701 100644 (file)
@@ -33,13 +33,19 @@ Detailed description
 #include <AliAODEvent.h>
 #include <AliMultiplicity.h>
 #include <AliCentrality.h>
+#include <AliESDVZERO.h>
+#include <AliAODVZERO.h>
 
+#include "AliDielectronVarManager.h"
 #include "AliDielectronEventCuts.h"
 
 ClassImp(AliDielectronEventCuts)
 
+const char* AliDielectronEventCuts::fgkVtxNames[AliDielectronEventCuts::kVtxTracksOrSPD+1] = {"Tracks", "SPD", "TPC", "Any", "TracksOrSPD"};
+
 AliDielectronEventCuts::AliDielectronEventCuts() :
   AliAnalysisCuts(),
+  fRun(),
   fVtxZmin(0.),
   fVtxZmax(0.),
   fRequireVtx(kFALSE),
@@ -48,10 +54,17 @@ AliDielectronEventCuts::AliDielectronEventCuts() :
   fCentMin(1.),
   fCentMax(0.),
   fVtxType(kVtxTracks),
+  fRequire13sel(kFALSE),
+  fUtils(),
   fRequireV0and(0),
   fTriggerAnalysis(0x0),
   fkVertex(0x0),
-  fkVertexAOD(0x0)
+  fkVertexAOD(0x0),
+  fparMean(0x0),
+  fparSigma(0x0),
+  fcutSigma(3.),
+  fparMinVtxContributors(0x0),
+  fparMaxVtxContributors(0x0)
 {
   //
   // Default Constructor
@@ -62,6 +75,7 @@ AliDielectronEventCuts::AliDielectronEventCuts() :
 //______________________________________________
 AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
   AliAnalysisCuts(name, title),
+  fRun(),
   fVtxZmin(0.),
   fVtxZmax(0.),
   fRequireVtx(kFALSE),
@@ -70,10 +84,17 @@ AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* tit
   fCentMin(1.),
   fCentMax(0.),
   fVtxType(kVtxTracks),
+  fRequire13sel(kFALSE),
+  fUtils(),
   fRequireV0and(0),
   fTriggerAnalysis(0x0),
   fkVertex(0x0),
-  fkVertexAOD(0x0)
+  fkVertexAOD(0x0),
+  fparMean(0x0),
+  fparSigma(0x0),
+  fcutSigma(3.),
+  fparMinVtxContributors(0x0),
+  fparMaxVtxContributors(0x0)
 {
   //
   // Named Constructor
@@ -149,7 +170,12 @@ Bool_t AliDielectronEventCuts::IsSelectedESD(TObject* event)
     Double_t zvtx=fkVertex->GetZv();
     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
   }
-  
+
+  if(fRequire13sel){
+    if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
+    if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
+  }
+
   if (fRequireV0and){
     if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
     Bool_t v0AND = kFALSE;
@@ -175,7 +201,27 @@ Bool_t AliDielectronEventCuts::IsSelectedESD(TObject* event)
       return kFALSE;
   }
 
-  
+  if(fparMean && fparSigma) {
+    Double_t nTrks  = ev->GetNumberOfTracks();
+    Double_t multV0 = 0.0;
+    for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
+    Double_t mV0 = fparMean->Eval(nTrks);
+    Double_t sV0 = fparSigma->Eval(nTrks);
+    if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
+  }
+
+  // cut on the number of vertex contributors using TPC versus global vertex
+  if(fparMinVtxContributors && fparMaxVtxContributors) {
+    const AliESDVertex *vtxTPC = ev->GetPrimaryVertexTPC();
+    const AliESDVertex *vtxGbl = ev->GetPrimaryVertex();
+    Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
+    Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
+    Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
+    Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
+    if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
+  }
+
+
   return kTRUE;
 }
 //______________________________________________
@@ -188,6 +234,14 @@ Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
   AliAODEvent *ev=dynamic_cast<AliAODEvent*>(event);
   if (!ev) return kFALSE;
 
+  // run rejection
+  Int_t run = ev->GetRunNumber();
+  if(fRun.GetNrows()) {
+    for(Int_t irun=0; irun<fRun.GetNrows(); irun++) {
+      if(fRun(irun)==run) return kFALSE;
+    }
+  }
+
   if (fCentMin<fCentMax){
     AliCentrality *centrality=ev->GetCentrality();
     Double_t centralityF=-1;
@@ -199,7 +253,7 @@ Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
 
   switch(fVtxType){
   case kVtxTracks:         fkVertexAOD=0x0;                       break;
-  case kVtxTPC:            fkVertexAOD=GetPrimaryVertexTPC(ev);   break;
+  case kVtxTPC:            fkVertexAOD=AliDielectronVarManager::GetVertex(ev, AliAODVertex::kMainTPC);   break;
   case kVtxSPD:
   case kVtxTracksOrSPD:    fkVertexAOD=ev->GetPrimaryVertexSPD(); break;
   case kVtxAny:            fkVertexAOD=ev->GetPrimaryVertex();    break;
@@ -226,6 +280,11 @@ Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
   }
 
+  if(fRequire13sel){
+    if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
+//     if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
+  }
+
   /*
   if (fRequireV0and){
     //    if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
@@ -254,6 +313,57 @@ Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
   }
   */
   
+  // correlation cut Ntrks vs. multV0
+  if(fparMean && fparSigma) {
+    Double_t nTrks  = ev->GetNumberOfTracks();
+    Double_t multV0 = 0.0;
+    for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
+    Double_t mV0 = fparMean->Eval(nTrks);
+    Double_t sV0 = fparSigma->Eval(nTrks);
+    if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
+  }
+
+  // cut on the number of vertex contributors using TPC versus global vertex
+  if(fparMinVtxContributors && fparMaxVtxContributors) {
+    const AliAODVertex *vtxTPC = ev->GetVertex(AliAODVertex::kMainTPC);
+    const AliAODVertex *vtxGbl = ev->GetPrimaryVertex();
+    Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
+    Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
+    Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
+    Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
+    if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
+  }
+
   return kTRUE;
 }
 
+//________________________________________________________________________
+void AliDielectronEventCuts::Print(const Option_t* /*option*/) const
+{
+  //
+  // Print cuts and the range
+  //
+  printf("cut ranges for '%s'\n",GetTitle());
+  printf("All Cuts have to be fulfilled\n");
+
+  Int_t iCut=0;
+  if(fRequireVtx) {
+    printf("Cut %02d: vertex required \n",iCut);                                   iCut++; }
+  printf("Cut %02d: vertex type: %s \n", iCut, fgkVtxNames[fVtxType]);             iCut++;
+  if(fMinVtxContributors) {
+    printf("Cut %02d: vertex contributors >= %d \n", iCut, fMinVtxContributors);   iCut++; }
+  if(fVtxZmin<fVtxZmax) {
+    printf("Cut %02d: %f < %s < %f\n",   iCut, fVtxZmin, "Zvtx", fVtxZmax);        iCut++; }
+  if(fCentMin<fCentMax) {
+    printf("Cut %02d: %f < %s < %f\n",   iCut, fCentMin, "V0centrality", fCentMax);iCut++; }
+  if(fMultITSTPC) {
+    printf("Cut %02d: cut on multiplcity ITS vs. TPC \n", iCut);                   iCut++; }
+  if(fparMean&&fparSigma) {
+    printf("Cut %02d: multplicity vs. #tracks correlation +-%.1f sigma inclusion \n", iCut, fcutSigma); iCut++; }
+  if(fRequire13sel){
+    printf("Cut %02d: vertex and event selection for 2013 pPb data taking required \n",iCut);   iCut++; } 
+  if(fRequireV0and) {
+    printf("Cut %02d: require V0and type: %c \n", iCut, fRequireV0and);            iCut++; }
+
+}
+