+/* $Id$ */
+
#include "AlidNdEtaAnalysisMCSelector.h"
#include <TStyle.h>
#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
//
}
+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);
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)
{
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();
+}