532 std::cerr <<
"Error: no config file specified\n" << std::endl;
533 return usage(argv[0], -1);
546 std::cout <<
"$0 :: compiled " << __DATE__ <<
" " << __TIME__ << std::endl;
550 std::string histofilename(
"");
552 std::string datafile =
"";
554 std::vector<std::string> refChains(0);
556 std::vector<TrackFilter*> refFilters(0);
561 std::string refChain =
"";
565 std::vector<std::string> testChains;
567 std::string binningConfigFile =
"";
569 bool useoldrms =
true;
572 std::string vertexSelection =
"";
573 std::string vertexSelection_rec =
"";
575 unsigned Nentries = 0;
577 for (
int i=1 ; i<argc ; i++ ) {
578 if ( std::string(argv[i])==
"-h" || std::string(argv[i])==
"--help" ) {
579 return usage(argv[0], 0);
581 else if ( std::string(argv[i])==
"-e" || std::string(argv[i])==
"--entries" ) {
582 if ( ++i>=argc )
return usage(argv[0], -1);
583 Nentries = std::atoi(argv[i]);
585 else if ( std::string(argv[i])==
"-o" || std::string(argv[i])==
"-f" || std::string(argv[i])==
"--file" ) {
586 if ( ++i>=argc )
return usage(argv[0], -1);
587 histofilename = argv[i];
588 if ( histofilename.find(
".root")==std::string::npos ) histofilename +=
".root";
590 else if ( std::string(argv[i])==
"-r" || std::string(argv[i])==
"--refChain" ) {
591 if ( ++i>=argc )
return usage(argv[0], -1);
595 if (refChain.find(
"+") != string::npos){
596 std::istringstream iss(refChain);
598 while (std::getline(iss, token,
'+')){
599 refChains.push_back(token);
600 refFilters.push_back(0);
604 refChains.push_back(argv[i]);
605 refFilters.push_back(0);
608 else if ( std::string(argv[i])==
"--rms" ) useoldrms =
false;
609 else if ( std::string(argv[i])==
"-n" || std::string(argv[i])==
"--nofit" ) nofit =
true;
610 else if ( std::string(argv[i])==
"-t" || std::string(argv[i])==
"--testChain" ) {
611 if ( ++i>=argc )
return usage(argv[0], -1);
612 testChains.push_back(argv[i]);
614 else if ( std::string(argv[i])==
"-p" || std::string(argv[i])==
"--pdgId" ) {
615 if ( ++i>=argc )
return usage(argv[0], -1);
616 pdgId = atoi(argv[i]);
618 else if ( std::string(argv[i])==
"--vr" ) {
619 if ( ++i>=argc )
return usage(argv[0], -1);
620 vertexSelection = argv[i];
622 else if ( std::string(argv[i])==
"--vt" ) {
623 if ( ++i>=argc )
return usage(argv[0], -1);
624 vertexSelection_rec = argv[i];
626 else if ( std::string(argv[i])==
"-b" || std::string(argv[i])==
"--binConfig" ) {
627 if ( ++i>=argc )
return usage(argv[0], -1);
628 binningConfigFile = std::string(argv[i]);
630 else if ( std::string(argv[i]).
find(
'-')==0 ) {
632 std::cerr <<
"unknown option " << argv[i] << std::endl;
633 return usage(argv[0], -1);
642 if ( datafile==
"" ) {
643 std::cerr <<
"no config file specifed\n" << endl;
644 return usage(argv[0], -1);
647 std::cout <<
time_str() << std::endl;
656 bool oldrms95 =
true;
657 inputdata.declareProperty(
"OldRMS95", oldrms95 );
658 std::cout <<
"setting Resplot old rms95 " << oldrms95 << std::endl;
662 std::cout <<
"setting Resplot old rms95 " << useoldrms << std::endl;
668 std::cout <<
"Not fitting resplots " << std::endl;
674 inputdata.declareProperty(
"NFiles", nfiles );
677 if ( histofilename==
"" ){
678 if ( inputdata.isTagDefined(
"outputFile") ) histofilename = inputdata.GetString(
"outputFile");
680 std::cerr <<
"Error: no output file defined\n" << std::endl;
681 return usage(argv[0], -1);
686 TFile foutput( histofilename.c_str(),
"recreate" );
687 if (!foutput.IsOpen()) {
688 std::cerr <<
"Error: could not open output file\n" << std::endl;
692 TDirectory* foutdir = gDirectory;
694 std::cout <<
"writing output to " << histofilename << std::endl;
696 TH1D* hevent =
new TH1D(
"event",
"event", 1000, 10000, 80000 );
697 Resplot* hcorr =
new Resplot(
"correlation", 21, -0.5, 20.5, 75, 0, 600);
715 bool expectBL =
false;
729 double massMax = 130;
734 bool rotate_testtracks =
false;
736 if ( inputdata.isTagDefined(
"RotateTestTracks") ) rotate_testtracks = ( inputdata.GetValue(
"RotateTestTracks") ?
true :
false );
738 bool truthMatch =
false;
740 if ( inputdata.isTagDefined(
"TruthMatch") ) truthMatch = ( inputdata.GetValue(
"TruthMatch") ?
true :
false );
745 std::vector<size_t> refPtOrd_indices;
746 bool use_pt_ordered_ref =
false;
748 if ( inputdata.isTagDefined(
"UsePtOrderedRefTracks") ) {
749 std::vector<double> refPtOrd_indices_tmp;
751 use_pt_ordered_ref =
true;
752 refPtOrd_indices_tmp = ( inputdata.GetVector(
"UsePtOrderedRefTracks") );
754 std::cout <<
"using PT ordered reference tracks: " << refPtOrd_indices_tmp << std::endl;
756 for (
size_t i=refPtOrd_indices_tmp.size(); i-- ; ) {
757 refPtOrd_indices.push_back( refPtOrd_indices_tmp.at(i) );
761 if ( inputdata.isTagDefined(
"pT") ) pT = inputdata.GetValue(
"pT");
762 if ( inputdata.isTagDefined(
"ET") )
ETmin = inputdata.GetValue(
"ET");
763 if ( inputdata.isTagDefined(
"ETovPT") )
ETovPTmin = inputdata.GetValue(
"ETovPT");
768 if ( inputdata.isTagDefined(
"pTMax") ) pTMax = inputdata.GetValue(
"pTMax");
771 if ( inputdata.isTagDefined(
"NMod") )
NMod = inputdata.GetValue(
"NMod");
774 if ( inputdata.isTagDefined(
"eta") )
eta = inputdata.GetValue(
"eta");
775 if ( inputdata.isTagDefined(
"zed") ) zed = inputdata.GetValue(
"zed");
776 else if ( inputdata.isTagDefined(
"z0") ) zed = inputdata.GetValue(
"z0");
777 if ( inputdata.isTagDefined(
"npix") ) npix = inputdata.GetValue(
"npix");
778 if ( inputdata.isTagDefined(
"nsiholes") ) nsiholes = inputdata.GetValue(
"nsiholes");
779 if ( inputdata.isTagDefined(
"npixholes") ) npixholes = inputdata.GetValue(
"npixholes");
780 if ( inputdata.isTagDefined(
"nsctholes") ) nsctholes = inputdata.GetValue(
"nsctholes");
781 if ( inputdata.isTagDefined(
"expectBL") ) expectBL = ( inputdata.GetValue(
"expectBL") > 0.5 ?
true :
false );
782 if ( inputdata.isTagDefined(
"nsct") ) nsct = inputdata.GetValue(
"nsct");
783 if ( inputdata.isTagDefined(
"nbl") ) nbl = inputdata.GetValue(
"nbl");
784 if ( inputdata.isTagDefined(
"chi2prob") ) chi2prob = inputdata.GetValue(
"chi2prob");
786 if ( inputdata.isTagDefined(
"ntracks") ) ntracks = inputdata.GetValue(
"ntracks")+0.5;
789 if ( inputdata.isTagDefined(
"chi2prob") ) chi2prob = inputdata.GetValue(
"chi2prob");
792 if ( pdgId==0 && inputdata.isTagDefined(
"pdgId") ) pdgId = inputdata.GetValue(
"pdgId");
794 if ( inputdata.isTagDefined(
"InvMassMax") ) massMax = inputdata.GetValue(
"InvMassMax");
795 if ( inputdata.isTagDefined(
"InvMassMin") ) massMin = inputdata.GetValue(
"InvMassMin");
797 if ( inputdata.isTagDefined(
"npix_rec") ) npix_rec = inputdata.GetValue(
"npix_rec");
798 if ( inputdata.isTagDefined(
"nsct_rec") ) nsct_rec = inputdata.GetValue(
"nsct_rec");
800 if ( inputdata.isTagDefined(
"pT_rec") ) pT_rec = inputdata.GetValue(
"pT_rec");
801 if ( inputdata.isTagDefined(
"eta_rec") ) eta_rec = inputdata.GetValue(
"eta_rec");
803 if ( inputdata.isTagDefined(
"a0") )
a0 = inputdata.GetValue(
"a0");
804 if ( inputdata.isTagDefined(
"a0min") ) a0min = inputdata.GetValue(
"a0min");
806 if ( inputdata.isTagDefined(
"Rmatch") ) Rmatch = inputdata.GetValue(
"Rmatch");
808 std::string useMatcher =
"DeltaR";
809 if ( inputdata.isTagDefined(
"UseMatcher") ) useMatcher = inputdata.GetString(
"UseMatcher");
813 if ( refChain==
"" ) {
814 if ( inputdata.isTagDefined(
"refChain") ) {
815 refChain = inputdata.GetString(
"refChain");
816 refChains.push_back(refChain);
817 refFilters.push_back(0);
820 std::cerr <<
"Error: no reference chain defined\n" << std::endl;
830 if ( inputdata.isTagDefined(
"Exclude") ) {
831 exclude = inputdata.GetString(
"Exclude");
835 if (refChains.size() == 0){
836 std::cerr <<
"Error: refChains is empty\n" <<std::endl;
841 if ( testChains.size()==0 ) {
842 if ( inputdata.isTagDefined(
"testChains") ) testChains = inputdata.GetStringVector(
"testChains");
843 else if ( inputdata.isTagDefined(
"testChain") ) testChains.push_back( inputdata.GetString(
"testChain") );
849 std::vector<ChainString> chainConfig;
851 for (
size_t ic=0 ; ic<testChains.size() ; ic++ ) {
852 chainConfig.push_back(
ChainString( testChains[ic] ) );
853 testChains[ic] = chainConfig.back().pre();
864 bool select_roi =
true;
870 bool use_custom_ref_roi =
false;
871 const int custRefRoi_nParams = 3;
873 double custRefRoi_params[custRefRoi_nParams] = {-999., -999., -999.};
874 std::vector<std::string> custRefRoi_chainList;
875 std::set<std::string> customRoi_chains;
877 if ( inputdata.isTagDefined(
"customRefRoi_etaHalfWidth") ) custRefRoi_params[0] = inputdata.GetValue(
"customRefRoi_etaHalfWidth");
878 if ( inputdata.isTagDefined(
"customRefRoi_phiHalfWidth") ) custRefRoi_params[1] = inputdata.GetValue(
"customRefRoi_phiHalfWidth");
879 if ( inputdata.isTagDefined(
"customRefRoi_zedHalfWidth") ) custRefRoi_params[2] = inputdata.GetValue(
"customRefRoi_zedHalfWidth");
881 if ( inputdata.isTagDefined(
"customRefRoi_chainList") ) custRefRoi_chainList = inputdata.GetStringVector(
"customRefRoi_chainList");
883 for (
unsigned ic=0 ; ic<custRefRoi_chainList.size() ; ic++ ) customRoi_chains.insert( custRefRoi_chainList[ic] );
885 for (
int param_idx=0 ; param_idx<custRefRoi_nParams ; param_idx++ ) {
886 if ( custRefRoi_params[param_idx] != -999 ) {
888 use_custom_ref_roi =
true;
892 if ( use_custom_ref_roi ) {
893 std::cout <<
"**** \t****" << std::endl;
894 std::cout <<
"**** Custom RoI will be used to filter ref. tracks\t****" << std::endl;
896 if ( custRefRoi_params[0] != -999. ) std::cout <<
"**** etaHalfWidth = " << custRefRoi_params[0] <<
"\t\t\t\t****" << std::endl;
897 else std::cout <<
"**** etaHalfWidth = value used in trigger RoI\t****" << std::endl;
899 if ( custRefRoi_params[1] != -999. ) std::cout <<
"**** phiHalfWidth = " << custRefRoi_params[1] <<
"\t\t\t\t****" << std::endl;
900 else std::cout <<
"**** phiHalfWidth = value used in trigger RoI\t****" << std::endl;
902 if ( custRefRoi_params[2] != -999. ) std::cout <<
"**** zedHalfWidth = " << custRefRoi_params[2] <<
"\t\t\t\t****" << std::endl;
903 else std::cout <<
"**** zedHalfWidth = value used in trigger RoI\t****" << std::endl;
905 if ( !custRefRoi_chainList.empty() ) {
906 std::cout <<
"**** \t****" << std::endl;
907 std::cout <<
"**** Applying custom RoI only to specified chains\t****" << std::endl;
909 std::cout <<
"**** \t****" << std::endl;
914 if ( inputdata.isTagDefined(
"SelectRoi") ) {
915 select_roi = ( inputdata.GetValue(
"SelectRoi")!=0 ?
true :
false );
919 std::cout <<
"**** ****" << std::endl;
920 std::cout <<
"**** RoI filtering of reference tracks is disabled ****" << std::endl;
921 std::cout <<
"**** ****" << std::endl;
930 std::vector<double> lumiblocks;
934 if ( inputdata.isTagDefined(
"GRL") ) {
936 std::vector<std::string> grlvector = inputdata.GetStringVector(
"GRL");
937 std::cout <<
"Reading GRL from: " << grlvector << std::endl;
938 for (
size_t igrl=0 ; igrl<grlvector.size() ; igrl++ ) goodrunslist.read( grlvector[igrl] );
941 else if ( inputdata.isTagDefined(
"LumiBlocks") ) {
943 lumiblocks = inputdata.GetVector(
"LumiBlocks");
945 for (
unsigned int i=0 ; i<lumiblocks.size()-2 ; i+=3 ){
946 goodrunslist.addRange( lumiblocks[i], lumiblocks[i+1], lumiblocks[i+2] );
954 if ( vertexSelection ==
"" ) {
955 if ( inputdata.isTagDefined(
"VertexSelection") ) vertexSelection = inputdata.GetString(
"VertexSelection");
958 bool bestPTVtx =
false;
959 bool bestPT2Vtx =
false;
962 if ( vertexSelection!=
"" ) {
963 if ( vertexSelection==
"BestPT" ) bestPTVtx =
true;
964 else if ( vertexSelection==
"BestPT2" ) bestPT2Vtx =
true;
973 if ( vertexSelection_rec ==
"" ) {
974 if ( inputdata.isTagDefined(
"VertexSelectionRec") ) vertexSelection_rec = inputdata.GetString(
"VertexSelectionRec");
977 bool bestPTVtx_rec =
false;
978 bool bestPT2Vtx_rec =
false;
981 if ( vertexSelection_rec!=
"" ) {
982 if ( vertexSelection_rec==
"BestPT" ) bestPTVtx_rec =
true;
983 else if ( vertexSelection_rec==
"BestPT2" ) bestPT2Vtx_rec =
true;
984 else vtxind_rec =
atoi_check( vertexSelection_rec );
987 std::cout <<
"vertexSelection: " << vertexSelection << std::endl;
988 std::cout <<
"vertexSelection_rec: " << vertexSelection_rec << std::endl;
996 bool useBestVertex =
false;
997 if ( inputdata.isTagDefined(
"useBestVertex") ) useBestVertex = ( inputdata.GetValue(
"useBestVertex") ? 1 : 0 );
999 bool useSumPtVertex =
true;
1000 if ( inputdata.isTagDefined(
"useSumPtVertex") ) useSumPtVertex = ( inputdata.GetValue(
"useSumPtVertex") ? 1 : 0 );
1002 int MinVertices = 1;
1003 if ( inputdata.isTagDefined(
"MinVertices") ) MinVertices = inputdata.GetValue(
"MinVertices");
1010 bool useVertexTracks =
false;
1011 if ( inputdata.isTagDefined(
"UseVertexTracks") ) useVertexTracks = ( inputdata.GetValue(
"UseVertexTracks") > 0 );
1014 std::string vertex_refname =
"Vertex";
1015 if ( inputdata.isTagDefined(
"VertexReference") ) vertex_refname +=
":" + inputdata.GetString(
"VertexReference");
1018 int NVtxTrackCut = 2;
1019 if ( inputdata.isTagDefined(
"NVtxTrackCut") ) NVtxTrackCut = inputdata.GetValue(
"NVtxTrackCut");
1023 bool event_selector_flag =
false;
1025 if ( inputdata.isTagDefined(
"EventSelector") )
event_list = inputdata.GetVector(
"EventSelector");
1029 if ( es.size() ) event_selector_flag =
true;
1032 std::vector<double> beamTest;
1033 std::vector<double> beamRef;
1036 bool correctBeamlineRef =
false;
1037 bool correctBeamlineTest =
false;
1039 if ( inputdata.isTagDefined(
"CorrectBeamlineRef") ) correctBeamlineRef = ( inputdata.GetValue(
"CorrectBeamlineRef") == 0 ?
false :
true );
1040 if ( inputdata.isTagDefined(
"CorrectBeamlineTest") ) correctBeamlineTest = ( inputdata.GetValue(
"CorrectBeamlineTest") == 0 ?
false :
true );
1043 if ( inputdata.isTagDefined(
"BeamTest") ) beamTest = inputdata.GetVector(
"BeamTest");
1045 if ( inputdata.isTagDefined(
"BeamTestx") ) beamTest.push_back(inputdata.GetValue(
"BeamTestx"));
1046 if ( inputdata.isTagDefined(
"BeamTesty") ) beamTest.push_back(inputdata.GetValue(
"BeamTesty"));
1050 if ( inputdata.isTagDefined(
"BeamRef") ) beamRef = inputdata.GetVector(
"BeamRef");
1052 if ( inputdata.isTagDefined(
"BeamRefx") ) beamRef.push_back(inputdata.GetValue(
"BeamRefx"));
1053 if ( inputdata.isTagDefined(
"BeamRefy") ) beamRef.push_back(inputdata.GetValue(
"BeamRefy"));
1058 if ( ( beamTest.size()!=0 && beamTest.size()!=2 && beamTest.size()!=3 ) ||
1059 ( beamRef.size()!=0 && beamRef.size()!=2 && beamRef.size()!=3 ) ) {
1060 std::cerr <<
"incorrectly specified beamline position" << std::endl;
1064 if ( beamTest.size()>0 ) correctBeamlineTest =
true;
1065 if ( beamRef.size()>0 ) correctBeamlineRef =
true;
1067 if ( correctBeamlineRef ) std::cout <<
"main() correcting beamline for reference tracks" << std::endl;
1068 if ( correctBeamlineTest ) std::cout <<
"main() correcting beamline for test tracks" << std::endl;
1072 if ( beamRef.size()>0 ) std::cout <<
"beamref " << beamRef << std::endl;
1073 if ( beamTest.size()>0 ) std::cout <<
"beamtest " << beamTest << std::endl;
1078 if ( inputdata.isTagDefined(
"a0v") ) a0v = inputdata.GetValue(
"a0v");
1079 if ( inputdata.isTagDefined(
"z0v") ) z0v = inputdata.GetValue(
"z0v");
1082 double a0vrec = 1000;
1083 double z0vrec = 2000;
1085 if ( inputdata.isTagDefined(
"a0vrec") ) a0vrec = inputdata.GetValue(
"a0vrec");
1086 if ( inputdata.isTagDefined(
"z0vrec") ) z0vrec = inputdata.GetValue(
"z0vrec");
1088 bool initialiseFirstEvent =
false;
1089 if ( inputdata.isTagDefined(
"InitialiseFirstEvent") ) initialiseFirstEvent = inputdata.GetValue(
"InitialiseFirstEvent");
1093 if ( inputdata.isTagDefined(
"dumpflag") )
dumpflag = ( inputdata.GetValue(
"dumpflag")==0 ?
false :
true );
1096 bool doPurity =
false;
1097 if ( inputdata.isTagDefined(
"doPurity") ) doPurity = ( inputdata.GetValue(
"doPurity")==0 ?
false :
true );
1099 if ( inputdata.isTagDefined(
"DebugPrintout") )
debugPrintout = ( inputdata.GetValue(
"DebugPrintout")==0 ?
false :
true );
1102 bool monitorZBeam =
false;
1103 if ( inputdata.isTagDefined(
"MonitorinZBeam") ) monitorZBeam = ( inputdata.GetValue(
"MonitorZBeam")==0 ?
false :
true );
1105 std::cout <<
"dbg " << __LINE__ << std::endl;
1111 if ( binningConfigFile!=
"" ) binningConfig =
new ReadCards( binningConfigFile );
1123 if ( binningConfig!=&inputdata )
delete binningConfig;
1126 if ( inputdata.isTagDefined(
"PRINT_BRESIDUALS") )
PRINT_BRESIDUALS = ( inputdata.GetValue(
"PRINT_BRESIDUALS")==0 ?
false :
true );
1128 int selectcharge = 0;
1129 if ( inputdata.isTagDefined(
"Charge") ) selectcharge = inputdata.GetValue(
"Charge");
1132 std::cout <<
"using reference " << refChain << std::endl;
1133 if ( refChain.find(
"Truth") != string::npos ) std::cout <<
"using pdgId " << pdgId << std::endl;
1134 if ( refChains.size() > 1 ) std::cout<<
"Multiple reference chains split to: " << refChains <<std::endl;
1147 std::cout <<
"a0v: " << a0v << std::endl;
1148 std::cout <<
"z0v: " << z0v << std::endl;
1153 npix, nsct, -1, nbl,
1155 npixholes, nsctholes, nsiholes, expectBL );
1157 if ( selectcharge!=0 ) filter_offline.
chargeSelection( selectcharge );
1158 if ( pTMax>pT ) filter_offline.
maxpT( pTMax );
1185 Filter_Track filter_onlinekine( eta_rec, 1000, 0., 2000, pT, -1, npix, nsct, -1, -2, -2);
1187 Filter_Combined filter_online( &filter_onlinekine, &filter_onlinevertex );
1189 Filter_Track filter_offkinetight( 5, 1000, 0., 2000, pT, -1, 0, 0, -1, -2, -2);
1190 Filter_Combined filter_offtight( &filter_offkinetight, &filter_inout );
1199 if ( inputdata.isTagDefined(
"Filter" ) ) {
1200 ChainString filter = inputdata.GetString(
"Filter");
1201 std::cout <<
"Filter: " << inputdata.GetString(
"Filter") <<
" : " << filter << std::endl;
1202 if ( filter.head()==
"Offline2017" ) {
1203 std::string filter_type = filter.tail();
1205 filter_offCP =
new Filter_Combined ( filter_offline2017, &filter_vertex);
1206 refFilter = filter_offCP;
1208 else if ( filter.head()==
"OfflineR22" ) {
1209 std::string filter_type = filter.tail();
1211 filter_offCP =
new Filter_Combined ( filter_offlineR22, &filter_vertex);
1212 refFilter = filter_offCP;
1215 std::cerr <<
"unimplemented Filter requested: " << filter.head() << std::endl;
1220 if ( !(refFilter =
getFilter( refChains[0], pdgId, &filter_off, &filter_muon, &filter_truth ) ) ) {
1221 std::cerr <<
"unknown reference chain defined" << std::endl;
1226 refFilters.push_back(refFilter);
1229 std::map<std::string,TIDA::Reference>
ref;
1231 std::vector<NtupleTrackSelector*> refSelectors;
1238 for (
size_t ic=0 ; ic<refChains.size() ; ic++ ) {
1240 if ( refFilter==0 ) {
1241 if ( !(refFilters[ic] =
getFilter( refChains[ic], pdgId, &filter_off, &filter_muon, &filter_truth ) ) ) {
1242 std::cerr <<
"unknown reference chain defined" << std::endl;
1245 refFilter = refFilters[ic];
1247 else refFilters[ic] = refFilter;
1255 if (pdgId==0) truthFilter = &filter_off;
1256 else truthFilter = &filter_truth;
1262 std::cout <<
"filter_passthrough" << std::endl;
1264 Filter_Track filter_passthrough( 10, 1000, 0., 2000, pT_rec, npix_rec, nsct_rec, 1, -2, -2, -2);
1269 std::cout <<
"using tracks: " << refChain <<
" for reference sample" << std::endl;
1275 std::vector<std::string>& test_chains = testChains;
1280 std::map<std::string,TrackAnalysis*> analysis;
1286 std::vector<TrackAnalysis*> analyses;
1287 analyses.reserve(test_chains.size());
1289 std::cout <<
"booking " << test_chains.size() <<
" analyses" << std::endl;
1291 for (
unsigned i=0 ; i<test_chains.size() ; i++ ) {
1293 std::string chainname =
ChainString(test_chains[i]);
1295 std::vector<std::string> chainnames;
1297 chainnames.push_back(chainname);
1305 std::string probe_extra = probe.
extra();
1307 if ( probe_extra.empty() ) probe_extra = probe.
postvalue(
"extra");
1309 if ( probe_extra.find(
"_tag")!=std::string::npos || probe.
extra().find(
"_tag")!=std::string::npos ) {
1310 std::cout <<
"rejecting tag chain " << probe << std::endl;
1315 size_t p = probe_extra.find(
"_probe");
1317 if ( p!=std::string::npos ) {
1319 std::string probe_ref = refChains[0];
1321 if ( !probe.
postvalue(
"ref").empty() ) {
1325 if ( refChains[0] != probe_ref ) {
1326 std::cerr <<
"default and probe chain references do not match: probe ref: " << probe_ref <<
" ref: " << refChains[0] << std::endl;
1334 std::string probe_key = probe_extra.erase(p, 6);
1336 for (
unsigned j=0 ; j<test_chains.size(); ++j) {
1338 if ( i==j )
continue;
1342 if ( tag.head() != probe.
head() )
continue;
1346 std::string tag_extra = tag.extra();
1348 if ( tag_extra.empty() ) tag_extra = tag.postvalue(
"extra");
1349 if ( tag_extra.find(
"_tag")==std::string::npos )
continue;
1352 std::string tag_key = tag_extra.erase( tag_extra.find(
"_tag"), 4) ;
1355 if ( tag_key != probe_key )
continue;
1357 if ( tag.element() == probe.
element() )
continue;
1359 std::string tag_ref = refChains[0];
1367 if ( !tag.postvalue(
"ref").empty() ) {
1369 tag_ref = tag.postvalue(
"ref");
1372 std::cout <<
"tag ref: " << tag_ref << std::endl;
1374 if (
ref.find(tag_ref)==
ref.end() ) {
1385 TnP_tool =
new TagNProbe( tag_ref, probe_ref, massMin, massMax);
1387 TnP_tool->
probe(probe);
1388 std::cout <<
"Tag and probe pair found! \n\t Tag : " << tag <<
"\n\t Probe : " << probe
1389 <<
"\n\t tag ref: " << tag_ref
1390 <<
"\n\tprobe ref: " << probe_ref
1391 <<
"\n-------------------" << std::endl;
1402 if ( TnP_tool )
replace( chainname,
"/",
"_" );
1409 std::string vtxTool = chainConfig[i].postvalue(
"rvtx");
1411 if ( vtxTool!=
"" ) {
1416 analy_conf->
store().
insert( anal_confvtx,
"rvtx" );
1432 if ( chainConfig[i].values().size()>0 ) {
1433 std::cout <<
"chain:: " << chainname <<
" : size " << chainConfig[i].values().size() << std::endl;
1434 for (
unsigned ik=chainConfig[i].values().size() ; ik-- ; ) {
1435 std::cout <<
"\tchainconfig: " << ik <<
"\tkey " << chainConfig[i].keys()[ik] <<
" " << chainConfig[i].values()[ik] << std::endl;
1442 if ( analysis.find( chainname )==analysis.end() ) {
1443 analysis.insert( std::map<std::string,TrackAnalysis*>::value_type( chainname, analy_conf ) );
1444 analyses.push_back(analy_conf);
1447 std::cerr <<
"WARNING: Duplicated chain"
1449 <<
"---------------------------------"
1450 <<
"---------------------------------"
1451 <<
"---------------------------------" << std::endl;
1455 std::cout <<
"analysis: " << chainname <<
"\t" << analy_conf
1457 <<
"---------------------------------"
1458 <<
"---------------------------------"
1459 <<
"---------------------------------" << std::endl;
1463 std::cout <<
"purity " << (chainnames[0]+
"-purity") << std::endl;
1467 analysis[chainnames[0]+
"-purity"] = analp;
1468 analyses.push_back(analp);
1473 std::cout <<
"main() finished looping" << std::endl;
1477 bool fullyContainTracks =
false;
1479 if ( inputdata.isTagDefined(
"FullyContainTracks") ) {
1480 fullyContainTracks = ( inputdata.GetValue(
"FullyContainTracks")==0 ?
false :
true );
1483 bool containTracksPhi =
true;
1485 if ( inputdata.isTagDefined(
"ContainTracksPhi") ) {
1486 containTracksPhi = ( inputdata.GetValue(
"ContainTracksPhi")==0 ?
false :
true );
1491 dynamic_cast<Filter_Combined*
>(refFilter)->containtracks(fullyContainTracks);
1492 dynamic_cast<Filter_Combined*
>(refFilter)->containtracksPhi(containTracksPhi);
1509 bool filterRoi =
false;
1512 bool roicomposite =
false;
1515 if ( inputdata.isTagDefined(
"FilterRoi" ) ) {
1519 std::vector<double> filter_values = inputdata.GetVector(
"FilterRoi" );
1521 if ( filter_values.size()>0 ) roieta = filter_values[0];
1522 if ( filter_values.size()>1 ) roicomposite = ( filter_values[1]==0 ? false : true );
1523 if ( filter_values.size()>2 ) roimult = int(filter_values[2]+0.5);
1527 RoiFilter roiFilter( roieta, roicomposite, roimult );
1534 else if ( useMatcher ==
"DeltaRZ" || useMatcher ==
"DeltaRZSinTheta" ) {
1538 if ( inputdata.isTagDefined(
"Matcher_deta" ) ) deta = inputdata.GetValue(
"Matcher_deta");
1539 if ( inputdata.isTagDefined(
"Matcher_dphi" ) ) dphi = inputdata.GetValue(
"Matcher_dphi");
1540 if ( inputdata.isTagDefined(
"Matcher_dzed" ) ) dzed = inputdata.GetValue(
"Matcher_dzed");
1545 else if ( useMatcher ==
"pT_2" ) {
1546 double pTmatchLim_2 = 1.0;
1547 if ( inputdata.isTagDefined(
"Matcher_pTLim_2") ) pTmatchLim_2 = inputdata.GetValue(
"Matcher_pTLim_2");
1550 else if ( useMatcher ==
"Truth" ) {
1563 else if ( useMatcher ==
"DeltaRZ" || useMatcher ==
"DeltaRZSinTheta" ) {
1567 if ( inputdata.isTagDefined(
"Matcher_deta" ) ) deta = inputdata.GetValue(
"Matcher_deta");
1568 if ( inputdata.isTagDefined(
"Matcher_dphi" ) ) dphi = inputdata.GetValue(
"Matcher_dphi");
1569 if ( inputdata.isTagDefined(
"Matcher_dzed" ) ) dzed = inputdata.GetValue(
"Matcher_dzed");
1574 else if ( useMatcher ==
"pT_2" ) {
1575 double pTmatchLim_2 = 1.0;
1576 if ( inputdata.isTagDefined(
"Matcher_pTLim_2") ) pTmatchLim_2 = inputdata.GetValue(
"Matcher_pTLim_2");
1579 else if ( useMatcher ==
"Truth" ) {
1600 std::vector<std::string> filenames;
1603 if ( inputdata.isTagDefined(
"DataSets") ) {
1605 std::cout <<
"fetching dataset details" << std::endl;
1606 std::vector<std::string> datasets = inputdata.GetStringVector(
"DataSets");
1607 for (
unsigned int ids=0 ; ids<datasets.size() ; ids++ ) {
1608 std::cout <<
"\tdataset " << datasets[ids] << std::endl;
1610 std::vector<std::string> filenames_ = d.datafiles();
1611 std::cout <<
"\tdataset contains " << filenames_.size() <<
" files" << std::endl;
1612 filenames.insert(filenames.end(), filenames_.begin(),filenames_.end());
1615 else if ( inputdata.isTagDefined(
"DataFiles") ) filenames = inputdata.GetStringVector(
"DataFiles");
1617 std::cerr <<
"no input data specified" << std::endl;
1627 bool show_release =
true;
1629 std::vector<std::string> release_data;
1631 std::string release_data_save =
"";
1633 if ( show_release ){
1637 for (
unsigned i=0 ; first && i<filenames.size() ; i++ ) {
1639 TFile* finput = TFile::Open( filenames[i].c_str() );
1642 if ( finput==0 || !finput->IsOpen() || finput->IsZombie() ) {
1643 std::cerr <<
"Error: could not open input file: " << filenames[i] << std::endl;
1647 TTree* dataTree = (TTree*)finput->Get(
"dataTree");
1648 TString* releaseData =
new TString(
"");
1651 dataTree->SetBranchAddress(
"ReleaseMetaData", &releaseData);
1653 for (
unsigned int i=0; i<dataTree->GetEntries() ; i++ ) {
1654 dataTree->GetEntry(i);
1655 release_data.push_back( releaseData->Data() );
1656 if ( release_data_save != release_data.back() ) {
1657 std::cout <<
"main() release data: " << release_data.back() <<
" : " << *releaseData << std::endl;
1660 release_data_save = release_data.back();
1664 if ( finput )
delete finput;
1669 if ( !release_data.empty() ) {
1670 std::sort(release_data.begin(), release_data.end());
1671 release_data.erase(
std::unique(release_data.begin(), release_data.end()), release_data.end());
1677 TTree* dataTree =
new TTree(
"dataTree",
"dataTree");
1678 TString* releaseData =
new TString(
"");
1681 dataTree->Branch(
"ReleaseMetaData",
"TString", &releaseData);
1683 for (
unsigned ird=0 ; ird<release_data.size() ; ird++ ) {
1684 *releaseData = release_data[ird];
1688 dataTree->Write(
"", TObject::kOverwrite);
1706 if ( Nentries==0 && inputdata.isTagDefined(
"Nentries") ) {
1707 Nentries = unsigned(inputdata.GetValue(
"Nentries"));
1710 unsigned event_counter = 0;
1712 typedef std::pair<int,double> zpair;
1713 std::vector<zpair> refz;
1714 std::vector<zpair> testz;
1716 std::vector<double> beamline_ref;
1717 std::vector<double> beamline_test;
1722 std::cout <<
"opening files" << std::endl;
1726 int pregrl_events = 0;
1727 int grl_counter = 0;
1730 std::cout <<
"starting event loop " <<
time_str() << std::endl;
1733 size_t max_files = filenames.size();
1734 if ( nfiles!=0 && nfiles<max_files ) max_files = nfiles;
1736 for (
size_t ifile=0 ;
run && ifile<max_files; ifile++ ) {
1738 bool newfile =
true;
1741 TFile* finput = TFile::Open( filenames[ifile].c_str() );
1743 if ( finput==0 || !finput->IsOpen() || finput->IsZombie() ) {
1744 std::cerr <<
"Error: could not open output file " << filenames[ifile] << std::endl;
1748 TTree*
data = (TTree*)finput->Get(
"tree");
1751 std::cerr <<
"Error: cannot open TTree: " << filenames[ifile] << std::endl;
1759 data->SetBranchAddress(
"TIDA::Event",&track_ev);
1765 unsigned cNentries =
data->GetEntries();
1771 for (
unsigned int i=0;
skip &&
run && i<cNentries ; i++ ) {
1788 bool ingrl = goodrunslist.inRange(
r,
lb );
1793 if ( !ingrl )
continue;
1799 if ( event_selector_flag && !es.
in( event ) )
continue;
1801 if ( mintime>
ts ) mintime =
ts;
1802 if ( maxtime<
ts ) maxtime =
ts;
1804 if ( Nentries>0 && event_counter>Nentries ) {
1806 std::cout <<
"breaking out " <<
run << std::endl;
1816 hevent->Fill( event );
1818 if ( filenames.size()<2 ) {
1819 if ( (cNentries<10) || i%(cNentries/10)==0 || i%1000==0 ||
debugPrintout ) {
1820 std::cout <<
"run " << track_ev->
run_number()
1823 <<
"\tchains " << track_ev->
chains().size()
1825 std::cout <<
"\t : processed " << i <<
" events so far (" << int((1000*i)/cNentries)*0.1 <<
"%)\t" <<
time_str() << std::endl;
1829 else if ( newfile ) {
1831 int pfiles = filenames.size();
1832 if ( nfiles>0 ) pfiles = nfiles;
1835 std::cout <<
"file entries=" <<
data->GetEntries();
1837 if (
data->GetEntries()<100 ) std::cout <<
" ";
1838 if (
data->GetEntries()<1000 ) std::cout <<
" ";
1839 if (
data->GetEntries()<10000 ) std::cout <<
" ";
1844 std::cout <<
"run " << track_ev->
run_number()
1847 <<
"\tchains " << track_ev->
chains().size()
1850 std::cout <<
"\t : processed " << ifile <<
" files so far (" << int((1e3*ifile)/pfiles)*0.1 <<
"%)\t" <<
time_str() << std::endl;
1863 truthTracks.
clear();
1864 refPurityTracks.
clear();
1868 mit->second.selector()->clear();
1874 const std::vector<TIDA::Chain>& chains = track_ev->
chains();
1879 for (
unsigned int ic=0 ; ic<chains.size() ; ic++ ) {
1880 if ( chains[ic].name()==
"Truth" ) {
1888 for (
const std::string&
rc : refChains){
1889 for (
unsigned int ic=0 ; ic<chains.size() ; ic++ ) {
1890 if ( chains[ic].name()==
rc ) {
1893 beamline_ref = chains[ic][0].user();
1902 std::vector<TIDA::Vertex> vertices;
1906 if ( vtxchain && vtxchain->
size()>0 ) {
1908 const std::vector<TIDA::Vertex>& mv = vtxchain->
at(0).
vertices();
1913 if (
debugPrintout ) std::cout <<
"vertices:\n" << mv << std::endl;
1915 if ( bestPTVtx || bestPT2Vtx ) {
1916 for (
size_t iv=0 ; iv<mv.size() ; iv++ ) {
1917 if ( mv[iv].Ntracks()==0 )
continue;
1918 double selection_ = 0.0;
1921 for (
unsigned itr=0; itr<vtx_temp.
tracks().size(); itr++) {
1923 if ( bestPTVtx ) selection_ += std::fabs(tr->
pT());
1924 else if ( bestPT2Vtx ) selection_ += std::fabs(tr->
pT())*std::fabs(tr->
pT());
1931 if ( selectvtx!=-1 ) {
1932 vertices.push_back( mv[selectvtx] );
1935 else if ( vtxind>=0 ) {
1936 if (
size_t(vtxind)<mv.size() ) {
1937 vertices.push_back( mv[vtxind] );
1941 for (
size_t iv=0 ; iv<mv.size() ; iv++ ) {
1942 vertices.push_back( mv[iv] );
1953 for (
unsigned iv=0 ; iv<mv.size() ; iv++ ) {
1954 int Ntracks = mv[iv].Ntracks();
1955 if ( Ntracks>NVtxTrackCut ) {
1972 bool foundReference =
false;
1981 for (
const std::string&
rc : refChains ) {
1990 std::string refname = mitr->first;
1999 *mitr->second.tom() = rtom;
2013 if ( !foundReference )
continue;
2016 std::cout <<
"reference chain:\n" << *refchain << std::endl;
2019 for (
unsigned ic=0 ; ic<track_ev->
chains().size() ; ic++ ) {
2026 std::map<std::string,TrackAnalysis*>::iterator analitr = analysis.find(chain.name());
2030 if ( analitr==analysis.end() )
continue;
2033 std::cout <<
"test chain:\n" << chain << std::endl;
2038 std::vector<TIDA::Roi*> rois;
2051 std::map<std::string,TIDA::Reference>::iterator mit0=
ref.find(TnP_tool->
type0());
2058 if ( TnP_tool->
type0() == TnP_tool->
type1() ) {
2060 rois = TnP_tool->
GetRois( track_ev->
chains(), selector0, filter0, invmass, invmass_obj, rtom );
2066 std::map<std::string,TIDA::Reference>::iterator mit1=
ref.find(TnP_tool->
type1());
2074 for (
size_t ia=0 ; ia<selector1->
tracks().size() ; ia++ ) {
2076 std::cout << ia <<
"\t" << *track << std::endl;
2077 std::cout <<
"\t" << rtom1->
object(track->id()) << std::endl;
2080 std::cout << *TnP_tool << std::endl;
2083 rois = TnP_tool->
GetRois( track_ev->
chains(), selector0, filter0, selector1, filter1, invmass, invmass_obj, rtom, rtom1 );
2088 rois.reserve( chain.size() );
2089 for (
size_t ir=0 ;
ir<chain.size() ;
ir++ ) rois.push_back( &(chain.rois()[
ir]) );
2093 if (
false ) std::cout <<
"++++++++++++ rois size = " << rois.size() <<
" +++++++++++" << std::endl;
2096 for (
unsigned int ir=0 ;
ir<rois.size() ;
ir++ ) {
2109 std::vector<TIDA::Track*> testp = testTracks.
tracks();
2114 if ( filterRoi && !roiFilter.
filter( roi ) )
continue;
2117 const std::vector<TIDA::Vertex>& mvt = troi.
vertices();
2119 std::vector<TIDA::Vertex> vertices_test;
2124 if ( bestPTVtx_rec || bestPT2Vtx_rec ) {
2128 for (
unsigned iv=0 ; iv<mvt.size() ; iv++ ) {
2129 double selection_ = 0.0;
2132 for (
unsigned itr=0; itr<vtx_temp.
tracks().size(); itr++) {
2134 if ( bestPTVtx ) selection_ += std::fabs(tr->
pT());
2135 else if ( bestPT2Vtx ) selection_ += std::fabs(tr->
pT())*std::fabs(tr->
pT());
2142 if ( selectvtx!=-1 ) {
2145 vertices_test.push_back(selected);
2148 else if ( vtxind_rec!=-1 ) {
2149 if (
unsigned(vtxind_rec)<mvt.size() ) {
2152 vertices_test.push_back( selected );
2156 for (
unsigned iv=0 ; iv<mvt.size() ; iv++ ) {
2159 vertices_test.push_back( selected );
2164 beamline_test = rois[
ir]->user();
2167 for (
size_t i=analyses.size() ; i-- ; ) {
2171 if ( correctBeamlineTest ) {
2172 if ( beamTest.size()==2 ) analy_track->
setBeamTest( beamTest[0], beamTest[1] );
2175 if ( !inputdata.isTagDefined(
"BeamTest") ) {
2176 if ( beamline_test.size()==2 ) analy_track->
setBeamTest( beamline_test[0], beamline_test[1] );
2182 if ( correctBeamlineRef ) {
2183 if ( beamRef.size()==2 ) analy_track->
setBeamRef( beamRef[0], beamRef[1] );
2186 if ( !inputdata.isTagDefined(
"BeamRef") ) {
2187 if ( beamline_ref.size()==2 ) analy_track->
setBeamRef( beamline_ref[0], beamline_ref[1] );
2206 bool customRefRoi_thisChain =
false;
2208 if ( use_custom_ref_roi ) {
2209 if ( customRoi_chains.size() ) {
2210 if ( customRoi_chains.find( chain.name() )!=customRoi_chains.end() ) customRefRoi_thisChain =
true;
2212 else customRefRoi_thisChain =
true;
2215 if ( use_custom_ref_roi && customRefRoi_thisChain ) {
2216 refRoi =
makeCustomRefRoi( roi, custRefRoi_params[0], custRefRoi_params[1], custRefRoi_params[2] );
2232 std::vector<TIDA::Track*> refp_vec = refTracks.
tracks( refFilter );
2237 if ( select_roi )
dynamic_cast<Filter_Combined*
>(truthFilter)->setRoi(&roi);
2238 const std::vector<TIDA::Track*>& truth = truthTracks.
tracks(truthFilter);
2239 const std::vector<TIDA::Track*>& refp_tmp = refp_vec;
2242 truth_matcher->
match( refp_tmp, truth );
2244 std::vector<TIDA::Track*> refp_matched;
2247 for (
unsigned i=0 ; i<refp_vec.size() ; i++ ) {
2248 if ( truth_matcher->
matched( refp_vec[i] ) ) refp_matched.push_back( refp_vec[i] );
2252 refp_vec = refp_matched;
2256 if ( use_pt_ordered_ref ) {
2259 size_t nRefTracks = refp_vec.size();
2261 std::vector<TIDA::Track*> refp_chosenPtOrd;
2265 for (
size_t sidx=refPtOrd_indices.size() ; sidx-- ; ) {
2266 if ( refPtOrd_indices.at(sidx)>nRefTracks ) {
2267 std::cout <<
"WARNING: for event " <<
event
2268 <<
", pT ordered reference track at vector position " << refPtOrd_indices.at(sidx)
2269 <<
" requested but not found" << std::endl;
2275 for (
size_t sidx=refPtOrd_indices.size() ; sidx-- ; ) {
2276 for (
size_t idx=0 ; idx<refp_vec.size() ; idx++ ) {
2277 if ( idx == refPtOrd_indices.at(sidx) ) {
2278 refp_chosenPtOrd.push_back(refp_vec.at(idx));
2285 refp_vec = refp_chosenPtOrd;
2296 if ( ptconfig!=
"" ) {
2297 double pt = std::atof( ptconfig.c_str() );
2299 std::vector<TIDA::Track*> reft; reft.reserve(refp_vec.size());
2300 for ( std::vector<TIDA::Track*>::const_iterator itr=refp_vec.begin() ; itr!=refp_vec.end() ; ++itr ) {
2301 if ( std::fabs((*itr)->pT())>=pt ) reft.push_back( *itr );
2310 if ( d0config!=
"" ) {
2311 double d0 = std::atof( d0config.c_str() );
2313 std::vector<TIDA::Track*> reft; reft.reserve(refp_vec.size());
2314 for ( std::vector<TIDA::Track*>::const_iterator itr=refp_vec.begin() ; itr!=refp_vec.end() ; ++itr ) {
2315 if ( std::fabs((*itr)->a0())<=d0 ) reft.push_back( *itr );
2332 if ( objectET !=
"" ) {
2334 double ETconfig = std::atof( objectET.c_str() );
2338 std::vector<TIDA::Track*>::iterator itr=refp_vec.begin() ;
2340 while ( itr!=refp_vec.end() ) {
2343 if ( tobj==0 || tobj->
pt()<ETconfig )
2344 itr=refp_vec.erase( itr );
2352 const std::vector<TIDA::Track*>& refp = refp_vec;
2369 std::vector<TIDA::Vertex> vertices_roi;
2377 vertices_roi.clear();
2379 const std::vector<TIDA::Vertex>& mv = vertices;
2384 for (
unsigned iv=0 ; iv<mv.size() ; iv++ ) {
2390 bool accept_vertex =
false;
2393 if ( roi[
ir]->zedMinus()<=vx.
z() && roi[
ir]->
zedPlus()>=vx.
z() ) accept_vertex =
true;
2400 if ( !accept_vertex )
continue;
2406 if ( useVertexTracks ) {
2410 trackcount = vertex_roi.
Ntracks();
2411 if ( trackcount>=ntracks && trackcount>0 ) {
2412 vertices_roi.push_back( vertex_roi );
2417 for (
unsigned itr=0; itr<refp.size(); itr++){
2419 double theta_ = 2*std::atan(std::exp(-tr->
eta()));
2420 double dzsintheta = std::fabs( (vx.
z()-tr->
z0()) * std::sin(theta_) );
2421 if( dzsintheta < 1.5 ) trackcount++;
2426 if ( trackcount>=ntracks && trackcount>0 ) {
2428 vertices_roi.push_back( vertex_roi );
2436 if ( rotate_testtracks )
for (
size_t i=testp.size() ; i-- ; ) testp[i]->rotate();
2442 if ( monitorZBeam ) {
2443 if ( beamline_ref.size()>2 && beamline_test.size()>2 ) {
2444 refz.push_back( zpair(
lb, beamline_ref[2]) );
2445 testz.push_back( zpair(
lb, beamline_test[2]) );
2449 matcher->
match( refp, testp);
2451 if ( tom.
status() ) analitr->second->execute( refp, testp, matcher, &tom );
2452 else analitr->second->execute( refp, testp, matcher );
2455 analitr->second->store().find( vtxanal,
"rvtx" );
2459 if ( vtxanal && ( refp.size() >=
size_t(ntracks) ) ) {
2478 std::cout <<
"\nselected tracks:" << chain.name() << std::endl;
2479 std::cout <<
"ref tracks refp.size() " << refp.size() <<
"\n" << refp << std::endl;
2480 std::cout <<
"test tracks testp.size() " << testp.size() <<
"\n" << testp << std::endl;
2482 TrackAssociator::map_type::const_iterator titr = matcher->TrackAssociator::matched().begin();
2483 TrackAssociator::map_type::const_iterator tend = matcher->TrackAssociator::matched().end();
2485 std::cout <<
"track matches:\n";
2486 while (titr!=tend) {
2487 std::cout <<
"\t" << im++ <<
"\t" << *titr->first <<
" ->\n\t\t" << *titr->second << std::endl;
2492 std::cout <<
"completed : " << chain.name() <<
"\n";
2493 std::cout <<
"-----------------------------------" << std::endl;
2498 if ( _matcher->size()<refp.size() ) {
2500 if ( refp.size()==1 && testp.size()==0 ) {
2501 std::cout << track_ev->
chains()[ic] <<std::endl;
2502 std::cout <<
"roi\n" << track_ev->
chains()[ic].rois()[
ir] << endl;
2512 const std::vector<TIDA::Track*>& refpp = refPurityTracks.
tracks( refFilter );
2514 testPurityTracks.
clear();
2517 std::vector<TIDA::Track*> testpp = testPurityTracks.
tracks();
2519 matcher->
match(refpp, testpp);
2522 std::map<std::string,TrackAnalysis*>::iterator analitrp = analysis.find(chain.name()+
"-purity");
2524 if ( analitrp == analysis.end() )
continue;
2527 analitrp->second->execute( refpp, testpp, matcher );
2547 std::cout <<
"done " <<
time_str() <<
"\tprocessed " << event_counter <<
" events"
2548 <<
"\ttimes " << mintime <<
" " << maxtime
2549 <<
"\t( grl: " << grl_counter <<
" / " << pregrl_events <<
" )" << std::endl;
2551 if ( monitorZBeam )
zbeam zb( refz, testz );
2560 for (
int i=analyses.size() ; i-- ; ) {
2562 analyses[i]->finalise();
2565 analyses[i]->store().find( vtxanal,
"rvtx" );
2566 if ( vtxanal ) vtxanal->
finalise();
2577 mit->second.Clean();
2581 if ( ex_matcher )
delete ex_matcher;
2583 std::cout <<
"done" << std::endl;