3 #include "AlidNdEtaAnalysisMCSelector.h"
9 #include <TParticlePDG.h>
17 #include <AliGenEventHeader.h>
18 #include <AliHeader.h>
21 #include "dNdEta/dNdEtaAnalysis.h"
22 #include "AliPWG0Helper.h"
25 ClassImp(AlidNdEtaAnalysisMCSelector)
27 AlidNdEtaAnalysisMCSelector::AlidNdEtaAnalysisMCSelector() :
31 fdNdEtaAnalysisTrVtx(0),
36 // Constructor. Initialization of pointers
40 AlidNdEtaAnalysisMCSelector::~AlidNdEtaAnalysisMCSelector()
47 void AlidNdEtaAnalysisMCSelector::SlaveBegin(TTree * tree)
49 // The SlaveBegin() function is called after the Begin() function.
50 // When running with PROOF SlaveBegin() is called on each slave server.
51 // The tree argument is deprecated (on PROOF 0 is passed).
53 AliSelectorRL::SlaveBegin(tree);
55 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
56 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr");
57 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx");
58 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
59 for (Int_t i=0; i<3; ++i)
61 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 120, -6, 6);
64 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
68 void AlidNdEtaAnalysisMCSelector::Init(TTree *tree)
70 AliSelectorRL::Init(tree);
72 tree->SetBranchStatus("*", 0);
73 tree->SetBranchStatus("fTriggerMask", 1);
74 tree->SetBranchStatus("fSPDVertex*", 1);
77 Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
79 // fill the dNdEtaAnalysis class from the monte carlo
81 if (AliSelectorRL::Process(entry) == kFALSE)
84 // Check prerequisites
87 AliDebug(AliLog::kError, "ESD branch not available");
91 AliStack* stack = GetStack();
94 AliDebug(AliLog::kError, "Stack not available");
98 AliHeader* header = GetHeader();
101 AliDebug(AliLog::kError, "Header not available");
105 Bool_t vertexReconstructed = AliPWG0Helper::IsVertexReconstructed(fESD);
106 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD);
109 AliGenEventHeader* genHeader = header->GenEventHeader();
112 genHeader->PrimaryVertex(vtxMC);
114 // loop over mc particles
115 Int_t nPrim = stack->GetNprimary();
117 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
119 TParticle* particle = stack->Particle(iMc);
124 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
127 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
129 fdNdEtaAnalysis->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
130 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
134 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
135 if (vertexReconstructed)
136 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
139 if (TMath::Abs(vtxMC[2]) < 10)
141 fPartEta[0]->Fill(particle->Eta());
144 fPartEta[1]->Fill(particle->Eta());
146 fPartEta[2]->Fill(particle->Eta());
149 if (TMath::Abs(particle->Eta()) < 0.8)
150 fPartPt->Fill(particle->Pt());
152 fdNdEtaAnalysis->FillEvent(vtxMC[2], 1);
155 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], 1);
156 if (vertexReconstructed)
157 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], 1);
163 void AlidNdEtaAnalysisMCSelector::SlaveTerminate()
165 // The SlaveTerminate() function is called after all entries or objects
166 // have been processed. When running with PROOF SlaveTerminate() is called
167 // on each slave server.
169 AliSelectorRL::SlaveTerminate();
171 // Add the histograms to the output on each slave server
174 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
178 fOutput->Add(fdNdEtaAnalysis);
179 fOutput->Add(fdNdEtaAnalysisTr);
180 fOutput->Add(fdNdEtaAnalysisTrVtx);
181 fOutput->Add(fPartPt);
182 for (Int_t i=0; i<3; ++i)
183 fOutput->Add(fPartEta[i]);
186 void AlidNdEtaAnalysisMCSelector::Terminate()
190 AliSelectorRL::Terminate();
192 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
193 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
194 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
195 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
196 for (Int_t i=0; i<3; ++i)
197 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
199 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
201 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
205 fdNdEtaAnalysis->Finish(0, -1);
206 fdNdEtaAnalysisTr->Finish(0, -1);
207 fdNdEtaAnalysisTrVtx->Finish(0, -1);
209 Int_t events = (Int_t) fdNdEtaAnalysis->GetVtxHistogram()->Integral();
210 fPartPt->Scale(1.0/events);
211 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
215 TH1* vtxHist = fdNdEtaAnalysis->GetVtxHistogram();
216 Int_t events1 = (Int_t) vtxHist->Integral(vtxHist->GetXaxis()->FindBin(-9.9), vtxHist->GetXaxis()->FindBin(-0.1));
217 Int_t events2 = (Int_t) vtxHist->Integral(vtxHist->GetXaxis()->FindBin(0.1), vtxHist->GetXaxis()->FindBin(9.9));
219 fPartEta[0]->Scale(1.0 / (events1 + events2));
220 fPartEta[1]->Scale(1.0 / events1);
221 fPartEta[2]->Scale(1.0 / events2);
223 for (Int_t i=0; i<3; ++i)
224 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
226 new TCanvas("control", "control", 500, 500);
227 for (Int_t i=0; i<3; ++i)
229 fPartEta[i]->SetLineColor(i+1);
230 fPartEta[i]->Draw((i==0) ? "" : "SAME");
234 TFile* fout = new TFile("analysis_mc.root","RECREATE");
236 fdNdEtaAnalysis->SaveHistograms();
237 fdNdEtaAnalysisTr->SaveHistograms();
238 fdNdEtaAnalysisTrVtx->SaveHistograms();
246 new TCanvas("control2", "control2", 500, 500);