]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG0/dNdEta/AlidNdEtaSystematicsSelector.cxx
RICH becomes HMPID
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / AlidNdEtaSystematicsSelector.cxx
index 2ea92c5803f49778b8d7f24226502c26e276fdf6..70231d443a205bf90dfbce986d9c3475945a4ac1 100644 (file)
 #include <TH2F.h>
 #include <TH1F.h>
 #include <TParticle.h>
+#include <TParticlePDG.h>
 
 #include <AliLog.h>
 #include <AliESD.h>
-#include <AliGenEventHeader.h>
 #include <AliStack.h>
 #include <AliHeader.h>
+#include <AliGenEventHeader.h>
+#include <../PYTHIA6/AliGenPythiaEventHeader.h>
+#include <../EVGEN/AliGenCocktailEventHeader.h>
 
 #include "esdTrackCuts/AliESDtrackCuts.h"
 #include "AliPWG0Helper.h"
+#include "AliPWG0depHelper.h"
 #include "dNdEta/AlidNdEtaCorrection.h"
 
 ClassImp(AlidNdEtaSystematicsSelector)
@@ -30,14 +34,21 @@ AlidNdEtaSystematicsSelector::AlidNdEtaSystematicsSelector() :
   fSigmaVertex(0),
   fEsdTrackCuts(0),
   fPIDParticles(0),
-  fPIDTracks(0)
+  fPIDTracks(0),
+  fSignMode(0),
+  fMultiplicityMode(0)
 {
   //
   // Constructor. Initialization of pointers
   //
 
   for (Int_t i=0; i<4; ++i)
-    fdNdEtaCorrection[i] = 0;
+    fdNdEtaCorrectionSpecies[i] = 0;
+
+  for (Int_t i=0; i<3; ++i) {
+    fdNdEtaCorrectionVertexReco[i] = 0;
+    fdNdEtaCorrectionTriggerBias[i] = 0;
+  }
 }
 
 AlidNdEtaSystematicsSelector::~AlidNdEtaSystematicsSelector()
@@ -103,7 +114,7 @@ void AlidNdEtaSystematicsSelector::SlaveBegin(TTree* tree)
     {
       TString name;
       name.Form("correction_%d", i);
-      fdNdEtaCorrection[i] = new AlidNdEtaCorrection(name, name);
+      fdNdEtaCorrectionSpecies[i] = new AlidNdEtaCorrection(name, name);
     }
   }
 
@@ -113,8 +124,42 @@ void AlidNdEtaSystematicsSelector::SlaveBegin(TTree* tree)
     printf("WARNING: sigma-vertex analysis enabled. This will produce weird results in the AliESDtrackCuts histograms\n");
   }
 
+  if (option.Contains("vertexreco")) {
+    fdNdEtaCorrectionVertexReco[0] = new AlidNdEtaCorrection("vertexRecoND", "vertexRecoND");
+    fdNdEtaCorrectionVertexReco[1] = new AlidNdEtaCorrection("vertexRecoSD", "vertexRecoSD");
+    fdNdEtaCorrectionVertexReco[2] = new AlidNdEtaCorrection("vertexRecoDD", "vertexRecoDD");
+  }
+
+  if (option.Contains("triggerbias")) {
+    fdNdEtaCorrectionTriggerBias[0] = new AlidNdEtaCorrection("triggerBiasND", "triggerBiasND");
+    fdNdEtaCorrectionTriggerBias[1] = new AlidNdEtaCorrection("triggerBiasSD", "triggerBiasSD");
+    fdNdEtaCorrectionTriggerBias[2] = new AlidNdEtaCorrection("triggerBiasDD", "triggerBiasDD");
+  }
+
   fPIDParticles = new TH1F("pid_particles", "PID of generated primary particles", 10001, -5000.5, 5000.5);
   fPIDTracks = new TH1F("pid_tracks", "MC PID of reconstructed tracks", 10001, -5000.5, 5000.5);
+
+  if (option.Contains("only-positive"))
+  {
+    AliInfo("Processing only positive particles.");
+    fSignMode = 1;
+  }
+  else if (option.Contains("only-negative"))
+  {
+    AliInfo("Processing only negative particles.");
+    fSignMode = -1;
+  }
+
+  if (option.Contains("low-multiplicity"))
+  {
+    AliInfo("Processing only events with low multiplicity.");
+    fMultiplicityMode = 1;
+  }
+  else if (option.Contains("high-multiplicity"))
+  {
+    AliInfo("Processing only events with high multiplicity.");
+    fMultiplicityMode = 2;
+  }
 }
 
 Bool_t AlidNdEtaSystematicsSelector::Process(Long64_t entry)
@@ -162,7 +207,15 @@ Bool_t AlidNdEtaSystematicsSelector::Process(Long64_t entry)
 
   TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
 
-  if (fdNdEtaCorrection[0])
+  if (fMultiplicityMode == 1 && list->GetEntries() > 20 ||
+      fMultiplicityMode == 2 && list->GetEntries() < 40)
+  {
+    delete list;
+    list = 0;
+    return kTRUE;
+  }
+
+  if (fdNdEtaCorrectionSpecies[0])
     FillCorrectionMaps(list);
 
   if (fSecondaries)
@@ -171,6 +224,81 @@ Bool_t AlidNdEtaSystematicsSelector::Process(Long64_t entry)
   if (fSigmaVertex)
     FillSigmaVertex();
 
+  // stuff for vertex reconstruction correction systematics
+  Bool_t vertexRecoStudy  = kFALSE;
+  Bool_t triggerBiasStudy = kFALSE;
+  if (fdNdEtaCorrectionVertexReco[0]) vertexRecoStudy = kTRUE;
+  if (fdNdEtaCorrectionTriggerBias[0]) triggerBiasStudy = kTRUE;
+
+  if (vertexRecoStudy || triggerBiasStudy) {
+    AliHeader* header = GetHeader();
+    if (!header) {
+      AliDebug(AliLog::kError, "Header not available");
+      return kFALSE;
+    }
+
+    // getting process information
+    Int_t processtype = AliPWG0depHelper::GetPythiaEventProcessType(header);
+
+    AliDebug(AliLog::kInfo, Form("Pythia process type %d.",processtype));
+
+    // can only read pythia headers, either directly or from cocktalil header
+    AliGenEventHeader* genHeader = (AliGenEventHeader*)(header->GenEventHeader());
+    
+    if (!genHeader) {
+      AliDebug(AliLog::kError, "Gen header not available");
+      return kFALSE;
+    }
+
+    // get the MC vertex
+    TArrayF vtxMC(3);
+    genHeader->PrimaryVertex(vtxMC);
+
+    Int_t nGoodTracks = list->GetEntries();
+
+    Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD);
+    Bool_t vertexReconstructed = AliPWG0Helper::IsVertexReconstructed(fESD);
+
+    // non diffractive
+    if (processtype!=92 && processtype!=93 && processtype!=94) { 
+      if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[0]->FillEventAll(vtxMC[2], nGoodTracks);
+
+      if (eventTriggered) {
+        if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[0]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+        if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[0]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+
+        if (vertexReconstructed)
+          if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[0]->FillEventWithTriggerWithReconstructedVertex(vtxMC[2], nGoodTracks);
+      }
+    }
+
+    // single diffractive
+    if (processtype==92 || processtype==93) { 
+      if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[1]->FillEventAll(vtxMC[2], nGoodTracks);
+
+      if (eventTriggered) {
+        if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[1]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+        if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[1]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+
+        if (vertexReconstructed)
+          if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[1]->FillEventWithTriggerWithReconstructedVertex(vtxMC[2], nGoodTracks);
+      }
+    }
+
+    // double diffractive
+    if (processtype==94) { 
+      if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[2]->FillEventAll(vtxMC[2], nGoodTracks);
+
+      if (eventTriggered) {
+        if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[2]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+        if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[2]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+
+        if (vertexReconstructed)
+          if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[2]->FillEventWithTriggerWithReconstructedVertex(vtxMC[2], nGoodTracks);
+      }
+    }
+  }
+
   delete list;
   list = 0;
 
@@ -181,6 +309,8 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
 {
   // fills the correction maps for different particle species
 
+  // TODO fix the use of the FillParticle* functions
+
   AliStack* stack = GetStack();
   AliHeader* header = GetHeader();
 
@@ -209,6 +339,9 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
     if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
       continue;
 
+    if (SignOK(particle->GetPDG()) == kFALSE)
+      continue;
+
     Float_t eta = particle->Eta();
     Float_t pt = particle->Pt();
 
@@ -233,16 +366,16 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
       default: id = 3; break;
     }
 
-    if (vertexReconstructed)
+    if (vertexReconstructed && eventTriggered)
     {
-      fdNdEtaCorrection[id]->FillParticle(vtxMC[2], eta, pt);
+      fdNdEtaCorrectionSpecies[id]->FillParticleVertex(vtxMC[2], eta, pt);
       //if (pt < 0.1)
         fPIDParticles->Fill(particle->GetPdgCode());
     }
 
-    fdNdEtaCorrection[id]->FillParticleAllEvents(eta, pt);
-    if (eventTriggered)
-      fdNdEtaCorrection[id]->FillParticleWhenEventTriggered(eta, pt);
+    //fdNdEtaCorrectionSpecies[id]->FillParticleAllEvents(eta, pt);
+    //if (eventTriggered)
+    // fdNdEtaCorrectionSpecies[id]->FillParticleWhenEventTriggered(eta, pt);
   }// end of mc particle
 
   // loop over esd tracks
@@ -289,6 +422,9 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
     if (!mother)
       continue;
 
+    if (SignOK(mother->GetPDG()) == kFALSE)
+      continue;
+
     //printf("We continue with particle %d (pdg %d)\n", label, mother->GetPdgCode());
 
     Int_t id = -1;
@@ -300,9 +436,9 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
       default:   id = 3; break;
     }
 
-    if (vertexReconstructed)
+    if (vertexReconstructed && eventTriggered)
     {
-      fdNdEtaCorrection[id]->FillParticleWhenMeasuredTrack(vtxMC[2], particle->Eta(), particle->Pt());
+      fdNdEtaCorrectionSpecies[id]->FillParticleTracked(vtxMC[2], particle->Eta(), particle->Pt());
       //if (particle->Pt() < 0.1)
         fPIDTracks->Fill(particle->GetPdgCode());
     }
@@ -312,12 +448,12 @@ void AlidNdEtaSystematicsSelector::FillCorrectionMaps(TObjArray* listOfTracks)
 
   for (Int_t i=0; i<4; ++i)
   {
-    fdNdEtaCorrection[i]->FillEvent(vtxMC[2], nGoodTracks);
+    fdNdEtaCorrectionSpecies[i]->FillEventAll(vtxMC[2], nGoodTracks);
     if (eventTriggered)
     {
-      fdNdEtaCorrection[i]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
+      fdNdEtaCorrectionSpecies[i]->FillEventWithTrigger(vtxMC[2], nGoodTracks);
       if (vertexReconstructed)
-        fdNdEtaCorrection[i]->FillEventWithTriggerWithReconstructedVertex(vtxMC[2], nGoodTracks);
+        fdNdEtaCorrectionSpecies[i]->FillEventWithTriggerWithReconstructedVertex(vtxMC[2], nGoodTracks);
     }
   }
 
@@ -478,11 +614,20 @@ void AlidNdEtaSystematicsSelector::SlaveTerminate()
     fOutput->Add(fSecondaries);
 
   for (Int_t i=0; i<4; ++i)
-    if (fdNdEtaCorrection[i])
-      fOutput->Add(fdNdEtaCorrection[i]);
+    if (fdNdEtaCorrectionSpecies[i])
+      fOutput->Add(fdNdEtaCorrectionSpecies[i]);
 
   if (fSigmaVertex)
     fOutput->Add(fSigmaVertex);
+
+  for (Int_t i=0; i<3; ++i) {
+    if (fdNdEtaCorrectionVertexReco[i])
+      fOutput->Add(fdNdEtaCorrectionVertexReco[i]);
+    
+    if (fdNdEtaCorrectionTriggerBias[i])
+      fOutput->Add(fdNdEtaCorrectionTriggerBias[i]);
+  }
+  
 }
 
 void AlidNdEtaSystematicsSelector::Terminate()
@@ -495,21 +640,42 @@ void AlidNdEtaSystematicsSelector::Terminate()
 
   fSecondaries = dynamic_cast<TH2F*> (fOutput->FindObject("fSecondaries"));
   for (Int_t i=0; i<4; ++i)
-    fdNdEtaCorrection[i] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject(Form("correction_%d", i)));
+    fdNdEtaCorrectionSpecies[i] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject(Form("correction_%d", i)));
   fSigmaVertex = dynamic_cast<TH1F*> (fOutput->FindObject("fSigmaVertex"));
 
+  fdNdEtaCorrectionVertexReco[0] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoND"));
+  fdNdEtaCorrectionVertexReco[1] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoSD"));
+  fdNdEtaCorrectionVertexReco[2] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoDD"));
+
+  fdNdEtaCorrectionTriggerBias[0] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasND"));
+  fdNdEtaCorrectionTriggerBias[1] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasSD"));
+  fdNdEtaCorrectionTriggerBias[2] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasDD"));
+
   if (fPIDParticles)
   {
     TDatabasePDG* pdgDB = new TDatabasePDG;
 
     for (Int_t i=0; i <= fPIDParticles->GetNbinsX()+1; ++i)
       if (fPIDParticles->GetBinContent(i) > 0)
-        printf("PDG = %d (%s): generated: %d, reconstructed: %d, ratio: %f\n", (Int_t) fPIDParticles->GetBinCenter(i), pdgDB->GetParticle((Int_t) fPIDParticles->GetBinCenter(i))->GetName(), (Int_t) fPIDParticles->GetBinContent(i), (Int_t) fPIDTracks->GetBinContent(i), ((fPIDTracks->GetBinContent(i) > 0) ? fPIDParticles->GetBinContent(i) / fPIDTracks->GetBinContent(i) : -1));
+        printf("PDG = %d (%s): generated: %d, reconstructed: %d, ratio: %f\n", 
+              (Int_t) fPIDParticles->GetBinCenter(i), 
+              pdgDB->GetParticle((Int_t) fPIDParticles->GetBinCenter(i))->GetName(), 
+              (Int_t) fPIDParticles->GetBinContent(i), 
+              (Int_t) fPIDTracks->GetBinContent(i), 
+              ((fPIDTracks->GetBinContent(i) > 0) ? fPIDParticles->GetBinContent(i) / fPIDTracks->GetBinContent(i) : -1));
 
     delete pdgDB;
     pdgDB = 0;
   }
 
+  for (Int_t i=0; i<3; ++i) {
+    if (fdNdEtaCorrectionVertexReco[i])
+      fdNdEtaCorrectionVertexReco[i]->Finish();
+    
+    if (fdNdEtaCorrectionTriggerBias[i])
+      fdNdEtaCorrectionTriggerBias[i]->Finish();
+  }
+
   TFile* fout = TFile::Open("systematics.root", "RECREATE");
 
   if (fEsdTrackCuts)
@@ -520,10 +686,18 @@ void AlidNdEtaSystematicsSelector::Terminate()
 
   if (fSigmaVertex)
     fSigmaVertex->Write();
-
+  
   for (Int_t i=0; i<4; ++i)
-    if (fdNdEtaCorrection[i])
-      fdNdEtaCorrection[i]->SaveHistograms();
+    if (fdNdEtaCorrectionSpecies[i])
+      fdNdEtaCorrectionSpecies[i]->SaveHistograms();
+
+  for (Int_t i=0; i<3; ++i) {
+    if (fdNdEtaCorrectionVertexReco[i])
+      fdNdEtaCorrectionVertexReco[i]->SaveHistograms();
+
+    if (fdNdEtaCorrectionTriggerBias[i])
+      fdNdEtaCorrectionTriggerBias[i]->SaveHistograms();
+  }
 
   fout->Write();
   fout->Close();
@@ -540,3 +714,32 @@ void AlidNdEtaSystematicsSelector::Terminate()
     fSigmaVertex->Draw();
   }
 }
+
+Bool_t AlidNdEtaSystematicsSelector::SignOK(TParticlePDG* particle)
+{
+  // returns if a particle with this sign should be counted
+  // this is determined by the value of fSignMode, which should have the same sign
+  // as the charge
+  // if fSignMode is 0 all particles are counted
+
+  if (fSignMode == 0)
+    return kTRUE;
+
+  if (!particle)
+  {
+    printf("WARNING: not counting a particle that does not have a pdg particle\n");
+    return kFALSE;
+  }
+
+  Double_t charge = particle->Charge();
+
+  if (fSignMode > 0)
+    if (charge < 0)
+      return kFALSE;
+
+  if (fSignMode < 0)
+    if (charge > 0)
+      return kFALSE;
+
+  return kTRUE;
+}