StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
EEqaPresenter.cxx
1 #include <TPad.h>
2 #include <TH2.h>
3 #include <TH1.h>
4 #include <TF1.h>
5 #include <TEnv.h>
6 #include <TPaveStats.h>
7 #include <TStyle.h> // for gPad
8 #include <TROOT.h> // for gROOT
9 #include <TSystem.h>
10 #include <TMath.h>
11 #include <TObjArray.h>
12 #include <TLine.h>
13 
14 #include <StMessMgr.h>
15 
16 #include "EemcTwMask.h"
17 #include "EEqaPresenter.h"
18 
19 static TObjArray *hCleanUp = new TObjArray();
20 TStyle *defStyle=0;
21 TStyle *ee1Style=0;
22 
23 //--------------------------------------
24 void eePlotInit() {
25  defStyle=gROOT->GetStyle("Default");
26  ee1Style= new TStyle("ee1STyle","ee1Style (general, minimal Stat)");
27  if (ee1Style) {
28  ee1Style->SetOptStat(11);
29  ee1Style->SetPalette(1);
30  ee1Style->SetTextSize(0.09);
31  // ee1Style->cd();
32  }
33 }
34 
35 //--------------------------------------
36 TH1 *GetHisto(FileType &fd,const Char_t *name) {
37  TH1 *h = (TH1*)fd.Get(name, 0);
38  if (h) {
39  h->SetDirectory(0);
40  if (hCleanUp) hCleanUp->Add(h);
41  } else {
42  LOG_ERROR << "Histogram not found: " << name << endm;
43  }
44  return h;
45 }
46 
47 //--------------------------------------
48 void eePlot(int page, int panel, FileType fd, TPad *cc, const Char_t *eemcTwMaskFilename){
49  static bool first = true;
50  static EemcTwMask *twMask = 0;
51  if (first) {
52  eePlotInit();
53  twMask = new EemcTwMask;
54  bool twMaskFound = useTwMask(eemcTwMaskFilename, twMask);
55  if (!twMaskFound) {
56  delete twMask;
57  twMask=0;
58  }
59  first = false;
60  }
61 
62  if (ee1Style) ee1Style->cd(); // use my default style
63  if (hCleanUp) hCleanUp->Delete();
64  cc->Clear();
65 
66  if(page==11) {
67  switch(panel) {
68  case 1: eeJpQa(fd, cc, twMask); break;
69  case 2: eeDaqCorr(fd, cc,1); break;
70  // case 3: eeFreq(fd, cc, twMask); break;
71  // case 4: eeDaqTwCr(fd, cc, twMask); break;
72  case 3: eeDaqTwHot(fd, cc, twMask); break;
73  case 4: eeDaqTwHit(fd, cc); break;
74  default: plNone(cc); break;
75  }
76  } else if (page==12) {
77  switch(panel) {
78  case 1: eeDaqCorr(fd, cc,2); break;
79  case 2: eeDaqMapmtStat(fd, cc); break;
80  // case 3: eeDaqMapmtCr(fd, cc,64); break;
81  // case 4: eeDaqMapmtCr(fd, cc,72); break;
82  // case 5: eeDaqMapmtCr(fd, cc,80); break;
83  // case 6: eeDaqMapmtCr(fd, cc,88); break;
84  // case 7: eeDaqMapmtCr(fd, cc,96); break;
85  // case 8: eeDaqMapmtCr(fd, cc,104); break;
86  case 3: eeDaqSmdA(fd, cc,"SmdA",'U'); break;
87  case 4: eeDaqSmdA(fd, cc,"SmdA",'V'); break;
88  case 5: eeDaqSmdA(fd, cc,"HSmd",'U'); break;
89  case 6: eeDaqSmdA(fd, cc,"HSmd",'V'); break;
90  default: plNone(cc); break;
91  }
92  } else if (page==13) {
93  switch(panel) {
94  // case 1: eeTrigHanks(fd, cc); break;
95  case 1: eeTrigDsm0(fd, cc,"HT"); break;
96  case 2: eeTrigDsm0(fd, cc,"TP"); break;
97  case 3: eeTrigDsm1(fd, cc,"HT"); break;
98  case 4: eeTrigDsm1(fd, cc,"TP"); break;
99  case 5: eeTrigDsm2HT(fd, cc); break;
100  case 6: eeTrigJPsum(fd, cc,"_sum"); break;
101  case 7: eeTrigJPfreq(fd, cc); break;
102  case 8: eeTrigAdjJPsum(fd, cc,"_sum"); break;
103  case 9: eeTrigAdjJPcor(fd, cc,"_cor"); break;
104  case 10: eeTrigEtot(fd, cc); break;
105  default: plNone(cc); break;
106  }
107  } else if (page==14) {
108  switch(panel) {
109  case 1: eeDaqTwCr(fd, cc, twMask); break;
110  case 2: eeFreq(fd, cc, twMask); break;
111  case 3: eeDaqMapmtCr(fd, cc,64); break;
112  case 4: eeDaqMapmtCr(fd, cc,72); break;
113  case 5: eeDaqMapmtCr(fd, cc,80); break;
114  case 6: eeDaqMapmtCr(fd, cc,88); break;
115  case 7: eeDaqMapmtCr(fd, cc,96); break;
116  case 8: eeDaqMapmtCr(fd, cc,104); break;
117  case 9: eeTrigHanks(fd, cc); break;
118  case 10:eeEmuVsSimu(fd, cc); break;
119 
120  default: plNone(cc); break;
121  }
122  }
123 
124  // if (defStyle) defStyle->cd(); // retun to default style
125  LOG_DEBUG << "JB panel=" << panel << " page=" << page << " done" << endm;
126 
127 }
128 
129 //--------------------------------------
130 void plNone(TPad *c) {
131  if (c) c->Clear();
132  TText *txt = new TText(0.05,.5,"tempo disabled, Jan");
133  if (txt) {
134  if (hCleanUp) hCleanUp->Add(txt);
135  txt->Draw();
136  }
137 }
138 
139 //--------------------------------------
140 void eeJpQa(FileType fd, TPad *c0, EemcTwMask *m) { // out
141  c0->Clear();
142  c0->cd(0);
143 
144  TPad* c = new TPad("pad2", "apd2",0.0,0.1,1.,1.);
145  c->Draw(); c->cd();
146  c->Divide(2,2);
147  const Char_t *name1[]={"JPpedZoom","JPtotCor","JPtotFreq","JPpedHot"};
148  const Char_t *name2[]={"JPpedZoom","JPsumTh3","JPtotFreq","xx"};
149  const Char_t **name = (m == 0) ? name2 : name1; // dirty trick, JB
150 
151  TH1* H4jpHot = 0;
152  for (int i = 0;i < 4;i++) {
153  TH1 *h = GetHisto(fd,name[i]);
154  if (!h) continue;
155  c->cd(1+i);
156  if(i==0)
157  h->Draw("colz");
158  else
159  h->Draw("b");
160  if(i==0) gPad->SetLogz();
161  if ((i == 1) || (i == 2)) {
162  eeJpQaMinMax(h);
163  }
164  if (i == 3) H4jpHot = h;
165  }
166 
167  if(m==0) return;
168  if (H4jpHot) {// start counting hot towers
169  H4jpHot->Reset(); // should be here, but online works w/o it
170  for(int cr=1;cr<6;cr++) {
171  TH1 *hx = GetHisto(fd, Form("cr%dHot",cr));
172  if (!hx) continue;
173  if(hx->Integral()<=50 ) continue;
174  if(hx->GetRMS()<=2.) continue;
175  hx->Fit("pol0","0Q");
176  TF1 *ff=hx->GetFunction("pol0");
177  float yM=ff->GetParameter(0);
178 
179  int nb=hx->GetNbinsX();
180  int k;
181  for(k=1;k<=nb;k++){
182  if(hx->GetBinContent(k)<10*yM) continue;
183  if(m && m->crCh[cr-1][k-1]) continue; // ignore masked channels
184  LOG_DEBUG << " hot cr=" << cr << " ch=" << (k - 1) << " val=" << hx->GetBinContent(k) << endm;
185  H4jpHot->Fill(cr);
186  }
187  }
188  }
189  // write text on the left
190  c0->cd(0);
191  TPad *c3 = new TPad("pad3", "apd3",0.,0.,1.,.1);
192  c3->Draw();
193  c3->cd();
194  if (m && m->txtH) m->txtH->Draw();
195 }
196 
197 //--------------------------------------
198 //--------------------------------------
199 void eeDaqCorr(FileType fd, TPad *c, int es) { // out
200 
201  static TPad *c2 =0;
202  static TPad *c3 =0;
203 
204  const Char_t *nameT[]={"ETowHealth","ETowHeadCorr","ETowOFF","ETowN256","ETowOFFid","ETowGhost","ETowCorrBit"};
205  const Char_t *nameE[]={"ESmdHealth","ESmdHeadCorr","ESmdOFF","ESmdN256","ESmdOFFid","ESmdGhost","ESmdCorrBit"};
206 
207  const Char_t **name=nameT;
208  float y1=0.3;
209  int n1=6;
210  if(es==2) {
211  name=nameE;
212  y1=0.45;
213  n1=4;
214  }
215 
216  c->cd(0);
217  c2 = new TPad("pad2", "apd2",0.0,y1+0.01,1.,1.);
218  c2->Draw(); c2->cd();
219  c2->Divide(2,n1/2);
220 
221  for(int i=0;i<n1;i++) {
222  TH1 *h = GetHisto(fd,name[i]);
223  if(!h) continue;
224  c2->cd(1+i);
225  h->Draw();
226  // gPad->SetLogy(0);
227  // if(h->Integral()>0 ) gPad->SetLogy();
228  // if(i<2) gPad->SetLogx();
229  }
230 
231  if(es==2) {
232  c->cd(0);
233  float y2=y1*0.7;
234  c2 = new TPad("pad2", "apd2",0.0,y2,1.,y1);
235  y1=y2;
236  c2->Draw();
237  c2->cd();
238  int i=4;
239  TH1 *h = GetHisto(fd,name[i]);
240  if (h) {
241  h->Draw();
242  if(h->Integral() > 0) gPad->SetLogy();
243  }
244  }
245 
246  c2->cd(5);
247  gPad->SetGridx();
248 
249  c->cd(0);
250  c3 = new TPad("pad3", "apd3",0.0,0.,1.,y1);
251  c3->Draw();
252  c3->cd();
253  int i=6;
254  TH1 *h = GetHisto(fd,name[i]);
255  if (h) {
256  h->Draw();
257  gPad->SetGridx();
258  }
259 }
260 
261 //--------------------------------------
262 void eeEmuVsSimu(FileType fd, TPad *c ) {
263  const Char_t *name[2]={"HighTowerTriggerCorruption","PatchSumTriggerCorruption"};
264  c->Divide(1,2);
265  for (int i = 0;i < 2;i++) {
266  TH1 *h = GetHisto(fd, name[i]);
267  // printf("aaa%d %s %p\n",i,name[i],h);
268  if (h) {
269  c->cd(1 + i);
270  gPad->SetLogz(0);
271  h->Draw("colz");
272  if (h->Integral() > 0) gPad->SetLogz();
273  }
274  }
275 }
276 
277 //--------------------------------------
278 void eeDaqTwCr(FileType fd, TPad *c, EemcTwMask *m) {
279  // raw tower crates 1-6
280  // if (ee2Style) ee2Style->cd();
281  c->Divide(3,2);
282  for (int i = 0;i < 6;i++) {
283  TH1 *h = GetHisto(fd, Form("cr%d",i+1));
284  if (h) {
285  c->cd(i + 1);
286  gPad->SetLogz(0);
287  h->Draw("colz");
288  h->SetAxisRange(0, 500);
289  if (h->Integral() > 0) gPad->SetLogz();
290  if (m) {
291  TGraphErrors &gr = m->crG2[i];
292  if(gr.GetN() > 0) gr.Draw("P");
293  }
294  }
295  }
296 }
297 
298 //--------------------------------------
299 void eeFreq(FileType fd, TPad *c, EemcTwMask *m) {
300  const int nh=4;
301  const Char_t *name[nh]={"TowHits","Pre1Hits","Pre2Hits","PostHits"};
302  c->Divide(1,4);
303  for (int i = 0;i < nh;i++) {
304  TH1 *h = GetHisto(fd, name[i]);
305  if (!h) continue;
306  c->cd(1 + i);
307  gPad->SetLogz(0);
308  h->Draw("colz");
309  gPad->SetGrid();
310  if (h->Integral() > 0 ) gPad->SetLogz();
311  if((i == 0) && m && (m->phiG.GetN() > 0)){ // show hot towers
312  m->phiG.Draw("P");
313  }
314  if (i == 0) addJPphiLimits(h);
315  }
316 }
317 
318 //--------------------------------------
319 void eeDaqTwHit(FileType fd, TPad *c) {
320  const int nh=4;
321  const Char_t *name[nh]={"HTow","HPre1","HPre2","HPost"};
322  c->Divide(2,2);
323  for (int i = 0;i < nh;i++) {
324  TH1 *h = GetHisto(fd, name[i]);
325  if (h) {
326  c->cd(1 + i);
327  gPad->SetLogy(0);
328  h->Draw();
329  if (h->Integral() > 0) gPad->SetLogy();
330  }
331  }
332 }
333 
334 //--------------------------------------
335 void eeMany1D(FileType fd, TPad *c, const Char_t *core, int nh, int nx, int ny) {
336  int linLog=1;
337  c->Divide(nx,ny);
338  for (int i = 0;i < nh;i++) {
339  TH1 *h = GetHisto(fd, Form("%s%d",core,i+1));
340  if (h) {
341  c->cd(i + 1);
342  h->Draw();
343  gPad->SetLogy(0);
344  if ((h->Integral() > 0) && (linLog == 1)) gPad->SetLogy();
345  }
346  }
347 }
348 
349 //--------------------------------------
350 void eeDaqTwHot(FileType fd, TPad *c, EemcTwMask *m) {
351  const int ncr=6; // raw tower crates 1-6
352  TH1 *hh[ncr] = {0};
353  float ymax = 2.0;
354  c->Divide(1, ncr);
355  for (int i = 0;i < ncr;i++) {
356  TH1 *h = GetHisto(fd, Form("cr%dHot",i+1));
357  if (h) {
358  hh[i] = h;
359  c->cd(i + 1);
360  gPad->SetLogy(0);
361  gPad->SetGridx();
362  h->Draw("b");
363  if (h->Integral() <= 10) continue;
364  if (h->GetRMS() <= 2.0) continue;
365  if (h->Integral() > 1) gPad->SetLogy();
366  h->Fit("pol0");
367  TF1 *ff = h->GetFunction("pol0");
368  float yM = ff->GetParameter(0);
369  if (ymax < yM) ymax = yM;
370  if (m) {
371  TGraph &gr = m->crG[i];
372  if (gr.GetN() > 0) gr.Draw("P");
373  }
374  }
375  }
376  for (int i = 0;i < ncr;i++) if (hh[i]) hh[i]->SetMaximum(ymax * 20.);
377 }
378 
379 //--------------------------------------
380 void eeDaqMapmtCr(FileType fd, TPad *c, int cr1) {
381  //raw mapmt crates 84-91 or 92-99
382  c->Divide(4,2);
383  for (int cr = cr1;cr <= cr1 + 7;cr++) {
384  TH1 *h = GetHisto(fd, Form("cr%d", cr));
385  if (h) {
386  c->cd(cr - cr1 + 1);
387  gPad->SetLogz(0);
388  h->Draw("colz");
389  h->SetAxisRange(0, 1000);
390  if(h->Integral() > 0) gPad->SetLogz();
391  }
392  }
393 }
394 
395 //--------------------------------------
396 void eeDaqSmdA(FileType fd, TPad *c, const Char_t *core, Char_t uv){
397  if(strstr(core, "SmdA")) {
398  c->Divide(2, 6);
399  } else {
400  c->Divide(3, 4);
401  }
402  for (int sec = 1;sec <= 12;sec++) {
403  TH1 *h = GetHisto(fd, Form("%s%d%c",core,sec,uv));
404  if (h) {
405  c->cd(sec);
406  h->Draw();
407  gPad->SetLogy(0);
408  if (h->Integral() > 0) gPad->SetLogy();
409  }
410  }
411 }
412 
413 //--------------------------------------
414 void eeDaqMapmtStat(FileType fd, TPad *c) {
415  c->Divide(1,2);
416  TH1 *h = GetHisto(fd, "MAPMHits");
417  TH1 *hcopy = GetHisto(fd, "MAPMHits");
418  if (h) {
419  c->cd(1);
420  h->SetAxisRange(63, 87);
421  h->SetXTitle("Crate ID 12S1=64, 1S1=68, 2S1=72, 3S1=76, 4S1=80, 5S1=84");
422  h->Draw("colz");
423  gPad->SetGrid();
424  gPad->SetLogz(0);
425  if (h->Integral()>0) gPad->SetLogz();
426  }
427  if (hcopy) {
428  c->cd(2);
429  hcopy->SetAxisRange(88, 120);
430  hcopy->SetXTitle("Crate ID 6S1=88, 7S1=92, 8S1=96, 9S1=100, 10S1=104, 11S1=108");
431  hcopy->Draw("colz");
432  gPad->SetGrid();
433  gPad->SetLogz(0);
434  if (hcopy->Integral()>0) gPad->SetLogz();
435  }
436 }
437 
438 //--------------------------------------
439 void eeTrigHanks(FileType fd, TPad *c ) {
440  const Char_t *name[2]={"dsm0inJPall_HT","dsm0inJPall_TP"};
441  c->Divide(1,2);
442  for (int i = 0;i < 2;i++) {
443  TH1 *h = GetHisto(fd, name[i]);
444  if (h) {
445  c->cd(1 + i);
446  gPad->SetLogz(0);
447  h->Draw("colz");
448  if (h->Integral() > 0) gPad->SetLogz();
449  }
450  }
451 }
452 
453 //--------------------------------------
454 void eeTrigDsm0(FileType fd, TPad *c, const Char_t *mode ) {
455  c->Divide(2,3);
456  const int ncr = 6;
457  TH1 *hh[ncr] = {0};
458  float ymax = 0;
459  for (int j = 0;j < ncr;j++) {
460  c->cd(j + 1);
461  TH1 *h = GetHisto(fd, Form("dsm0inJP%d_%s", j+1, mode));
462  if (h) {
463  hh[j] = h;
464  gPad->SetLogz(0);
465  h->Draw("colz");
466  if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
467  if (h->Integral() > 0) gPad->SetLogz();
468  }
469  }
470  for (int j = 0;j < ncr;j++) if (hh[j]) hh[j]->SetMaximum(ymax);
471 }
472 
473 //--------------------------------------
474 void eeTrigDsm1(FileType fd, TPad *c, const Char_t *mode ) {
475  const Char_t *core="dsm1HJP";
476  if (mode[0] == 'H') {
477  c->Divide(2, 6);
478  } else {
479  c->Divide(4, 3);
480  }
481  const int n = 12;
482  TH1 *hh[n] = {0};
483  float ymax = 0;
484  for (int j = 0;j < n;j++) {
485  TH1 *h = GetHisto(fd, Form("%s%d_%s",core,j+1,mode));
486  if (h) {
487  hh[j] = h;
488  c->cd(j + 1);
489  h->Draw("colz");
490  gPad->SetLogz(0);
491  if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
492  if (h->Integral() > 0) gPad->SetLogz();
493  if(mode[0] == 'H') gPad->SetGridx();
494  }
495  }
496  for (int j = 0;j < n;j++) if (hh[j]) hh[j]->SetMaximum(ymax);
497 }
498 
499 //--------------------------------------
500 void eeTrigDsm2HT(FileType fd, TPad *c ) {
501  const Char_t *name[3]={"dsm2Half1_HTTP","dsm2Half2_HTTP","dsm3_HTTP"};
502  c->Divide(2, 2);
503  for (int i = 0;i < 3;i++) {
504  TH1 *h = GetHisto(fd,name[i]);
505  if (h) {
506  c->cd(1 + i);
507  gPad->SetLogz(0);
508  h->Draw("colz");
509  if (h->Integral() > 0) gPad->SetLogz();
510  }
511  }
512 }
513 
514 //--------------------------------------
515 void eeTrigJPsum(FileType fd, TPad *c, const Char_t *mode) {
516  c->Divide(2, 3);
517  const Char_t *core="JP";
518  for (int j = 0;j < 6;j++) {
519  TH1 *h = GetHisto(fd, Form("%s%d%s", core, j + 1, mode));
520  if (h) {
521  c->cd(j + 1);
522  int maxbin = h->GetMaximumBin() - 1;
523  const Char_t *title = h->GetTitle();
524  h->SetTitle(Form("%s ped= %d\n", title, maxbin));
525  gPad->SetLogy(0);
526  h->GetXaxis()->SetRange(1, 200); //for p-p commnet out and use full range for Au-Au
527  h->Draw();
528  if (h->Integral() > 0) gPad->SetLogy();
529  }
530  }
531 }
532 
533 //--------------------------------------
534 void eeTrigJPfreq(FileType fd, TPad *c) {
535  c->Divide(2, 3);
536  const Char_t *core="JPsumTh";
537  for (int j = 0;j < 4;j++) {
538  TH1 *h = GetHisto(fd, Form("%s%d",core,j));
539  if (h) {
540  c->cd(j + 1);
541  h->Draw();
542  h->SetMinimum(0);
543  }
544  }
545  for (int j = 0;j < 2;j++) {
546  TH1 *h = GetHisto(fd, Form("dsm2Half%d_Etot",j+1));
547  if (h) {
548  c->cd(j + 5);
549  h->Draw();
550  }
551  }
552 #if 0
553  // out 2006+
554  TH1 *h = GetHisto(fd, "JPadjTh");
555  c->cd(5);
556  if (h) h->Draw();
557 #endif
558 }
559 
560 //--------------------------------------
561 void eeTrigAdjJPsum(FileType fd, TPad *c, const Char_t *mode) {
562  c->Divide(2, 3);
563  const Char_t *core="JP";
564  for (int j = 0;j < 6;j++) {
565  TH1 *h = GetHisto(fd, Form("%s%d%d%s",core,j+1,((j+1)%6)+1,mode));
566  if (h) {
567  c->cd(j + 1);
568  gPad->SetLogy(0);
569  // h->GetXaxis()->SetRange(19,69); //for p-p commnet out and use full range for Au-Au
570  h->Draw();
571  if (h->Integral() > 0) gPad->SetLogy();
572  }
573  }
574 }
575 
576 //--------------------------------------
577 void eeTrigEtot(FileType fd, TPad *c) {
578  const Char_t *nameA[3]={"dsm2E_etot","dsm2B_etot","dsm2BE_etot"};
579  c->Divide(1, 3);
580  const int n = 6;
581  TH1 *hh[n] = {0};
582  float ymax = 0;
583  for (int i = 0;i < 3;i++) {
584  c->cd(1 + i);
585  gPad->SetLogy(0);
586  for (int ii = 0;ii <= 1;ii++) {
587  TH1 *h = GetHisto(fd, Form("%s%d",nameA[i],ii));
588  if (h) {
589  hh[i + (ii * 3)] = h;
590  if (ii == 0) {
591  h->Draw();
592  TString tt = h->GetTitle();
593  tt += " COLORS: bit=0 BLUE , bit=1 RED";
594  h->SetTitle(tt);
595  } else {
596  h->Draw("same");
597  }
598  if ((ii == 0) && (h->Integral() > 0)) gPad->SetLogy();
599  if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
600  }
601  }
602  }
603  for (int j = 0;j < n;j++) if (hh[j]) hh[j]->SetMaximum(ymax * 1.1);
604 }
605 
606 //--------------------------------------
607 void eeTrigAdjJPcor(FileType fd, TPad *c, const Char_t *mode) {
608  c->Divide(3, 2);
609  const Char_t *core="JP";
610  for (int j = 0;j < 6;j++) {
611  TH1 *h = GetHisto(fd, Form("%s%d%d%s",core,j+1,((j+1)%6)+1,mode));
612  if (h) {
613  c->cd(j + 1);
614  gPad->SetLogz(0);
615  h->Draw("colz");
616  if (h->Integral() > 0) gPad->SetLogz();
617  }
618  }
619 }
620 
621 //--------------------------------------
622 void addJPphiLimits(TH1 *h) {
623  TList *Lx = h ? h->GetListOfFunctions() : 0;
624  if (!Lx || (Lx->GetSize() > 0)) return; // do it just once
625  for (int i = 0;i <= 5;i++) { // boundarioes for JP
626  float x1 = 2.5 + (i * 10);
627  TLine *ln = new TLine(x1, -0.2, x1, 12.5);
628  if (ln) {
629  // no need to garbage collect these because h->GetListOfFunctions() will clean them by itself
630  //if (hCleanUp) hCleanUp->Add(ln);
631  Lx->Add(ln);
632  }
633  int jpid = i + 2;
634  if (jpid == 7) jpid = 1;
635  TString aa = "Jet Patch "; aa += jpid;
636  TText *tt = new TText(x1 + 1, 12.6, aa);
637  if (tt) {
638  //if (hCleanUp) hCleanUp->Add(tt);
639  tt->SetTextSize(0.08);
640  Lx->Add(tt);
641  }
642  }
643 }
644 
645 //--------------------------------------
646 void eeJpQaMinMax(TH1 *hh) {
647  if (!hh) return;
648  hh->SetAxisRange(0.5, 6.4);
649  hh->SetMinimum(0.);
650  int ib = hh->GetMaximumBin();
651  float yMax = hh->GetBinContent(ib);
652  ib = hh->GetMinimumBin();
653  float yMin = hh->GetBinContent(ib);
654  float r = 0, er = 999;
655  if (yMin <= 0) yMin = 1;
656  if (yMax <= 0) yMax = 1;
657  if ((yMin > 0) && (yMax > 0)) {
658  r = yMin / yMax;
659  er = r * TMath::Sqrt((1 / yMax) + (1 / yMin));
660  LOG_DEBUG << Form("JP min/max=%.2f +/- %.2f (min=%.0f max=%.0f) \"%s\"", r, er, yMin, yMax, hh->GetTitle()) << endm;
661  LOG_DEBUG << Form("#JP %.2f %.2f %.0f %.0f :%s", r, er, yMin, yMax, hh->GetTitle()) << endm;
662  }
663 }