TwoViewLongTracksTool.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArThreeDReco/LArTwoViewMatching/TwoViewLongTracksTool.cc
3  *
4  * @brief Implementation of the long tracks tool class.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
13 using namespace pandora;
14 
15 namespace lar_content
16 {
17 
18 TwoViewLongTracksTool::TwoViewLongTracksTool() :
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 
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 
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 {
72  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
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 
84 void 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  {
105  if (TwoViewLongTracksTool::HasLongDirectConnections(iIter, iteratorList))
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 
143  if ((xOverlap.GetXOverlapFraction0() > m_minXOverlapFraction) && (xOverlap.GetXOverlapFraction1() > m_minXOverlapFraction))
144  {
145  iteratorList.push_back(eIter);
146  }
147  }
148 }
149 
150 //------------------------------------------------------------------------------------------------------------------------------------------
151 
152 StatusCode TwoViewLongTracksTool::ReadSettings(const TiXmlHandle xmlHandle)
153 {
154  PANDORA_RETURN_RESULT_IF_AND_IF(
155  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinMatchedFraction", m_minMatchedFraction));
156 
157  PANDORA_RETURN_RESULT_IF_AND_IF(
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 
163  PANDORA_RETURN_RESULT_IF_AND_IF(
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
std::vector< ProtoParticle > ProtoParticleVector
float m_minMatchedFraction
The min matched sampling point fraction for particle creation.
float m_minMatchingScore
The min global matching score for particle creation.
intermediate_table::const_iterator const_iterator
static bool HasLongDirectConnections(IteratorList::const_iterator iIter, const IteratorList &iteratorList)
Whether a long element shares clusters with any other long elements.
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...
void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const
Get a sorted vector of key clusters (view 1 clusters with current implementation) ...
bool Run(TwoViewTransverseTracksAlgorithm *const pAlgorithm, MatrixType &overlapMatrix)
Run the algorithm tool.
float m_minXOverlapFraction
The min x overlap fraction (in each view) for particle creation.
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for particle creation.
pandora::ClusterList m_clusterList
List of 2D clusters in a 3D proto particle.
unsigned int m_minMatchedSamplingPointRatio
The min ratio between 1st and 2nd highest msps for simple ambiguity resolution.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
Get a list of elements connected to a specified cluster.
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.
TwoViewXOverlap class.
virtual bool CreateThreeDParticles(const ProtoParticleVector &protoParticleVector)
Create particles using findings from recent algorithm processing.
void FindLongTracks(const MatrixType &overlapMatrix, ProtoParticleVector &protoParticleVector) const
Find long tracks, hidden by simple ambiguities in the matrix.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
std::vector< MatrixType::ElementList::const_iterator > IteratorList
QTextStream & endl(QTextStream &s)
Header file for the long tracks tool class.