]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/corrs/MultCutDrawer.C
Merge branch 'master' into TPCdev
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / corrs / MultCutDrawer.C
CommitLineData
f37328ed 1#ifndef __CINT__
2# include "SummaryDrawer.C"
3# include "AliFMDCorrAcceptance.h"
4# include "AliFMDCorrSecondaryMap.h"
5# include "AliFMDCorrELossFit.h"
6# include "AliFMDMultCuts.h"
7# include "AliForwardUtil.h"
8# include "AliForwardCorrectionManager.h"
9# include "AliLog.h"
10# include <TString.h>
11# include <TError.h>
12#else
13class SummaryDrawer;
14class TObject;
15class AliFMDMultCuts;
16class THStack;
17class TH1;
18#include <TString.h>
19#endif
20
21struct MultCutDrawer : public SummaryDrawer
22{
23 UShort_t fMinQuality;
24 TList fCuts;
25 TList fStacks;
26 Bool_t fMC;
27 //__________________________________________________________________
28 /**
29 * Constructor
30 */
31 MultCutDrawer()
32 : fMinQuality(8),
33 fCuts(),
34 fStacks(),
35 fMC(false)
36 {
37 // Rough equvilance:
38 //
39 // Cut name | Parameter values
40 // -----------+----------------------------------------
41 // mpv | 0.85 0.7 0.4 0.15
42 // xi | 1 2.5 4.5 6.8
43 // sig | .5 1 2 2.9
44 // prob | 1e-1 2.5e-2 5e-4 2.5e-6
45 // -----------+----------------------------------------
46 // Cut name | Mean values
47 // -----------+----------------------------------------
48 // mpv | 0.43 0.36 0.20 0.08
49 // xi | 0.49 0.36 0.23 0.09
50 // sig | 0.44 0.37 0.22 0.10
51 // prob | 0.43 0.35 0.21 0.09
52 //
53 fCuts.Add(new TNamed("mpv", "0.85 0.7 0.4 0.15"));
54 fCuts.Add(new TNamed("xi", "1 2.5 4.5 6.8"));
55 fCuts.Add(new TNamed("sig", ".5 1 2 2.9"));
56 fCuts.Add(new TNamed("prob", "1e-1 2.5e-2 5e-4 2.5e-6"));
57 // fCuts.Add(new TNamed("prob", "1e-2 1e-3 1e-5 1e-7"));
58 }
59 //__________________________________________________________________
60 /**
61 * Copy constructor
62 *
63 * @param o Object to copy from
64 */
65 MultCutDrawer(const MultCutDrawer& o)
66 : fMinQuality(o.fMinQuality),
67 fCuts(),
68 fStacks(),
69 fMC(false)
70 {}
71 //__________________________________________________________________
72 /**
73 * Assignment operator
74 *
75 * @param o Obejct to assign from
76 *
77 * @return Reference to this
78 */
79 MultCutDrawer& operator=(const MultCutDrawer& o)
80 {
81 if (&o == this) return *this;
82 fMinQuality = o.fMinQuality;
83 fCuts.AddAll(&o.fCuts);
84 fStacks.AddAll(&o.fStacks);
85 return *this;
86 }
87 //__________________________________________________________________
88 /**
89 * Destructor
90 */
91 ~MultCutDrawer()
92 {
93 CloseCanvas();
94 }
95 //__________________________________________________________________
96 /**
97 * Run the class
98 *
99 * @param runNo Run number (or 999 for don't care)
100 * @param sys System (or 0 for don't care)
101 * @param sNN Collision energy in GeV (or 0 for don't care)
102 * @param field L3 Field in kG (or 999 for don't care)
103 * @param mc True of MC
104 * @param local Possible local database
105 */
106 void Run(ULong_t runNo=999,
107 UShort_t sys=0,
108 UShort_t sNN=0,
109 Short_t field=999,
110 Bool_t mc=false,
111 const Char_t* local=0)
112 {
113 Bool_t sat = false;
114 if (!Init(runNo, sys, sNN, field, mc, sat, local)) return;
115
116 Double_t savX = fParVal->GetX();
117 Double_t savY = fParVal->GetY();
118 fParVal->SetX(.4);
119 fParVal->SetY(.4);
a19faec0 120 // fPause = true;
121
f37328ed 122 TIter iCut(&fCuts);
123 TObject* pCut = 0;
124 while ((pCut = iCut())) {
125 TString method(pCut->GetName());
126 TString sP(pCut->GetTitle());
127 TObjArray* aP = sP.Tokenize(" ");
128 TIter iP(aP);
129 TObjString* pP = 0;
a19faec0 130 TString tM;
131 fBody->SetBottomMargin(0.20);
132 fBody->SetLeftMargin(0.06);
f37328ed 133 fBody->Divide(1, aP->GetEntries(), 0, 0);
134 Int_t iPad = 1;
135 while ((pP = static_cast<TObjString*>(iP()))) {
136 THStack* all = AllStack(iPad-1);
137 Double_t p = pP->String().Atof();
138 Double_t vP[] = { p, p, p, p, p };
139 THStack* stack = CutStack(method, vP, all);
a19faec0 140 if (tM.IsNull()) tM = stack->GetTitle();
f37328ed 141 // Kill title on all but first sub-panel
a19faec0 142 stack->SetTitle("");
f37328ed 143 DrawInPad(fBody, iPad, stack, "nostack p");
a19faec0 144 stack->GetYaxis()->SetTitleSize(0.12);
145 stack->GetYaxis()->SetTitleOffset(0.2);
146 stack->GetYaxis()->SetLabelSize(0.07);
147 if (iPad == 1) stack->GetYaxis()->SetTitle(tM);
148 stack->GetXaxis()->SetTitle("#eta");
149 stack->GetXaxis()->SetTitleSize(0.12);
150 stack->GetXaxis()->SetTitleOffset(0.6);
151 stack->GetXaxis()->SetTitleColor(kBlack);
152 stack->GetXaxis()->SetLabelSize(0.07);
153 stack->GetXaxis()->Dump();
154
155
156 if (iPad == 1) {
157 Color_t col = kBlack;
158 Double_t hLtx = 0.07;
159 Double_t yLtx = 7*(hLtx+.005)+0.01;
160 TLatex* nLtx = new TLatex(-0.75, yLtx, "Ring");
161 TLatex* pLtx = new TLatex(-0.7, yLtx, "Param");
162 TLatex* vLtx = new TLatex(+0, yLtx, "Mean#pmVar_{min}^{max}");
163 nLtx->SetTextAlign(31);pLtx->SetTextAlign(11);
164 nLtx->SetTextSize(hLtx);
165 pLtx->SetTextSize(hLtx);
166 vLtx->SetTextSize(hLtx);
167 nLtx->SetTextColor(col);
168 pLtx->SetTextColor(col);
169 vLtx->SetTextColor(col);
170 nLtx->Draw();
171 pLtx->Draw();
172 vLtx->Draw();
173 }
f37328ed 174 // if (iPad == 1) {
175 // fBody->cd(1);
176 // DrawRingLegend(0.4, 0.4, 0.7, 0.9);
177 // }
178 iPad++;
179 }
a19faec0 180 PrintCanvas(Form("%s X={%s}", tM.Data(), sP.Data()));
f37328ed 181 }
a19faec0 182
f37328ed 183 Int_t nAll = fStacks.GetEntries();
a19faec0 184 fBody->SetBottomMargin(0.20);
185 fBody->SetLeftMargin(0.06);
f37328ed 186 fBody->Divide(1, nAll, 0, 0);
187 for (Int_t iAll = 0; iAll < nAll; iAll++) {
188 THStack* all = AllStack(iAll);
189 DrawInPad(fBody, iAll+1, all, "nostack hist p");
a19faec0 190 all->GetYaxis()->SetTitleSize(0.12);
191 all->GetYaxis()->SetTitleOffset(0.2);
192 all->GetYaxis()->SetLabelSize(0.07);
193 if (iAll == 0) all->GetYaxis()->SetTitle("c");
194 all->GetXaxis()->SetTitle("#eta");
195 all->GetXaxis()->SetTitleSize(0.12);
196 all->GetXaxis()->SetTitleOffset(0.6);
197 all->GetXaxis()->SetTitleColor(kBlack);
198 all->GetXaxis()->SetLabelSize(0.07);
199
f37328ed 200 TVirtualPad* p = fBody->GetPad(iAll+1);
201 p->cd();
202 Double_t yT = 1-p->GetTopMargin();
a19faec0 203 if (iAll == 0) DrawRingLegend(p, kNorth|kCenter);
f37328ed 204 else if (iAll == 1) DrawMethodLegend(0.35, 0.4, 0.55,yT);
205
206 Double_t y1 = ((iAll + 2 >= nAll) ? yT - .3 : p->GetBottomMargin());
207 Double_t y2 = ((iAll + 2 >= nAll) ? yT : 0.3);
208 DrawValueLegend(all, 0.2, y1, 0.9, y2);
209
210 }
211 PrintCanvas("Comparisons");
212
213 fParVal->SetX(savX);
214 fParVal->SetY(savY);
215
216 CloseCanvas();
217 }
218 //__________________________________________________________________
219 /**
220 * Draw legend of methods
221 *
222 * @param x1 Left x
223 * @param y1 Lower y
224 * @param x2 Right x
225 * @param y2 Upper y
226 */
227 void DrawMethodLegend(Double_t x1, Double_t y1,
228 Double_t x2, Double_t y2)
229 {
230 TLegend* l = new TLegend(x1,y1,x2,y2);
231 l->SetBorderSize(0);
232 l->SetFillColor(0);
233 l->SetFillStyle(0);
234
235 TIter iCut(&fCuts);
236 TObject* pCut = 0;
237 while ((pCut = iCut())) {
238 TString method(pCut->GetName());
239 AliFMDMultCuts::EMethod m = AliFMDMultCuts::String2Method(method);
240 TString title(AliFMDMultCuts::Method2String(m,true));
241 Style_t style = CutStyle(m);
242 TLegendEntry* e = l->AddEntry("dummy", title, "p");
243 e->SetMarkerStyle(style);
244 e->SetMarkerColor(kBlack);
245 }
246 l->Draw();
247 }
248 //__________________________________________________________________
249 /**
250 * Draw a value legend
251 *
252 * @param stack Stack to take values from
253 * @param x1 Left x
254 * @param y1 Lower y
255 * @param x2 Right x
256 * @param y2 Upper y
257 */
258 void DrawValueLegend(THStack* stack,
259 Double_t x1, Double_t y1,
260 Double_t x2, Double_t y2)
261 {
262 TLegend* l = new TLegend(x1,y1,x2,y2);
263 l->SetBorderSize(0);
264 l->SetFillColor(0);
265 l->SetFillStyle(0);
266
267 TString seen;
268 TIter iHist(stack->GetHists());
269 TH1* pHist = 0;
270 Int_t nHist = 0;
271 while ((pHist = static_cast<TH1*>(iHist()))) {
272 TString name(pHist->GetName());
273 if (seen.Contains(name)) continue;
274 seen.Append(Form(" %s", name.Data()));
275 nHist++;
276
277 AliFMDMultCuts::EMethod m = AliFMDMultCuts::String2Method(name);
278 Style_t s = CutStyle(m);
279 TLegendEntry* e = l->AddEntry("dummy", pHist->GetTitle(), "p");
280 e->SetMarkerStyle(s);
281 e->SetMarkerColor(kBlack);
282 }
283 if (nHist < 5) l->SetNColumns(nHist);
284 else l->SetNColumns(nHist/2);
285
286 l->Draw();
287 }
288 //__________________________________________________________________
289 /**
290 * Get stack at @a i. If the stack doesn't exist, make it
291 *
292 * @param i Location (0-based)
293 *
294 * @return Stack
295 */
296 THStack* AllStack(Int_t i)
297 {
298 TObject* o = fStacks.At(i);
299 if (o) return static_cast<THStack*>(o);
300 THStack* s = new THStack(Form("all%02d", i), "");
301 fStacks.AddAt(s, i);
302 return s;
303 }
304 //__________________________________________________________________
305 /**
306 * Get the marker styoe associated with a cut
307 *
308 * @param m Cut identifier
309 *
310 * @return Marker style
311 */
312 static Style_t CutStyle(UShort_t m)
313 {
314 switch (m) {
315 case AliFMDMultCuts::kFixed: return kFullStar;
316 case AliFMDMultCuts::kMPVFraction: return kOpenCircle;
317 case AliFMDMultCuts::kFitRange: return 33; // Diamond
318 case AliFMDMultCuts::kLandauWidth: return 34; // Cross
319 case AliFMDMultCuts::kLandauSigmaWidth: return kOpenSquare;
320 case AliFMDMultCuts::kProbability: return kFullTriangleDown;
321 }
322 return kFullDotMedium;
323 }
324 //__________________________________________________________________
325 /**
326 * Update statistics
327 *
328 * @param y Current value
329 * @param cnt Current count
330 * @param mean Current mean
331 * @param var Current variance
332 */
333 static void Statistics(Double_t y,
334 Int_t& cnt,
335 Double_t& mean,
336 Double_t& var)
337 {
338 cnt += 1;
339 mean += (y - mean) / cnt;
340 var += (cnt > 1 ? (TMath::Power(y-mean,2)/(cnt-1)-var/cnt) : 0);
341 }
342 //__________________________________________________________________
343 /**
344 * Calculate statistics for a histogram
345 *
346 * @param h Histogram
347 * @param mean On return, the mean of y
348 * @param var On return, the variance in y
349 * @param min On return, the least y
350 * @param max On return, the largest y
351 * @param rCnt In/out: Current count
352 * @param rMean In/out: Current mean
353 * @param rVar In/out: Current variance
354 */
355 static void HistStatistics(const TH1* h,
356 Double_t& mean,
357 Double_t& var,
358 Double_t& min,
359 Double_t& max,
360 Int_t& rCnt,
361 Double_t& rMean,
362 Double_t& rVar)
363 {
364 mean = 0;
365 var = 0;
366 min = +100000;
367 max = -100000;
368 Int_t cnt = 0;
369 for (Int_t i = 1; i <= h->GetNbinsX(); i++) {
370 Double_t y = h->GetBinContent(i);
371 if (TMath::Abs(y) <= 1e-9) continue;
372 min = TMath::Min(min, y);
373 max = TMath::Max(max, y);
374 Statistics(y, cnt, mean, var);
375 Statistics(y, rCnt, rMean, rVar);
376 }
377 // Info("", "Stats for %s: mean=%f +/- %f [%f,%f]",
378 // h->GetTitle(), mean, var, min, max);
379 }
380 //__________________________________________________________________
381 /**
382 * Create a stack from cuts
383 *
384 * @param method Method to use
385 * @param param Parameters
386 * @param all Stack to add for this set of parameters
387 *
388 * @return Newly created stack
389 */
390 THStack* CutStack(const TString& method, Double_t* param, THStack* all)
391 {
392 AliFMDMultCuts::EMethod m = AliFMDMultCuts::String2Method(method);
393 Info("CutStack", "Method %s -> %d", method.Data(), m);
394 AliFMDMultCuts* cut = new AliFMDMultCuts(m,
395 param[0],
396 param[1],
397 param[2],
398 param[3],
399 param[4]);
400 // cut->Print();
401
402 TH2* hist = new TH2D("cut", cut->GetMethodString(true),
403 200, -4, 6, 5, 0.5, 5.5);
404 hist->GetYaxis()->SetBinLabel(1, "FMD1i");
405 hist->GetYaxis()->SetBinLabel(2, "FMD2i");
406 hist->GetYaxis()->SetBinLabel(3, "FMD2o");
407 hist->GetYaxis()->SetBinLabel(4, "FMD3o");
408 hist->GetYaxis()->SetBinLabel(5, "FMD3i");
409
410 // Info("DrawMultCuts", "Filling histogram");
411 cut->FillHistogram(hist);
412 // Info("DrawMultCuts", "Done filling");
413
414 Style_t style = CutStyle(m);
415 THStack* stack = new THStack(hist, "x");
416 TList* hists = stack->GetHists();
417 Double_t rMin = +1000000;
418 Double_t rMax = -1000000;
419 Double_t rAvg = 0;
420 Double_t rVar = 0;
421 Int_t rCnt = 0;
422 printf(" %6s %7.4f | ", method.Data(), param[0]);
423 TH1* first = 0;
424 for (Int_t i = 1; i <= 5; i++) {
425 TH1* h = static_cast<TH1*>(hists->At(i-1));
426 TString n(hist->GetYaxis()->GetBinLabel(i));
427 TString nn(n); nn.Remove(0,3);
428 UShort_t det = nn.Atoi();
429 Char_t rng = nn[1];
430 Color_t col = AliForwardUtil::RingColor(det, rng);
431 if (!first) first = h;
432 h->SetName(method);
433 h->SetTitle(Form("%f", param[i-1]));
a19faec0 434 h->SetYTitle(cut->GetMethodString(true));
435 h->SetXTitle("#eta");
f37328ed 436 h->SetMarkerColor(col);
437 h->SetFillColor(col);
438 h->SetLineColor(col);
439 h->SetMarkerStyle(style);
440 h->SetFillStyle(0);
441 Double_t avg, var, min, max;
442
443 HistStatistics(h, avg, var, min, max, rCnt, rAvg, rVar);
444 rMin = TMath::Min(min, rMin);
445 rMax = TMath::Max(max, rMax);
446 all->Add(h);
a19faec0 447 Double_t hLtx = 0.07;
448 Double_t yLtx = i*(hLtx+.005)+0.01;
449 TObjArray* lines = new TObjArray(3);
450 TLatex* nLtx = new TLatex(-0.75, yLtx, n);
451 TLatex* pLtx = new TLatex(-0.7, yLtx, Form("X=%g", param[i-1]));
452 TLatex* vLtx = new TLatex(+0, yLtx,
453 Form("%5.3f#pm%6.4f_{%6.4f}^{%6.4f}",
454 avg, var, max-avg, avg-min));
455 nLtx->SetTextAlign(31);pLtx->SetTextAlign(11);
456 nLtx->SetTextSize(hLtx);pLtx->SetTextSize(hLtx),vLtx->SetTextSize(hLtx);
457 nLtx->SetTextColor(col);pLtx->SetTextColor(col);vLtx->SetTextColor(col);
458 lines->Add(nLtx);lines->Add(pLtx);lines->Add(vLtx);
459 h->GetListOfFunctions()->Add(lines);
f37328ed 460 printf("%5.3f+/-%6.4f ", avg, var);
461 }
462 TLatex* rLtx = new TLatex(6, fMC ? 0.65 : 0.55,
463 Form("All: %5.3f#pm%6.4f_{%6.4f}^{%6.4f}",
464 rAvg, rVar, rMin, rMax));
465 rLtx->SetTextSize(0.05);
466 rLtx->SetTextAlign(31);
467 first->GetListOfFunctions()->Add(rLtx);
468 Printf("-> %5.3f+/-%6.4f", rAvg, rVar);
a19faec0 469 stack->SetTitle(cut->GetMethodString(true)); // hist->GetTitle());
f37328ed 470 stack->SetMinimum(0); // 0.98*min);
471 stack->SetMaximum(fMC ? 0.7 : 0.6); // 1.02*max);
472 all->SetMinimum(0);
473 all->SetMaximum(fMC ? 0.7 : 0.6);
474
475 delete hist;
476 return stack;
477 }
478 //__________________________________________________________________
479 /**
480 * Initialize
481 *
482 * @param runNo Run number (or 999 for don't care)
483 * @param sys System (or 0 for don't care)
484 * @param sNN Collision energy in GeV (or 0 for don't care)
485 * @param field L3 Field in kG (or 999 for don't care)
486 * @param mc True of MC
487 * @param sat True for including satellite collisions
488 * @param local Possible local database
489 *
490 * @return true on sucess
491 */
492 Bool_t Init(ULong_t runNo=999,
493 UShort_t sys=0,
494 UShort_t sNN=0,
495 Short_t field=999,
496 Bool_t mc=false,
497 Bool_t sat=false,
498 const Char_t* local=0)
499 {
500 fMC = mc;
501 AliForwardCorrectionManager& mgr = AliForwardCorrectionManager::Instance();
502 mgr.SetDebug(true);
503 UShort_t flags = AliForwardCorrectionManager::kELossFits;
504
505 if (local && local[0] != '\0') mgr.SetELossFitsPath(local);
506
507 if (!mgr.Init(runNo, sys, sNN, field, mc, false, flags, true)) {
508 Error("DrawMultCuts", "Failed to initialize for flags=0x%02x, "
509 "run=%lu, sys=%hu, sNN=%hu, field=%hd, mc=%s, sat=%s",
510 flags, runNo, sys, sNN, field, mc ? "true" : "false", "false");
511 return false;
512 }
513 const AliFMDCorrELossFit* cFit = mgr.GetELossFit();
514 AliFMDCorrELossFit* fit = const_cast<AliFMDCorrELossFit*>(cFit);
515 fit->CacheBins(8);
516
a19faec0 517 CreateCanvas("multCuts.pdf", true);
f37328ed 518
519 fBody->cd();
520
a19faec0 521 Double_t y = .85;
522 TLatex* title = new TLatex(.5, y, "#Delta Cuts");
523 title->SetTextAlign(23);
524 title->SetTextFont(42);
525 title->SetTextSize(0.1);
526 title->Draw();
527
528 y -= 0.11;
f37328ed 529 DrawParameter(y, "Run #", Form("%lu", runNo));
530 DrawParameter(y, "System", AliForwardUtil::CollisionSystemString(sys));
531 DrawParameter(y, "#sqrt{s_{NN}}",
532 AliForwardUtil::CenterOfMassEnergyString(sNN));
533 DrawParameter(y, "L3 field", AliForwardUtil::MagneticFieldString(field));
534 DrawParameter(y, "Simulation", Form("%s", mc ? "yes" : "no"));
535 DrawParameter(y, "Satellite", Form("%s", sat ? "yes" : "no"));
a19faec0 536 PrintCanvas("Delta cuts");
f37328ed 537
538 return true;
539 }
540};