40 if (!pClusterList || pClusterList->empty())
43 std::cout <<
"ClusterGrowingAlgorithm: unable to find cluster list " <<
m_inputClusterListName << std::endl;
45 return STATUS_CODE_SUCCESS;
61 if (clusterMergeMap.empty())
67 return STATUS_CODE_SUCCESS;
75 for (ClusterVector::const_iterator iter = inputClusters.begin(), iterEnd = inputClusters.end(); iter != iterEnd; ++iter)
77 const Cluster *
const pCluster = *iter;
79 if (seedClusters.end() != std::find(seedClusters.begin(), seedClusters.end(), pCluster))
82 nonSeedClusters.push_back(pCluster);
93 for (ClusterVector::const_iterator nIter = nonSeedClusters.begin(), nIterEnd = nonSeedClusters.end(); nIter != nIterEnd; ++nIter)
95 const Cluster *
const pNonSeedCluster = *nIter;
97 const Cluster *pBestSeedCluster(NULL);
100 for (ClusterVector::const_iterator sIter = seedClusters.begin(), sIterEnd = seedClusters.end(); sIter != sIterEnd; ++sIter)
102 const Cluster *
const pThisSeedCluster = *sIter;
105 if (thisDistance < bestDistance)
107 pBestSeedCluster = pThisSeedCluster;
108 bestDistance = thisDistance;
112 if (pBestSeedCluster)
113 clusterMergeMap[pBestSeedCluster].push_back(pNonSeedCluster);
122 for (
const auto &mapEntry : clusterMergeMap)
123 parentClusterList.push_back(mapEntry.first);
126 for (
const Cluster *
const pParentCluster : parentClusterList)
128 const ClusterList &clusterList(clusterMergeMap.at(pParentCluster));
130 if (clusterList.empty())
133 for (
const Cluster *
const pAssociatedCluster : clusterList)
158 return STATUS_CODE_SUCCESS;
Header file for the cluster growing algorithm class.
Header file for the cluster helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode MergeAndDeleteClusters(const pandora::Algorithm &algorithm, const pandora::Cluster *const pClusterToEnlarge, const pandora::Cluster *const pClusterToDelete)
Merge two clusters in the current list, enlarging one cluster and deleting the second.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
ClusterGrowingAlgorithm()
Default constructor.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
std::string m_inputClusterListName
The name of the input cluster list. If not specified, will access current list.
virtual void GetListOfSeedClusters(const pandora::ClusterVector &cleanClusters, pandora::ClusterVector &seedClusters) const =0
Select seed clusters for growing.
void PopulateClusterMergeMap(const pandora::ClusterVector &seedClusters, const pandora::ClusterVector &nonSeedClusters, ClusterMergeMap &clusterMergeMap) const
Identify a set of cluster merges.
void MergeClusters(const ClusterMergeMap &clusterMergeMap) const
Merge clusters.
virtual void GetListOfCleanClusters(const pandora::ClusterList *const pClusterList, pandora::ClusterVector &cleanClusters) const =0
Populate cluster vector with the subset of clusters judged to be clean.
virtual pandora::StatusCode Run()
Run the algorithm.
void GetListOfNonSeedClusters(const pandora::ClusterVector &inputClusters, const pandora::ClusterVector &seedClusters, pandora::ClusterVector &nonSeedClusters) const
Get List of non-seed clusters.
float m_maxClusterSeparation
Maximum distance at which clusters can be joined.
std::unordered_map< const pandora::Cluster *, pandora::ClusterList > ClusterMergeMap
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,...
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
StatusCodeException class.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
std::vector< const Cluster * > ClusterVector
MANAGED_CONTAINER< const Cluster * > ClusterList
StatusCode
The StatusCode enum.