LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
lar_content::ShowerGrowingAlgorithm Class Reference

ShowerGrowingAlgorithm class. More...

#include "ShowerGrowingAlgorithm.h"

Inheritance diagram for lar_content::ShowerGrowingAlgorithm:
lar_content::BranchGrowingAlgorithm

Public Member Functions

 ShowerGrowingAlgorithm ()
 Default constructor. More...
 

Protected Types

typedef std::unordered_map< const pandora::Cluster *, LArVertexHelper::ClusterDirectionClusterDirectionMap
 
enum  AssociationType { NONE = 0, SINGLE_ORDER = 1, STANDARD = 2, STRONG = 3 }
 AssociationType enum. More...
 
typedef std::unordered_map< const pandora::Cluster *, AssociationClusterAssociationMap
 
typedef std::unordered_map< const pandora::Cluster *, ClusterAssociationMapClusterUsageMap
 
typedef std::unordered_map< const pandora::Cluster *, pandora::ClusterVector > SeedAssociationList
 

Protected Member Functions

bool IsVertexAssociated (const LArPointingCluster &pointingCluster, const pandora::CartesianVector &vertexPosition2D) const
 Whether a pointing cluster is assciated with a provided 2D vertex projection. More...
 
void FindAssociatedClusters (const pandora::Cluster *const pParticleSeed, pandora::ClusterVector &candidateClusters, ClusterUsageMap &forwardUsageMap, ClusterUsageMap &backwardUsageMap) const
 Find clusters associated with a particle seed. More...
 
void IdentifyClusterMerges (const pandora::ClusterVector &particleSeedVector, const ClusterUsageMap &backwardUsageMap, SeedAssociationList &seedAssociationList) const
 Identify cluster merges. More...
 

Static Protected Member Functions

static bool SortClusters (const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
 Sorting for clusters to determine order in which seeds are considered. More...
 

Protected Attributes

ClusterDirectionMap m_clusterDirectionMap
 The cluster direction map. More...
 

Private Member Functions

pandora::StatusCode Run ()
 
void SimpleModeShowerGrowing (const pandora::ClusterList *const pClusterList, const std::string &clusterListName) const
 Simple single-pass shower growing mode. More...
 
bool GetNextSeedCandidate (const pandora::ClusterList *const pClusterList, const pandora::ClusterSet &usedClusters, const pandora::Cluster *&pSeedCluster) const
 Get the next seed candidate, using a list of available candidates and a list of those already used. More...
 
void GetAllVertexSeedCandidates (const pandora::ClusterList *const pClusterList, const pandora::Vertex *const pVertex, pandora::ClusterVector &seedClusters) const
 Get all seed candidates associated with a provided vertex. More...
 
void GetSeedAssociationList (const pandora::ClusterVector &particleSeedVector, const pandora::ClusterList *const pClusterList, SeedAssociationList &seedAssociationList) const
 Get the seed association list for a given vector of particle seed candidates. More...
 
void ProcessSeedAssociationDetails (const SeedAssociationList &seedAssociationList, const std::string &clusterListName, pandora::ClusterSet &usedClusters) const
 Process the details stored in a specified seed association list. More...
 
void ProcessBranchClusters (const pandora::Cluster *const pParentCluster, const pandora::ClusterVector &branchClusters, const std::string &listName) const
 Process the list of branch clusters, merging with specified parent cluster, dealing with any existing pfos as required. More...
 
AssociationType AreClustersAssociated (const pandora::Cluster *const pClusterSeed, const pandora::Cluster *const pCluster) const
 Determine whether two clusters are associated. More...
 
float GetFigureOfMerit (const SeedAssociationList &seedAssociationList) const
 Get a figure of merit representing the consistency of the provided seed associated list. More...
 
unsigned int GetNVertexConnections (const pandora::CartesianVector &vertexPosition2D, const LArPointingClusterList &pointingClusterList) const
 Get the number of clusters associated with the vertex. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Private Attributes

pandora::StringVector m_inputClusterListNames
 The names of the input cluster lists. More...
 
unsigned int m_minCaloHitsPerCluster
 The minimum number of calo hits per (seed or branch) cluster. More...
 
float m_nearbyClusterDistance
 The nearby cluster distance, used for determining cluster associations. More...
 
float m_remoteClusterDistance
 The remote cluster distance, used for determining cluster associations. More...
 
float m_directionTanAngle
 Direction determination, look for vertex inside triangle with apex shifted along the cluster length. More...
 
float m_directionApexShift
 Direction determination, look for vertex inside triangle with apex shifted along the cluster length. More...
 
float m_minVertexLongitudinalDistance
 Vertex association check: min longitudinal distance cut. More...
 
float m_maxVertexLongitudinalDistance
 Vertex association check: max longitudinal distance cut. More...
 
float m_maxVertexTransverseDistance
 Vertex association check: max transverse distance cut. More...
 
float m_vertexAngularAllowance
 Vertex association check: pointing angular allowance in degrees. More...
 

Detailed Description

ShowerGrowingAlgorithm class.

Definition at line 27 of file ShowerGrowingAlgorithm.h.

Member Typedef Documentation

typedef std::unordered_map<const pandora::Cluster*, Association> lar_content::BranchGrowingAlgorithm::ClusterAssociationMap
protectedinherited

Definition at line 87 of file BranchGrowingAlgorithm.h.

typedef std::unordered_map<const pandora::Cluster*, LArVertexHelper::ClusterDirection> lar_content::ShowerGrowingAlgorithm::ClusterDirectionMap
protected

Definition at line 54 of file ShowerGrowingAlgorithm.h.

typedef std::unordered_map<const pandora::Cluster*, ClusterAssociationMap> lar_content::BranchGrowingAlgorithm::ClusterUsageMap
protectedinherited

Definition at line 88 of file BranchGrowingAlgorithm.h.

typedef std::unordered_map<const pandora::Cluster*, pandora::ClusterVector> lar_content::BranchGrowingAlgorithm::SeedAssociationList
protectedinherited

Definition at line 111 of file BranchGrowingAlgorithm.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

lar_content::ShowerGrowingAlgorithm::ShowerGrowingAlgorithm ( )

Default constructor.

Definition at line 25 of file ShowerGrowingAlgorithm.cc.

25  :
29  m_directionTanAngle(1.732f),
30  m_directionApexShift(0.333f),
35 {
36 }
float m_directionApexShift
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
TFile f
Definition: plotHisto.C:6
float m_directionTanAngle
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
float m_nearbyClusterDistance
The nearby cluster distance, used for determining cluster associations.
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
unsigned int m_minCaloHitsPerCluster
The minimum number of calo hits per (seed or branch) cluster.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
float m_remoteClusterDistance
The remote cluster distance, used for determining cluster associations.

Member Function Documentation

ShowerGrowingAlgorithm::AssociationType lar_content::ShowerGrowingAlgorithm::AreClustersAssociated ( const pandora::Cluster *const  pClusterSeed,
const pandora::Cluster *const  pCluster 
) const
privatevirtual

Determine whether two clusters are associated.

Parameters
pClusterSeedaddress of cluster seed (may be daughter of primary seed)
pClusteraddress of cluster
Returns
the association type

Implements lar_content::BranchGrowingAlgorithm.

Definition at line 272 of file ShowerGrowingAlgorithm.cc.

References lar_content::LArVertexHelper::DIRECTION_BACKWARD_IN_Z, lar_content::LArVertexHelper::DIRECTION_FORWARD_IN_Z, lar_content::LArVertexHelper::DIRECTION_UNKNOWN, lar_content::LArClusterHelper::GetClosestDistance(), lar_content::LArVertexHelper::GetClusterDirectionInZ(), m_clusterDirectionMap, m_directionApexShift, m_directionTanAngle, m_nearbyClusterDistance, m_remoteClusterDistance, lar_content::BranchGrowingAlgorithm::NONE, lar_content::BranchGrowingAlgorithm::SINGLE_ORDER, lar_content::BranchGrowingAlgorithm::STANDARD, and lar_content::BranchGrowingAlgorithm::STRONG.

273 {
274  const VertexList *pVertexList(nullptr);
275  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
276  const Vertex *const pVertex(((pVertexList->size() == 1) && (VERTEX_3D == (*(pVertexList->begin()))->GetVertexType())) ? *(pVertexList->begin()) : nullptr);
277 
278  // Direction of seed cluster (cache for efficiency)
279  ClusterDirectionMap::const_iterator seedIter = m_clusterDirectionMap.find(pClusterSeed);
280 
281  if (m_clusterDirectionMap.end() == seedIter)
282  {
283  const LArVertexHelper::ClusterDirection direction((nullptr == pVertex) ? LArVertexHelper::DIRECTION_UNKNOWN :
284  LArVertexHelper::GetClusterDirectionInZ(this->GetPandora(), pVertex, pClusterSeed, m_directionTanAngle, m_directionApexShift));
285  seedIter = m_clusterDirectionMap.insert(ClusterDirectionMap::value_type(pClusterSeed, direction)).first;
286  }
287 
288  const LArVertexHelper::ClusterDirection seedDirection(seedIter->second);
289  const bool checkSeedForward(seedDirection != LArVertexHelper::DIRECTION_BACKWARD_IN_Z);
290  const bool checkSeedBackward(seedDirection != LArVertexHelper::DIRECTION_FORWARD_IN_Z);
291 
292  // Direction of candidate cluster (cache for efficiency)
294 
295  if (m_clusterDirectionMap.end() == candIter)
296  {
297  const LArVertexHelper::ClusterDirection direction((nullptr == pVertex) ? LArVertexHelper::DIRECTION_UNKNOWN :
298  LArVertexHelper::GetClusterDirectionInZ(this->GetPandora(), pVertex, pCluster, m_directionTanAngle, m_directionApexShift));
299  candIter = m_clusterDirectionMap.insert(ClusterDirectionMap::value_type(pCluster, direction)).first;
300  }
301 
302  const LArVertexHelper::ClusterDirection candidateDirection(candIter->second);
303  const bool checkCandidateForward(candidateDirection != LArVertexHelper::DIRECTION_BACKWARD_IN_Z);
304  const bool checkCandidateBackward(candidateDirection != LArVertexHelper::DIRECTION_FORWARD_IN_Z);
305 
306  // Calculate distances of association
307  const float sOuter(LArClusterHelper::GetClosestDistance(pClusterSeed->GetCentroid(pClusterSeed->GetOuterPseudoLayer()), pCluster));
308  const float cOuter(LArClusterHelper::GetClosestDistance(pCluster->GetCentroid(pCluster->GetOuterPseudoLayer()), pClusterSeed));
309  const float sInner(LArClusterHelper::GetClosestDistance(pClusterSeed->GetCentroid(pClusterSeed->GetInnerPseudoLayer()), pCluster));
310  const float cInner(LArClusterHelper::GetClosestDistance(pCluster->GetCentroid(pCluster->GetInnerPseudoLayer()), pClusterSeed));
311 
312  // Association check 1(a), look for enclosed clusters
313  if ((cOuter < m_nearbyClusterDistance && cInner < m_nearbyClusterDistance) &&
314  (!checkSeedForward || (sInner > m_nearbyClusterDistance)) &&
315  (!checkSeedBackward || (sOuter > m_nearbyClusterDistance)))
316  {
317  return STRONG;
318  }
319 
320  // Association check 1(b), look for overlapping clusters
321  if ((checkSeedForward == checkCandidateForward) && (checkSeedBackward == checkCandidateBackward))
322  {
323  if ((cInner < m_nearbyClusterDistance && sOuter < m_nearbyClusterDistance) &&
324  (!checkSeedForward || (sInner > m_nearbyClusterDistance)) &&
325  (!checkSeedBackward || (cOuter > m_nearbyClusterDistance)))
326  {
327  return STRONG;
328  }
329 
330  if ((cOuter < m_nearbyClusterDistance && sInner < m_nearbyClusterDistance) &&
331  (!checkSeedBackward || (sOuter > m_nearbyClusterDistance)) &&
332  (!checkSeedForward || (cInner > m_nearbyClusterDistance)))
333  {
334  return STRONG;
335  }
336  }
337 
338  // Association check 2, look for branching clusters
339  if ((!checkSeedForward || (sInner > m_remoteClusterDistance)) &&
340  (!checkSeedBackward || (sOuter > m_remoteClusterDistance)) &&
341  ((checkCandidateForward && (cInner < m_nearbyClusterDistance)) || (checkCandidateBackward && (cOuter < m_nearbyClusterDistance))))
342  {
343  return STANDARD;
344  }
345 
346  // Association check 3, look any distance below threshold
347  if ((sOuter < m_nearbyClusterDistance) || (cOuter < m_nearbyClusterDistance) || (sInner < m_nearbyClusterDistance) || (cInner < m_nearbyClusterDistance))
348  return SINGLE_ORDER;
349 
350  return NONE;
351 }
float m_directionApexShift
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
float m_directionTanAngle
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
intermediate_table::const_iterator const_iterator
float m_nearbyClusterDistance
The nearby cluster distance, used for determining cluster associations.
std::list< Vertex > VertexList
Definition: DCEL.h:178
ClusterDirectionMap m_clusterDirectionMap
The cluster direction map.
static ClusterDirection GetClusterDirectionInZ(const pandora::Pandora &pandora, const pandora::Vertex *const pVertex, const pandora::Cluster *const pCluster, const float tanAngle, const float apexShift)
Get the direction of the cluster in z, using a projection of the provided vertex. ...
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
float m_remoteClusterDistance
The remote cluster distance, used for determining cluster associations.
void lar_content::BranchGrowingAlgorithm::FindAssociatedClusters ( const pandora::Cluster *const  pParticleSeed,
pandora::ClusterVector &  candidateClusters,
ClusterUsageMap forwardUsageMap,
ClusterUsageMap backwardUsageMap 
) const
protectedinherited

Find clusters associated with a particle seed.

Parameters
pParticleSeedaddress of the particle seed
candidateClusterslist of clusters which may be associated with seed
forwardUsageMapthe particle seed usage map
backwardUsageMapthe cluster usage map

Definition at line 20 of file BranchGrowingAlgorithm.cc.

References lar_content::BranchGrowingAlgorithm::Association::GetType(), min, and lar_content::BranchGrowingAlgorithm::Association::SetType().

Referenced by GetSeedAssociationList().

22 {
23  ClusterVector currentSeedAssociations, newSeedAssociations;
24  currentSeedAssociations.push_back(pParticleSeed);
25 
26  unsigned int associationOrder(1);
27 
28  while (!currentSeedAssociations.empty())
29  {
30  for (ClusterVector::iterator iterI = candidateClusters.begin(), iterIEnd = candidateClusters.end(); iterI != iterIEnd; ++iterI)
31  {
32  const Cluster *const pCandidateCluster = *iterI;
33 
34  if (NULL == pCandidateCluster)
35  continue;
36 
37  for (ClusterVector::iterator iterJ = currentSeedAssociations.begin(), iterJEnd = currentSeedAssociations.end(); iterJ != iterJEnd; ++iterJ)
38  {
39  const Cluster *const pAssociatedCluster = *iterJ;
40 
41  const AssociationType associationType(this->AreClustersAssociated(pAssociatedCluster, pCandidateCluster));
42 
43  if (NONE == associationType)
44  continue;
45 
46  // Check we store best association between this seed and candidate
47  Association association(associationOrder, associationType);
48  const Association &existingAssociation = forwardUsageMap[pParticleSeed][pCandidateCluster];
49 
50  if (association.GetType() > existingAssociation.GetType())
51  {
52  // If not first association, check strength of previous association in chain
53  if (pParticleSeed != pAssociatedCluster)
54  association.SetType(std::min(association.GetType(), backwardUsageMap[pAssociatedCluster][pParticleSeed].GetType()));
55 
56  forwardUsageMap[pParticleSeed][pCandidateCluster] = association;
57  backwardUsageMap[pCandidateCluster][pParticleSeed] = association;
58  }
59 
60  newSeedAssociations.push_back(pCandidateCluster);
61  *iterI = NULL;
62  }
63  }
64 
65  currentSeedAssociations = newSeedAssociations;
66  newSeedAssociations.clear();
67  ++associationOrder;
68  }
69 }
intermediate_table::iterator iterator
std::vector< art::Ptr< recob::Cluster > > ClusterVector
Int_t min
Definition: plot.C:26
virtual AssociationType AreClustersAssociated(const pandora::Cluster *const pClusterSeed, const pandora::Cluster *const pCluster) const =0
Determine whether two clusters are associated.
void lar_content::ShowerGrowingAlgorithm::GetAllVertexSeedCandidates ( const pandora::ClusterList *const  pClusterList,
const pandora::Vertex *const  pVertex,
pandora::ClusterVector &  seedClusters 
) const
private

Get all seed candidates associated with a provided vertex.

Parameters
pClusterListthe list of available seed candidates
pVertexthe address of the vertex
seedClustersto receive the list of vertex seed candidates

Definition at line 161 of file ShowerGrowingAlgorithm.cc.

References lar_content::LArClusterHelper::GetClusterHitType(), IsVertexAssociated(), m_minCaloHitsPerCluster, lar_content::LArGeometryHelper::ProjectPosition(), and SortClusters().

Referenced by SimpleModeShowerGrowing().

163 {
164  ClusterVector clusterVector;
165  clusterVector.insert(clusterVector.end(), pClusterList->begin(), pClusterList->end());
166 
167  if (clusterVector.empty())
168  return;
169 
170  const HitType hitType(LArClusterHelper::GetClusterHitType(clusterVector.at(0)));
171  const CartesianVector vertexPosition2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
172 
173  for (const Cluster *const pCluster : clusterVector)
174  {
175  if (!pCluster->IsAvailable())
176  continue;
177 
178  if (MU_MINUS == std::abs(pCluster->GetParticleId()))
179  continue;
180 
181  if (pCluster->GetNCaloHits() < m_minCaloHitsPerCluster)
182  continue;
183 
184  try
185  {
186  if (this->IsVertexAssociated(LArPointingCluster(pCluster), vertexPosition2D))
187  seedClusters.push_back(pCluster);
188  }
189  catch (StatusCodeException &)
190  {
191  }
192  }
193 
194  std::sort(seedClusters.begin(), seedClusters.end(), ShowerGrowingAlgorithm::SortClusters);
195 }
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static bool SortClusters(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sorting for clusters to determine order in which seeds are considered.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
unsigned int m_minCaloHitsPerCluster
The minimum number of calo hits per (seed or branch) cluster.
bool IsVertexAssociated(const LArPointingCluster &pointingCluster, const pandora::CartesianVector &vertexPosition2D) const
Whether a pointing cluster is assciated with a provided 2D vertex projection.
float lar_content::ShowerGrowingAlgorithm::GetFigureOfMerit ( const SeedAssociationList seedAssociationList) const
private

Get a figure of merit representing the consistency of the provided seed associated list.

Parameters
seedAssociationListthe seed association list
Returns
the figure of merit

Definition at line 355 of file ShowerGrowingAlgorithm.cc.

References lar_content::LArClusterHelper::GetClusterHitType(), GetNVertexConnections(), lar_content::LArGeometryHelper::ProjectPosition(), and lar_content::LArClusterHelper::SortByNHits().

356 {
357  const VertexList *pVertexList(nullptr);
358  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
359  const Vertex *const pVertex(((pVertexList->size() == 1) && (VERTEX_3D == (*(pVertexList->begin()))->GetVertexType())) ? *(pVertexList->begin()) : nullptr);
360 
361  // ATTN Consistently returning same value will accept all candidate cluster merges
362  if (!pVertex)
363  return -1.f;
364 
365  unsigned int nVertexAssociatedSeeds(0), nVertexAssociatedNonSeeds(0);
366 
367  ClusterList clusterList;
368  for (const auto &mapEntry : seedAssociationList) clusterList.push_back(mapEntry.first);
369  clusterList.sort(LArClusterHelper::SortByNHits);
370 
371  for (const Cluster *const pSeedCluster : clusterList)
372  {
373  const ClusterVector &associatedClusters(seedAssociationList.at(pSeedCluster));
374  const HitType hitType(LArClusterHelper::GetClusterHitType(pSeedCluster));
375  const CartesianVector vertex2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
376 
377  LArPointingClusterList pointingClusterSeedList;
378  try {pointingClusterSeedList.push_back(LArPointingCluster(pSeedCluster));} catch (StatusCodeException &) {}
379 
380  LArPointingClusterList pointingClusterNonSeedList;
381  for (const Cluster *const pAssociatedCluster : associatedClusters)
382  {
383  try {pointingClusterNonSeedList.push_back(LArPointingCluster(pAssociatedCluster));} catch (StatusCodeException &) {}
384  }
385 
386  nVertexAssociatedSeeds += this->GetNVertexConnections(vertex2D, pointingClusterSeedList);
387  nVertexAssociatedNonSeeds += this->GetNVertexConnections(vertex2D, pointingClusterNonSeedList);
388  }
389 
390  const float figureOfMerit(static_cast<float>(nVertexAssociatedSeeds) - static_cast<float>(nVertexAssociatedNonSeeds));
391  return figureOfMerit;
392 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
std::vector< LArPointingCluster > LArPointingClusterList
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
unsigned int GetNVertexConnections(const pandora::CartesianVector &vertexPosition2D, const LArPointingClusterList &pointingClusterList) const
Get the number of clusters associated with the vertex.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
std::list< Vertex > VertexList
Definition: DCEL.h:178
bool lar_content::ShowerGrowingAlgorithm::GetNextSeedCandidate ( const pandora::ClusterList *const  pClusterList,
const pandora::ClusterSet &  usedClusters,
const pandora::Cluster *&  pSeedCluster 
) const
private

Get the next seed candidate, using a list of available candidates and a list of those already used.

Parameters
pClusterListthe list of available seed candidates
usedClustersthe list of candidates already considered
pSeedClusterto receive the address of the next seed candidate
Returns
whether a seed candidate has been found

Definition at line 129 of file ShowerGrowingAlgorithm.cc.

References m_minCaloHitsPerCluster, and SortClusters().

Referenced by SimpleModeShowerGrowing().

131 {
132  pSeedCluster = nullptr;
133 
134  ClusterVector clusterVector;
135  clusterVector.insert(clusterVector.end(), pClusterList->begin(), pClusterList->end());
136  std::sort(clusterVector.begin(), clusterVector.end(), ShowerGrowingAlgorithm::SortClusters);
137 
138  for (const Cluster *const pCluster : clusterVector)
139  {
140  if (!pCluster->IsAvailable())
141  continue;
142 
143  if (MU_MINUS == std::abs(pCluster->GetParticleId()))
144  continue;
145 
146  if (pCluster->GetNCaloHits() < m_minCaloHitsPerCluster)
147  continue;
148 
149  if (usedClusters.count(pCluster))
150  continue;
151 
152  pSeedCluster = pCluster;
153  return true;
154  }
155 
156  return false;
157 }
static bool SortClusters(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sorting for clusters to determine order in which seeds are considered.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
unsigned int m_minCaloHitsPerCluster
The minimum number of calo hits per (seed or branch) cluster.
unsigned int lar_content::ShowerGrowingAlgorithm::GetNVertexConnections ( const pandora::CartesianVector &  vertexPosition2D,
const LArPointingClusterList pointingClusterList 
) const
private

Get the number of clusters associated with the vertex.

Parameters
vertexPosition2Dthe projected vertex position
pointingClusterListthe list of relevant pointing clusters
Returns
the number of clusters associated with the vertex

Definition at line 396 of file ShowerGrowingAlgorithm.cc.

References IsVertexAssociated().

Referenced by GetFigureOfMerit().

397 {
398  unsigned int nConnections(0);
399 
400  for (LArPointingClusterList::const_iterator cIter = pointingClusterList.begin(), cIterEnd = pointingClusterList.end(); cIter != cIterEnd; ++cIter)
401  {
402  if (this->IsVertexAssociated(*cIter, vertexPosition2D))
403  ++nConnections;
404  }
405 
406  return nConnections;
407 }
intermediate_table::const_iterator const_iterator
bool IsVertexAssociated(const LArPointingCluster &pointingCluster, const pandora::CartesianVector &vertexPosition2D) const
Whether a pointing cluster is assciated with a provided 2D vertex projection.
void lar_content::ShowerGrowingAlgorithm::GetSeedAssociationList ( const pandora::ClusterVector &  particleSeedVector,
const pandora::ClusterList *const  pClusterList,
SeedAssociationList seedAssociationList 
) const
private

Get the seed association list for a given vector of particle seed candidates.

Parameters
particleSeedVectorthe particle seed vector
pClusterListthe address of the input cluster list
seedAssociationListto receive the populated seed association list

Definition at line 199 of file ShowerGrowingAlgorithm.cc.

References lar_content::BranchGrowingAlgorithm::FindAssociatedClusters(), lar_content::BranchGrowingAlgorithm::IdentifyClusterMerges(), m_minCaloHitsPerCluster, and SortClusters().

Referenced by SimpleModeShowerGrowing().

201 {
202  if (particleSeedVector.empty())
203  return;
204 
205  ClusterVector candidateClusters;
206  const ClusterList clusterList(*pClusterList);
207 
208  for (const Cluster *const pCandidateCluster : clusterList)
209  {
210  if (!pCandidateCluster->IsAvailable())
211  continue;
212 
213  if (MU_MINUS == std::abs(pCandidateCluster->GetParticleId()))
214  continue;
215 
216  if (pCandidateCluster->GetNCaloHits() < m_minCaloHitsPerCluster)
217  continue;
218 
219  if (particleSeedVector.end() == std::find(particleSeedVector.begin(), particleSeedVector.end(), pCandidateCluster))
220  candidateClusters.push_back(pCandidateCluster);
221  }
222 
223  std::sort(candidateClusters.begin(), candidateClusters.end(), ShowerGrowingAlgorithm::SortClusters);
224  ClusterUsageMap forwardUsageMap, backwardUsageMap;
225 
226  for (const Cluster *const pSeedCluster : particleSeedVector)
227  {
228  this->FindAssociatedClusters(pSeedCluster, candidateClusters, forwardUsageMap, backwardUsageMap);
229  }
230 
231  this->IdentifyClusterMerges(particleSeedVector, backwardUsageMap, seedAssociationList);
232 }
std::unordered_map< const pandora::Cluster *, ClusterAssociationMap > ClusterUsageMap
void FindAssociatedClusters(const pandora::Cluster *const pParticleSeed, pandora::ClusterVector &candidateClusters, ClusterUsageMap &forwardUsageMap, ClusterUsageMap &backwardUsageMap) const
Find clusters associated with a particle seed.
static bool SortClusters(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sorting for clusters to determine order in which seeds are considered.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void IdentifyClusterMerges(const pandora::ClusterVector &particleSeedVector, const ClusterUsageMap &backwardUsageMap, SeedAssociationList &seedAssociationList) const
Identify cluster merges.
unsigned int m_minCaloHitsPerCluster
The minimum number of calo hits per (seed or branch) cluster.
void lar_content::BranchGrowingAlgorithm::IdentifyClusterMerges ( const pandora::ClusterVector &  particleSeedVector,
const ClusterUsageMap backwardUsageMap,
SeedAssociationList seedAssociationList 
) const
protectedinherited

Identify cluster merges.

Parameters
particleSeedVectorthe list of all particle seeds
backwardUsageMapthe map from cluster to particle seed associations
seedAssociationListto receive the populated seed association list

Definition at line 73 of file BranchGrowingAlgorithm.cc.

References lar_content::BranchGrowingAlgorithm::Association::GetType(), and max.

Referenced by GetSeedAssociationList().

75 {
76  ClusterVector sortedCandidates;
77  for (const auto &mapEntry : backwardUsageMap) sortedCandidates.push_back(mapEntry.first);
78  std::sort(sortedCandidates.begin(), sortedCandidates.end(), LArClusterHelper::SortByNHits);
79 
80  for (const Cluster *const pCluster : sortedCandidates)
81  {
82  const ClusterAssociationMap &particleSeedUsageMap(backwardUsageMap.at(pCluster));
83 
84  if (particleSeedUsageMap.empty())
85  throw StatusCodeException(STATUS_CODE_FAILURE);
86 
87  ClusterVector sortedSeeds;
88  for (const auto &mapEntry : particleSeedUsageMap) sortedSeeds.push_back(mapEntry.first);
89  std::sort(sortedSeeds.begin(), sortedSeeds.end(), LArClusterHelper::SortByNHits);
90 
91  const Cluster *pBestParticleSeed = NULL;
92  AssociationType bestType(NONE);
93  unsigned int bestOrder(std::numeric_limits<unsigned int>::max());
94 
95  for (const Cluster *const pParticleSeed : sortedSeeds)
96  {
97  const Association &association(particleSeedUsageMap.at(pParticleSeed));
98 
99  if ((association.GetType() > bestType) || ((association.GetType() == bestType) && (association.GetOrder() < bestOrder)))
100  {
101  // Break-out condition for single order associations
102  if ((SINGLE_ORDER == association.GetType()) && (association.GetOrder() > 1))
103  continue;
104 
105  // Type is primary consideration; order breaks ties
106  pBestParticleSeed = pParticleSeed;
107  bestType = association.GetType();
108  bestOrder = association.GetOrder();
109  }
110  else if ((association.GetType() == bestType) && (association.GetOrder() == bestOrder))
111  {
112  // Remove ambiguous cluster from algorithm
113  pBestParticleSeed = NULL;
114  }
115  }
116 
117  if (NULL == pBestParticleSeed)
118  continue;
119 
120  seedAssociationList[pBestParticleSeed].push_back(pCluster);
121  }
122 
123  // Now deal with seeds that have no associations
124  for (ClusterVector::const_iterator iter = particleSeedVector.begin(), iterEnd = particleSeedVector.end(); iter != iterEnd; ++iter)
125  {
126  const Cluster *const pParticleSeed = *iter;
127 
128  if (seedAssociationList.end() == seedAssociationList.find(pParticleSeed))
129  seedAssociationList[pParticleSeed] = ClusterVector();
130  }
131 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
Int_t max
Definition: plot.C:27
intermediate_table::const_iterator const_iterator
std::vector< art::Ptr< recob::Cluster > > ClusterVector
std::unordered_map< const pandora::Cluster *, Association > ClusterAssociationMap
bool lar_content::ShowerGrowingAlgorithm::IsVertexAssociated ( const LArPointingCluster pointingCluster,
const pandora::CartesianVector &  vertexPosition2D 
) const
protected

Whether a pointing cluster is assciated with a provided 2D vertex projection.

Parameters
pointingClusterthe pointing cluster
vertexPosition2Dthe projected vertex position
Returns
boolean

Definition at line 40 of file ShowerGrowingAlgorithm.cc.

References lar_content::LArPointingCluster::GetInnerVertex(), lar_content::LArPointingCluster::GetOuterVertex(), lar_content::LArPointingClusterHelper::IsEmission(), lar_content::LArPointingClusterHelper::IsNode(), m_maxVertexLongitudinalDistance, m_maxVertexTransverseDistance, m_minVertexLongitudinalDistance, and m_vertexAngularAllowance.

Referenced by GetAllVertexSeedCandidates(), and GetNVertexConnections().

41 {
42  return (LArPointingClusterHelper::IsNode(vertexPosition2D, pointingCluster.GetInnerVertex(), m_minVertexLongitudinalDistance, m_maxVertexTransverseDistance) ||
43  LArPointingClusterHelper::IsNode(vertexPosition2D, pointingCluster.GetOuterVertex(), m_minVertexLongitudinalDistance, m_maxVertexTransverseDistance) ||
46 }
static bool IsEmission(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Whether pointing vertex is emitted from a given position.
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
static bool IsNode(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxTransverseDistance)
Whether pointing vertex is adjacent to a given position.
void lar_content::ShowerGrowingAlgorithm::ProcessBranchClusters ( const pandora::Cluster *const  pParentCluster,
const pandora::ClusterVector &  branchClusters,
const std::string &  listName 
) const
private

Process the list of branch clusters, merging with specified parent cluster, dealing with any existing pfos as required.

Parameters
pParentClusterthe address of the parent cluster
branchClustersthe list of branch clusters for the specified seed cluster
listNamethe cluster list name
pfoListthe input pfo list

Definition at line 255 of file ShowerGrowingAlgorithm.cc.

References m_clusterDirectionMap.

Referenced by ProcessSeedAssociationDetails().

256 {
257  m_clusterDirectionMap.erase(pParentCluster);
258 
259  for (const Cluster *const pBranchCluster : branchClusters)
260  {
261  if (pBranchCluster->IsAvailable())
262  {
263  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::MergeAndDeleteClusters(*this, pParentCluster, pBranchCluster, listName, listName));
264  }
265 
266  m_clusterDirectionMap.erase(pBranchCluster);
267  }
268 }
ClusterDirectionMap m_clusterDirectionMap
The cluster direction map.
void lar_content::ShowerGrowingAlgorithm::ProcessSeedAssociationDetails ( const SeedAssociationList seedAssociationList,
const std::string &  clusterListName,
pandora::ClusterSet &  usedClusters 
) const
private

Process the details stored in a specified seed association list.

Parameters
seedAssociationListthe seed association list
clusterListNamethe cluster list name
pfoListthe pfo list
usedClustersthe list of candidates already considered

Definition at line 236 of file ShowerGrowingAlgorithm.cc.

References ProcessBranchClusters(), and lar_content::LArClusterHelper::SortByNHits().

Referenced by SimpleModeShowerGrowing().

238 {
239  ClusterList clusterList;
240  for (const auto &mapEntry : seedAssociationList) clusterList.push_back(mapEntry.first);
241  clusterList.sort(LArClusterHelper::SortByNHits);
242 
243  for (const Cluster *const pParentCluster : clusterList)
244  {
245  const ClusterVector &branchClusters(seedAssociationList.at(pParentCluster));
246  this->ProcessBranchClusters(pParentCluster, branchClusters, clusterListName);
247 
248  usedClusters.insert(pParentCluster);
249  usedClusters.insert(branchClusters.begin(), branchClusters.end());
250  }
251 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
void ProcessBranchClusters(const pandora::Cluster *const pParentCluster, const pandora::ClusterVector &branchClusters, const std::string &listName) const
Process the list of branch clusters, merging with specified parent cluster, dealing with any existing...
std::vector< art::Ptr< recob::Cluster > > ClusterVector
StatusCode lar_content::ShowerGrowingAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
privatevirtual

Reimplemented from lar_content::BranchGrowingAlgorithm.

Definition at line 411 of file ShowerGrowingAlgorithm.cc.

References m_directionApexShift, m_directionTanAngle, m_inputClusterListNames, m_maxVertexLongitudinalDistance, m_maxVertexTransverseDistance, m_minCaloHitsPerCluster, m_minVertexLongitudinalDistance, m_nearbyClusterDistance, m_remoteClusterDistance, m_vertexAngularAllowance, and lar_content::BranchGrowingAlgorithm::ReadSettings().

412 {
413  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputClusterListNames", m_inputClusterListNames));
414 
415  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
416  "MinCaloHitsPerCluster", m_minCaloHitsPerCluster));
417 
418  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
419  "NearbyClusterDistance", m_nearbyClusterDistance));
420 
421  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
422  "RemoteClusterDistance", m_remoteClusterDistance));
423 
424  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
425  "DirectionTanAngle", m_directionTanAngle));
426 
427  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
428  "DirectionApexShift", m_directionApexShift));
429 
430  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
431  "MinVertexLongitudinalDistance", m_minVertexLongitudinalDistance));
432 
433  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
434  "MaxVertexLongitudinalDistance", m_maxVertexLongitudinalDistance));
435 
436  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
437  "MaxVertexTransverseDistance", m_maxVertexTransverseDistance));
438 
439  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
440  "VertexAngularAllowance", m_vertexAngularAllowance));
441 
442  return BranchGrowingAlgorithm::ReadSettings(xmlHandle);
443 }
pandora::StringVector m_inputClusterListNames
The names of the input cluster lists.
float m_directionApexShift
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
float m_directionTanAngle
Direction determination, look for vertex inside triangle with apex shifted along the cluster length...
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
float m_nearbyClusterDistance
The nearby cluster distance, used for determining cluster associations.
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
unsigned int m_minCaloHitsPerCluster
The minimum number of calo hits per (seed or branch) cluster.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
float m_remoteClusterDistance
The remote cluster distance, used for determining cluster associations.
StatusCode lar_content::ShowerGrowingAlgorithm::Run ( )
private

Definition at line 65 of file ShowerGrowingAlgorithm.cc.

References m_clusterDirectionMap, m_inputClusterListNames, and SimpleModeShowerGrowing().

66 {
67  for (const std::string &clusterListName : m_inputClusterListNames)
68  {
69  try
70  {
71  const ClusterList *pClusterList = nullptr;
72  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, clusterListName, pClusterList));
73 
74  if (!pClusterList || pClusterList->empty())
75  {
76  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
77  std::cout << "ShowerGrowingAlgorithm: unable to find cluster list " << clusterListName << std::endl;
78 
79  continue;
80  }
81 
82  this->SimpleModeShowerGrowing(pClusterList, clusterListName);
83  m_clusterDirectionMap.clear();
84  }
85  catch (StatusCodeException &statusCodeException)
86  {
87  m_clusterDirectionMap.clear();
88  throw statusCodeException;
89  }
90  }
91 
92  return STATUS_CODE_SUCCESS;
93 }
pandora::StringVector m_inputClusterListNames
The names of the input cluster lists.
void SimpleModeShowerGrowing(const pandora::ClusterList *const pClusterList, const std::string &clusterListName) const
Simple single-pass shower growing mode.
ClusterDirectionMap m_clusterDirectionMap
The cluster direction map.
void lar_content::ShowerGrowingAlgorithm::SimpleModeShowerGrowing ( const pandora::ClusterList *const  pClusterList,
const std::string &  clusterListName 
) const
private

Simple single-pass shower growing mode.

Parameters
pClusterListthe list of clusters
clusterListNamethe cluster list name

Definition at line 97 of file ShowerGrowingAlgorithm.cc.

References GetAllVertexSeedCandidates(), GetNextSeedCandidate(), GetSeedAssociationList(), and ProcessSeedAssociationDetails().

Referenced by Run().

98 {
99  const VertexList *pVertexList(nullptr);
100  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
101  const Vertex *const pVertex(((pVertexList->size() == 1) && (VERTEX_3D == (*(pVertexList->begin()))->GetVertexType())) ? *(pVertexList->begin()) : nullptr);
102 
103  ClusterSet usedClusters;
104 
105  // Pick up all showers starting at vertex
106  if (pVertex)
107  {
108  ClusterVector seedClusters;
109  this->GetAllVertexSeedCandidates(pClusterList, pVertex, seedClusters);
110 
111  SeedAssociationList vertexSeedAssociationList;
112  this->GetSeedAssociationList(seedClusters, pClusterList, vertexSeedAssociationList);
113  this->ProcessSeedAssociationDetails(vertexSeedAssociationList, clusterListName, usedClusters);
114  }
115 
116  // Non-vertex showers
117  const Cluster *pSeedCluster(nullptr);
118 
119  while (this->GetNextSeedCandidate(pClusterList, usedClusters, pSeedCluster))
120  {
121  SeedAssociationList seedAssociationList;
122  this->GetSeedAssociationList(ClusterVector(1, pSeedCluster), pClusterList, seedAssociationList);
123  this->ProcessSeedAssociationDetails(seedAssociationList, clusterListName, usedClusters);
124  }
125 }
void GetSeedAssociationList(const pandora::ClusterVector &particleSeedVector, const pandora::ClusterList *const pClusterList, SeedAssociationList &seedAssociationList) const
Get the seed association list for a given vector of particle seed candidates.
void GetAllVertexSeedCandidates(const pandora::ClusterList *const pClusterList, const pandora::Vertex *const pVertex, pandora::ClusterVector &seedClusters) const
Get all seed candidates associated with a provided vertex.
bool GetNextSeedCandidate(const pandora::ClusterList *const pClusterList, const pandora::ClusterSet &usedClusters, const pandora::Cluster *&pSeedCluster) const
Get the next seed candidate, using a list of available candidates and a list of those already used...
std::unordered_map< const pandora::Cluster *, pandora::ClusterVector > SeedAssociationList
void ProcessSeedAssociationDetails(const SeedAssociationList &seedAssociationList, const std::string &clusterListName, pandora::ClusterSet &usedClusters) const
Process the details stored in a specified seed association list.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
std::list< Vertex > VertexList
Definition: DCEL.h:178
bool lar_content::ShowerGrowingAlgorithm::SortClusters ( const pandora::Cluster *const  pLhs,
const pandora::Cluster *const  pRhs 
)
staticprotected

Sorting for clusters to determine order in which seeds are considered.

Parameters
pLhsaddress of first cluster
pRhsaddress of second cluster

Definition at line 50 of file ShowerGrowingAlgorithm.cc.

References f, and lar_content::LArClusterHelper::GetExtremalCoordinates().

Referenced by GetAllVertexSeedCandidates(), GetNextSeedCandidate(), and GetSeedAssociationList().

51 {
52  CartesianVector innerCoordinateLhs(0.f, 0.f, 0.f), outerCoordinateLhs(0.f, 0.f, 0.f);
53  LArClusterHelper::GetExtremalCoordinates(pLhs, innerCoordinateLhs, outerCoordinateLhs);
54  const float dLhs2((outerCoordinateLhs - innerCoordinateLhs).GetMagnitudeSquared());
55 
56  CartesianVector innerCoordinateRhs(0.f, 0.f, 0.f), outerCoordinateRhs(0.f, 0.f, 0.f);
57  LArClusterHelper::GetExtremalCoordinates(pRhs, innerCoordinateRhs, outerCoordinateRhs);
58  const float dRhs2((outerCoordinateRhs - innerCoordinateRhs).GetMagnitudeSquared());
59 
60  return (dLhs2 > dRhs2);
61 }
TFile f
Definition: plotHisto.C:6
static void GetExtremalCoordinates(const pandora::ClusterList &clusterList, pandora::CartesianVector &innerCoordinate, pandora::CartesianVector &outerCoordinate)
Get positions of the two most distant calo hits in a list of cluster (ordered by Z) ...

Member Data Documentation

ClusterDirectionMap lar_content::ShowerGrowingAlgorithm::m_clusterDirectionMap
mutableprotected

The cluster direction map.

Definition at line 55 of file ShowerGrowingAlgorithm.h.

Referenced by AreClustersAssociated(), ProcessBranchClusters(), and Run().

float lar_content::ShowerGrowingAlgorithm::m_directionApexShift
private

Direction determination, look for vertex inside triangle with apex shifted along the cluster length.

Definition at line 152 of file ShowerGrowingAlgorithm.h.

Referenced by AreClustersAssociated(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_directionTanAngle
private

Direction determination, look for vertex inside triangle with apex shifted along the cluster length.

Definition at line 151 of file ShowerGrowingAlgorithm.h.

Referenced by AreClustersAssociated(), and ReadSettings().

pandora::StringVector lar_content::ShowerGrowingAlgorithm::m_inputClusterListNames
private

The names of the input cluster lists.

Definition at line 145 of file ShowerGrowingAlgorithm.h.

Referenced by ReadSettings(), and Run().

float lar_content::ShowerGrowingAlgorithm::m_maxVertexLongitudinalDistance
private

Vertex association check: max longitudinal distance cut.

Definition at line 155 of file ShowerGrowingAlgorithm.h.

Referenced by IsVertexAssociated(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_maxVertexTransverseDistance
private

Vertex association check: max transverse distance cut.

Definition at line 156 of file ShowerGrowingAlgorithm.h.

Referenced by IsVertexAssociated(), and ReadSettings().

unsigned int lar_content::ShowerGrowingAlgorithm::m_minCaloHitsPerCluster
private

The minimum number of calo hits per (seed or branch) cluster.

Definition at line 147 of file ShowerGrowingAlgorithm.h.

Referenced by GetAllVertexSeedCandidates(), GetNextSeedCandidate(), GetSeedAssociationList(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_minVertexLongitudinalDistance
private

Vertex association check: min longitudinal distance cut.

Definition at line 154 of file ShowerGrowingAlgorithm.h.

Referenced by IsVertexAssociated(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_nearbyClusterDistance
private

The nearby cluster distance, used for determining cluster associations.

Definition at line 148 of file ShowerGrowingAlgorithm.h.

Referenced by AreClustersAssociated(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_remoteClusterDistance
private

The remote cluster distance, used for determining cluster associations.

Definition at line 149 of file ShowerGrowingAlgorithm.h.

Referenced by AreClustersAssociated(), and ReadSettings().

float lar_content::ShowerGrowingAlgorithm::m_vertexAngularAllowance
private

Vertex association check: pointing angular allowance in degrees.

Definition at line 157 of file ShowerGrowingAlgorithm.h.

Referenced by IsVertexAssociated(), and ReadSettings().


The documentation for this class was generated from the following files: