345 auto trackertruth =
resources.trackerHitAssoc_;
346 auto const & csctruth = *
resources.cscHitAssoc_;
347 auto const& dttruth = *
resources.dtHitAssoc_;
348 auto const& rpctruth = *
resources.rpcHitAssoc_;
349 auto const& gemtruth = *
resources.gemHitAssoc_;
351 int tracker_nshared = 0;
352 int muon_nshared = 0;
353 int global_nshared = 0;
355 double tracker_quality = 0;
356 double tracker_quality_cut;
360 double muon_quality = 0;
361 double muon_quality_cut;
365 double global_quality = 0;
367 double tracker_purity = 0;
368 double muon_purity = 0;
369 double global_purity = 0;
380 tPC.reserve(TPCollectionH.size());
381 for(
auto const& ref: TPCollectionH) {
385 bool any_trackingParticle_matched =
false;
388 for (TrackHitsCollection::const_iterator
track=tC.begin();
track!=tC.end();
track++, tindex++) {
390 <<
"\n"<<
"reco::Track "<<tindex
391 <<
", number of RecHits = "<< (
track->second -
track->first) <<
"\n";
393 tracker_matchedIds_valid.clear();
394 muon_matchedIds_valid.clear();
396 tracker_matchedIds_INVALID.clear();
397 muon_matchedIds_INVALID.clear();
399 int n_matching_simhits = 0;
403 int n_tracker_all = 0;
410 int n_tracker_valid = 0;
411 int n_muon_valid = 0;
417 int n_tracker_matched_valid = 0;
418 int n_muon_matched_valid = 0;
419 int n_dt_matched_valid = 0;
420 int n_csc_matched_valid = 0;
421 int n_rpc_matched_valid = 0;
422 int n_gem_matched_valid = 0;
425 int n_tracker_INVALID = 0;
426 int n_muon_INVALID = 0;
427 int n_dt_INVALID = 0;
428 int n_csc_INVALID = 0;
429 int n_rpc_INVALID = 0;
430 int n_gem_INVALID = 0;
432 int n_tracker_matched_INVALID = 0;
433 int n_muon_matched_INVALID = 0;
434 int n_dt_matched_INVALID = 0;
435 int n_csc_matched_INVALID = 0;
436 int n_rpc_matched_INVALID = 0;
437 int n_gem_matched_INVALID = 0;
440 getMatchedIds(tracker_matchedIds_valid, muon_matchedIds_valid,
441 tracker_matchedIds_INVALID, muon_matchedIds_INVALID,
442 n_tracker_valid, n_dt_valid, n_csc_valid, n_rpc_valid, n_gem_valid,
443 n_tracker_matched_valid, n_dt_matched_valid, n_csc_matched_valid, n_rpc_matched_valid, n_gem_matched_valid,
444 n_tracker_INVALID, n_dt_INVALID, n_csc_INVALID, n_rpc_INVALID, n_gem_INVALID,
445 n_tracker_matched_INVALID, n_dt_matched_INVALID, n_csc_matched_INVALID, n_rpc_matched_INVALID, n_gem_matched_INVALID,
447 trackertruth, dttruth, csctruth, rpctruth, gemtruth,
450 n_matching_simhits = tracker_matchedIds_valid.size() + muon_matchedIds_valid.size() +
451 tracker_matchedIds_INVALID.size() +muon_matchedIds_INVALID.size();
453 n_muon_valid = n_dt_valid + n_csc_valid + n_rpc_valid + n_gem_valid;
454 n_valid = n_tracker_valid + n_muon_valid;
455 n_muon_INVALID = n_dt_INVALID + n_csc_INVALID + n_rpc_INVALID + n_gem_INVALID;
456 n_INVALID = n_tracker_INVALID + n_muon_INVALID;
459 n_tracker_all = n_tracker_valid + n_tracker_INVALID;
460 n_dt_all = n_dt_valid + n_dt_INVALID;
461 n_csc_all = n_csc_valid + n_csc_INVALID;
462 n_rpc_all = n_rpc_valid + n_rpc_INVALID;
463 n_gem_all = n_gem_valid + n_gem_INVALID;
464 n_all = n_valid + n_INVALID;
466 n_muon_matched_valid = n_dt_matched_valid + n_csc_matched_valid + n_rpc_matched_valid + n_gem_matched_valid;
467 n_muon_matched_INVALID = n_dt_matched_INVALID + n_csc_matched_INVALID + n_rpc_matched_INVALID + n_gem_matched_INVALID;
470 int n_tracker_selected_hits = n_tracker_valid;
471 int n_muon_selected_hits = n_muon_valid;
472 int n_dt_selected_hits = n_dt_valid;
473 int n_csc_selected_hits = n_csc_valid;
474 int n_rpc_selected_hits = n_rpc_valid;
475 int n_gem_selected_hits = n_gem_valid;
478 int n_tracker_matched = n_tracker_matched_valid;
479 int n_muon_matched = n_muon_matched_valid;
480 int n_dt_matched = n_dt_matched_valid;
481 int n_csc_matched = n_csc_matched_valid;
482 int n_rpc_matched = n_rpc_matched_valid;
483 int n_gem_matched = n_gem_matched_valid;
490 InvMuonHits =
" ***INVALID MUON HITS***";
491 ZeroHitMuon =
" ***ZERO-HIT MUON***";
493 n_muon_selected_hits = n_muon_INVALID;
494 n_dt_selected_hits = n_dt_INVALID;
495 n_csc_selected_hits = n_csc_INVALID;
496 n_rpc_selected_hits = n_rpc_INVALID;
497 n_gem_selected_hits = n_gem_INVALID;
499 n_muon_matched = n_muon_matched_INVALID;
500 n_dt_matched = n_dt_matched_INVALID;
501 n_csc_matched = n_csc_matched_INVALID;
502 n_rpc_matched = n_rpc_matched_INVALID;
503 n_gem_matched = n_gem_matched_INVALID;
506 int n_selected_hits = n_tracker_selected_hits + n_muon_selected_hits;
507 int n_matched = n_tracker_matched + n_muon_matched;
510 <<
"\n"<<
"# TrackingRecHits: "<<(
track->second -
track->first)
511 <<
"\n"<<
"# used RecHits = " <<n_all <<
" ("<<n_tracker_all<<
"/" 512 <<n_dt_all<<
"/"<<n_csc_all<<
"/"<<n_rpc_all<<
"/"<<n_gem_all<<
" in Tracker/DT/CSC/RPC/GEM)"<<
", obtained from " << n_matching_simhits <<
" SimHits" 513 <<
"\n"<<
"# selected RecHits = " <<n_selected_hits <<
" (" <<n_tracker_selected_hits<<
"/" 514 <<n_dt_selected_hits<<
"/"<<n_csc_selected_hits<<
"/"<<n_rpc_selected_hits<<
"/"<<n_gem_selected_hits<<
" in Tracker/DT/CSC/RPC/GEM)"<<InvMuonHits
515 <<
"\n"<<
"# matched RecHits = " <<n_matched<<
" ("<<n_tracker_matched<<
"/" 516 <<n_dt_matched<<
"/"<<n_csc_matched<<
"/"<<n_rpc_matched<<
"/"<<n_gem_matched<<
" in Tracker/DT/CSC/RPC/GEM)";
518 if (printRtS && n_all>0 && n_matching_simhits==0)
520 <<
"*** WARNING in MuonAssociatorByHitsHelper::associateSimToReco: no matching PSimHit found for this reco::Track !";
522 if (n_matching_simhits != 0) {
524 for (TrackingParticleCollection::const_iterator trpart = tPC.begin(); trpart != tPC.end(); ++trpart, ++tpindex) {
527 int n_tracker_recounted_simhits = 0;
528 int n_muon_simhits = 0;
529 int n_global_simhits = 0;
532 int n_tracker_selected_simhits = 0;
533 int n_muon_selected_simhits = 0;
534 int n_global_selected_simhits = 0;
537 tracker_nshared =
getShared(tracker_matchedIds_valid, trpart);
538 muon_nshared =
getShared(muon_matchedIds_valid, trpart);
541 muon_nshared =
getShared(muon_matchedIds_INVALID, trpart);
543 global_nshared = tracker_nshared + muon_nshared;
544 if (global_nshared == 0)
continue;
610 n_tracker_recounted_simhits = trpart->numberOfTrackerHits();
612 n_muon_simhits = trpart->numberOfHits() - trpart->numberOfTrackerHits();
615 if (trpart->numberOfHits()==0) {
622 n_tracker_recounted_simhits = 1;
625 n_global_simhits = n_tracker_recounted_simhits + n_muon_simhits;
628 n_muon_selected_simhits = n_muon_simhits;
629 n_global_selected_simhits = n_muon_selected_simhits;
632 n_tracker_selected_simhits = n_tracker_recounted_simhits;
633 n_global_selected_simhits += n_tracker_selected_simhits;
637 else if (n_tracker_selected_simhits!=0)
638 tracker_quality =
static_cast<double>(tracker_nshared)/static_cast<double>(n_tracker_selected_simhits);
639 else tracker_quality = 0;
642 else if (n_muon_selected_simhits!=0)
643 muon_quality =
static_cast<double>(muon_nshared)/static_cast<double>(n_muon_selected_simhits);
644 else muon_quality = 0;
647 if (n_global_selected_simhits != 0) {
649 global_quality = global_nshared;
651 global_quality =
static_cast<double>(global_nshared)/static_cast<double>(n_global_selected_simhits);
653 else global_quality = 0;
656 if (n_selected_hits != 0) {
658 global_purity = global_nshared;
660 global_purity =
static_cast<double>(global_nshared)/static_cast<double>(n_selected_hits);
662 else global_purity = 0;
664 bool trackerOk =
false;
665 if (n_tracker_selected_hits != 0) {
666 if (tracker_quality > tracker_quality_cut) trackerOk =
true;
668 tracker_purity =
static_cast<double>(tracker_nshared)/static_cast<double>(n_tracker_selected_hits);
678 if (n_muon_selected_hits != 0) {
679 if (muon_quality > muon_quality_cut) muonOk =
true;
681 muon_purity =
static_cast<double>(muon_nshared)/static_cast<double>(n_muon_selected_hits);
688 bool matchOk = trackerOk || muonOk;
692 matchOk = trackerOk && muonOk;
696 outputCollection[tpindex].push_back(IndexMatch(tindex,global_quality));
697 any_trackingParticle_matched =
true;
700 <<
"************************************************************************************************************************" 701 <<
"\n"<<
"TrackingParticle " << tpindex <<
", q = "<<(*trpart).charge()<<
", p = "<<(*trpart).p()
702 <<
", pT = "<<(*trpart).pt()<<
", eta = "<<(*trpart).eta()<<
", phi = "<<(*trpart).phi()
703 <<
"\n"<<
" pdg code = "<<(*trpart).pdgId()
704 <<
", made of "<<(*trpart).numberOfHits()<<
" PSimHits, recounted "<<n_global_simhits<<
" PSimHits" 705 <<
" (tracker:"<<n_tracker_recounted_simhits<<
"/muons:"<<n_muon_simhits<<
")" 706 <<
", from "<<(*trpart).g4Tracks().size()<<
" SimTrack:";
708 g4T!=(*trpart).g4Track_end();
711 <<
" Id:"<<(*g4T).trackId()<<
"/Evt:("<<(*g4T).eventId().event()<<
","<<(*g4T).eventId().bunchCrossing()<<
")";
714 <<
"\t selected "<<n_global_selected_simhits<<
" PSimHits" 715 <<
" (tracker:"<<n_tracker_selected_simhits<<
"/muons:"<<n_muon_selected_simhits<<
")" 716 <<
"\n\t **MATCHED** with quality = "<<global_quality<<
" (tracker: "<<tracker_quality<<
" / muon: "<<muon_quality<<
")" 717 <<
"\n\t and purity = "<<global_purity<<
" (tracker: "<<tracker_purity<<
" / muon: "<<muon_purity<<
")" 718 <<
"\n\t N shared hits = "<<global_nshared<<
" (tracker: "<<tracker_nshared<<
" / muon: "<<muon_nshared<<
")" 719 <<
"\n" <<
" to: reco::Track "<<tindex<<ZeroHitMuon
720 <<
"\n\t"<<
" made of "<<n_selected_hits<<
" RecHits (tracker:"<<n_tracker_valid<<
"/muons:"<<n_muon_selected_hits<<
")";
724 if (global_nshared != 0) {
726 <<
"************************************************************************************************************************" 727 <<
"\n"<<
"TrackingParticle " << tpindex <<
", q = "<<(*trpart).charge()<<
", p = "<<(*trpart).p()
728 <<
", pT = "<<(*trpart).pt()<<
", eta = "<<(*trpart).eta()<<
", phi = "<<(*trpart).phi()
729 <<
"\n"<<
" pdg code = "<<(*trpart).pdgId()
730 <<
", made of "<<(*trpart).numberOfHits()<<
" PSimHits, recounted "<<n_global_simhits<<
" PSimHits" 731 <<
" (tracker:"<<n_tracker_recounted_simhits<<
"/muons:"<<n_muon_simhits<<
")" 732 <<
", from "<<(*trpart).g4Tracks().size()<<
" SimTrack:";
734 g4T!=(*trpart).g4Track_end();
737 <<
" Id:"<<(*g4T).trackId()<<
"/Evt:("<<(*g4T).eventId().event()<<
","<<(*g4T).eventId().bunchCrossing()<<
")";
740 <<
"\t selected "<<n_global_selected_simhits<<
" PSimHits" 741 <<
" (tracker:"<<n_tracker_selected_simhits<<
"/muons:"<<n_muon_selected_simhits<<
")" 742 <<
"\n\t NOT matched to reco::Track "<<tindex<<ZeroHitMuon
743 <<
" with quality = "<<global_quality<<
" (tracker: "<<tracker_quality<<
" / muon: "<<muon_quality<<
")" 744 <<
"\n\t and purity = "<<global_purity<<
" (tracker: "<<tracker_purity<<
" / muon: "<<muon_purity<<
")" 745 <<
"\n\t N shared hits = "<<global_nshared<<
" (tracker: "<<tracker_nshared<<
" / muon: "<<muon_nshared<<
")";
752 if (!any_trackingParticle_matched) {
755 <<
"************************************************************************************************************************" 756 <<
"\n NO TrackingParticle associated to ANY input reco::Track ! \n" 757 <<
"************************************************************************************************************************"<<
"\n";
760 <<
"************************************************************************************************************************"<<
"\n";
763 for (IndexAssociation::iterator it = outputCollection.begin(), ed = outputCollection.end(); it != ed; ++it) {
764 std::sort(it->second.begin(), it->second.end());
766 return outputCollection;
std::vector< TrackingParticle > TrackingParticleCollection
unsigned int NHitCut_muon
const bool ThreeHitTracksAreSpecial
std::map< size_t, std::vector< IndexMatch > > IndexAssociation
int getShared(MapOfMatchedIds &matchedIds, TrackingParticleCollection::const_iterator trpart) const
double EfficiencyCut_track
const bool AbsoluteNumberOfHits_muon
unsigned int NHitCut_track
const bool AbsoluteNumberOfHits_track
std::vector< SimTrack >::const_iterator g4t_iterator
const bool acceptOneStubMatchings
boost::ptr_vector< uint_SimHitIdpr_pair > MapOfMatchedIds
double EfficiencyCut_muon
const bool includeZeroHitMuons
void getMatchedIds(MapOfMatchedIds &tracker_matchedIds_valid, MapOfMatchedIds &muon_matchedIds_valid, MapOfMatchedIds &tracker_matchedIds_INVALID, MapOfMatchedIds &muon_matchedIds_INVALID, int &n_tracker_valid, int &n_dt_valid, int &n_csc_valid, int &n_rpc_valid, int &n_gem_valid, int &n_tracker_matched_valid, int &n_dt_matched_valid, int &n_csc_matched_valid, int &n_rpc_matched_valid, int &n_gem_matched_valid, int &n_tracker_INVALID, int &n_dt_INVALID, int &n_csc_INVALID, int &n_rpc_INVALID, int &n_gem_INVALID, int &n_tracker_matched_INVALID, int &n_dt_matched_INVALID, int &n_csc_matched_INVALID, int &n_rpc_matched_INVALID, int &n_gem_matched_INVALID, trackingRecHit_iterator begin, trackingRecHit_iterator end, const TrackerHitAssociator *trackertruth, const DTHitAssociator &dttruth, const CSCHitAssociator &csctruth, const RPCHitAssociator &rpctruth, const GEMHitAssociator &gemtruth, bool printRts, const TrackerTopology *) const