LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
SimpleClusterCreationAlgorithm.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
14 
15 using namespace pandora;
16 
17 namespace lar_content
18 {
19 
20 SimpleClusterCreationAlgorithm::SimpleClusterCreationAlgorithm() :
21  m_clusteringWindowSquared(1.f)
22 {
23 }
24 
25 //------------------------------------------------------------------------------------------------------------------------------------------
26 
28 {
29  const CaloHitList *pCaloHitList = NULL;
30  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pCaloHitList));
31 
32  // Select available calo hits for clustering
33  CaloHitList caloHitList;
34  this->SelectCaloHits(pCaloHitList, caloHitList);
35 
36  if (caloHitList.empty())
37  return STATUS_CODE_SUCCESS;
38 
39  // Build map of associations between selected calo hits
40  HitAssociationMap hitAssociationMap;
41  this->BuildAssociationMap(caloHitList, hitAssociationMap);
42 
43  // Create new clusters
44  this->CreateClusters(caloHitList, hitAssociationMap);
45 
46  return STATUS_CODE_SUCCESS;
47 }
48 
49 //------------------------------------------------------------------------------------------------------------------------------------------
50 
51 void SimpleClusterCreationAlgorithm::SelectCaloHits(const CaloHitList *const pInputList, CaloHitList &outputList) const
52 {
53  for (const CaloHit *const pCaloHit : *pInputList)
54  {
55  if (PandoraContentApi::IsAvailable(*this, pCaloHit))
56  outputList.push_back(pCaloHit);
57  }
58 }
59 
60 //------------------------------------------------------------------------------------------------------------------------------------------
61 
62 void SimpleClusterCreationAlgorithm::BuildAssociationMap(const CaloHitList &caloHitList, HitAssociationMap &hitAssociationMap) const
63 {
64  for (const CaloHit *const pCaloHitI : caloHitList)
65  {
66  for (const CaloHit *const pCaloHitJ : caloHitList)
67  {
68  if (pCaloHitI == pCaloHitJ)
69  continue;
70 
71  if ((pCaloHitI->GetPositionVector() - pCaloHitJ->GetPositionVector()).GetMagnitudeSquared() < m_clusteringWindowSquared)
72  {
73  CaloHitList &caloHitListI(hitAssociationMap[pCaloHitI]);
74 
75  if (caloHitListI.end() == std::find(caloHitListI.begin(), caloHitListI.end(), pCaloHitJ))
76  caloHitListI.push_back(pCaloHitJ);
77 
78  CaloHitList &caloHitListJ(hitAssociationMap[pCaloHitI]);
79 
80  if (caloHitListJ.end() == std::find(caloHitListJ.begin(), caloHitListJ.end(), pCaloHitI))
81  caloHitListJ.push_back(pCaloHitI);
82  }
83  }
84  }
85 }
86 
87 //------------------------------------------------------------------------------------------------------------------------------------------
88 
89 void SimpleClusterCreationAlgorithm::CreateClusters(const CaloHitList &caloHitList, const HitAssociationMap &hitAssociationMap) const
90 {
91  CaloHitSet vetoList;
92  CaloHitVector caloHitVector(caloHitList.begin(), caloHitList.end());
93  std::sort(caloHitVector.begin(), caloHitVector.end(), LArClusterHelper::SortHitsByPosition);
94 
95  for (const CaloHit *const pSeedCaloHit : caloHitVector)
96  {
97  if (vetoList.count(pSeedCaloHit))
98  continue;
99 
100  CaloHitList mergeList;
101  this->CollectAssociatedHits(pSeedCaloHit, pSeedCaloHit, hitAssociationMap, vetoList, mergeList);
102 
103  const Cluster *pCluster = NULL;
104  PandoraContentApi::Cluster::Parameters parameters;
105  parameters.m_caloHitList.push_back(pSeedCaloHit);
106  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*this, parameters, pCluster));
107  vetoList.insert(pSeedCaloHit);
108 
109  for (const CaloHit *const pAssociatedCaloHit : mergeList)
110  {
111  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*this, pCluster, pAssociatedCaloHit));
112  vetoList.insert(pAssociatedCaloHit);
113  }
114  }
115 }
116 
117 //------------------------------------------------------------------------------------------------------------------------------------------
118 
119 void SimpleClusterCreationAlgorithm::CollectAssociatedHits(const CaloHit *const pSeedCaloHit, const CaloHit *const pCurrentCaloHit,
120  const HitAssociationMap &hitAssociationMap, const CaloHitSet &vetoList, CaloHitList &mergeList) const
121 {
122  if (vetoList.count(pCurrentCaloHit))
123  return;
124 
125  HitAssociationMap::const_iterator iter1 = hitAssociationMap.find(pCurrentCaloHit);
126  if (iter1 == hitAssociationMap.end())
127  return;
128 
129  CaloHitVector caloHitVector(iter1->second.begin(), iter1->second.end());
130  std::sort(caloHitVector.begin(), caloHitVector.end(), LArClusterHelper::SortHitsByPosition);
131 
132  for (const CaloHit *const pAssociatedCaloHit : caloHitVector)
133  {
134  if (pAssociatedCaloHit == pSeedCaloHit)
135  continue;
136 
137  if (mergeList.end() != std::find(mergeList.begin(), mergeList.end(), pAssociatedCaloHit))
138  continue;
139 
140  mergeList.push_back(pAssociatedCaloHit);
141 
142  this->CollectAssociatedHits(pSeedCaloHit, pAssociatedCaloHit, hitAssociationMap, vetoList, mergeList);
143  }
144 }
145 //------------------------------------------------------------------------------------------------------------------------------------------
146 
147 StatusCode SimpleClusterCreationAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
148 {
149  float clusteringWindow = std::sqrt(m_clusteringWindowSquared);
150  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ClusteringWindow", clusteringWindow));
151  m_clusteringWindowSquared = clusteringWindow * clusteringWindow;
152 
153  return STATUS_CODE_SUCCESS;
154 }
155 
156 } // namespace lar_content
void BuildAssociationMap(const pandora::CaloHitList &caloHitList, HitAssociationMap &hitAssociationMap) const
Create map of associations between calo hits.
void SelectCaloHits(const pandora::CaloHitList *const pInputList, pandora::CaloHitList &outputList) const
Select calo hits for clustering.
intermediate_table::const_iterator const_iterator
void CreateClusters(const pandora::CaloHitList &caloHitList, const HitAssociationMap &hitAssociationMap) const
Create clusters from selected calo hits and their associations.
TFile f
Definition: plotHisto.C:6
static bool SortHitsByPosition(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their position (use Z, followed by X, followed by Y)
Header file for the cluster helper class.
std::unordered_map< const pandora::CaloHit *, pandora::CaloHitList > HitAssociationMap
float m_clusteringWindowSquared
Maximum distance (squared) for two hits to be joined.
void CollectAssociatedHits(const pandora::CaloHit *const pSeedCaloHit, const pandora::CaloHit *const pCurrentCaloHit, const HitAssociationMap &hitAssociationMap, const pandora::CaloHitSet &vetoList, pandora::CaloHitList &mergeList) const
For a given seed calo hits, collect up all the associated calo hits.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Header file for the cluster creation algorithm class.