Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
ClusterMopUpBaseAlgorithm.cc
Go to the documentation of this file.
1
10
13
15
16using namespace pandora;
17
18namespace lar_content
19{
20
21ClusterMopUpBaseAlgorithm::ClusterMopUpBaseAlgorithm() : m_excludePfosContainingTracks(true)
22{
23}
24
25//------------------------------------------------------------------------------------------------------------------------------------------
26
28{
29 ClusterList pfoClusterListU, pfoClusterListV, pfoClusterListW;
30 this->GetPfoClusterLists(pfoClusterListU, pfoClusterListV, pfoClusterListW);
31
32 ClusterList daughterClusterListU, daughterClusterListV, daughterClusterListW;
33 this->GetDaughterClusterLists(daughterClusterListU, daughterClusterListV, daughterClusterListW);
34
35 this->ClusterMopUp(pfoClusterListU, daughterClusterListU);
36 this->ClusterMopUp(pfoClusterListV, daughterClusterListV);
37 this->ClusterMopUp(pfoClusterListW, daughterClusterListW);
38
39 return STATUS_CODE_SUCCESS;
40}
41
42//------------------------------------------------------------------------------------------------------------------------------------------
43
44void ClusterMopUpBaseAlgorithm::GetPfoClusterLists(ClusterList &clusterListU, ClusterList &clusterListV, ClusterList &clusterListW) const
45{
46 for (StringVector::const_iterator sIter = m_pfoListNames.begin(), sIterEnd = m_pfoListNames.end(); sIter != sIterEnd; ++sIter)
47 {
48 const PfoList *pPfoList = NULL;
49 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, *sIter, pPfoList))
50 continue;
51
52 for (PfoList::const_iterator pIter = pPfoList->begin(), pIterEnd = pPfoList->end(); pIter != pIterEnd; ++pIter)
53 {
54 const ParticleFlowObject *const pPfo = *pIter;
55
57 continue;
58
59 this->GetClusterLists(pPfo->GetClusterList(), false, clusterListU, clusterListV, clusterListW);
60 }
61 }
62}
63
64//------------------------------------------------------------------------------------------------------------------------------------------
65
66void ClusterMopUpBaseAlgorithm::GetDaughterClusterLists(ClusterList &clusterListU, ClusterList &clusterListV, ClusterList &clusterListW) const
67{
68 for (const std::string &daughterListName : m_daughterListNames)
69 {
70 const ClusterList *pClusterList(nullptr);
71
72 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, daughterListName, pClusterList))
73 continue;
74
75 this->GetClusterLists(*pClusterList, true, clusterListU, clusterListV, clusterListW);
76 }
77}
78
79//------------------------------------------------------------------------------------------------------------------------------------------
80
81void ClusterMopUpBaseAlgorithm::GetClusterLists(const ClusterList &inputClusterList, const bool availabilityFlag, ClusterList &clusterListU,
82 ClusterList &clusterListV, ClusterList &clusterListW) const
83{
84 for (ClusterList::const_iterator cIter = inputClusterList.begin(), cIterEnd = inputClusterList.end(); cIter != cIterEnd; ++cIter)
85 {
86 const Cluster *const pCluster(*cIter);
87
88 if (availabilityFlag != pCluster->IsAvailable())
89 continue;
90
91 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
92
93 if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
94 continue;
95
96 ClusterList &target((TPC_VIEW_U == hitType) ? clusterListU : (TPC_VIEW_V == hitType) ? clusterListV : clusterListW);
97 target.push_back(pCluster);
98 }
99}
100
101//------------------------------------------------------------------------------------------------------------------------------------------
102
104{
105 ClusterVector sortedRemnantClusters;
106 for (const auto &remnantMapEntry : clusterAssociationMap)
107 sortedRemnantClusters.push_back(remnantMapEntry.first);
108 std::sort(sortedRemnantClusters.begin(), sortedRemnantClusters.end(), LArClusterHelper::SortByNHits);
109
110 for (const Cluster *const pRemnantCluster : sortedRemnantClusters)
111 {
112 const AssociationDetails &associationDetails(clusterAssociationMap.at(pRemnantCluster));
113 const Cluster *pBestPfoCluster(nullptr);
114 float bestFigureOfMerit(-std::numeric_limits<float>::max());
115
116 ClusterVector sortedPfoClusters;
117 for (const auto &pfoMapEntry : associationDetails)
118 sortedPfoClusters.push_back(pfoMapEntry.first);
119 std::sort(sortedPfoClusters.begin(), sortedPfoClusters.end(), LArClusterHelper::SortByNHits);
120
121 for (const Cluster *const pPfoCluster : sortedPfoClusters)
122 {
123 const float figureOfMerit(associationDetails.at(pPfoCluster));
124
125 if (figureOfMerit > bestFigureOfMerit)
126 {
127 pBestPfoCluster = pPfoCluster;
128 bestFigureOfMerit = figureOfMerit;
129 }
130 }
131
132 if (!pBestPfoCluster)
133 continue;
134
135 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=,
137 *this, pBestPfoCluster, pRemnantCluster, this->GetListName(pBestPfoCluster), this->GetListName(pRemnantCluster)));
138 }
139}
140
141//------------------------------------------------------------------------------------------------------------------------------------------
142
144{
145 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "PfoListNames", m_pfoListNames));
146
147 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
148 XmlHelper::ReadValue(xmlHandle, "ExcludePfosContainingTracks", m_excludePfosContainingTracks));
149
150 return MopUpBaseAlgorithm::ReadSettings(xmlHandle);
151}
152
153} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cluster mop up algorithm base class.
Header file for the cluster helper class.
Header file for the pfo helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:43
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
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.
pandora::StringVector m_pfoListNames
The list of pfo list names.
bool m_excludePfosContainingTracks
Whether to exclude any pfos containing clusters flagged as fixed tracks.
virtual pandora::StatusCode Run()
Run the algorithm.
std::unordered_map< const pandora::Cluster *, AssociationDetails > ClusterAssociationMap
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 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 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,...
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
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...
std::unordered_map< const pandora::Cluster *, float > AssociationDetails
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
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 bool IsTrack(const pandora::ParticleFlowObject *const pPfo)
Return track flag based on Pfo Particle ID.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
const std::string GetListName(const T *const pT) const
Find the name of the list hosting a specific object.
pandora::StringVector m_daughterListNames
The list of potential daughter object list names.
Cluster class.
Definition Cluster.h:31
bool IsAvailable() const
Whether the cluster is available to be added to a particle flow object.
Definition Cluster.h:582
ParticleFlowObject class.
const ClusterList & GetClusterList() const
Get the cluster list.
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
Definition XmlHelper.h:229
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
HitType
Calorimeter hit type enum.
std::vector< const Cluster * > ClusterVector
MANAGED_CONTAINER< const Cluster * > ClusterList
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList