Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
NearbyClusterMopUpAlgorithm.cc
Go to the documentation of this file.
1
10
13
15
16using namespace pandora;
17
18namespace lar_content
19{
20
22 m_minHitsInCluster(5),
23 m_vertexProximity(5.f),
24 m_minClusterSeparation(2.5f),
25 m_touchingDistance(0.001f)
26{
27}
28
29//------------------------------------------------------------------------------------------------------------------------------------------
30
31void NearbyClusterMopUpAlgorithm::ClusterMopUp(const ClusterList &pfoClusters, const ClusterList &remnantClusters) const
32{
33 ClusterAssociationMap clusterAssociationMap;
34
35 const VertexList *pVertexList(NULL);
36 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
37 const Vertex *const pVertex(
38 ((pVertexList->size() == 1) && (VERTEX_3D == (*(pVertexList->begin()))->GetVertexType())) ? *(pVertexList->begin()) : NULL);
39
40 ClusterVector sortedPfoClusters(pfoClusters.begin(), pfoClusters.end());
41 std::sort(sortedPfoClusters.begin(), sortedPfoClusters.end(), LArClusterHelper::SortByNHits);
42
43 ClusterVector sortedRemnantClusters(remnantClusters.begin(), remnantClusters.end());
44 std::sort(sortedRemnantClusters.begin(), sortedRemnantClusters.end(), LArClusterHelper::SortByNHits);
45
46 for (const Cluster *const pClusterP : sortedPfoClusters)
47 {
48 const HitType hitType(LArClusterHelper::GetClusterHitType(pClusterP));
49 const CartesianVector vertexPosition2D(
50 !pVertex ? CartesianVector(0.f, 0.f, 0.f) : LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
51
52 const float innerPV((vertexPosition2D - pClusterP->GetCentroid(pClusterP->GetInnerPseudoLayer())).GetMagnitude());
53 const float outerPV((vertexPosition2D - pClusterP->GetCentroid(pClusterP->GetOuterPseudoLayer())).GetMagnitude());
54
55 for (const Cluster *const pClusterR : sortedRemnantClusters)
56 {
57 if (pClusterR->GetNCaloHits() < m_minHitsInCluster)
58 continue;
59
60 const float innerRV((vertexPosition2D - pClusterR->GetCentroid(pClusterR->GetInnerPseudoLayer())).GetMagnitude());
61 const float outerRV((vertexPosition2D - pClusterR->GetCentroid(pClusterR->GetOuterPseudoLayer())).GetMagnitude());
62
63 // ATTN Could use pointing clusters here, for consistency with other vertex association mechanics
64 if (pVertex && (((innerPV < m_vertexProximity) || (outerPV < m_vertexProximity)) &&
65 ((innerRV < m_vertexProximity) || (outerRV < m_vertexProximity))))
66 continue;
67
68 const float innerRP(LArClusterHelper::GetClosestDistance(pClusterR->GetCentroid(pClusterR->GetInnerPseudoLayer()), pClusterP));
69 const float outerRP(LArClusterHelper::GetClosestDistance(pClusterR->GetCentroid(pClusterR->GetOuterPseudoLayer()), pClusterP));
70
71 const float minSeparation(std::min(innerRP, outerRP));
72
73 if (minSeparation > m_minClusterSeparation)
74 continue;
75
76 // ATTN Use of ClusterMopUp base algorithm assumes bigger figure of merit means better association
77 if (m_touchingDistance < std::numeric_limits<float>::epsilon())
78 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
79
80 AssociationDetails &associationDetails(clusterAssociationMap[pClusterR]);
81 const float figureOfMerit((minSeparation < m_touchingDistance) ? 1.f / m_touchingDistance : 1.f / minSeparation);
82
83 if (!associationDetails.insert(AssociationDetails::value_type(pClusterP, figureOfMerit)).second)
84 throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
85 }
86 }
87
88 this->MakeClusterMerges(clusterAssociationMap);
89}
90
91//------------------------------------------------------------------------------------------------------------------------------------------
92
94{
96 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinHitsInCluster", m_minHitsInCluster));
97
98 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexProximity", m_vertexProximity));
99
101 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterSeparation", m_minClusterSeparation));
102
104 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "TouchingDistance", m_touchingDistance));
105
107}
108
109} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cluster helper class.
Header file for the geometry helper class.
Header file for the nearby cluster mop up algorithm 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
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
std::unordered_map< const pandora::Cluster *, AssociationDetails > ClusterAssociationMap
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 ...
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 float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
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...
float m_minClusterSeparation
Minimum distance between parent and daughter clusters to declare clusters associated.
float m_vertexProximity
Distance between cluster inner/outer centroid and vtx to declare cluster vtx associated.
float m_touchingDistance
Threshold (small) distance below which parent and daughter clusters are declated touching.
unsigned int m_minHitsInCluster
Minimum number of hits in order to consider a cluster.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
CartesianVector class.
Cluster class.
Definition Cluster.h:31
const Pandora & GetPandora() const
Get the associated pandora instance.
Definition Process.h:116
StatusCodeException class.
Vertex class.
Definition Vertex.h:26
const CartesianVector & GetPosition() const
Get the vertex position.
Definition Vertex.h:103
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
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.