LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
lar_content::CrossedTrackSplittingAlgorithm Class Reference

CrossedTrackSplittingAlgorithm class. More...

#include "CrossedTrackSplittingAlgorithm.h"

Inheritance diagram for lar_content::CrossedTrackSplittingAlgorithm:
lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm

Public Member Functions

 CrossedTrackSplittingAlgorithm ()
 Default constructor. More...
 

Protected Member Functions

virtual pandora::StatusCode Run ()
 

Private Types

typedef KDTreeLinkerAlgo< const pandora::CaloHit *, 2 > HitKDTree2D
 
typedef KDTreeNodeInfoT< const pandora::CaloHit *, 2 > HitKDNode2D
 
typedef std::vector< HitKDNode2DHitKDNode2DList
 
typedef std::unordered_map< const pandora::Cluster *, pandora::ClusterSet > ClusterToClustersMap
 
typedef std::unordered_map< const pandora::CaloHit *, const pandora::Cluster * > HitToClusterMap
 

Private Member Functions

pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
pandora::StatusCode PreparationStep (const pandora::ClusterVector &clusterVector)
 Perform any preparatory actions, such as caching information for subsequent expensive calculations. More...
 
pandora::StatusCode TidyUpStep ()
 Tidy up any information cached in e.g. the preparation step. More...
 
pandora::StatusCode FindBestSplitPosition (const TwoDSlidingFitResult &slidingFit1, const TwoDSlidingFitResult &slidingFit2, pandora::CartesianVector &splitPosition, pandora::CartesianVector &direction1, pandora::CartesianVector &direction2) const
 Find the best split position and direction for a pair of clusters. More...
 
void FindCandidateSplitPositions (const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, pandora::CartesianPointVector &candidateVector) const
 Find average positions of pairs of hits within a maximum separation. More...
 

Private Attributes

float m_maxClusterSeparation
 maximum separation of two clusters More...
 
float m_maxClusterSeparationSquared
 maximum separation of two clusters (squared) More...
 
float m_minCosRelativeAngle
 maximum relative angle between tracks after un-crossing More...
 
float m_searchRegion1D
 Search region, applied to each dimension, for look-up from kd-trees. More...
 
ClusterToClustersMap m_nearbyClusters
 The nearby clusters map. More...
 

Detailed Description

Member Typedef Documentation

typedef std::unordered_map<const pandora::Cluster*, pandora::ClusterSet> lar_content::CrossedTrackSplittingAlgorithm::ClusterToClustersMap
private

Definition at line 39 of file CrossedTrackSplittingAlgorithm.h.

Definition at line 36 of file CrossedTrackSplittingAlgorithm.h.

Definition at line 35 of file CrossedTrackSplittingAlgorithm.h.

typedef std::unordered_map<const pandora::CaloHit*, const pandora::Cluster*> lar_content::CrossedTrackSplittingAlgorithm::HitToClusterMap
private

Definition at line 40 of file CrossedTrackSplittingAlgorithm.h.

Constructor & Destructor Documentation

lar_content::CrossedTrackSplittingAlgorithm::CrossedTrackSplittingAlgorithm ( )

Default constructor.

Definition at line 23 of file CrossedTrackSplittingAlgorithm.cc.

23  :
28 {
29 }
float m_minCosRelativeAngle
maximum relative angle between tracks after un-crossing
float m_maxClusterSeparationSquared
maximum separation of two clusters (squared)
TFile f
Definition: plotHisto.C:6
float m_maxClusterSeparation
maximum separation of two clusters
float m_searchRegion1D
Search region, applied to each dimension, for look-up from kd-trees.

Member Function Documentation

StatusCode lar_content::CrossedTrackSplittingAlgorithm::FindBestSplitPosition ( const TwoDSlidingFitResult slidingFit1,
const TwoDSlidingFitResult slidingFit2,
pandora::CartesianVector &  splitPosition,
pandora::CartesianVector &  direction1,
pandora::CartesianVector &  direction2 
) const
privatevirtual

Find the best split position and direction for a pair of clusters.

Parameters
slidingFit1the sliding linear fit to the first cluster
slidingFit2the sliding linear fit to the second cluster
splitPositionthe output split position
direction1the output direction of the first new cluster
direction2the output direction of the second new cluster

Implements lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm.

Definition at line 86 of file CrossedTrackSplittingAlgorithm.cc.

References a1, a2, f, FindCandidateSplitPositions(), lar_content::LArClusterHelper::GetClosestDistance(), lar_content::TwoDSlidingFitResult::GetCluster(), lar_content::TwoDSlidingFitResult::GetGlobalFitPosition(), lar_content::TwoDSlidingFitResult::GetGlobalFitProjection(), lar_content::TwoDSlidingFitResult::GetGlobalMaxLayerPosition(), lar_content::TwoDSlidingFitResult::GetGlobalMinLayerPosition(), lar_content::LArPointingClusterHelper::GetIntersection(), lar_content::TwoDSlidingFitResult::GetLayerFitHalfWindowLength(), lar_content::TwoDSlidingFitResult::GetLocalPosition(), m_maxClusterSeparation, m_minCosRelativeAngle, m_nearbyClusters, max, t1, and t2.

88 {
89  // Use cached results from kd-tree to avoid expensive calculations
90  if (!m_nearbyClusters.count(slidingFitResult1.GetCluster()) ||
91  !m_nearbyClusters.count(slidingFitResult2.GetCluster()) ||
92  !m_nearbyClusters.at(slidingFitResult1.GetCluster()).count(slidingFitResult2.GetCluster()) ||
93  !m_nearbyClusters.at(slidingFitResult2.GetCluster()).count(slidingFitResult1.GetCluster()))
94  {
95  return STATUS_CODE_NOT_FOUND;
96  }
97 
98  // Identify crossed-track topology and find candidate intersection positions
99  const CartesianVector& minPosition1(slidingFitResult1.GetGlobalMinLayerPosition());
100  const CartesianVector& maxPosition1(slidingFitResult1.GetGlobalMaxLayerPosition());
101 
102  const CartesianVector& minPosition2(slidingFitResult2.GetGlobalMinLayerPosition());
103  const CartesianVector& maxPosition2(slidingFitResult2.GetGlobalMaxLayerPosition());
104 
105  if (LArClusterHelper::GetClosestDistance(minPosition1, slidingFitResult2.GetCluster()) < 2.f * m_maxClusterSeparation ||
106  LArClusterHelper::GetClosestDistance(maxPosition1, slidingFitResult2.GetCluster()) < 2.f * m_maxClusterSeparation ||
107  LArClusterHelper::GetClosestDistance(minPosition2, slidingFitResult1.GetCluster()) < 2.f * m_maxClusterSeparation ||
108  LArClusterHelper::GetClosestDistance(maxPosition2, slidingFitResult1.GetCluster()) < 2.f * m_maxClusterSeparation)
109  {
110  return STATUS_CODE_NOT_FOUND;
111  }
112 
113  if (LArClusterHelper::GetClosestDistance(slidingFitResult1.GetCluster(), slidingFitResult2.GetCluster()) > m_maxClusterSeparation)
114  return STATUS_CODE_NOT_FOUND;
115 
116  CartesianPointVector candidateVector;
117  this->FindCandidateSplitPositions(slidingFitResult1.GetCluster(), slidingFitResult2.GetCluster(), candidateVector);
118 
119  if (candidateVector.empty())
120  return STATUS_CODE_NOT_FOUND;
121 
122 
123  // Loop over candidate positions and find best split position
124  bool foundSplit(false);
125  float closestSeparationSquared(std::numeric_limits<float>::max());
126 
127  const float halfWindowLength1(slidingFitResult1.GetLayerFitHalfWindowLength());
128  const float halfWindowLength2(slidingFitResult2.GetLayerFitHalfWindowLength());
129 
130  for (CartesianPointVector::const_iterator iter = candidateVector.begin(), iterEnd = candidateVector.end(); iter != iterEnd; ++iter)
131  {
132  const CartesianVector &candidatePosition(*iter);
133 
134  // Projections onto first cluster
135  float rL1(0.f), rT1(0.f);
136  CartesianVector R1(0.f, 0.f, 0.f);
137  CartesianVector F1(0.f, 0.f, 0.f);
138  CartesianVector B1(0.f, 0.f, 0.f);
139 
140  if (STATUS_CODE_SUCCESS != slidingFitResult1.GetGlobalFitProjection(candidatePosition, R1))
141  continue;
142 
143  slidingFitResult1.GetLocalPosition(R1, rL1, rT1);
144  if ((STATUS_CODE_SUCCESS != slidingFitResult1.GetGlobalFitPosition(rL1 + halfWindowLength1, F1)) ||
145  (STATUS_CODE_SUCCESS != slidingFitResult1.GetGlobalFitPosition(rL1 - halfWindowLength1, B1)))
146  {
147  continue;
148  }
149 
150  // Projections onto second cluster
151  float rL2(0.f), rT2(0.f);
152  CartesianVector R2(0.f, 0.f, 0.f);
153  CartesianVector F2(0.f, 0.f, 0.f);
154  CartesianVector B2(0.f, 0.f, 0.f);
155 
156  if (STATUS_CODE_SUCCESS != slidingFitResult2.GetGlobalFitProjection(candidatePosition, R2))
157  continue;
158 
159  slidingFitResult2.GetLocalPosition(R2, rL2, rT2);
160  if ((STATUS_CODE_SUCCESS != slidingFitResult2.GetGlobalFitPosition(rL2 + halfWindowLength2, F2)) ||
161  (STATUS_CODE_SUCCESS != slidingFitResult2.GetGlobalFitPosition(rL2 - halfWindowLength2, B2)))
162  {
163  continue;
164  }
165 
166  // Calculate average position
167  const CartesianVector C0((R1 + R2) * 0.5);
168 
169  // Calculate intersected position:
170  // ==============================
171  // First cluster gives set of points: B1->R1->F1
172  // Second cluster gives set of points: B2->R2->F2
173  //
174  // Try swapping B1 with B2 to see if this gives intersecting straight lines:
175  //
176  // F1 F2 a2 b1
177  // | | | |
178  // | | | |
179  // R1 R2 R1 R2
180  // | | | |
181  // | | | |
182  // B1 B2 a1 b2
183 
184  // First straight line is a1->R1->b1
185  // Second straight line is a2->R2->b2
186 
187  const CartesianVector a1(B1);
188  const CartesianVector a2(F1);
189 
190  for (unsigned int iForward = 0; iForward<2; ++iForward)
191  {
192  const CartesianVector b1((0 == iForward) ? F2 : B2);
193  const CartesianVector b2((0 == iForward) ? B2 : F2);
194 
195  const CartesianVector s1((b1 - R2).GetUnitVector());
196  const CartesianVector t1((R1 - a1).GetUnitVector());
197  const CartesianVector s2((b2 - R2).GetUnitVector());
198  const CartesianVector t2((R1 - a2).GetUnitVector());
199 
200  if (s1.GetDotProduct(t1) < std::max(m_minCosRelativeAngle,-s1.GetDotProduct(s2)) ||
201  s2.GetDotProduct(t2) < std::max(m_minCosRelativeAngle,-t1.GetDotProduct(t2)))
202  continue;
203 
204  const CartesianVector p1((b1 - a1).GetUnitVector());
205  const CartesianVector p2((b2 - a2).GetUnitVector());
206 
207  float mu1(0.f), mu2(0.f);
208  CartesianVector C1(0.f,0.f,0.f);
209 
210  try
211  {
212  LArPointingClusterHelper::GetIntersection(a1, p1, a2, p2, C1, mu1, mu2);
213  }
214  catch (const StatusCodeException &)
215  {
216  continue;
217  }
218 
219  if (mu1 < 0.f || mu2 < 0.f || mu1 > (b1 - a1).GetMagnitude() || mu2 > (b2 - a2).GetMagnitude())
220  continue;
221 
222  const float thisSeparationSquared((C0 - C1).GetMagnitudeSquared());
223 
224  if (thisSeparationSquared < closestSeparationSquared)
225  {
226  closestSeparationSquared = thisSeparationSquared;
227  splitPosition = (C0 + C1) * 0.5;
228  firstDirection = t2 * -1.f;
229  secondDirection = t1;
230  foundSplit = true;
231  }
232  }
233  }
234 
235  if (!foundSplit)
236  return STATUS_CODE_NOT_FOUND;
237 
238  return STATUS_CODE_SUCCESS;
239 }
TTree * t1
Definition: plottest35.C:26
static void GetIntersection(const LArPointingCluster::Vertex &firstVertex, const LArPointingCluster::Vertex &secondVertex, pandora::CartesianVector &intersectPosition, float &firstDisplacement, float &secondDisplacement)
Get intersection of two vertices.
float m_minCosRelativeAngle
maximum relative angle between tracks after un-crossing
TFile f
Definition: plotHisto.C:6
#define a2
Int_t max
Definition: plot.C:27
intermediate_table::const_iterator const_iterator
void FindCandidateSplitPositions(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, pandora::CartesianPointVector &candidateVector) const
Find average positions of pairs of hits within a maximum separation.
TTree * t2
Definition: plottest35.C:36
float m_maxClusterSeparation
maximum separation of two clusters
ClusterToClustersMap m_nearbyClusters
The nearby clusters map.
#define a1
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
void lar_content::CrossedTrackSplittingAlgorithm::FindCandidateSplitPositions ( const pandora::Cluster *const  pCluster1,
const pandora::Cluster *const  pCluster2,
pandora::CartesianPointVector &  candidateVector 
) const
private

Find average positions of pairs of hits within a maximum separation.

Parameters
pCluster1the first cluster
pCluster2the second cluster
candidateVectorto receive the average positions

Definition at line 243 of file CrossedTrackSplittingAlgorithm.cc.

References lar_content::LArClusterHelper::GetClosestPosition(), m_maxClusterSeparationSquared, and lar_content::LArClusterHelper::SortHitsByPosition().

Referenced by FindBestSplitPosition().

245 {
246  // ATTN The following is double-double counting
247  CaloHitList caloHitList1, caloHitList2;
248  pCluster1->GetOrderedCaloHitList().FillCaloHitList(caloHitList1);
249  pCluster2->GetOrderedCaloHitList().FillCaloHitList(caloHitList2);
250 
251  CaloHitVector caloHitVector1(caloHitList1.begin(), caloHitList1.end()), caloHitVector2(caloHitList2.begin(), caloHitList2.end());
252  std::sort(caloHitVector1.begin(), caloHitVector1.end(), LArClusterHelper::SortHitsByPosition);
253  std::sort(caloHitVector2.begin(), caloHitVector2.end(), LArClusterHelper::SortHitsByPosition);
254 
255  for (const CaloHit *const pCaloHit : caloHitVector1)
256  {
257  const CartesianVector position1(pCaloHit->GetPositionVector());
258  const CartesianVector position2(LArClusterHelper::GetClosestPosition(position1, pCluster2));
259 
260  if ((position1 - position2).GetMagnitudeSquared() < m_maxClusterSeparationSquared)
261  candidateVector.push_back((position1 + position2) * 0.5);
262  }
263 
264  for (const CaloHit *const pCaloHit : caloHitVector2)
265  {
266  const CartesianVector position2(pCaloHit->GetPositionVector());
267  const CartesianVector position1(LArClusterHelper::GetClosestPosition(position2, pCluster1));
268 
269  if ((position2 - position1).GetMagnitudeSquared() < m_maxClusterSeparationSquared)
270  candidateVector.push_back((position2 + position1) * 0.5);
271  }
272 }
float m_maxClusterSeparationSquared
maximum separation of two clusters (squared)
static bool SortHitsByPosition(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their position (use Z, followed by X, followed by Y)
static pandora::CartesianVector GetClosestPosition(const pandora::CartesianVector &position, const pandora::ClusterList &clusterList)
Get closest position in a list of clusters to a specified input position vector.
StatusCode lar_content::CrossedTrackSplittingAlgorithm::PreparationStep ( const pandora::ClusterVector &  clusterVector)
privatevirtual

Perform any preparatory actions, such as caching information for subsequent expensive calculations.

Parameters
clusterVectorthe cluster vector

Reimplemented from lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm.

Definition at line 33 of file CrossedTrackSplittingAlgorithm.cc.

References lar_content::KDTreeLinkerAlgo< DATA, DIM >::build(), lar_content::build_2d_kd_search_region(), lar_content::fill_and_bound_2d_kd_tree(), m_nearbyClusters, m_searchRegion1D, and lar_content::KDTreeLinkerAlgo< DATA, DIM >::search().

34 {
35  // ATTN Don't need to update nearby cluster map after cluster merges because algorithm does not revisit processed clusters
36  HitToClusterMap hitToClusterMap;
37  CaloHitList allCaloHits;
38 
39  for (const Cluster *const pCluster : clusterVector)
40  {
41  CaloHitList daughterHits;
42  pCluster->GetOrderedCaloHitList().FillCaloHitList(daughterHits);
43  allCaloHits.insert(allCaloHits.end(), daughterHits.begin(), daughterHits.end());
44 
45  for (const CaloHit *const pCaloHit : daughterHits)
46  (void) hitToClusterMap.insert(HitToClusterMap::value_type(pCaloHit, pCluster));
47  }
48 
49  HitKDTree2D kdTree;
50  HitKDNode2DList hitKDNode2DList;
51 
52  KDTreeBox hitsBoundingRegion2D(fill_and_bound_2d_kd_tree(allCaloHits, hitKDNode2DList));
53  kdTree.build(hitKDNode2DList, hitsBoundingRegion2D);
54 
55  for (const Cluster *const pCluster : clusterVector)
56  {
57  CaloHitList daughterHits;
58  pCluster->GetOrderedCaloHitList().FillCaloHitList(daughterHits);
59 
60  for (const CaloHit *const pCaloHit : daughterHits)
61  {
63 
64  HitKDNode2DList found;
65  kdTree.search(searchRegionHits, found);
66 
67  for (const auto &hit : found)
68  (void) m_nearbyClusters[pCluster].insert(hitToClusterMap.at(hit.data));
69  }
70  }
71 
72  return STATUS_CODE_SUCCESS;
73 }
std::unordered_map< const pandora::CaloHit *, const pandora::Cluster * > HitToClusterMap
Detector simulation of raw signals on wires.
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 > > &nodes)
fill_and_bound_2d_kd_tree
ClusterToClustersMap m_nearbyClusters
The nearby clusters map.
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
float m_searchRegion1D
Search region, applied to each dimension, for look-up from kd-trees.
KDTreeLinkerAlgo< const pandora::CaloHit *, 2 > HitKDTree2D
KDTreeBoxT< 2 > KDTreeBox
StatusCode lar_content::CrossedTrackSplittingAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
privatevirtual

Reimplemented from lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm.

Definition at line 276 of file CrossedTrackSplittingAlgorithm.cc.

References m_maxClusterSeparation, m_maxClusterSeparationSquared, m_minCosRelativeAngle, m_searchRegion1D, and lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::ReadSettings().

277 {
278  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
279  "MaxClusterSeparation", m_maxClusterSeparation));
281 
282  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
283  "MinCosRelativeAngle", m_minCosRelativeAngle));
284 
285  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
286  "SearchRegion1D", m_searchRegion1D));
287 
289 }
float m_minCosRelativeAngle
maximum relative angle between tracks after un-crossing
float m_maxClusterSeparationSquared
maximum separation of two clusters (squared)
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_maxClusterSeparation
maximum separation of two clusters
float m_searchRegion1D
Search region, applied to each dimension, for look-up from kd-trees.
StatusCode lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::Run ( )
protectedvirtualinherited

Definition at line 29 of file TwoDSlidingFitSplittingAndSwitchingAlgorithm.cc.

References lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::BuildSlidingFitResultMap(), f, lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::FindBestSplitPosition(), lar_content::TwoDSlidingFitResult::GetCluster(), lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::GetListOfCleanClusters(), lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::PreparationStep(), lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::ReplaceClusters(), and lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm::TidyUpStep().

30 {
31  const ClusterList *pClusterList = NULL;
32  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pClusterList));
33 
34  // Get ordered list of clean clusters
35  ClusterVector clusterVector;
36  this->GetListOfCleanClusters(pClusterList, clusterVector);
37 
38  // Calculate sliding fit results for clean clusters
39  TwoDSlidingFitResultMap slidingFitResultMap;
40  this->BuildSlidingFitResultMap(clusterVector, slidingFitResultMap);
41 
42  // May choose to cache information here, for subsequent expensive calculations
43  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->PreparationStep(clusterVector));
44 
45  // Loop over clusters, identify split positions, perform splits
46  for (ClusterVector::iterator iter1 = clusterVector.begin(), iterEnd1 = clusterVector.end(); iter1 != iterEnd1; ++iter1)
47  {
48  if (NULL == *iter1)
49  continue;
50 
51  TwoDSlidingFitResultMap::iterator sIter1 = slidingFitResultMap.find(*iter1);
52 
53  if (slidingFitResultMap.end() == sIter1)
54  continue;
55 
56  const TwoDSlidingFitResult &slidingFitResult1(sIter1->second);
57 
58  for (ClusterVector::iterator iter2 = iter1, iterEnd2 = iterEnd1; iter2 != iterEnd2; ++iter2)
59  {
60  if (NULL == *iter2)
61  continue;
62 
63  TwoDSlidingFitResultMap::iterator sIter2 = slidingFitResultMap.find(*iter2);
64 
65  if (slidingFitResultMap.end() == sIter2)
66  continue;
67 
68  const TwoDSlidingFitResult &slidingFitResult2(sIter2->second);
69 
70  if (slidingFitResult1.GetCluster() == slidingFitResult2.GetCluster())
71  continue;
72 
73  CartesianVector splitPosition(0.f,0.f,0.f);
74  CartesianVector firstDirection(0.f,0.f,0.f);
75  CartesianVector secondDirection(0.f,0.f,0.f);
76 
77  if (STATUS_CODE_SUCCESS != this->FindBestSplitPosition(slidingFitResult1, slidingFitResult2, splitPosition, firstDirection, secondDirection))
78  continue;
79 
80  const Cluster *const pCluster1 = slidingFitResult1.GetCluster();
81  const Cluster *const pCluster2 = slidingFitResult2.GetCluster();
82 
83  if (STATUS_CODE_SUCCESS != this->ReplaceClusters(pCluster1, pCluster2, splitPosition, firstDirection, secondDirection))
84  continue;
85 
86  slidingFitResultMap.erase(sIter1);
87  slidingFitResultMap.erase(sIter2);
88 
89  *iter1 = NULL;
90  *iter2 = NULL;
91 
92  break;
93  }
94  }
95 
96  return this->TidyUpStep();
97 }
intermediate_table::iterator iterator
std::unordered_map< const pandora::Cluster *, TwoDSlidingFitResult > TwoDSlidingFitResultMap
virtual pandora::StatusCode FindBestSplitPosition(const TwoDSlidingFitResult &slidingFit1, const TwoDSlidingFitResult &slidingFit2, pandora::CartesianVector &splitPosition, pandora::CartesianVector &direction1, pandora::CartesianVector &direction2) const =0
Find the best split position and direction for a pair of clusters.
TFile f
Definition: plotHisto.C:6
virtual pandora::StatusCode TidyUpStep()
Tidy up any information cached in e.g. the preparation step.
pandora::StatusCode ReplaceClusters(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, const pandora::CartesianVector &splitPosition, const pandora::CartesianVector &firstDirection, const pandora::CartesianVector &secondDirection) const
Replace crossed clusters with un-crossed clusters.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void GetListOfCleanClusters(const pandora::ClusterList *const pClusterList, pandora::ClusterVector &clusterVector) const
Populate cluster vector with subset of cluster list, containing clusters judged to be clean...
virtual pandora::StatusCode PreparationStep(const pandora::ClusterVector &clusterVector)
Perform any preparatory actions, such as caching information for subsequent expensive calculations...
void BuildSlidingFitResultMap(const pandora::ClusterVector &clusterVector, TwoDSlidingFitResultMap &slidingFitResultMap) const
Build the map of sliding fit results.
StatusCode lar_content::CrossedTrackSplittingAlgorithm::TidyUpStep ( )
privatevirtual

Tidy up any information cached in e.g. the preparation step.

Reimplemented from lar_content::TwoDSlidingFitSplittingAndSwitchingAlgorithm.

Definition at line 77 of file CrossedTrackSplittingAlgorithm.cc.

References m_nearbyClusters.

78 {
79  m_nearbyClusters.clear();
80 
81  return STATUS_CODE_SUCCESS;
82 }
ClusterToClustersMap m_nearbyClusters
The nearby clusters map.

Member Data Documentation

float lar_content::CrossedTrackSplittingAlgorithm::m_maxClusterSeparation
private

maximum separation of two clusters

Definition at line 58 of file CrossedTrackSplittingAlgorithm.h.

Referenced by FindBestSplitPosition(), and ReadSettings().

float lar_content::CrossedTrackSplittingAlgorithm::m_maxClusterSeparationSquared
private

maximum separation of two clusters (squared)

Definition at line 59 of file CrossedTrackSplittingAlgorithm.h.

Referenced by FindCandidateSplitPositions(), and ReadSettings().

float lar_content::CrossedTrackSplittingAlgorithm::m_minCosRelativeAngle
private

maximum relative angle between tracks after un-crossing

Definition at line 60 of file CrossedTrackSplittingAlgorithm.h.

Referenced by FindBestSplitPosition(), and ReadSettings().

ClusterToClustersMap lar_content::CrossedTrackSplittingAlgorithm::m_nearbyClusters
private

The nearby clusters map.

Definition at line 63 of file CrossedTrackSplittingAlgorithm.h.

Referenced by FindBestSplitPosition(), PreparationStep(), and TidyUpStep().

float lar_content::CrossedTrackSplittingAlgorithm::m_searchRegion1D
private

Search region, applied to each dimension, for look-up from kd-trees.

Definition at line 62 of file CrossedTrackSplittingAlgorithm.h.

Referenced by PreparationStep(), and ReadSettings().


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