2 * Script to draw the energy loss fits from the output file of
3 * AliFMDELossFitter(Task).
6 * @ingroup pwg2_forward_analysis_scripts_corr
19 //____________________________________________________________________
23 const char* pdfName = "FitResults.pdf";
25 //____________________________________________________________________
27 * Open a file. The file is expected to contain the directory
45 * | +- FMD1I_edist (TH1)
50 * @param fname File to open
52 * @return Pointer to the list of objects
54 * @ingroup pwg2_forward_analysis_scripts_corr
56 TList* OpenFile(const char* fname)
58 TFile* file = TFile::Open(fname, "READ");
60 Error("DrawFits", "Couldn't open %s", fname);
64 TList* forward = static_cast<TList*>(file->Get("ForwardResults"));
65 // static_cast<TList*>(file->Get("PWG2forwardDnDeta/Forward"));
67 Error("DrawFits", "Couldn't get forward list from %s", fname);
71 fitter = static_cast<TList*>(forward->FindObject("fmdEnergyFitter"));
73 Error("DrawFits", "Couldn't get fitter folder");
78 //____________________________________________________________________
80 * Open file if not done already
82 * @param fname File to open
84 * @return List of fits
86 * @ingroup pwg2_forward_analysis_scripts_corr
88 TList* CheckFitter(const char* fname="AnalysisResults.root")
90 if (!fitter) return OpenFile(fname);
94 //____________________________________________________________________
96 * Make canvas if not done already
101 * @ingroup pwg2_forward_analysis_scripts_corr
103 TCanvas* CheckCanvas()
105 if (canvas) return canvas;
107 gStyle->SetOptFit(111111);
108 gStyle->SetTitleFillColor(0);
109 gStyle->SetTitleBorderSize(0);
110 gStyle->SetTitleX(0);
111 gStyle->SetTitleY(.9);
112 gStyle->SetTitleW(.4);
113 gStyle->SetTitleH(.1);
114 gStyle->SetStatW(0.2);
115 gStyle->SetStatH(0.2);
116 gStyle->SetStatColor(0);
117 gStyle->SetStatBorderSize(1);
118 gStyle->SetOptTitle(0);
119 gStyle->SetOptFit(1111);
120 gStyle->SetStatW(0.3);
121 gStyle->SetStatH(0.15);
122 gStyle->SetStatColor(0);
123 gStyle->SetStatBorderSize(1);
125 canvas = new TCanvas("c", "C", Int_t(800 / TMath::Sqrt(2)), 800);
126 canvas->SetFillColor(0);
127 canvas->SetBorderMode(0);
128 canvas->SetBorderSize(0);
129 canvas->SetBottomMargin(0.15);
133 //____________________________________________________________________
139 * @ingroup pwg2_forward_analysis_scripts_corr
141 void DrawSummary(const char* fname="forward_eloss.root")
143 if (!CheckFitter(fname)) {
144 Error("DrawFits", "File not opened");
147 if (!CheckCanvas()) {
148 Error("DrawFits", "No canvas");
161 stacks.Add(chi2nu = static_cast<THStack*>(fitter->FindObject("chi2")));
162 stacks.Add(c = static_cast<THStack*>(fitter->FindObject("c")));
163 stacks.Add(delta = static_cast<THStack*>(fitter->FindObject("delta")));
164 stacks.Add(xi = static_cast<THStack*>(fitter->FindObject("xi")));
165 stacks.Add(sigma = static_cast<THStack*>(fitter->FindObject("sigma")));
166 stacks.Add(sigman = static_cast<THStack*>(fitter->FindObject("sigman")));
167 stacks.Add(n = static_cast<THStack*>(fitter->FindObject("n")));
168 Int_t baseA = stacks.GetEntries()+1;
171 TObject* o = fitter->FindObject(Form("a%d",i++));
173 Info("DrawFits", "Adding %s", o->GetName());
177 Int_t nMax = stacks.GetEntries();
178 for (Int_t i = nMax-1; i >= baseA; i--) {
179 THStack* stack = static_cast<THStack*>(stacks.At(i));
180 TIter nextH(stack->GetHists());
182 Bool_t hasData = kFALSE;
183 while ((hist = static_cast<TH1*>(nextH())))
184 if (hist->Integral() > 0) hasData = kTRUE;
185 if (!hasData) nMax--;
188 canvas->SetRightMargin(0.05);
189 canvas->SetTopMargin(0.05);
190 canvas->Divide(2, (nMax+1)/2, 0.1, 0, 0);
196 while ((stack = static_cast<THStack*>(next()))) {
198 TVirtualPad* p = canvas->cd(1+i/5 + 2*(i%5));
199 p->SetLeftMargin(.15);
203 stack->Draw("nostack");
204 stack->GetHistogram()->SetYTitle(stack->GetTitle());
205 stack->GetHistogram()->SetXTitle("#eta");
207 TAxis* yaxis = stack->GetHistogram()->GetYaxis();
208 if (i == 0) yaxis->SetRangeUser(0,20); // Chi2
209 if (i == 1) stack->SetMaximum(1); // c
210 if (i == 2) stack->SetMaximum(1); // delta
211 if (i == 3) stack->SetMaximum(0.1); // xi
212 if (i == 4 || i == 5) stack->SetMaximum(0.5); // sigma{,n}
213 if (i == 7) stack->SetMaximum(0.5); // a
214 yaxis->SetTitleSize(0.15);
215 yaxis->SetLabelSize(0.08);
216 yaxis->SetTitleOffset(0.35);
217 yaxis->SetNdivisions(5);
219 TAxis* xaxis = stack->GetHistogram()->GetXaxis();
220 xaxis->SetTitleSize(0.15);
221 xaxis->SetLabelSize(0.08);
222 xaxis->SetTitleOffset(0.35);
223 xaxis->SetNdivisions(10);
226 stack->Draw("nostack");
231 canvas->Print(pdfName, "Title:Fit summary");
234 //____________________________________________________________________
240 * @ingroup pwg2_forward_analysis_scripts_corr
242 void DrawRings(const char* fname="AnalysisResults.root")
244 if (!CheckFitter(fname)) {
245 Error("DrawFits", "File not opened");
248 if (!CheckCanvas()) {
249 Error("DrawFits", "No canvas");
255 canvas->Divide(1, 5,0,0);
257 const char* dets[] = { "FMD1I", "FMD2I", "FMD2O", "FMD3I", "FMD3O", 0 };
258 for (Int_t i = 0; i < 5; i++) {
259 TVirtualPad* p = canvas->cd(i+1);
264 TList* d = static_cast<TList*>(fitter->FindObject(dets[i]));
266 Warning("DrawFits", "List %s not found", dets[i]);
269 TH1* edist = static_cast<TH1*>(d->FindObject(Form("%s_edist", dets[i])));
271 Warning("DrawFits", "Histogram %s_edist not found", dets[i]);
276 TIter nextF(edist->GetListOfFunctions());
277 while ((f = static_cast<TF1*>(nextF()))) {
278 Double_t chi2 = f->GetChisquare();
279 Int_t ndf = f->GetNDF();
280 Printf("%s %s:\n Range: %f-%f\n"
281 "chi^2/ndf= %f / %d = %f",
282 edist->GetName(), f->GetName(),
283 f->GetXmin(), f->GetXmax(), chi2, ndf,
284 (ndf > 0) ? chi2/ndf : 0);
285 for (Int_t j = 0; j < f->GetNpar(); j++) {
286 Printf(" %-20s : %9.4f +/- %9.4f",
287 f->GetParName(j), f->GetParameter(j), f->GetParError(j));
293 canvas->Print(pdfName, "Title:Fit to rings");
296 //____________________________________________________________________
298 * Draw fits in eta bins
302 * @ingroup pwg2_forward_analysis_scripts_corr
304 void DrawEtaBins(const char* fname="AnalysisResults.root")
306 if (!CheckFitter(fname)) {
307 Error("DrawFits", "File not opened");
310 if (!CheckCanvas()) {
311 Error("DrawFits", "No canvas");
315 canvas->Divide(2,2,0,0);
317 for (UShort_t d=1; d<=3; d++) {
318 UShort_t nQ = (d == 1 ? 1 : 2);
319 for (UShort_t q = 0; q < nQ; q++) {
320 Char_t r = (q == 0 ? 'I' : 'O');
323 static_cast<TList*>(fitter->FindObject(Form("FMD%d%c",d,r)));
325 Error("PrintFits", "Couldn't get ring FMD%d%c", d,r);
328 TList* edists = static_cast<TList*>(ring->FindObject("EDists"));
330 Error("PrintFits", "Couldn't get EDists list for FMD%d%c", d,r);
337 while ((dist = static_cast<TH1*>(next()))) {
341 canvas->Print(pdfName, Form("Title:FMD%d%c page %2d", d,r,j));
343 TVirtualPad* p = canvas->cd(++i);
344 p->SetFillColor(kWhite);
348 dist->SetMaximum(15);
354 for (; i <= 4; i++) {
355 TVirtualPad* p = canvas->cd(i);
357 p->SetFillColor(kMagenta-3);
361 canvas->Print(pdfName, Form("FMD%d%c page %2d", d,r,j++));
367 //____________________________________________________________________
369 * Draw energy loss fits to a multi-page PDF
371 * The input file is the result of running AliFMDELossFitter -
372 * either directly via AliFMDELossFitterTask or as part of a larger
373 * train (AliForwardMultiplicityTask or AliForwardMCMultiplicityTask).
384 * +- sigman (THStack)
390 * | +- FMD1I_edist (TH1)
391 * | +- EDists (TList)
397 * @ingroup pwg2_forward_analysis_scripts_corr
400 DrawAnaELoss(const char* fname="forward_eloss.root")
402 if (!CheckCanvas()) {
403 Error("DrawFits", "No canvas");
406 canvas->Print(Form("%s[", pdfName));
410 canvas->Print(Form("%s]", pdfName));