updating makefile to include evgen headers to compile systematics selector
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / drawPlots.C
CommitLineData
1afae8ff 1/* $Id$ */
2
0ab29cfa 3#if !defined(__CINT__) || defined(__MAKECINT__)
4
5#include "AliPWG0Helper.h"
6#include "dNdEtaAnalysis.h"
7#include "AlidNdEtaCorrection.h"
8
9#include <TCanvas.h>
10#include <TFile.h>
11#include <TH1.h>
12#include <TH2F.h>
13#include <TH3F.h>
14#include <TLine.h>
15#include <TSystem.h>
16
17#endif
18
25db2d85 19Int_t gMax = 5;
20
0ab29cfa 21extern TSystem* gSystem;
22
23void SetRanges(TAxis* axis)
92d2d8ad 24{
0ab29cfa 25 if (strcmp(axis->GetTitle(), "#eta") == 0)
26 axis->SetRangeUser(-1.7999, 1.7999);
27 if (strcmp(axis->GetTitle(), "p_{T} [GeV/c]") == 0)
28 axis->SetRangeUser(0, 9.9999);
29 if (strcmp(axis->GetTitle(), "vtx z [cm]") == 0)
30 axis->SetRangeUser(-15, 14.9999);
31 if (strcmp(axis->GetTitle(), "Ntracks") == 0)
32 axis->SetRangeUser(0, 99.9999);
25db2d85 33}
34
0ab29cfa 35void SetRanges(TH1* hist)
25db2d85 36{
0ab29cfa 37 SetRanges(hist->GetXaxis());
38 SetRanges(hist->GetYaxis());
39 SetRanges(hist->GetZaxis());
40}
25db2d85 41
0ab29cfa 42
43void Prepare3DPlot(TH3* hist)
44{
45 hist->GetXaxis()->SetTitleOffset(1.5);
46 hist->GetYaxis()->SetTitleOffset(1.5);
47 hist->GetZaxis()->SetTitleOffset(1.5);
48
49 hist->SetStats(kFALSE);
50}
51
52void Prepare2DPlot(TH2* hist)
53{
54 hist->SetStats(kFALSE);
55 hist->GetYaxis()->SetTitleOffset(1.4);
56
57 hist->SetMinimum(0);
58 hist->SetMaximum(gMax);
59
60 SetRanges(hist);
61}
62
63void Prepare1DPlot(TH1* hist)
64{
65 hist->SetLineWidth(2);
66 hist->SetStats(kFALSE);
67
72e597d7 68 hist->GetXaxis()->SetLabelOffset(0.02);
69 hist->GetXaxis()->SetTitleOffset(1.3);
70 hist->GetYaxis()->SetTitleOffset(1.3);
71
0ab29cfa 72 SetRanges(hist);
73}
74
75void InitPad()
76{
77 gPad->Range(0, 0, 1, 1);
78 gPad->SetLeftMargin(0.15);
79 //gPad->SetRightMargin(0.05);
80 //gPad->SetTopMargin(0.13);
72e597d7 81 gPad->SetBottomMargin(0.12);
0ab29cfa 82
72e597d7 83 gPad->SetGridx();
84 gPad->SetGridy();
0ab29cfa 85}
86
87void InitPadCOLZ()
88{
89 gPad->Range(0, 0, 1, 1);
90 gPad->SetRightMargin(0.15);
91 gPad->SetLeftMargin(0.12);
92
93 gPad->SetGridx();
94 gPad->SetGridy();
d09fb536 95}
96
0ab29cfa 97void dNdEta(Bool_t onlyESD = kFALSE)
d09fb536 98{
99 TFile* file = TFile::Open("analysis_esd.root");
0ab29cfa 100 TH1* histESD = (TH1*) file->Get("dndeta/dndeta_dNdEta_corrected_2");
101 TH1* histESDNoPt = (TH1*) file->Get("dndeta/dndeta_dNdEta_2");
102 TH1* histESDMB = (TH1*) file->Get("dndeta_mb/dndeta_mb_dNdEta_corrected_2");
103 TH1* histESDMBVtx = (TH1*) file->Get("dndeta_mbvtx/dndeta_mbvtx_dNdEta_corrected_2");
d09fb536 104
105 TCanvas* canvas = new TCanvas("dNdEta1", "dNdEta1", 500, 500);
106
107 Prepare1DPlot(histESD);
108 Prepare1DPlot(histESDNoPt);
109 Prepare1DPlot(histESDMB);
110 Prepare1DPlot(histESDMBVtx);
111
72e597d7 112 histESD->SetLineColor(0);
113 histESDMB->SetLineColor(0);
114 histESDMBVtx->SetLineColor(0);
115
116 histESD->SetMarkerColor(kRed);
117 histESDMB->SetMarkerColor(kBlue);
118 histESDMBVtx->SetMarkerColor(103);
119
120 histESD->SetMarkerStyle(20);
121 histESDMB->SetMarkerStyle(21);
122 histESDMBVtx->SetMarkerStyle(22);
d09fb536 123
124 TH2F* dummy = new TH2F("dummy", "", 100, -1.5, 1.5, 100, 0, histESDMBVtx->GetMaximum() * 1.1);
72e597d7 125 Prepare1DPlot(dummy);
d09fb536 126 dummy->SetStats(kFALSE);
127 dummy->SetXTitle("#eta");
72e597d7 128 dummy->SetYTitle("dN_{ch}/d#eta");
129 dummy->GetYaxis()->SetTitleOffset(1);
d09fb536 130
131 histESDMBVtx->GetXaxis()->SetRangeUser(-0.7999, 0.7999);
132 histESDMB->GetXaxis()->SetRangeUser(-0.7999, 0.7999);
133 histESD->GetXaxis()->SetRangeUser(-0.7999, 0.7999);
134 histESDNoPt->GetXaxis()->SetRangeUser(-0.7999, 0.7999);
135
0ab29cfa 136 dummy->DrawCopy();
d09fb536 137 histESDMBVtx->Draw("SAME");
138 histESDMB->Draw("SAME");
139 histESD->Draw("SAME");
140
141 canvas->SaveAs("dNdEta1.gif");
0ab29cfa 142 canvas->SaveAs("dNdEta1.eps");
143
144 if (onlyESD)
145 return;
d09fb536 146
147 TFile* file2 = TFile::Open("analysis_mc.root");
0ab29cfa 148 TH1* histMC = (TH1*) file2->Get("dndeta/dndeta_dNdEta_corrected_2")->Clone("cloned");
d09fb536 149
150 gSystem->Load("libPWG0base");
0ab29cfa 151 dNdEtaAnalysis* fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
d09fb536 152 fdNdEtaAnalysis->LoadHistograms();
153 fdNdEtaAnalysis->Finish(0, 0.3);
154 TH1* histMCPtCut = fdNdEtaAnalysis->GetdNdEtaHistogram(2);
155
156 TCanvas* canvas2 = new TCanvas("dNdEta2", "dNdEta2", 500, 500);
157
158 Prepare1DPlot(histMC);
159 Prepare1DPlot(histMCPtCut);
160
161 histMC->SetLineColor(kBlue);
162 histMCPtCut->SetLineColor(104);
163 histESDNoPt->SetLineColor(102);
164
0ab29cfa 165 TH2* dummy2 = (TH2F*) dummy->Clone("dummy2");
72e597d7 166 Prepare1DPlot(dummy2);
d09fb536 167 dummy2->GetYaxis()->SetRangeUser(0, histESD->GetMaximum() * 1.1);
168
0ab29cfa 169 dummy2->DrawCopy();
d09fb536 170 histMC->Draw("SAME");
171// histMC->Draw();
172 histESD->Draw("SAME");
173 histESDNoPt->Draw("SAME");
174 histMCPtCut->Draw("SAME");
175
176 canvas2->SaveAs("dNdEta2.gif");
0ab29cfa 177 canvas2->SaveAs("dNdEta2.eps");
178
72e597d7 179 TCanvas* canvas3 = new TCanvas("dNdEta", "dNdEta", 700, 500);
180 //InitPad();
181 gPad->SetBottomMargin(0.12);
0ab29cfa 182
72e597d7 183 TLegend* legend = new TLegend(0.35, 0.2, 0.6, 0.4);
184 legend->SetFillColor(0);
185 legend->AddEntry(histESDMBVtx, "triggered, vertex");
186 legend->AddEntry(histESDMB, "triggered");
187 legend->AddEntry(histESD, "all events");
188 legend->AddEntry(histMC, "MC prediction");
0ab29cfa 189
72e597d7 190 dummy->DrawCopy();
0ab29cfa 191 histESDMBVtx->Draw("SAME");
192 histESDMB->Draw("SAME");
193 histESD->Draw("SAME");
0ab29cfa 194 histMC->Draw("SAME");
72e597d7 195
196 legend->Draw();
0ab29cfa 197
198 canvas3->SaveAs("dNdEta.gif");
199 canvas3->SaveAs("dNdEta.eps");
72e597d7 200
201 TH1* ratio = (TH1*) histMC->Clone("ratio");
202 TH1* ratioNoPt = (TH1*) histMCPtCut->Clone("ratioNoPt");
203
204 ratio->Divide(histESD);
205 ratioNoPt->Divide(histESDNoPt);
206
207 TCanvas* canvas4 = new TCanvas("ratio", "ratio", 700, 500);
208
209 ratio->GetXaxis()->SetRangeUser(-0.7999, 0.7999);
210
211 ratio->SetLineColor(1);
212 ratioNoPt->SetLineColor(2);
213
214 ratio->Draw();
215 ratioNoPt->Draw("SAME");
216
d09fb536 217}
218
219void ptSpectrum()
220{
221 TFile* file = TFile::Open("analysis_esd.root");
0ab29cfa 222 TH1* histESD = (TH1*) file->Get("dndeta/dndeta_pt");
d09fb536 223
224 TFile* file2 = TFile::Open("analysis_mc.root");
0ab29cfa 225 TH1* histMC = (TH1*) file2->Get("dndeta/dndeta_pt");
d09fb536 226
227 TCanvas* canvas = new TCanvas("ptSpectrum", "ptSpectrum", 500, 500);
228 InitPad();
229 gPad->SetLogy();
230
231 Prepare1DPlot(histMC);
232 Prepare1DPlot(histESD);
233
234 histESD->SetTitle("");
25db2d85 235 histESD->GetXaxis()->SetTitle("p_{T} [GeV/c]");
236 histESD->GetYaxis()->SetTitle("#frac{dN}{d#eta dp_{T}} [c/GeV]");
d09fb536 237
238 histMC->SetLineColor(kBlue);
239 histESD->SetLineColor(kRed);
240
241 histESD->GetYaxis()->SetTitleOffset(1.5);
242 histESD->GetXaxis()->SetRangeUser(0, 4.9999);
243
244 histESD->SetMaximum(TMath::Max(histESD->GetMaximum(), histMC->GetMaximum()) * 2);
245
246 histESD->Draw();
247 histMC->Draw("SAME");
248
249 canvas->SaveAs("ptSpectrum.gif");
0ab29cfa 250 canvas->SaveAs("ptSpectrum.eps");
92d2d8ad 251}
252
253void ptCutoff()
254{
255 gSystem->Load("libPWG0base");
256
8b3563f4 257 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection("dndeta_correction", "dndeta_correction");
92d2d8ad 258 dNdEtaCorrection->LoadHistograms("correction_map.root","dndeta_correction");
259
72e597d7 260 dNdEtaCorrection->GetMeasuredFraction(0.3, -100, kTRUE);
92d2d8ad 261
72e597d7 262 TH1* hist = dynamic_cast<TH1*> (gROOT->FindObject("gene_dndeta_correction_nTrackToNPart_pt")->Clone("ptcutoff"));
92d2d8ad 263
264 hist->GetXaxis()->SetRangeUser(0, 0.9999);
265 hist->SetMinimum(0);
92d2d8ad 266
267 hist->SetTitle("Generated Particles");
d09fb536 268 Prepare1DPlot(hist);
92d2d8ad 269
72e597d7 270 TCanvas* canvas = new TCanvas("ptCutoff", "ptCutoff", 700, 500);
271 hist->DrawCopy();
92d2d8ad 272
d09fb536 273 TLine* line = new TLine(0.3, 0 - hist->GetMaximum() * 0, 0.3, hist->GetMaximum() * 1.1);
92d2d8ad 274 line->SetLineWidth(3);
d09fb536 275 line->SetLineColor(kRed);
92d2d8ad 276 line->Draw();
277
278 canvas->SaveAs("ptCutoff.gif");
0ab29cfa 279 canvas->SaveAs("ptCutoff.eps");
72e597d7 280
281 TH1F* factor = new TH1F("factor", ";#eta;correction factor", 10, -1, 1.000001);
282 for (Float_t eta = -0.9; eta<1; eta += 0.2)
283 factor->Fill(eta, 1.0 / dNdEtaCorrection->GetMeasuredFraction(0.3, eta, kFALSE));
284
285 TCanvas* canvas = new TCanvas("ptCutoff_factor", "ptCutoff_factor", 700, 500);
286 InitPad();
287
288 Prepare1DPlot(factor);
289 factor->GetYaxis()->SetRangeUser(1, 2);
290 factor->GetYaxis()->SetTitleOffset(1);
291 factor->Draw();
292
293 canvas->SaveAs("ptCutoff_factor.eps");
92d2d8ad 294}
295
0bd1f8a0 296void TriggerBiasVtxRecon(const char* fileName = "correction_map.root", const char* folder = "dndeta_correction")
92d2d8ad 297{
0ab29cfa 298 TFile* file = TFile::Open(fileName);
299
0bd1f8a0 300 TH2* corrTrigger = dynamic_cast<TH2*> (file->Get(Form("%s/corr_%s_trigger", folder, folder)));
301 TH2* corrVtx = dynamic_cast<TH2*> (file->Get(Form("%s/corr_%s_vtxReco", folder, folder)));
0ab29cfa 302
303 Prepare2DPlot(corrTrigger);
304 corrTrigger->SetTitle("a) Trigger bias correction");
305
306 Prepare2DPlot(corrVtx);
307 corrVtx->SetTitle("b) Vertex reconstruction correction");
308
5c495d37 309 corrTrigger->GetYaxis()->SetTitle("Multiplicity");
310 corrVtx->GetYaxis()->SetTitle("Multiplicity");
311
0ab29cfa 312 TCanvas* canvas = new TCanvas("TriggerBiasVtxRecon", "TriggerBiasVtxRecon", 1000, 500);
313 canvas->Divide(2, 1);
314
315 canvas->cd(1);
316 InitPadCOLZ();
317 corrTrigger->DrawCopy("COLZ");
318
319 canvas->cd(2);
320 InitPadCOLZ();
321 corrVtx->DrawCopy("COLZ");
322
323 canvas->SaveAs(Form("TriggerBiasVtxRecon_%d.gif", gMax));
324 canvas->SaveAs(Form("TriggerBiasVtxRecon_%d.eps", gMax));
325
326 canvas = new TCanvas("TriggerBiasVtxReconZoom", "TriggerBiasVtxReconZoom", 1000, 500);
327 canvas->Divide(2, 1);
328
329 corrTrigger->GetYaxis()->SetRangeUser(0, 5);
330 corrVtx->GetYaxis()->SetRangeUser(0, 5);
331
332 canvas->cd(1);
333 InitPadCOLZ();
334 corrTrigger->DrawCopy("COLZ");
335
336 canvas->cd(2);
337 InitPadCOLZ();
338 corrVtx->DrawCopy("COLZ");
339
340 canvas->SaveAs(Form("TriggerBiasVtxReconZoom_%d.gif", gMax));
341 canvas->SaveAs(Form("TriggerBiasVtxReconZoom_%d.eps", gMax));
342}
343
344void TriggerBias(const char* fileName = "correction_map.root")
345{
346 TFile* file = TFile::Open(fileName);
92d2d8ad 347
5c495d37 348 TH2* corr = dynamic_cast<TH2*> (file->Get("dndeta_correction/corr_dndeta_correction_trigger"));
92d2d8ad 349
350 Prepare2DPlot(corr);
351 corr->SetTitle("Trigger bias correction");
352
353 TCanvas* canvas = new TCanvas("TriggerBias", "TriggerBias", 500, 500);
354 InitPadCOLZ();
355 corr->DrawCopy("COLZ");
356
25db2d85 357 canvas->SaveAs(Form("TriggerBias_%d.gif", gMax));
0ab29cfa 358 canvas->SaveAs(Form("TriggerBias_%d.eps", gMax));
92d2d8ad 359
360 corr->GetYaxis()->SetRangeUser(0, 5);
361
362 canvas = new TCanvas("TriggerBiasZoom", "TriggerBiasZoom", 500, 500);
363 InitPadCOLZ();
364 corr->DrawCopy("COLZ");
365
25db2d85 366 canvas->SaveAs(Form("TriggerBiasZoom_%d.gif", gMax));
0ab29cfa 367 canvas->SaveAs(Form("TriggerBiasZoom_%d.eps", gMax));
92d2d8ad 368}
369
72e597d7 370void TriggerBias1D(const char* fileName = "correction_map.root", const char* folderName = "dndeta_correction")
371{
372 gSystem->Load("libPWG0base");
373
374 TFile* file = TFile::Open(fileName);
375 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(folderName, folderName);
376 dNdEtaCorrection->LoadHistograms(fileName, folderName);
377
378 TH1* hist = dNdEtaCorrection->GetTriggerCorrection()->Get1DCorrection("x");
379
380 TCanvas* canvas = new TCanvas("TriggerBias1D", "TriggerBias1D", 500, 500);
381 InitPad();
382
383 Prepare1DPlot(hist);
384 hist->SetTitle("");
385 hist->GetYaxis()->SetTitle("correction factor");
386 hist->GetYaxis()->SetRangeUser(1, 1.5);
387 hist->GetYaxis()->SetTitleOffset(1.6);
388 hist->Draw();
389
390 canvas->SaveAs("TriggerBias1D.eps");
391}
392
92d2d8ad 393void VtxRecon()
394{
395 TFile* file = TFile::Open("correction_map.root");
396
72e597d7 397 TH2* corr = dynamic_cast<TH2*> (file->Get("dndeta_correction/corr_dndeta_correction_vtxReco"));
92d2d8ad 398
399 Prepare2DPlot(corr);
400 corr->SetTitle("Vertex reconstruction correction");
401
402 TCanvas* canvas = new TCanvas("VtxRecon", "VtxRecon", 500, 500);
403 InitPadCOLZ();
25db2d85 404 corr->DrawCopy("COLZ");
405
0ab29cfa 406 canvas->SaveAs(Form("VtxRecon_%d.eps", gMax));
407 canvas->SaveAs(Form("VtxRecon_%d.eps", gMax));
25db2d85 408
409 corr->GetYaxis()->SetRangeUser(0, 5);
410
0ab29cfa 411 canvas = new TCanvas("VtxReconZoom", "VtxReconZoom", 500, 500);
25db2d85 412 InitPadCOLZ();
413 corr->DrawCopy("COLZ");
92d2d8ad 414
25db2d85 415 canvas->SaveAs(Form("VtxReconZoom_%d.gif", gMax));
0ab29cfa 416 canvas->SaveAs(Form("VtxReconZoom_%d.eps", gMax));
92d2d8ad 417}
418
72e597d7 419void VtxRecon1D(const char* fileName = "correction_map.root", const char* folderName = "dndeta_correction")
420{
421 gSystem->Load("libPWG0base");
422
423 TFile* file = TFile::Open(fileName);
424 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(folderName, folderName);
425 dNdEtaCorrection->LoadHistograms(fileName, folderName);
426
427 TH1* hist = dNdEtaCorrection->GetVertexRecoCorrection()->Get1DCorrection("x");
428
429 TCanvas* canvas = new TCanvas("VtxRecon1D", "VtxRecon1D", 500, 500);
430 InitPad();
431
432 Prepare1DPlot(hist);
433 hist->SetTitle("");
434 hist->GetYaxis()->SetTitle("correction factor");
435 hist->GetYaxis()->SetRangeUser(1, 1.8);
436 hist->GetYaxis()->SetTitleOffset(1.6);
437 hist->Draw();
438
439 canvas->SaveAs("VtxRecon1D.eps");
440}
441
0ab29cfa 442void Track2ParticleAsNumber(const char* fileName = "correction_map.root")
1afae8ff 443{
25db2d85 444 gSystem->Load("libPWG0base");
445
0ab29cfa 446 TFile::Open(fileName);
8b3563f4 447 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection("dndeta_correction", "dndeta_correction");
0ab29cfa 448 dNdEtaCorrection->LoadHistograms(fileName, "dndeta_correction");
449
450 TH3F* gene = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetGeneratedHistogram();
451 TH3F* meas = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetMeasuredHistogram();
452
453 TH3F* gene = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetGeneratedHistogram();
454 TH3F* meas = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetMeasuredHistogram();
455
456 gene->GetYaxis()->SetRangeUser(-0.8, 0.8);
457 meas->GetYaxis()->SetRangeUser(-0.8, 0.8);
458 gene->GetXaxis()->SetRangeUser(-10, 10);
459 meas->GetXaxis()->SetRangeUser(-10, 10);
460
461 Float_t eff1 = gene->Integral() / meas->Integral();
462 Float_t error1 = TMath::Sqrt(gene->Integral()) / meas->Integral();
463
464 printf("Correction without pT cut: %f +- %f\n", eff1, error1);
465
466 gene->GetZaxis()->SetRangeUser(0.3, 10);
467 meas->GetZaxis()->SetRangeUser(0.3, 10);
468
469 Float_t eff2 = gene->Integral() / meas->Integral();
470 Float_t error2 = TMath::Sqrt(gene->Integral()) / meas->Integral();
471
472 printf("Correction with pT cut: %f +- %f\n", eff2, error2);
473
474 gene->GetZaxis()->SetRangeUser(0.3, 1);
475 meas->GetZaxis()->SetRangeUser(0.3, 1);
476
477 Float_t eff3 = gene->Integral() / meas->Integral();
478 Float_t error3 = TMath::Sqrt(gene->Integral()) / meas->Integral();
479
480 printf("Correction with 0.3 < pT < 0.5: %f +- %f\n", eff3, error3);
481}
482
bdfe2916 483void Track2Particle1DCreatePlots(const char* fileName = "correction_map.root", const char* folderName = "dndeta_correction", Float_t upperPtLimit = 10)
0ab29cfa 484{
485 TFile::Open(fileName);
bdfe2916 486 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(folderName, folderName);
487 dNdEtaCorrection->LoadHistograms(fileName, folderName);
0ab29cfa 488
489 TH3F* gene = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetGeneratedHistogram();
490 TH3F* meas = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetMeasuredHistogram();
491
492 gene->GetZaxis()->SetRangeUser(0.3, upperPtLimit);
493 meas->GetZaxis()->SetRangeUser(0.3, upperPtLimit);
494 gene->GetYaxis()->SetRangeUser(-0.8, 0.8);
495 meas->GetYaxis()->SetRangeUser(-0.8, 0.8);
496 AliPWG0Helper::CreateDividedProjections(gene, meas, "x", kTRUE);
497 gene->GetYaxis()->SetRange(0, 0);
498 meas->GetYaxis()->SetRange(0, 0);
499
500 gene->GetXaxis()->SetRangeUser(-10, 10);
501 meas->GetXaxis()->SetRangeUser(-10, 10);
502 AliPWG0Helper::CreateDividedProjections(gene, meas, "y", kTRUE);
503 gene->GetZaxis()->SetRange(0, 0);
504 meas->GetZaxis()->SetRange(0, 0);
505
506 gene->GetYaxis()->SetRangeUser(-0.8, 0.8);
507 meas->GetYaxis()->SetRangeUser(-0.8, 0.8);
508 AliPWG0Helper::CreateDividedProjections(gene, meas, "z", kTRUE);
509}
25db2d85 510
72e597d7 511void Track2Particle1D(const char* fileName = "correction_map.root", const char* folder = "dndeta_correction", Float_t upperPtLimit = 9.9)
0ab29cfa 512{
513 gSystem->Load("libPWG0base");
514
72e597d7 515 Track2Particle1DCreatePlots(fileName, folder, upperPtLimit);
0ab29cfa 516
72e597d7 517 TH1* corrX = dynamic_cast<TH1*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_x_div_meas_%s_nTrackToNPart_x", folder, folder)));
518 TH1* corrY = dynamic_cast<TH1*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_y_div_meas_%s_nTrackToNPart_y", folder, folder)));
519 TH1* corrZ = dynamic_cast<TH1*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_z_div_meas_%s_nTrackToNPart_z", folder, folder)));
0ab29cfa 520
521 Prepare1DPlot(corrX);
522 Prepare1DPlot(corrY);
523 Prepare1DPlot(corrZ);
524
72e597d7 525 //corrX->SetTitle("a) z projection");
526 corrY->SetTitle("a) #eta projection");
527 corrZ->SetTitle("b) p_{T} projection");
528
529 corrY->GetYaxis()->SetTitle("correction factor");
530 corrZ->GetYaxis()->SetTitle("correction factor");
0ab29cfa 531
532 corrZ->GetXaxis()->SetRangeUser(0, upperPtLimit);
533
bdfe2916 534 TString canvasName;
72e597d7 535 canvasName.Form("Track2Particle1D_%s", folder);
bdfe2916 536 TCanvas* canvas = new TCanvas(canvasName, canvasName, 1200, 400);
0ab29cfa 537 canvas->Divide(3, 1);
538
539 canvas->cd(1);
540 InitPad();
bdfe2916 541 corrX->DrawCopy();
0ab29cfa 542
543 canvas->cd(2);
544 InitPad();
bdfe2916 545 corrY->DrawCopy();
0ab29cfa 546
547 canvas->cd(3);
548 InitPad();
bdfe2916 549 corrZ->DrawCopy();
0ab29cfa 550
72e597d7 551 canvas->SaveAs(Form("Track2Particle1D_%s_%f.gif", fileName, upperPtLimit));
552 canvas->SaveAs(Form("Track2Particle1D_%s_%f.eps", fileName, upperPtLimit));
553
5c495d37 554 //TPaveText* pave = new TPaveText(-0.4, 1.35, 0.4, 1.45);
555
72e597d7 556 canvasName.Form("Track2Particle1D_%s_etapt", folder);
557 TCanvas* canvas = new TCanvas(canvasName, canvasName, 1000, 500);
558 canvas->Divide(2, 1);
559
560 canvas->cd(1);
561 InitPad();
562 corrY->GetXaxis()->SetRangeUser(-0.99, 0.99);
563 corrY->GetYaxis()->SetRangeUser(1, 1.5);
564 corrY->GetYaxis()->SetTitleOffset(1.5);
565 corrY->DrawCopy();
5c495d37 566 TPaveText* pave = new TPaveText(0.3, 0.7, 0.7, 0.8, "NDC");
567 pave->AddText("|z| < 10 cm");
568 pave->AddText("0.3 GeV/c < p_{T} < 10 GeV/c");
569 pave->Draw();
72e597d7 570
571 canvas->cd(2);
572 InitPad();
5c495d37 573 gPad->SetLogx();
574 corrZ->GetYaxis()->SetRangeUser(1, 2.5);
575 corrZ->GetXaxis()->SetRangeUser(0.101, upperPtLimit);
72e597d7 576 corrZ->GetYaxis()->SetTitleOffset(1.5);
577 corrZ->DrawCopy();
5c495d37 578 pave = new TPaveText(0.5, 0.7, 0.8, 0.8, "NDC");
579 pave->AddText("|z| < 10 cm");
580 pave->AddText("|#eta| < 0.8");
581 pave->Draw();
72e597d7 582
583 canvas->SaveAs(Form("Track2Particle1D_etapt_%s_%f.eps", fileName, upperPtLimit));
0ab29cfa 584}
585
586void CompareTrack2Particle1D(Float_t upperPtLimit = 9.9)
587{
588 gSystem->Load("libPWG0base");
589
bdfe2916 590 Track2Particle1DCreatePlots("correction_maponly-positive.root", "dndeta_correction", upperPtLimit);
0ab29cfa 591
592 TH1* posX = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_x_div_meas_nTrackToNPart_x")->Clone("pos_x"));
593 TH1* posY = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_y_div_meas_nTrackToNPart_y")->Clone("pos_y"));
594 TH1* posZ = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_z_div_meas_nTrackToNPart_z")->Clone("pos_z"));
595
bdfe2916 596 Track2Particle1DCreatePlots("correction_maponly-negative.root", "dndeta_correction", upperPtLimit);
0ab29cfa 597
598 TH1* negX = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_x_div_meas_nTrackToNPart_x")->Clone("neg_x"));
599 TH1* negY = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_y_div_meas_nTrackToNPart_y")->Clone("neg_y"));
600 TH1* negZ = dynamic_cast<TH1*> (gROOT->FindObject("gene_nTrackToNPart_z_div_meas_nTrackToNPart_z")->Clone("neg_z"));
601
602 //printf("%f %f %f %f\n", posX->GetBinContent(20), posX->GetBinError(20), negX->GetBinContent(20), negX->GetBinError(20));
603
604 posX->Divide(negX);
605 posY->Divide(negY);
606 posZ->Divide(negZ);
607
608 //printf("%f %f\n", posX->GetBinContent(20), posX->GetBinError(20));
609
610 Prepare1DPlot(posX);
611 Prepare1DPlot(posY);
612 Prepare1DPlot(posZ);
613
614 Float_t min = 0.8;
615 Float_t max = 1.2;
616
617 posX->SetMinimum(min);
618 posX->SetMaximum(max);
619 posY->SetMinimum(min);
620 posY->SetMaximum(max);
621 posZ->SetMinimum(min);
622 posZ->SetMaximum(max);
623
624 posZ->GetXaxis()->SetRangeUser(0, upperPtLimit);
625
626 posX->GetYaxis()->SetTitleOffset(1.7);
627 posX->GetYaxis()->SetTitle("C_{+} / C_{-}");
628 posY->GetYaxis()->SetTitleOffset(1.7);
629 posY->GetYaxis()->SetTitle("C_{+} / C_{-}");
630 posZ->GetYaxis()->SetTitleOffset(1.7);
631 posZ->GetYaxis()->SetTitle("C_{+} / C_{-}");
632
633 TCanvas* canvas = new TCanvas("CompareTrack2Particle1D", "CompareTrack2Particle1D", 1200, 400);
634 canvas->Divide(3, 1);
635
636 canvas->cd(1);
637 InitPad();
638 posX->Draw();
639
640 canvas->cd(2);
641 InitPad();
642 posY->Draw();
643
644 canvas->cd(3);
645 InitPad();
646 posZ->Draw();
647
648 canvas->SaveAs(Form("CompareTrack2Particle1D_%f.gif", upperPtLimit));
649 canvas->SaveAs(Form("CompareTrack2Particle1D_%f.eps", upperPtLimit));
650}
651
652void Track2Particle2DCreatePlots(const char* fileName = "correction_map.root")
653{
654 TFile::Open(fileName);
655 AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection("dndeta_correction", "dndeta_correction");
656 dNdEtaCorrection->LoadHistograms(fileName, "dndeta_correction");
657
658 TH3F* gene = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetGeneratedHistogram();
659 TH3F* meas = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetMeasuredHistogram();
1afae8ff 660
25db2d85 661 gene->GetZaxis()->SetRangeUser(0.3, 10);
662 meas->GetZaxis()->SetRangeUser(0.3, 10);
663 AliPWG0Helper::CreateDividedProjections(gene, meas, "yx");
0ab29cfa 664 gene->GetZaxis()->SetRange(0, 0);
665 meas->GetZaxis()->SetRange(0, 0);
25db2d85 666
667 gene->GetYaxis()->SetRangeUser(-0.8, 0.8);
668 meas->GetYaxis()->SetRangeUser(-0.8, 0.8);
669 AliPWG0Helper::CreateDividedProjections(gene, meas, "zx");
0ab29cfa 670 gene->GetYaxis()->SetRange(0, 0);
671 meas->GetYaxis()->SetRange(0, 0);
25db2d85 672
673 gene->GetXaxis()->SetRangeUser(-10, 10);
674 meas->GetXaxis()->SetRangeUser(-10, 10);
675 AliPWG0Helper::CreateDividedProjections(gene, meas, "zy");
0ab29cfa 676 gene->GetXaxis()->SetRange(0, 0);
677 meas->GetXaxis()->SetRange(0, 0);
678}
679
0bd1f8a0 680void Track2Particle2D(const char* fileName = "correction_map.root", const char* folder = "dndeta_correction")
0ab29cfa 681{
682 gSystem->Load("libPWG0base");
683
684 Track2Particle2DCreatePlots(fileName);
25db2d85 685
0bd1f8a0 686 TH2* corrYX = dynamic_cast<TH2*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_yx_div_meas_%s_nTrackToNPart_yx", folder, folder)));
687 TH2* corrZX = dynamic_cast<TH2*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_zx_div_meas_%s_nTrackToNPart_zx", folder, folder)));
688 TH2* corrZY = dynamic_cast<TH2*> (gROOT->FindObject(Form("gene_%s_nTrackToNPart_zy_div_meas_%s_nTrackToNPart_zy", folder, folder)));
25db2d85 689
690 /* this reads them from the file
d09fb536 691 TH2* corrYX = dynamic_cast<TH2*> (file->Get("dndeta_correction/gene_nTrackToNPart_yx_div_meas_nTrackToNPart_yx"));
692 TH2* corrZX = dynamic_cast<TH2*> (file->Get("dndeta_correction/gene_nTrackToNPart_zx_div_meas_nTrackToNPart_zx"));
25db2d85 693 TH2* corrZY = dynamic_cast<TH2*> (file->Get("dndeta_correction/gene_nTrackToNPart_zy_div_meas_nTrackToNPart_zy"));*/
1afae8ff 694
695 Prepare2DPlot(corrYX);
696 Prepare2DPlot(corrZX);
697 Prepare2DPlot(corrZY);
698
0ab29cfa 699 const char* title = "";
92d2d8ad 700 corrYX->SetTitle(title);
701 corrZX->SetTitle(title);
702 corrZY->SetTitle(title);
1afae8ff 703
d09fb536 704 TCanvas* canvas = new TCanvas("Track2Particle2D", "Track2Particle2D", 1200, 400);
1afae8ff 705 canvas->Divide(3, 1);
706
707 canvas->cd(1);
708 InitPadCOLZ();
709 corrYX->Draw("COLZ");
710
711 canvas->cd(2);
712 InitPadCOLZ();
713 corrZX->Draw("COLZ");
714
715 canvas->cd(3);
716 InitPadCOLZ();
717 corrZY->Draw("COLZ");
92d2d8ad 718
25db2d85 719 canvas->SaveAs(Form("Track2Particle2D_%d.gif", gMax));
0ab29cfa 720 canvas->SaveAs(Form("Track2Particle2D_%d.eps", gMax));
721}
722
723void CompareTrack2Particle2D()
724{
725 gSystem->Load("libPWG0base");
726
727 Track2Particle2DCreatePlots("correction_maponly-positive.root");
728
729 TH2* posYX = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_yx_div_meas_nTrackToNPart_yx")->Clone("pos_yx"));
730 TH2* posZX = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_zx_div_meas_nTrackToNPart_zx")->Clone("pos_zx"));
731 TH2* posZY = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_zy_div_meas_nTrackToNPart_zy")->Clone("pos_zy"));
732
733 Track2Particle2DCreatePlots("correction_maponly-negative.root");
734
735 TH2* negYX = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_yx_div_meas_nTrackToNPart_yx")->Clone("neg_yx"));
736 TH2* negZX = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_zx_div_meas_nTrackToNPart_zx")->Clone("neg_zx"));
737 TH2* negZY = dynamic_cast<TH2*> (gROOT->FindObject("gene_nTrackToNPart_zy_div_meas_nTrackToNPart_zy")->Clone("neg_zy"));
738
739 posYX->Divide(negYX);
740 posZX->Divide(negZX);
741 posZY->Divide(negZY);
742
743 Prepare2DPlot(posYX);
744 Prepare2DPlot(posZX);
745 Prepare2DPlot(posZY);
746
747 Float_t min = 0.8;
748 Float_t max = 1.2;
749
750 posYX->SetMinimum(min);
751 posYX->SetMaximum(max);
752 posZX->SetMinimum(min);
753 posZX->SetMaximum(max);
754 posZY->SetMinimum(min);
755 posZY->SetMaximum(max);
756
757 TCanvas* canvas = new TCanvas("CompareTrack2Particle2D", "CompareTrack2Particle2D", 1200, 400);
758 canvas->Divide(3, 1);
759
760 canvas->cd(1);
761 InitPadCOLZ();
762 posYX->Draw("COLZ");
763
764 canvas->cd(2);
765 InitPadCOLZ();
766 posZX->Draw("COLZ");
767
768 canvas->cd(3);
769 InitPadCOLZ();
770 posZY->Draw("COLZ");
771
772 canvas->SaveAs("CompareTrack2Particle2D.gif");
773 canvas->SaveAs("CompareTrack2Particle2D.eps");
1afae8ff 774}
775
776void Track2Particle3D()
777{
778 // get left margin proper
779
780 TFile* file = TFile::Open("correction_map.root");
781
d09fb536 782 TH3* corr = dynamic_cast<TH3*> (file->Get("dndeta_correction/corr_nTrackToNPart"));
783
784 corr->SetTitle("Correction Factor");
785 SetRanges(corr->GetZaxis());
786
787 Prepare3DPlot(corr);
788
789 TCanvas* canvas = new TCanvas("Track2Particle3D", "Track2Particle3D", 500, 500);
790 canvas->SetTheta(29.428);
791 canvas->SetPhi(16.5726);
792
793 corr->Draw();
794
795 canvas->SaveAs("Track2Particle3D.gif");
0ab29cfa 796 canvas->SaveAs("Track2Particle3D.eps");
d09fb536 797}
798
799void Track2Particle3DAll()
800{
d09fb536 801 TFile* file = TFile::Open("correction_map.root");
802
1afae8ff 803 TH3* gene = dynamic_cast<TH3*> (file->Get("dndeta_correction/gene_nTrackToNPart"));
804 TH3* meas = dynamic_cast<TH3*> (file->Get("dndeta_correction/meas_nTrackToNPart"));
805 TH3* corr = dynamic_cast<TH3*> (file->Get("dndeta_correction/corr_nTrackToNPart"));
806
807 gene->SetTitle("Generated Particles");
808 meas->SetTitle("Measured Tracks");
809 corr->SetTitle("Correction Factor");
810
811 Prepare3DPlot(gene);
812 Prepare3DPlot(meas);
813 Prepare3DPlot(corr);
814
d09fb536 815 TCanvas* canvas = new TCanvas("Track2Particle3DAll", "Track2Particle3DAll", 1200, 400);
1afae8ff 816 canvas->Divide(3, 1);
817
818 canvas->cd(1);
819 InitPad();
820 gene->Draw();
821
822 canvas->cd(2);
823 meas->Draw();
824
825 canvas->cd(3);
826 corr->Draw();
d09fb536 827
828 canvas->SaveAs("Track2Particle3DAll.gif");
0ab29cfa 829 canvas->SaveAs("Track2Particle3DAll.eps");
1afae8ff 830}
831
6b7fa615 832void MultiplicityMC(Int_t xRangeMax = 50)
4c6b34a8 833{
834 TFile* file = TFile::Open("multiplicityMC.root");
835
836 if (!file)
837 {
838 printf("multiplicityMC.root could not be opened.\n");
839 return;
840 }
841
842 TH1F* fMultiplicityESD = dynamic_cast<TH1F*> (file->Get("fMultiplicityESD"));
843 TH1F* fMultiplicityMC = dynamic_cast<TH1F*> (file->Get("fMultiplicityMC"));
844 TH2F* fCorrelation = dynamic_cast<TH2F*> (file->Get("fCorrelation"));
845
846 TH1F* correction = new TH1F("MultiplicityMC_correction", "MultiplicityMC_correction;Ntracks;Npart", 76, -0.5, 75.5);
847 TH1F* correctionWidth = new TH1F("MultiplicityMC_correctionwidth", "MultiplicityMC_correctionwidth;Ntracks;Npart", 76, -0.5, 75.5);
848 //fMultiplicityMC->GetNbinsX(), fMultiplicityMC->GetXaxis()->GetXmin(), fMultiplicityMC->GetXaxis()->GetXmax());
849 for (Int_t i=1; i<=correction->GetNbinsX(); ++i)
850 {
851 TH1D* proj = fCorrelation->ProjectionX("_px", i, i+1);
852 proj->Fit("gaus", "0");
853 correction->SetBinContent(i, proj->GetFunction("gaus")->GetParameter(1));
854 correctionWidth->SetBinContent(i, proj->GetFunction("gaus")->GetParameter(2));
855
856 continue;
857
858 // draw for debugging
859 new TCanvas;
860 proj->DrawCopy();
861 proj->GetFunction("gaus")->DrawCopy("SAME");
862 }
863
864 TH1F* fMultiplicityESDCorrected = new TH1F("fMultiplicityESDCorrected", "fMultiplicityESDCorrected", 2010, -0.5, 200.5);
865
866 for (Int_t i=1; i<=correction->GetNbinsX(); ++i)
867 {
868 Float_t mean = correction->GetBinContent(i);
869 Float_t width = correctionWidth->GetBinContent(i);
870
871 Int_t fillBegin = fMultiplicityESDCorrected->FindBin(mean - width * 3);
872 Int_t fillEnd = fMultiplicityESDCorrected->FindBin(mean + width * 3);
873 printf("bin %d mean %f width %f, filling from %d to %d\n", i, mean, width, fillBegin, fillEnd);
874
875 for (Int_t j=fillBegin; j <= fillEnd; ++j)
876 {
877 fMultiplicityESDCorrected->AddBinContent(j, TMath::Gaus(fMultiplicityESDCorrected->GetXaxis()->GetBinCenter(j), mean, width, kTRUE) * fMultiplicityESD->GetBinContent(i));
878 }
879 }
880
881 TH1F* fMultiplicityESDCorrectedRebinned = dynamic_cast<TH1F*> (fMultiplicityESDCorrected->Clone("fMultiplicityESDCorrectedRebinned"));
882 fMultiplicityESDCorrectedRebinned->Rebin(10);
883 fMultiplicityESDCorrectedRebinned->Scale(0.1);
884
6b7fa615 885 TH1F* ratio = dynamic_cast<TH1F*> (fMultiplicityESD->Clone("multiplicity_ratio"));
886 ratio->SetTitle("ratio;Ntracks;Nreco/Ngene");
887 ratio->Divide(fMultiplicityMC);
888
4c6b34a8 889 TH1F* ratio2 = dynamic_cast<TH1F*> (fMultiplicityESDCorrectedRebinned->Clone("multiplicity_ratio_corrected"));
890 ratio2->Divide(fMultiplicityMC);
891
892 TCanvas* canvas = new TCanvas("MultiplicityMC", "MultiplicityMC", 1500, 1000);
893 canvas->Divide(3, 2);
894
6b7fa615 895 fMultiplicityESD->GetXaxis()->SetRangeUser(0, xRangeMax);
896 ratio->GetXaxis()->SetRangeUser(0, xRangeMax);
897 fCorrelation->GetXaxis()->SetRangeUser(0, xRangeMax);
898 fCorrelation->GetYaxis()->SetRangeUser(0, xRangeMax);
899 correction->GetXaxis()->SetRangeUser(0, xRangeMax);
900 fMultiplicityESDCorrected->GetXaxis()->SetRangeUser(0, xRangeMax);
901 fMultiplicityESDCorrectedRebinned->GetXaxis()->SetRangeUser(0, xRangeMax);
902
903 canvas->cd(1); //InitPad();
4c6b34a8 904 fMultiplicityESD->Draw();
905 fMultiplicityMC->SetLineColor(2);
906 fMultiplicityMC->Draw("SAME");
907
6b7fa615 908 TLegend* legend = new TLegend(0.6, 0.7, 0.85, 0.85);
909 legend->AddEntry(fMultiplicityESD, "ESD");
910 legend->AddEntry(fMultiplicityMC, "MC");
911 legend->Draw();
4c6b34a8 912
6b7fa615 913 canvas->cd(2);
4c6b34a8 914 fCorrelation->Draw("COLZ");
915
6b7fa615 916 canvas->cd(3);
4c6b34a8 917 correction->Draw();
918 //correction->Fit("pol1");
919 correctionWidth->SetLineColor(2);
920 correctionWidth->Draw("SAME");
921
6b7fa615 922 legend = new TLegend(0.2, 0.7, 0.45, 0.85);
923 legend->AddEntry(correction, "#bar{x}");
924 legend->AddEntry(correctionWidth, "#sigma");
925 legend->Draw();
926
927 canvas->cd(4);
928 ratio->Draw();
929
930 ratio2->SetLineColor(2);
931 ratio2->Draw("SAME");
932
933 legend = new TLegend(0.6, 0.7, 0.85, 0.85);
934 legend->AddEntry(ratio, "uncorrected");
935 legend->AddEntry(ratio2, "corrected");
936 legend->Draw();
937
4c6b34a8 938 canvas->cd(5);
6b7fa615 939 fMultiplicityESDCorrected->SetLineColor(kBlue);
4c6b34a8 940 fMultiplicityESDCorrected->Draw();
941 fMultiplicityMC->Draw("SAME");
942 fMultiplicityESD->Draw("SAME");
943
6b7fa615 944 legend = new TLegend(0.6, 0.7, 0.85, 0.85);
945 legend->AddEntry(fMultiplicityESDCorrected, "ESD corrected");
946 legend->AddEntry(fMultiplicityMC, "MC");
947 legend->AddEntry(fMultiplicityESD, "ESD");
948 legend->Draw();
949
4c6b34a8 950 canvas->cd(6);
6b7fa615 951 fMultiplicityESDCorrectedRebinned->SetLineColor(kBlue);
4c6b34a8 952 fMultiplicityESDCorrectedRebinned->Draw();
953 fMultiplicityMC->Draw("SAME");
6b7fa615 954
955 legend = new TLegend(0.6, 0.7, 0.85, 0.85);
956 legend->AddEntry(fMultiplicityESDCorrectedRebinned, "ESD corrected");
957 legend->AddEntry(fMultiplicityMC, "MC");
958 legend->Draw();
959
960 canvas->SaveAs("MultiplicityMC.gif");
4c6b34a8 961}
962
963void MultiplicityESD()
964{
965 TFile* file = TFile::Open("multiplicityESD.root");
966
967 if (!file)
968 {
969 printf("multiplicityESD.root could not be opened.\n");
970 return;
971 }
972
973 TH1F* fMultiplicityESD = dynamic_cast<TH1F*> (file->Get("fMultiplicity"));
974
975 TCanvas* canvas = new TCanvas("MultiplicityESD", "MultiplicityESD", 500, 500);
976
977 fMultiplicityESD->Draw();
978}
979
0ab29cfa 980void drawPlots(Int_t max)
1afae8ff 981{
0ab29cfa 982 gMax = max;
1afae8ff 983
0ab29cfa 984 ptCutoff();
985 TriggerBias();
986 VtxRecon();
987 Track2Particle2D();
988 Track2Particle3D();
989 ptSpectrum();
990 dNdEta();
1afae8ff 991}
992
0ab29cfa 993void drawPlots()
d09fb536 994{
0ab29cfa 995 drawPlots(5);
996 drawPlots(2);
1afae8ff 997}