3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Thu Nov 17 11:16:45 2011
6 * @brief Script to draw the energy loss fits from the output file of
7 * AliFMDELossFitter(Task).
9 * @ingroup pwglf_forward_scripts_corr
23 //____________________________________________________________________
27 const char* pdfName = "FitResults.pdf";
28 bool landscape = true;
30 //____________________________________________________________________
32 * Open a file. The file is expected to contain the directory
50 * | +- FMD1I_edist (TH1)
55 * @param fname File to open
57 * @return Pointer to the list of objects
59 * @ingroup pwglf_forward_scripts_corr
61 TList* OpenFile(const char* fname)
63 TFile* file = TFile::Open(fname, "READ");
65 Error("DrawFits", "Couldn't open %s", fname);
69 TList* forward = static_cast<TList*>(file->Get("ForwardResults"));
70 // static_cast<TList*>(file->Get("PWGLFforwardDnDeta/Forward"));
72 Error("DrawFits", "Couldn't get forward list from %s", fname);
76 fitter = static_cast<TList*>(forward->FindObject("fmdEnergyFitter"));
78 Error("DrawFits", "Couldn't get fitter folder");
83 //____________________________________________________________________
85 * Open file if not done already
87 * @param fname File to open
89 * @return List of fits
91 * @ingroup pwglf_forward_scripts_corr
93 TList* CheckFitter(const char* fname="AnalysisResults.root")
95 if (!fitter) return OpenFile(fname);
99 //____________________________________________________________________
101 * Make canvas if not done already
106 * @ingroup pwglf_forward_scripts_corr
108 TCanvas* CheckCanvas()
110 if (canvas) return canvas;
112 gStyle->SetOptFit(111111);
113 gStyle->SetTitleFillColor(0);
114 gStyle->SetTitleBorderSize(0);
115 gStyle->SetTitleX(0);
116 gStyle->SetTitleY(.9);
117 gStyle->SetTitleW(.4);
118 gStyle->SetTitleH(.1);
119 gStyle->SetStatW(0.2);
120 gStyle->SetStatH(0.2);
121 gStyle->SetStatColor(0);
122 gStyle->SetStatBorderSize(1);
123 gStyle->SetOptTitle(0);
124 gStyle->SetOptFit(1111);
125 gStyle->SetStatW(0.3);
126 gStyle->SetStatH(0.15);
127 gStyle->SetStatColor(0);
128 gStyle->SetStatBorderSize(1);
130 Int_t w = Int_t(800 / TMath::Sqrt(2));
137 canvas = new TCanvas("c", "C", w, h);
138 canvas->SetFillColor(0);
139 canvas->SetBorderMode(0);
140 canvas->SetBorderSize(0);
141 canvas->SetBottomMargin(0.15);
145 //____________________________________________________________________
147 * Clean stack for full ring histograms
149 * @param stack Input stack
151 * @ingroup pwglf_forward_scripts_corr
153 void CleanStack(THStack* stack)
155 TIter next(stack->GetHists());
157 while ((o = next())) {
158 TString name(o->GetName());
159 if (name.Contains("_t_"))
160 stack->RecursiveRemove(o);
164 //____________________________________________________________________
166 * Add a stack to list
168 * @param stacks List to add to
169 * @param list Input list
170 * @param name Name of stack to add
172 * @return The found stack
174 * @ingroup pwglf_forward_scripts_corr
177 AddToStack(TList* stacks, TList* list, const char* name)
179 TObject* o = list->FindObject(name);
181 Warning("AddToStack", "Object %s not found in %s", name,
186 THStack* toAdd = static_cast<THStack*>(o);
188 Info("AddToStack", "Adding %s to stacks", name);
194 //____________________________________________________________________
200 * @ingroup pwglf_forward_scripts_corr
202 * @ingroup pwglf_forward_scripts_corr
204 void DrawSummary(const char* fname="forward_eloss.root",
205 bool onlySummary=true)
207 if (!CheckFitter(fname)) {
208 Error("DrawFits", "File not opened");
211 if (!CheckCanvas()) {
212 Error("DrawFits", "No canvas");
218 /* THStack* chi2nu = */ AddToStack(&stacks, fitter, "chi2");
219 /* THStack* c = */ AddToStack(&stacks, fitter, "c");
220 /* THStack* delta = */ AddToStack(&stacks, fitter, "delta");
221 /* THStack* xi = */ AddToStack(&stacks, fitter, "xi");
222 /* THStack* sigma = */ AddToStack(&stacks, fitter, "sigma");
223 /* THStack* sigman = */ AddToStack(&stacks, fitter, "sigman");
224 /* THStack* n = */ AddToStack(&stacks, fitter, "n");
225 Int_t baseA = stacks.GetEntries()+1;
228 if (!AddToStack(&stacks, fitter, Form("a%d",i++)))
232 Int_t nMax = stacks.GetEntries();
233 for (i = nMax-1; i >= baseA; i--) {
234 THStack* stack = static_cast<THStack*>(stacks.At(i));
235 TIter nextH(stack->GetHists());
237 Bool_t hasData = kFALSE;
238 while ((hist = static_cast<TH1*>(nextH())))
239 if (hist->Integral() > 0) hasData = kTRUE;
240 if (!hasData) nMax--;
243 canvas->SetRightMargin(0.01);
244 canvas->SetTopMargin(0.01);
245 Int_t nL = (nMax+1) / 2;
254 canvas->Divide(nX, nY, 0.1, 0, 0);
260 while ((stack = static_cast<THStack*>(next()))) {
262 Int_t ipad = 1+i/nL + 2 * (i % nL);
263 Info("DrawSummary", "cd'ing to canvas %d for %s", ipad,
265 TVirtualPad* p = canvas->cd(ipad);
266 p->SetLeftMargin(.6/nL);
267 p->SetTopMargin(.01);
268 p->SetRightMargin(.01);
272 stack->Draw("nostack");
273 stack->GetHistogram()->SetYTitle(stack->GetTitle());
274 stack->GetHistogram()->SetXTitle("#eta");
276 TAxis* yaxis = stack->GetHistogram()->GetYaxis();
277 if (i == 0) yaxis->SetRangeUser(0,20); // Chi2
278 if (i == 1) stack->SetMaximum(1); // c
279 if (i == 2) stack->SetMaximum(1); // delta
280 if (i == 3) stack->SetMaximum(0.1); // xi
281 if (i == 4 || i == 5) stack->SetMaximum(0.5); // sigma{,n}
282 if (i == 7) stack->SetMaximum(0.5); // a
283 if (i == 0) p->SetLogy();
284 yaxis->SetTitleSize(0.3/nL);
285 yaxis->SetLabelSize(0.08);
286 yaxis->SetTitleOffset(2.5/nL);
287 yaxis->SetNdivisions(5);
288 yaxis->SetTitleFont(42);
289 yaxis->SetLabelFont(42);
290 yaxis->SetDecimals();
292 TAxis* xaxis = stack->GetHistogram()->GetXaxis();
293 xaxis->SetTitleSize(0.3/nL);
294 xaxis->SetLabelSize(0.08);
295 xaxis->SetTitleOffset(2./nL);
296 xaxis->SetNdivisions(10);
297 xaxis->SetTitleFont(42);
298 xaxis->SetLabelFont(42);
299 xaxis->SetDecimals();
302 stack->Draw("nostack");
304 // if (i >= 5) b = 2;
307 canvas->SaveAs("fit_results.png");
309 canvas->Print(pdfName, "Title:Fit summary");
312 //____________________________________________________________________
318 * @ingroup pwglf_forward_scripts_corr
320 * @ingroup pwglf_forward_scripts_corr
322 void DrawRings(const char* fname="AnalysisResults.root")
324 if (!CheckFitter(fname)) {
325 Error("DrawFits", "File not opened");
328 if (!CheckCanvas()) {
329 Error("DrawFits", "No canvas");
335 canvas->Divide(1, 5,0,0);
337 const char* dets[] = { "FMD1I", "FMD2I", "FMD2O", "FMD3I", "FMD3O", 0 };
338 for (Int_t i = 0; i < 5; i++) {
339 TVirtualPad* p = canvas->cd(i+1);
344 TList* d = static_cast<TList*>(fitter->FindObject(dets[i]));
346 Warning("DrawFits", "List %s not found", dets[i]);
349 TH1* edist = static_cast<TH1*>(d->FindObject(Form("%s_edist", dets[i])));
351 Warning("DrawFits", "Histogram %s_edist not found", dets[i]);
356 TIter nextF(edist->GetListOfFunctions());
357 while ((f = static_cast<TF1*>(nextF()))) {
358 Double_t chi2 = f->GetChisquare();
359 Int_t ndf = f->GetNDF();
360 Printf("%s %s:\n Range: %f-%f\n"
361 "chi^2/ndf= %f / %d = %f",
362 edist->GetName(), f->GetName(),
363 f->GetXmin(), f->GetXmax(), chi2, ndf,
364 (ndf > 0) ? chi2/ndf : 0);
365 for (Int_t j = 0; j < f->GetNpar(); j++) {
366 Printf(" %-20s : %9.4f +/- %9.4f",
367 f->GetParName(j), f->GetParameter(j), f->GetParError(j));
373 canvas->Print(pdfName, "Title:Fit to rings");
376 //____________________________________________________________________
378 * Draw fits in eta bins
382 * @ingroup pwglf_forward_scripts_corr
384 * @ingroup pwglf_forward_scripts_corr
386 void DrawEtaBins(const char* fname="AnalysisResults.root")
388 if (!CheckFitter(fname)) {
389 Error("DrawFits", "File not opened");
392 if (!CheckCanvas()) {
393 Error("DrawFits", "No canvas");
397 canvas->Divide(2,2,0,0);
399 for (UShort_t d=1; d<=3; d++) {
400 UShort_t nQ = (d == 1 ? 1 : 2);
401 for (UShort_t q = 0; q < nQ; q++) {
402 Char_t r = (q == 0 ? 'I' : 'O');
405 static_cast<TList*>(fitter->FindObject(Form("FMD%d%c",d,r)));
407 Error("PrintFits", "Couldn't get ring FMD%d%c", d,r);
410 TList* edists = static_cast<TList*>(ring->FindObject("EDists"));
412 Error("PrintFits", "Couldn't get EDists list for FMD%d%c", d,r);
416 Info("DrawEtaBins", "Drawing for FMD%d%c", d, r);
421 while ((dist = static_cast<TH1*>(next()))) {
422 Info("DrawEtaBins", "FMD%d%c: %s", d, r, dist->GetName());
426 canvas->Print(pdfName, Form("Title:FMD%d%c page %2d", d,r,j));
428 TVirtualPad* p = canvas->cd(++i);
429 p->SetFillColor(kWhite);
433 dist->SetMaximum(15);
439 for (; i <= 4; i++) {
440 TVirtualPad* p = canvas->cd(i);
442 p->SetFillColor(kMagenta-3);
446 canvas->Print(pdfName, Form("FMD%d%c page %2d", d,r,j++));
452 //____________________________________________________________________
454 * Draw energy loss fits to a multi-page PDF
456 * The input file is the result of running AliFMDELossFitter -
457 * either directly via AliFMDELossFitterTask or as part of a larger
458 * train (AliForwardMultiplicityTask or AliForwardMCMultiplicityTask).
469 * +- sigman (THStack)
475 * | +- FMD1I_edist (TH1)
476 * | +- EDists (TList)
482 * @ingroup pwglf_forward_scripts_corr
485 DrawAnaELoss(const char* fname="forward_eloss.root", bool onlySummary=true)
487 if (!CheckCanvas()) {
488 Error("DrawFits", "No canvas");
491 if (!onlySummary) canvas->Print(Form("%s[", pdfName));
492 DrawSummary(fname, onlySummary);
493 if (onlySummary) return;
496 canvas->Print(Form("%s]", pdfName));