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