]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG0/dNdEta/AlidNdEtaAnalysisMCSelector.cxx
o) proper splitting of STEER dependent classes (PWG0dep) and ESD dependent classes
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / AlidNdEtaAnalysisMCSelector.cxx
index f62fb3f8405eaae5c7e8fd268a44d8c2f88ab830..05ba91adcf967ecb6274eea542c0cb6414b157ed 100644 (file)
@@ -1,3 +1,5 @@
+/* $Id$ */
+
 #include "AlidNdEtaAnalysisMCSelector.h"
 
 #include <TStyle.h>
@@ -6,19 +8,26 @@
 #include <TParticle.h>
 #include <TParticlePDG.h>
 #include <TVector3.h>
+#include <TH1F.h>
+#include <TH3F.h>
+#include <TTree.h>
+#include <TFile.h>
 
 #include <AliLog.h>
 #include <AliGenEventHeader.h>
-#include <AliTracker.h>
+#include <AliHeader.h>
+
+#include "dNdEta/dNdEtaAnalysis.h"
 
-#include "../esdTrackCuts/AliESDtrackCuts.h"
-#include "dNdEtaCorrection.h"
-#include "dNdEtaAnalysis.h"
 
 ClassImp(AlidNdEtaAnalysisMCSelector)
 
-AlidNdEtaAnalysisMCSelector::AlidNdEtaAnalysisMCSelector(TTree * tree) :
-  AlidNdEtaAnalysisSelector(tree)
+AlidNdEtaAnalysisMCSelector::AlidNdEtaAnalysisMCSelector() :
+  AliSelectorRL(),
+  fdNdEtaAnalysis(0),
+  fVertex(0),
+  fPartEta(0),
+  fEvents(0)
 {
   //
   // Constructor. Initialization of pointers
@@ -32,26 +41,51 @@ AlidNdEtaAnalysisMCSelector::~AlidNdEtaAnalysisMCSelector()
   //
 }
 
+void AlidNdEtaAnalysisMCSelector::SlaveBegin(TTree * tree)
+{
+  // The SlaveBegin() function is called after the Begin() function.
+  // When running with PROOF SlaveBegin() is called on each slave server.
+  // The tree argument is deprecated (on PROOF 0 is passed).
+
+  AliSelectorRL::SlaveBegin(tree);
+
+  fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
+}
+
 void AlidNdEtaAnalysisMCSelector::Init(TTree *tree)
 {
-   AlidNdEtaAnalysisSelector::Init(tree);
+  AliSelectorRL::Init(tree);
 
   tree->SetBranchStatus("ESD", 0);
+
+  fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
+  fPartEta = new TH1F("dndeta_check", "dndeta_check", 120, -6, 6);
+  fPartEta->Sumw2();
 }
 
 Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
 {
-  //
+  // fill the dNdEtaAnalysis class from the monte carlo
 
-  if (AliSelector::Process(entry) == kFALSE)
+  if (AliSelectorRL::Process(entry) == kFALSE)
     return kFALSE;
 
   TTree* particleTree = GetKinematics();
-  if (!fHeader || !particleTree)
+  if (!particleTree)
+  {
+    AliDebug(AliLog::kError, "Kinematics not available");
+    return kFALSE;
+  }
+
+  AliHeader* header = GetHeader();
+  if (!header)
+  {
+    AliDebug(AliLog::kError, "Header not available");
     return kFALSE;
+  }
 
   // get the MC vertex
-  AliGenEventHeader* genHeader = fHeader->GenEventHeader();
+  AliGenEventHeader* genHeader = header->GenEventHeader();
 
   TArrayF vtxMC(3);
   genHeader->PrimaryVertex(vtxMC);
@@ -62,12 +96,15 @@ Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
   particleTree->SetBranchStatus("fPx", 1);
   particleTree->SetBranchStatus("fPy", 1);
   particleTree->SetBranchStatus("fPz", 1);
-  
+  particleTree->SetBranchStatus("fVx", 1);
+  particleTree->SetBranchStatus("fVy", 1);
+  particleTree->SetBranchStatus("fVz", 1);
+
   TParticle* particle = 0;
   particleTree->SetBranchAddress("Particles", &particle);
 
-  Int_t nPrim  = fHeader->GetNprimary();
-  Int_t nTotal = fHeader->GetNtrack();
+  Int_t nPrim  = header->GetNprimary();
+  Int_t nTotal = header->GetNtrack();
 
   for (Int_t i_mc = nTotal - nPrim; i_mc < nTotal; ++i_mc)
   {
@@ -79,9 +116,68 @@ Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
     if (IsPrimaryCharged(particle, nPrim) == kFALSE)
       continue;
 
-    fdNdEtaAnalysis->FillTrack(vtxMC[2], particle->Eta(), 1);
+    AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", i_mc, particle->GetUniqueID()));
+
+    fdNdEtaAnalysis->FillTrack(vtxMC[2], particle->Eta());
+    fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
+
+    fPartEta->Fill(particle->Eta());
   }
   fdNdEtaAnalysis->FillEvent(vtxMC[2]);
 
+  ++fEvents;
+
   return kTRUE;
 }
+
+void AlidNdEtaAnalysisMCSelector::SlaveTerminate()
+{
+  // The SlaveTerminate() function is called after all entries or objects
+  // have been processed. When running with PROOF SlaveTerminate() is called
+  // on each slave server.
+
+  AliSelectorRL::SlaveTerminate();
+
+  // Add the histograms to the output on each slave server
+  if (!fOutput)
+  {
+    AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
+    return;
+  }
+
+  fOutput->Add(fdNdEtaAnalysis);
+}
+
+void AlidNdEtaAnalysisMCSelector::Terminate()
+{
+  //
+
+  AliSelectorRL::Terminate();
+
+  fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
+
+  if (!fdNdEtaAnalysis)
+  {
+    AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p", (void*) fdNdEtaAnalysis));
+    return;
+  }
+
+  TFile* fout = new TFile("analysis_mc.root","RECREATE");
+
+  fdNdEtaAnalysis->SaveHistograms();
+
+  fout->Write();
+  fout->Close();
+
+  fPartEta->Scale(1.0/fEvents);
+  fPartEta->Scale(1.0/fPartEta->GetBinWidth(1));
+
+  TCanvas* canvas = new TCanvas("control", "control", 900, 450);
+  canvas->Divide(2, 1);
+
+  canvas->cd(1);
+  fVertex->Draw();
+
+  canvas->cd(2);
+  fPartEta->Draw();
+}