All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
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  :
27  m_minClusterLengthSquared(3.f * 3.f),
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.
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 386 of file CandidateVertexCreationAlgorithm.cc.

387 {
388  const VertexList *pInputVertexList{nullptr};
389  try
390  { // ATTN - No guarantee the list has been initialised, but silent failure here is ok
391  PandoraContentApi::GetList(*this, m_inputVertexListName, pInputVertexList);
392  if (!pInputVertexList)
393  return;
394 
395  for (const Vertex *pInputVertex : *pInputVertexList)
396  {
398  parameters.m_position = pInputVertex->GetPosition();
399  parameters.m_vertexLabel = VERTEX_INTERACTION;
400  parameters.m_vertexType = VERTEX_3D;
401 
402  const Vertex *pVertex(nullptr);
403  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
404  }
405  }
406  catch (const StatusCodeException &)
407  {
408  return;
409  }
410 }
std::string m_inputVertexListName
The list name for existing candidate vertices.
fhicl::Table< sbnd::crt::CRTDetSimParams > Parameters
std::list< Vertex > VertexList
Definition: DCEL.h:182
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 414 of file CandidateVertexCreationAlgorithm.cc.

415 {
416  const float slidingFitPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
417  const TwoDSlidingFitResult slidingFitResult(pCluster, m_slidingFitWindow, slidingFitPitch);
418 
419  if (!m_slidingFitResultMap.insert(TwoDSlidingFitResultMap::value_type(pCluster, slidingFitResult)).second)
420  throw StatusCodeException(STATUS_CODE_FAILURE);
421 }
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 239 of file CandidateVertexCreationAlgorithm.cc.

241 {
242  CartesianPointVector crossingsU, crossingsV, crossingsW;
243  this->FindCrossingPoints(clusterVectorU, crossingsU);
244  this->FindCrossingPoints(clusterVectorV, crossingsV);
245  this->FindCrossingPoints(clusterVectorW, crossingsW);
246 
247  unsigned int nCrossingCandidates(0);
248  this->CreateCrossingVertices(crossingsU, crossingsV, TPC_VIEW_U, TPC_VIEW_V, nCrossingCandidates);
249  this->CreateCrossingVertices(crossingsU, crossingsW, TPC_VIEW_U, TPC_VIEW_W, nCrossingCandidates);
250  this->CreateCrossingVertices(crossingsV, crossingsW, TPC_VIEW_V, TPC_VIEW_W, nCrossingCandidates);
251 }
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 351 of file CandidateVertexCreationAlgorithm.cc.

353 {
354 
355  for (const CartesianVector &position1 : crossingPoints1)
356  {
357  for (const CartesianVector &position2 : crossingPoints2)
358  {
359  if (nCrossingCandidates > m_nMaxCrossingCandidates)
360  return;
361 
362  if (std::fabs(position1.GetX() - position2.GetX()) > m_maxCrossingXDiscrepancy)
363  continue;
364 
365  float chiSquared(0.f);
366  CartesianVector position3D(0.f, 0.f, 0.f);
367  LArGeometryHelper::MergeTwoPositions3D(this->GetPandora(), hitType1, hitType2, position1, position2, position3D, chiSquared);
368 
369  if (chiSquared > m_chiSquaredCut)
370  continue;
371 
373  parameters.m_position = position3D;
374  parameters.m_vertexLabel = VERTEX_INTERACTION;
375  parameters.m_vertexType = VERTEX_3D;
376 
377  const Vertex *pVertex(NULL);
378  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
379  ++nCrossingCandidates;
380  }
381  }
382 }
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_maxCrossingXDiscrepancy
The max cluster endpoint discrepancy.
fhicl::Table< sbnd::crt::CRTDetSimParams > Parameters
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)
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 173 of file CandidateVertexCreationAlgorithm.cc.

174 {
175  for (const Cluster *const pCluster1 : clusterVector1)
176  {
177  const HitType hitType1(LArClusterHelper::GetClusterHitType(pCluster1));
178 
179  const TwoDSlidingFitResult &fitResult1(this->GetCachedSlidingFitResult(pCluster1));
180  const CartesianVector minLayerPosition1(fitResult1.GetGlobalMinLayerPosition());
181  const CartesianVector maxLayerPosition1(fitResult1.GetGlobalMaxLayerPosition());
182 
183  for (const Cluster *const pCluster2 : clusterVector2)
184  {
185  const HitType hitType2(LArClusterHelper::GetClusterHitType(pCluster2));
186 
187  const TwoDSlidingFitResult &fitResult2(this->GetCachedSlidingFitResult(pCluster2));
188  const CartesianVector minLayerPosition2(fitResult2.GetGlobalMinLayerPosition());
189  const CartesianVector maxLayerPosition2(fitResult2.GetGlobalMaxLayerPosition());
190 
191  this->CreateEndpointVertex(maxLayerPosition1, hitType1, fitResult2);
192  this->CreateEndpointVertex(minLayerPosition1, hitType1, fitResult2);
193  this->CreateEndpointVertex(maxLayerPosition2, hitType2, fitResult1);
194  this->CreateEndpointVertex(minLayerPosition2, hitType2, fitResult1);
195  }
196  }
197 }
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.
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 201 of file CandidateVertexCreationAlgorithm.cc.

203 {
204  const CartesianVector minLayerPosition2(fitResult2.GetGlobalMinLayerPosition());
205  const CartesianVector maxLayerPosition2(fitResult2.GetGlobalMaxLayerPosition());
206 
207  if ((((position1.GetX() < minLayerPosition2.GetX()) && (position1.GetX() < maxLayerPosition2.GetX())) ||
208  ((position1.GetX() > minLayerPosition2.GetX()) && (position1.GetX() > maxLayerPosition2.GetX()))) &&
209  (std::fabs(position1.GetX() - minLayerPosition2.GetX()) > m_maxEndpointXDiscrepancy) &&
210  (std::fabs(position1.GetX() - maxLayerPosition2.GetX()) > m_maxEndpointXDiscrepancy))
211  {
212  return;
213  }
214 
215  CartesianVector position2(0.f, 0.f, 0.f);
216  if (STATUS_CODE_SUCCESS != fitResult2.GetExtrapolatedPositionAtX(position1.GetX(), position2))
217  return;
218 
219  const HitType hitType2(LArClusterHelper::GetClusterHitType(fitResult2.GetCluster()));
220 
221  float chiSquared(0.f);
222  CartesianVector position3D(0.f, 0.f, 0.f);
223  LArGeometryHelper::MergeTwoPositions3D(this->GetPandora(), hitType1, hitType2, position1, position2, position3D, chiSquared);
224 
225  if (chiSquared > m_chiSquaredCut)
226  return;
227 
229  parameters.m_position = position3D;
230  parameters.m_vertexLabel = VERTEX_INTERACTION;
231  parameters.m_vertexType = VERTEX_3D;
232 
233  const Vertex *pVertex(NULL);
234  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
235 }
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.
fhicl::Table< sbnd::crt::CRTDetSimParams > Parameters
float m_chiSquaredCut
The chi squared cut (accept only 3D vertex positions with values below cut)
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
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 425 of file CandidateVertexCreationAlgorithm.cc.

426 {
427  TwoDSlidingFitResultMap::const_iterator iter = m_slidingFitResultMap.find(pCluster);
428 
429  if (m_slidingFitResultMap.end() == iter)
430  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
431 
432  return iter->second;
433 }
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 279 of file CandidateVertexCreationAlgorithm.cc.

280 {
281  LArClusterHelper::GetCoordinateVector(pCluster, spacepoints);
282 
283  const TwoDSlidingFitResult &fitResult(this->GetCachedSlidingFitResult(pCluster));
284  const float minLayerRL(fitResult.GetL(fitResult.GetMinLayer()));
285  const float maxLayerRL(fitResult.GetL(fitResult.GetMaxLayer()));
286 
287  for (unsigned int iStep = 0; iStep < m_extrapolationNSteps; ++iStep)
288  {
289  const float deltaRL(static_cast<float>(iStep) * m_extrapolationStepSize);
290 
291  CartesianVector positionPositive(0.f, 0.f, 0.f), positionNegative(0.f, 0.f, 0.f);
292  fitResult.GetExtrapolatedPosition(maxLayerRL + deltaRL, positionPositive);
293  fitResult.GetExtrapolatedPosition(minLayerRL - deltaRL, positionNegative);
294 
295  spacepoints.push_back(positionPositive);
296  spacepoints.push_back(positionNegative);
297  }
298 
299  std::sort(spacepoints.begin(), spacepoints.end(), LArClusterHelper::SortCoordinatesByPosition);
300 }
float m_extrapolationStepSize
The extrapolation step size in cm.
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 444 of file CandidateVertexCreationAlgorithm.cc.

445 {
446  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputClusterListNames", m_inputClusterListNames));
447 
448  PANDORA_RETURN_RESULT_IF_AND_IF(
449  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "InputVertexListName", m_inputVertexListName));
450 
451  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputVertexListName", m_outputVertexListName));
452 
453  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
454  XmlHelper::ReadValue(xmlHandle, "ReplaceCurrentVertexList", m_replaceCurrentVertexList));
455 
456  PANDORA_RETURN_RESULT_IF_AND_IF(
457  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitWindow", m_slidingFitWindow));
458 
459  PANDORA_RETURN_RESULT_IF_AND_IF(
460  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterCaloHits", m_minClusterCaloHits));
461 
462  float minClusterLength = std::sqrt(m_minClusterLengthSquared);
463  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterLength", minClusterLength));
464  m_minClusterLengthSquared = minClusterLength * minClusterLength;
465 
466  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ChiSquaredCut", m_chiSquaredCut));
467 
468  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
469  XmlHelper::ReadValue(xmlHandle, "EnableEndpointCandidates", m_enableEndpointCandidates));
470 
471  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
472  XmlHelper::ReadValue(xmlHandle, "MaxEndpointXDiscrepancy", m_maxEndpointXDiscrepancy));
473 
474  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
475  XmlHelper::ReadValue(xmlHandle, "EnableCrossingCandidates", m_enableCrossingCandidates));
476 
477  PANDORA_RETURN_RESULT_IF_AND_IF(
478  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NMaxCrossingCandidates", m_nMaxCrossingCandidates));
479 
480  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
481  XmlHelper::ReadValue(xmlHandle, "MaxCrossingXDiscrepancy", m_maxCrossingXDiscrepancy));
482 
483  PANDORA_RETURN_RESULT_IF_AND_IF(
484  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ExtrapolationNSteps", m_extrapolationNSteps));
485 
486  PANDORA_RETURN_RESULT_IF_AND_IF(
487  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ExtrapolationStepSize", m_extrapolationStepSize));
488 
489  PANDORA_RETURN_RESULT_IF_AND_IF(
490  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ReducedCandidates", m_reducedCandidates));
491 
492  PANDORA_RETURN_RESULT_IF_AND_IF(
493  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SelectionCutFactorMax", m_selectionCutFactorMax));
494 
495  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
496  XmlHelper::ReadValue(xmlHandle, "NClustersPassingMaxCutsPar", m_nClustersPassingMaxCutsPar));
497 
498  float maxCrossingSeparation = std::sqrt(m_maxCrossingSeparationSquared);
499  PANDORA_RETURN_RESULT_IF_AND_IF(
500  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxCrossingSeparation", maxCrossingSeparation));
501  m_maxCrossingSeparationSquared = maxCrossingSeparation * maxCrossingSeparation;
502 
503  float minNearbyCrossingDistance = std::sqrt(m_minNearbyCrossingDistanceSquared);
504  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
505  XmlHelper::ReadValue(xmlHandle, "MinNearbyCrossingDistance", minNearbyCrossingDistance));
506  m_minNearbyCrossingDistanceSquared = minNearbyCrossingDistance * minNearbyCrossingDistance;
507 
508  return STATUS_CODE_SUCCESS;
509 }
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.

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

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 : (TPC_VIEW_V == hitType) ? clusterVectorV : clusterVectorW);
113 
114  if (!selectedClusterVector.empty())
115  throw StatusCodeException(STATUS_CODE_FAILURE);
116 
117  ClusterVector sortedClusters(pClusterList->begin(), pClusterList->end());
118  std::sort(sortedClusters.begin(), sortedClusters.end(), LArClusterHelper::SortByNHits);
119 
120  unsigned int nClustersPassingMaxCuts(0);
122  {
123  for (const Cluster *const pCluster : sortedClusters)
124  {
125  float selectionCutFactor(1.f);
126 
127  if (pCluster->GetParticleId() == E_MINUS)
128  selectionCutFactor = m_selectionCutFactorMax;
129 
130  if (pCluster->GetNCaloHits() < m_minClusterCaloHits * selectionCutFactor)
131  continue;
132 
133  if (LArClusterHelper::GetLengthSquared(pCluster) < m_minClusterLengthSquared * selectionCutFactor * selectionCutFactor)
134  continue;
135 
136  nClustersPassingMaxCuts++;
137  }
138  }
139 
140  for (const Cluster *const pCluster : sortedClusters)
141  {
142  float selectionCutFactor(1.f);
143 
144  if (pCluster->GetParticleId() == E_MINUS && m_reducedCandidates)
145  {
146  selectionCutFactor = (m_selectionCutFactorMax + 1.f) * 0.5f +
147  (m_selectionCutFactorMax - 1.f) * 0.5f *
148  std::tanh(static_cast<float>(nClustersPassingMaxCuts) - m_nClustersPassingMaxCutsPar);
149  }
150 
151  if (pCluster->GetNCaloHits() < m_minClusterCaloHits * selectionCutFactor)
152  continue;
153 
154  if (LArClusterHelper::GetLengthSquared(pCluster) < m_minClusterLengthSquared * selectionCutFactor * selectionCutFactor)
155  continue;
156 
157  try
158  {
159  this->AddToSlidingFitCache(pCluster);
160  selectedClusterVector.push_back(pCluster);
161  }
162  catch (StatusCodeException &statusCodeException)
163  {
164  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
165  throw statusCodeException;
166  }
167  }
168  }
169 }
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.
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.
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
BEGIN_PROLOG could also be cout
void lar_content::CandidateVertexCreationAlgorithm::TidyUp ( )
private

Clear relevant algorithm member variables between events.

Definition at line 437 of file CandidateVertexCreationAlgorithm.cc.

438 {
439  m_slidingFitResultMap.clear();
440 }
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.

bool lar_content::CandidateVertexCreationAlgorithm::m_enableCrossingCandidates
private

Whether to create crossing vertex candidates.

Definition at line 151 of file CandidateVertexCreationAlgorithm.h.

bool lar_content::CandidateVertexCreationAlgorithm::m_enableEndpointCandidates
private

Whether to create endpoint-based candidates.

Definition at line 148 of file CandidateVertexCreationAlgorithm.h.

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.

float lar_content::CandidateVertexCreationAlgorithm::m_extrapolationStepSize
private

The extrapolation step size in cm.

Definition at line 155 of file CandidateVertexCreationAlgorithm.h.

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

The list of cluster list names.

Definition at line 136 of file CandidateVertexCreationAlgorithm.h.

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

The list name for existing candidate vertices.

Definition at line 137 of file CandidateVertexCreationAlgorithm.h.

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.

float lar_content::CandidateVertexCreationAlgorithm::m_maxCrossingXDiscrepancy
private

The max cluster endpoint discrepancy.

Definition at line 153 of file CandidateVertexCreationAlgorithm.h.

float lar_content::CandidateVertexCreationAlgorithm::m_maxEndpointXDiscrepancy
private

The max cluster endpoint discrepancy.

Definition at line 149 of file CandidateVertexCreationAlgorithm.h.

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.

float lar_content::CandidateVertexCreationAlgorithm::m_minClusterLengthSquared
private

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

Definition at line 145 of file CandidateVertexCreationAlgorithm.h.

float lar_content::CandidateVertexCreationAlgorithm::m_minNearbyCrossingDistanceSquared
private

The minimum allowed distance between identified crossing positions.

Definition at line 157 of file CandidateVertexCreationAlgorithm.h.

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.

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_nMaxCrossingCandidates
private

The max number of crossing candidates to create.

Definition at line 152 of file CandidateVertexCreationAlgorithm.h.

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.

bool lar_content::CandidateVertexCreationAlgorithm::m_reducedCandidates
private

Whether to reduce the number of candidates.

Definition at line 159 of file CandidateVertexCreationAlgorithm.h.

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.

float lar_content::CandidateVertexCreationAlgorithm::m_selectionCutFactorMax
private

Maximum factor to multiply the base cluster selection cuts.

Definition at line 160 of file CandidateVertexCreationAlgorithm.h.

TwoDSlidingFitResultMap lar_content::CandidateVertexCreationAlgorithm::m_slidingFitResultMap
private

The sliding fit result map.

Definition at line 142 of file CandidateVertexCreationAlgorithm.h.

unsigned int lar_content::CandidateVertexCreationAlgorithm::m_slidingFitWindow
private

The layer window for the sliding linear fits.

Definition at line 141 of file CandidateVertexCreationAlgorithm.h.


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