LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
lar_content::OvershootTracksTool Class Reference

OvershootTracksTool class. More...

#include "OvershootTracksTool.h"

Inheritance diagram for lar_content::OvershootTracksTool:
lar_content::ThreeDKinkBaseTool lar_content::TransverseTensorTool

Classes

class  Particle
 Particle class. More...
 

Public Types

typedef ThreeViewTransverseTracksAlgorithm::MatchingType::TensorType TensorType
 
typedef std::vector< TensorType::ElementList::const_iteratorIteratorList
 

Public Member Functions

 OvershootTracksTool ()
 Default constructor. More...
 
bool Run (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
 Run the algorithm tool. More...
 

Protected Types

typedef std::vector< ModificationModificationList
 

Protected Member Functions

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...
 

Static Protected Member Functions

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

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...
 

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 PassesVertexCuts (const LArPointingCluster::Vertex &vertexA, const LArPointingCluster::Vertex &vertexB) const
 Whether a pair of vertices pass longitudinal projection cuts. More...
 
void SetSplitPosition (const LArPointingCluster::Vertex &vertexA1, const LArPointingCluster::Vertex &vertexA2, const LArPointingCluster::Vertex &vertexB1, const LArPointingCluster::Vertex &vertexB2, Particle &particle) const
 Set split position for a provided particle. More...
 
bool IsThreeDKink (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const Particle &particle, const bool isA1LowestInX, const bool isA2LowestInX) const
 Whether the provided particle is consistent with being a kink, when examined in three dimensions at the split position. More...
 

Private Attributes

bool m_splitMode
 Whether to run in cluster splitting mode, as opposed to cluster merging mode. More...
 
float m_maxVertexXSeparation
 The max separation between accompanying clusters vertex x positions to make split. More...
 
float m_cosThetaCutForKinkSearch
 The cos theta cut used for the kink search in three dimensions. More...
 

Detailed Description

OvershootTracksTool class.

Definition at line 19 of file OvershootTracksTool.h.

Member Typedef Documentation

typedef std::vector<Modification> lar_content::ThreeDKinkBaseTool::ModificationList
protectedinherited

Definition at line 50 of file ThreeDKinkBaseTool.h.

Constructor & Destructor Documentation

lar_content::OvershootTracksTool::OvershootTracksTool ( )

Default constructor.

Definition at line 22 of file OvershootTracksTool.cc.

22  :
24  m_splitMode(true),
27 {
28 }
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
TFile f
Definition: plotHisto.C:6
float m_maxVertexXSeparation
The max separation between accompanying clusters vertex x positions to make split.
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
ThreeDKinkBaseTool(const unsigned int nCommonClusters)
Constructor.

Member Function Documentation

void lar_content::OvershootTracksTool::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 32 of file OvershootTracksTool.cc.

References lar_content::NViewTrackMatchingAlgorithm< T >::GetCachedSlidingFitResult(), lar_content::LArPointingClusterHelper::GetClosestVerticesInX(), lar_content::ThreeDKinkBaseTool::IsALowestInX(), IsThreeDKink(), lar_content::ThreeDKinkBaseTool::Modification::m_affectedClusters, lar_content::ThreeDKinkBaseTool::Modification::m_clusterMergeMap, lar_content::ThreeDKinkBaseTool::m_majorityRulesMode, lar_content::OvershootTracksTool::Particle::m_pClusterA1, lar_content::OvershootTracksTool::Particle::m_pClusterA2, lar_content::OvershootTracksTool::Particle::m_pClusterB1, lar_content::OvershootTracksTool::Particle::m_pClusterB2, lar_content::OvershootTracksTool::Particle::m_pCommonCluster, m_splitMode, lar_content::OvershootTracksTool::Particle::m_splitPosition, lar_content::ThreeDKinkBaseTool::Modification::m_splitPositionMap, PassesVertexCuts(), and SetSplitPosition().

34 {
35  for (IteratorList::const_iterator iIter1 = iteratorList.begin(), iIter1End = iteratorList.end(); iIter1 != iIter1End; ++iIter1)
36  {
37  for (IteratorList::const_iterator iIter2 = iIter1; iIter2 != iIter1End; ++iIter2)
38  {
39  if (iIter1 == iIter2)
40  continue;
41 
42  try
43  {
44  const unsigned int nMatchedSamplingPoints1((*iIter1)->GetOverlapResult().GetNMatchedSamplingPoints());
45  const unsigned int nMatchedSamplingPoints2((*iIter2)->GetOverlapResult().GetNMatchedSamplingPoints());
46  IteratorList::const_iterator iIterA((nMatchedSamplingPoints1 >= nMatchedSamplingPoints2) ? iIter1 : iIter2);
47  IteratorList::const_iterator iIterB((nMatchedSamplingPoints1 >= nMatchedSamplingPoints2) ? iIter2 : iIter1);
48 
49  Particle particle(*(*iIterA), *(*iIterB));
50  const LArPointingCluster pointingClusterA1(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA1));
51  const LArPointingCluster pointingClusterB1(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB1));
52  const LArPointingCluster pointingClusterA2(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA2));
53  const LArPointingCluster pointingClusterB2(pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB2));
54 
55  LArPointingCluster::Vertex vertexA1, vertexB1, vertexA2, vertexB2;
56  LArPointingClusterHelper::GetClosestVerticesInX(pointingClusterA1, pointingClusterB1, vertexA1, vertexB1);
57  LArPointingClusterHelper::GetClosestVerticesInX(pointingClusterA2, pointingClusterB2, vertexA2, vertexB2);
58 
59  if (!this->PassesVertexCuts(vertexA1, vertexB1) || !this->PassesVertexCuts(vertexA2, vertexB2))
60  continue;
61 
62  this->SetSplitPosition(vertexA1, vertexA2, vertexB1, vertexB2, particle);
63 
64  const bool isA1LowestInX(this->IsALowestInX(pointingClusterA1, pointingClusterB1));
65  const bool isA2LowestInX(this->IsALowestInX(pointingClusterA2, pointingClusterB2));
66  const bool isThreeDKink(m_majorityRulesMode ? true : this->IsThreeDKink(pAlgorithm, particle, isA1LowestInX, isA2LowestInX));
67 
68  if (isThreeDKink != m_splitMode)
69  continue;
70 
71  // Construct the modification object
72  Modification modification;
73 
74  if (m_splitMode)
75  {
76  modification.m_splitPositionMap[particle.m_pCommonCluster].push_back(particle.m_splitPosition);
77  }
78  else
79  {
80  const bool vertex1AIsLowX(vertexA1.GetPosition().GetX() < vertexB1.GetPosition().GetX());
81  const Cluster *const pLowXCluster1(vertex1AIsLowX ? particle.m_pClusterA1 : particle.m_pClusterB1);
82  const Cluster *const pHighXCluster1(vertex1AIsLowX ? particle.m_pClusterB1 : particle.m_pClusterA1);
83  modification.m_clusterMergeMap[pLowXCluster1].push_back(pHighXCluster1);
84 
85  const bool vertex2AIsLowX(vertexA2.GetPosition().GetX() < vertexB2.GetPosition().GetX());
86  const Cluster *const pLowXCluster2(vertex2AIsLowX ? particle.m_pClusterA2 : particle.m_pClusterB2);
87  const Cluster *const pHighXCluster2(vertex2AIsLowX ? particle.m_pClusterB2 : particle.m_pClusterA2);
88  modification.m_clusterMergeMap[pLowXCluster2].push_back(pHighXCluster2);
89  }
90 
91  modification.m_affectedClusters.push_back(particle.m_pCommonCluster);
92  modification.m_affectedClusters.push_back(particle.m_pClusterA1);
93  modification.m_affectedClusters.push_back(particle.m_pClusterA2);
94  modification.m_affectedClusters.push_back(particle.m_pClusterB1);
95  modification.m_affectedClusters.push_back(particle.m_pClusterB2);
96 
97  modificationList.push_back(modification);
98  }
99  catch (StatusCodeException &statusCodeException)
100  {
101  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
102  throw statusCodeException;
103 
104  continue;
105  }
106  }
107  }
108 }
bool IsThreeDKink(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const Particle &particle, const bool isA1LowestInX, const bool isA2LowestInX) const
Whether the provided particle is consistent with being a kink, when examined in three dimensions at t...
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
void SetSplitPosition(const LArPointingCluster::Vertex &vertexA1, const LArPointingCluster::Vertex &vertexA2, const LArPointingCluster::Vertex &vertexB1, const LArPointingCluster::Vertex &vertexB2, Particle &particle) const
Set split position for a provided particle.
intermediate_table::const_iterator const_iterator
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 PassesVertexCuts(const LArPointingCluster::Vertex &vertexA, const LArPointingCluster::Vertex &vertexB) const
Whether a pair of vertices pass longitudinal projection cuts.
static void GetClosestVerticesInX(const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, find the pair of vertices with smallest x-separation.
bool m_majorityRulesMode
Whether to run in majority rules mode (always split overshoots, always merge undershoots) ...
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
float lar_content::ThreeDKinkBaseTool::GetXSamplingPoint ( const pandora::CartesianVector &  splitPosition1,
const bool  isForwardInX,
const TwoDSlidingFitResult fitResult1,
const TwoDSlidingFitResult fitResult2,
const TwoDSlidingFitResult fitResult3 
) const
protectedinherited

Get a sampling point in x that is common to sliding linear fit objects in three views.

Parameters
splitPosition1the split position in view 1
isForwardInXwhether to work forwards (or backwards) in x
fitResult1the sliding fit result in view 1
fitResult2the sliding fit result in view 2
fitResult3the sliding fit result in view 3
Returns
the sampling point

Definition at line 59 of file ThreeDKinkBaseTool.cc.

References f, lar_content::TwoDSlidingFitResult::GetGlobalFitPosition(), lar_content::TwoDSlidingFitResult::GetL(), lar_content::TwoDSlidingFitResult::GetLayer(), lar_content::TwoDSlidingFitResult::GetLocalPosition(), lar_content::TwoDSlidingFitResult::GetMaxLayer(), lar_content::TwoDSlidingFitResult::GetMinAndMaxX(), lar_content::TwoDSlidingFitResult::GetMinLayer(), lar_content::ThreeDKinkBaseTool::m_additionalXStepForKinkSearch, and lar_content::ThreeDKinkBaseTool::m_nLayersForKinkSearch.

Referenced by lar_content::UndershootTracksTool::IsThreeDKink(), and IsThreeDKink().

61 {
62  // Nearest common x position
63  float xMin1(std::numeric_limits<float>::max()), xMax1(-std::numeric_limits<float>::max());
64  float xMin2(std::numeric_limits<float>::max()), xMax2(-std::numeric_limits<float>::max());
65  float xMin3(std::numeric_limits<float>::max()), xMax3(-std::numeric_limits<float>::max());
66  fitResult1.GetMinAndMaxX(xMin1, xMax1);
67  fitResult2.GetMinAndMaxX(xMin2, xMax2);
68  fitResult3.GetMinAndMaxX(xMin3, xMax3);
69 
70  const float commonX(isForwardInX ? std::max(xMin1, std::max(xMin2, xMin3)) : std::min(xMax1, std::min(xMax2, xMax3)));
71 
72  if (isForwardInX && ((commonX > xMax1) || (commonX > xMax2) || (commonX > xMax3)))
73  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
74 
75  if (!isForwardInX && ((commonX < xMin1) || (commonX < xMin2) || (commonX < xMin3)))
76  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
77 
78  // Layer step x position
79  float rL1(0.f), rT1(0.f);
80  fitResult1.GetLocalPosition(splitPosition1, rL1, rT1);
81  const int splitLayer(fitResult1.GetLayer(rL1));
82 
83  const int lowLayer(std::max(fitResult1.GetMinLayer(), std::min(fitResult1.GetMaxLayer(), splitLayer - m_nLayersForKinkSearch)));
84  const int highLayer(std::max(fitResult1.GetMinLayer(), std::min(fitResult1.GetMaxLayer(), splitLayer + m_nLayersForKinkSearch)));
85 
86  CartesianVector minus(0.f, 0.f, 0.f), plus(0.f, 0.f, 0.f);
87  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, fitResult1.GetGlobalFitPosition(fitResult1.GetL(lowLayer), minus));
88  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, fitResult1.GetGlobalFitPosition(fitResult1.GetL(highLayer), plus));
89 
90  if (minus.GetX() > plus.GetX())
91  {
92  CartesianVector temporary(minus);
93  minus = plus;
94  plus = temporary;
95  }
96 
97  const float layerStepX(isForwardInX ? plus.GetX() : minus.GetX());
98 
99  // Final x position selection
100  const float chosenX(isForwardInX ? std::max(layerStepX, commonX) : std::min(layerStepX, commonX));
101  const float finalX(isForwardInX ? chosenX + m_additionalXStepForKinkSearch : chosenX - m_additionalXStepForKinkSearch);
102  return finalX;
103 }
TFile f
Definition: plotHisto.C:6
int m_nLayersForKinkSearch
The number of sliding fit layers to step in the kink search.
float m_additionalXStepForKinkSearch
An additional (safety) step to tack-on when choosing x sampling points.
bool lar_content::ThreeDKinkBaseTool::IsALowestInX ( const LArPointingCluster pointingClusterA,
const LArPointingCluster pointingClusterB 
)
staticprotectedinherited

Whether pointing cluster labelled A extends to lowest x positions (as opposed to that labelled B)

Parameters
pointingClusterApointing cluster A
pointingClusterBpointing cluster B

Definition at line 107 of file ThreeDKinkBaseTool.cc.

References lar_content::LArPointingCluster::GetInnerVertex(), lar_content::LArPointingCluster::GetOuterVertex(), and lar_content::LArPointingCluster::Vertex::GetPosition().

Referenced by lar_content::UndershootTracksTool::GetIteratorListModifications(), and GetIteratorListModifications().

108 {
109  if ((pointingClusterA.GetInnerVertex().GetPosition().GetX() < pointingClusterB.GetInnerVertex().GetPosition().GetX()) &&
110  (pointingClusterA.GetInnerVertex().GetPosition().GetX() < pointingClusterB.GetOuterVertex().GetPosition().GetX()))
111  {
112  return true;
113  }
114 
115  if ((pointingClusterA.GetOuterVertex().GetPosition().GetX() < pointingClusterB.GetInnerVertex().GetPosition().GetX()) &&
116  (pointingClusterA.GetOuterVertex().GetPosition().GetX() < pointingClusterB.GetOuterVertex().GetPosition().GetX()))
117  {
118  return true;
119  }
120 
121  return false;
122 }
bool lar_content::OvershootTracksTool::IsThreeDKink ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const Particle particle,
const bool  isA1LowestInX,
const bool  isA2LowestInX 
) const
private

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

Parameters
pAlgorithmthe calling algorithm
particlethe particle
isA1LowestInXwhether cluster associated with tensor element a extends to lowest x positions in view 1
isA2LowestInXwhether cluster associated with tensor element a extends to lowest x positions in view 2
Returns
boolean

Definition at line 158 of file OvershootTracksTool.cc.

References f, lar_content::NViewTrackMatchingAlgorithm< T >::GetCachedSlidingFitResult(), lar_content::LArClusterHelper::GetClusterHitType(), lar_content::ThreeDKinkBaseTool::GetXSamplingPoint(), m_cosThetaCutForKinkSearch, lar_content::OvershootTracksTool::Particle::m_pClusterA1, lar_content::OvershootTracksTool::Particle::m_pClusterA2, lar_content::OvershootTracksTool::Particle::m_pClusterB1, lar_content::OvershootTracksTool::Particle::m_pClusterB2, lar_content::OvershootTracksTool::Particle::m_pCommonCluster, lar_content::OvershootTracksTool::Particle::m_splitPosition, lar_content::OvershootTracksTool::Particle::m_splitPosition1, lar_content::OvershootTracksTool::Particle::m_splitPosition2, and lar_content::LArGeometryHelper::MergeThreePositions3D().

Referenced by GetIteratorListModifications().

160 {
161  try
162  {
163  const TwoDSlidingFitResult &lowXFitResult1(isA1LowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA1)
164  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB1));
165  const TwoDSlidingFitResult &highXFitResult1(isA1LowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB1)
166  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA1));
167  const TwoDSlidingFitResult &lowXFitResult2(isA2LowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA2)
168  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB2));
169  const TwoDSlidingFitResult &highXFitResult2(isA2LowestInX ? pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterB2)
170  : pAlgorithm->GetCachedSlidingFitResult(particle.m_pClusterA2));
171  const TwoDSlidingFitResult &fitResultCommon3(pAlgorithm->GetCachedSlidingFitResult(particle.m_pCommonCluster));
172 
173  const float minusX(this->GetXSamplingPoint(particle.m_splitPosition, false, fitResultCommon3, lowXFitResult1, lowXFitResult2));
174  const float plusX(this->GetXSamplingPoint(particle.m_splitPosition, true, fitResultCommon3, highXFitResult1, highXFitResult2));
175 
176  CartesianVector minus1(0.f, 0.f, 0.f), split1(particle.m_splitPosition1), plus1(0.f, 0.f, 0.f);
177  CartesianVector minus2(0.f, 0.f, 0.f), split2(particle.m_splitPosition2), plus2(0.f, 0.f, 0.f);
178  CartesianVector minus3(0.f, 0.f, 0.f), split3(particle.m_splitPosition), plus3(0.f, 0.f, 0.f);
179 
180  if ((STATUS_CODE_SUCCESS != lowXFitResult1.GetGlobalFitPositionAtX(minusX, minus1)) ||
181  (STATUS_CODE_SUCCESS != highXFitResult1.GetGlobalFitPositionAtX(plusX, plus1)) ||
182  (STATUS_CODE_SUCCESS != lowXFitResult2.GetGlobalFitPositionAtX(minusX, minus2)) ||
183  (STATUS_CODE_SUCCESS != highXFitResult2.GetGlobalFitPositionAtX(plusX, plus2)) ||
184  (STATUS_CODE_SUCCESS != fitResultCommon3.GetGlobalFitPositionAtX(minusX, minus3)) ||
185  (STATUS_CODE_SUCCESS != fitResultCommon3.GetGlobalFitPositionAtX(plusX, plus3)))
186  {
187  return true; // majority rules, by default
188  }
189 
190  // Extract results
191  const HitType hitType1(LArClusterHelper::GetClusterHitType(particle.m_pClusterA1));
192  const HitType hitType2(LArClusterHelper::GetClusterHitType(particle.m_pClusterA2));
193  const HitType hitType3(LArClusterHelper::GetClusterHitType(particle.m_pCommonCluster));
194 
195  CartesianVector minus(0.f, 0.f, 0.f), split(0.f, 0.f, 0.f), plus(0.f, 0.f, 0.f);
196  float chi2Minus(std::numeric_limits<float>::max()), chi2Split(std::numeric_limits<float>::max()),
197  chi2Plus(std::numeric_limits<float>::max());
198  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, minus1, minus2, minus3, minus, chi2Minus);
199  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, split1, split2, split3, split, chi2Split);
200  LArGeometryHelper::MergeThreePositions3D(this->GetPandora(), hitType1, hitType2, hitType3, plus1, plus2, plus3, plus, chi2Plus);
201 
202  // Apply final cuts
203  const CartesianVector minusToSplit((split - minus).GetUnitVector());
204  const CartesianVector splitToPlus((plus - split).GetUnitVector());
205  const float dotProduct(minusToSplit.GetDotProduct(splitToPlus));
206 
207  if (dotProduct > m_cosThetaCutForKinkSearch)
208  return false;
209  }
210  catch (StatusCodeException &)
211  {
212  }
213 
214  return true;
215 }
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.
TFile f
Definition: plotHisto.C:6
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.
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
HitType
Definition: HitType.h:12
bool lar_content::ThreeDKinkBaseTool::PassesElementCuts ( TensorType::ElementList::const_iterator  eIter,
const pandora::ClusterSet &  usedClusters 
) const
protectedvirtualinherited

Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identification.

Parameters
eIterthe iterator to the tensor element
usedClustersthe list of used clusters

Definition at line 43 of file ThreeDKinkBaseTool.cc.

References lar_content::ThreeDKinkBaseTool::m_minMatchedFraction, and lar_content::ThreeDKinkBaseTool::m_minMatchedSamplingPoints.

Referenced by lar_content::ThreeDKinkBaseTool::GetModifications(), and lar_content::ThreeDKinkBaseTool::SelectTensorElements().

44 {
45  if (usedClusters.count(eIter->GetClusterU()) || usedClusters.count(eIter->GetClusterV()) || usedClusters.count(eIter->GetClusterW()))
46  return false;
47 
48  if (eIter->GetOverlapResult().GetMatchedFraction() < m_minMatchedFraction)
49  return false;
50 
51  if (eIter->GetOverlapResult().GetNMatchedSamplingPoints() < m_minMatchedSamplingPoints)
52  return false;
53 
54  return true;
55 }
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for use as a key tensor element.
float m_minMatchedFraction
The min matched sampling point fraction for use as a key tensor element.
bool lar_content::OvershootTracksTool::PassesVertexCuts ( const LArPointingCluster::Vertex vertexA,
const LArPointingCluster::Vertex vertexB 
) const
private

Whether a pair of vertices pass longitudinal projection cuts.

Parameters
vertexAvertex from cluster in tensor element a
vertexBvertex from cluster in tensor element b

Definition at line 112 of file OvershootTracksTool.cc.

References lar_content::LArPointingClusterHelper::GetImpactParameters(), and lar_content::ThreeDKinkBaseTool::m_minLongitudinalImpactParameter.

Referenced by GetIteratorListModifications().

113 {
114  float longitudinalAB(-std::numeric_limits<float>::max()), transverseAB(std::numeric_limits<float>::max());
115  LArPointingClusterHelper::GetImpactParameters(vertexA, vertexB, longitudinalAB, transverseAB);
116 
117  float longitudinalBA(-std::numeric_limits<float>::max()), transverseBA(std::numeric_limits<float>::max());
118  LArPointingClusterHelper::GetImpactParameters(vertexB, vertexA, longitudinalBA, transverseBA);
119 
120  if (std::min(longitudinalAB, longitudinalBA) < m_minLongitudinalImpactParameter)
121  return false;
122 
123  return true;
124 }
static void GetImpactParameters(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices.
float m_minLongitudinalImpactParameter
The min longitudinal impact parameter for connecting accompanying clusters.
StatusCode lar_content::OvershootTracksTool::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
private

Definition at line 252 of file OvershootTracksTool.cc.

References m_cosThetaCutForKinkSearch, m_maxVertexXSeparation, m_splitMode, and lar_content::ThreeDKinkBaseTool::ReadSettings().

253 {
254  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SplitMode", m_splitMode));
255 
256  PANDORA_RETURN_RESULT_IF_AND_IF(
257  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxVertexXSeparation", m_maxVertexXSeparation));
258 
259  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
260  XmlHelper::ReadValue(xmlHandle, "CosThetaCutForKinkSearch", m_cosThetaCutForKinkSearch));
261 
262  return ThreeDKinkBaseTool::ReadSettings(xmlHandle);
263 }
bool m_splitMode
Whether to run in cluster splitting mode, as opposed to cluster merging mode.
float m_maxVertexXSeparation
The max separation between accompanying clusters vertex x positions to make split.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_cosThetaCutForKinkSearch
The cos theta cut used for the kink search in three dimensions.
bool lar_content::ThreeDKinkBaseTool::Run ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
TensorType overlapTensor 
)
virtualinherited

Run the algorithm tool.

Parameters
pAlgorithmaddress of the calling algorithm
overlapTensorthe overlap tensor
Returns
whether changes have been made by the tool

Implements lar_content::TransverseTensorTool.

Definition at line 126 of file ThreeDKinkBaseTool.cc.

References lar_content::ThreeDKinkBaseTool::ApplyChanges(), and lar_content::ThreeDKinkBaseTool::GetModifications().

127 {
128  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
129  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
130 
131  ModificationList modificationList;
132  this->GetModifications(pAlgorithm, overlapTensor, modificationList);
133  const bool changesMade(this->ApplyChanges(pAlgorithm, modificationList));
134 
135  return changesMade;
136 }
std::vector< Modification > ModificationList
bool ApplyChanges(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const ModificationList &modificationList) const
Apply the changes cached in a modification list and update the tensor accordingly.
void GetModifications(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const TensorType &overlapTensor, ModificationList &modificationList) const
Get modification objects, identifying required splits and merges for clusters.
void lar_content::OvershootTracksTool::SetSplitPosition ( const LArPointingCluster::Vertex vertexA1,
const LArPointingCluster::Vertex vertexA2,
const LArPointingCluster::Vertex vertexB1,
const LArPointingCluster::Vertex vertexB2,
Particle particle 
) const
private

Set split position for a provided particle.

Parameters
vertexA1vertex for tensor element a in view 1
vertexA2vertex for tensor element a in view 2
vertexB1vertex for tensor element b in view 1
vertexB2vertex for tensor element b in view 2
particlethe particle

Definition at line 128 of file OvershootTracksTool.cc.

References f, lar_content::LArClusterHelper::GetClusterHitType(), lar_content::LArPointingCluster::Vertex::GetPosition(), m_maxVertexXSeparation, lar_content::OvershootTracksTool::Particle::m_pClusterA1, lar_content::OvershootTracksTool::Particle::m_pClusterA2, lar_content::OvershootTracksTool::Particle::m_splitPosition, lar_content::OvershootTracksTool::Particle::m_splitPosition1, lar_content::OvershootTracksTool::Particle::m_splitPosition2, and lar_content::LArGeometryHelper::MergeTwoPositions().

Referenced by GetIteratorListModifications().

130 {
131  bool splitAtElementA(false), splitAtElementB(false);
132 
133  if (std::fabs(vertexA1.GetPosition().GetX() - vertexA2.GetPosition().GetX()) < m_maxVertexXSeparation)
134  {
135  splitAtElementA = true;
136  }
137  else if (std::fabs(vertexB1.GetPosition().GetX() - vertexB2.GetPosition().GetX()) < m_maxVertexXSeparation)
138  {
139  splitAtElementB = true;
140  }
141 
142  if (!splitAtElementA && !splitAtElementB)
143  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
144 
145  particle.m_splitPosition1 = splitAtElementA ? vertexA1.GetPosition() : vertexB1.GetPosition();
146  particle.m_splitPosition2 = splitAtElementA ? vertexA2.GetPosition() : vertexB2.GetPosition();
147 
148  CartesianVector splitPosition(0.f, 0.f, 0.f);
149  float chiSquared(std::numeric_limits<float>::max());
150  LArGeometryHelper::MergeTwoPositions(this->GetPandora(), LArClusterHelper::GetClusterHitType(particle.m_pClusterA1),
151  LArClusterHelper::GetClusterHitType(particle.m_pClusterA2), particle.m_splitPosition1, particle.m_splitPosition2, splitPosition, chiSquared);
152 
153  particle.m_splitPosition = splitPosition;
154 }
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
TFile f
Definition: plotHisto.C:6
float m_maxVertexXSeparation
The max separation between accompanying clusters vertex x positions to make split.
static float MergeTwoPositions(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const float position1, const float position2)
Merge two views (U,V) to give a third view (Z).

Member Data Documentation

float lar_content::ThreeDKinkBaseTool::m_additionalXStepForKinkSearch
protectedinherited

An additional (safety) step to tack-on when choosing x sampling points.

Definition at line 100 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::ThreeDKinkBaseTool::GetXSamplingPoint(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

float lar_content::OvershootTracksTool::m_cosThetaCutForKinkSearch
private

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

Definition at line 91 of file OvershootTracksTool.h.

Referenced by IsThreeDKink(), and ReadSettings().

bool lar_content::ThreeDKinkBaseTool::m_majorityRulesMode
protectedinherited

Whether to run in majority rules mode (always split overshoots, always merge undershoots)

Definition at line 95 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::UndershootTracksTool::GetIteratorListModifications(), GetIteratorListModifications(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

float lar_content::OvershootTracksTool::m_maxVertexXSeparation
private

The max separation between accompanying clusters vertex x positions to make split.

Definition at line 90 of file OvershootTracksTool.h.

Referenced by ReadSettings(), and SetSplitPosition().

float lar_content::ThreeDKinkBaseTool::m_minLongitudinalImpactParameter
protectedinherited

The min longitudinal impact parameter for connecting accompanying clusters.

Definition at line 98 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::UndershootTracksTool::GetIteratorListModifications(), PassesVertexCuts(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

float lar_content::ThreeDKinkBaseTool::m_minMatchedFraction
protectedinherited

The min matched sampling point fraction for use as a key tensor element.

Definition at line 96 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::ThreeDKinkBaseTool::PassesElementCuts(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

unsigned int lar_content::ThreeDKinkBaseTool::m_minMatchedSamplingPoints
protectedinherited

The min number of matched sampling points for use as a key tensor element.

Definition at line 97 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::ThreeDKinkBaseTool::PassesElementCuts(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

unsigned int lar_content::ThreeDKinkBaseTool::m_nCommonClusters
protectedinherited
int lar_content::ThreeDKinkBaseTool::m_nLayersForKinkSearch
protectedinherited

The number of sliding fit layers to step in the kink search.

Definition at line 99 of file ThreeDKinkBaseTool.h.

Referenced by lar_content::ThreeDKinkBaseTool::GetXSamplingPoint(), and lar_content::ThreeDKinkBaseTool::ReadSettings().

bool lar_content::OvershootTracksTool::m_splitMode
private

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

Definition at line 89 of file OvershootTracksTool.h.

Referenced by GetIteratorListModifications(), and ReadSettings().


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