9 #include "Pandora/AlgorithmHeaders.h"
21 ClusterMopUpBaseAlgorithm::ClusterMopUpBaseAlgorithm() : m_excludePfosContainingTracks(
true)
29 ClusterList pfoClusterListU, pfoClusterListV, pfoClusterListW;
32 ClusterList daughterClusterListU, daughterClusterListV, daughterClusterListW;
35 this->
ClusterMopUp(pfoClusterListU, daughterClusterListU);
36 this->
ClusterMopUp(pfoClusterListV, daughterClusterListV);
37 this->
ClusterMopUp(pfoClusterListW, daughterClusterListW);
39 return STATUS_CODE_SUCCESS;
48 const PfoList *pPfoList = NULL;
49 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*
this, *sIter, pPfoList))
52 for (PfoList::const_iterator pIter = pPfoList->begin(), pIterEnd = pPfoList->end(); pIter != pIterEnd; ++pIter)
54 const ParticleFlowObject *
const pPfo = *pIter;
59 this->
GetClusterLists(pPfo->GetClusterList(),
false, clusterListU, clusterListV, clusterListW);
70 const ClusterList *pClusterList(
nullptr);
72 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*
this, daughterListName, pClusterList))
75 this->
GetClusterLists(*pClusterList,
true, clusterListU, clusterListV, clusterListW);
82 ClusterList &clusterListV, ClusterList &clusterListW)
const
84 for (ClusterList::const_iterator cIter = inputClusterList.begin(), cIterEnd = inputClusterList.end(); cIter != cIterEnd; ++cIter)
86 const Cluster *
const pCluster(*cIter);
88 if (availabilityFlag != pCluster->IsAvailable())
93 if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
96 ClusterList &target((TPC_VIEW_U == hitType) ? clusterListU : (TPC_VIEW_V == hitType) ? clusterListV : clusterListW);
97 target.push_back(pCluster);
106 for (
const auto &remnantMapEntry : clusterAssociationMap)
107 sortedRemnantClusters.push_back(remnantMapEntry.first);
110 for (
const Cluster *
const pRemnantCluster : sortedRemnantClusters)
112 const AssociationDetails &associationDetails(clusterAssociationMap.at(pRemnantCluster));
113 const Cluster *pBestPfoCluster(
nullptr);
114 float bestFigureOfMerit(-std::numeric_limits<float>::max());
117 for (
const auto &pfoMapEntry : associationDetails)
118 sortedPfoClusters.push_back(pfoMapEntry.first);
121 for (
const Cluster *
const pPfoCluster : sortedPfoClusters)
123 const float figureOfMerit(associationDetails.at(pPfoCluster));
125 if (figureOfMerit > bestFigureOfMerit)
127 pBestPfoCluster = pPfoCluster;
128 bestFigureOfMerit = figureOfMerit;
132 if (!pBestPfoCluster)
135 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=,
136 PandoraContentApi::MergeAndDeleteClusters(
137 *
this, pBestPfoCluster, pRemnantCluster, this->
GetListName(pBestPfoCluster), this->
GetListName(pRemnantCluster)));
145 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle,
"PfoListNames",
m_pfoListNames));
147 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
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.
virtual void MakeClusterMerges(const ClusterAssociationMap &clusterAssociationMap) const
Make the cluster merges specified in the cluster association map, using list name information in the ...
virtual void GetClusterLists(const pandora::ClusterList &inputClusterList, const bool availabilityFlag, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
Get the two dimensional clusters contained in an input cluster list, divided into three different vie...
Header file for the pfo helper class.
pandora::StringVector m_daughterListNames
The list of potential daughter object list names.
bool m_excludePfosContainingTracks
Whether to exclude any pfos containing clusters flagged as fixed tracks.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static bool IsTrack(const pandora::ParticleFlowObject *const pPfo)
Return track flag based on Pfo Particle ID.
std::unordered_map< const pandora::Cluster *, AssociationDetails > ClusterAssociationMap
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
virtual void ClusterMopUp(const pandora::ClusterList &pfoClusters, const pandora::ClusterList &remnantClusters) const =0
Cluster mop up for a single view. This function is responsible for instructing pandora to make cluste...
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
const std::string GetListName(const T *const pT) const
Find the name of the list hosting a specific object.
Header file for the cluster helper class.
Header file for the cluster mop up algorithm base class.
std::unordered_map< const pandora::Cluster *, float > AssociationDetails
virtual void GetPfoClusterLists(pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
Get the two dimensional clusters contained in the input pfo list, divided into three different views...
virtual pandora::StatusCode Run()
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
std::vector< art::Ptr< recob::Cluster > > ClusterVector
pandora::StringVector m_pfoListNames
The list of pfo list names.
BEGIN_PROLOG don t mess with this pandoraTrackGausCryoW true
virtual void GetDaughterClusterLists(pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
Get the two dimensional clusters contained in the input remant/daughter cluster lists, divided into three different views.