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