]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG0/dNdEta/AlidNdEtaAnalysisMCSelector.cxx
more plots
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / AlidNdEtaAnalysisMCSelector.cxx
CommitLineData
dc740de4 1/* $Id$ */
2
4dd2ad81 3#include "AlidNdEtaAnalysisMCSelector.h"
4
5#include <TStyle.h>
6#include <TSystem.h>
7#include <TCanvas.h>
8#include <TParticle.h>
9#include <TParticlePDG.h>
10#include <TVector3.h>
5af55649 11#include <TH1F.h>
dc740de4 12#include <TH3F.h>
7029240a 13#include <TTree.h>
16e24ca3 14#include <TFile.h>
4dd2ad81 15
16#include <AliLog.h>
17#include <AliGenEventHeader.h>
7029240a 18#include <AliHeader.h>
0bd1f8a0 19#include <AliStack.h>
4dd2ad81 20
16e24ca3 21#include "dNdEta/dNdEtaAnalysis.h"
45e97e28 22#include "AliPWG0Helper.h"
4dd2ad81 23
dc740de4 24
4dd2ad81 25ClassImp(AlidNdEtaAnalysisMCSelector)
26
dc740de4 27AlidNdEtaAnalysisMCSelector::AlidNdEtaAnalysisMCSelector() :
16e24ca3 28 AliSelectorRL(),
29 fdNdEtaAnalysis(0),
c69449cc 30 fdNdEtaAnalysisTr(0),
31 fdNdEtaAnalysisTrVtx(0),
5af55649 32 fVertex(0),
c69449cc 33 fPartPt(0)
4dd2ad81 34{
35 //
36 // Constructor. Initialization of pointers
37 //
38}
39
40AlidNdEtaAnalysisMCSelector::~AlidNdEtaAnalysisMCSelector()
41{
42 //
43 // Destructor
44 //
45}
46
16e24ca3 47void AlidNdEtaAnalysisMCSelector::SlaveBegin(TTree * tree)
48{
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).
52
53 AliSelectorRL::SlaveBegin(tree);
54
55 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
c69449cc 56 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr");
57 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx");
0bd1f8a0 58 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
c69449cc 59 for (Int_t i=0; i<3; ++i)
60 {
61 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 120, -6, 6);
62 fPartEta[i]->Sumw2();
63 }
4c351225 64 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
c69449cc 65 fPartPt->Sumw2();
16e24ca3 66}
67
944f0536 68void AlidNdEtaAnalysisMCSelector::Init(TTree *tree)
69{
16e24ca3 70 AliSelectorRL::Init(tree);
944f0536 71
4c351225 72 tree->SetBranchStatus("*", 0);
c69449cc 73 tree->SetBranchStatus("fTriggerMask", 1);
74 tree->SetBranchStatus("fSPDVertex*", 1);
944f0536 75}
76
4dd2ad81 77Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
78{
16e24ca3 79 // fill the dNdEtaAnalysis class from the monte carlo
4dd2ad81 80
16e24ca3 81 if (AliSelectorRL::Process(entry) == kFALSE)
4dd2ad81 82 return kFALSE;
83
c69449cc 84 // Check prerequisites
85 if (!fESD)
86 {
87 AliDebug(AliLog::kError, "ESD branch not available");
88 return kFALSE;
89 }
90
0bd1f8a0 91 AliStack* stack = GetStack();
92 if (!stack)
dc740de4 93 {
0bd1f8a0 94 AliDebug(AliLog::kError, "Stack not available");
4dd2ad81 95 return kFALSE;
dc740de4 96 }
97
98 AliHeader* header = GetHeader();
99 if (!header)
100 {
101 AliDebug(AliLog::kError, "Header not available");
102 return kFALSE;
103 }
4dd2ad81 104
c69449cc 105 Bool_t vertexReconstructed = AliPWG0Helper::IsVertexReconstructed(fESD);
106 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD);
107
4dd2ad81 108 // get the MC vertex
dc740de4 109 AliGenEventHeader* genHeader = header->GenEventHeader();
4dd2ad81 110
111 TArrayF vtxMC(3);
112 genHeader->PrimaryVertex(vtxMC);
113
0bd1f8a0 114 // loop over mc particles
115 Int_t nPrim = stack->GetNprimary();
4dd2ad81 116
0bd1f8a0 117 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
4dd2ad81 118 {
0bd1f8a0 119 TParticle* particle = stack->Particle(iMc);
4dd2ad81 120
121 if (!particle)
122 continue;
123
45e97e28 124 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
4dd2ad81 125 continue;
126
0bd1f8a0 127 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
dc740de4 128
45e97e28 129 fdNdEtaAnalysis->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
dc740de4 130 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
5af55649 131
c69449cc 132 if (eventTriggered)
133 {
134 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
135 if (vertexReconstructed)
136 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], particle->Eta(), particle->Pt(), 1);
137 }
138
139 if (TMath::Abs(vtxMC[2]) < 10)
140 {
141 fPartEta[0]->Fill(particle->Eta());
142
143 if (vtxMC[2] < 0)
144 fPartEta[1]->Fill(particle->Eta());
145 else
146 fPartEta[2]->Fill(particle->Eta());
147 }
4c351225 148
149 if (TMath::Abs(particle->Eta()) < 0.8)
150 fPartPt->Fill(particle->Pt());
4dd2ad81 151 }
45e97e28 152 fdNdEtaAnalysis->FillEvent(vtxMC[2], 1);
c69449cc 153 if (eventTriggered)
154 {
155 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], 1);
156 if (vertexReconstructed)
157 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], 1);
158 }
5af55649 159
4dd2ad81 160 return kTRUE;
161}
dc740de4 162
16e24ca3 163void AlidNdEtaAnalysisMCSelector::SlaveTerminate()
164{
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.
168
169 AliSelectorRL::SlaveTerminate();
170
171 // Add the histograms to the output on each slave server
172 if (!fOutput)
173 {
174 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
175 return;
176 }
177
178 fOutput->Add(fdNdEtaAnalysis);
c69449cc 179 fOutput->Add(fdNdEtaAnalysisTr);
180 fOutput->Add(fdNdEtaAnalysisTrVtx);
4c351225 181 fOutput->Add(fPartPt);
c69449cc 182 for (Int_t i=0; i<3; ++i)
183 fOutput->Add(fPartEta[i]);
16e24ca3 184}
185
dc740de4 186void AlidNdEtaAnalysisMCSelector::Terminate()
187{
16e24ca3 188 //
189
190 AliSelectorRL::Terminate();
191
192 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
c69449cc 193 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
194 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
4c351225 195 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
c69449cc 196 for (Int_t i=0; i<3; ++i)
197 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
16e24ca3 198
c69449cc 199 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
16e24ca3 200 {
4c351225 201 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
16e24ca3 202 return;
203 }
204
d09fb536 205 fdNdEtaAnalysis->Finish(0, -1);
c69449cc 206 fdNdEtaAnalysisTr->Finish(0, -1);
207 fdNdEtaAnalysisTrVtx->Finish(0, -1);
208
209 Int_t events = (Int_t) fdNdEtaAnalysis->GetVtxHistogram()->Integral();
210 fPartPt->Scale(1.0/events);
211 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
212
213 if (fPartEta[0])
214 {
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));
218
219 fPartEta[0]->Scale(1.0 / (events1 + events2));
220 fPartEta[1]->Scale(1.0 / events1);
221 fPartEta[2]->Scale(1.0 / events2);
222
223 for (Int_t i=0; i<3; ++i)
224 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
225
226 new TCanvas("control", "control", 500, 500);
227 for (Int_t i=0; i<3; ++i)
228 {
229 fPartEta[i]->SetLineColor(i+1);
230 fPartEta[i]->Draw((i==0) ? "" : "SAME");
231 }
232 }
d09fb536 233
16e24ca3 234 TFile* fout = new TFile("analysis_mc.root","RECREATE");
235
236 fdNdEtaAnalysis->SaveHistograms();
c69449cc 237 fdNdEtaAnalysisTr->SaveHistograms();
238 fdNdEtaAnalysisTrVtx->SaveHistograms();
239 fPartPt->Write();
16e24ca3 240
241 fout->Write();
242 fout->Close();
dc740de4 243
4c351225 244 if (fPartPt)
245 {
4c351225 246 new TCanvas("control2", "control2", 500, 500);
c69449cc 247 fPartPt->DrawCopy();
4c351225 248 }
dc740de4 249}