9 #include "Pandora/AlgorithmHeaders.h" 21 ClusterMopUpBaseAlgorithm::ClusterMopUpBaseAlgorithm() :
22 m_excludePfosContainingTracks(true)
30 ClusterList pfoClusterListU, pfoClusterListV, pfoClusterListW;
33 ClusterList daughterClusterListU, daughterClusterListV, daughterClusterListW;
36 this->
ClusterMopUp(pfoClusterListU, daughterClusterListU);
37 this->
ClusterMopUp(pfoClusterListV, daughterClusterListV);
38 this->
ClusterMopUp(pfoClusterListW, daughterClusterListW);
40 return STATUS_CODE_SUCCESS;
49 const PfoList *pPfoList = NULL;
50 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*
this, *sIter, pPfoList))
55 const ParticleFlowObject *
const pPfo = *pIter;
60 this->
GetClusterLists(pPfo->GetClusterList(),
false, clusterListU, clusterListV, clusterListW);
71 const ClusterList *pClusterList(
nullptr);
73 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*
this, daughterListName, pClusterList))
76 this->
GetClusterLists(*pClusterList,
true, clusterListU, clusterListV, clusterListW);
83 ClusterList &clusterListV, ClusterList &clusterListW)
const 87 const Cluster *
const pCluster(*cIter);
89 if (availabilityFlag != pCluster->IsAvailable())
94 if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
97 ClusterList &
target((TPC_VIEW_U == hitType) ? clusterListU : (TPC_VIEW_V == hitType) ? clusterListV : clusterListW);
98 target.push_back(pCluster);
107 for (
const auto &remnantMapEntry : clusterAssociationMap)
108 sortedRemnantClusters.push_back(remnantMapEntry.first);
111 for (
const Cluster *
const pRemnantCluster : sortedRemnantClusters)
113 const AssociationDetails &associationDetails(clusterAssociationMap.at(pRemnantCluster));
114 const Cluster *pBestPfoCluster(
nullptr);
115 float bestFigureOfMerit(-std::numeric_limits<float>::max());
118 for (
const auto &pfoMapEntry : associationDetails)
119 sortedPfoClusters.push_back(pfoMapEntry.first);
122 for (
const Cluster *
const pPfoCluster : sortedPfoClusters)
124 const float figureOfMerit(associationDetails.at(pPfoCluster));
126 if (figureOfMerit > bestFigureOfMerit)
128 pBestPfoCluster = pPfoCluster;
129 bestFigureOfMerit = figureOfMerit;
133 if (!pBestPfoCluster)
136 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=,
137 PandoraContentApi::MergeAndDeleteClusters(
138 *
this, pBestPfoCluster, pRemnantCluster, this->
GetListName(pBestPfoCluster), this->
GetListName(pRemnantCluster)));
146 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle,
"PfoListNames",
m_pfoListNames));
148 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 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()
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...
cout<< "-> Edep in the target
std::vector< art::Ptr< recob::Cluster > > ClusterVector
pandora::StringVector m_pfoListNames
The list of pfo list names.
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.