2 * Script to draw the energy loss fits from the output file of
3 * AliFMDELossFitter(Task).
6 * @ingroup pwg2_forward_scripts_corr
19 //____________________________________________________________________
23 const char* pdfName = "FitResults.pdf";
24 bool landscape = true;
26 //____________________________________________________________________
28 * Open a file. The file is expected to contain the directory
46 * | +- FMD1I_edist (TH1)
51 * @param fname File to open
53 * @return Pointer to the list of objects
55 * @ingroup pwg2_forward_scripts_corr
57 TList* OpenFile(const char* fname)
59 TFile* file = TFile::Open(fname, "READ");
61 Error("DrawFits", "Couldn't open %s", fname);
65 TList* forward = static_cast<TList*>(file->Get("ForwardResults"));
66 // static_cast<TList*>(file->Get("PWG2forwardDnDeta/Forward"));
68 Error("DrawFits", "Couldn't get forward list from %s", fname);
72 fitter = static_cast<TList*>(forward->FindObject("fmdEnergyFitter"));
74 Error("DrawFits", "Couldn't get fitter folder");
79 //____________________________________________________________________
81 * Open file if not done already
83 * @param fname File to open
85 * @return List of fits
87 * @ingroup pwg2_forward_scripts_corr
89 TList* CheckFitter(const char* fname="AnalysisResults.root")
91 if (!fitter) return OpenFile(fname);
95 //____________________________________________________________________
97 * Make canvas if not done already
102 * @ingroup pwg2_forward_scripts_corr
104 TCanvas* CheckCanvas()
106 if (canvas) return canvas;
108 gStyle->SetOptFit(111111);
109 gStyle->SetTitleFillColor(0);
110 gStyle->SetTitleBorderSize(0);
111 gStyle->SetTitleX(0);
112 gStyle->SetTitleY(.9);
113 gStyle->SetTitleW(.4);
114 gStyle->SetTitleH(.1);
115 gStyle->SetStatW(0.2);
116 gStyle->SetStatH(0.2);
117 gStyle->SetStatColor(0);
118 gStyle->SetStatBorderSize(1);
119 gStyle->SetOptTitle(0);
120 gStyle->SetOptFit(1111);
121 gStyle->SetStatW(0.3);
122 gStyle->SetStatH(0.15);
123 gStyle->SetStatColor(0);
124 gStyle->SetStatBorderSize(1);
126 Int_t w = Int_t(800 / TMath::Sqrt(2));
133 canvas = new TCanvas("c", "C", w, h);
134 canvas->SetFillColor(0);
135 canvas->SetBorderMode(0);
136 canvas->SetBorderSize(0);
137 canvas->SetBottomMargin(0.15);
141 //____________________________________________________________________
142 void CleanStack(THStack* stack)
144 TIter next(stack->GetHists());
146 while ((o = next())) {
147 TString name(o->GetName());
148 if (name.Contains("_t_"))
149 stack->RecursiveRemove(o);
154 //____________________________________________________________________
156 AddToStack(TList* stacks, TList* list, const char* name)
158 TObject* o = list->FindObject(name);
160 Warning("AddToStack", "Object %s not found in %s", name,
165 THStack* toAdd = static_cast<THStack*>(o);
167 Info("AddToStack", "Adding %s to stacks", name);
173 //____________________________________________________________________
179 * @ingroup pwg2_forward_scripts_corr
181 void DrawSummary(const char* fname="forward_eloss.root",
182 bool onlySummary=true)
184 if (!CheckFitter(fname)) {
185 Error("DrawFits", "File not opened");
188 if (!CheckCanvas()) {
189 Error("DrawFits", "No canvas");
195 /* THStack* chi2nu = */ AddToStack(&stacks, fitter, "chi2");
196 /* THStack* c = */ AddToStack(&stacks, fitter, "c");
197 /* THStack* delta = */ AddToStack(&stacks, fitter, "delta");
198 /* THStack* xi = */ AddToStack(&stacks, fitter, "xi");
199 /* THStack* sigma = */ AddToStack(&stacks, fitter, "sigma");
200 /* THStack* sigman = */ AddToStack(&stacks, fitter, "sigman");
201 /* THStack* n = */ AddToStack(&stacks, fitter, "n");
202 Int_t baseA = stacks.GetEntries()+1;
205 if (!AddToStack(&stacks, fitter, Form("a%d",i++)))
209 Int_t nMax = stacks.GetEntries();
210 for (i = nMax-1; i >= baseA; i--) {
211 THStack* stack = static_cast<THStack*>(stacks.At(i));
212 TIter nextH(stack->GetHists());
214 Bool_t hasData = kFALSE;
215 while ((hist = static_cast<TH1*>(nextH())))
216 if (hist->Integral() > 0) hasData = kTRUE;
217 if (!hasData) nMax--;
220 canvas->SetRightMargin(0.01);
221 canvas->SetTopMargin(0.01);
222 Int_t nL = (nMax+1) / 2;
231 canvas->Divide(nX, nY, 0.1, 0, 0);
237 while ((stack = static_cast<THStack*>(next()))) {
239 Int_t ipad = 1+i/nL + 2 * (i % nL);
240 Info("DrawSummary", "cd'ing to canvas %d for %s", ipad,
242 TVirtualPad* p = canvas->cd(ipad);
243 p->SetLeftMargin(.6/nL);
244 p->SetTopMargin(.01);
245 p->SetRightMargin(.01);
249 stack->Draw("nostack");
250 stack->GetHistogram()->SetYTitle(stack->GetTitle());
251 stack->GetHistogram()->SetXTitle("#eta");
253 TAxis* yaxis = stack->GetHistogram()->GetYaxis();
254 if (i == 0) yaxis->SetRangeUser(0,20); // Chi2
255 if (i == 1) stack->SetMaximum(1); // c
256 if (i == 2) stack->SetMaximum(1); // delta
257 if (i == 3) stack->SetMaximum(0.1); // xi
258 if (i == 4 || i == 5) stack->SetMaximum(0.5); // sigma{,n}
259 if (i == 7) stack->SetMaximum(0.5); // a
260 if (i == 0) p->SetLogy();
261 yaxis->SetTitleSize(0.3/nL);
262 yaxis->SetLabelSize(0.08);
263 yaxis->SetTitleOffset(2.5/nL);
264 yaxis->SetNdivisions(5);
265 yaxis->SetTitleFont(42);
266 yaxis->SetLabelFont(42);
267 yaxis->SetDecimals();
269 TAxis* xaxis = stack->GetHistogram()->GetXaxis();
270 xaxis->SetTitleSize(0.3/nL);
271 xaxis->SetLabelSize(0.08);
272 xaxis->SetTitleOffset(2./nL);
273 xaxis->SetNdivisions(10);
274 xaxis->SetTitleFont(42);
275 xaxis->SetLabelFont(42);
276 xaxis->SetDecimals();
279 stack->Draw("nostack");
281 // if (i >= 5) b = 2;
284 canvas->SaveAs("fit_results.png");
286 canvas->Print(pdfName, "Title:Fit summary");
289 //____________________________________________________________________
295 * @ingroup pwg2_forward_scripts_corr
297 void DrawRings(const char* fname="AnalysisResults.root")
299 if (!CheckFitter(fname)) {
300 Error("DrawFits", "File not opened");
303 if (!CheckCanvas()) {
304 Error("DrawFits", "No canvas");
310 canvas->Divide(1, 5,0,0);
312 const char* dets[] = { "FMD1I", "FMD2I", "FMD2O", "FMD3I", "FMD3O", 0 };
313 for (Int_t i = 0; i < 5; i++) {
314 TVirtualPad* p = canvas->cd(i+1);
319 TList* d = static_cast<TList*>(fitter->FindObject(dets[i]));
321 Warning("DrawFits", "List %s not found", dets[i]);
324 TH1* edist = static_cast<TH1*>(d->FindObject(Form("%s_edist", dets[i])));
326 Warning("DrawFits", "Histogram %s_edist not found", dets[i]);
331 TIter nextF(edist->GetListOfFunctions());
332 while ((f = static_cast<TF1*>(nextF()))) {
333 Double_t chi2 = f->GetChisquare();
334 Int_t ndf = f->GetNDF();
335 Printf("%s %s:\n Range: %f-%f\n"
336 "chi^2/ndf= %f / %d = %f",
337 edist->GetName(), f->GetName(),
338 f->GetXmin(), f->GetXmax(), chi2, ndf,
339 (ndf > 0) ? chi2/ndf : 0);
340 for (Int_t j = 0; j < f->GetNpar(); j++) {
341 Printf(" %-20s : %9.4f +/- %9.4f",
342 f->GetParName(j), f->GetParameter(j), f->GetParError(j));
348 canvas->Print(pdfName, "Title:Fit to rings");
351 //____________________________________________________________________
353 * Draw fits in eta bins
357 * @ingroup pwg2_forward_scripts_corr
359 void DrawEtaBins(const char* fname="AnalysisResults.root")
361 if (!CheckFitter(fname)) {
362 Error("DrawFits", "File not opened");
365 if (!CheckCanvas()) {
366 Error("DrawFits", "No canvas");
370 canvas->Divide(2,2,0,0);
372 for (UShort_t d=1; d<=3; d++) {
373 UShort_t nQ = (d == 1 ? 1 : 2);
374 for (UShort_t q = 0; q < nQ; q++) {
375 Char_t r = (q == 0 ? 'I' : 'O');
378 static_cast<TList*>(fitter->FindObject(Form("FMD%d%c",d,r)));
380 Error("PrintFits", "Couldn't get ring FMD%d%c", d,r);
383 TList* edists = static_cast<TList*>(ring->FindObject("EDists"));
385 Error("PrintFits", "Couldn't get EDists list for FMD%d%c", d,r);
389 Info("DrawEtaBins", "Drawing for FMD%d%c", d, r);
394 while ((dist = static_cast<TH1*>(next()))) {
395 Info("DrawEtaBins", "FMD%d%c: %s", d, r, dist->GetName());
399 canvas->Print(pdfName, Form("Title:FMD%d%c page %2d", d,r,j));
401 TVirtualPad* p = canvas->cd(++i);
402 p->SetFillColor(kWhite);
406 dist->SetMaximum(15);
412 for (; i <= 4; i++) {
413 TVirtualPad* p = canvas->cd(i);
415 p->SetFillColor(kMagenta-3);
419 canvas->Print(pdfName, Form("FMD%d%c page %2d", d,r,j++));
425 //____________________________________________________________________
427 * Draw energy loss fits to a multi-page PDF
429 * The input file is the result of running AliFMDELossFitter -
430 * either directly via AliFMDELossFitterTask or as part of a larger
431 * train (AliForwardMultiplicityTask or AliForwardMCMultiplicityTask).
442 * +- sigman (THStack)
448 * | +- FMD1I_edist (TH1)
449 * | +- EDists (TList)
455 * @ingroup pwg2_forward_scripts_corr
458 DrawAnaELoss(const char* fname="forward_eloss.root", bool onlySummary=true)
460 if (!CheckCanvas()) {
461 Error("DrawFits", "No canvas");
464 if (!onlySummary) canvas->Print(Form("%s[", pdfName));
465 DrawSummary(fname, onlySummary);
466 if (onlySummary) return;
469 canvas->Print(Form("%s]", pdfName));