Public Member Functions | Private Member Functions | Private Attributes | List of all members
lar_content::EndAssociatedPfosTool Class Reference

EndAssociatedPfosTool class. More...

#include <EndAssociatedPfosTool.h>

Inheritance diagram for lar_content::EndAssociatedPfosTool:
lar_content::PfoRelationTool

Public Member Functions

 EndAssociatedPfosTool ()
 Default constructor. More...
 
void Run (const NeutrinoHierarchyAlgorithm *const pAlgorithm, const pandora::Vertex *const pNeutrinoVertex, NeutrinoHierarchyAlgorithm::PfoInfoMap &pfoInfoMap)
 Run the algorithm tool. More...
 

Private Member Functions

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. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Private Attributes

float m_minNeutrinoVertexDistance
 Min distance between candidate parent endpoint and neutrino vertex. More...
 
float m_minVertexLongitudinalDistance
 Vertex association check: min longitudinal distance cut. More...
 
float m_maxVertexLongitudinalDistance
 Vertex association check: max longitudinal distance cut. More...
 
float m_maxVertexTransverseDistance
 Vertex association check: max transverse distance cut. More...
 
float m_vertexAngularAllowance
 Vertex association check: pointing angular allowance in degrees. More...
 
float m_maxParentEndpointDistance
 Max distance between candidate parent endpoint and candidate daughter. More...
 

Detailed Description

EndAssociatedPfosTool class.

Definition at line 21 of file EndAssociatedPfosTool.h.

Constructor & Destructor Documentation

lar_content::EndAssociatedPfosTool::EndAssociatedPfosTool ( )

Default constructor.

Definition at line 26 of file EndAssociatedPfosTool.cc.

26  :
33 {
34 }
float m_minNeutrinoVertexDistance
Min distance between candidate parent endpoint and neutrino vertex.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
float m_maxParentEndpointDistance
Max distance between candidate parent endpoint and candidate daughter.
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.

Member Function Documentation

bool lar_content::EndAssociatedPfosTool::IsCloseToParentEndpoint ( const pandora::CartesianVector &  parentEndpoint,
const pandora::Cluster *const  pParentCluster3D,
const pandora::Cluster *const  pDaughterCluster3D 
) const
private

Whether a daughter 3D cluster is in close proximity to the endpoint of a parent 3D cluster.

Parameters
parentEndpointthe parent endpoint position
pParentCluster3Dthe address of the parent 3D cluster
pDaughterCluster3Dthe address of the daughter 3D cluster
Returns
boolean

Definition at line 103 of file EndAssociatedPfosTool.cc.

105 {
106  try
107  {
108  CartesianVector parentPosition3D(0.f, 0.f, 0.f), daughterPosition3D(0.f, 0.f, 0.f);
109  LArClusterHelper::GetClosestPositions(pParentCluster3D, pDaughterCluster3D, parentPosition3D, daughterPosition3D);
110 
111  if (((parentPosition3D - parentEndpoint).GetMagnitude() < m_maxParentEndpointDistance) &&
112  ((parentPosition3D - daughterPosition3D).GetMagnitude() < m_maxParentEndpointDistance))
113  return true;
114  }
115  catch (const StatusCodeException &)
116  {
117  }
118 
119  return false;
120 }
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_maxParentEndpointDistance
Max distance between candidate parent endpoint and candidate daughter.
StatusCode lar_content::EndAssociatedPfosTool::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
private

Definition at line 124 of file EndAssociatedPfosTool.cc.

125 {
126  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
127  XmlHelper::ReadValue(xmlHandle, "MinNeutrinoVertexDistance", m_minNeutrinoVertexDistance));
128 
129  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
130  XmlHelper::ReadValue(xmlHandle, "MinVertexLongitudinalDistance", m_minVertexLongitudinalDistance));
131 
132  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
133  XmlHelper::ReadValue(xmlHandle, "MaxVertexLongitudinalDistance", m_maxVertexLongitudinalDistance));
134 
135  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
136  XmlHelper::ReadValue(xmlHandle, "MaxVertexTransverseDistance", m_maxVertexTransverseDistance));
137 
138  PANDORA_RETURN_RESULT_IF_AND_IF(
139  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexAngularAllowance", m_vertexAngularAllowance));
140 
141  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
142  XmlHelper::ReadValue(xmlHandle, "MaxParentEndpointDistance", m_maxParentEndpointDistance));
143 
144  return STATUS_CODE_SUCCESS;
145 }
float m_minNeutrinoVertexDistance
Min distance between candidate parent endpoint and neutrino vertex.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
float m_maxParentEndpointDistance
Max distance between candidate parent endpoint and candidate daughter.
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
void lar_content::EndAssociatedPfosTool::Run ( const NeutrinoHierarchyAlgorithm *const  pAlgorithm,
const pandora::Vertex *const  pNeutrinoVertex,
NeutrinoHierarchyAlgorithm::PfoInfoMap pfoInfoMap 
)
virtual

Run the algorithm tool.

Parameters
pAlgorithmaddress of the calling algorithm
pNeutrinoVertexthe address of the three dimensional neutrino interaction vertex
pfoInfoMapmapping from pfos to three dimensional clusters, sliding fits, vertices, etc.

Implements lar_content::PfoRelationTool.

Definition at line 38 of file EndAssociatedPfosTool.cc.

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(
63  pParentPfoInfo->IsInnerLayerAssociated() ? parentPointingCluster.GetOuterVertex() : parentPointingCluster.GetInnerVertex());
64  const float neutrinoVertexDistance((parentEndpoint.GetPosition() - pNeutrinoVertex->GetPosition()).GetMagnitude());
65 
66  if (neutrinoVertexDistance < m_minNeutrinoVertexDistance)
67  continue;
68 
69  for (const ParticleFlowObject *const pPfo : unassignedPfos)
70  {
71  if (recentlyAssigned.count(pPfo))
72  continue;
73 
74  PfoInfo *const pPfoInfo(pfoInfoMap.at(pPfo));
75 
76  const LArPointingCluster pointingCluster(*(pPfoInfo->GetSlidingFitResult3D()));
77  const bool useInner((pointingCluster.GetInnerVertex().GetPosition() - parentEndpoint.GetPosition()).GetMagnitudeSquared() <
78  (pointingCluster.GetOuterVertex().GetPosition() - parentEndpoint.GetPosition()).GetMagnitudeSquared());
79 
80  const LArPointingCluster::Vertex &daughterVertex(useInner ? pointingCluster.GetInnerVertex() : pointingCluster.GetOuterVertex());
81 
82  if (LArPointingClusterHelper::IsNode(parentEndpoint.GetPosition(), daughterVertex, m_minVertexLongitudinalDistance, m_maxVertexTransverseDistance) ||
84  LArPointingClusterHelper::IsEmission(parentEndpoint.GetPosition(), daughterVertex, m_minVertexLongitudinalDistance,
86  LArPointingClusterHelper::IsEmission(daughterVertex.GetPosition(), parentEndpoint, m_minVertexLongitudinalDistance,
88  this->IsCloseToParentEndpoint(parentEndpoint.GetPosition(), pParentPfoInfo->GetCluster3D(), pPfoInfo->GetCluster3D()))
89  {
90  associationsMade = true;
91  pParentPfoInfo->AddDaughterPfo(pPfoInfo->GetThisPfo());
92  pPfoInfo->SetParentPfo(pParentPfoInfo->GetThisPfo());
93  pPfoInfo->SetInnerLayerAssociation(useInner);
94  recentlyAssigned.insert(pPfoInfo->GetThisPfo());
95  }
96  }
97  }
98  }
99 }
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.
float m_vertexAngularAllowance
Vertex association check: pointing angular allowance in degrees.
float m_maxVertexLongitudinalDistance
Vertex association check: max longitudinal distance cut.
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...
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
float m_maxVertexTransverseDistance
Vertex association check: max transverse distance cut.
NeutrinoHierarchyAlgorithm::PfoInfo PfoInfo
float m_minVertexLongitudinalDistance
Vertex association check: min longitudinal distance cut.
QTextStream & endl(QTextStream &s)
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.

Member Data Documentation

float lar_content::EndAssociatedPfosTool::m_maxParentEndpointDistance
private

Max distance between candidate parent endpoint and candidate daughter.

Definition at line 52 of file EndAssociatedPfosTool.h.

float lar_content::EndAssociatedPfosTool::m_maxVertexLongitudinalDistance
private

Vertex association check: max longitudinal distance cut.

Definition at line 49 of file EndAssociatedPfosTool.h.

float lar_content::EndAssociatedPfosTool::m_maxVertexTransverseDistance
private

Vertex association check: max transverse distance cut.

Definition at line 50 of file EndAssociatedPfosTool.h.

float lar_content::EndAssociatedPfosTool::m_minNeutrinoVertexDistance
private

Min distance between candidate parent endpoint and neutrino vertex.

Definition at line 47 of file EndAssociatedPfosTool.h.

float lar_content::EndAssociatedPfosTool::m_minVertexLongitudinalDistance
private

Vertex association check: min longitudinal distance cut.

Definition at line 48 of file EndAssociatedPfosTool.h.

float lar_content::EndAssociatedPfosTool::m_vertexAngularAllowance
private

Vertex association check: pointing angular allowance in degrees.

Definition at line 51 of file EndAssociatedPfosTool.h.


The documentation for this class was generated from the following files: