LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
LongTracksTool.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
13 using namespace pandora;
14 
15 namespace lar_content
16 {
17 
18 LongTracksTool::LongTracksTool() :
19  m_minMatchedFraction(0.9f),
20  m_minMatchedSamplingPoints(20),
21  m_minXOverlapFraction(0.9f),
22  m_minMatchedSamplingPointRatio(2)
23 {
24 }
25 
26 //------------------------------------------------------------------------------------------------------------------------------------------
27 
29 {
30  for (IteratorList::const_iterator iIter2 = iteratorList.begin(), iIter2End = iteratorList.end(); iIter2 != iIter2End; ++iIter2)
31  {
32  if (iIter == iIter2)
33  continue;
34 
35  if (((*iIter)->GetClusterU() == (*iIter2)->GetClusterU()) || ((*iIter)->GetClusterV() == (*iIter2)->GetClusterV()) || ((*iIter)->GetClusterW() == (*iIter2)->GetClusterW()) )
36  return true;
37  }
38 
39  return false;
40 }
41 
42 //------------------------------------------------------------------------------------------------------------------------------------------
43 
45  const unsigned int minMatchedSamplingPointRatio, const pandora::ClusterSet &usedClusters)
46 {
47  const unsigned int nMatchedSamplingPoints((*iIter)->GetOverlapResult().GetNMatchedSamplingPoints());
48 
49  for (TensorType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
50  {
51  if ((*iIter) == eIter)
52  continue;
53 
54  if (usedClusters.count(eIter->GetClusterU()) || usedClusters.count(eIter->GetClusterV()) || usedClusters.count(eIter->GetClusterW()))
55  continue;
56 
57  if (((*iIter)->GetClusterU() != eIter->GetClusterU()) && ((*iIter)->GetClusterV() != eIter->GetClusterV()) && ((*iIter)->GetClusterW() != eIter->GetClusterW()))
58  continue;
59 
60  if (nMatchedSamplingPoints < minMatchedSamplingPointRatio * eIter->GetOverlapResult().GetNMatchedSamplingPoints())
61  return false;
62  }
63 
64  return true;
65 }
66 
67 //------------------------------------------------------------------------------------------------------------------------------------------
68 
69 bool LongTracksTool::Run(ThreeDTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
70 {
71  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
72  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
73 
74  ProtoParticleVector protoParticleVector;
75  this->FindLongTracks(overlapTensor, protoParticleVector);
76 
77  const bool particlesMade(pAlgorithm->CreateThreeDParticles(protoParticleVector));
78  return particlesMade;
79 }
80 
81 //------------------------------------------------------------------------------------------------------------------------------------------
82 
83 void LongTracksTool::FindLongTracks(const TensorType &overlapTensor, ProtoParticleVector &protoParticleVector) const
84 {
85  ClusterSet usedClusters;
86  ClusterVector sortedKeyClusters;
87  overlapTensor.GetSortedKeyClusters(sortedKeyClusters);
88 
89  for (const Cluster *const pKeyCluster : sortedKeyClusters)
90  {
91  if (!pKeyCluster->IsAvailable())
92  continue;
93 
94  unsigned int nU(0), nV(0), nW(0);
95  TensorType::ElementList elementList;
96  overlapTensor.GetConnectedElements(pKeyCluster, true, elementList, nU, nV, nW);
97 
98  IteratorList iteratorList;
99  this->SelectLongElements(elementList, usedClusters, iteratorList);
100 
101  // Check that elements are not directly connected and are significantly longer than any other directly connected elements
102  for (IteratorList::const_iterator iIter = iteratorList.begin(), iIterEnd = iteratorList.end(); iIter != iIterEnd; ++iIter)
103  {
104  if (LongTracksTool::HasLongDirectConnections(iIter, iteratorList))
105  continue;
106 
108  continue;
109 
110  ProtoParticle protoParticle;
111  protoParticle.m_clusterListU.push_back((*iIter)->GetClusterU());
112  protoParticle.m_clusterListV.push_back((*iIter)->GetClusterV());
113  protoParticle.m_clusterListW.push_back((*iIter)->GetClusterW());
114  protoParticleVector.push_back(protoParticle);
115 
116  usedClusters.insert((*iIter)->GetClusterU());
117  usedClusters.insert((*iIter)->GetClusterV());
118  usedClusters.insert((*iIter)->GetClusterW());
119  }
120  }
121 }
122 
123 //------------------------------------------------------------------------------------------------------------------------------------------
124 
125 void LongTracksTool::SelectLongElements(const TensorType::ElementList &elementList, const pandora::ClusterSet &usedClusters,
126  IteratorList &iteratorList) const
127 {
128  for (TensorType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
129  {
130  if (usedClusters.count(eIter->GetClusterU()) || usedClusters.count(eIter->GetClusterV()) || usedClusters.count(eIter->GetClusterW()))
131  continue;
132 
133  if (eIter->GetOverlapResult().GetMatchedFraction() < m_minMatchedFraction)
134  continue;
135 
136  if (eIter->GetOverlapResult().GetNMatchedSamplingPoints() < m_minMatchedSamplingPoints)
137  continue;
138 
139  const XOverlap &xOverlap(eIter->GetOverlapResult().GetXOverlap());
140 
141  if ((xOverlap.GetXSpanU() > std::numeric_limits<float>::epsilon()) && (xOverlap.GetXOverlapSpan() / xOverlap.GetXSpanU() > m_minXOverlapFraction) &&
142  (xOverlap.GetXSpanV() > std::numeric_limits<float>::epsilon()) && (xOverlap.GetXOverlapSpan() / xOverlap.GetXSpanV() > m_minXOverlapFraction) &&
143  (xOverlap.GetXSpanW() > std::numeric_limits<float>::epsilon()) && (xOverlap.GetXOverlapSpan() / xOverlap.GetXSpanW() > m_minXOverlapFraction))
144  {
145  iteratorList.push_back(eIter);
146  }
147  }
148 }
149 
150 //------------------------------------------------------------------------------------------------------------------------------------------
151 
152 StatusCode LongTracksTool::ReadSettings(const TiXmlHandle xmlHandle)
153 {
154  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
155  "MinMatchedFraction", m_minMatchedFraction));
156 
157  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
158  "MinMatchedSamplingPoints", m_minMatchedSamplingPoints));
159 
160  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
161  "MinXOverlapFraction", m_minXOverlapFraction));
162 
163  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
164  "MinMatchedSamplingPointRatio", m_minMatchedSamplingPointRatio));
165 
166  return STATUS_CODE_SUCCESS;
167 }
168 
169 } // namespace lar_content
std::vector< ProtoParticle > ProtoParticleVector
std::vector< TensorType::ElementList::const_iterator > IteratorList
virtual bool CreateThreeDParticles(const ProtoParticleVector &protoParticleVector)
Create particles using findings from recent algorithm processing.
static bool IsLongerThanDirectConnections(IteratorList::const_iterator iIter, const TensorType::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...
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for particle creation.
unsigned int m_minMatchedSamplingPointRatio
The min ratio between 1st and 2nd highest msps for simple ambiguity resolution.
void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
Get a list of elements connected to a specified cluster.
float m_minXOverlapFraction
The min x overlap fraction (in each view) for particle creation.
TFile f
Definition: plotHisto.C:6
pandora::ClusterList m_clusterListW
List of 2D W clusters in a 3D proto particle.
void FindLongTracks(const TensorType &overlapTensor, ProtoParticleVector &protoParticleVector) const
Find long tracks, hidden by simple ambiguities in the tensor.
intermediate_table::const_iterator const_iterator
void SelectLongElements(const TensorType::ElementList &elementList, const pandora::ClusterSet &usedClusters, IteratorList &iteratorList) const
Select a list of long track-like elements from a set of connected tensor elements.
pandora::ClusterList m_clusterListV
List of 2D V clusters in a 3D proto particle.
pandora::ClusterList m_clusterListU
List of 2D U clusters in a 3D proto particle.
Header file for the long tracks tool class.
void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const
Get a sorted vector of key clusters (U clusters with current implementation)
std::vector< art::Ptr< recob::Cluster > > ClusterVector
float m_minMatchedFraction
The min matched sampling point fraction for particle creation.
static bool HasLongDirectConnections(IteratorList::const_iterator iIter, const IteratorList &iteratorList)
Whether a long element shares clusters with any other long elements.
XOverlap class.
Definition: LArXOverlap.h:17
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
bool Run(ThreeDTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
Run the algorithm tool.