leave this commented here - now instead of bombing out if we don't specify the reference file, just carry on as if it was not specified at all, so as this changes the external behaviour of the code we want this retained
don't fail anymore if can't open the reference file, now continue without plotting the refereces, instead printing a warning on the plots
we divide the resolutions by these values if we have an "entries" histogram to tell us how many events there are overall
set up the correct reference chain names ...
read config in from a file if requested ...
words can not express the sheer unpleasantness in trying to do anything serious with subpanels
leave this code commented here for the time being ... if ( histo.name()=="pT" || histo.name()=="pT_rec" ) ypos = 0.19;
legends ....
leave these comments here for testing ...
get the actual chain name and track collection from the Chain histogram if present
Actually DO refit the references - if we are adding together many resplots, then the means etc may not even have been calculated
leave this code commented here since we want to know where to change this in the future it was added for a reason, so is useful to keep for now
useful test for debugging ...
leave this code commented here since we want to know where to change this in the future it was added for a reason, so useful to keep for now
debugging ...
rebin if requested ...
leave for documentation purposes ...
again, this changes the external behaviour so we want to leave this "continue" in place, but commented
replace the "/" in the filename so we don't try to make plots in subdirectories by accident
sort out the range settings for the xaxis ...
keep the original equation by way of documentation ...
leave this code commented here since we want to know where to change this in the future it was added for a reason, so it is useful to keep for now
std::exit(-1);
calculate the required range such that the histogram labels won't crowd the points
actually draw the plot here ...
NB: now, we no longer print the individual plots - only the "panels" individual plots can still be printed by creating a "panel" which contains only that plots - in fast the "histos" item that before provided details of the separate plots is now interpreted as a list of single plot panels so this is done for you
debugging ...
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_ );
1796 if ( rtest.finalised() ) {
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_ );
1824 if ( rref.finalised() ) {
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;
2395 plots_eff.push_back(
Plotter(
e.Hist(), 0,
c ) );
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 ) {
2739 plots_eff.SetXaxisTitle(
plots.GetXaxisTitle() );
2740 plots_eff.SetYaxisTitle(
plots.GetYaxisTitle() );
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_;