9 #include "Pandora/AlgorithmHeaders.h" 20 SimpleClusterCreationAlgorithm::SimpleClusterCreationAlgorithm() : m_clusteringWindowSquared(1.
f)
28 const CaloHitList *pCaloHitList = NULL;
29 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*
this, pCaloHitList));
32 CaloHitList caloHitList;
35 if (caloHitList.empty())
36 return STATUS_CODE_SUCCESS;
45 return STATUS_CODE_SUCCESS;
52 for (
const CaloHit *
const pCaloHit : *pInputList)
54 if (PandoraContentApi::IsAvailable(*
this, pCaloHit))
55 outputList.push_back(pCaloHit);
63 for (
const CaloHit *
const pCaloHitI : caloHitList)
65 for (
const CaloHit *
const pCaloHitJ : caloHitList)
67 if (pCaloHitI == pCaloHitJ)
72 CaloHitList &caloHitListI(hitAssociationMap[pCaloHitI]);
74 if (caloHitListI.end() == std::find(caloHitListI.begin(), caloHitListI.end(), pCaloHitJ))
75 caloHitListI.push_back(pCaloHitJ);
77 CaloHitList &caloHitListJ(hitAssociationMap[pCaloHitI]);
79 if (caloHitListJ.end() == std::find(caloHitListJ.begin(), caloHitListJ.end(), pCaloHitI))
80 caloHitListJ.push_back(pCaloHitI);
91 CaloHitVector caloHitVector(caloHitList.begin(), caloHitList.end());
94 for (
const CaloHit *
const pSeedCaloHit : caloHitVector)
96 if (vetoList.count(pSeedCaloHit))
99 CaloHitList mergeList;
102 const Cluster *pCluster = NULL;
103 PandoraContentApi::Cluster::Parameters parameters;
104 parameters.m_caloHitList.push_back(pSeedCaloHit);
105 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*
this, parameters, pCluster));
106 vetoList.insert(pSeedCaloHit);
108 for (
const CaloHit *
const pAssociatedCaloHit : mergeList)
110 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*
this, pCluster, pAssociatedCaloHit));
111 vetoList.insert(pAssociatedCaloHit);
119 const HitAssociationMap &hitAssociationMap,
const CaloHitSet &vetoList, CaloHitList &mergeList)
const 121 if (vetoList.count(pCurrentCaloHit))
125 if (iter1 == hitAssociationMap.end())
128 CaloHitVector caloHitVector(iter1->second.begin(), iter1->second.end());
131 for (
const CaloHit *
const pAssociatedCaloHit : caloHitVector)
133 if (pAssociatedCaloHit == pSeedCaloHit)
136 if (mergeList.end() != std::find(mergeList.begin(), mergeList.end(), pAssociatedCaloHit))
139 mergeList.push_back(pAssociatedCaloHit);
141 this->
CollectAssociatedHits(pSeedCaloHit, pAssociatedCaloHit, hitAssociationMap, vetoList, mergeList);
149 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"ClusteringWindow", clusteringWindow));
152 return STATUS_CODE_SUCCESS;
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.
pandora::StatusCode Run()
void CreateClusters(const pandora::CaloHitList &caloHitList, const HitAssociationMap &hitAssociationMap) const
Create clusters from selected calo hits and their associations.
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.