16 #include <sys/types.h>
46 #include "TPaveStats.h"
68 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
69 for (
int j=1 ; j<=
h->GetNbinsY() ; j++ ) {
70 int ibin =
h->GetBin(
i, j );
71 if (
h->GetBinContent(ibin)==0 )
h->SetBinContent(ibin, 0.1);
78 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
79 h->SetBinContent(
i,
h->GetBinContent(
i)*
d );
80 h->SetBinError(
i,
h->GetBinError(
i)*
d );
87 std::cout <<
"\nREBIN: " <<
h->GetName() <<
" :: " <<
f << std::endl;
90 TH1F*
n = (
TH1F*)
h->Clone(
"foeda");
n->SetDirectory(0);
98 for (
int i=0 ;
i<10 ;
i++ ) {
100 if ( std::fabs(
int(fb)-fb)<1
e-6 )
break;
103 std::vector<double> limits;
106 for (
int i=1 ;
i<=
h->GetNbinsX()+1 ;
i++ ) {
107 limits.push_back(
h->GetBinLowEdge(
i) );
114 TH1F*
n =
new TH1F(
"foeda",
h->GetTitle(), limits.size()-1, &limits[0] );
n->SetDirectory(0);
126 double limits[40] = {
127 0.5, 1.5, 2.5, 3.5, 4.5,
128 5.5, 6.5, 7.5, 8.5, 9.5,
129 10.5, 11.5, 12.5, 13.5, 14.5,
130 15.5, 16.5, 17.5, 18.5, 19.5,
131 20.5, 21.5, 22.5, 23.5, 24.5,
132 25.5, 26.5, 28.5, 30.5, 32.5,
133 35.5, 38.5, 42.5, 46.5, 50.5,
134 55.5, 60.5, 66.5, 72.5, 78.5
137 double lowlimits[24] = {
138 0.5, 1.5, 2.5, 3.5, 4.5,
139 5.5, 6.5, 7.5, 8.5, 9.5,
140 10.5, 11.5, 12.5, 14.5, 17.5,
141 20.5, 24.5, 29.5, 35.5, 42.5,
142 50.5, 60.5, 72.5, 86.5,
147 if ( low )
n =
new TH1F(
"foeda",
h->GetTitle(), 39, limits );
148 else n =
new TH1F(
"foeda",
h->GetTitle(), 23, lowlimits );
152 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
153 n->Fill(
h->GetBinCenter(
i),
h->GetBinContent(
i) );
157 for (
int i=1 ;
i<=
n->GetNbinsX() ;
i++ ) {
158 n->SetBinError(
i, std::sqrt(
n->GetBinContent(
i) ) );
177 template<
typename T=TH1F>
178 T*
Get( TFile&
f,
const std::string&
n,
const std::string&
dir=
"",
179 const chainmap_t* chainmap=0, std::vector<std::string>* saved=0 ) {
183 size_t pos =
n.find(
'+');
184 if (
pos!=std::string::npos )
name =
n.substr( 0,
pos );
188 if (
h ||
dir.empty() ||
name.find(
dir)!=std::string::npos ) {
189 std::cout <<
"Get() name 0 " <<
name <<
" :: " <<
h << std::endl;
194 std::cout <<
"Get() name 1 " <<
name <<
" :: " <<
h << std::endl;
198 if ( chainmap && chainmap->size()!=0 ) {
199 for ( chainmap_t::const_iterator itr=chainmap->begin() ; itr!=chainmap->end() ; ++itr ) {
201 std::cout <<
"\tmatch: " << itr->first <<
" -> " << itr->second << std::endl;
202 name.replace(
name.find(itr->first), itr->first.size(), itr->second );
210 if ( saved ) saved->push_back(
name );
212 if (
h )
h->SetDirectory(0);
228 bands(
const std::vector<double>& limits,
const std::vector<std::string>&
labels )
242 double minx =
h->GetBinLowEdge(1);
243 double maxx =
h->GetBinLowEdge(
h->GetNbinsX()+1);
245 if (
i>=
m_limits.size() ) { maxx+=1; minx=maxx; }
253 for (
int j=1 ; j<=
h->GetNbinsX() ; j++ ) {
255 std::cout <<
"range: " << j <<
"\tminx: " << minx <<
"\t" << maxx << std::endl;
256 if ( ! (
h->GetBinCenter(j)>=minx &&
h->GetBinCenter(j)<maxx ) ) {
257 h->SetBinContent(j,0);
274 std::vector<double> limits;
276 for (
int i=1 ;
i<
h->GetNbinsX() ;
i++ ) {
277 limits.push_back(
h->GetBinLowEdge(
i) );
280 std::vector<double> alimits;
281 std::vector<double> nlimits;
285 for ( [[maybe_unused]]
int i=0 ;
x<20 ;
i++ ) {
287 alimits.push_back(
x);
291 else if (
x<1.0 )
x+=0.2;
292 else if (
x<1.5 )
x+=0.3;
293 else if (
x<2.0 )
x+=0.4;
294 else if (
x<2.5 )
x+=0.5;
298 else if (
x<1.0 )
x+=0.2;
299 else if (
x<1.5 )
x+=0.2;
300 else if (
x<2.0 )
x+=0.2;
301 else if (
x<2.5 )
x+=0.2;
302 else if (
x<3.0 )
x+=0.3;
308 for (
size_t i=alimits.size() ;
i-- ; ) {
309 if ( alimits[
i]<=15 ) nlimits.push_back( -alimits[
i] );
312 for (
size_t i=1 ;
i<alimits.size() ;
i++ ) {
313 if ( alimits[
i]<=15 ) nlimits.push_back( alimits[
i] );
316 std::cout <<
"limits: " << limits.size() <<
" " << nlimits.size() << std::endl;
318 TH1F* hnew =
new TH1F(
"h",
h->GetTitle(), nlimits.size()-1, &nlimits[0] );
320 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
321 double d =
h->GetBinCenter(
i);
322 int j = hnew->FindBin(
d );
323 hnew->SetBinContent( j, hnew->GetBinContent(j)+
h->GetBinContent(
i) );
333 if ( err_msg !=
"" ) std::cerr << err_msg <<
"\n" << std::endl;
334 std::ostream&
s = std::cout;
335 s <<
"Usage: " <<
name <<
"\t [OPTIONS] test.root reference.root chain1 chain2 chain2 ...\n\n";
336 s <<
"\t" <<
" plots comparison histograms";
337 s <<
" - compiled on " << __DATE__ <<
" at " << __TIME__ <<
"\n\n";
339 s <<
" -c, --config value \t configure which histograms to plot from config file,\n\n";
340 s <<
" -t, --tag value \t appends tag 'value' to the end of output plot names, \n";
341 s <<
" -k, --key value \t prepends key 'value' to the front of output plots name, \n";
342 s <<
" -t, --tag value \t post pend tag 'value' to the end of output plots name, \n";
343 s <<
" -d, --dir value \t creates output files into directory, \"value\" \n\n";
344 s <<
" --ncols value \t creates panels with \"value\" columns\n\n";
346 s <<
" -e, --efficiencies \t make test efficiencies with respect to reference \n";
347 s <<
" -es, --effscale value \t scale efficiencies to value\n";
348 s <<
" -er, --effscaleref value \t scale reference efficiencies to value\n";
349 s <<
" -nb --nobayes \t do not calculate Basyesian efficiency uncertaintiesr\n\n";
351 s <<
" -r, --refit \t refit all test resplots\n";
352 s <<
" -rr, --refitref \t also refit all reference resplots\n";
353 s <<
" --oldrms \t use fast rms95 when refitting resplots\n\n";
355 s <<
" -as, --atlasstyle \t use ATLAS style\n";
356 s <<
" -l, --labels values\t use specified labels for key\n";
357 s <<
" --taglabels values\t use specified additional labels \n";
358 s <<
" -al, --atlaslable value \t set value for atlas label\n";
359 s <<
" -sx, --swapaxtitles exp pattern\t swap the expression \"exp \" in the axis titles with \"pattern\"\n";
360 s <<
" -ac, --addchains \t if possible, add chain names histogram labels \n\n";
362 s <<
" -m, --mapfile \t remap file for reference histograms \n\n";
364 s <<
" -rc, --refchains values ..\t allow different reference chains for comparison\n";
365 s <<
" -s, --swap pattern regex \t swap \"pattern\" in the chain names by \"regex\"\n";
366 s <<
" --swapr pattern regex \t swap \"pattern\" in the ref chain names by \"regex\"\n";
367 s <<
" --swapt pattern regex \t swap \"pattern\" in the test chain names by \"regex\"\n";
368 s <<
" -nr, --noref \t do not plot reference histograms\n";
369 s <<
" --normref \t normalise the reference counting histograms to test histograms\n";
370 s <<
" -us, --usechainref \t use the histograms from chain definied in the \"Chain\" histogram as reference\n\n";
372 s <<
" -ns, --nostats \t do not show stats for mean and rms\n";
373 s <<
" -nm, --nomeans \t do not show stats for the means\n";
374 s <<
" --chi2 \t show the chi2 with respect to the reference\n\n";
376 s <<
" -np, --noplots \t do not actually make any plot\n";
377 s <<
" -q, --quiet \t make the plots but do not print them out\n\n";
379 s <<
" --unscalepix \t do not scale the number of pixels by 0.5 (unscaled by default)\n";
380 s <<
" --scalepix \t do scale the number of pixels by 0.5 (unscaled by default)\n";
381 s <<
" --yrange min max \t use specified y axis range\n";
382 s <<
" -xo, --xoffset value \t relative x offset for the key\n";
383 s <<
" -yp, --ypos value \t relative yposition for the key\n";
384 s <<
" -xe, --xerror value \t size of the x error tick marks\n";
385 s <<
" -nw, --nowatermark \t do not plot the release watermark\n\n";
387 s <<
" -C, --Cfiles \t write C files also\n";
388 s <<
" --nopng \t do not print png files\n";
389 s <<
" --nopdf \t do not print pdf files\n";
390 s <<
" --deleteref \t delete unused reference histograms\n\n";
392 s <<
" --printconfig \t print the configuration being used in the form useable as an input file\n\n";
394 s <<
" -h, --help \t this help\n";
403 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
404 double w =
h->GetBinLowEdge(
i+1) -
h->GetBinLowEdge(
i);
405 h->SetBinContent(
i,
h->GetBinContent(
i)/
w );
406 h->SetBinError(
i,
h->GetBinError(
i)/
w );
411 for (
int i=1 ;
i<=
h->GetNbinsX() ;
i++ ) {
412 h->SetBinContent(
i,
h->GetBinContent(
i)*s_ );
413 h->SetBinError(
i,
h->GetBinError(
i)*s_ );
421 if (
s2==
"" ||
s2==
s3 )
return s;
422 std::string::size_type
pos;
423 while ( (
pos=
s.find(
s2)) != std::string::npos )
s.replace(
pos,
s2.size(),
s3);
428 std::cout <<
"Printing " <<
s << std::endl;
429 gPad->Print(
s.c_str() );
436 int Nx =
h->GetNbinsX();
437 int Ny =
h->GetNbinsY();
438 for (
int i=1 ;
i<=Nx ;
i++ ) {
439 for (
int j=1 ; j<=Ny ; j++ ) {
440 if (
h->GetBinContent(
i, j )==0 ) {
441 h->SetBinContent(
i, j, 1
e-10 );
442 h->SetBinError(
i, j, 1
e-10 );
451 int Nx =
h->GetNbinsX();
452 int Ny =
h->GetNbinsY();
453 for (
int i=1 ;
i<=Nx ;
i++ ) {
455 for (
int j=1 ; j<=Ny ; j++ )
n +=
h->GetBinContent(
i,j);
456 if (
n>0 )
for (
int j=1 ; j<=Ny ; j++ )
h->SetBinContent(
i, j,
h->GetBinContent(
i,j)/
n );
464 int Nx =
h->GetNbinsX();
465 int Ny =
h->GetNbinsY();
467 double xhi =
h->GetXaxis()->GetBinLowEdge(1);
468 double xlo =
h->GetXaxis()->GetBinLowEdge(
h->GetXaxis()->GetNbins() );
470 for (
int i=1 ;
i<=Nx ;
i++ ) {
471 double x =
h->GetXaxis()->GetBinLowEdge(
i);
472 for (
int j=1 ; j<=Ny ; j++ ) {
473 double n =
h->GetBinContent(
i,j);
476 if (
i>1 )
xlo =
h->GetXaxis()->GetBinLowEdge(
i-1);
480 if ( i<h->GetXaxis()->GetNbins() )
xhi =
h->GetXaxis()->GetBinLowEdge(
i+1);
487 h->GetXaxis()->SetRangeUser(
xlo,
xhi );
494 int Nx =
h->GetNbinsX();
495 int Ny =
h->GetNbinsY();
497 double yhi =
h->GetYaxis()->GetBinLowEdge(1);
498 double ylo =
h->GetYaxis()->GetBinLowEdge(
h->GetYaxis()->GetNbins() );
500 for (
int i=1 ;
i<=Ny ;
i++ ) {
501 double y =
h->GetYaxis()->GetBinLowEdge(
i);
502 for (
int j=1 ; j<=Nx ; j++ ) {
503 double n =
h->GetBinContent(j,
i);
506 if (
i>1 )
ylo =
h->GetYaxis()->GetBinLowEdge(
i-1);
510 if ( i<h->GetYaxis()->GetNbins() )
yhi =
h->GetYaxis()->GetBinLowEdge(
i+1);
517 h->GetYaxis()->SetRangeUser(
ylo,
yhi );
525 for (
int i=0 ;
i<
h0->GetNbinsX() ;
i++ ) {
527 double d0 =
h0->GetBinContent(
i+1);
528 double d1 =
h1->GetBinContent(
i+1);
530 double e0 =
h0->GetBinError(
i+1);
531 double e1 =
h1->GetBinError(
i+1);
545 std::cout <<
"\n---------------------------------\n";
546 std::cout <<
"\n comparitor is off ...\n";
548 if (
argc<4 )
return usage(
argv[0], -1,
"too few arguments");
552 std::string
tag =
"";
553 std::string
key =
"";
555 std::string
dir =
"";
557 std::string ftestname =
"";
558 std::string frefname =
"";
567 std::string defreflabel =
"";
571 std::vector<std::string> usrlabels;
572 bool uselabels =
false;
573 bool addinglabels =
false;
575 std::vector<std::string> taglabels;
576 bool addingtags =
false;
578 bool make_ref_efficiencies =
false;
579 bool refit_resplots =
false;
580 bool refitref_resplots =
false;
582 bool nostats =
false;
583 bool nomeans =
false;
585 bool atlasstyle =
false;
586 bool deleteref =
false;
587 bool nowatermark =
false;
588 bool noplots =
false;
594 bool normref =
false;
595 bool scalepix =
false;
597 bool addchains =
false;
598 bool usechainref =
false;
601 bool RANGEMAP =
false;
602 bool ALLRANGEMAP =
false;
606 std::string atlaslabel_tmp =
"Internal";
609 double scale_eff = -1;
610 double scale_eff_ref = -1;
612 std::string configfile =
"";
620 std::string
regex =
"";
622 std::string patternr =
"";
623 std::string regexr =
"";
625 std::string patternt =
"";
626 std::string regext =
"";
628 std::string basedir =
"";
630 std::string xpattern =
"";
631 std::string xregex =
"";
633 std::vector<std::string>
chains;
634 std::vector<std::string> refchains;
636 bool addingrefchains =
false;
638 std::string mapfile =
"";
640 std::vector<std::string> chainfiles;
648 if (
arg.find(
'-')!=0 && addinglabels ) {
652 usrlabels.push_back(
label );
655 else addinglabels =
false;
657 if (
arg.find(
'-')!=0 && addingrefchains ) {
658 refchains.push_back(
arg );
661 else addingrefchains =
false;
663 if (
arg.find(
'-')!=0 && addingtags ) {
665 std::cout <<
"\tadding tag label: " << taglabels.back() << std::endl;
668 else addingtags =
false;
670 if (
arg==
"-h" ||
arg==
"--help" ) {
673 else if (
arg==
"-c" ||
arg==
"--config" ) {
675 else return usage(
argv[0], -1,
"no config file provided");
677 else if (
arg==
"-t" ||
arg==
"--tag" ) {
679 else return usage(
argv[0], -1,
"no tag provided");
681 else if (
arg==
"-l" ||
arg==
"--labels" ) {
684 else if (
arg==
"-el" ) {
687 else if (
arg==
"-k" ||
arg==
"--key" ) {
689 else return usage(
argv[0], -1,
"no key provided");
691 else if (
arg==
"-m" ||
arg==
"--mapfile" ) {
693 else return usage(
argv[0], -1,
"no mapfile provided");
695 else if (
arg==
"-d" ||
arg==
"--dir" ) {
697 else return usage(
argv[0], -1,
"no directory provided");
699 else if (
arg==
"-b" ||
arg==
"--bdir" ) {
701 else return usage(
argv[0], -1,
"no directory provided");
703 else if (
arg==
"--taglabels" ) {
706 else if (
arg==
"--unscalepix" ) {
709 else if (
arg==
"--scalepix" ) {
712 else if (
arg==
"-ac" ||
arg==
"--addchains" ) {
715 else if (
arg==
"-yrange" ) {
718 else return usage(
argv[0], -1,
"no range specified");
720 else return usage(
argv[0], -1,
"no upper y limit specified");
722 else if (
arg==
"-e" ||
arg==
"--efficiencies" ) {
723 make_ref_efficiencies =
true;
725 else if (
arg==
"-r" ||
arg==
"--refit" ) {
726 refit_resplots =
true;
728 else if (
arg==
"-rr" ||
arg==
"--refitref" ) {
729 refitref_resplots =
true;
731 else if (
arg==
"--oldrms" ) {
734 else if (
arg==
"-nw" ||
arg==
"--nowatermark" ) {
738 else if (
arg==
"--chi2" ) {
741 else if (
arg==
"-ns" ||
arg==
"--nostats" ) {
744 else if (
arg==
"-nm" ||
arg==
"--nomeans" ) {
747 else if (
arg==
"-nt" ||
arg==
"--notitle" ) {
750 else if (
arg==
"-nr" ||
arg==
"--noref" ) {
754 else if (
arg==
"--normref" ) {
757 else if (
arg==
"-rc" ||
arg==
"--refchains" ) {
758 addingrefchains =
true;
760 else if (
arg==
"-uc" ||
arg==
"--usechainref" ) {
763 else if (
arg==
"-nb" ||
arg==
"--nobayes" ) {
766 else if (
arg==
"-es" ||
arg==
"--effscale" ) {
768 else return usage(
argv[0], -1,
"no efficiency scale provided");
770 else if (
arg==
"-er" ||
arg==
"--effscaleref" ) {
772 else return usage(
argv[0], -1,
"no efficiency scale for the reference histograms provided");
774 else if (
arg==
"--ncols" ) {
776 else return usage(
argv[0], -1,
"no number of columns provided");
778 else if (
arg==
"-np" ||
arg==
"--noplots" ) {
781 else if (
arg==
"-C" ||
arg==
"--Cfiles" ) {
784 else if (
arg==
"--deleteref" ) {
787 else if (
arg==
"--nopng" ) {
790 else if (
arg==
"--nopdf" ) {
793 else if (
arg==
"-as" ||
arg==
"--atlasstyle" ) {
796 else if (
arg==
"-q" ||
arg==
"--quiet" ) {
799 else if (
arg==
"-al" ||
arg==
"--atlaslabel" ) {
801 else return usage(
argv[0], -1,
"no label provided");
803 else if (
arg==
"-xo" ||
arg==
"--xoffset" ) {
805 else return usage(
argv[0], -1,
"no xoffset provided");
807 else if (
arg==
"-yp" ||
arg==
"--ypos" ) {
809 else return usage(
argv[0], -1,
"no y position provided");
811 else if (
arg==
"-xe" ||
arg==
"--xerror" ) {
813 else return usage(
argv[0], -1,
"no x error provided");
815 else if (
arg==
"-s" ||
arg==
"--swap" ) {
817 else return usage(
argv[0], -1,
"no patterns provided");
819 else return usage(
argv[0], -1,
"no target pattern provided");
821 else if (
arg==
"--swapt" ) {
823 else return usage(
argv[0], -1,
"no patterns provided");
825 else return usage(
argv[0], -1,
"no target pattern provided");
827 else if (
arg==
"--swapr" ) {
829 else return usage(
argv[0], -1,
"no patterns provided");
831 else return usage(
argv[0], -1,
"no target pattern provided");
833 else if (
arg==
"-sx" ||
arg==
"--swapaxtitles" ) {
835 else return usage(
argv[0], -1,
"no target pattern provided");
837 else return usage(
argv[0], -1,
"no patterns provided");
839 else if (
arg.find(
'-')==0 ) {
840 std::cerr <<
"unknown option: " <<
arg <<
"\n" << std::endl;
844 if ( ftestname==
"" ) ftestname =
arg;
845 else if ( frefname==
"" ) frefname =
arg;
847 std::string
file =
"";
849 if (
arg.find(
":file:")!=std::string::npos ) {
851 chainfiles.push_back(
file );
861 std::cout <<
"file: " <<
file <<
"\tchain: " <<
chain << std::endl;
867 if ( ftestname.empty() ) {
868 std::cerr <<
"main(): test file not specified " << std::endl;
872 if ( !
exists(ftestname) ) {
873 std::cerr <<
"main(): test file " << ftestname <<
" does not exist" << std::endl;
877 std::vector<TFile*> chainTFiles;
881 if ( chainfiles.size()==0 ) ftest_ = TFile::Open( ftestname.c_str() );
884 chainTFiles.resize(chainfiles.size());
885 for (
size_t i=0 ;
i<chainfiles.size() ;
i++ ) {
886 chainTFiles[
i] = TFile::Open( chainfiles[
i].c_str() );
887 if ( chainTFiles[
i] == 0 ) {
888 std::cerr <<
"\tfile: " << chainfiles[
i] <<
" could not be opened" << std::endl;
891 else std::cout <<
"\tchainfiles: " << chainfiles[
i] <<
" " << chainTFiles[
i] << std::endl;
896 if ( noref==
false ) {
897 if ( frefname.empty() ) {
898 std::cerr <<
"main(): ref file not specified " << std::endl;
908 if ( frefname==ftestname ) fref_ = ftest_;
909 else if (
exists(frefname) ) fref_ = TFile::Open( frefname.c_str() );
911 std::cerr <<
"main(): ref file " << frefname <<
" does not exist" << std::endl;
919 if ( chainfiles.size()==0 ) {
921 std::cerr <<
"could not open test file " << ftestname << std::endl;
925 if ( noref==
false && fref_==0 ) {
926 std::cerr <<
"could not open files " << std::endl;
932 defreflabel =
"failed to open reference file";
937 if ( scale_eff == -1 ) scale_eff = 100;
938 if ( scale_eff_ref == -1 ) scale_eff_ref = scale_eff;
941 bool noreftmp = noref;
943 if (
chains.size()==0 )
return usage(
argv[0], -1,
"no chains specified");
946 if ( basedir.size()>0 ) {
947 if ( basedir[basedir.size()-1]!=
'/' ) basedir +=
"/";
951 if ( refchains.size()>0 && refchains.size()!=
chains.size() )
return usage(
argv[0], -1,
"not enough chains specified");
953 if ( refchains.size()==0 ) refchains =
chains;
955 std::vector<std::string> chainref(
chains.size(),
"");
956 std::vector<std::string> chain_name(
chains.size(),
"");
958 std::vector<std::string> refchain(chainref.size(),
"");
962 std::cout <<
argv[0] <<
" options:" << std::endl;
963 std::cout <<
"\tATLAS style: " << ( atlasstyle ?
"true" :
"false" ) << std::endl;
964 std::cout <<
"\tBayesian uncertainties: " << ( bayes ?
"true" :
"false" ) << std::endl;
965 std::cout <<
"\trefit resplot uncertainties: " << ( refit_resplots ?
"true" :
"false" ) << std::endl;
966 std::cout <<
"\tsuppress mean and rms stats: " << ( nostats ?
"true" :
"false" ) << std::endl;
967 if ( !nostats ) std::cout <<
"\tsuppress meanstats: " << ( nomeans ?
"true" :
"false" ) << std::endl;
968 std::cout <<
"\tsuppress png output: " << ( nopng ?
"true" :
"false" ) << std::endl;
969 std::cout <<
"\tsuppress pdf output: " << ( nopdf ?
"true" :
"false" ) << std::endl;
970 std::cout <<
"\tsuppress reference output: " << ( noref ?
"true" :
"false" ) << std::endl;
971 std::cout <<
"\tuse chain references: " << ( usechainref ?
"true" :
"false" ) << std::endl;
972 std::cout <<
"\tpanel ncols: " << ncols << std::endl;
974 if ( usrlabels.size()>0 ) std::cout <<
"\tlabels: " << usrlabels.size() << std::endl;
975 if ( taglabels.size()>0 ) std::cout <<
"\textra text: " << taglabels << std::endl;
978 for (
size_t il=0 ;
il<usrlabels.size() ;
il++ ) {
979 std::cout <<
"usr label[" <<
il <<
"] : " << usrlabels[
il] << std::endl;
982 std::cout <<
"atlas style : " << atlasstyle << std::endl;
990 gROOT->SetStyle(
"Plain");
992 gStyle->SetLineScalePS(1);
996 gStyle->SetErrorX(xerror);
998 gStyle->SetPadLeftMargin(0.15);
999 gStyle->SetPadBottomMargin(0.15);
1001 gStyle->SetPadRightMargin(0.02);
1002 gStyle->SetPadTopMargin(0.05);
1004 std::cout <<
"Chains: " << std::endl;
1007 if ( usrlabels.size()>0 ) std::cout <<
"labels: " << usrlabels << std::endl;
1009 if ( usrlabels.size()>0 && usrlabels.size()==
chains.size() ) uselabels =
true;
1013 TTree* dataTree = 0;
1014 TString* releaseData =
new TString(
"");
1015 std::vector<std::string> release_data;
1017 if ( !nowatermark && ftest_ ) {
1019 dataTree = (TTree*)ftest_->Get(
"dataTree");
1022 dataTree->SetBranchAddress(
"ReleaseMetaData", &releaseData);
1024 for (
unsigned int i=0;
i<dataTree->GetEntries() ;
i++ ) {
1025 dataTree->GetEntry(
i);
1026 release_data.push_back( releaseData->Data() );
1027 std::cout <<
"main() release data: " << release_data.back() <<
" : " << *releaseData << std::endl;
1032 if ( release_data.size()>0 ) {
1033 if ( release_data.size()>1 ) std::cerr <<
"main() more than one release - using only the first" << std::endl;
1037 std::string
nightly =
chop(release_data[0],
" " );
1040 for (
int ic=0 ;
ic<4 ;
ic++ )
chop(release_data[0],
" " );
1041 release +=
" (" + release_data[0]+
")";
1045 chop( release_data[0],
" " );
1046 release +=
" " +
chop(release_data[0],
" " ) +
")";
1057 std::cout <<
"trying to make directory" << std::endl;
1060 if (
mkdir(
dir.c_str(), 0777 ) ) std::cerr <<
"main() couldn't create directory " <<
dir << std::endl;
1061 else std::cout <<
"main() output will be sent to directory " <<
dir << std::endl;
1065 if ( ftest_==0 && chainTFiles.size()>0 ) fref_ = ftest_ = chainTFiles[0];
1067 TFile* ftest = ftest_;
1068 TFile* fref = fref_;
1070 std::string testrun =
findrun( ftest );
1072 std::string rawrefrun =
"";
1073 std::string refrun =
"";
1075 if ( fref_ ) refrun = rawrefrun =
findrun( fref );
1077 std::cout <<
"testrun: " << testrun <<
"\nrefrun: " << refrun << std::endl;
1079 if ( !testrun.empty() && refrun != testrun ) {
1087 if ( !refrun.empty() ) {
1089 std::string newtag =
"Reference: ";
1091 std::cout <<
"refrun: " << refrun << std::endl;
1094 while ( (
pos=refrun.find(
'_'))!=std::string::npos ) refrun.replace(
pos, 1,
" " );
1097 std::string rawrun = refrun.erase( refrun.find(
"run"), 4 );
1099 if (
contains(frefname, rawrun) ) {
1101 std::string
release = frefname;
1116 taglabels.push_back( newtag );
1118 std::cout <<
"tag labels: " << taglabels << std::endl;
1133 if ( !nowatermark ) {
1135 TH1D* htestev = (TH1D*)ftest->Get(
"event") ;
1136 TH1D* hrefev = (TH1D*)fref->Get(
"event") ;
1138 std::cout <<
"htestev " << htestev <<
" " << hrefev << std::endl;
1140 if ( htestev ) NeventTest = htestev->GetEntries();
1141 if ( hrefev ) NeventRef = hrefev->GetEntries();
1151 if ( NeventTest>1 ) std::cout <<
"Nevents Test: " << NeventTest << std::endl;
1152 if ( NeventRef>1 ) std::cout <<
"Nevents Ref: " << NeventRef << std::endl;
1156 if ( mapfile.empty() ) mapfile = configfile;
1158 if ( !mapfile.empty() ) {
1162 if (
m.isTagDefined(
"ChainMap" ) ) {
1163 std::vector<std::string>
chains =
m.GetStringVector(
"ChainMap" );
1167 for (
size_t i=0 ;
i<
chains.size() ;
i+=2 ) {
1168 chainmap->insert( chainmap_t::value_type(
chains[
i],
chains[
i+1] ) );
1171 std::cout <<
"\nusing chain map:" << std::endl;
1174 std::cout <<
"\t" << itr->first <<
"\t" << itr->second << std::endl;
1181 std::cout <<
"\ncreating chain and reference information ..." << std::endl;
1183 for (
size_t j=0; j<
chains.size(); j++) {
1191 std::cout <<
"chain: " <<
chains[j] <<
"\taddchains: " << addchains << std::endl;
1195 TFile* fftest = ftest;
1197 if ( chainfiles.size()>0 && chainfiles.size()>j ) fftest = chainTFiles[j];
1203 std::string
name = hchain->GetTitle();
1209 std::cout <<
"new chainref: " << chainref[j] << std::endl;
1211 std::string::size_type
pos = chainref[j].find(
":for");
1212 if (
pos!=std::string::npos ) chainref[j].replace(
pos, 4,
"_for" );
1215 chainref[j] = newchain;
1217 std::cout <<
"final chainref: " << chainref[j] << std::endl;
1221 std::cout <<
"chainref: " << chainref[j] << std::endl;
1225 std::cout <<
"name: " <<
name << std::endl;
1228 else chain_name[j] =
name;
1230 if ( chain_name[j] ==
" : " ) chain_name[j] =
"";
1232 std::cout <<
"chain_name: " << chain_name[j] << std::endl;
1237 std::cout <<
"chainref size: " << chainref.size() <<
" " << refchains.size() << std::endl;
1239 for (
size_t j=0 ; j<chainref.size() ; j++ ) {
1240 std::cout <<
"chainref: " << chainref[j] <<
" :: " << refchains[j] << std::endl;
1246 if ( !patternr.empty() ) {
1247 if ( chainref[j]!=
"" ) refchain[j] =
fullreplace( chainref[j], patternr, regexr );
1248 else refchain[j] =
fullreplace( refchains[j], patternr, regexr );
1251 std::cout <<
"refchain: " << refchain[j] << std::endl;
1254 std::cout <<
"done chains" << std::endl;
1258 std::vector<Panel> panels;
1265 std::vector<int> ccolours;
1266 std::vector<int> cstyles;
1268 std::vector<std::string> ctags;
1269 std::vector<std::string> ctaglabels;
1272 std::cout <<
"\n" <<
argv[0] <<
"\tconfigfile: " << configfile << std::endl;
1274 bool use_file_config =
false;
1276 if ( configfile!=
"" ) {
1278 if (
exists(configfile) ) {
1280 std::cout <<
argv[0] <<
":\treading configuration file " << configfile << std::endl;
1287 if ( rc.isTagDefined(
"histos" ) ) {
1289 std::cout <<
argv[0] <<
":\treading histogram configuration from file " << configfile << std::endl;
1291 use_file_config =
true;
1293 std::vector<std::string> raw_input = rc.GetStringVector(
"histos" );
1295 for (
size_t iraw=0 ; iraw<raw_input.size() ; iraw += 6) {
1299 panels.push_back(
p );
1304 std::cout <<
"searching for panels" << std::endl;
1308 if ( rc.isTagDefined(
"panels" ) ) {
1310 std::cout <<
argv[0] <<
":\treading histogram panel configuration from file " << configfile << std::endl;
1312 use_file_config =
true;
1314 std::vector<std::string> panel_config = rc.GetStringVector(
"panels" );
1316 std::vector<string> panel_columns;
1318 if ( rc.isTagDefined(
"panel_columns") ) {
1319 panel_columns = rc.GetStringVector(
"panel_columns" );
1320 if ( panel_columns.size()%2 )
return usage(
argv[0], -1,
"incorrect panel settings" );
1324 for (
size_t ipanel=panel_config.size() ; ipanel-- ; ) {
1326 std::vector<std::string> raw_input = rc.GetStringVector( panel_config[ipanel] );
1330 if ( panel_columns.size() ) {
1332 if ( itr!=panel_columns.end() ) tncols =
std::atoi( (++itr)->c_str() );
1335 Panel p( panel_config[ipanel], tncols );
1338 for (
size_t iraw=0 ; iraw<raw_input.size() ; iraw += 6 )
p.push_back(
HistDetails( &(raw_input[iraw]) ) );
1340 panels.push_back(
p );
1346 if ( rc.isTagDefined(
"Bands" ) && rc.isTagDefined(
"Labels" ) ) {
1347 bnd =
bands( rc.GetVector(
"Bands"), rc.GetStringVector(
"Labels" ) );
1351 if ( rc.isTagDefined(
"Colours") ) ccolours = rc.GetIntVector(
"Colours");
1352 if ( rc.isTagDefined(
"Styles") ) cstyles = rc.GetIntVector(
"Styles");
1353 if ( rc.isTagDefined(
"Tags") ) ctags = rc.GetStringVector(
"Tags");
1354 if ( rc.isTagDefined(
"TagLabels") ) ctaglabels = rc.GetStringVector(
"TagLabels");
1355 if ( rc.isTagDefined(
"TagLabels") ) usrlabels = rc.GetStringVector(
"TagLabels");
1357 if ( rc.isTagDefined(
"Styles") ) {
1358 for (
size_t is=0 ; is<cstyles.size() && is<6 ; is++ ) {
1367 std::cout <<
argv[0] <<
"\tuserlabels :" << usrlabels <<
":" << std::endl;
1371 if ( rc.isTagDefined(
"RANGEMAP") ) RANGEMAP =
true;
1372 if ( rc.isTagDefined(
"ALLRANGEMAP") ) ALLRANGEMAP =
true;
1374 std::cout <<
"Extra: " << rc.isTagDefined(
"Extra") << std::endl;
1376 if ( rc.isTagDefined(
"Extra") ) taglabels.push_back(
fullreplace( rc.GetString(
"Extra"),
"__",
" " ) );
1381 std::cerr <<
argv[0] <<
":\t config file not found: " << configfile << std::endl;
1387 if ( !use_file_config ) {
1389 std::cout <<
"using default panels" << std::endl;
1403 scale_eff_ref = 100;
1409 size_t nphist[3] = { 4, 4, 10 };
1411 std::string pnames[3] = {
"eff",
"res",
"diff" };
1413 for (
size_t ip=0 ;
ip<3 ;
ip++ ) {
1415 for (
size_t iraw=0 ; iraw<nphist[
ip] ; iraw++ )
p.push_back(
HistDetails( inpanels[
ip][iraw] ) );
1416 panels.push_back(
p );
1422 std::cout <<
"taglabels" << std::endl;
1424 for (
size_t it=0 ;
it<taglabels.size() ;
it++ ) std::cout << taglabels[
it] << std::endl;
1427 std::cout <<
"\npanels: " << panels.size() << std::endl;
1429 if ( panels.size()==0 )
return usage(
argv[0], -1,
"no panels to plot");
1431 for (
size_t ip=0 ;
ip<panels.size() ;
ip++ ) std::cout << panels[
ip] << std::endl;
1436 gStyle->SetPadRightMargin(0.05);
1437 gStyle->SetPadTopMargin(0.05);
1439 const Int_t Number = 3;
1440 Double_t
Red[Number] = { 0.00, 0.00, 1.00};
1441 Double_t
Green[Number] = { 0.00, 5.00, 1.00};
1442 Double_t Blue[Number] = { 0.00, 0.50, 0.00};
1443 Double_t Length[Number] = { 0.00, 0.50, 1.00 };
1445 TColor::CreateGradientColorTable(Number,Length,
Red,
Green,Blue,
nb);
1447 else gStyle->SetPalette(1);
1449 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1451 double rightmargin = gStyle->GetPadRightMargin();
1452 gStyle->SetPadRightMargin(0.1);
1456 gStyle->SetPadRightMargin(rightmargin);
1460 for (
size_t ipanel=0 ; ipanel<panels.size() ; ipanel++ ) {
1462 Panel& panel = panels[ipanel];
1464 std::cout <<
"\n\n---------------------------------------------\n";
1466 std::cout << panel <<
"\n" << std::endl;
1468 int ncolsp = panel.
ncols();
1469 int nrowsp = panel.
nrows();
1473 std::cout <<
"\nncols: " << ncolsp <<
"\tnrows: " << nrowsp << std::endl;
1475 bool multipanel = ( panel.
size() > 1 );
1477 if ( panel.
size()==0 ) {
1478 std::cout <<
"panel empty: " << panel.
name() << std::endl;
1484 if ( panel.
size()>4 ) gStyle->SetLineScalePS(0.5);
1486 if ( multipanel ) extraw = 1.05;
1488 TCanvas* tc =
new TCanvas(
"tc",
"", extraw*ncolsp*800, nrowsp*600 );
1492 const std::string& atlaslabel = atlaslabel_tmp;
1497 gStyle->SetLineScalePS(1);
1513 tc->Divide( ncolsp, nrowsp, 0.0001, 0.0003 );
1519 std::string plotname =
"";
1521 for (
size_t i=0 ;
i<panel.
size() ;
i++ ) {
1525 bool drawmeans =
false;
1526 bool drawresiduals =
true;
1529 if (
contains(
histo.detail(),
"-residual") ) drawresiduals =
false;
1531 std::string xaxis =
histo.xtitle();
1532 std::string yaxis =
histo.ytitle();
1534 if ( !xregex.empty() ) {
1535 size_t pos = xaxis.find(xregex);
1536 if (
pos!=std::string::npos ) xaxis.replace(
pos, xregex.size(), xpattern );
1537 pos = yaxis.find(xregex);
1538 if (
pos!=std::string::npos ) yaxis.replace(
pos, xregex.size(), xpattern );
1548 bool d0rebin_flag =
false;
1561 int npanel = nrowsp*(
i/nrowsp) +
i%nrowsp + 1 ;
1563 std::cout <<
"panel: panel: " << panel.
name() <<
"\tsubpanel: " << npanel << std::endl;
1565 if ( multipanel ) tc->cd( npanel );
1573 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1575 std::cout <<
"main() processing histo[" <<
i <<
"] " << (
i<10 ?
" " :
"" ) <<
histo.name() <<
"\t" <<
histo.xaxis() << std::endl;
1583 std::string noreflabel=defreflabel;
1597 if ( ypos>0.5 ) ypos = 0.85;
1601 if ( ypos_arg!=0 ) ypos = ypos_arg;
1603 double xpos_original = xpos;
1607 if ( xinfo.
offset() != 0 ) {
1609 std::cout <<
"HA ! xinfo.offset: " << xinfo.
offset() << std::endl;
1616 if ( yinfo.
offset() != 0 ) {
1618 std::cout <<
"HA ! yinfo.offset: " << yinfo.
offset() << std::endl;
1628 size_t Nrows =
chains.size();
1630 if ( ALLRANGEMAP || (RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos && ccolours.size() ) )
1631 Nrows = ( Nrows < ccolours.size() ? Nrows : ccolours.size() );
1633 int Nlines = Nrows + taglabels.size();
1635 std::vector<double> ypositions;
1637 double deltay = (Nrows*0.055-0.005)/Nrows;
1640 double yhi = ypos-0.01;
1642 if ( ypos>0.5 )
ylo -= Nlines*deltay;
1643 else yhi += Nlines*deltay;
1645 ypositions.reserve(Nlines);
1646 for (
int ilines=0 ; ilines<Nlines ; ilines++ ) {
1647 ypositions.push_back(
yhi - deltay*(ilines+0.5) );
1658 Legend legend_eff( xpos, xpos+0.1,
ylo,
ylo+Nrows*0.06-0.005 );
1661 std::vector<std::string>
Mean;
1662 std::vector<std::string>
RMS;
1667 std::vector<std::string> Chi2;
1668 std::vector<std::string> MeanRef;
1669 std::vector<std::string> RMSRef;
1679 bool power_set =
false;
1687 for (
unsigned int j=0; j<
chains.size(); j++) {
1689 TFile* fftest = ftest;
1690 TFile* ffref = fref;
1692 if ( chainfiles.size()>0 && chainfiles.size()>j ) ffref = fftest = chainTFiles[j];
1697 std::cout <<
"chain: " <<
chains[j] <<
"\taddchains: " << addchains << std::endl;
1698 std::cout <<
"chainref: " << chainref[j] << std::endl;
1710 TGraphAsymmErrors* tgtest = 0;
1712 std::cout <<
"refchain.size() " << refchain.size() << std::endl;
1714 std::cout <<
"refchain: " << refchain[j] << std::endl;
1718 gPad->SetRightMargin(0.03);
1722 gPad->SetRightMargin(0.13);
1728 h2test->GetYaxis()->SetTitleOffset(1.55);
1729 h2test->GetXaxis()->SetTitleOffset(1.5);
1730 h2test->GetXaxis()->SetTitle(xaxis.c_str());
1731 h2test->GetYaxis()->SetTitle(yaxis.c_str());
1737 std::cout << xinfo << std::endl;
1738 std::cout << yinfo << std::endl;
1741 h2test->GetYaxis()->SetRangeUser( yinfo.
lo(), yinfo.
hi() );
1747 h2test->GetXaxis()->SetRangeUser( xinfo.
lo(), xinfo.
hi() );
1755 h2test->DrawCopy(
"colz");
1757 if (
histo.detail().find(
"logz")!=std::string::npos ) gPad->SetLogz(
true);
1758 else gPad->SetLogz(
false);
1764 bool bsigma =
false;
1770 std::cout <<
"\trefitting: " <<
histo.name() << std::endl;
1775 std::string tmp_ =
histo.name();
1778 if ( bsigma )
base =
chop( tmp_,
"/sigma" );
1779 if ( bmean )
base =
chop( tmp_,
"/mean" );
1783 std::cout <<
"ffref " << ffref << std::endl;
1786 if ( ffref ) href2d_ = Get<TH2D>( *ffref,
chains[j]+
"/"+
base+
"/2d", testrun );
1788 if ( htest2d_==0 )
continue;
1789 if ( !noreftmp && href2d_==0 ) noreftmp =
true;
1794 Resplot rtest(
"tmp", htest2d_ );
1805 if ( bsigma ) { htest = (
TH1F*)rtest.
Sigma()->Clone(
"rtest_sigma"); htest->SetDirectory(0); }
1806 if ( bmean ) { htest = (
TH1F*)rtest.
Mean()->Clone(
"rtest_mean"); htest->SetDirectory(0); }
1809 std::cerr <<
"missing test histogram: " << (refchain[j]+
" / "+
histo.name()) <<
" " << htest <<
"(test)" << std::endl;
1820 if ( refitref_resplots ) {
1822 Resplot rref(
"tmp", href2d_ );
1833 if ( bsigma ) { hreft = (
TH1F*)rref.
Sigma()->Clone(
"rref_sigma"); hreft->SetDirectory(0); }
1834 if ( bmean ) { hreft = (
TH1F*)rref.
Mean()->Clone(
"rref_mean"); hreft->SetDirectory(0); }
1838 hreft =
Get( *ffref, refchain[j]+
"/"+
histo.name(), rawrefrun, chainmap );
1840 std::cerr <<
"ERROR: could not find " << (refchain[j]+
"/"+
histo.name()) << std::endl;
1845 if ( !noreftmp && hreft==0 ) {
1846 std::cerr <<
"missing ref histogram: " << (refchain[j]+
" / "+
histo.name()) <<
" " << htest <<
"(ref)" << std::endl;
1850 noreflabel=
"reference not found";
1857 href = (
TH1F*)hreft->Clone();
1858 href->SetDirectory(0);
1869 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1873 std::string reghist =
histo.name();
1875 std::cout <<
"hist: " << (
chains[j]+
"/"+reghist) <<
"\tftest " << ftest << std::endl;
1879 std::cout <<
"hist: " << htest << std::endl;
1881 std::cout << xaxis << std::endl;
1884 std::cerr <<
"missing test histogram: " << (
chains[j]+
" / "+reghist) <<
" " << htest<< std::endl;
1890 std::cout <<
"hreft: " << hreft << std::endl;
1892 if ( ffref ) hreft =
Get( *ffref, refchain[j]+
"/"+reghist, rawrefrun, chainmap );
1893 else noreftmp =
true;
1895 std::cout <<
"hreft: " << hreft << std::endl;
1897 if ( std::string(htest->ClassName()).find(
"TH2")!=std::string::npos ) {
1898 std::cout <<
"Class TH2: " << htest->GetName() << std::endl;
1902 if ( std::string(htest->ClassName()).find(
"TH1")!=std::string::npos ) {
1903 std::cout <<
"Class TH1: " << htest->GetName() << std::endl;
1905 else if ( std::string(htest->ClassName()).find(
"TProfile")!=std::string::npos ) {
1906 std::cout <<
"Class TProf: " << htest->GetName() << std::endl;
1911 if ( !noreftmp && hreft==0 ) {
1912 std::cerr <<
"missing ref histogram: " << (refchain[j]+
" / "+reghist)
1913 <<
" " << hreft << std::endl;
1916 noreflabel=
"reference not found";
1924 href = (
TH1F*)hreft->Clone();
1925 href->SetDirectory(0);
1932 std::cout <<
" \tget " << (
chains[j]+
"/"+reghist) <<
"\thtest " << htest << std::endl;
1933 std::cout <<
" \tget " << (refchain[j]+
"/"+reghist) <<
"\thref " << href << std::endl;
1935 if ( htest==0 )
continue;
1937 if ( !noreftmp && href==0 ) {
1942 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1946 std::cout <<
"rebin: " <<
hname <<
"\t" <<
rebin << std::endl;
1947 if ( htest ) htest->Rebin(
rebin);
1948 if ( href ) href->Rebin(
rebin);
1949 for (
int ip=0 ;
ip<10 ;
ip++ ) std::cout << std::endl;
1955 std::cout <<
"Rebinning histogram: " <<
histo.name() << std::endl;
1956 if ( htest->GetNbinsX()>500 ) htest->Rebin(10);
1957 if ( href && href->GetNbinsX()>500 ) href->Rebin(10);
1962 if (
histo.name().find(
"zed_eff")!=std::string::npos ) {
1963 if ( htest->GetNbinsX()>100 ) htest->Rebin(5);
1964 if ( href && href->GetNbinsX()>100 ) href->Rebin(5);
1968 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1970 if ( scalepix && std::string(htest->GetName()).find(
"npix")!=std::string::npos )
Scale(htest,0.5);
1971 if ( scalepix && href && std::string(htest->GetName()).find(
"npix")!=std::string::npos )
Scale(href,0.5);
1973 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1976 htest->SetTitle(
"");
1977 if( href ) href->SetTitle(
"");
1980 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1984 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1986 if ( make_ref_efficiencies ) {
1987 if ( htest && href ) {
1992 if (
contains( std::string(htest->GetName()),
"eff" ) ) {
1994 std::string effhist =
histo.name();
1998 TH1F* hrefnumt =
Get( *ffref, refchain[j]+
"/"+effhist+
"_n", rawrefrun, chainmap, &
savedhistos );
2000 if ( !noreftmp && hrefnumt!=0 ) {
2001 hrefnum = (
TH1F*)hrefnumt->Clone();
2002 hrefnum->SetDirectory(0);
2012 if ( htest &&
contains( std::string(htest->GetName()),
"eff" ) ) {
2014 std::string effhist =
histo.name();
2018 if (
rebin!=1 ) std::cout << effhist <<
"\trebin: " <<
rebin << std::endl;
2023 std::cout <<
"1: Bayesian error calculation " << htestnum <<
" " << htestden <<
"\tscale " << scale_eff << std::endl;
2025 if ( htestnum && htestden ) {
2027 if ( d0rebin_flag ) {
2028 htestnum =
d0rebin( htestnum );
2029 htestden =
d0rebin( htestden );
2031 else if (
rebin!=1 ) {
2036 std::cout <<
"test histogram name: : " << htestnum->GetName() <<
"\txaxis: " << xaxis <<
"\t" << std::endl;
2039 if ( std::string(htestnum->GetName()).find(
"ntrax_eff")!=std::string::npos ) {
2050 if (
contains( htest->GetName(),
"_vs_lb" ) ) {
2053 std::cout <<
"rebin " <<
histo.name() << std::endl;
2058 if (
contains( htest->GetName(),
"eta_eff" ) ) {
2059 std::cout <<
"rebin " <<
histo.name() << std::endl;
2066 if ( RANGEMAP && (effhist.find(
"ET")!=std::string::npos ) ) {
2067 std::cout <<
"\trange: " << j <<
" " << htest << std::endl;
2074 tgtest =
e.Bayes(scale_eff);
2078 std::cout <<
"effhist: " << effhist << std::endl;
2084 std::cout <<
"recalculating reference efficiencies ..." << std::endl;
2088 std::cout <<
"doin ..." << std::endl;
2090 TH1F* hrefnum =
Get( *ffref, refchain[j]+
"/"+
histo.name()+
"_n", rawrefrun, chainmap );
2092 TH1F* hrefden =
Get( *ffref, refchain[j]+
"/"+
histo.name()+
"_d", rawrefrun, chainmap );
2094 std::cout <<
"2. Bayesian error calculation " << htestnum <<
" " << htestden <<
"\tscale " << scale_eff << std::endl;
2095 std::cout <<
"3. Bayesian error calculation " << hrefnum <<
" " << hrefden <<
"\tscale " << scale_eff_ref << std::endl;
2098 if ( hrefnum && hrefden ) {
2100 if ( d0rebin_flag ) {
2104 else if (
rebin!=1 ) {
2123 std::cout <<
" no test histogram : " << (
chains[j]+
"/"+
histo.name()) << std::endl;
2127 if ( !noreftmp && href==0 ) {
2128 std::cout <<
" no ref histogram : " << (
chains[j]+
"/"+
histo.name()) << std::endl;
2131 noreflabel=
"reference not found";
2138 htest->GetYaxis()->SetTitleOffset(1.55);
2139 htest->GetXaxis()->SetTitleOffset(1.5);
2140 htest->GetXaxis()->SetTitle(xaxis.c_str());
2141 htest->GetYaxis()->SetTitle(yaxis.c_str());
2144 href->GetYaxis()->SetTitleOffset(1.5);
2145 href->GetXaxis()->SetTitleOffset(1.5);
2146 href->GetXaxis()->SetTitle(xaxis.c_str());
2147 if (
contains(yaxis,
"Efficiency") && !
contains(yaxis,
"%") && scale_eff==100 ) href->GetYaxis()->SetTitle((yaxis+
" [%]").c_str());
2148 else href->GetYaxis()->SetTitle(yaxis.c_str());
2151 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2156 double xm = htest->GetMean();
2159 double lxm = std::log10(xm);
2160 int newbins =
int(0.5+xm/
std::pow(10,
int(lxm)))*
pow(10,
int(lxm));
2161 int nrebin =
int( (newbins+5)/10 );
2164 std::cout <<
"rebin: " << htest->GetName() <<
"\tbins: " << nrebin << std::endl;
2165 htest->Rebin(nrebin);
2168 href->Rebin(nrebin);
2176 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2179 if ( plotname ==
"" ) {
2182 htest->SetTitle(
"");
2183 if ( href ) href->SetTitle(
"");
2187 htest->SetTitle(
"");
2188 if ( href ) href->SetTitle(
"");
2192 htest->SetTitle(
"");
2193 if ( href ) href->SetTitle(
"");
2197 htest->SetTitle(
"");
2198 if ( href ) href->SetTitle(
"");
2202 htest->SetTitle((
"FTK "+
histo.name()).c_str());
2203 if ( href ) href->SetTitle((
"FTK "+
histo.name()).c_str());
2207 plotname +=
histo.name();
2216 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2229 if ( collection.find(
"_InDet")!=std::string::npos ) collection.erase( 0, collection.find(
"_InDet")+1 );
2230 if ( actual_chain.find(
"_InDet")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_InDet") );
2233 std::cout <<
"raw: " <<
chains[j] << std::endl;
2235 std::cout <<
"track collection: " << collection << std::endl;
2236 std::cout <<
"actual chain: " << actual_chain << std::endl;
2241 actual_chain = std::regex_replace( actual_chain,
std::regex(
"_HLT_IDTrack.*" ),
"" );
2243 collection = std::regex_replace( collection,
std::regex(
".*HLT_IDTrack_"),
"IDTrack " );
2244 collection = std::regex_replace( collection,
std::regex(
"IDTrack "),
"" );
2245 collection = std::regex_replace( std::regex_replace( collection, rx,
"" ),
rx1,
"" );
2247 if ( actual_chain.find(
"HLT_IDTrack_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"HLT_IDTrack_"), 12 );
2248 if ( actual_chain.find(
"_IDTrack_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_IDTrack_"), 9 );
2249 if ( actual_chain.find(
"IDTrack")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"IDTrack"), 7 );
2250 if ( actual_chain.find(
"_idperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_idperf"), 7 );
2251 if ( actual_chain.find(
"_bperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_bperf"), 6 );
2252 if ( actual_chain.find(
"_boffperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_boffperf"), 9 );
2253 if ( actual_chain.find(
"_HLT_")!=std::string::npos ) actual_chain.replace( actual_chain.find(
"_HLT_"), 5,
" " );
2254 if ( actual_chain.find(
"HLT_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"HLT_"), 4 );
2256 if ( collection.find(
"_IDTrkNoCut")!=std::string::npos ) collection.erase( collection.find(
"_IDTrkNoCut"), 11 );
2257 if ( collection.find(
"xAODCnv")!=std::string::npos ) collection.erase( collection.find(
"xAODCnv"), 7 );
2258 if ( collection.find(
"HLT_IDTrack_")!=std::string::npos ) collection.erase( collection.find(
"HLT_IDTrack_"), 12 );
2259 if ( collection.find(
"HLT_IDTrack")!=std::string::npos ) collection.erase( collection.find(
"HLT_IDTrack"), 11 );
2260 if ( collection.find(
"Tracking")!=std::string::npos ) collection.replace( collection.find(
"Tracking"), 8,
"Trk" );
2261 if ( collection.find(
"InDetTrigTrk_")!=std::string::npos ) collection.erase( collection.find(
"InDetTrigTrk_"), 13 );
2262 if ( collection.find(
"HLT_xAODTracks_")!=std::string::npos ) collection.erase( collection.find(
"HLT_xAODTracks_"), 15 );
2263 if ( collection.find(
"_HLT_")!=std::string::npos ) collection.replace( collection.find(
"_HLT_"), 5,
" " );
2264 if ( collection.find(
"HLT_")!=std::string::npos ) collection.erase( collection.find(
"HLT_"), 4 );
2267 if ( actual_chain.size()>30 ) {
2268 size_t pos = actual_chain.find_last_of(
"_");
2269 while (
pos!=std::string::npos && actual_chain.size()>30 ) {
2270 actual_chain.erase(
pos, actual_chain.size()-
pos );
2271 actual_chain+=
"...";
2272 pos = actual_chain.find_last_of(
"_");
2276 std::string
c = actual_chain +
" : " + collection;
2278 std::cout <<
"track collection: " << collection <<
" <-" << std::endl;
2279 std::cout <<
"actual chain: " << actual_chain <<
" <-" << std::endl;
2285 std::cout <<
"use label: " <<
c <<
"\tchains size " <<
chains.size() <<
"\t" << usrlabels.size() << std::endl;
2287 std::cout <<
"chains.size() " <<
chains.size() <<
" " << j << std::endl;
2288 std::cout <<
"chains.size() " <<
chains.size() <<
" " << j << std::endl;
2290 std::cout <<
"chains[j] : " << j <<
" " <<
chains[j] << std::endl;
2292 std::cout <<
"userlabels.size() " << usrlabels.size() << std::endl;
2294 if ( usrlabels.size() < j+1 ) {
2295 if ( usrlabels.size()!=0 ) std::cerr <<
"userlabels not large enough - not using userlabels" << std::endl;
2297 else c = usrlabels[ j ];
2299 std::cout <<
"use label: c: " <<
c << std::endl;
2305 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2309 std::cout <<
"\n\n\n\nxaxis: " << xaxis << std::endl;
2313 if ( ALLRANGEMAP || xaxis.find(
"p_{T}")!=std::string::npos || xaxis.find(
"E_{T}")!=std::string::npos ) {
2315 if ( RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos ) {
2320 if ( RANGEMAP || ALLRANGEMAP ) {
2324 std::cout <<
"\n\n\nctags " << ctags.size() <<
"\n\n" << std::endl;
2326 for (
size_t ic=0 ;
ic<ctags.size() ;
ic++ ) {
2330 std::cout <<
"\n\nic: " <<
ic <<
" " << ctags[
ic] <<
" " << ccolours[
ic] <<
"\n\n" << std::endl;
2333 std::cout <<
"\ttag " << ctags[
ic] <<
" \tcolour: " << ccolours[
ic] <<
"\tstyle: " << cstyles[
ic] << std::endl;
2334 htest->SetLineColor( ccolours[
ic] );
2335 htest->SetMarkerColor( ccolours[
ic] );
2336 htest->SetMarkerStyle( cstyles[
ic] );
2339 tgtest->SetLineColor(htest->GetMarkerColor());
2340 tgtest->SetMarkerStyle(htest->GetMarkerStyle());
2341 tgtest->SetMarkerColor(htest->GetMarkerColor());
2349 std::cout <<
"test: " <<
chains[j] <<
"chains colour: " << htest->GetMarkerColor() << std::endl;
2354 std::cout <<
"movin' on ..." << std::endl;
2356 std::cout <<
"chain: " <<
chains[j] <<
" \t marker colour: " << htest->GetMarkerColor() << std::endl;
2360 std::cout <<
"Plotter marker : " << htest->GetMarkerColor() <<
" " << htest->GetMarkerStyle() << std::endl;
2363 if ( uselabels )
plots.push_back(
Plotter( htest, href,
" " + chain_name[j] +
c, tgtest ) );
2365 std::cout <<
"using label: " <<
c << std::endl;
2369 if ( ALLRANGEMAP || ( RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos ) )
plots.back().max_entries( ccolours.size() );
2371 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2373 if ( make_ref_efficiencies ) {
2375 if ( htestnum && hrefnum ) {
2380 double range =
h->GetMaximum()-
h->GetMinimum();
2382 if (
range<0.2*scale_eff ) {
2384 double max =
int( (
h->GetMaximum() + 20)*0.1 )*0.1*scale_eff;
2385 double min =
int( (
h->GetMinimum() - 10)*0.1 )*0.1*scale_eff;
2387 if (
max>1*scale_eff )
max = 1.02*scale_eff;
2401 if ( href ) Chi2.push_back(
label(
"chi2 = %5.2lf / %2.0lf",
chi2( htest, href ),
double(htest->GetNbinsX()) ) );
2405 double mean_95 = htest->GetMean();
2406 double dmean_95 = htest->GetMeanError();
2407 double rms_95 = htest->GetRMS();
2408 double drms_95 = htest->GetRMSError();
2410 Mean.push_back(
label(
" mean = %4.2lf #pm %4.2lf", mean_95, dmean_95) );
2411 RMS.push_back(
label(
" rms = %4.2lf #pm %4.2lf", rms_95, drms_95 ) );
2419 xpos = xpos_original;
2421 std::cout <<
"calculating resolutions : " <<
histo.name() <<
" " << htest->GetName() << std::endl;
2425 double mean_95 = d95->GetParameter(1);
2426 double dmean_95 = d95->GetParError(1);
2427 double rms_95 = d95->GetParameter(2);
2428 double drms_95 = d95->GetParError(2);
2430 std::cout <<
"\t\t" <<
histo.name()
2431 <<
"\tmean: " << mean_95 <<
" +- " << dmean_95
2432 <<
"\trms: " << rms_95 <<
" +- " << drms_95 << std::endl;
2437 for (
int ip=-2 ;
ip<9 ;
ip++ ) {
2438 if ( std::fabs(mean_95) >=
std::pow( 10.,
double(-
ip) ) ) {
2444 for (
int ip=-2 ;
ip<9 ;
ip++ ) {
2445 if ( std::fabs(rms_95) >=
std::pow( 10.,
double(-
ip) ) ) {
2454 std::cout <<
"\t\t" <<
histo.name()
2455 <<
"\tmean: " << mean_95 <<
" +- " << dmean_95 <<
" : pow " << mean_power
2456 <<
"\trms: " << rms_95 <<
" +- " << drms_95 <<
" : pow " << rms_power << std::endl;
2459 if ( mean_power == 0 ) {
2460 Mean.push_back(
label(
"mean_{95} = %4.2lf #pm %4.2lf", mean_95, dmean_95) );
2463 Mean.push_back(
label(
"mean_{95} = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2464 mean_95*
std::pow(10.,
double(mean_power)), dmean_95*
std::pow(10,
double(mean_power)), -mean_power ) );
2468 if ( rms_power == 0 ) {
2469 RMS.push_back(
label(
"rms_{95} = %4.2lf #pm %4.2lf", rms_95, drms_95 ) );
2472 RMS.push_back(
label(
"rms_{95} = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2473 rms_95*
std::pow(10.,
double(rms_power)), drms_95*
std::pow(10,
double(rms_power)), -rms_power ) );
2479 double mean_95ref = d95ref->GetParameter(1);
2480 double dmean_95ref = d95ref->GetParError(1);
2481 double rms_95ref = d95ref->GetParameter(2);
2482 double drms_95ref = d95ref->GetParError(2);
2484 std::cout <<
"\t\t" <<
histo.name()
2485 <<
"\tmean ref: " << mean_95ref <<
" +- " << dmean_95ref <<
" : pow " << mean_power
2486 <<
"\trms ref: " << rms_95ref <<
" +- " << drms_95ref <<
" : pow " << rms_power << std::endl;
2488 if ( mean_power == 0 ) {
2489 MeanRef.push_back(
label(
"mean_{95} ref = %4.2lf #pm %4.2lf", mean_95ref, dmean_95ref) );
2492 MeanRef.push_back(
label(
"mean_{95} ref = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2493 mean_95ref*
std::pow(10,
double(mean_power)), dmean_95ref*
std::pow(10,
double(mean_power)), -mean_power ) );
2498 if ( rms_power == 0 ) {
2499 RMSRef.push_back(
label(
"rms_{95} ref = %4.2lf #pm %4.2lf", rms_95ref, drms_95ref ) );
2502 RMSRef.push_back(
label(
"rms_{95} ref = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2503 rms_95ref*
std::pow(10,
double(rms_power)), drms_95ref*
std::pow(10,
double(rms_power)), -rms_power ) );
2508 if ( href ) href->Sumw2();
2513 if ( href )
Norm( href );
2526 if ( !noreftmp && normref &&
2535 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2542 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2545 plots.sortx( xinfo );
2547 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2560 rmin =
plots.realmin();
2561 rmax =
plots.realmax();
2566 int csize =
chains.size() + taglabels.size() + ( atlasstyle ? 1 : 0 );
2568 if ( yinfo.
log() && rmin>0 && rmax>0 ) {
2571 double delta = std::log10(rmax)-std::log10(rmin);
2576 yminset = rmin*
std::pow(10,-delta*0.1);
2578 double newdelta = std::log10(rmax) - std::log10(yminset) + 0.05*delta;
2580 if ( csize<10 ) ymaxset = rmin*
std::pow(10,newdelta/(1-0.07*csize));
2581 else ymaxset = rmin*
std::pow(10,newdelta*2);
2583 if ( yminset!=yminset ) {
2584 std::cerr <<
" range error " << delta <<
" " << yminset <<
" " << ymaxset <<
"\t(" << rmin <<
" " << rmax <<
")" << std::endl;
2598 double delta = rmax-rmin;
2600 yminset = rmin-0.1*delta;
2602 if ( rmin>=0 && yminset<=0 ) yminset = 0;
2604 double newdelta = rmax - yminset + 0.05*delta;
2606 if ( csize<10 ) ymaxset = yminset + newdelta/(1-0.09*csize);
2607 else ymaxset = yminset + newdelta*2;
2610 double delta = rmax-rmin;
2612 ymaxset = rmax+0.1*delta;
2614 double newdelta = ymaxset - rmin - 0.05*delta;
2616 if ( csize<10 ) yminset = ymaxset - newdelta/(1-0.09*csize);
2617 else yminset = ymaxset - newdelta*2;
2619 if ( rmin>=0 && yminset<=0 ) yminset = 0;
2628 yminset = yinfo.
lo();
2629 ymaxset = yinfo.
hi();
2633 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2642 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2644 if ( yminset>yinfo.
lo() ) yminset = yinfo.
lo();
2645 if ( ymaxset<yinfo.
hi() ) ymaxset = yinfo.
hi();
2651 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2659 if ( ymaxset!=0 || yminset!=0 ) {
2661 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2663 plots.Max( ymaxset );
2664 plots.Min( yminset );
2667 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2669 if ( yminset!=0 || ymaxset!=0 ) {
2670 if ( yminset>0 )
plots.SetLogy(yinfo.
log());
2671 else plots.SetLogy(
false);
2677 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2683 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2687 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2689 if ( atlasstyle )
ATLASLabel( xpos, ypositions[0]+deltay, atlaslabel, kBlack, ncolsp, nrowsp );
2691 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2693 for (
unsigned it=0 ;
it<taglabels.size() ;
it++ ) {
2694 DrawLabel( xpos, ypositions[
it], taglabels[
it], kBlack, 0.04 );
2698 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2701 if ( ( !nostats || !nomeans ) && !noplots ) {
2702 if ( dochi2 )
for (
unsigned j=0 ; j<Chi2.size() ; j++ )
DrawLabel( 0.75, 0.85-j*0.035, Chi2[j],
colours[j%6] );
2705 histo.name()==
"pT" ||
2710 for (
unsigned j=0 ; j<
chains.size() ; j++ ) {
2712 if ( j<MeanRef.size() ) {
2713 if ( !nomeans )
DrawLabel( xpos_original-0.02, (0.67-j*0.035), MeanRef[j],
colours[j%6] );
2717 if ( j<
Mean.size() ) {
2727 if ( xinfo.
log() ) gPad->SetLogx(
true);
2728 else gPad->SetLogx(
false);
2730 if ( yinfo.
log() ) gPad->SetLogy(
true);
2731 else gPad->SetLogy(
false);
2733 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2737 if ( make_ref_efficiencies ) {
2742 plots_eff.
Draw( legend_eff );
2745 if ( !noreflabel.empty() )
DrawLabel(0.1, 0.06, noreflabel, kRed, 0.03 );
2764 std::string useplotname;
2766 if ( panel.
size()>1 ) {
2767 useplotname = panel.
name();
2768 replace( useplotname,
'/',
'_' );
2771 useplotname = plotname;
2774 useplotname.erase(
std::remove( useplotname.begin(), useplotname.end(),
'+' ), useplotname.end() );
2777 std::string printbase =
dir + useplotname +
tag;
2781 if ( !nopdf )
print_pad( printbase+
".pdf" );
2782 if ( !nopng )
print_pad( printbase+
".png" );
2783 if ( Cfile )
print_pad( printbase+
".C" );
2785 std::cout << std::endl;
2790 if ( tc )
delete tc;
2795 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2801 bool files_duplicated = ( fref_==ftest_ );
2803 if ( deleteref && !files_duplicated ) {
2809 std::cout <<
"main() cleaning up reference file" << std::endl;
2811 TFile* newout =
new TFile(
".newout.root",
"recreate");
2826 for (
unsigned j=0 ; j<
dirs.size()-1 ; j++ ) {
2827 std::cout <<
"\t" <<
dirs[j] << std::endl;
2828 TDirectory* renedir =
gDirectory->GetDirectory(
dirs[j].c_str() );
2835 if ( !noreftmp && href ) {
2836 std::cout <<
i <<
" " <<
savedhistos[
i] <<
" 0x" << href << std::endl;
2837 href->Write(
dirs.back().c_str() );
2850 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2854 if ( fref_ && !files_duplicated ) fref_->Close();
2855 if ( ftest_ ) ftest_->Close();
2859 if ( deleteref && !noref ) {
2860 std::cout <<
"ref " << frefname <<
"\ttest " << ftestname << std::endl;
2861 if ( frefname != ftestname && !files_duplicated ) {
2862 std::string
cmd = std::string(
"mv ") + frefname +
" " + frefname +
".bak";
2863 std::system(
cmd.c_str() );
2865 cmd = std::string(
"mv .newout.root ") + std::string(frefname);
2866 std::system(
cmd.c_str() );
2869 std::cerr <<
"reference file and test file are the same - not replacing" << std::endl;
2875 if ( fref_ && !files_duplicated )
delete fref_;
2876 if ( ftest_ )
delete ftest_;