14 #include "GaudiKernel/MsgStream.h"
18 using namespace MuonStationIndex;
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 ){
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 ){
92 if( matchingStrategy == SameTrack ) trackPlots = &m_plots.stau;
93 else if( matchingStrategy == NotSameTrack ) trackPlots = &m_plots.rest;
96 if( matchingStrategy == SameTrack ) trackPlots = &m_plots.muon;
97 else if( matchingStrategy == NotSameTrack ) trackPlots = &m_plots.rest;
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;
115 if(
pos != track_seg_map.end() ) {
116 nseg = handleSegments(ntuple,
i,
pos->second,0, matchingStrategy, trackPlots->
segments);
117 nseg1 = handleSegments(ntuple,
i,
pos->second,1, matchingStrategy, trackPlots->
segments1);
118 nseg2 = handleSegments(ntuple,
i,
pos->second,2, matchingStrategy, trackPlots->
segments2);
119 nseg3 = handleSegments(ntuple,
i,
pos->second,3, matchingStrategy, trackPlots->
segments3);
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 );
182 betaFitResult = fitBeta( ntuple,
pos->second,
selection );
183 if( betaFitResult.
status != 0 ) betaRegionPlots.
rpc.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
186 betaFitResult = fitBeta( ntuple,
pos->second,
selection );
187 if( betaFitResult.
status != 0 ) betaRegionPlots.
rpct.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
190 betaFitResult = fitBeta( ntuple,
pos->second,
selection );
191 if( betaFitResult.
status != 0 ) betaRegionPlots.
all.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
194 betaFitResult = fitBeta( ntuple,
pos->second,
selection );
195 if( betaFitResult.
status != 0 ) {
196 betaRegionPlots.
allt.
fill( betaFitResult.
beta, betaTruth, betaFitResult.
chi2, betaFitResult.
ndof );
202 betaFitResult = fitBeta( ntuple,
pos->second,
selection );
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 ){
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);
284 const std::vector<int>& indexVec,
int stage,
288 unsigned int nseg = 0;
292 for( std::vector<int>::const_iterator
it=indexVec.begin();
it!=indexVec.end();++
it ){
298 if( !testStrategy(matchingStrategy,sameTrack) )
continue;
310 unsigned int nhough = 0;
313 for( std::vector<int>::const_iterator
it=indexVec.begin();
it!=indexVec.end();++
it ){
317 if( !testStrategy(matchingStrategy,sameTrack) )
continue;
335 std::map<int,int> countsPerLayer;
337 for( std::vector<int>::const_iterator
it=indexVec.begin();
it!=indexVec.end();++
it ){
341 if( !testStrategy(matchingStrategy,sameTrack) )
continue;
347 unsigned int nlayers = 0;
349 if(
it->second>2 )++nlayers;
355 if( matchingStrategy == SameTrack && !sameTrack )
return false;
356 if( matchingStrategy == NotSameTrack && sameTrack )
return false;
371 for( std::vector<int>::const_iterator
it=indexVec.begin();
it!=indexVec.end();++
it ){
375 if (
log.level()<=MSG::WARNING)
log << MSG::WARNING <<
"index out of range: " << (*it) <<
" max " << ntuple.
timeBlock.
type->size() <<
endmsg;
385 if( !
plots )
continue;
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;
407 if( !types.count(
type) )
continue;
417 if( hitsPerCandidate.size() > 1 ){
422 for( ;cit!=cit_end;++cit ){
427 float chi2ndof = candidateResult.
chi2/candidateResult.
ndof;
429 if(
hits.size() > 1 && candidateResult.
status != 0 && chi2ndof>5 ){
431 log <<
MSG::INFO <<
"Beta " << candidateResult.
beta <<
" of fit for types ";
432 for(
auto type : types ) std::cout <<
" " <<
type;
434 for(
auto& hit :
hits ){
435 const char*
text = hit.useInFit ?
" hit " :
" outlier ";
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 ){