ClusterMopUpBaseAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArTwoDReco/LArClusterMopUp/ClusterMopUpBaseAlgorithm.cc
3  *
4  * @brief Implementation of the cluster mop up algorithm base class.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
13 
15 
16 using namespace pandora;
17 
18 namespace lar_content
19 {
20 
21 ClusterMopUpBaseAlgorithm::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 
44 void 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 
66 void 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 
81 void 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, !=,
136  PandoraContentApi::MergeAndDeleteClusters(
137  *this, pBestPfoCluster, pRemnantCluster, this->GetListName(pBestPfoCluster), this->GetListName(pRemnantCluster)));
138  }
139 }
140 
141 //------------------------------------------------------------------------------------------------------------------------------------------
142 
143 StatusCode ClusterMopUpBaseAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
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
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.
enum cvn::HType HitType
std::string string
Definition: nybbler.cc:12
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.
intermediate_table::const_iterator const_iterator
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
static int max(int a, int b)
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...
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.