546int main(
int argc,
char** argv) {
548 std::cout <<
"\n---------------------------------\n";
549 std::cout <<
"\n comparitor is off ...\n";
551 if ( argc<4 )
return usage(argv[0], -1,
"too few arguments");
555 std::string tag =
"";
556 std::string key =
"";
558 std::string dir =
"";
560 std::string ftestname =
"";
561 std::string frefname =
"";
570 std::string defreflabel =
"";
574 std::vector<std::string> usrlabels;
575 bool uselabels =
false;
576 bool addinglabels =
false;
578 std::vector<std::string> taglabels;
579 bool addingtags =
false;
581 bool make_ref_efficiencies =
false;
582 bool refit_resplots =
false;
583 bool refitref_resplots =
false;
585 bool nostats =
false;
586 bool nomeans =
false;
588 bool atlasstyle =
false;
589 bool deleteref =
false;
590 bool nowatermark =
false;
591 bool noplots =
false;
597 bool normref =
false;
598 bool scalepix =
false;
600 bool addchains =
false;
601 bool usechainref =
false;
604 bool RANGEMAP =
false;
605 bool ALLRANGEMAP =
false;
609 std::string atlaslabel_tmp =
"Internal";
612 double scale_eff = -1;
613 double scale_eff_ref = -1;
615 std::string configfile =
"";
622 std::string pattern =
"";
623 std::string regex =
"";
625 std::string patternr =
"";
626 std::string regexr =
"";
628 std::string patternt =
"";
629 std::string regext =
"";
631 std::string basedir =
"";
633 std::string xpattern =
"";
634 std::string xregex =
"";
636 std::vector<std::string> chains;
637 std::vector<std::string> refchains;
639 bool addingrefchains =
false;
641 std::string mapfile =
"";
643 std::vector<std::string> chainfiles;
647 for(
int i=1; i<argc; i++){
648 std::string arg = argv[i];
651 if ( arg.find(
'-')!=0 && addinglabels ) {
652 std::string
label = arg;
655 usrlabels.push_back(
label );
658 else addinglabels =
false;
660 if ( arg.find(
'-')!=0 && addingrefchains ) {
661 refchains.push_back( arg );
664 else addingrefchains =
false;
666 if ( arg.find(
'-')!=0 && addingtags ) {
667 taglabels.push_back(
fullreplace( arg,
"__",
" " ) );
668 std::cout <<
"\tadding tag label: " << taglabels.back() << std::endl;
671 else addingtags =
false;
673 if ( arg==
"-h" || arg==
"--help" ) {
674 return usage(argv[0], 0);
676 else if ( arg==
"-c" || arg==
"--config" ) {
677 if ( ++i<argc ) configfile=argv[i];
678 else return usage(argv[0], -1,
"no config file provided");
680 else if ( arg==
"-t" || arg==
"--tag" ) {
681 if ( ++i<argc ) tag=std::string(
"-")+argv[i];
682 else return usage(argv[0], -1,
"no tag provided");
684 else if ( arg==
"-l" || arg==
"--labels" ) {
687 else if ( arg==
"-el" ) {
690 else if ( arg==
"-k" || arg==
"--key" ) {
691 if ( ++i<argc ) key=argv[i];
692 else return usage(argv[0], -1,
"no key provided");
694 else if ( arg==
"-m" || arg==
"--mapfile" ) {
695 if ( ++i<argc ) mapfile=argv[i];
696 else return usage(argv[0], -1,
"no mapfile provided");
698 else if ( arg==
"-d" || arg==
"--dir" ) {
699 if ( ++i<argc ) dir=argv[i];
700 else return usage(argv[0], -1,
"no directory provided");
702 else if ( arg==
"-b" || arg==
"--bdir" ) {
703 if ( ++i<argc ) basedir=argv[i];
704 else return usage(argv[0], -1,
"no directory provided");
706 else if ( arg==
"--taglabels" ) {
709 else if ( arg==
"--unscalepix" ) {
712 else if ( arg==
"--scalepix" ) {
715 else if ( arg==
"-ac" || arg==
"--addchains" ) {
718 else if ( arg==
"-yrange" ) {
720 if ( ++i<argc ) effmin=std::atof(argv[i]);
721 else return usage(argv[0], -1,
"no range specified");
722 if ( ++i<argc ) effmax=std::atof(argv[i]);
723 else return usage(argv[0], -1,
"no upper y limit specified");
725 else if ( arg==
"-e" || arg==
"--efficiencies" ) {
726 make_ref_efficiencies =
true;
728 else if ( arg==
"-r" || arg==
"--refit" ) {
729 refit_resplots =
true;
731 else if ( arg==
"-rr" || arg==
"--refitref" ) {
732 refitref_resplots =
true;
734 else if ( arg==
"--oldrms" ) {
737 else if ( arg==
"-nw" || arg==
"--nowatermark" ) {
741 else if ( arg==
"--chi2" ) {
744 else if ( arg==
"-ns" || arg==
"--nostats" ) {
747 else if ( arg==
"-nm" || arg==
"--nomeans" ) {
750 else if ( arg==
"-nt" || arg==
"--notitle" ) {
753 else if ( arg==
"-nr" || arg==
"--noref" ) {
757 else if ( arg==
"--normref" ) {
760 else if ( arg==
"-rc" || arg==
"--refchains" ) {
761 addingrefchains =
true;
763 else if ( arg==
"-uc" || arg==
"--usechainref" ) {
766 else if ( arg==
"-nb" || arg==
"--nobayes" ) {
769 else if ( arg==
"-es" || arg==
"--effscale" ) {
770 if ( ++i<argc ) scale_eff=std::atof(argv[i]);
771 else return usage(argv[0], -1,
"no efficiency scale provided");
773 else if ( arg==
"-er" || arg==
"--effscaleref" ) {
774 if ( ++i<argc ) scale_eff_ref=std::atof(argv[i]);
775 else return usage(argv[0], -1,
"no efficiency scale for the reference histograms provided");
777 else if ( arg==
"--ncols" ) {
778 if ( ++i<argc ) ncols=std::atoi(argv[i]);
779 else return usage(argv[0], -1,
"no number of columns provided");
781 else if ( arg==
"-np" || arg==
"--noplots" ) {
784 else if ( arg==
"-C" || arg==
"--Cfiles" ) {
787 else if ( arg==
"--deleteref" ) {
790 else if ( arg==
"--nopng" ) {
793 else if ( arg==
"--nopdf" ) {
796 else if ( arg==
"-as" || arg==
"--atlasstyle" ) {
799 else if ( arg==
"-q" || arg==
"--quiet" ) {
802 else if ( arg==
"-al" || arg==
"--atlaslabel" ) {
803 if ( ++i<argc ) atlaslabel_tmp=argv[i];
804 else return usage(argv[0], -1,
"no label provided");
806 else if ( arg==
"-xo" || arg==
"--xoffset" ) {
807 if ( ++i<argc ) xoffset=std::atof(argv[i]);
808 else return usage(argv[0], -1,
"no xoffset provided");
810 else if ( arg==
"-yp" || arg==
"--ypos" ) {
811 if ( ++i<argc ) ypos_arg=std::atof(argv[i]);
812 else return usage(argv[0], -1,
"no y position provided");
814 else if ( arg==
"-xe" || arg==
"--xerror" ) {
815 if ( ++i<argc ) xerror=std::atof(argv[i]);
816 else return usage(argv[0], -1,
"no x error provided");
818 else if ( arg==
"-s" || arg==
"--swap" ) {
819 if ( ++i<argc ) pattern=argv[i];
820 else return usage(argv[0], -1,
"no patterns provided");
821 if ( ++i<argc ) regex=argv[i];
822 else return usage(argv[0], -1,
"no target pattern provided");
824 else if ( arg==
"--swapt" ) {
825 if ( ++i<argc ) patternt=argv[i];
826 else return usage(argv[0], -1,
"no patterns provided");
827 if ( ++i<argc ) regext=argv[i];
828 else return usage(argv[0], -1,
"no target pattern provided");
830 else if ( arg==
"--swapr" ) {
831 if ( ++i<argc ) patternr=argv[i];
832 else return usage(argv[0], -1,
"no patterns provided");
833 if ( ++i<argc ) regexr=argv[i];
834 else return usage(argv[0], -1,
"no target pattern provided");
836 else if ( arg==
"-sx" || arg==
"--swapaxtitles" ) {
837 if ( ++i<argc ) xregex=argv[i];
838 else return usage(argv[0], -1,
"no target pattern provided");
839 if ( ++i<argc ) xpattern=argv[i];
840 else return usage(argv[0], -1,
"no patterns provided");
842 else if ( arg.find(
'-')==0 ) {
843 std::cerr <<
"unknown option: " << arg <<
"\n" << std::endl;
844 return usage(argv[0], -4);
847 if ( ftestname==
"" ) ftestname = arg;
848 else if ( frefname==
"" ) frefname = arg;
850 std::string
file =
"";
852 if ( arg.find(
":file:")!=std::string::npos ) {
853 file = arg.substr( 0, arg.find(
":file:") );
854 chainfiles.push_back(
file );
855 arg = arg.substr(arg.find(
":file:")+6,arg.size());
858 std::string chain = arg;
860 if ( chain.find(
"=")!=std::string::npos ) chain =
ChainString(arg);
864 chains.push_back(chain);
866 std::cout <<
"file: " <<
file <<
"\tchain: " << chain << std::endl;
872 if ( ftestname.empty() ) {
873 std::cerr <<
"main(): test file not specified " << std::endl;
877 if ( !
exists(ftestname) ) {
878 std::cerr <<
"main(): test file " << ftestname <<
" does not exist" << std::endl;
882 std::vector<TFile*> chainTFiles;
886 if ( chainfiles.size()==0 ) ftest_ = TFile::Open( ftestname.c_str() );
889 chainTFiles.resize(chainfiles.size());
890 for (
size_t i=0 ; i<chainfiles.size() ; i++ ) {
891 chainTFiles[i] = TFile::Open( chainfiles[i].c_str() );
892 if ( chainTFiles[i] == 0 ) {
893 std::cerr <<
"\tfile: " << chainfiles[i] <<
" could not be opened" << std::endl;
896 else std::cout <<
"\tchainfiles: " << chainfiles[i] <<
" " << chainTFiles[i] << std::endl;
901 if ( noref==
false ) {
902 if ( frefname.empty() ) {
903 std::cerr <<
"main(): ref file not specified " << std::endl;
913 if ( frefname==ftestname ) fref_ = ftest_;
914 else if (
exists(frefname) ) fref_ = TFile::Open( frefname.c_str() );
916 std::cerr <<
"main(): ref file " << frefname <<
" does not exist" << std::endl;
924 if ( chainfiles.size()==0 ) {
926 std::cerr <<
"could not open test file " << ftestname << std::endl;
930 if ( noref==
false && fref_==0 ) {
931 std::cerr <<
"could not open files " << std::endl;
937 defreflabel =
"failed to open reference file";
942 if ( scale_eff == -1 ) scale_eff = 100;
943 if ( scale_eff_ref == -1 ) scale_eff_ref = scale_eff;
946 bool noreftmp = noref;
948 if ( chains.size()==0 )
return usage(argv[0], -1,
"no chains specified");
951 if ( basedir.size()>0 ) {
952 if ( basedir[basedir.size()-1]!=
'/' ) basedir +=
"/";
953 for (
size_t ic=chains.size() ; ic-- ; ) chains[ic] = basedir+chains[ic];
956 if ( refchains.size()>0 && refchains.size()!=chains.size() )
return usage(argv[0], -1,
"not enough chains specified");
958 if ( refchains.size()==0 ) refchains = chains;
960 std::vector<std::string> chainref(chains.size(),
"");
961 std::vector<std::string> chain_name(chains.size(),
"");
963 std::vector<std::string> refchain(chainref.size(),
"");
967 std::cout << argv[0] <<
" options:" << std::endl;
968 std::cout <<
"\tATLAS style: " << ( atlasstyle ?
"true" :
"false" ) << std::endl;
969 std::cout <<
"\tBayesian uncertainties: " << ( bayes ?
"true" :
"false" ) << std::endl;
970 std::cout <<
"\trefit resplot uncertainties: " << ( refit_resplots ?
"true" :
"false" ) << std::endl;
971 std::cout <<
"\tsuppress mean and rms stats: " << ( nostats ?
"true" :
"false" ) << std::endl;
972 if ( !nostats ) std::cout <<
"\tsuppress meanstats: " << ( nomeans ?
"true" :
"false" ) << std::endl;
973 std::cout <<
"\tsuppress png output: " << ( nopng ?
"true" :
"false" ) << std::endl;
974 std::cout <<
"\tsuppress pdf output: " << ( nopdf ?
"true" :
"false" ) << std::endl;
975 std::cout <<
"\tsuppress reference output: " << ( noref ?
"true" :
"false" ) << std::endl;
976 std::cout <<
"\tuse chain references: " << ( usechainref ?
"true" :
"false" ) << std::endl;
977 std::cout <<
"\tpanel ncols: " << ncols << std::endl;
979 if ( usrlabels.size()>0 ) std::cout <<
"\tlabels: " << usrlabels.size() << std::endl;
980 if ( taglabels.size()>0 ) std::cout <<
"\textra text: " << taglabels << std::endl;
983 for (
size_t il=0 ; il<usrlabels.size() ; il++ ) {
984 std::cout <<
"usr label[" << il <<
"] : " << usrlabels[il] << std::endl;
987 std::cout <<
"atlas style : " << atlasstyle << std::endl;
995 gROOT->SetStyle(
"Plain");
997 gStyle->SetLineScalePS(1);
1001 gStyle->SetErrorX(xerror);
1003 gStyle->SetPadLeftMargin(0.15);
1004 gStyle->SetPadBottomMargin(0.15);
1006 gStyle->SetPadRightMargin(0.02);
1007 gStyle->SetPadTopMargin(0.05);
1009 std::cout <<
"Chains: " << std::endl;
1010 for (
unsigned ic=0 ; ic<chains.size() ; ic++ ) std::cout <<
"\t" << chains[ic] << std::endl;
1012 if ( usrlabels.size()>0 ) std::cout <<
"labels: " << usrlabels << std::endl;
1014 if ( usrlabels.size()>0 && usrlabels.size()==chains.size() ) uselabels =
true;
1018 TTree* dataTree = 0;
1019 TString* releaseData =
new TString(
"");
1020 std::vector<std::string> release_data;
1022 if ( !nowatermark && ftest_ ) {
1024 dataTree = (TTree*)ftest_->Get(
"dataTree");
1027 dataTree->SetBranchAddress(
"ReleaseMetaData", &releaseData);
1029 for (
unsigned int i=0; i<dataTree->GetEntries() ; i++ ) {
1030 dataTree->GetEntry(i);
1031 release_data.push_back( releaseData->Data() );
1032 std::cout <<
"main() release data: " << release_data.back() <<
" : " << *releaseData << std::endl;
1037 if ( release_data.size()>0 ) {
1038 if ( release_data.size()>1 ) std::cerr <<
"main() more than one release - using only the first" << std::endl;
1042 std::string nightly =
chop(release_data[0],
" " );
1044 if (
contains(nightly,
"private" ) ) {
1045 for (
int ic=0 ; ic<4 ; ic++ )
chop(release_data[0],
" " );
1046 release +=
" (" + release_data[0]+
")";
1050 chop( release_data[0],
" " );
1051 release +=
" " +
chop(release_data[0],
" " ) +
")";
1062 std::cout <<
"trying to make directory" << std::endl;
1065 if ( mkdir( dir.c_str(), 0777 ) ) std::cerr <<
"main() couldn't create directory " << dir << std::endl;
1066 else std::cout <<
"main() output will be sent to directory " << dir << std::endl;
1070 if ( ftest_==0 && chainTFiles.size()>0 ) fref_ = ftest_ = chainTFiles[0];
1072 TFile* ftest = ftest_;
1073 TFile* fref = fref_;
1075 std::string testrun =
findrun( ftest );
1077 std::string rawrefrun =
"";
1078 std::string refrun =
"";
1080 if ( fref_ ) refrun = rawrefrun =
findrun( fref );
1082 std::cout <<
"testrun: " << testrun <<
"\nrefrun: " << refrun << std::endl;
1084 if ( !testrun.empty() && refrun != testrun ) {
1085 if ( pattern.empty() ) {
1092 if ( !refrun.empty() ) {
1094 std::string newtag =
"Reference: ";
1096 std::cout <<
"refrun: " << refrun << std::endl;
1099 while ( (pos=refrun.find(
'_'))!=std::string::npos ) refrun.replace( pos, 1,
" " );
1102 std::string rawrun = refrun.erase( refrun.find(
"run"), 4 );
1104 if (
contains(frefname, rawrun) ) {
1106 std::string
release = frefname;
1121 taglabels.push_back( newtag );
1123 std::cout <<
"tag labels: " << taglabels << std::endl;
1138 if ( !nowatermark ) {
1140 TH1D* htestev = (TH1D*)ftest->Get(
"event") ;
1141 TH1D* hrefev = (TH1D*)fref->Get(
"event") ;
1143 std::cout <<
"htestev " << htestev <<
" " << hrefev << std::endl;
1145 if ( htestev ) NeventTest = htestev->GetEntries();
1146 if ( hrefev ) NeventRef = hrefev->GetEntries();
1156 if ( NeventTest>1 ) std::cout <<
"Nevents Test: " << NeventTest << std::endl;
1157 if ( NeventRef>1 ) std::cout <<
"Nevents Ref: " << NeventRef << std::endl;
1161 if ( mapfile.empty() ) mapfile = configfile;
1163 if ( !mapfile.empty() ) {
1167 if ( m.isTagDefined(
"ChainMap" ) ) {
1168 std::vector<std::string> chains = m.GetStringVector(
"ChainMap" );
1172 for (
size_t i=0 ; i<chains.size() ; i+=2 ) {
1173 chainmap->insert( chainmap_t::value_type( chains[i], chains[i+1] ) );
1176 std::cout <<
"\nusing chain map:" << std::endl;
1178 for ( chainmap_t::iterator itr=chainmap->begin() ; itr!=chainmap->end() ; ++itr ) {
1179 std::cout <<
"\t" << itr->first <<
"\t" << itr->second << std::endl;
1186 std::cout <<
"\ncreating chain and reference information ..." << std::endl;
1188 for (
size_t j=0; j<chains.size(); j++) {
1190 if ( !regex.empty() ) chains[j] =
fullreplace( chains[j], pattern, regex );
1191 if ( !regext.empty() ) chains[j] =
fullreplace( chains[j], patternt, regext );
1196 std::cout <<
"chain: " << chains[j] <<
"\taddchains: " << addchains << std::endl;
1198 if ( addchains && (
contains(chains[j],
"Shifter") || ( !
contains(chains[j],
"HLT_") && !
contains(chains[j],
"Fullscan" ) ) ) ) {
1200 TFile* fftest = ftest;
1202 if ( chainfiles.size()>0 && chainfiles.size()>j ) fftest = chainTFiles[j];
1204 TH1F* hchain =
Get( *fftest, chains[j]+
"/Chain", testrun );
1208 std::string name = hchain->GetTitle();
1210 if ( usechainref && !
contains(chains[j],
"Purity") ) {
1214 std::cout <<
"new chainref: " << chainref[j] << std::endl;
1216 std::string::size_type pos = chainref[j].find(
":for");
1217 if ( pos!=std::string::npos ) chainref[j].replace( pos, 4,
"_for" );
1218 std::replace( chainref[j].begin(), chainref[j].end(),
':',
'/');
1219 std::string newchain =
dirname(
dirname( chains[j]) ) +
"/Expert/" + chainref[j];
1220 chainref[j] = newchain;
1222 std::cout <<
"final chainref: " << chainref[j] << std::endl;
1226 std::cout <<
"chainref: " << chainref[j] << std::endl;
1228 while (
contains( name,
"HLT_" ) ) name = name.erase( name.find(
"HLT_"), 4 );
1230 std::cout <<
"name: " << name << std::endl;
1232 if (
contains( name,
":" ) ) chain_name[j] = name.substr( 0, name.find(
':') ) +
" : ";
1233 else chain_name[j] = name;
1235 if ( chain_name[j] ==
" : " ) chain_name[j] =
"";
1237 std::cout <<
"chain_name: " << chain_name[j] << std::endl;
1242 std::cout <<
"chainref size: " << chainref.size() <<
" " << refchains.size() << std::endl;
1244 for (
size_t j=0 ; j<chainref.size() ; j++ ) {
1245 std::cout <<
"chainref: " << chainref[j] <<
" :: " << refchains[j] << std::endl;
1248 if ( chainref[j]!=
"" ) refchain[j] =
fullreplace( chainref[j], pattern, regex );
1249 else refchain[j] =
fullreplace( refchains[j], pattern, regex );
1251 if ( !patternr.empty() ) {
1252 if ( chainref[j]!=
"" ) refchain[j] =
fullreplace( chainref[j], patternr, regexr );
1253 else refchain[j] =
fullreplace( refchains[j], patternr, regexr );
1256 std::cout <<
"refchain: " << refchain[j] << std::endl;
1259 std::cout <<
"done chains" << std::endl;
1263 std::vector<Panel> panels;
1270 std::vector<int> ccolours;
1271 std::vector<int> cstyles;
1273 std::vector<std::string> ctags;
1274 std::vector<std::string> ctaglabels;
1277 std::cout <<
"\n" << argv[0] <<
"\tconfigfile: " << configfile << std::endl;
1279 bool use_file_config =
false;
1281 if ( configfile!=
"" ) {
1283 if (
exists(configfile) ) {
1285 std::cout << argv[0] <<
":\treading configuration file " << configfile << std::endl;
1292 if (
rc.isTagDefined(
"histos" ) ) {
1294 std::cout << argv[0] <<
":\treading histogram configuration from file " << configfile << std::endl;
1296 use_file_config =
true;
1298 std::vector<std::string> raw_input =
rc.GetStringVector(
"histos" );
1300 for (
size_t iraw=0 ; iraw<raw_input.size() ; iraw += 6) {
1304 panels.push_back( p );
1309 std::cout <<
"searching for panels" << std::endl;
1313 if (
rc.isTagDefined(
"panels" ) ) {
1315 std::cout << argv[0] <<
":\treading histogram panel configuration from file " << configfile << std::endl;
1317 use_file_config =
true;
1319 std::vector<std::string> panel_config =
rc.GetStringVector(
"panels" );
1321 std::vector<string> panel_columns;
1323 if (
rc.isTagDefined(
"panel_columns") ) {
1324 panel_columns =
rc.GetStringVector(
"panel_columns" );
1325 if ( panel_columns.size()%2 )
return usage( argv[0], -1,
"incorrect panel settings" );
1329 for (
size_t ipanel=panel_config.size() ; ipanel-- ; ) {
1331 std::vector<std::string> raw_input =
rc.GetStringVector( panel_config[ipanel] );
1335 if ( panel_columns.size() ) {
1336 std::vector<string>::iterator itr =
find( panel_columns.begin(), panel_columns.end(), panel_config[ipanel] );
1337 if ( itr!=panel_columns.end() ) tncols = std::atoi( (++itr)->c_str() );
1340 Panel p( panel_config[ipanel], tncols );
1342 if ( raw_input.empty() ) {
1343 std::cerr << argv[0] <<
":\t panel " << panel_config[ipanel] <<
" is empty";
1346 for (
size_t iraw=0 ; iraw<raw_input.size() ; iraw += 6 ) p.push_back(
HistDetails( &(raw_input[iraw]) ) );
1348 panels.push_back( p );
1354 if (
rc.isTagDefined(
"Bands" ) &&
rc.isTagDefined(
"Labels" ) ) {
1355 bnd =
bands(
rc.GetVector(
"Bands"),
rc.GetStringVector(
"Labels" ) );
1359 if (
rc.isTagDefined(
"Colours") ) ccolours =
rc.GetIntVector(
"Colours");
1360 if (
rc.isTagDefined(
"Styles") ) cstyles =
rc.GetIntVector(
"Styles");
1361 if (
rc.isTagDefined(
"Tags") ) ctags =
rc.GetStringVector(
"Tags");
1362 if (
rc.isTagDefined(
"TagLabels") ) ctaglabels =
rc.GetStringVector(
"TagLabels");
1363 if (
rc.isTagDefined(
"TagLabels") ) usrlabels =
rc.GetStringVector(
"TagLabels");
1365 if (
rc.isTagDefined(
"Styles") ) {
1366 for (
size_t is=0 ; is<cstyles.size() && is<6 ; is++ ) {
1375 std::cout << argv[0] <<
"\tuserlabels :" << usrlabels <<
":" << std::endl;
1379 if (
rc.isTagDefined(
"RANGEMAP") ) RANGEMAP =
true;
1380 if (
rc.isTagDefined(
"ALLRANGEMAP") ) ALLRANGEMAP =
true;
1382 std::cout <<
"Extra: " <<
rc.isTagDefined(
"Extra") << std::endl;
1384 if (
rc.isTagDefined(
"Extra") ) taglabels.push_back(
fullreplace(
rc.GetString(
"Extra"),
"__",
" " ) );
1389 std::cerr << argv[0] <<
":\t config file not found: " << configfile << std::endl;
1395 if ( !use_file_config ) {
1397 std::cout <<
"using default panels" << std::endl;
1411 scale_eff_ref = 100;
1417 size_t nphist[3] = { 4, 4, 10 };
1419 std::string pnames[3] = {
"eff",
"res",
"diff" };
1421 for (
size_t ip=0 ; ip<3 ; ip++ ) {
1422 Panel p( pnames[ip]+
"_panel", 2 );
1423 for (
size_t iraw=0 ; iraw<nphist[ip] ; iraw++ ) p.push_back(
HistDetails( inpanels[ip][iraw] ) );
1424 panels.push_back( p );
1430 std::cout <<
"taglabels" << std::endl;
1432 for (
size_t it=0 ; it<taglabels.size() ; it++ ) std::cout << taglabels[it] << std::endl;
1435 std::cout <<
"\npanels: " << panels.size() << std::endl;
1437 if ( panels.size()==0 )
return usage(argv[0], -1,
"no panels to plot");
1439 for (
size_t ip=0 ; ip<panels.size() ; ip++ ) std::cout << panels[ip] << std::endl;
1444 gStyle->SetPadRightMargin(0.05);
1445 gStyle->SetPadTopMargin(0.05);
1447 const Int_t Number = 3;
1448 Double_t Red[Number] = { 0.00, 0.00, 1.00};
1449 Double_t Green[Number] = { 0.00, 5.00, 1.00};
1450 Double_t Blue[Number] = { 0.00, 0.50, 0.00};
1451 Double_t Length[Number] = { 0.00, 0.50, 1.00 };
1453 TColor::CreateGradientColorTable(Number,Length,Red,Green,Blue,nb);
1455 else gStyle->SetPalette(1);
1457 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1459 double rightmargin = gStyle->GetPadRightMargin();
1460 gStyle->SetPadRightMargin(0.1);
1464 gStyle->SetPadRightMargin(rightmargin);
1468 for (
size_t ipanel=0 ; ipanel<panels.size() ; ipanel++ ) {
1470 Panel& panel = panels[ipanel];
1472 std::cout <<
"\n\n---------------------------------------------\n";
1474 std::cout << panel <<
"\n" << std::endl;
1476 int ncolsp = panel.
ncols();
1477 int nrowsp = panel.
nrows();
1481 std::cout <<
"\nncols: " << ncolsp <<
"\tnrows: " << nrowsp << std::endl;
1483 bool multipanel = ( panel.
size() > 1 );
1485 if ( panel.
size()==0 ) {
1486 std::cout <<
"panel empty: " << panel.
name() << std::endl;
1492 if ( panel.
size()>4 ) gStyle->SetLineScalePS(0.5);
1494 if ( multipanel ) extraw = 1.05;
1496 TCanvas*
tc =
new TCanvas(
"tc",
"", extraw*ncolsp*800, nrowsp*600 );
1500 const std::string& atlaslabel = atlaslabel_tmp;
1505 gStyle->SetLineScalePS(1);
1521 tc->Divide( ncolsp, nrowsp, 0.0001, 0.0003 );
1527 std::string plotname =
"";
1529 for (
size_t i=0 ; i<panel.
size() ; i++ ) {
1533 bool drawmeans =
false;
1534 bool drawresiduals =
true;
1536 if (
contains(histo.detail(),
"+mean" ) ) drawmeans =
true;
1537 if (
contains(histo.detail(),
"-residual") ) drawresiduals =
false;
1539 std::string xaxis = histo.xtitle();
1540 std::string yaxis = histo.ytitle();
1542 if ( !xregex.empty() ) {
1543 size_t pos = xaxis.find(xregex);
1544 if ( pos!=std::string::npos ) xaxis.replace( pos, xregex.size(), xpattern );
1545 pos = yaxis.find(xregex);
1546 if ( pos!=std::string::npos ) yaxis.replace( pos, xregex.size(), xpattern );
1549 const AxisInfo& xinfo = histo.xaxis();
1550 const AxisInfo& yinfo = histo.yaxis();
1552 std::string hname = histo.name();
1553 std::string
detail = histo.detail();
1556 bool d0rebin_flag =
false;
1561 rebin = std::atof(
detail.substr(
detail.find(
"+Rebin")+6,
detail.size() ).c_str() );
1565 rebin = std::atof(
detail.substr(
detail.find(
"+rebin")+6,
detail.size() ).c_str() );
1569 int npanel = nrowsp*(i/nrowsp) + i%nrowsp + 1 ;
1571 std::cout <<
"panel: panel: " << panel.
name() <<
"\tsubpanel: " << npanel << std::endl;
1573 if ( multipanel )
tc->cd( npanel );
1581 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1583 std::cout <<
"main() processing histo[" << i <<
"] " << (i<10 ?
" " :
"" ) << histo.name() <<
"\t" << histo.xaxis() << std::endl;
1591 std::string noreflabel=defreflabel;
1596 if (
contains(histo.name(),
"eff") ||
contains(histo.name(),
"Eff_") ) ypos = 0.19;
1605 if ( ypos>0.5 ) ypos = 0.85;
1609 if ( ypos_arg!=0 ) ypos = ypos_arg;
1611 double xpos_original = xpos;
1615 if ( xinfo.
offset() != 0 ) {
1617 std::cout <<
"HA ! xinfo.offset: " << xinfo.
offset() << std::endl;
1624 if ( yinfo.
offset() != 0 ) {
1626 std::cout <<
"HA ! yinfo.offset: " << yinfo.
offset() << std::endl;
1636 size_t Nrows = chains.size();
1638 if ( ALLRANGEMAP || (RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos && ccolours.size() ) )
1639 Nrows = ( Nrows < ccolours.size() ? Nrows : ccolours.size() );
1641 int Nlines = Nrows + taglabels.size();
1643 std::vector<double> ypositions;
1645 double deltay = (Nrows*0.055-0.005)/Nrows;
1648 double yhi = ypos-0.01;
1650 if ( ypos>0.5 ) ylo -= Nlines*deltay;
1651 else yhi += Nlines*deltay;
1653 ypositions.reserve(Nlines);
1654 for (
int ilines=0 ; ilines<Nlines ; ilines++ ) {
1655 ypositions.push_back( yhi - deltay*(ilines+0.5) );
1663 if ( !
contains(histo.name(),
"eff") && !
contains(histo.name(),
"Eff_") ) ylo -= 0.02;
1665 Legend legend( xpos, xpos+0.1, ylo, ylo+Nrows*0.06-0.005 );
1666 Legend legend_eff( xpos, xpos+0.1, ylo, ylo+Nrows*0.06-0.005 );
1669 std::vector<std::string> Mean;
1670 std::vector<std::string> RMS;
1675 std::vector<std::string> Chi2;
1676 std::vector<std::string> MeanRef;
1677 std::vector<std::string> RMSRef;
1687 bool power_set =
false;
1695 for (
unsigned int j=0; j<chains.size(); j++) {
1697 TFile* fftest = ftest;
1698 TFile* ffref = fref;
1700 if ( chainfiles.size()>0 && chainfiles.size()>j ) ffref = fftest = chainTFiles[j];
1705 std::cout <<
"chain: " << chains[j] <<
"\taddchains: " << addchains << std::endl;
1706 std::cout <<
"chainref: " << chainref[j] << std::endl;
1718 TGraphAsymmErrors* tgtest = 0;
1720 std::cout <<
"refchain.size() " << refchain.size() << std::endl;
1722 std::cout <<
"refchain: " << refchain[j] << std::endl;
1726 gPad->SetRightMargin(0.03);
1728 if (
contains(histo.name(),
"/2d") ) {
1730 gPad->SetRightMargin(0.13);
1736 h2test->GetYaxis()->SetTitleOffset(1.55);
1737 h2test->GetXaxis()->SetTitleOffset(1.5);
1738 h2test->GetXaxis()->SetTitle(xaxis.c_str());
1739 h2test->GetYaxis()->SetTitle(yaxis.c_str());
1741 const AxisInfo& xinfo = histo.xaxis();
1742 const AxisInfo& yinfo = histo.yaxis();
1745 std::cout << xinfo << std::endl;
1746 std::cout << yinfo << std::endl;
1749 h2test->GetYaxis()->SetRangeUser( yinfo.
lo(), yinfo.
hi() );
1755 h2test->GetXaxis()->SetRangeUser( xinfo.
lo(), xinfo.
hi() );
1763 h2test->DrawCopy(
"colz");
1765 if ( histo.detail().find(
"logz")!=std::string::npos ) gPad->SetLogz(
true);
1766 else gPad->SetLogz(
false);
1770 else if ( refit_resplots && (
contains(histo.name(),
"/sigma") ||
contains(histo.name(),
"/mean") ) ) {
1772 bool bsigma =
false;
1773 if (
contains(histo.name(),
"/sigma") ) bsigma =
true;
1776 if (
contains(histo.name(),
"/mean") ) bmean =
true;
1778 std::cout <<
"\trefitting: " << histo.name() << std::endl;
1783 std::string tmp_ = histo.name();
1786 if ( bsigma )
base =
chop( tmp_,
"/sigma" );
1787 if ( bmean )
base =
chop( tmp_,
"/mean" );
1791 std::cout <<
"ffref " << ffref << std::endl;
1794 if ( ffref ) href2d_ =
Get<TH2D>( *ffref, chains[j]+
"/"+
base+
"/2d", testrun );
1796 if ( htest2d_==0 )
continue;
1797 if ( !noreftmp && href2d_==0 ) noreftmp =
true;
1802 Resplot rtest(
"tmp", htest2d_ );
1813 if ( bsigma ) { htest = (TH1F*)rtest.
Sigma()->Clone(
"rtest_sigma"); htest->SetDirectory(0); }
1814 if ( bmean ) { htest = (TH1F*)rtest.
Mean()->Clone(
"rtest_mean"); htest->SetDirectory(0); }
1817 std::cerr <<
"missing test histogram: " << (refchain[j]+
" / "+histo.name()) <<
" " << htest <<
"(test)" << std::endl;
1828 if ( refitref_resplots ) {
1830 Resplot rref(
"tmp", href2d_ );
1841 if ( bsigma ) { hreft = (TH1F*)rref.
Sigma()->Clone(
"rref_sigma"); hreft->SetDirectory(0); }
1842 if ( bmean ) { hreft = (TH1F*)rref.
Mean()->Clone(
"rref_mean"); hreft->SetDirectory(0); }
1846 hreft =
Get( *ffref, refchain[j]+
"/"+histo.name(), rawrefrun, chainmap );
1848 std::cerr <<
"ERROR: could not find " << (refchain[j]+
"/"+histo.name()) << std::endl;
1853 if ( !noreftmp && hreft==0 ) {
1854 std::cerr <<
"missing ref histogram: " << (refchain[j]+
" / "+histo.name()) <<
" " << htest <<
"(ref)" << std::endl;
1858 noreflabel=
"reference not found";
1865 href = (TH1F*)hreft->Clone();
1866 href->SetDirectory(0);
1872 savedhistos.push_back( refchain[j]+
"/"+histo.name() );
1877 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1881 std::string reghist = histo.name();
1883 std::cout <<
"hist: " << (chains[j]+
"/"+reghist) <<
"\tftest " << ftest << std::endl;
1885 htest =
Get( *fftest, chains[j]+
"/"+reghist, testrun, 0, &
savedhistos );
1887 std::cout <<
"hist: " << htest << std::endl;
1889 std::cout << xaxis << std::endl;
1892 std::cerr <<
"missing test histogram: " << (chains[j]+
" / "+reghist) <<
" " << htest<< std::endl;
1898 std::cout <<
"hreft: " << hreft << std::endl;
1900 if ( ffref ) hreft =
Get( *ffref, refchain[j]+
"/"+reghist, rawrefrun, chainmap );
1901 else noreftmp =
true;
1903 std::cout <<
"hreft: " << hreft << std::endl;
1905 if ( std::string(htest->ClassName()).find(
"TH2")!=std::string::npos ) {
1906 std::cout <<
"Class TH2: " << htest->GetName() << std::endl;
1910 if ( std::string(htest->ClassName()).find(
"TH1")!=std::string::npos ) {
1911 std::cout <<
"Class TH1: " << htest->GetName() << std::endl;
1913 else if ( std::string(htest->ClassName()).find(
"TProfile")!=std::string::npos ) {
1914 std::cout <<
"Class TProf: " << htest->GetName() << std::endl;
1919 if ( !noreftmp && hreft==0 ) {
1920 std::cerr <<
"missing ref histogram: " << (refchain[j]+
" / "+reghist)
1921 <<
" " << hreft << std::endl;
1924 noreflabel=
"reference not found";
1932 href = (TH1F*)hreft->Clone();
1933 href->SetDirectory(0);
1940 std::cout <<
" \tget " << (chains[j]+
"/"+reghist) <<
"\thtest " << htest << std::endl;
1941 std::cout <<
" \tget " << (refchain[j]+
"/"+reghist) <<
"\thref " << href << std::endl;
1943 if ( htest==0 )
continue;
1945 if ( !noreftmp && href==0 ) {
1950 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1954 std::cout <<
"rebin: " << hname <<
"\t" << rebin << std::endl;
1955 if ( htest ) htest->Rebin(rebin);
1956 if ( href ) href->Rebin(rebin);
1957 for (
int ip=0 ; ip<10 ; ip++ ) std::cout << std::endl;
1962 if ( !
contains( histo.name(),
"rdz_vs_zed" ) &&
contains( histo.name(),
"1d") ) {
1963 std::cout <<
"Rebinning histogram: " << histo.name() << std::endl;
1964 if ( htest->GetNbinsX()>500 ) htest->Rebin(10);
1965 if ( href && href->GetNbinsX()>500 ) href->Rebin(10);
1970 if ( histo.name().find(
"zed_eff")!=std::string::npos ) {
1971 if ( htest->GetNbinsX()>100 ) htest->Rebin(5);
1972 if ( href && href->GetNbinsX()>100 ) href->Rebin(5);
1976 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1978 if ( scalepix && std::string(htest->GetName()).find(
"npix")!=std::string::npos )
Scale(htest,0.5);
1979 if ( scalepix && href && std::string(htest->GetName()).find(
"npix")!=std::string::npos )
Scale(href,0.5);
1981 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1984 htest->SetTitle(
"");
1985 if( href ) href->SetTitle(
"");
1988 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1992 if (
fulldbg ) std::cout << __LINE__ << std::endl;
1994 if ( make_ref_efficiencies ) {
1995 if ( htest && href ) {
2000 if (
contains( std::string(htest->GetName()),
"eff" ) ) {
2002 std::string effhist = histo.name();
2004 htestnum =
Get( *fftest, chains[j]+
"/"+effhist+
"_n", testrun, 0, &
savedhistos );
2006 TH1F* hrefnumt =
Get( *ffref, refchain[j]+
"/"+effhist+
"_n", rawrefrun, chainmap, &
savedhistos );
2008 if ( !noreftmp && hrefnumt!=0 ) {
2009 hrefnum = (TH1F*)hrefnumt->Clone();
2010 hrefnum->SetDirectory(0);
2020 if ( htest &&
contains( std::string(htest->GetName()),
"eff" ) ) {
2022 std::string effhist = histo.name();
2026 if ( rebin!=1 ) std::cout << effhist <<
"\trebin: " << rebin << std::endl;
2028 htestnum =
Get( *fftest, chains[j]+
"/"+effhist+
"_n", testrun, 0, &
savedhistos ) ;
2029 htestden =
Get( *fftest, chains[j]+
"/"+effhist+
"_d", testrun, 0, &
savedhistos ) ;
2031 std::cout <<
"1: Bayesian error calculation " << htestnum <<
" " << htestden <<
"\tscale " << scale_eff << std::endl;
2033 if ( htestnum && htestden ) {
2035 if ( d0rebin_flag ) {
2036 htestnum =
d0rebin( htestnum );
2037 htestden =
d0rebin( htestden );
2039 else if ( rebin!=1 ) {
2040 htestnum =
Rebin(htestnum, rebin );
2041 htestden =
Rebin(htestden, rebin );
2044 std::cout <<
"test histogram name: : " << htestnum->GetName() <<
"\txaxis: " << xaxis <<
"\t" << std::endl;
2047 if ( std::string(htestnum->GetName()).find(
"ntrax_eff")!=std::string::npos ) {
2060 if (
contains( htest->GetName(),
"_vs_lb" ) ) {
2061 std::cout <<
"rebin " << histo.name() << std::endl;
2066 if (
contains( htest->GetName(),
"eta_eff" ) ) {
2067 std::cout <<
"rebin " << histo.name() << std::endl;
2074 if ( RANGEMAP && (effhist.find(
"ET")!=std::string::npos ) ) {
2075 std::cout <<
"\trange: " << j <<
" " << htest << std::endl;
2076 bnd.
range( chains[j], htestnum );
2077 bnd.
range( chains[j], htestden );
2082 tgtest = e.Bayes(scale_eff);
2086 std::cout <<
"effhist: " << effhist << std::endl;
2092 std::cout <<
"recalculating reference efficiencies ..." << std::endl;
2096 std::cout <<
"doin ..." << std::endl;
2098 TH1F* hrefnum =
Get( *ffref, refchain[j]+
"/"+histo.name()+
"_n", rawrefrun, chainmap );
2100 TH1F* hrefden =
Get( *ffref, refchain[j]+
"/"+histo.name()+
"_d", rawrefrun, chainmap );
2102 std::cout <<
"2. Bayesian error calculation " << htestnum <<
" " << htestden <<
"\tscale " << scale_eff << std::endl;
2103 std::cout <<
"3. Bayesian error calculation " << hrefnum <<
" " << hrefden <<
"\tscale " << scale_eff_ref << std::endl;
2106 if ( hrefnum && hrefden ) {
2108 if ( d0rebin_flag ) {
2112 else if ( rebin!=1 ) {
2113 hrefnum =
Rebin(hrefnum, rebin );
2114 hrefden =
Rebin(hrefden, rebin );
2131 std::cout <<
" no test histogram : " << (chains[j]+
"/"+histo.name()) << std::endl;
2135 if ( !noreftmp && href==0 ) {
2136 std::cout <<
" no ref histogram : " << (chains[j]+
"/"+histo.name()) << std::endl;
2139 noreflabel=
"reference not found";
2146 htest->GetYaxis()->SetTitleOffset(1.55);
2147 htest->GetXaxis()->SetTitleOffset(1.5);
2148 htest->GetXaxis()->SetTitle(xaxis.c_str());
2149 htest->GetYaxis()->SetTitle(yaxis.c_str());
2152 href->GetYaxis()->SetTitleOffset(1.5);
2153 href->GetXaxis()->SetTitleOffset(1.5);
2154 href->GetXaxis()->SetTitle(xaxis.c_str());
2155 if (
contains(yaxis,
"Efficiency") && !
contains(yaxis,
"%") && scale_eff==100 ) href->GetYaxis()->SetTitle((yaxis+
" [%]").c_str());
2156 else href->GetYaxis()->SetTitle(yaxis.c_str());
2159 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2162 if (
contains(histo.name(),
"ntracks") ) {
2164 double xm = htest->GetMean();
2167 double lxm = std::log10(xm);
2168 int newbins = int(0.5+xm/std::pow(10,
int(lxm)))*
pow(10,
int(lxm));
2169 int nrebin = int( (newbins+5)/10 );
2172 std::cout <<
"rebin: " << htest->GetName() <<
"\tbins: " << nrebin << std::endl;
2173 htest->Rebin(nrebin);
2176 href->Rebin(nrebin);
2184 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2187 if ( plotname ==
"" ) {
2190 htest->SetTitle(
"");
2191 if ( href ) href->SetTitle(
"");
2195 htest->SetTitle(
"");
2196 if ( href ) href->SetTitle(
"");
2200 htest->SetTitle(
"");
2201 if ( href ) href->SetTitle(
"");
2205 htest->SetTitle(
"");
2206 if ( href ) href->SetTitle(
"");
2210 htest->SetTitle((
"FTK "+ histo.name()).c_str());
2211 if ( href ) href->SetTitle((
"FTK "+ histo.name()).c_str());
2215 plotname += histo.name();
2224 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2226 bool residual =
false;
2228 if (
contains(histo.name(),
"_res") ||
contains(histo.name(),
"residual_") ||
contains(histo.name(),
"1d") ) residual =
true;
2233 std::string collection =
basename( chains[j] );
2237 if ( collection.find(
"_InDet")!=std::string::npos ) collection.erase( 0, collection.find(
"_InDet")+1 );
2238 if ( actual_chain.find(
"_InDet")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_InDet") );
2241 std::cout <<
"raw: " << chains[j] << std::endl;
2243 std::cout <<
"track collection: " << collection << std::endl;
2244 std::cout <<
"actual chain: " << actual_chain << std::endl;
2246 std::regex rx(
"_HLT_[^_]*RoI.*");
2247 std::regex rx1(
"_HLT_[^_]*_RoI.*");
2249 actual_chain = std::regex_replace( actual_chain, std::regex(
"_HLT_IDTrack.*" ),
"" );
2251 collection = std::regex_replace( collection, std::regex(
".*HLT_IDTrack_"),
"IDTrack " );
2252 collection = std::regex_replace( collection, std::regex(
"IDTrack "),
"" );
2253 collection = std::regex_replace( std::regex_replace( collection, rx,
"" ), rx1,
"" );
2255 if ( actual_chain.find(
"HLT_IDTrack_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"HLT_IDTrack_"), 12 );
2256 if ( actual_chain.find(
"_IDTrack_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_IDTrack_"), 9 );
2257 if ( actual_chain.find(
"IDTrack")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"IDTrack"), 7 );
2258 if ( actual_chain.find(
"_idperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_idperf"), 7 );
2259 if ( actual_chain.find(
"_bperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_bperf"), 6 );
2260 if ( actual_chain.find(
"_boffperf")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"_boffperf"), 9 );
2261 if ( actual_chain.find(
"_HLT_")!=std::string::npos ) actual_chain.replace( actual_chain.find(
"_HLT_"), 5,
" " );
2262 if ( actual_chain.find(
"HLT_")!=std::string::npos ) actual_chain.erase( actual_chain.find(
"HLT_"), 4 );
2264 if ( collection.find(
"_IDTrkNoCut")!=std::string::npos ) collection.erase( collection.find(
"_IDTrkNoCut"), 11 );
2265 if ( collection.find(
"xAODCnv")!=std::string::npos ) collection.erase( collection.find(
"xAODCnv"), 7 );
2266 if ( collection.find(
"HLT_IDTrack_")!=std::string::npos ) collection.erase( collection.find(
"HLT_IDTrack_"), 12 );
2267 if ( collection.find(
"HLT_IDTrack")!=std::string::npos ) collection.erase( collection.find(
"HLT_IDTrack"), 11 );
2268 if ( collection.find(
"Tracking")!=std::string::npos ) collection.replace( collection.find(
"Tracking"), 8,
"Trk" );
2269 if ( collection.find(
"InDetTrigTrk_")!=std::string::npos ) collection.erase( collection.find(
"InDetTrigTrk_"), 13 );
2270 if ( collection.find(
"HLT_xAODTracks_")!=std::string::npos ) collection.erase( collection.find(
"HLT_xAODTracks_"), 15 );
2271 if ( collection.find(
"_HLT_")!=std::string::npos ) collection.replace( collection.find(
"_HLT_"), 5,
" " );
2272 if ( collection.find(
"HLT_")!=std::string::npos ) collection.erase( collection.find(
"HLT_"), 4 );
2275 if ( actual_chain.size()>30 ) {
2276 size_t pos = actual_chain.find_last_of(
"_");
2277 while ( pos!=std::string::npos && actual_chain.size()>30 ) {
2278 actual_chain.erase( pos, actual_chain.size()-pos );
2279 actual_chain+=
"...";
2280 pos = actual_chain.find_last_of(
"_");
2284 std::string c = actual_chain +
" : " + collection;
2286 std::cout <<
"track collection: " << collection <<
" <-" << std::endl;
2287 std::cout <<
"actual chain: " << actual_chain <<
" <-" << std::endl;
2293 std::cout <<
"use label: " << c <<
"\tchains size " << chains.size() <<
"\t" << usrlabels.size() << std::endl;
2295 std::cout <<
"chains.size() " << chains.size() <<
" " << j << std::endl;
2296 std::cout <<
"chains.size() " << chains.size() <<
" " << j << std::endl;
2298 std::cout <<
"chains[j] : " << j <<
" " << chains[j] << std::endl;
2300 std::cout <<
"userlabels.size() " << usrlabels.size() << std::endl;
2302 if ( usrlabels.size() < j+1 ) {
2303 if ( usrlabels.size()!=0 ) std::cerr <<
"userlabels not large enough - not using userlabels" << std::endl;
2305 else c = usrlabels[ j ];
2307 std::cout <<
"use label: c: " << c << std::endl;
2313 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2317 std::cout <<
"\n\n\n\nxaxis: " << xaxis << std::endl;
2321 if ( ALLRANGEMAP || xaxis.find(
"p_{T}")!=std::string::npos || xaxis.find(
"E_{T}")!=std::string::npos ) {
2323 if ( RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos ) {
2324 bnd.
range( chains[j], htest );
2325 if ( href ) bnd.
range( chains[j], href );
2328 if ( RANGEMAP || ALLRANGEMAP ) {
2332 std::cout <<
"\n\n\nctags " << ctags.size() <<
"\n\n" << std::endl;
2334 for (
size_t ic=0 ; ic<ctags.size() ; ic++ ) {
2338 std::cout <<
"\n\nic: " << ic <<
" " << ctags[ic] <<
" " << ccolours[ic] <<
"\n\n" << std::endl;
2340 if ( chains[j].
find(ctags[ic])!=std::string::npos ) {
2341 std::cout <<
"\ttag " << ctags[ic] <<
" \tcolour: " << ccolours[ic] <<
"\tstyle: " << cstyles[ic] << std::endl;
2342 htest->SetLineColor( ccolours[ic] );
2343 htest->SetMarkerColor( ccolours[ic] );
2344 htest->SetMarkerStyle( cstyles[ic] );
2347 tgtest->SetLineColor(htest->GetMarkerColor());
2348 tgtest->SetMarkerStyle(htest->GetMarkerStyle());
2349 tgtest->SetMarkerColor(htest->GetMarkerColor());
2357 std::cout <<
"test: " << chains[j] <<
"chains colour: " << htest->GetMarkerColor() << std::endl;
2362 std::cout <<
"movin' on ..." << std::endl;
2364 std::cout <<
"chain: " << chains[j] <<
" \t marker colour: " << htest->GetMarkerColor() << std::endl;
2368 std::cout <<
"Plotter marker : " << htest->GetMarkerColor() <<
" " << htest->GetMarkerStyle() << std::endl;
2371 if ( uselabels ) plots.push_back(
Plotter( htest, href,
" " + chain_name[j] + c, tgtest ) );
2373 std::cout <<
"using label: " << c << std::endl;
2374 plots.push_back(
Plotter( htest, href, c, tgtest ) );
2377 if ( ALLRANGEMAP || ( RANGEMAP && xaxis.find(
"p_{T}")!=std::string::npos ) ) plots.back().max_entries( ccolours.size() );
2379 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2381 if ( make_ref_efficiencies ) {
2383 if ( htestnum && hrefnum ) {
2388 double range =
h->GetMaximum()-
h->GetMinimum();
2390 if ( range<0.2*scale_eff ) {
2392 double max = int( (
h->GetMaximum() + 20)*0.1 )*0.1*scale_eff;
2393 double min = int( (
h->GetMinimum() - 10)*0.1 )*0.1*scale_eff;
2395 if (
max>1*scale_eff )
max = 1.02*scale_eff;
2409 if ( href ) Chi2.push_back(
label(
"chi2 = %5.2lf / %2.0lf",
chi2( htest, href ),
double(htest->GetNbinsX()) ) );
2413 double mean_95 = htest->GetMean();
2414 double dmean_95 = htest->GetMeanError();
2415 double rms_95 = htest->GetRMS();
2416 double drms_95 = htest->GetRMSError();
2418 Mean.push_back(
label(
" mean = %4.2lf #pm %4.2lf", mean_95, dmean_95) );
2419 RMS.push_back(
label(
" rms = %4.2lf #pm %4.2lf", rms_95, drms_95 ) );
2423 if ( residual && drawresiduals ) {
2427 xpos = xpos_original;
2429 std::cout <<
"calculating resolutions : " << histo.name() <<
" " << htest->GetName() << std::endl;
2433 double mean_95 = d95->GetParameter(1);
2434 double dmean_95 = d95->GetParError(1);
2435 double rms_95 = d95->GetParameter(2);
2436 double drms_95 = d95->GetParError(2);
2438 std::cout <<
"\t\t" << histo.name()
2439 <<
"\tmean: " << mean_95 <<
" +- " << dmean_95
2440 <<
"\trms: " << rms_95 <<
" +- " << drms_95 << std::endl;
2445 for (
int ip=-2 ; ip<9 ; ip++ ) {
2446 if ( std::fabs(mean_95) >= std::pow( 10.,
double(-ip) ) ) {
2452 for (
int ip=-2 ; ip<9 ; ip++ ) {
2453 if ( std::fabs(rms_95) >= std::pow( 10.,
double(-ip) ) ) {
2462 std::cout <<
"\t\t" << histo.name()
2463 <<
"\tmean: " << mean_95 <<
" +- " << dmean_95 <<
" : pow " << mean_power
2464 <<
"\trms: " << rms_95 <<
" +- " << drms_95 <<
" : pow " << rms_power << std::endl;
2467 if ( mean_power == 0 ) {
2468 Mean.push_back(
label(
"mean_{95} = %4.2lf #pm %4.2lf", mean_95, dmean_95) );
2471 Mean.push_back(
label(
"mean_{95} = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2472 mean_95*std::pow(10.,
double(mean_power)), dmean_95*std::pow(10,
double(mean_power)), -mean_power ) );
2476 if ( rms_power == 0 ) {
2477 RMS.push_back(
label(
"rms_{95} = %4.2lf #pm %4.2lf", rms_95, drms_95 ) );
2480 RMS.push_back(
label(
"rms_{95} = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2481 rms_95*std::pow(10.,
double(rms_power)), drms_95*std::pow(10,
double(rms_power)), -rms_power ) );
2488 double mean_95ref = d95ref->GetParameter(1);
2489 double dmean_95ref = d95ref->GetParError(1);
2490 double rms_95ref = d95ref->GetParameter(2);
2491 double drms_95ref = d95ref->GetParError(2);
2493 std::cout <<
"\t\t" << histo.name()
2494 <<
"\tmean ref: " << mean_95ref <<
" +- " << dmean_95ref <<
" : pow " << mean_power
2495 <<
"\trms ref: " << rms_95ref <<
" +- " << drms_95ref <<
" : pow " << rms_power << std::endl;
2497 if ( mean_power == 0 ) {
2498 MeanRef.push_back(
label(
"mean_{95} ref = %4.2lf #pm %4.2lf", mean_95ref, dmean_95ref) );
2501 MeanRef.push_back(
label(
"mean_{95} ref = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2502 mean_95ref*std::pow(10,
double(mean_power)), dmean_95ref*std::pow(10,
double(mean_power)), -mean_power ) );
2507 if ( rms_power == 0 ) {
2508 RMSRef.push_back(
label(
"rms_{95} ref = %4.2lf #pm %4.2lf", rms_95ref, drms_95ref ) );
2511 RMSRef.push_back(
label(
"rms_{95} ref = ( %4.2lf #pm %4.2lf ) #times 10^{%d}",
2512 rms_95ref*std::pow(10,
double(rms_power)), drms_95ref*std::pow(10,
double(rms_power)), -rms_power ) );
2517 if ( href ) href->Sumw2();
2522 if ( href )
Norm( href );
2535 if ( !noreftmp && normref &&
2544 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2551 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2554 plots.sortx( xinfo );
2556 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2565 rmin = plots.realmin( plots.lo(), plots.hi() );
2566 rmax = plots.realmax( plots.lo(), plots.hi() );
2569 rmin = plots.realmin();
2570 rmax = plots.realmax();
2575 int csize = chains.size() + taglabels.size() + ( atlasstyle ? 1 : 0 );
2577 if ( yinfo.
log() && rmin>0 && rmax>0 ) {
2580 double delta = std::log10(rmax)-std::log10(rmin);
2585 yminset = rmin*std::pow(10,-delta*0.1);
2587 double newdelta = std::log10(rmax) - std::log10(yminset) + 0.05*delta;
2589 if ( csize<10 ) ymaxset = rmin*std::pow(10,newdelta/(1-0.07*csize));
2590 else ymaxset = rmin*std::pow(10,newdelta*2);
2592 if ( yminset!=yminset ) {
2593 std::cerr <<
" range error " << delta <<
" " << yminset <<
" " << ymaxset <<
"\t(" << rmin <<
" " << rmax <<
")" << std::endl;
2607 double delta = rmax-rmin;
2609 yminset = rmin-0.1*delta;
2611 if ( rmin>=0 && yminset<=0 ) yminset = 0;
2613 double newdelta = rmax - yminset + 0.05*delta;
2615 if ( csize<10 ) ymaxset = yminset + newdelta/(1-0.09*csize);
2616 else ymaxset = yminset + newdelta*2;
2619 double delta = rmax-rmin;
2621 ymaxset = rmax+0.1*delta;
2623 double newdelta = ymaxset - rmin - 0.05*delta;
2625 if ( csize<10 ) yminset = ymaxset - newdelta/(1-0.09*csize);
2626 else yminset = ymaxset - newdelta*2;
2628 if ( rmin>=0 && yminset<=0 ) yminset = 0;
2637 yminset = yinfo.
lo();
2638 ymaxset = yinfo.
hi();
2642 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2651 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2653 if ( yminset>yinfo.
lo() ) yminset = yinfo.
lo();
2654 if ( ymaxset<yinfo.
hi() ) ymaxset = yinfo.
hi();
2658 if (
contains(histo.name(),
"_eff") ) {
2660 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2668 if ( ymaxset!=0 || yminset!=0 ) {
2670 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2672 plots.Max( ymaxset );
2673 plots.Min( yminset );
2676 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2678 if ( yminset!=0 || ymaxset!=0 ) {
2679 if ( yminset>0 ) plots.SetLogy(yinfo.
log());
2680 else plots.SetLogy(
false);
2682 else plots.SetLogy(yinfo.
log());
2686 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2692 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2694 plots.Draw( legend );
2696 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2698 if ( atlasstyle )
ATLASLabel( xpos, ypositions[0]+deltay, atlaslabel, kBlack, ncolsp, nrowsp );
2700 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2702 for (
unsigned it=0 ; it<taglabels.size() ; it++ ) {
2703 DrawLabel( xpos, ypositions[it], taglabels[it], kBlack, 0.04 );
2707 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2710 if ( ( !nostats || !nomeans ) && !noplots ) {
2711 if ( dochi2 )
for (
unsigned j=0 ; j<Chi2.size() ; j++ )
DrawLabel( 0.75, 0.85-j*0.035, Chi2[j],
colours[j%6] );
2712 if ( ( (
contains(histo.name(),
"_res") ||
2714 histo.name()==
"pT" ||
2715 contains(histo.name(),
"residual_") ||
2716 contains(histo.name(),
"vs_pt") ) && !
contains(histo.name(),
"sigma") ) || drawmeans ) {
2718 if (
contains(histo.name(),
"_res") ||
contains(histo.name(),
"residual_") ||
contains(histo.name(),
"1d") || drawresiduals ){
2719 for (
unsigned j=0 ; j<chains.size() ; j++ ) {
2721 if ( j<MeanRef.size() ) {
2722 if ( !nomeans )
DrawLabel( xpos_original-0.02, (0.67-j*0.035), MeanRef[j],
colours[j%6] );
2723 DrawLabel( xpos_original-0.01, (0.67-0.035*chains.size()-j*0.035)-0.01, RMSRef[j],
colours[j%6] );
2726 if ( j<Mean.size() ) {
2728 DrawLabel( 0.62, (0.67-0.035*chains.size()-j*0.035)-0.01, RMS[j],
colours[j%6] );
2736 if ( xinfo.
log() ) gPad->SetLogx(
true);
2737 else gPad->SetLogx(
false);
2739 if ( yinfo.
log() ) gPad->SetLogy(
true);
2740 else gPad->SetLogy(
false);
2742 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2746 if ( make_ref_efficiencies ) {
2751 plots_eff.
Draw( legend_eff );
2754 if ( !noreflabel.empty() )
DrawLabel(0.1, 0.06, noreflabel, kRed, 0.03 );
2773 std::string useplotname;
2775 if ( panel.
size()>1 ) {
2776 useplotname = panel.
name();
2777 replace( useplotname,
'/',
'_' );
2780 useplotname = plotname;
2783 useplotname.erase(
std::remove( useplotname.begin(), useplotname.end(),
'+' ), useplotname.end() );
2786 std::string printbase = dir + useplotname + tag;
2790 if ( !nopdf )
print_pad( printbase+
".pdf" );
2791 if ( !nopng )
print_pad( printbase+
".png" );
2792 if ( Cfile )
print_pad( printbase+
".C" );
2794 std::cout << std::endl;
2799 if (
tc )
delete tc;
2804 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2810 bool files_duplicated = ( fref_==ftest_ );
2812 if ( deleteref && !files_duplicated ) {
2818 std::cout <<
"main() cleaning up reference file" << std::endl;
2820 TFile* newout =
new TFile(
".newout.root",
"recreate");
2826 TDirectory*
base = gDirectory;
2828 for (
unsigned i=0 ; i<
savedhistos.size() ; i++ ) {
2835 for (
unsigned j=0 ; j<
dirs.size()-1 ; j++ ) {
2836 std::cout <<
"\t" <<
dirs[j] << std::endl;
2837 TDirectory* renedir = gDirectory->GetDirectory(
dirs[j].c_str() );
2838 if ( renedir==0 ) gDirectory->mkdir(
dirs[j].c_str() );
2839 gDirectory->cd(
dirs[j].c_str() );
2843 TH1* href = (TH1*)fref->Get(
savedhistos[i].c_str() );
2844 if ( !noreftmp && href ) {
2845 std::cout << i <<
" " <<
savedhistos[i] <<
" 0x" << href << std::endl;
2846 href->Write(
dirs.back().c_str() );
2859 if (
fulldbg ) std::cout << __LINE__ << std::endl;
2863 if ( fref_ && !files_duplicated ) fref_->Close();
2864 if ( ftest_ ) ftest_->Close();
2868 if ( deleteref && !noref ) {
2869 std::cout <<
"ref " << frefname <<
"\ttest " << ftestname << std::endl;
2870 if ( frefname != ftestname && !files_duplicated ) {
2871 std::string cmd = std::string(
"mv ") + frefname +
" " + frefname +
".bak";
2872 std::system( cmd.c_str() );
2874 cmd = std::string(
"mv .newout.root ") + std::string(frefname);
2875 std::system( cmd.c_str() );
2878 std::cerr <<
"reference file and test file are the same - not replacing" << std::endl;
2884 if ( fref_ && !files_duplicated )
delete fref_;
2885 if ( ftest_ )
delete ftest_;