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

CandidateVertexCreationAlgorithm::Algorithm class. More...

#include "CandidateVertexCreationAlgorithm.h"

Inheritance diagram for lar_content::CandidateVertexCreationAlgorithm:

Public Member Functions

 CandidateVertexCreationAlgorithm ()
 Default constructor. More...
 

Private Types

typedef std::unordered_map< const pandora::Cluster *, pandora::CartesianPointVector > ClusterToSpacepointsMap
 

Private Member Functions

pandora::StatusCode Run ()
 
void SelectClusters (pandora::ClusterVector &clusterVectorU, pandora::ClusterVector &clusterVectorV, pandora::ClusterVector &clusterVectorW)
 Select a subset of input clusters (contained in the input list names) for processing in this algorithm. More...
 
void CreateEndpointCandidates (const pandora::ClusterVector &clusterVector1, const pandora::ClusterVector &clusterVector2) const
 Create candidate vertex positions by comparing pairs of cluster end positions. More...
 
void CreateEndpointVertex (const pandora::CartesianVector &position1, const pandora::HitType hitType1, const TwoDSlidingFitResult &fitResult2) const
 Create a candidate vertex position, using an end-point position from one cluster and sliding fit to a second cluster. More...
 
void CreateCrossingCandidates (const pandora::ClusterVector &clusterVectorU, const pandora::ClusterVector &clusterVectorV, const pandora::ClusterVector &clusterVectorW) const
 Extrapolate 2D clusters, find where they cross, and match crossing points between views to create vertex candidates. More...
 
void FindCrossingPoints (const pandora::ClusterVector &clusterVector, pandora::CartesianPointVector &crossingPoints) const
 Identify where (extrapolated) clusters plausibly cross in 2D. More...
 
void GetSpacepoints (const pandora::Cluster *const pCluster, pandora::CartesianPointVector &spacePoints) const
 Get a list of spacepoints representing cluster 2D hit positions and extrapolated positions. More...
 
void FindCrossingPoints (const pandora::CartesianPointVector &spacepoints1, const pandora::CartesianPointVector &spacepoints2, pandora::CartesianPointVector &crossingPoints) const
 Identify where (extrapolated) clusters plausibly cross in 2D. More...
 
void CreateCrossingVertices (const pandora::CartesianPointVector &crossingPoints1, const pandora::CartesianPointVector &crossingPoints2, const pandora::HitType hitType1, const pandora::HitType hitType2, unsigned int &nCrossingCandidates) const
 Attempt to create candidate vertex positions, using 2D crossing points in 2 views. More...
 
void AddInputVertices () const
 Add candidate vertices from any input vertices. More...
 
void AddToSlidingFitCache (const pandora::Cluster *const pCluster)
 Creates a 2D sliding fit of a cluster and stores it for later use. More...
 
const TwoDSlidingFitResultGetCachedSlidingFitResult (const pandora::Cluster *const pCluster) const
 Get a sliding fit result from the algorithm cache. More...
 
void TidyUp ()
 Clear relevant algorithm member variables between events. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Private Attributes

pandora::StringVector m_inputClusterListNames
 The list of cluster list names. More...
 
std::string m_inputVertexListName
 The list name for existing candidate vertices. More...
 
std::string m_outputVertexListName
 The name under which to save the output vertex list. More...
 
bool m_replaceCurrentVertexList
 Whether to replace the current vertex list with the output list. More...
 
unsigned int m_slidingFitWindow
 The layer window for the sliding linear fits. More...
 
TwoDSlidingFitResultMap m_slidingFitResultMap
 The sliding fit result map. More...
 
unsigned int m_minClusterCaloHits
 The min number of hits in base cluster selection method. More...
 
float m_minClusterLengthSquared
 The min length (squared) in base cluster selection method. More...
 
float m_chiSquaredCut
 The chi squared cut (accept only 3D vertex positions with values below cut) More...
 
bool m_enableEndpointCandidates
 Whether to create endpoint-based candidates. More...
 
float m_maxEndpointXDiscrepancy
 The max cluster endpoint discrepancy. More...
 
bool m_enableCrossingCandidates
 Whether to create crossing vertex candidates. More...
 
unsigned int m_nMaxCrossingCandidates
 The max number of crossing candidates to create. More...
 
float m_maxCrossingXDiscrepancy
 The max cluster endpoint discrepancy. More...
 
unsigned int m_extrapolationNSteps
 Number of extrapolation steps, at each end of cluster, of specified size. More...
 
float m_extrapolationStepSize
 The extrapolation step size in cm. More...
 
float m_maxCrossingSeparationSquared
 The separation (squared) between spacepoints below which a crossing can be identified. More...
 
float m_minNearbyCrossingDistanceSquared
 The minimum allowed distance between identified crossing positions. More...
 
bool m_reducedCandidates
 Whether to reduce the number of candidates. More...
 
float m_selectionCutFactorMax
 Maximum factor to multiply the base cluster selection cuts. More...
 
float m_nClustersPassingMaxCutsPar
 Parameter for number of clusters passing the max base cluster selection cuts. More...
 

Detailed Description

CandidateVertexCreationAlgorithm::Algorithm class.

Definition at line 23 of file CandidateVertexCreationAlgorithm.h.

Member Typedef Documentation

typedef std::unordered_map<const pandora::Cluster *, pandora::CartesianPointVector> lar_content::CandidateVertexCreationAlgorithm::ClusterToSpacepointsMap
private

Definition at line 134 of file CandidateVertexCreationAlgorithm.h.

Constructor & Destructor Documentation

lar_content::CandidateVertexCreationAlgorithm::CandidateVertexCreationAlgorithm ( )

Default constructor.

Definition at line 23 of file CandidateVertexCreationAlgorithm.cc.

23  :
28  m_chiSquaredCut(2.f),
38  m_reducedCandidates(false),
41 {
42 }
bool m_reducedCandidates
Whether to reduce the number of candidates.
float m_minClusterLengthSquared
The min length (squared) in base cluster selection method.
float m_extrapolationStepSize
The extrapolation step size in cm.
float m_maxCrossingSeparationSquared
The separation (squared) between spacepoints below which a crossing can be identified.
bool m_enableEndpointCandidates
Whether to create endpoint-based candidates.
bool m_replaceCurrentVertexList
Whether to replace the current vertex list with the output list.
float m_maxEndpointXDiscrepancy
The max cluster endpoint discrepancy.
TFile f
Definition: plotHisto.C:6
bool m_enableCrossingCandidates
Whether to create crossing vertex candidates.
float m_maxCrossingXDiscrepancy
The max cluster endpoint discrepancy.
float m_nClustersPassingMaxCutsPar
Parameter for number of clusters passing the max base cluster selection cuts.
float m_minNearbyCrossingDistanceSquared
The minimum allowed distance between identified crossing positions.
unsigned int m_minClusterCaloHits
The min number of hits in base cluster selection method.
unsigned int m_extrapolationNSteps
Number of extrapolation steps, at each end of cluster, of specified size.
unsigned int m_nMaxCrossingCandidates
The max number of crossing candidates to create.
float m_selectionCutFactorMax
Maximum factor to multiply the base cluster selection cuts.
float m_chiSquaredCut
The chi squared cut (accept only 3D vertex positions with values below cut)
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.

Member Function Documentation

void lar_content::CandidateVertexCreationAlgorithm::AddInputVertices ( ) const
private

Add candidate vertices from any input vertices.

Definition at line 387 of file CandidateVertexCreationAlgorithm.cc.

References m_inputVertexListName.

Referenced by Run().

388 {
389  const VertexList *pInputVertexList{nullptr};
390  try
391  { // ATTN - No guarantee the list has been initialised, but silent failure here is ok
392  PandoraContentApi::GetList(*this, m_inputVertexListName, pInputVertexList);
393  if (!pInputVertexList)
394  return;
395 
396  for (const Vertex *pInputVertex : *pInputVertexList)
397  {
398  PandoraContentApi::Vertex::Parameters parameters;
399  parameters.m_position = pInputVertex->GetPosition();
400  parameters.m_vertexLabel = VERTEX_INTERACTION;
401  parameters.m_vertexType = VERTEX_3D;
402 
403  const Vertex *pVertex(nullptr);
404  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
405  }
406  }
407  catch (const StatusCodeException &)
408  {
409  return;
410  }
411 }
std::string m_inputVertexListName
The list name for existing candidate vertices.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
std::list< Vertex > VertexList
Definition: DCEL.h:169
void lar_content::CandidateVertexCreationAlgorithm::AddToSlidingFitCache ( const pandora::Cluster *const  pCluster)
private

Creates a 2D sliding fit of a cluster and stores it for later use.

Parameters
pClusteraddress of the relevant cluster

Definition at line 415 of file CandidateVertexCreationAlgorithm.cc.

References lar_content::LArGeometryHelper::GetWireZPitch(), m_slidingFitResultMap, and m_slidingFitWindow.

Referenced by SelectClusters().

416 {
417  const float slidingFitPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
418  const TwoDSlidingFitResult slidingFitResult(pCluster, m_slidingFitWindow, slidingFitPitch);
419 
420  if (!m_slidingFitResultMap.insert(TwoDSlidingFitResultMap::value_type(pCluster, slidingFitResult)).second)
421  throw StatusCodeException(STATUS_CODE_FAILURE);
422 }
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
TwoDSlidingFitResultMap m_slidingFitResultMap
The sliding fit result map.
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
void lar_content::CandidateVertexCreationAlgorithm::CreateCrossingCandidates ( const pandora::ClusterVector &  clusterVectorU,
const pandora::ClusterVector &  clusterVectorV,
const pandora::ClusterVector &  clusterVectorW 
) const
private

Extrapolate 2D clusters, find where they cross, and match crossing points between views to create vertex candidates.

Parameters
clusterVectorUthe clusters in the u view
clusterVectorVthe clusters in the v view
clusterVectorWthe clusters in the w view

Definition at line 240 of file CandidateVertexCreationAlgorithm.cc.

References CreateCrossingVertices(), FindCrossingPoints(), and GetSpacepoints().

Referenced by Run().

242 {
243  CartesianPointVector crossingsU, crossingsV, crossingsW;
244  this->FindCrossingPoints(clusterVectorU, crossingsU);
245  this->FindCrossingPoints(clusterVectorV, crossingsV);
246  this->FindCrossingPoints(clusterVectorW, crossingsW);
247 
248  unsigned int nCrossingCandidates(0);
249  this->CreateCrossingVertices(crossingsU, crossingsV, TPC_VIEW_U, TPC_VIEW_V, nCrossingCandidates);
250  this->CreateCrossingVertices(crossingsU, crossingsW, TPC_VIEW_U, TPC_VIEW_W, nCrossingCandidates);
251  this->CreateCrossingVertices(crossingsV, crossingsW, TPC_VIEW_V, TPC_VIEW_W, nCrossingCandidates);
252 }
void FindCrossingPoints(const pandora::ClusterVector &clusterVector, pandora::CartesianPointVector &crossingPoints) const
Identify where (extrapolated) clusters plausibly cross in 2D.
void CreateCrossingVertices(const pandora::CartesianPointVector &crossingPoints1, const pandora::CartesianPointVector &crossingPoints2, const pandora::HitType hitType1, const pandora::HitType hitType2, unsigned int &nCrossingCandidates) const
Attempt to create candidate vertex positions, using 2D crossing points in 2 views.
void lar_content::CandidateVertexCreationAlgorithm::CreateCrossingVertices ( const pandora::CartesianPointVector &  crossingPoints1,
const pandora::CartesianPointVector &  crossingPoints2,
const pandora::HitType  hitType1,
const pandora::HitType  hitType2,
unsigned int &  nCrossingCandidates 
) const
private

Attempt to create candidate vertex positions, using 2D crossing points in 2 views.

Parameters
crossingPoints1the crossing points in view 1
crossingPoints2the crossing points in view 2
hitType1the hit type of crossing points 1
hitType2the hit type of crossing points 2
nCrossingCandidatesto count the number of crossing candidates created

Definition at line 352 of file CandidateVertexCreationAlgorithm.cc.

References f, m_chiSquaredCut, m_maxCrossingXDiscrepancy, m_nMaxCrossingCandidates, and lar_content::LArGeometryHelper::MergeTwoPositions3D().

Referenced by CreateCrossingCandidates().

354 {
355 
356  for (const CartesianVector &position1 : crossingPoints1)
357  {
358  for (const CartesianVector &position2 : crossingPoints2)
359  {
360  if (nCrossingCandidates > m_nMaxCrossingCandidates)
361  return;
362 
363  if (std::fabs(position1.GetX() - position2.GetX()) > m_maxCrossingXDiscrepancy)
364  continue;
365 
366  float chiSquared(0.f);
367  CartesianVector position3D(0.f, 0.f, 0.f);
368  LArGeometryHelper::MergeTwoPositions3D(this->GetPandora(), hitType1, hitType2, position1, position2, position3D, chiSquared);
369 
370  if (chiSquared > m_chiSquaredCut)
371  continue;
372 
373  PandoraContentApi::Vertex::Parameters parameters;
374  parameters.m_position = position3D;
375  parameters.m_vertexLabel = VERTEX_INTERACTION;
376  parameters.m_vertexType = VERTEX_3D;
377 
378  const Vertex *pVertex(NULL);
379  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
380  ++nCrossingCandidates;
381  }
382  }
383 }
static void MergeTwoPositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from two views to give unified 3D position.
TFile f
Definition: plotHisto.C:6
float m_maxCrossingXDiscrepancy
The max cluster endpoint discrepancy.
unsigned int m_nMaxCrossingCandidates
The max number of crossing candidates to create.
float m_chiSquaredCut
The chi squared cut (accept only 3D vertex positions with values below cut)
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
void lar_content::CandidateVertexCreationAlgorithm::CreateEndpointCandidates ( const pandora::ClusterVector &  clusterVector1,
const pandora::ClusterVector &  clusterVector2 
) const
private

Create candidate vertex positions by comparing pairs of cluster end positions.

Parameters
clusterVector1the clusters in view 1
clusterVector1the clusters in view 2

Definition at line 174 of file CandidateVertexCreationAlgorithm.cc.

References CreateEndpointVertex(), GetCachedSlidingFitResult(), lar_content::LArClusterHelper::GetClusterHitType(), lar_content::TwoDSlidingFitResult::GetGlobalMaxLayerPosition(), and lar_content::TwoDSlidingFitResult::GetGlobalMinLayerPosition().

Referenced by Run().

175 {
176  for (const Cluster *const pCluster1 : clusterVector1)
177  {
178  const HitType hitType1(LArClusterHelper::GetClusterHitType(pCluster1));
179 
180  const TwoDSlidingFitResult &fitResult1(this->GetCachedSlidingFitResult(pCluster1));
181  const CartesianVector minLayerPosition1(fitResult1.GetGlobalMinLayerPosition());
182  const CartesianVector maxLayerPosition1(fitResult1.GetGlobalMaxLayerPosition());
183 
184  for (const Cluster *const pCluster2 : clusterVector2)
185  {
186  const HitType hitType2(LArClusterHelper::GetClusterHitType(pCluster2));
187 
188  const TwoDSlidingFitResult &fitResult2(this->GetCachedSlidingFitResult(pCluster2));
189  const CartesianVector minLayerPosition2(fitResult2.GetGlobalMinLayerPosition());
190  const CartesianVector maxLayerPosition2(fitResult2.GetGlobalMaxLayerPosition());
191 
192  this->CreateEndpointVertex(maxLayerPosition1, hitType1, fitResult2);
193  this->CreateEndpointVertex(minLayerPosition1, hitType1, fitResult2);
194  this->CreateEndpointVertex(maxLayerPosition2, hitType2, fitResult1);
195  this->CreateEndpointVertex(minLayerPosition2, hitType2, fitResult1);
196  }
197  }
198 }
void CreateEndpointVertex(const pandora::CartesianVector &position1, const pandora::HitType hitType1, const TwoDSlidingFitResult &fitResult2) const
Create a candidate vertex position, using an end-point position from one cluster and sliding fit to a...
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
const TwoDSlidingFitResult & GetCachedSlidingFitResult(const pandora::Cluster *const pCluster) const
Get a sliding fit result from the algorithm cache.
HitType
Definition: HitType.h:12
void lar_content::CandidateVertexCreationAlgorithm::CreateEndpointVertex ( const pandora::CartesianVector &  position1,
const pandora::HitType  hitType1,
const TwoDSlidingFitResult fitResult2 
) const
private

Create a candidate vertex position, using an end-point position from one cluster and sliding fit to a second cluster.

Parameters
position1an end-point position for the first cluster
hitType1the hit type of the first cluster
fitResult2the two dimensional sliding fit result for the second cluster

Definition at line 202 of file CandidateVertexCreationAlgorithm.cc.

References f, lar_content::TwoDSlidingFitResult::GetCluster(), lar_content::LArClusterHelper::GetClusterHitType(), lar_content::TwoDSlidingFitResult::GetExtrapolatedPositionAtX(), lar_content::TwoDSlidingFitResult::GetGlobalMaxLayerPosition(), lar_content::TwoDSlidingFitResult::GetGlobalMinLayerPosition(), m_chiSquaredCut, m_maxEndpointXDiscrepancy, and lar_content::LArGeometryHelper::MergeTwoPositions3D().

Referenced by CreateEndpointCandidates().

204 {
205  const CartesianVector minLayerPosition2(fitResult2.GetGlobalMinLayerPosition());
206  const CartesianVector maxLayerPosition2(fitResult2.GetGlobalMaxLayerPosition());
207 
208  if ((((position1.GetX() < minLayerPosition2.GetX()) && (position1.GetX() < maxLayerPosition2.GetX())) ||
209  ((position1.GetX() > minLayerPosition2.GetX()) && (position1.GetX() > maxLayerPosition2.GetX()))) &&
210  (std::fabs(position1.GetX() - minLayerPosition2.GetX()) > m_maxEndpointXDiscrepancy) &&
211  (std::fabs(position1.GetX() - maxLayerPosition2.GetX()) > m_maxEndpointXDiscrepancy))
212  {
213  return;
214  }
215 
216  CartesianVector position2(0.f, 0.f, 0.f);
217  if (STATUS_CODE_SUCCESS != fitResult2.GetExtrapolatedPositionAtX(position1.GetX(), position2))
218  return;
219 
220  const HitType hitType2(LArClusterHelper::GetClusterHitType(fitResult2.GetCluster()));
221 
222  float chiSquared(0.f);
223  CartesianVector position3D(0.f, 0.f, 0.f);
224  LArGeometryHelper::MergeTwoPositions3D(this->GetPandora(), hitType1, hitType2, position1, position2, position3D, chiSquared);
225 
226  if (chiSquared > m_chiSquaredCut)
227  return;
228 
229  PandoraContentApi::Vertex::Parameters parameters;
230  parameters.m_position = position3D;
231  parameters.m_vertexLabel = VERTEX_INTERACTION;
232  parameters.m_vertexType = VERTEX_3D;
233 
234  const Vertex *pVertex(NULL);
235  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
236 }
static void MergeTwoPositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from two views to give unified 3D position.
float m_maxEndpointXDiscrepancy
The max cluster endpoint discrepancy.
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
HitType
Definition: HitType.h:12
float m_chiSquaredCut
The chi squared cut (accept only 3D vertex positions with values below cut)
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
void lar_content::CandidateVertexCreationAlgorithm::FindCrossingPoints ( const pandora::ClusterVector &  clusterVector,
pandora::CartesianPointVector &  crossingPoints 
) const
private

Identify where (extrapolated) clusters plausibly cross in 2D.

Parameters
clusterVectorthe input clusters
crossingPointsto receive the 2D crossing points

Referenced by CreateCrossingCandidates(), and GetSpacepoints().

void lar_content::CandidateVertexCreationAlgorithm::FindCrossingPoints ( const pandora::CartesianPointVector &  spacepoints1,
const pandora::CartesianPointVector &  spacepoints2,
pandora::CartesianPointVector &  crossingPoints 
) const
private

Identify where (extrapolated) clusters plausibly cross in 2D.

Parameters
spacepoints1space points for cluster 1
spacepoints2space points for cluster 2
crossingPointsto receive the list of plausible 2D crossing points
const TwoDSlidingFitResult & lar_content::CandidateVertexCreationAlgorithm::GetCachedSlidingFitResult ( const pandora::Cluster *const  pCluster) const
private

Get a sliding fit result from the algorithm cache.

Parameters
pClusteraddress of the relevant cluster

Definition at line 426 of file CandidateVertexCreationAlgorithm.cc.

References m_slidingFitResultMap.

Referenced by CreateEndpointCandidates(), and GetSpacepoints().

427 {
429 
430  if (m_slidingFitResultMap.end() == iter)
431  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
432 
433  return iter->second;
434 }
intermediate_table::const_iterator const_iterator
TwoDSlidingFitResultMap m_slidingFitResultMap
The sliding fit result map.
void lar_content::CandidateVertexCreationAlgorithm::GetSpacepoints ( const pandora::Cluster *const  pCluster,
pandora::CartesianPointVector &  spacePoints 
) const
private

Get a list of spacepoints representing cluster 2D hit positions and extrapolated positions.

Parameters
pClusteraddress of the cluster
spacePointsto receive the list of spacepoints

Definition at line 280 of file CandidateVertexCreationAlgorithm.cc.

References f, FindCrossingPoints(), GetCachedSlidingFitResult(), lar_content::LArClusterHelper::GetCoordinateVector(), lar_content::TwoDSlidingFitResult::GetExtrapolatedPosition(), lar_content::TwoDSlidingFitResult::GetL(), lar_content::TwoDSlidingFitResult::GetMaxLayer(), lar_content::TwoDSlidingFitResult::GetMinLayer(), m_extrapolationNSteps, m_extrapolationStepSize, m_maxCrossingSeparationSquared, m_minNearbyCrossingDistanceSquared, and lar_content::LArClusterHelper::SortCoordinatesByPosition().

Referenced by CreateCrossingCandidates().

281 {
282  LArClusterHelper::GetCoordinateVector(pCluster, spacepoints);
283 
284  const TwoDSlidingFitResult &fitResult(this->GetCachedSlidingFitResult(pCluster));
285  const float minLayerRL(fitResult.GetL(fitResult.GetMinLayer()));
286  const float maxLayerRL(fitResult.GetL(fitResult.GetMaxLayer()));
287 
288  for (unsigned int iStep = 0; iStep < m_extrapolationNSteps; ++iStep)
289  {
290  const float deltaRL(static_cast<float>(iStep) * m_extrapolationStepSize);
291 
292  CartesianVector positionPositive(0.f, 0.f, 0.f), positionNegative(0.f, 0.f, 0.f);
293  fitResult.GetExtrapolatedPosition(maxLayerRL + deltaRL, positionPositive);
294  fitResult.GetExtrapolatedPosition(minLayerRL - deltaRL, positionNegative);
295 
296  spacepoints.push_back(positionPositive);
297  spacepoints.push_back(positionNegative);
298  }
299 
300  std::sort(spacepoints.begin(), spacepoints.end(), LArClusterHelper::SortCoordinatesByPosition);
301 }
float m_extrapolationStepSize
The extrapolation step size in cm.
TFile f
Definition: plotHisto.C:6
static bool SortCoordinatesByPosition(const pandora::CartesianVector &lhs, const pandora::CartesianVector &rhs)
Sort cartesian vectors by their position (use Z, followed by X, followed by Y)
unsigned int m_extrapolationNSteps
Number of extrapolation steps, at each end of cluster, of specified size.
const TwoDSlidingFitResult & GetCachedSlidingFitResult(const pandora::Cluster *const pCluster) const
Get a sliding fit result from the algorithm cache.
static void GetCoordinateVector(const pandora::Cluster *const pCluster, pandora::CartesianPointVector &coordinateVector)
Get vector of hit coordinates from an input cluster.
StatusCode lar_content::CandidateVertexCreationAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
private

Definition at line 445 of file CandidateVertexCreationAlgorithm.cc.

References m_chiSquaredCut, m_enableCrossingCandidates, m_enableEndpointCandidates, m_extrapolationNSteps, m_extrapolationStepSize, m_inputClusterListNames, m_inputVertexListName, m_maxCrossingSeparationSquared, m_maxCrossingXDiscrepancy, m_maxEndpointXDiscrepancy, m_minClusterCaloHits, m_minClusterLengthSquared, m_minNearbyCrossingDistanceSquared, m_nClustersPassingMaxCutsPar, m_nMaxCrossingCandidates, m_outputVertexListName, m_reducedCandidates, m_replaceCurrentVertexList, m_selectionCutFactorMax, and m_slidingFitWindow.

446 {
447  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputClusterListNames", m_inputClusterListNames));
448 
449  PANDORA_RETURN_RESULT_IF_AND_IF(
450  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "InputVertexListName", m_inputVertexListName));
451 
452  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputVertexListName", m_outputVertexListName));
453 
454  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
455  XmlHelper::ReadValue(xmlHandle, "ReplaceCurrentVertexList", m_replaceCurrentVertexList));
456 
457  PANDORA_RETURN_RESULT_IF_AND_IF(
458  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitWindow", m_slidingFitWindow));
459 
460  PANDORA_RETURN_RESULT_IF_AND_IF(
461  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterCaloHits", m_minClusterCaloHits));
462 
463  float minClusterLength = std::sqrt(m_minClusterLengthSquared);
464  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterLength", minClusterLength));
465  m_minClusterLengthSquared = minClusterLength * minClusterLength;
466 
467  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ChiSquaredCut", m_chiSquaredCut));
468 
469  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
470  XmlHelper::ReadValue(xmlHandle, "EnableEndpointCandidates", m_enableEndpointCandidates));
471 
472  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
473  XmlHelper::ReadValue(xmlHandle, "MaxEndpointXDiscrepancy", m_maxEndpointXDiscrepancy));
474 
475  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
476  XmlHelper::ReadValue(xmlHandle, "EnableCrossingCandidates", m_enableCrossingCandidates));
477 
478  PANDORA_RETURN_RESULT_IF_AND_IF(
479  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NMaxCrossingCandidates", m_nMaxCrossingCandidates));
480 
481  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
482  XmlHelper::ReadValue(xmlHandle, "MaxCrossingXDiscrepancy", m_maxCrossingXDiscrepancy));
483 
484  PANDORA_RETURN_RESULT_IF_AND_IF(
485  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ExtrapolationNSteps", m_extrapolationNSteps));
486 
487  PANDORA_RETURN_RESULT_IF_AND_IF(
488  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ExtrapolationStepSize", m_extrapolationStepSize));
489 
490  PANDORA_RETURN_RESULT_IF_AND_IF(
491  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ReducedCandidates", m_reducedCandidates));
492 
493  PANDORA_RETURN_RESULT_IF_AND_IF(
494  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SelectionCutFactorMax", m_selectionCutFactorMax));
495 
496  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
497  XmlHelper::ReadValue(xmlHandle, "NClustersPassingMaxCutsPar", m_nClustersPassingMaxCutsPar));
498 
499  float maxCrossingSeparation = std::sqrt(m_maxCrossingSeparationSquared);
500  PANDORA_RETURN_RESULT_IF_AND_IF(
501  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxCrossingSeparation", maxCrossingSeparation));
502  m_maxCrossingSeparationSquared = maxCrossingSeparation * maxCrossingSeparation;
503 
504  float minNearbyCrossingDistance = std::sqrt(m_minNearbyCrossingDistanceSquared);
505  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
506  XmlHelper::ReadValue(xmlHandle, "MinNearbyCrossingDistance", minNearbyCrossingDistance));
507  m_minNearbyCrossingDistanceSquared = minNearbyCrossingDistance * minNearbyCrossingDistance;
508 
509  return STATUS_CODE_SUCCESS;
510 }
bool m_reducedCandidates
Whether to reduce the number of candidates.
float m_minClusterLengthSquared
The min length (squared) in base cluster selection method.
float m_extrapolationStepSize
The extrapolation step size in cm.
float m_maxCrossingSeparationSquared
The separation (squared) between spacepoints below which a crossing can be identified.
bool m_enableEndpointCandidates
Whether to create endpoint-based candidates.
bool m_replaceCurrentVertexList
Whether to replace the current vertex list with the output list.
float m_maxEndpointXDiscrepancy
The max cluster endpoint discrepancy.
std::string m_inputVertexListName
The list name for existing candidate vertices.
bool m_enableCrossingCandidates
Whether to create crossing vertex candidates.
float m_maxCrossingXDiscrepancy
The max cluster endpoint discrepancy.
float m_nClustersPassingMaxCutsPar
Parameter for number of clusters passing the max base cluster selection cuts.
float m_minNearbyCrossingDistanceSquared
The minimum allowed distance between identified crossing positions.
unsigned int m_minClusterCaloHits
The min number of hits in base cluster selection method.
unsigned int m_extrapolationNSteps
Number of extrapolation steps, at each end of cluster, of specified size.
std::string m_outputVertexListName
The name under which to save the output vertex list.
pandora::StringVector m_inputClusterListNames
The list of cluster list names.
unsigned int m_nMaxCrossingCandidates
The max number of crossing candidates to create.
float m_selectionCutFactorMax
Maximum factor to multiply the base cluster selection cuts.
float m_chiSquaredCut
The chi squared cut (accept only 3D vertex positions with values below cut)
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
StatusCode lar_content::CandidateVertexCreationAlgorithm::Run ( )
private

Definition at line 46 of file CandidateVertexCreationAlgorithm.cc.

References AddInputVertices(), CreateCrossingCandidates(), CreateEndpointCandidates(), m_enableCrossingCandidates, m_enableEndpointCandidates, m_inputVertexListName, m_outputVertexListName, m_replaceCurrentVertexList, SelectClusters(), and TidyUp().

47 {
48  try
49  {
50  ClusterVector clusterVectorU, clusterVectorV, clusterVectorW;
51  this->SelectClusters(clusterVectorU, clusterVectorV, clusterVectorW);
52 
53  const VertexList *pVertexList(NULL);
54  std::string temporaryListName;
55  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pVertexList, temporaryListName));
56 
58  {
59  this->CreateEndpointCandidates(clusterVectorU, clusterVectorV);
60  this->CreateEndpointCandidates(clusterVectorU, clusterVectorW);
61  this->CreateEndpointCandidates(clusterVectorV, clusterVectorW);
62  }
63 
65  this->CreateCrossingCandidates(clusterVectorU, clusterVectorV, clusterVectorW);
66 
67  if (!m_inputVertexListName.empty())
68  this->AddInputVertices();
69 
70  if (!pVertexList->empty())
71  {
72  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Vertex>(*this, m_outputVertexListName));
73 
75  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Vertex>(*this, m_outputVertexListName));
76  }
77  }
78  catch (StatusCodeException &statusCodeException)
79  {
80  this->TidyUp();
81  throw statusCodeException;
82  }
83 
84  this->TidyUp();
85 
86  return STATUS_CODE_SUCCESS;
87 }
void CreateCrossingCandidates(const pandora::ClusterVector &clusterVectorU, const pandora::ClusterVector &clusterVectorV, const pandora::ClusterVector &clusterVectorW) const
Extrapolate 2D clusters, find where they cross, and match crossing points between views to create ver...
bool m_enableEndpointCandidates
Whether to create endpoint-based candidates.
bool m_replaceCurrentVertexList
Whether to replace the current vertex list with the output list.
std::string m_inputVertexListName
The list name for existing candidate vertices.
bool m_enableCrossingCandidates
Whether to create crossing vertex candidates.
void CreateEndpointCandidates(const pandora::ClusterVector &clusterVector1, const pandora::ClusterVector &clusterVector2) const
Create candidate vertex positions by comparing pairs of cluster end positions.
void TidyUp()
Clear relevant algorithm member variables between events.
std::string m_outputVertexListName
The name under which to save the output vertex list.
void SelectClusters(pandora::ClusterVector &clusterVectorU, pandora::ClusterVector &clusterVectorV, pandora::ClusterVector &clusterVectorW)
Select a subset of input clusters (contained in the input list names) for processing in this algorith...
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void AddInputVertices() const
Add candidate vertices from any input vertices.
std::list< Vertex > VertexList
Definition: DCEL.h:169
void lar_content::CandidateVertexCreationAlgorithm::SelectClusters ( pandora::ClusterVector &  clusterVectorU,
pandora::ClusterVector &  clusterVectorV,
pandora::ClusterVector &  clusterVectorW 
)
private

Select a subset of input clusters (contained in the input list names) for processing in this algorithm.

Parameters
clusterVectorUto receive the selected clusters in the u view
clusterVectorVto receive the selected clusters in the v view
clusterVectorWto receive the selected clusters in the w view

Definition at line 91 of file CandidateVertexCreationAlgorithm.cc.

References AddToSlidingFitCache(), f, lar_content::LArClusterHelper::GetClusterHitType(), lar_content::LArClusterHelper::GetLengthSquared(), m_inputClusterListNames, m_minClusterCaloHits, m_minClusterLengthSquared, m_nClustersPassingMaxCutsPar, m_reducedCandidates, m_selectionCutFactorMax, and lar_content::LArClusterHelper::SortByNHits().

Referenced by Run().

92 {
93  for (const std::string &clusterListName : m_inputClusterListNames)
94  {
95  const ClusterList *pClusterList(NULL);
96  PANDORA_THROW_RESULT_IF_AND_IF(
97  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, clusterListName, pClusterList));
98 
99  if (!pClusterList || pClusterList->empty())
100  {
101  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
102  std::cout << "CandidateVertexCreationAlgorithm: unable to find cluster list " << clusterListName << std::endl;
103 
104  continue;
105  }
106 
107  const HitType hitType(LArClusterHelper::GetClusterHitType(*(pClusterList->begin())));
108 
109  if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
110  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
111 
112  ClusterVector &selectedClusterVector((TPC_VIEW_U == hitType) ? clusterVectorU
113  : (TPC_VIEW_V == hitType) ? clusterVectorV
114  : clusterVectorW);
115 
116  if (!selectedClusterVector.empty())
117  throw StatusCodeException(STATUS_CODE_FAILURE);
118 
119  ClusterVector sortedClusters(pClusterList->begin(), pClusterList->end());
120  std::sort(sortedClusters.begin(), sortedClusters.end(), LArClusterHelper::SortByNHits);
121 
122  unsigned int nClustersPassingMaxCuts(0);
124  {
125  for (const Cluster *const pCluster : sortedClusters)
126  {
127  float selectionCutFactor(1.f);
128 
129  if (pCluster->GetParticleId() == E_MINUS)
130  selectionCutFactor = m_selectionCutFactorMax;
131 
132  if (pCluster->GetNCaloHits() < m_minClusterCaloHits * selectionCutFactor)
133  continue;
134 
135  if (LArClusterHelper::GetLengthSquared(pCluster) < m_minClusterLengthSquared * selectionCutFactor * selectionCutFactor)
136  continue;
137 
138  nClustersPassingMaxCuts++;
139  }
140  }
141 
142  for (const Cluster *const pCluster : sortedClusters)
143  {
144  float selectionCutFactor(1.f);
145 
146  if (pCluster->GetParticleId() == E_MINUS && m_reducedCandidates)
147  {
148  selectionCutFactor = (m_selectionCutFactorMax + 1.f) * 0.5f +
149  (m_selectionCutFactorMax - 1.f) * 0.5f * std::tanh(static_cast<float>(nClustersPassingMaxCuts) - m_nClustersPassingMaxCutsPar);
150  }
151 
152  if (pCluster->GetNCaloHits() < m_minClusterCaloHits * selectionCutFactor)
153  continue;
154 
155  if (LArClusterHelper::GetLengthSquared(pCluster) < m_minClusterLengthSquared * selectionCutFactor * selectionCutFactor)
156  continue;
157 
158  try
159  {
160  this->AddToSlidingFitCache(pCluster);
161  selectedClusterVector.push_back(pCluster);
162  }
163  catch (StatusCodeException &statusCodeException)
164  {
165  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
166  throw statusCodeException;
167  }
168  }
169  }
170 }
bool m_reducedCandidates
Whether to reduce the number of candidates.
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
float m_minClusterLengthSquared
The min length (squared) in base cluster selection method.
void AddToSlidingFitCache(const pandora::Cluster *const pCluster)
Creates a 2D sliding fit of a cluster and stores it for later use.
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_nClustersPassingMaxCutsPar
Parameter for number of clusters passing the max base cluster selection cuts.
unsigned int m_minClusterCaloHits
The min number of hits in base cluster selection method.
pandora::StringVector m_inputClusterListNames
The list of cluster list names.
float m_selectionCutFactorMax
Maximum factor to multiply the base cluster selection cuts.
HitType
Definition: HitType.h:12
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void lar_content::CandidateVertexCreationAlgorithm::TidyUp ( )
private

Clear relevant algorithm member variables between events.

Definition at line 438 of file CandidateVertexCreationAlgorithm.cc.

References m_slidingFitResultMap.

Referenced by Run().

439 {
440  m_slidingFitResultMap.clear();
441 }
TwoDSlidingFitResultMap m_slidingFitResultMap
The sliding fit result map.

Member Data Documentation

float lar_content::CandidateVertexCreationAlgorithm::m_chiSquaredCut
private

The chi squared cut (accept only 3D vertex positions with values below cut)

Definition at line 146 of file CandidateVertexCreationAlgorithm.h.

Referenced by CreateCrossingVertices(), CreateEndpointVertex(), and ReadSettings().

bool lar_content::CandidateVertexCreationAlgorithm::m_enableCrossingCandidates
private

Whether to create crossing vertex candidates.

Definition at line 151 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and Run().

bool lar_content::CandidateVertexCreationAlgorithm::m_enableEndpointCandidates
private

Whether to create endpoint-based candidates.

Definition at line 148 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and Run().

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_extrapolationNSteps
private

Number of extrapolation steps, at each end of cluster, of specified size.

Definition at line 154 of file CandidateVertexCreationAlgorithm.h.

Referenced by GetSpacepoints(), and ReadSettings().

float lar_content::CandidateVertexCreationAlgorithm::m_extrapolationStepSize
private

The extrapolation step size in cm.

Definition at line 155 of file CandidateVertexCreationAlgorithm.h.

Referenced by GetSpacepoints(), and ReadSettings().

pandora::StringVector lar_content::CandidateVertexCreationAlgorithm::m_inputClusterListNames
private

The list of cluster list names.

Definition at line 136 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

std::string lar_content::CandidateVertexCreationAlgorithm::m_inputVertexListName
private

The list name for existing candidate vertices.

Definition at line 137 of file CandidateVertexCreationAlgorithm.h.

Referenced by AddInputVertices(), ReadSettings(), and Run().

float lar_content::CandidateVertexCreationAlgorithm::m_maxCrossingSeparationSquared
private

The separation (squared) between spacepoints below which a crossing can be identified.

Definition at line 156 of file CandidateVertexCreationAlgorithm.h.

Referenced by GetSpacepoints(), and ReadSettings().

float lar_content::CandidateVertexCreationAlgorithm::m_maxCrossingXDiscrepancy
private

The max cluster endpoint discrepancy.

Definition at line 153 of file CandidateVertexCreationAlgorithm.h.

Referenced by CreateCrossingVertices(), and ReadSettings().

float lar_content::CandidateVertexCreationAlgorithm::m_maxEndpointXDiscrepancy
private

The max cluster endpoint discrepancy.

Definition at line 149 of file CandidateVertexCreationAlgorithm.h.

Referenced by CreateEndpointVertex(), and ReadSettings().

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_minClusterCaloHits
private

The min number of hits in base cluster selection method.

Definition at line 144 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

float lar_content::CandidateVertexCreationAlgorithm::m_minClusterLengthSquared
private

The min length (squared) in base cluster selection method.

Definition at line 145 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

float lar_content::CandidateVertexCreationAlgorithm::m_minNearbyCrossingDistanceSquared
private

The minimum allowed distance between identified crossing positions.

Definition at line 157 of file CandidateVertexCreationAlgorithm.h.

Referenced by GetSpacepoints(), and ReadSettings().

float lar_content::CandidateVertexCreationAlgorithm::m_nClustersPassingMaxCutsPar
private

Parameter for number of clusters passing the max base cluster selection cuts.

Definition at line 161 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_nMaxCrossingCandidates
private

The max number of crossing candidates to create.

Definition at line 152 of file CandidateVertexCreationAlgorithm.h.

Referenced by CreateCrossingVertices(), and ReadSettings().

std::string lar_content::CandidateVertexCreationAlgorithm::m_outputVertexListName
private

The name under which to save the output vertex list.

Definition at line 138 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and Run().

bool lar_content::CandidateVertexCreationAlgorithm::m_reducedCandidates
private

Whether to reduce the number of candidates.

Definition at line 159 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

bool lar_content::CandidateVertexCreationAlgorithm::m_replaceCurrentVertexList
private

Whether to replace the current vertex list with the output list.

Definition at line 139 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and Run().

float lar_content::CandidateVertexCreationAlgorithm::m_selectionCutFactorMax
private

Maximum factor to multiply the base cluster selection cuts.

Definition at line 160 of file CandidateVertexCreationAlgorithm.h.

Referenced by ReadSettings(), and SelectClusters().

TwoDSlidingFitResultMap lar_content::CandidateVertexCreationAlgorithm::m_slidingFitResultMap
private

The sliding fit result map.

Definition at line 142 of file CandidateVertexCreationAlgorithm.h.

Referenced by AddToSlidingFitCache(), GetCachedSlidingFitResult(), and TidyUp().

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_slidingFitWindow
private

The layer window for the sliding linear fits.

Definition at line 141 of file CandidateVertexCreationAlgorithm.h.

Referenced by AddToSlidingFitCache(), and ReadSettings().


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