Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
TwoViewLongTracksTool.cc
Go to the documentation of this file.
1
10
12
13using namespace pandora;
14
15namespace lar_content
16{
17
19 m_minMatchedFraction(0.3f),
20 m_minMatchingScore(0.95f),
21 m_minMatchedSamplingPoints(15),
22 m_minXOverlapFraction(0.9f),
23 m_minMatchedSamplingPointRatio(2)
24{
25}
26
27//------------------------------------------------------------------------------------------------------------------------------------------
28
29bool TwoViewLongTracksTool::HasLongDirectConnections(IteratorList::const_iterator iIter, const IteratorList &iteratorList)
30{
31 for (IteratorList::const_iterator iIter2 = iteratorList.begin(), iIter2End = iteratorList.end(); iIter2 != iIter2End; ++iIter2)
32 {
33 if (iIter == iIter2)
34 continue;
35
36 if (((*iIter)->GetCluster1() == (*iIter2)->GetCluster1()) || ((*iIter)->GetCluster2() == (*iIter2)->GetCluster2()))
37 return true;
38 }
39
40 return false;
41}
42
43//------------------------------------------------------------------------------------------------------------------------------------------
44
45bool TwoViewLongTracksTool::IsLongerThanDirectConnections(IteratorList::const_iterator iIter, const MatrixType::ElementList &elementList,
46 const unsigned int minMatchedSamplingPointRatio, const pandora::ClusterSet &usedClusters)
47{
48 const unsigned int nMatchedReUpsampledSamplingPoints((*iIter)->GetOverlapResult().GetNMatchedReUpsampledSamplingPoints());
49
50 for (MatrixType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
51 {
52 if ((*iIter) == eIter)
53 continue;
54
55 if (usedClusters.count(eIter->GetCluster1()) || usedClusters.count(eIter->GetCluster2()))
56 continue;
57
58 if (((*iIter)->GetCluster1() != eIter->GetCluster1()) && ((*iIter)->GetCluster2() != eIter->GetCluster2()))
59 continue;
60
61 if (nMatchedReUpsampledSamplingPoints < minMatchedSamplingPointRatio * eIter->GetOverlapResult().GetNMatchedReUpsampledSamplingPoints())
62 return false;
63 }
64
65 return true;
66}
67
68//------------------------------------------------------------------------------------------------------------------------------------------
69
71{
73 std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
74
75 ProtoParticleVector protoParticleVector;
76 this->FindLongTracks(overlapMatrix, protoParticleVector);
77
78 const bool particlesMade(pAlgorithm->CreateThreeDParticles(protoParticleVector));
79 return particlesMade;
80}
81
82//------------------------------------------------------------------------------------------------------------------------------------------
83
84void TwoViewLongTracksTool::FindLongTracks(const MatrixType &overlapMatrix, ProtoParticleVector &protoParticleVector) const
85{
86 ClusterSet usedClusters;
87 ClusterVector sortedKeyClusters;
88 overlapMatrix.GetSortedKeyClusters(sortedKeyClusters);
89
90 for (const Cluster *const pKeyCluster : sortedKeyClusters)
91 {
92 if (!pKeyCluster->IsAvailable())
93 continue;
94
95 unsigned int n0(0), n1(0);
96 MatrixType::ElementList elementList;
97 overlapMatrix.GetConnectedElements(pKeyCluster, true, elementList, n0, n1);
98
99 IteratorList iteratorList;
100 this->SelectLongElements(elementList, usedClusters, iteratorList);
101
102 // Check that elements are not directly connected and are significantly longer than any other directly connected elements
103 for (IteratorList::const_iterator iIter = iteratorList.begin(), iIterEnd = iteratorList.end(); iIter != iIterEnd; ++iIter)
104 {
106 continue;
107
109 continue;
110
111 ProtoParticle protoParticle;
112 protoParticle.m_clusterList.push_back((*iIter)->GetCluster1());
113 protoParticle.m_clusterList.push_back((*iIter)->GetCluster2());
114 protoParticleVector.push_back(protoParticle);
115
116 usedClusters.insert((*iIter)->GetCluster1());
117 usedClusters.insert((*iIter)->GetCluster2());
118 }
119 }
120}
121
122//------------------------------------------------------------------------------------------------------------------------------------------
123
125 const MatrixType::ElementList &elementList, const pandora::ClusterSet &usedClusters, IteratorList &iteratorList) const
126{
127 for (MatrixType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
128 {
129 if (usedClusters.count(eIter->GetCluster1()) || usedClusters.count(eIter->GetCluster2()))
130 continue;
131
132 if (eIter->GetOverlapResult().GetLocallyMatchedFraction() < m_minMatchedFraction)
133 continue;
134
135 if (eIter->GetOverlapResult().GetMatchingScore() < m_minMatchingScore)
136 continue;
137
138 if (eIter->GetOverlapResult().GetNMatchedReUpsampledSamplingPoints() < m_minMatchedSamplingPoints)
139 continue;
140
141 const TwoViewXOverlap &xOverlap(eIter->GetOverlapResult().GetTwoViewXOverlap());
142
144 {
145 iteratorList.push_back(eIter);
146 }
147 }
148}
149
150//------------------------------------------------------------------------------------------------------------------------------------------
151
153{
155 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinMatchedFraction", m_minMatchedFraction));
156
158 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinMatchingScore", m_minMatchingScore));
159
160 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
161 XmlHelper::ReadValue(xmlHandle, "MinMatchedSamplingPoints", m_minMatchedSamplingPoints));
162
164 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinXOverlapFraction", m_minXOverlapFraction));
165
166 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
167 XmlHelper::ReadValue(xmlHandle, "MinMatchedSamplingPointRatio", m_minMatchedSamplingPointRatio));
168
169 return STATUS_CODE_SUCCESS;
170}
171
172} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
Header file for the long tracks tool class.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
virtual bool CreateThreeDParticles(const ProtoParticleVector &protoParticleVector)
Create particles using findings from recent algorithm processing.
TwoViewTransverseTracksAlgorithm::MatchingType::MatrixType MatrixType
std::vector< MatrixType::ElementList::const_iterator > IteratorList
float m_minXOverlapFraction
The min x overlap fraction (in each view) for particle creation.
static bool HasLongDirectConnections(IteratorList::const_iterator iIter, const IteratorList &iteratorList)
Whether a long element shares clusters with any other long elements.
float m_minMatchingScore
The min global matching score for particle creation.
void SelectLongElements(const MatrixType::ElementList &elementList, const pandora::ClusterSet &usedClusters, IteratorList &iteratorList) const
Select a list of long track-like elements from a set of connected matrix elements.
float m_minMatchedFraction
The min matched sampling point fraction for particle creation.
unsigned int m_minMatchedSamplingPointRatio
The min ratio between 1st and 2nd highest msps for simple ambiguity resolution.
static bool IsLongerThanDirectConnections(IteratorList::const_iterator iIter, const MatrixType::ElementList &elementList, const unsigned int minMatchedSamplingPointRatio, const pandora::ClusterSet &usedClusters)
Whether a long element is significantly longer that other elements with which it shares a cluster.
bool Run(TwoViewTransverseTracksAlgorithm *const pAlgorithm, MatrixType &overlapMatrix)
Run the algorithm tool.
void FindLongTracks(const MatrixType &overlapMatrix, ProtoParticleVector &protoParticleVector) const
Find long tracks, hidden by simple ambiguities in the matrix.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for particle creation.
float GetXOverlapFraction0() const
Get the fraction of the view 0 cluster that overlaps in x.
float GetXOverlapFraction1() const
Get the fraction of the view 1 cluster that overlaps in x.
Cluster class.
Definition Cluster.h:31
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
const std::string & GetType() const
Get the type.
Definition Process.h:102
const std::string & GetInstanceName() const
Get the instance name.
Definition Process.h:109
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
std::vector< ProtoParticle > ProtoParticleVector
pandora::ClusterList m_clusterList
List of 2D clusters in a 3D proto particle.
std::vector< const Cluster * > ClusterVector
std::unordered_set< const Cluster * > ClusterSet
StatusCode
The StatusCode enum.