31 Long64_t nentries =
tree.GetEntries();
33 if (log.level()<=MSG::INFO) log << MSG::INFO <<
"Opening tree " << nentries <<
endmsg;
34 for (Long64_t jentry=0; jentry<nentries;jentry++) {
37 Long64_t centry =
tree.LoadTree(jentry);
38 if (centry < 0)
return;
39 tree.GetEntry(jentry);
42 if( jentry%1000 == 0 ){
43 if (log.level()<=MSG::INFO) {
44 log << MSG::INFO <<
" new event " << jentry <<
endmsg;
51 typedef std::map<int,std::vector<int> > TrackMap;
52 auto fillTrackMap = [](
const std::vector<int>& trkids, TrackMap& trackMap ){
53 for(
unsigned int i=0;i<trkids.size();++i){
54 trackMap[ trkids[i] ].push_back(i);
58 TrackMap track_seg_map;
61 TrackMap track_hough_map;
64 TrackMap track_hit_map;
67 TrackMap track_time_map;
70 TrackMap track_candidate_map;
87 for(
int ii=0;ii<3;++ii ){
101 if( matchingStrategy ==
All ) trackPlots = &
m_plots.rest;
106 unsigned int ntruth = 0;
107 unsigned int nseg = 0;
108 unsigned int nseg1 = 0;
109 unsigned int nseg2 = 0;
110 unsigned int nseg3 = 0;
111 unsigned int nhough = 0;
114 TrackMap::iterator pos = track_seg_map.find(i);
115 if( pos != track_seg_map.end() ) {
123 pos = track_hough_map.find(i);
124 if( pos != track_hough_map.end() ) {
125 nhough =
handleHough(ntuple,i,pos->second, matchingStrategy, trackPlots->
hough);
129 pos = track_hit_map.find(i);
130 if( pos != track_hit_map.end() ) {
131 ntruth =
handleHits(ntuple,i,pos->second, matchingStrategy, trackPlots->
hits);
135 pos = track_time_map.find(i);
136 if( pos != track_time_map.end() ) {
137 handleTimes(ntuple,i,pos->second, matchingStrategy, *trackPlots);
142 if( matchingStrategy ==
SameTrack || matchingStrategy ==
All ) {
144 trackPlots->
fill(ntruth,nseg,nseg1,nseg2,nseg3,nhough);
146 pos = track_candidate_map.find(i);
151 std::pair<unsigned int,unsigned int> candidateCounts(0,0);
152 if( pos != track_candidate_map.end() ) candidateCounts =
handleCandidates(ntuple,i,pos->second, plots, si );
153 if( candidateCounts.first == 0 ) {
154 plots.etaMissed->Fill(
eta);
155 plots.etaBetaMissed->Fill(
eta,betaTruth);
156 plots.betaMissed->Fill(betaTruth);
158 if( candidateCounts.second == 0 ) {
159 plots.etaMissedCombined->Fill(
eta);
160 plots.betaMissedCombined->Fill(betaTruth);
162 plots.ncandidates->Fill(candidateCounts.first);
163 plots.ncombinedCandidates->Fill(candidateCounts.second);
166 if( nseg3 < 2 )
continue;
168 pos = track_time_map.find(i);
169 if( pos != track_time_map.end() ) {
174 for(
unsigned int co=0;co<2;++co ){
178 if( betaFitResult.
status != 0 ) betaRegionPlots.
mdt.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
183 if( betaFitResult.
status != 0 ) betaRegionPlots.
rpc.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
187 if( betaFitResult.
status != 0 ) betaRegionPlots.
rpct.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
191 if( betaFitResult.
status != 0 ) betaRegionPlots.
all.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
195 if( betaFitResult.
status != 0 ) {
196 betaRegionPlots.
allt.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
203 if( betaFitResult.
status != 0 ) {
204 betaRegionPlots.
mdtt.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
216 const std::vector<int>& indexVec,
226 int bestTagCandidateIndex = -1;
227 float bestRes = FLT_MAX;
228 int bestCombinedCandidateIndex = -1;
229 float bestCombinedRes = FLT_MAX;
230 unsigned int ncandidates = 0;
231 unsigned int ncombinedCandidates = 0;
232 for( std::vector<int>::const_iterator it=indexVec.begin();it!=indexVec.end();++it ){
236 if (log.level()<=MSG::WARNING) log << MSG::WARNING <<
"index out of range: " << (*it) <<
" max " << ntuple.
candidateBlock.
ntimes->size() <<
endmsg;
242 float res = std::abs(beta-betaTruth);
249 if(
res < bestCombinedRes ){
250 bestCombinedRes =
res;
251 bestCombinedCandidateIndex = *it;
255 ++ncombinedCandidates;
259 bestTagCandidateIndex = *it;
266 if( bestCombinedCandidateIndex != -1 ){
271 if( bestTagCandidateIndex != -1 ){
275 int bestCandidateIndex = bestCombinedCandidateIndex != -1 ? bestCombinedCandidateIndex : bestTagCandidateIndex;
276 if( bestCandidateIndex != -1 ){
280 return std::make_pair(ncandidates,ncombinedCandidates);
391 const std::vector<int>& indexVec,
const std::set<int>&
types ) {
394 std::map<int,TimePointBetaFitter::HitVec> hitsPerCandidate;
398 for( std::vector<int>::const_iterator it=indexVec.begin();it!=indexVec.end();++it ){
401 if (log.level()<=MSG::WARNING) log << MSG::WARNING <<
"index out of range: " << (*it) <<
" max " << ntuple.
timeBlock.
type->size() <<
endmsg;
415 std::map<int,TimePointBetaFitter::HitVec>::iterator cit = hitsPerCandidate.begin();
416 std::map<int,TimePointBetaFitter::HitVec>::iterator cit_end = hitsPerCandidate.end();
417 if( hitsPerCandidate.size() > 1 ){
418 if (log.level()<=MSG::INFO) log << MSG::INFO <<
"multple candidates for track " << hitsPerCandidate.size() <<
endmsg;
422 for( ;cit!=cit_end;++cit ){
427 float chi2ndof = candidateResult.
chi2/candidateResult.
ndof;
428 if (log.level()<=MSG::INFO) {
429 if( hits.size() > 1 && candidateResult.
status != 0 && chi2ndof>5 ){
431 log << MSG::INFO <<
"Beta " << candidateResult.
beta <<
" of fit for types ";
433 log << MSG::INFO <<
" with large chi2 " << chi2ndof <<
" hits " << hits.size() <<
endmsg;
434 for(
auto& hit : hits ){
435 const char* text = hit.useInFit ?
" hit " :
" outlier ";
436 log << MSG::INFO << text <<
": dist "<< std::setw(7) << (int)hit.distance
437 <<
" time " << std::setprecision(3) << std::setw(6) << hit.time - betaUtils.
calculateTof(1.,hit.distance)
438 <<
" beta " << std::setw(6) << betaUtils.
calculateBeta(hit.time,hit.distance)
439 <<
" error " << std::setw(6) << hit.error <<
" residual " << std::setw(6) << hit.residual <<
" pull " << std::setw(6) << hit.residual/hit.error <<
endmsg;
443 if( candidateResult.
status != 0 ){