LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
DeltaRaySplittingAlgorithm.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
14 
15 using namespace pandora;
16 
17 namespace lar_content
18 {
19 
20 DeltaRaySplittingAlgorithm::DeltaRaySplittingAlgorithm() :
21  m_stepSize(1.f),
22  m_maxTransverseDisplacement(1.5f),
23  m_maxLongitudinalDisplacement(10.f),
24  m_minCosRelativeAngle(0.985f)
25 {
26 }
27 
28 //------------------------------------------------------------------------------------------------------------------------------------------
29 
30 void DeltaRaySplittingAlgorithm::FindBestSplitPosition(const TwoDSlidingFitResult &branchSlidingFit, const TwoDSlidingFitResult &principalSlidingFit,
31  CartesianVector &principalStartPosition, CartesianVector &branchSplitPosition, CartesianVector &branchSplitDirection) const
32 {
33  // Conventions:
34  // (1) Delta ray is split from the branch cluster
35  // (2) Delta ray occurs where the vertex of the principal cluster meets the vertex of the branch cluster
36  // Method loops over the inner and outer positions of the principal and branch clusters, trying all
37  // possible assignments of vertex and end position until a split is found
38 
39  for (unsigned int principalForward = 0; principalForward < 2; ++principalForward)
40  {
41  const CartesianVector principalVertex(1==principalForward ? principalSlidingFit.GetGlobalMinLayerPosition() : principalSlidingFit.GetGlobalMaxLayerPosition());
42  const CartesianVector principalEnd(1==principalForward ? principalSlidingFit.GetGlobalMaxLayerPosition() : principalSlidingFit.GetGlobalMinLayerPosition());
43  const CartesianVector principalDirection(1==principalForward ? principalSlidingFit.GetGlobalMinLayerDirection() : principalSlidingFit.GetGlobalMaxLayerDirection() * -1.f);
44 
45  if (LArClusterHelper::GetClosestDistance(principalVertex, branchSlidingFit.GetCluster()) > m_maxLongitudinalDisplacement)
46  continue;
47 
48  for (unsigned int branchForward = 0; branchForward < 2; ++branchForward)
49  {
50  const CartesianVector branchVertex(1==branchForward ? branchSlidingFit.GetGlobalMinLayerPosition() : branchSlidingFit.GetGlobalMaxLayerPosition());
51  const CartesianVector branchEnd(1==branchForward ? branchSlidingFit.GetGlobalMaxLayerPosition() : branchSlidingFit.GetGlobalMinLayerPosition());
52  const CartesianVector branchDirection(1==branchForward ? branchSlidingFit.GetGlobalMinLayerDirection() : branchSlidingFit.GetGlobalMaxLayerDirection() * -1.f);
53 
54  // Require vertices to be closest two ends
55  const float vertex_to_vertex((principalVertex - branchVertex).GetMagnitudeSquared());
56  const float vertex_to_end((principalVertex - branchEnd).GetMagnitudeSquared());
57  const float end_to_vertex((principalEnd - branchVertex).GetMagnitudeSquared());
58  const float end_to_end((principalEnd - branchEnd).GetMagnitudeSquared());
59 
60  // (sign convention for vertexProjection: positive means that clusters overlap)
61  const float vertexProjection(+branchDirection.GetDotProduct(principalVertex - branchVertex));
62  const float cosRelativeAngle(-branchDirection.GetDotProduct(principalDirection));
63 
64  if (vertex_to_vertex > std::min(end_to_end, std::min(vertex_to_end, end_to_vertex)))
65  continue;
66 
67  if (end_to_end < std::max(vertex_to_vertex, std::max(vertex_to_end, end_to_vertex)))
68  continue;
69 
70  if (vertexProjection < 0.f && cosRelativeAngle > m_minCosRelativeAngle)
71  continue;
72 
73  if (cosRelativeAngle < 0.f)
74  continue;
75 
76  // Serach for a split by winding back the branch cluster sliding fit
77  bool foundSplit(false);
78 
79  const float halfWindowLength(branchSlidingFit.GetLayerFitHalfWindowLength());
80  const float deltaL(1==branchForward ? +halfWindowLength : -halfWindowLength);
81 
82  float branchDistance(std::max(0.f,vertexProjection) + 0.5f * m_stepSize);
83 
84  while (!foundSplit)
85  {
86  branchDistance += m_stepSize;
87 
88  const CartesianVector linearProjection(branchVertex + branchDirection * branchDistance);
89 
90  if (principalDirection.GetDotProduct(linearProjection - principalVertex) < -m_maxLongitudinalDisplacement)
91  break;
92 
93  if ((linearProjection - branchVertex).GetMagnitudeSquared() > (linearProjection - branchEnd).GetMagnitudeSquared())
94  break;
95 
96  float localL(0.f), localT(0.f);
97  CartesianVector truncatedPosition(0.f,0.f,0.f);
98  CartesianVector forwardDirection(0.f,0.f,0.f);
99  branchSlidingFit.GetLocalPosition(linearProjection, localL, localT);
100 
101  if ((STATUS_CODE_SUCCESS != branchSlidingFit.GetGlobalFitPosition(localL, truncatedPosition)) ||
102  (STATUS_CODE_SUCCESS != branchSlidingFit.GetGlobalFitDirection(localL + deltaL, forwardDirection)))
103  {
104  continue;
105  }
106 
107  CartesianVector truncatedDirection(1==branchForward ? forwardDirection : forwardDirection * -1.f);
108  const float cosTheta(-truncatedDirection.GetDotProduct(principalDirection));
109 
110  float rT1(0.f), rL1(0.f), rT2(0.f), rL2(0.f);
111  LArPointingClusterHelper::GetImpactParameters(truncatedPosition, truncatedDirection, principalVertex, rL1, rT1);
112  LArPointingClusterHelper::GetImpactParameters(principalVertex, principalDirection, truncatedPosition, rL2, rT2);
113 
114  if ((cosTheta > m_minCosRelativeAngle) && (rT1 < m_maxTransverseDisplacement) && (rT2 < m_maxTransverseDisplacement))
115  {
116  foundSplit = true;
117  principalStartPosition = principalVertex;
118  branchSplitPosition = truncatedPosition;
119  branchSplitDirection = truncatedDirection * -1.f;
120  }
121  }
122 
123  if (foundSplit)
124  return;
125  }
126  }
127 
128  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
129 }
130 
131 //------------------------------------------------------------------------------------------------------------------------------------------
132 
133 StatusCode DeltaRaySplittingAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
134 {
135  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
136  "StepSize", m_stepSize));
137 
138  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
139  "MaxTransverseDisplacement", m_maxTransverseDisplacement));
140 
141  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
142  "MaxLongitudinalDisplacement", m_maxLongitudinalDisplacement));
143 
144  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
145  "MinCosRelativeAngle", m_minCosRelativeAngle));
146 
148 }
149 
150 } // namespace lar_content
static void GetImpactParameters(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices.
void FindBestSplitPosition(const TwoDSlidingFitResult &branchSlidingFit, const TwoDSlidingFitResult &replacementSlidingFit, pandora::CartesianVector &replacementStartPosition, pandora::CartesianVector &branchSplitPosition, pandora::CartesianVector &branchSplitDirection) const
Output the best split positions in branch and replacement clusters.
float GetLayerFitHalfWindowLength() const
Get the layer fit half window length.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
pandora::CartesianVector GetGlobalMinLayerDirection() const
Get global direction corresponding to the fit result in minimum fit layer.
TFile f
Definition: plotHisto.C:6
Int_t max
Definition: plot.C:27
Header file for the delta ray splitting algorithm class.
pandora::StatusCode GetGlobalFitPosition(const float rL, pandora::CartesianVector &position) const
Get global fit position for a given longitudinal coordinate.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const
Get global fit direction for a given longitudinal coordinate.
Int_t min
Definition: plot.C:26
pandora::CartesianVector GetGlobalMaxLayerDirection() const
Get global direction corresponding to the fit result in maximum fit layer.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.