All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
lar_content::UndershootTracksTool Class Reference

UndershootTracksTool class. More...

#include <UndershootTracksTool.h>

Inheritance diagram for lar_content::UndershootTracksTool:
lar_content::ThreeDKinkBaseTool lar_content::TransverseTensorTool

Classes

class  Particle
 Particle class. More...
 

Public Member Functions

 UndershootTracksTool ()
 Default constructor. More...
 
- Public Member Functions inherited from lar_content::ThreeDKinkBaseTool
 ThreeDKinkBaseTool (const unsigned int nCommonClusters)
 Constructor. More...
 
virtual ~ThreeDKinkBaseTool ()
 Destructor. More...
 
bool Run (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
 Run the algorithm tool. More...
 

Private Member Functions

void GetIteratorListModifications (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const IteratorList &iteratorList, ModificationList &modificationList) const
 Get modification objects for a specific elements of the tensor, identifying required splits and merges for clusters. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
bool IsThreeDKink (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const Particle &particle, const pandora::CartesianVector &splitPosition, const bool isALowestInX) const
 Whether the provided particle is consistent with being a kink, when examined in three dimensions at the provided split position. More...
 

Private Attributes

bool m_splitMode
 Whether to run in cluster splitting mode, as opposed to cluster merging mode. More...
 
float m_maxTransverseImpactParameter
 The maximum transverse impact parameter for connecting broken clusters. More...
 
float m_minImpactParameterCosTheta
 The minimum cos theta (angle between vertex directions) for connecting broken clusters. More...
 
float m_cosThetaCutForKinkSearch
 The cos theta cut used for the kink search in three dimensions. More...
 

Additional Inherited Members

- Public Types inherited from lar_content::TransverseTensorTool
typedef
ThreeViewTransverseTracksAlgorithm::MatchingType::TensorType 
TensorType
 
typedef std::vector
< TensorType::ElementList::const_iterator
IteratorList
 
- Protected Types inherited from lar_content::ThreeDKinkBaseTool
typedef std::vector< ModificationModificationList
 
- Protected Member Functions inherited from lar_content::ThreeDKinkBaseTool
virtual bool PassesElementCuts (TensorType::ElementList::const_iterator eIter, const pandora::ClusterSet &usedClusters) const
 Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identification. More...
 
float GetXSamplingPoint (const pandora::CartesianVector &splitPosition1, const bool isForwardInX, const TwoDSlidingFitResult &fitResult1, const TwoDSlidingFitResult &fitResult2, const TwoDSlidingFitResult &fitResult3) const
 Get a sampling point in x that is common to sliding linear fit objects in three views. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
- Static Protected Member Functions inherited from lar_content::ThreeDKinkBaseTool
static bool IsALowestInX (const LArPointingCluster &pointingClusterA, const LArPointingCluster &pointingClusterB)
 Whether pointing cluster labelled A extends to lowest x positions (as opposed to that labelled B) More...
 
- Protected Attributes inherited from lar_content::ThreeDKinkBaseTool
unsigned int m_nCommonClusters
 The number of common clusters. More...
 
bool m_majorityRulesMode
 Whether to run in majority rules mode (always split overshoots, always merge undershoots) More...
 
float m_minMatchedFraction
 The min matched sampling point fraction for use as a key tensor element. More...
 
unsigned int m_minMatchedSamplingPoints
 The min number of matched sampling points for use as a key tensor element. More...
 
float m_minLongitudinalImpactParameter
 The min longitudinal impact parameter for connecting accompanying clusters. More...
 
int m_nLayersForKinkSearch
 The number of sliding fit layers to step in the kink search. More...
 
float m_additionalXStepForKinkSearch
 An additional (safety) step to tack-on when choosing x sampling points. More...
 

Detailed Description

UndershootTracksTool class.

Definition at line 19 of file UndershootTracksTool.h.

Constructor & Destructor Documentation

lar_content::UndershootTracksTool::UndershootTracksTool ( )

Default constructor.

Definition at line 24 of file UndershootTracksTool.cc.

24  :
26  m_splitMode(false),
30 {
31 }
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
float m_minImpactParameterCosTheta
The minimum cos theta (angle between vertex directions) for connecting broken clusters.
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
ThreeDKinkBaseTool(const unsigned int nCommonClusters)
Constructor.
float m_maxTransverseImpactParameter
The maximum transverse impact parameter for connecting broken clusters.

Member Function Documentation

void lar_content::UndershootTracksTool::GetIteratorListModifications ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const IteratorList iteratorList,
ModificationList modificationList 
) const
privatevirtual

Get modification objects for a specific elements of the tensor, identifying required splits and merges for clusters.

Parameters
pAlgorithmaddress of the calling algorithm
iteratorListlist of iterators to relevant tensor elements
modificationListto be populated with modifications

Implements lar_content::ThreeDKinkBaseTool.

Definition at line 35 of file UndershootTracksTool.cc.

37 {
38  for (IteratorList::const_iterator iIter1 = iteratorList.begin(), iIter1End = iteratorList.end(); iIter1 != iIter1End; ++iIter1)
39  {
40  for (IteratorList::const_iterator iIter2 = iIter1; iIter2 != iIter1End; ++iIter2)
41  {
42  if (iIter1 == iIter2)
43  continue;
44 
45  try
46  {
47  const unsigned int nMatchedSamplingPoints1((*iIter1)->GetOverlapResult().GetNMatchedSamplingPoints());
48  const unsigned int nMatchedSamplingPoints2((*iIter2)->GetOverlapResult().GetNMatchedSamplingPoints());
49  IteratorList::const_iterator iIterA((nMatchedSamplingPoints1 >= nMatchedSamplingPoints2) ? iIter1 : iIter2);
50  IteratorList::const_iterator iIterB((nMatchedSamplingPoints1 >= nMatchedSamplingPoints2) ? iIter2 : iIter1);
51 
52  Particle particle(*(*iIterA), *(*iIterB));
53  const LArPointingCluster pointingClusterA(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA));
54  const LArPointingCluster pointingClusterB(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB));
55 
56  LArPointingCluster::Vertex vertexA, vertexB;
57  LArPointingClusterHelper::GetClosestVertices(pointingClusterA, pointingClusterB, vertexA, vertexB);
58 
59  float transverseAB(std::numeric_limits<float>::max()), transverseBA(std::numeric_limits<float>::max());
60  float longitudinalAB(-std::numeric_limits<float>::max()), longitudinalBA(-std::numeric_limits<float>::max());
61 
62  LArPointingClusterHelper::GetImpactParameters(vertexA, vertexB, longitudinalAB, transverseAB);
63  LArPointingClusterHelper::GetImpactParameters(vertexB, vertexA, longitudinalBA, transverseBA);
64 
65  if (std::min(longitudinalAB, longitudinalBA) < m_minLongitudinalImpactParameter)
66  continue;
67 
68  if (std::min(transverseAB, transverseBA) > m_maxTransverseImpactParameter)
69  continue;
70 
71  const float cosTheta(-vertexA.GetDirection().GetCosOpeningAngle(vertexB.GetDirection()));
72 
73  if (cosTheta < m_minImpactParameterCosTheta)
74  continue;
75 
76  const bool isALowestInX(this->IsALowestInX(pointingClusterA, pointingClusterB));
77  const CartesianVector splitPosition((vertexA.GetPosition() + vertexB.GetPosition()) * 0.5f);
78  const bool isThreeDKink(m_majorityRulesMode ? false : this->IsThreeDKink(pAlgorithm, particle, splitPosition, isALowestInX));
79 
80  if (isThreeDKink != m_splitMode)
81  continue;
82 
83  // Construct the modification object
84  Modification modification;
85 
86  if (m_splitMode)
87  {
88  const TwoDSlidingFitResult &fitResult1(pAlgorithm->GetCachedSlidingFitResult(particle.m_pCommonCluster1));
89  const TwoDSlidingFitResult &fitResult2(pAlgorithm->GetCachedSlidingFitResult(particle.m_pCommonCluster2));
90 
91  CartesianVector splitPosition1(0.f, 0.f, 0.f), splitPosition2(0.f, 0.f, 0.f);
92  if ((STATUS_CODE_SUCCESS != fitResult1.GetGlobalFitPositionAtX(splitPosition.GetX(), splitPosition1)) ||
93  (STATUS_CODE_SUCCESS != fitResult2.GetGlobalFitPositionAtX(splitPosition.GetX(), splitPosition2)))
94  {
95  continue;
96  }
97 
98  modification.m_splitPositionMap[particle.m_pCommonCluster1].push_back(splitPosition1);
99  modification.m_splitPositionMap[particle.m_pCommonCluster2].push_back(splitPosition2);
100  }
101  else
102  {
103  const bool vertexAIsLowX(vertexA.GetPosition().GetX() < vertexB.GetPosition().GetX());
104  const Cluster *const pLowXCluster(vertexAIsLowX ? particle.m_pClusterA : particle.m_pClusterB);
105  const Cluster *const pHighXCluster(vertexAIsLowX ? particle.m_pClusterB : particle.m_pClusterA);
106  modification.m_clusterMergeMap[pLowXCluster].push_back(pHighXCluster);
107  }
108 
109  modification.m_affectedClusters.push_back(particle.m_pClusterA);
110  modification.m_affectedClusters.push_back(particle.m_pClusterB);
111  modification.m_affectedClusters.push_back(particle.m_pCommonCluster1);
112  modification.m_affectedClusters.push_back(particle.m_pCommonCluster2);
113 
114  modificationList.push_back(modification);
115  }
116  catch (StatusCodeException &statusCodeException)
117  {
118  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
119  throw statusCodeException;
120 
121  continue;
122  }
123  }
124  }
125 }
static void GetImpactParameters(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices.
static void GetClosestVertices(const bool useX, const bool useY, const bool useZ, const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, receive the closest or farthest pair of vertices.
float m_minImpactParameterCosTheta
The minimum cos theta (angle between vertex directions) for connecting broken clusters.
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
static bool IsALowestInX(const LArPointingCluster &pointingClusterA, const LArPointingCluster &pointingClusterB)
Whether pointing cluster labelled A extends to lowest x positions (as opposed to that labelled B) ...
bool IsThreeDKink(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const Particle &particle, const pandora::CartesianVector &splitPosition, const bool isALowestInX) const
Whether the provided particle is consistent with being a kink, when examined in three dimensions at t...
bool m_majorityRulesMode
Whether to run in majority rules mode (always split overshoots, always merge undershoots) ...
float m_minLongitudinalImpactParameter
The min longitudinal impact parameter for connecting accompanying clusters.
float m_maxTransverseImpactParameter
The maximum transverse impact parameter for connecting broken clusters.
bool lar_content::UndershootTracksTool::IsThreeDKink ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const Particle particle,
const pandora::CartesianVector &  splitPosition,
const bool  isALowestInX 
) const
private

Whether the provided particle is consistent with being a kink, when examined in three dimensions at the provided split position.

Parameters
pAlgorithmthe calling algorithm
particlethe particle
splitPositionthe candidate split position
isALowestInXwhether cluster associated with tensor element a extends to lowest x positions
Returns
boolean

Definition at line 129 of file UndershootTracksTool.cc.

131 {
132  try
133  {
134  const TwoDSlidingFitResult &fitResultCommon1(pAlgorithm->GetCachedSlidingFitResult(particle.m_pCommonCluster1));
135  const TwoDSlidingFitResult &fitResultCommon2(pAlgorithm->GetCachedSlidingFitResult(particle.m_pCommonCluster2));
136  const TwoDSlidingFitResult &lowXFitResult(isALowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA)
137  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB));
138  const TwoDSlidingFitResult &highXFitResult(isALowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB)
139  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA));
140 
141  const float minusX(this->GetXSamplingPoint(splitPosition, false, lowXFitResult, fitResultCommon1, fitResultCommon2));
142  const float plusX(this->GetXSamplingPoint(splitPosition, true, highXFitResult, fitResultCommon1, fitResultCommon2));
143  const float splitX(splitPosition.GetX());
144 
145  CartesianVector minus1(0.f, 0.f, 0.f), split1(0.f, 0.f, 0.f), plus1(0.f, 0.f, 0.f);
146  CartesianVector minus2(0.f, 0.f, 0.f), split2(0.f, 0.f, 0.f), plus2(0.f, 0.f, 0.f);
147  CartesianVector minus3(0.f, 0.f, 0.f), split3(splitPosition), plus3(0.f, 0.f, 0.f);
148 
149  if ((STATUS_CODE_SUCCESS != fitResultCommon1.GetGlobalFitPositionAtX(minusX, minus1)) ||
150  (STATUS_CODE_SUCCESS != fitResultCommon1.GetGlobalFitPositionAtX(splitX, split1)) ||
151  (STATUS_CODE_SUCCESS != fitResultCommon1.GetGlobalFitPositionAtX(plusX, plus1)) ||
152  (STATUS_CODE_SUCCESS != fitResultCommon2.GetGlobalFitPositionAtX(minusX, minus2)) ||
153  (STATUS_CODE_SUCCESS != fitResultCommon2.GetGlobalFitPositionAtX(splitX, split2)) ||
154  (STATUS_CODE_SUCCESS != fitResultCommon2.GetGlobalFitPositionAtX(plusX, plus2)) ||
155  (STATUS_CODE_SUCCESS != lowXFitResult.GetGlobalFitPositionAtX(minusX, minus3)) ||
156  (STATUS_CODE_SUCCESS != highXFitResult.GetGlobalFitPositionAtX(plusX, plus3)))
157  {
158  return false; // majority rules, by default
159  }
160 
161  // Extract results
162  const HitType hitType1(LArClusterHelper::GetClusterHitType(particle.m_pCommonCluster1));
163  const HitType hitType2(LArClusterHelper::GetClusterHitType(particle.m_pCommonCluster2));
164  const HitType hitType3(LArClusterHelper::GetClusterHitType(particle.m_pClusterA));
165 
166  CartesianVector minus(0.f, 0.f, 0.f), split(0.f, 0.f, 0.f), plus(0.f, 0.f, 0.f);
167  float chi2Minus(std::numeric_limits<float>::max()), chi2Split(std::numeric_limits<float>::max()),
168  chi2Plus(std::numeric_limits<float>::max());
169  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, minus1, minus2, minus3, minus, chi2Minus);
170  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, split1, split2, split3, split, chi2Split);
171  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, plus1, plus2, plus3, plus, chi2Plus);
172 
173  // Apply final cuts
174  const CartesianVector minusToSplit((split - minus).GetUnitVector());
175  const CartesianVector splitToPlus((plus - split).GetUnitVector());
176  const float dotProduct(minusToSplit.GetDotProduct(splitToPlus));
177 
178  if (dotProduct < m_cosThetaCutForKinkSearch)
179  return true;
180  }
181  catch (StatusCodeException &s)
182  {
183  }
184 
185  return false;
186 }
float GetXSamplingPoint(const pandora::CartesianVector &splitPosition1, const bool isForwardInX, const TwoDSlidingFitResult &fitResult1, const TwoDSlidingFitResult &fitResult2, const TwoDSlidingFitResult &fitResult3) const
Get a sampling point in x that is common to sliding linear fit objects in three views.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
static void MergeThreePositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::HitType view3, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, const pandora::CartesianVector &position3, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from three views to give unified 3D position.
then echo File list $list not found else cat $list while read file do echo $file sed s
Definition: file_to_url.sh:60
StatusCode lar_content::UndershootTracksTool::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
private

Definition at line 215 of file UndershootTracksTool.cc.

216 {
217  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SplitMode", m_splitMode));
218 
219  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
220  XmlHelper::ReadValue(xmlHandle, "MaxTransverseImpactParameter", m_maxTransverseImpactParameter));
221 
222  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
223  XmlHelper::ReadValue(xmlHandle, "MinImpactParameterCosTheta", m_minImpactParameterCosTheta));
224 
225  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
226  XmlHelper::ReadValue(xmlHandle, "CosThetaCutForKinkSearch", m_cosThetaCutForKinkSearch));
227 
228  return ThreeDKinkBaseTool::ReadSettings(xmlHandle);
229 }
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
float m_minImpactParameterCosTheta
The minimum cos theta (angle between vertex directions) for connecting broken clusters.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
float m_maxTransverseImpactParameter
The maximum transverse impact parameter for connecting broken clusters.

Member Data Documentation

float lar_content::UndershootTracksTool::m_cosThetaCutForKinkSearch
private

The cos theta cut used for the kink search in three dimensions.

Definition at line 68 of file UndershootTracksTool.h.

float lar_content::UndershootTracksTool::m_maxTransverseImpactParameter
private

The maximum transverse impact parameter for connecting broken clusters.

Definition at line 66 of file UndershootTracksTool.h.

float lar_content::UndershootTracksTool::m_minImpactParameterCosTheta
private

The minimum cos theta (angle between vertex directions) for connecting broken clusters.

Definition at line 67 of file UndershootTracksTool.h.

bool lar_content::UndershootTracksTool::m_splitMode
private

Whether to run in cluster splitting mode, as opposed to cluster merging mode.

Definition at line 65 of file UndershootTracksTool.h.


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