]>
Commit | Line | Data |
---|---|---|
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 | 25 | ClassImp(AlidNdEtaAnalysisMCSelector) |
26 | ||
dc740de4 | 27 | AlidNdEtaAnalysisMCSelector::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 | ||
40 | AlidNdEtaAnalysisMCSelector::~AlidNdEtaAnalysisMCSelector() | |
41 | { | |
42 | // | |
43 | // Destructor | |
44 | // | |
45 | } | |
46 | ||
16e24ca3 | 47 | void 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 | 68 | void 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 | 77 | Bool_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 | 163 | void 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 | 186 | void 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 | } |