00001 #include <TPad.h>
00002 #include <TH2.h>
00003 #include <TH1.h>
00004 #include <TF1.h>
00005 #include <TEnv.h>
00006 #include <TPaveStats.h>
00007 #include <TStyle.h>
00008 #include <TROOT.h>
00009 #include <TSystem.h>
00010 #include <TMath.h>
00011 #include <TObjArray.h>
00012
00013 #include <StMessMgr.h>
00014
00015 #include "EemcTwMask.h"
00016 #include "EEqaPresenter.h"
00017
00018 static TObjArray *hCleanUp = new TObjArray();
00019 TStyle *defStyle=0;
00020 TStyle *ee1Style=0;
00021
00022
00023 void eePlotInit() {
00024 defStyle=gROOT->GetStyle("Default");
00025 ee1Style= new TStyle("ee1STyle","ee1Style (general, minimal Stat)");
00026 if (ee1Style) {
00027 ee1Style->SetOptStat(11);
00028 ee1Style->SetPalette(1);
00029 ee1Style->SetTextSize(0.09);
00030
00031 }
00032 }
00033
00034
00035 TH1 *GetHisto(FileType &fd,const Char_t *name) {
00036 TH1 *h = (TH1*)fd.Get(name, 0);
00037 if (h) {
00038 h->SetDirectory(0);
00039 if (hCleanUp) hCleanUp->Add(h);
00040 } else {
00041 LOG_ERROR << "Histogram not found: " << name << endm;
00042 }
00043 return h;
00044 }
00045
00046
00047 void eePlot(int page, int panel, FileType fd, TPad *cc, const Char_t *eemcTwMaskFilename){
00048 static bool first = true;
00049 static EemcTwMask *twMask = 0;
00050 if (first) {
00051 eePlotInit();
00052 twMask = new EemcTwMask;
00053 bool twMaskFound = useTwMask(eemcTwMaskFilename, twMask);
00054 if (!twMaskFound) {
00055 delete twMask;
00056 twMask=0;
00057 }
00058 first = false;
00059 }
00060
00061 if (ee1Style) ee1Style->cd();
00062 if (hCleanUp) hCleanUp->Delete();
00063 cc->Clear();
00064
00065 if(page==11) {
00066 switch(panel) {
00067 case 1: eeJpQa(fd, cc, twMask); break;
00068 case 2: eeDaqCorr(fd, cc,1); break;
00069
00070
00071 case 3: eeDaqTwHot(fd, cc, twMask); break;
00072 case 4: eeDaqTwHit(fd, cc); break;
00073 default: plNone(cc); break;
00074 }
00075 } else if (page==12) {
00076 switch(panel) {
00077 case 1: eeDaqCorr(fd, cc,2); break;
00078 case 2: eeDaqMapmtStat(fd, cc); break;
00079
00080
00081
00082
00083
00084
00085 case 3: eeDaqSmdA(fd, cc,"SmdA",'U'); break;
00086 case 4: eeDaqSmdA(fd, cc,"SmdA",'V'); break;
00087 case 5: eeDaqSmdA(fd, cc,"HSmd",'U'); break;
00088 case 6: eeDaqSmdA(fd, cc,"HSmd",'V'); break;
00089 default: plNone(cc); break;
00090 }
00091 } else if (page==13) {
00092 switch(panel) {
00093
00094 case 1: eeTrigDsm0(fd, cc,"HT"); break;
00095 case 2: eeTrigDsm0(fd, cc,"TP"); break;
00096 case 3: eeTrigDsm1(fd, cc,"HT"); break;
00097 case 4: eeTrigDsm1(fd, cc,"TP"); break;
00098 case 5: eeTrigDsm2HT(fd, cc); break;
00099 case 6: eeTrigJPsum(fd, cc,"_sum"); break;
00100 case 7: eeTrigJPfreq(fd, cc); break;
00101 case 8: eeTrigAdjJPsum(fd, cc,"_sum"); break;
00102 case 9: eeTrigAdjJPcor(fd, cc,"_cor"); break;
00103 case 10: eeTrigEtot(fd, cc); break;
00104 default: plNone(cc); break;
00105 }
00106 } else if (page==14) {
00107 switch(panel) {
00108 case 1: eeDaqTwCr(fd, cc, twMask); break;
00109 case 2: eeFreq(fd, cc, twMask); break;
00110 case 3: eeDaqMapmtCr(fd, cc,64); break;
00111 case 4: eeDaqMapmtCr(fd, cc,72); break;
00112 case 5: eeDaqMapmtCr(fd, cc,80); break;
00113 case 6: eeDaqMapmtCr(fd, cc,88); break;
00114 case 7: eeDaqMapmtCr(fd, cc,96); break;
00115 case 8: eeDaqMapmtCr(fd, cc,104); break;
00116 case 9: eeTrigHanks(fd, cc); break;
00117 case 10:eeEmuVsSimu(fd, cc); break;
00118
00119 default: plNone(cc); break;
00120 }
00121 }
00122
00123
00124 LOG_DEBUG << "JB panel=" << panel << " page=" << page << " done" << endm;
00125
00126 }
00127
00128
00129 void plNone(TPad *c) {
00130 if (c) c->Clear();
00131 TText *txt = new TText(0.05,.5,"tempo disabled, Jan");
00132 if (txt) {
00133 if (hCleanUp) hCleanUp->Add(txt);
00134 txt->Draw();
00135 }
00136 }
00137
00138
00139 void eeJpQa(FileType fd, TPad *c0, EemcTwMask *m) {
00140 c0->Clear();
00141 c0->cd(0);
00142
00143 TPad* c = new TPad("pad2", "apd2",0.0,0.1,1.,1.);
00144 c->Draw(); c->cd();
00145 c->Divide(2,2);
00146 const Char_t *name1[]={"JPpedZoom","JPtotCor","JPtotFreq","JPpedHot"};
00147 const Char_t *name2[]={"JPpedZoom","JPsumTh3","JPtotFreq","xx"};
00148 const Char_t **name = (m == 0) ? name2 : name1;
00149
00150 TH1* H4jpHot = 0;
00151 for (int i = 0;i < 4;i++) {
00152 TH1 *h = GetHisto(fd,name[i]);
00153 if (!h) continue;
00154 c->cd(1+i);
00155 if(i==0)
00156 h->Draw("colz");
00157 else
00158 h->Draw("b");
00159 if(i==0) gPad->SetLogz();
00160 if ((i == 1) || (i == 2)) {
00161 eeJpQaMinMax(h);
00162 }
00163 if (i == 3) H4jpHot = h;
00164 }
00165
00166 if(m==0) return;
00167 if (H4jpHot) {
00168 H4jpHot->Reset();
00169 for(int cr=1;cr<6;cr++) {
00170 TH1 *hx = GetHisto(fd, Form("cr%dHot",cr));
00171 if (!hx) continue;
00172 if(hx->Integral()<=50 ) continue;
00173 if(hx->GetRMS()<=2.) continue;
00174 hx->Fit("pol0","0Q");
00175 TF1 *ff=hx->GetFunction("pol0");
00176 float yM=ff->GetParameter(0);
00177
00178 int nb=hx->GetNbinsX();
00179 int k;
00180 for(k=1;k<=nb;k++){
00181 if(hx->GetBinContent(k)<10*yM) continue;
00182 if(m && m->crCh[cr-1][k-1]) continue;
00183 LOG_DEBUG << " hot cr=" << cr << " ch=" << (k - 1) << " val=" << hx->GetBinContent(k) << endm;
00184 H4jpHot->Fill(cr);
00185 }
00186 }
00187 }
00188
00189 c0->cd(0);
00190 TPad *c3 = new TPad("pad3", "apd3",0.,0.,1.,.1);
00191 c3->Draw();
00192 c3->cd();
00193 if (m && m->txtH) m->txtH->Draw();
00194 }
00195
00196
00197
00198 void eeDaqCorr(FileType fd, TPad *c, int es) {
00199
00200 static TPad *c2 =0;
00201 static TPad *c3 =0;
00202
00203 const Char_t *nameT[]={"ETowHealth","ETowHeadCorr","ETowOFF","ETowN256","ETowOFFid","ETowGhost","ETowCorrBit"};
00204 const Char_t *nameE[]={"ESmdHealth","ESmdHeadCorr","ESmdOFF","ESmdN256","ESmdOFFid","ESmdGhost","ESmdCorrBit"};
00205
00206 const Char_t **name=nameT;
00207 float y1=0.3;
00208 int n1=6;
00209 if(es==2) {
00210 name=nameE;
00211 y1=0.45;
00212 n1=4;
00213 }
00214
00215 c->cd(0);
00216 c2 = new TPad("pad2", "apd2",0.0,y1+0.01,1.,1.);
00217 c2->Draw(); c2->cd();
00218 c2->Divide(2,n1/2);
00219
00220 for(int i=0;i<n1;i++) {
00221 TH1 *h = GetHisto(fd,name[i]);
00222 if(!h) continue;
00223 c2->cd(1+i);
00224 h->Draw();
00225
00226
00227
00228 }
00229
00230 if(es==2) {
00231 c->cd(0);
00232 float y2=y1*0.7;
00233 c2 = new TPad("pad2", "apd2",0.0,y2,1.,y1);
00234 y1=y2;
00235 c2->Draw();
00236 c2->cd();
00237 int i=4;
00238 TH1 *h = GetHisto(fd,name[i]);
00239 if (h) {
00240 h->Draw();
00241 if(h->Integral() > 0) gPad->SetLogy();
00242 }
00243 }
00244
00245 c2->cd(5);
00246 gPad->SetGridx();
00247
00248 c->cd(0);
00249 c3 = new TPad("pad3", "apd3",0.0,0.,1.,y1);
00250 c3->Draw();
00251 c3->cd();
00252 int i=6;
00253 TH1 *h = GetHisto(fd,name[i]);
00254 if (h) {
00255 h->Draw();
00256 gPad->SetGridx();
00257 }
00258 }
00259
00260
00261 void eeEmuVsSimu(FileType fd, TPad *c ) {
00262 const Char_t *name[2]={"HighTowerTriggerCorruption","PatchSumTriggerCorruption"};
00263 c->Divide(1,2);
00264 for (int i = 0;i < 2;i++) {
00265 TH1 *h = GetHisto(fd, name[i]);
00266
00267 if (h) {
00268 c->cd(1 + i);
00269 gPad->SetLogz(0);
00270 h->Draw("colz");
00271 if (h->Integral() > 0) gPad->SetLogz();
00272 }
00273 }
00274 }
00275
00276
00277 void eeDaqTwCr(FileType fd, TPad *c, EemcTwMask *m) {
00278
00279
00280 c->Divide(3,2);
00281 for (int i = 0;i < 6;i++) {
00282 TH1 *h = GetHisto(fd, Form("cr%d",i+1));
00283 if (h) {
00284 c->cd(i + 1);
00285 gPad->SetLogz(0);
00286 h->Draw("colz");
00287 h->SetAxisRange(0, 500);
00288 if (h->Integral() > 0) gPad->SetLogz();
00289 if (m) {
00290 TGraphErrors &gr = m->crG2[i];
00291 if(gr.GetN() > 0) gr.Draw("P");
00292 }
00293 }
00294 }
00295 }
00296
00297
00298 void eeFreq(FileType fd, TPad *c, EemcTwMask *m) {
00299 const int nh=4;
00300 const Char_t *name[nh]={"TowHits","Pre1Hits","Pre2Hits","PostHits"};
00301 c->Divide(1,4);
00302 for (int i = 0;i < nh;i++) {
00303 TH1 *h = GetHisto(fd, name[i]);
00304 if (!h) continue;
00305 c->cd(1 + i);
00306 gPad->SetLogz(0);
00307 h->Draw("colz");
00308 gPad->SetGrid();
00309 if (h->Integral() > 0 ) gPad->SetLogz();
00310 if((i == 0) && m && (m->phiG.GetN() > 0)){
00311 m->phiG.Draw("P");
00312 }
00313 if (i == 0) addJPphiLimits(h);
00314 }
00315 }
00316
00317
00318 void eeDaqTwHit(FileType fd, TPad *c) {
00319 const int nh=4;
00320 const Char_t *name[nh]={"HTow","HPre1","HPre2","HPost"};
00321 c->Divide(2,2);
00322 for (int i = 0;i < nh;i++) {
00323 TH1 *h = GetHisto(fd, name[i]);
00324 if (h) {
00325 c->cd(1 + i);
00326 gPad->SetLogy(0);
00327 h->Draw();
00328 if (h->Integral() > 0) gPad->SetLogy();
00329 }
00330 }
00331 }
00332
00333
00334 void eeMany1D(FileType fd, TPad *c, const Char_t *core, int nh, int nx, int ny) {
00335 int linLog=1;
00336 c->Divide(nx,ny);
00337 for (int i = 0;i < nh;i++) {
00338 TH1 *h = GetHisto(fd, Form("%s%d",core,i+1));
00339 if (h) {
00340 c->cd(i + 1);
00341 h->Draw();
00342 gPad->SetLogy(0);
00343 if ((h->Integral() > 0) && (linLog == 1)) gPad->SetLogy();
00344 }
00345 }
00346 }
00347
00348
00349 void eeDaqTwHot(FileType fd, TPad *c, EemcTwMask *m) {
00350 const int ncr=6;
00351 TH1 *hh[ncr] = {0};
00352 float ymax = 2.0;
00353 c->Divide(1, ncr);
00354 for (int i = 0;i < ncr;i++) {
00355 TH1 *h = GetHisto(fd, Form("cr%dHot",i+1));
00356 if (h) {
00357 hh[i] = h;
00358 c->cd(i + 1);
00359 gPad->SetLogy(0);
00360 gPad->SetGridx();
00361 h->Draw("b");
00362 if (h->Integral() <= 10) continue;
00363 if (h->GetRMS() <= 2.0) continue;
00364 if (h->Integral() > 1) gPad->SetLogy();
00365 h->Fit("pol0");
00366 TF1 *ff = h->GetFunction("pol0");
00367 float yM = ff->GetParameter(0);
00368 if (ymax < yM) ymax = yM;
00369 if (m) {
00370 TGraph &gr = m->crG[i];
00371 if (gr.GetN() > 0) gr.Draw("P");
00372 }
00373 }
00374 }
00375 for (int i = 0;i < ncr;i++) if (hh[i]) hh[i]->SetMaximum(ymax * 20.);
00376 }
00377
00378
00379 void eeDaqMapmtCr(FileType fd, TPad *c, int cr1) {
00380
00381 c->Divide(4,2);
00382 for (int cr = cr1;cr <= cr1 + 7;cr++) {
00383 TH1 *h = GetHisto(fd, Form("cr%d", cr));
00384 if (h) {
00385 c->cd(cr - cr1 + 1);
00386 gPad->SetLogz(0);
00387 h->Draw("colz");
00388 h->SetAxisRange(0, 1000);
00389 if(h->Integral() > 0) gPad->SetLogz();
00390 }
00391 }
00392 }
00393
00394
00395 void eeDaqSmdA(FileType fd, TPad *c, const Char_t *core, Char_t uv){
00396 if(strstr(core, "SmdA")) {
00397 c->Divide(2, 6);
00398 } else {
00399 c->Divide(3, 4);
00400 }
00401 for (int sec = 1;sec <= 12;sec++) {
00402 TH1 *h = GetHisto(fd, Form("%s%d%c",core,sec,uv));
00403 if (h) {
00404 c->cd(sec);
00405 h->Draw();
00406 gPad->SetLogy(0);
00407 if (h->Integral() > 0) gPad->SetLogy();
00408 }
00409 }
00410 }
00411
00412
00413 void eeDaqMapmtStat(FileType fd, TPad *c) {
00414 c->Divide(1,2);
00415 TH1 *h = GetHisto(fd, "MAPMHits");
00416 TH1 *hcopy = GetHisto(fd, "MAPMHits");
00417 if (h) {
00418 c->cd(1);
00419 h->SetAxisRange(63, 87);
00420 h->SetXTitle("Crate ID 12S1=64, 1S1=68, 2S1=72, 3S1=76, 4S1=80, 5S1=84");
00421 h->Draw("colz");
00422 gPad->SetGrid();
00423 gPad->SetLogz(0);
00424 if (h->Integral()>0) gPad->SetLogz();
00425 }
00426 if (hcopy) {
00427 c->cd(2);
00428 hcopy->SetAxisRange(88, 120);
00429 hcopy->SetXTitle("Crate ID 6S1=88, 7S1=92, 8S1=96, 9S1=100, 10S1=104, 11S1=108");
00430 hcopy->Draw("colz");
00431 gPad->SetGrid();
00432 gPad->SetLogz(0);
00433 if (hcopy->Integral()>0) gPad->SetLogz();
00434 }
00435 }
00436
00437
00438 void eeTrigHanks(FileType fd, TPad *c ) {
00439 const Char_t *name[2]={"dsm0inJPall_HT","dsm0inJPall_TP"};
00440 c->Divide(1,2);
00441 for (int i = 0;i < 2;i++) {
00442 TH1 *h = GetHisto(fd, name[i]);
00443 if (h) {
00444 c->cd(1 + i);
00445 gPad->SetLogz(0);
00446 h->Draw("colz");
00447 if (h->Integral() > 0) gPad->SetLogz();
00448 }
00449 }
00450 }
00451
00452
00453 void eeTrigDsm0(FileType fd, TPad *c, const Char_t *mode ) {
00454 c->Divide(2,3);
00455 const int ncr = 6;
00456 TH1 *hh[ncr] = {0};
00457 float ymax = 0;
00458 for (int j = 0;j < ncr;j++) {
00459 c->cd(j + 1);
00460 TH1 *h = GetHisto(fd, Form("dsm0inJP%d_%s", j+1, mode));
00461 if (h) {
00462 hh[j] = h;
00463 gPad->SetLogz(0);
00464 h->Draw("colz");
00465 if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
00466 if (h->Integral() > 0) gPad->SetLogz();
00467 }
00468 }
00469 for (int j = 0;j < ncr;j++) if (hh[j]) hh[j]->SetMaximum(ymax);
00470 }
00471
00472
00473 void eeTrigDsm1(FileType fd, TPad *c, const Char_t *mode ) {
00474 const Char_t *core="dsm1HJP";
00475 if (mode[0] == 'H') {
00476 c->Divide(2, 6);
00477 } else {
00478 c->Divide(4, 3);
00479 }
00480 const int n = 12;
00481 TH1 *hh[n] = {0};
00482 float ymax = 0;
00483 for (int j = 0;j < n;j++) {
00484 TH1 *h = GetHisto(fd, Form("%s%d_%s",core,j+1,mode));
00485 if (h) {
00486 hh[j] = h;
00487 c->cd(j + 1);
00488 h->Draw("colz");
00489 gPad->SetLogz(0);
00490 if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
00491 if (h->Integral() > 0) gPad->SetLogz();
00492 if(mode[0] == 'H') gPad->SetGridx();
00493 }
00494 }
00495 for (int j = 0;j < n;j++) if (hh[j]) hh[j]->SetMaximum(ymax);
00496 }
00497
00498
00499 void eeTrigDsm2HT(FileType fd, TPad *c ) {
00500 const Char_t *name[3]={"dsm2Half1_HTTP","dsm2Half2_HTTP","dsm3_HTTP"};
00501 c->Divide(2, 2);
00502 for (int i = 0;i < 3;i++) {
00503 TH1 *h = GetHisto(fd,name[i]);
00504 if (h) {
00505 c->cd(1 + i);
00506 gPad->SetLogz(0);
00507 h->Draw("colz");
00508 if (h->Integral() > 0) gPad->SetLogz();
00509 }
00510 }
00511 }
00512
00513
00514 void eeTrigJPsum(FileType fd, TPad *c, const Char_t *mode) {
00515 c->Divide(2, 3);
00516 const Char_t *core="JP";
00517 for (int j = 0;j < 6;j++) {
00518 TH1 *h = GetHisto(fd, Form("%s%d%s", core, j + 1, mode));
00519 if (h) {
00520 c->cd(j + 1);
00521 int maxbin = h->GetMaximumBin() - 1;
00522 const Char_t *title = h->GetTitle();
00523 h->SetTitle(Form("%s ped= %d\n", title, maxbin));
00524 gPad->SetLogy(0);
00525 h->GetXaxis()->SetRange(1, 200);
00526 h->Draw();
00527 if (h->Integral() > 0) gPad->SetLogy();
00528 }
00529 }
00530 }
00531
00532
00533 void eeTrigJPfreq(FileType fd, TPad *c) {
00534 c->Divide(2, 3);
00535 const Char_t *core="JPsumTh";
00536 for (int j = 0;j < 4;j++) {
00537 TH1 *h = GetHisto(fd, Form("%s%d",core,j));
00538 if (h) {
00539 c->cd(j + 1);
00540 h->Draw();
00541 h->SetMinimum(0);
00542 }
00543 }
00544 for (int j = 0;j < 2;j++) {
00545 TH1 *h = GetHisto(fd, Form("dsm2Half%d_Etot",j+1));
00546 if (h) {
00547 c->cd(j + 5);
00548 h->Draw();
00549 }
00550 }
00551 #if 0
00552
00553 TH1 *h = GetHisto(fd, "JPadjTh");
00554 c->cd(5);
00555 if (h) h->Draw();
00556 #endif
00557 }
00558
00559
00560 void eeTrigAdjJPsum(FileType fd, TPad *c, const Char_t *mode) {
00561 c->Divide(2, 3);
00562 const Char_t *core="JP";
00563 for (int j = 0;j < 6;j++) {
00564 TH1 *h = GetHisto(fd, Form("%s%d%d%s",core,j+1,((j+1)%6)+1,mode));
00565 if (h) {
00566 c->cd(j + 1);
00567 gPad->SetLogy(0);
00568
00569 h->Draw();
00570 if (h->Integral() > 0) gPad->SetLogy();
00571 }
00572 }
00573 }
00574
00575
00576 void eeTrigEtot(FileType fd, TPad *c) {
00577 const Char_t *nameA[3]={"dsm2E_etot","dsm2B_etot","dsm2BE_etot"};
00578 c->Divide(1, 3);
00579 const int n = 6;
00580 TH1 *hh[n] = {0};
00581 float ymax = 0;
00582 for (int i = 0;i < 3;i++) {
00583 c->cd(1 + i);
00584 gPad->SetLogy(0);
00585 for (int ii = 0;ii <= 1;ii++) {
00586 TH1 *h = GetHisto(fd, Form("%s%d",nameA[i],ii));
00587 if (h) {
00588 hh[i + (ii * 3)] = h;
00589 if (ii == 0) {
00590 h->Draw();
00591 TString tt = h->GetTitle();
00592 tt += " COLORS: bit=0 BLUE , bit=1 RED";
00593 h->SetTitle(tt);
00594 } else {
00595 h->Draw("same");
00596 }
00597 if ((ii == 0) && (h->Integral() > 0)) gPad->SetLogy();
00598 if (ymax < h->GetMaximum()) ymax = h->GetMaximum();
00599 }
00600 }
00601 }
00602 for (int j = 0;j < n;j++) if (hh[j]) hh[j]->SetMaximum(ymax * 1.1);
00603 }
00604
00605
00606 void eeTrigAdjJPcor(FileType fd, TPad *c, const Char_t *mode) {
00607 c->Divide(3, 2);
00608 const Char_t *core="JP";
00609 for (int j = 0;j < 6;j++) {
00610 TH1 *h = GetHisto(fd, Form("%s%d%d%s",core,j+1,((j+1)%6)+1,mode));
00611 if (h) {
00612 c->cd(j + 1);
00613 gPad->SetLogz(0);
00614 h->Draw("colz");
00615 if (h->Integral() > 0) gPad->SetLogz();
00616 }
00617 }
00618 }
00619
00620
00621 void addJPphiLimits(TH1 *h) {
00622 TList *Lx = h ? h->GetListOfFunctions() : 0;
00623 if (!Lx || (Lx->GetSize() > 0)) return;
00624 for (int i = 0;i <= 5;i++) {
00625 float x1 = 2.5 + (i * 10);
00626 TLine *ln = new TLine(x1, -0.2, x1, 12.5);
00627 if (ln) {
00628
00629
00630 Lx->Add(ln);
00631 }
00632 int jpid = i + 2;
00633 if (jpid == 7) jpid = 1;
00634 TString aa = "Jet Patch "; aa += jpid;
00635 TText *tt = new TText(x1 + 1, 12.6, aa);
00636 if (tt) {
00637
00638 tt->SetTextSize(0.08);
00639 Lx->Add(tt);
00640 }
00641 }
00642 }
00643
00644
00645 void eeJpQaMinMax(TH1 *hh) {
00646 if (!hh) return;
00647 hh->SetAxisRange(0.5, 6.4);
00648 hh->SetMinimum(0.);
00649 int ib = hh->GetMaximumBin();
00650 float yMax = hh->GetBinContent(ib);
00651 ib = hh->GetMinimumBin();
00652 float yMin = hh->GetBinContent(ib);
00653 float r = 0, er = 999;
00654 if (yMin <= 0) yMin = 1;
00655 if (yMax <= 0) yMax = 1;
00656 if ((yMin > 0) && (yMax > 0)) {
00657 r = yMin / yMax;
00658 er = r * TMath::Sqrt((1 / yMax) + (1 / yMin));
00659 LOG_DEBUG << Form("JP min/max=%.2f +/- %.2f (min=%.0f max=%.0f) \"%s\"", r, er, yMin, yMax, hh->GetTitle()) << endm;
00660 LOG_DEBUG << Form("#JP %.2f %.2f %.0f %.0f :%s", r, er, yMin, yMax, hh->GetTitle()) << endm;
00661 }
00662 }