Belle II Software  release-05-01-25
CDCMCCloneLookUp.cc
1 #include <tracking/trackFindingCDC/mclookup/CDCMCCloneLookUp.h>
2 
3 #include <tracking/trackFindingCDC/mclookup/CDCMCTrackLookUp.h>
4 #include <tracking/trackFindingCDC/mclookup/CDCMCHitLookUp.h>
5 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
6 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
7 
8 using namespace Belle2;
9 using namespace TrackFindingCDC;
10 
12 {
13  static CDCMCCloneLookUp cloneInfo;
14  return cloneInfo;
15 }
16 
17 std::map<const ITrackType, std::vector<CDCTrack*>> CDCMCCloneLookUp::getMatchedCDCTracksByMCID(
18  std::vector<CDCTrack>& cdcTracks)
19 {
20  const CDCMCTrackLookUp& cdcMCTrackLookUp = CDCMCTrackLookUp::getInstance();
21 
22  // Map of MCTrackIds to vectors of matching CDCTrack pointers
23  std::map<const ITrackType, std::vector<CDCTrack*>> mapMCTrackIDToCDCTracks;
24 
25  for (CDCTrack& cdcTrack : cdcTracks) {
26  CDCTrack* ptrCDCTrack = &cdcTrack;
27 
28  ITrackType mcTrackID = cdcMCTrackLookUp.getMCTrackId(ptrCDCTrack);
29 
30  // only if matching MCTrack with 50% minimal purity was found
31  if (mcTrackID != INVALID_ITRACK) {
32  mapMCTrackIDToCDCTracks[mcTrackID].push_back(ptrCDCTrack);
33  }
34  }
35  return mapMCTrackIDToCDCTracks;
36 }
37 
38 unsigned int CompareCDCTracks::getNumberOfCorrectHits(const CDCTrack* ptrCDCTrack) const
39 {
40  ITrackType mcTrackID = m_CDCMCTrackLookUp.getMCTrackId(ptrCDCTrack);
41  auto hitIsCorrect = [this, &mcTrackID](const CDCRecoHit3D & recoHit) {
42  return m_CDCMCHitLookUp.getMCTrackId(recoHit.getWireHit().getHit()) == mcTrackID;
43  };
44  return std::count_if(begin(*ptrCDCTrack), end(*ptrCDCTrack), hitIsCorrect);
45 }
46 
48 bool CompareCDCTracks::operator()(const CDCTrack* ptrCDCTrack1, const CDCTrack* ptrCDCTrack2) const
49 {
50  Index firstNLoopsTrack1 = m_CDCMCTrackLookUp.getFirstNLoops(ptrCDCTrack1);
51  Index firstNLoopsTrack2 = m_CDCMCTrackLookUp.getFirstNLoops(ptrCDCTrack2);
52 
53  // Look for track with smallest NLoops of first hit.
54  // If it is equal, use track with the larger number of correct hits.
55  if (firstNLoopsTrack1 == firstNLoopsTrack2) {
56  const unsigned int nCorrectHitsTrack1 = getNumberOfCorrectHits(ptrCDCTrack1);
57  const unsigned int nCorrectHitsTrack2 = getNumberOfCorrectHits(ptrCDCTrack2);
58 
59  const bool firstTrackBetter = nCorrectHitsTrack1 > nCorrectHitsTrack2;
60  return firstTrackBetter;
61  }
62  const bool firstTrackBetter = (firstNLoopsTrack1 < firstNLoopsTrack2);
63  return firstTrackBetter;
64 }
65 
66 CDCTrack* CDCMCCloneLookUp::findBestMatchedTrack(std::vector<CDCTrack*> matchedTrackPtrs)
67 {
68  const CDCMCTrackLookUp& cdcMCTrackLookUp = CDCMCTrackLookUp::getInstance();
69  const CDCMCHitLookUp& cdcMCHitLookUp = CDCMCHitLookUp::getInstance();
70 
71  const CompareCDCTracks compareCDCTracks(cdcMCTrackLookUp, cdcMCHitLookUp);
72  CDCTrack* ptrNonCloneTrack =
73  *(std::min_element(begin(matchedTrackPtrs), end(matchedTrackPtrs), compareCDCTracks));
74 
75  return ptrNonCloneTrack;
76 }
77 
79 {
80  m_cdcTrackIsCloneMap.clear();
81 }
82 
84 void CDCMCCloneLookUp::fill(std::vector<CDCTrack>& cdcTracks)
85 {
87  for (const CDCTrack& cdcTrack : cdcTracks) {
88  const CDCTrack* ptrCDCTrack = &cdcTrack;
89  m_cdcTrackIsCloneMap[ptrCDCTrack] = false; // not clone
90  }
91 
93  std::map<const ITrackType, std::vector<CDCTrack*>> matchedCDCTracksByMCID =
94  getMatchedCDCTracksByMCID(cdcTracks);
95 
96  for (auto& mcIDAndCDCTracks : matchedCDCTracksByMCID) {
98  std::vector<CDCTrack*>& matchedTrackPtrs = mcIDAndCDCTracks.second;
99 
100  if (matchedTrackPtrs.size() == 1) { // only one matching track
101  m_cdcTrackIsCloneMap[matchedTrackPtrs.at(0)] = false; // not clone
102 
103  } else { // multiple matching tracks
104  for (const CDCTrack* ptrCDCTrack : matchedTrackPtrs) {
105  m_cdcTrackIsCloneMap[ptrCDCTrack] = true; // default that all are clones
106  }
107  const CDCTrack* ptrNonCloneTrack = findBestMatchedTrack(matchedTrackPtrs);
108  m_cdcTrackIsCloneMap[ptrNonCloneTrack] = false; // not clone
109  }
110  }
111 }
112 
114 {
115  const CDCTrack* ptrCDCTrack = &cdcTrack;
116 
117  const CDCMCTrackLookUp& cdcMCTrackLookUp = CDCMCTrackLookUp::getInstance();
118  if (cdcMCTrackLookUp.getMCTrackId(ptrCDCTrack) == INVALID_ITRACK) {
119  return false; // track is not matched
120  } else {
121  return m_cdcTrackIsCloneMap.at(ptrCDCTrack);
122  }
123 }
Belle2::TrackFindingCDC::CDCRecoHit3D
Class representing a three dimensional reconstructed hit.
Definition: CDCRecoHit3D.h:62
Belle2::TrackFindingCDC::CDCTrack
Class representing a sequence of three dimensional reconstructed hits.
Definition: CDCTrack.h:51
Belle2::TrackFindingCDC::CDCMCCloneLookUp::getMatchedCDCTracksByMCID
std::map< const ITrackType, std::vector< CDCTrack * > > getMatchedCDCTracksByMCID(std::vector< CDCTrack > &cdcTracks)
Helper function which returns a map of MCTrackIDs to vectors of CDTrack pointers.
Definition: CDCMCCloneLookUp.cc:17
Belle2::TrackFindingCDC::CompareCDCTracks::getNumberOfCorrectHits
unsigned int getNumberOfCorrectHits(const CDCTrack *ptrCDCTrack) const
Get number of hits in track that are correctly matched.
Definition: CDCMCCloneLookUp.cc:38
Belle2::TrackFindingCDC::CDCMCCloneLookUp::m_cdcTrackIsCloneMap
std::map< const CDCTrack *, bool > m_cdcTrackIsCloneMap
Map of track pointers to isClone indicator from MCTruth-based assumption.
Definition: CDCMCCloneLookUp.h:61
Belle2::TrackFindingCDC::CDCMCHitCollectionLookUp::getMCTrackId
ITrackType getMCTrackId(const ACDCHitCollection *ptrHits) const
Getter for the Monte Carlo track id matched to this collection of hits.
Definition: CDCMCHitCollectionLookUp.icc.h:101
Belle2::TrackFindingCDC::CDCMCHitCollectionLookUp::getFirstNLoops
Index getFirstNLoops(const ACDCHitCollection *ptrHits) const
Getter for number of loops till the first hit the collection of hits which has the Monte Carlo track ...
Definition: CDCMCHitCollectionLookUp.h:151
Belle2::TrackFindingCDC::CDCMCCloneLookUp::fill
void fill(std::vector< CDCTrack > &cdcTracks)
fill with all cdcTracks in an event
Definition: CDCMCCloneLookUp.cc:84
Belle2::TrackFindingCDC::CDCMCHitLookUp::getMCTrackId
ITrackType getMCTrackId(const CDCHit *ptrHit) const
Returns the track id for the hit.
Definition: CDCMCHitLookUp.cc:122
Belle2::TrackFindingCDC::CompareCDCTracks::m_CDCMCHitLookUp
const CDCMCHitLookUp & m_CDCMCHitLookUp
Reference to a CDCMCHitLookUp instance, assigned in the constructor of this functor.
Definition: CDCMCCloneLookUp.h:91
Belle2::TrackFindingCDC::CDCMCTrackLookUp::getInstance
static const CDCMCTrackLookUp & getInstance()
Getter for the singletone instance.
Definition: CDCMCTrackLookUp.cc:23
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::CDCMCHitLookUp
Interface class to the Monte Carlo information for individual hits.
Definition: CDCMCHitLookUp.h:41
Belle2::TrackFindingCDC::CDCMCCloneLookUp
Class providing information whether a PR CDC track is the best match or a clone.
Definition: CDCMCCloneLookUp.h:28
Belle2::TrackFindingCDC::CompareCDCTracks::operator()
bool operator()(const CDCTrack *ptrCDCTrack1, const CDCTrack *ptrCDCTrack2) const
Compare both CDC tracks to get the better matched one.
Definition: CDCMCCloneLookUp.cc:48
Belle2::TrackFindingCDC::CompareCDCTracks
Functor which which decides which of two tracks to declare as best match.
Definition: CDCMCCloneLookUp.h:65
Belle2::TrackFindingCDC::CDCMCHitLookUp::getInstance
static const CDCMCHitLookUp & getInstance()
Getter for the singletone instance.
Definition: CDCMCHitLookUp.cc:32
Belle2::TrackFindingCDC::CDCMCCloneLookUp::findBestMatchedTrack
CDCTrack * findBestMatchedTrack(std::vector< CDCTrack * > matchedTrackPtrs)
Helper function which takes a vector of pointers to CDCTracks which are matched to the same MC partic...
Definition: CDCMCCloneLookUp.cc:66
Belle2::TrackFindingCDC::CDCMCCloneLookUp::getInstance
static CDCMCCloneLookUp & getInstance()
Getter for the singletone instance.
Definition: CDCMCCloneLookUp.cc:11
Belle2::TrackFindingCDC::CDCMCCloneLookUp::clear
void clear()
Clear eventwise lookup tables.
Definition: CDCMCCloneLookUp.cc:78
Belle2::TrackFindingCDC::CDCMCTrackLookUp
Specialisation of the lookup for the truth values of reconstructed tracks.
Definition: CDCMCTrackLookUp.h:33
Belle2::TrackFindingCDC::CompareCDCTracks::m_CDCMCTrackLookUp
const CDCMCTrackLookUp & m_CDCMCTrackLookUp
Reference to a CDCMCTrackLookUp instance, assigned in the constructor of this functor.
Definition: CDCMCCloneLookUp.h:89
Belle2::TrackFindingCDC::CDCMCCloneLookUp::isTrackClone
bool isTrackClone(const CDCTrack &cdcTrack)
getter for information from m_cdcTrackIsCloneMap
Definition: CDCMCCloneLookUp.cc:113