9 #include "Pandora/AlgorithmHeaders.h" 23 IsolatedClusterMopUpAlgorithm::IsolatedClusterMopUpAlgorithm() :
24 m_maxCaloHitsInCluster(20),
25 m_maxHitClusterDistance(5.
f),
26 m_addHitsAsIsolated(true)
36 CaloHitList caloHitList;
43 CaloHitList sortedCaloHitList;
44 for (
const auto &mapEntry : caloHitToClusterMap)
45 sortedCaloHitList.push_back(mapEntry.first);
48 for (
const CaloHit *pCaloHit : sortedCaloHitList)
52 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddIsolatedToCluster(*
this, caloHitToClusterMap.at(pCaloHit), pCaloHit));
56 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*
this, caloHitToClusterMap.at(pCaloHit), pCaloHit));
65 for (
const Cluster *
const pRemnantCluster : clusterList)
69 const std::string listNameR(this->
GetListName(pRemnantCluster));
70 pRemnantCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
71 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete(*
this, pRemnantCluster, listNameR));
79 const CaloHitList &caloHitList,
const ClusterList &clusterList,
CaloHitToClusterMap &caloHitToClusterMap)
const 81 CaloHitList allCaloHits;
84 for (
const Cluster *
const pCluster : clusterList)
86 CaloHitList daughterHits;
87 pCluster->GetOrderedCaloHitList().FillCaloHitList(daughterHits);
88 allCaloHits.insert(allCaloHits.end(), daughterHits.begin(), daughterHits.end());
90 for (
const CaloHit *
const pCaloHit : daughterHits)
91 (void)hitToParentClusterMap.insert(CaloHitToClusterMap::value_type(pCaloHit, pCluster));
98 kdTree.
build(hitKDNode2DList, hitsBoundingRegion2D);
101 if (!caloHitList.empty())
102 view = caloHitList.front()->GetHitType();
106 for (
const CaloHit *
const pCaloHit : caloHitList)
108 if (!PandoraContentApi::IsAvailable(*
this, pCaloHit))
109 throw StatusCodeException(STATUS_CODE_FAILURE);
112 float resultDistance(std::numeric_limits<float>::max());
113 const HitKDNode2D targetHit(pCaloHit, pCaloHit->GetPositionVector().GetX(), pCaloHit->GetPositionVector().GetZ());
116 if (pResultHit && (resultDistance < maxHitClusterDistanceAdjusted))
117 (void)caloHitToClusterMap.insert(CaloHitToClusterMap::value_type(pCaloHit, hitToParentClusterMap.at(pResultHit->
data)));
125 PANDORA_RETURN_RESULT_IF_AND_IF(
126 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MaxCaloHitsInCluster",
m_maxCaloHitsInCluster));
128 PANDORA_RETURN_RESULT_IF_AND_IF(
129 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MaxHitClusterDistance",
m_maxHitClusterDistance));
131 PANDORA_RETURN_RESULT_IF_AND_IF(
132 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"AddHitsAsIsolated",
m_addHitsAsIsolated));
Header file for the kd tree linker algo template class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::vector< HitKDNode2D > HitKDNode2DList
static float GetWirePitchRatio(const pandora::Pandora &pandora, const pandora::HitType view)
Return the ratio of the wire pitch of the specified view to the minimum wire pitch for the detector...
void ClusterMopUp(const pandora::ClusterList &pfoClusters, const pandora::ClusterList &remnantClusters) const
Cluster mop up for a single view. This function is responsible for instructing pandora to make cluste...
std::unordered_map< const pandora::CaloHit *, const pandora::Cluster * > CaloHitToClusterMap
Box structure used to define 2D field. It's used in KDTree building step to divide the detector space...
bool m_excludePfosContainingTracks
Whether to exclude any pfos containing clusters flagged as fixed tracks.
unsigned int m_maxCaloHitsInCluster
The maximum number of hits in a cluster to be dissolved.
void DissolveClustersToHits(const pandora::ClusterList &clusterList, pandora::CaloHitList &caloHitList) const
Examine a list of clusters, identify and delete remnants; receive the list of newly available hits...
void findNearestNeighbour(const KDTreeNodeInfoT< DATA, DIM > &point, const KDTreeNodeInfoT< DATA, DIM > *&result, float &distance)
findNearestNeighbour
Data stored in each KDTree node. The dim1/dim2 fields are usually the duplication of some PFRecHit va...
Header file for the geometry helper class.
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.
bool m_addHitsAsIsolated
Whether to add hits to clusters as "isolated" (don't contribute to spatial properties) ...
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.
void build(std::vector< KDTreeNodeInfoT< DATA, DIM >> &eltList, const KDTreeBoxT< DIM > ®ion)
Build the KD tree from the "eltList" in the space define by "region".
Header file for the isolated cluster mop up algorithm class.
float m_maxHitClusterDistance
The maximum hit to cluster distance for isolated hit merging.
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 >> &nodes)
fill_and_bound_2d_kd_tree
void GetCaloHitToClusterMap(const pandora::CaloHitList &caloHitList, const pandora::ClusterList &clusterList, CaloHitToClusterMap &caloHitToClusterMap) const
Look for isolated hit additions, considering a list of candidate hits and a list of host clusters...