LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
EndAssociatedPfosTool.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
15 
17 
18 using namespace pandora;
19 
20 namespace lar_content
21 {
22 
25 
26 EndAssociatedPfosTool::EndAssociatedPfosTool() :
27  m_minNeutrinoVertexDistance(5.f),
28  m_minVertexLongitudinalDistance(-2.5f),
29  m_maxVertexLongitudinalDistance(20.f),
30  m_maxVertexTransverseDistance(3.5f),
31  m_vertexAngularAllowance(3.f),
32  m_maxParentEndpointDistance(2.5f)
33 {
34 }
35 
36 //------------------------------------------------------------------------------------------------------------------------------------------
37 
38 void EndAssociatedPfosTool::Run(NeutrinoHierarchyAlgorithm *const pAlgorithm, const Vertex *const pNeutrinoVertex, PfoInfoMap &pfoInfoMap)
39 {
40  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
41  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
42 
43  bool associationsMade(true);
44 
45  while (associationsMade)
46  {
47  associationsMade = false;
48  PfoVector assignedPfos, unassignedPfos;
49  pAlgorithm->SeparatePfos(pfoInfoMap, assignedPfos, unassignedPfos);
50 
51  if (unassignedPfos.empty())
52  break;
53 
54  // ATTN May want to reconsider precise association mechanics for complex situations
55  PfoSet recentlyAssigned;
56 
57  for (const ParticleFlowObject *const pParentPfo : assignedPfos)
58  {
59  PfoInfo *const pParentPfoInfo(pfoInfoMap.at(pParentPfo));
60  const LArPointingCluster parentPointingCluster(*(pParentPfoInfo->GetSlidingFitResult3D()));
61 
62  const LArPointingCluster::Vertex &parentEndpoint(pParentPfoInfo->IsInnerLayerAssociated() ? parentPointingCluster.GetOuterVertex() : parentPointingCluster.GetInnerVertex());
63  const float neutrinoVertexDistance((parentEndpoint.GetPosition() - pNeutrinoVertex->GetPosition()).GetMagnitude());
64 
65  if (neutrinoVertexDistance < m_minNeutrinoVertexDistance)
66  continue;
67 
68  for (const ParticleFlowObject *const pPfo : unassignedPfos)
69  {
70  if (recentlyAssigned.count(pPfo))
71  continue;
72 
73  PfoInfo *const pPfoInfo(pfoInfoMap.at(pPfo));
74 
75  const LArPointingCluster pointingCluster(*(pPfoInfo->GetSlidingFitResult3D()));
76  const bool useInner((pointingCluster.GetInnerVertex().GetPosition() - parentEndpoint.GetPosition()).GetMagnitudeSquared() <
77  (pointingCluster.GetOuterVertex().GetPosition() - parentEndpoint.GetPosition()).GetMagnitudeSquared());
78 
79  const LArPointingCluster::Vertex &daughterVertex(useInner ? pointingCluster.GetInnerVertex() : pointingCluster.GetOuterVertex());
80 
81  if (LArPointingClusterHelper::IsNode(parentEndpoint.GetPosition(), daughterVertex, m_minVertexLongitudinalDistance, m_maxVertexTransverseDistance) ||
85  this->IsCloseToParentEndpoint(parentEndpoint.GetPosition(), pParentPfoInfo->GetCluster3D(), pPfoInfo->GetCluster3D()) )
86  {
87  associationsMade = true;
88  pParentPfoInfo->AddDaughterPfo(pPfoInfo->GetThisPfo());
89  pPfoInfo->SetParentPfo(pParentPfoInfo->GetThisPfo());
90  pPfoInfo->SetInnerLayerAssociation(useInner);
91  recentlyAssigned.insert(pPfoInfo->GetThisPfo());
92  }
93  }
94  }
95  }
96 }
97 
98 //------------------------------------------------------------------------------------------------------------------------------------------
99 
100 bool EndAssociatedPfosTool::IsCloseToParentEndpoint(const CartesianVector &parentEndpoint, const Cluster *const pParentCluster3D,
101  const Cluster *const pDaughterCluster3D) const
102 {
103  try
104  {
105  CartesianVector parentPosition3D(0.f, 0.f, 0.f), daughterPosition3D(0.f, 0.f, 0.f);
106  LArClusterHelper::GetClosestPositions(pParentCluster3D, pDaughterCluster3D, parentPosition3D, daughterPosition3D);
107 
108  if (((parentPosition3D - parentEndpoint).GetMagnitude() < m_maxParentEndpointDistance) && ((parentPosition3D - daughterPosition3D).GetMagnitude() < m_maxParentEndpointDistance))
109  return true;
110  }
111  catch (const StatusCodeException &)
112  {
113  }
114 
115  return false;
116 }
117 
118 //------------------------------------------------------------------------------------------------------------------------------------------
119 
120 StatusCode EndAssociatedPfosTool::ReadSettings(const TiXmlHandle xmlHandle)
121 {
122  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
123  "MinNeutrinoVertexDistance", m_minNeutrinoVertexDistance));
124 
125  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
126  "MinVertexLongitudinalDistance", m_minVertexLongitudinalDistance));
127 
128  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
129  "MaxVertexLongitudinalDistance", m_maxVertexLongitudinalDistance));
130 
131  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
132  "MaxVertexTransverseDistance", m_maxVertexTransverseDistance));
133 
134  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
135  "VertexAngularAllowance", m_vertexAngularAllowance));
136 
137  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
138  "MaxParentEndpointDistance", m_maxParentEndpointDistance));
139 
140  return STATUS_CODE_SUCCESS;
141 }
142 
143 } // namespace lar_content
Header file for the lar pointing cluster class.
NeutrinoHierarchyAlgorithm::PfoInfoMap PfoInfoMap
static bool IsEmission(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Whether pointing vertex is emitted from a given position.
float m_minNeutrinoVertexDistance
Min distance between candidate parent endpoint and neutrino vertex.
void SeparatePfos(const NeutrinoHierarchyAlgorithm::PfoInfoMap &pfoInfoMap, pandora::PfoVector &assignedPfos, pandora::PfoVector &unassignedPfos) const
Query the pfo info map and separate/extract pfos currently either acting as parents or associated wit...
LArPointingCluster class.
static void GetClosestPositions(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, pandora::CartesianVector &position1, pandora::CartesianVector &position2)
Get pair of closest positions for a pair of clusters.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
TFile f
Definition: plotHisto.C:6
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
void Run(NeutrinoHierarchyAlgorithm *const pAlgorithm, const pandora::Vertex *const pNeutrinoVertex, NeutrinoHierarchyAlgorithm::PfoInfoMap &pfoInfoMap)
Run the algorithm tool.
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
Header file for the end associated pfos tool class.
Header file for the lar three dimensional sliding fit result class.
float m_maxParentEndpointDistance
Max distance between candidate parent endpoint and candidate daughter.
bool IsCloseToParentEndpoint(const pandora::CartesianVector &parentEndpoint, const pandora::Cluster *const pParentCluster3D, const pandora::Cluster *const pDaughterCluster3D) const
Whether a daughter 3D cluster is in close proximity to the endpoint of a parent 3D cluster...
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
NeutrinoHierarchyAlgorithm::PfoInfo PfoInfo
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
static bool IsNode(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxTransverseDistance)
Whether pointing vertex is adjacent to a given position.