LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
VertexSelectionBaseAlgorithm.h
Go to the documentation of this file.
1 
8 #ifndef LAR_VERTEX_SELECTION_BASE_ALGORITHM_H
9 #define LAR_VERTEX_SELECTION_BASE_ALGORITHM_H 1
10 
11 #include "Objects/Vertex.h"
12 #include "Pandora/Algorithm.h"
13 
15 
18 
19 namespace lar_content
20 {
21 
22 template <typename, unsigned int>
23 class KDTreeLinkerAlgo;
24 template <typename, unsigned int>
25 class KDTreeNodeInfoT;
26 
27 //------------------------------------------------------------------------------------------------------------------------------------------
28 
32 class VertexSelectionBaseAlgorithm : public pandora::Algorithm
33 {
34 public:
39 
44  {
45  public:
52  VertexScore(const pandora::Vertex *const pVertex, const float score);
53 
59  const pandora::Vertex *GetVertex() const;
60 
66  float GetScore() const;
67 
75  bool operator<(const VertexScore &rhs) const;
76 
77  private:
79  float m_score;
80  };
81 
82  typedef std::vector<VertexScore> VertexScoreList;
83 
88  {
89  public:
95  float GetMinZCoordinate() const;
96 
102  float GetDecayConstant() const;
103 
110  void SetConstants(const float minZCoordinate, const float decayConstant);
111 
112  private:
113  pandora::InputFloat m_minZCoordinate;
114  pandora::InputFloat m_decayConstant;
115  };
116 
121  {
122  public:
130  SlidingFitData(const pandora::Cluster *const pCluster, const int slidingFitWindow, const float slidingFitPitch);
131 
137  const pandora::CartesianVector &GetMinLayerDirection() const;
138 
144  const pandora::CartesianVector &GetMaxLayerDirection() const;
145 
151  const pandora::CartesianVector &GetMinLayerPosition() const;
152 
158  const pandora::CartesianVector &GetMaxLayerPosition() const;
159 
165  const pandora::Cluster *GetCluster() const;
166 
167  private:
168  pandora::CartesianVector m_minLayerDirection;
169  pandora::CartesianVector m_maxLayerDirection;
170  pandora::CartesianVector m_minLayerPosition;
171  pandora::CartesianVector m_maxLayerPosition;
172  const pandora::Cluster *m_pCluster;
173  };
174 
175  typedef std::vector<SlidingFitData> SlidingFitDataList;
176 
181  {
182  public:
190  ShowerCluster(const pandora::ClusterList &clusterList, const int slidingFitWindow, const float slidingFitPitch);
191 
197  const pandora::ClusterList &GetClusters() const;
198 
204  const TwoDSlidingFitResult &GetFit() const;
205 
213  pandora::CartesianPointVector GetClusterListCoordinateVector(const pandora::ClusterList &clusterList) const;
214 
215  private:
216  pandora::ClusterList m_clusterList;
217  pandora::CartesianPointVector m_coordinateVector;
219  };
220 
221  typedef std::vector<ShowerCluster> ShowerClusterList;
222 
224  typedef std::vector<HitKDNode2D> HitKDNode2DList;
226 
227  typedef std::map<pandora::HitType, const pandora::ClusterList &> ClusterListMap;
228  typedef std::map<pandora::HitType, const SlidingFitDataList> SlidingFitDataListMap;
229  typedef std::map<pandora::HitType, const ShowerClusterList> ShowerClusterListMap;
230  typedef std::map<pandora::HitType, const std::reference_wrapper<HitKDTree2D>> KDTreeMap;
231 
232  typedef MvaFeatureTool<const VertexSelectionBaseAlgorithm *const, const pandora::Vertex *const, const SlidingFitDataListMap &,
233  const ClusterListMap &, const KDTreeMap &, const ShowerClusterListMap &, const float, float &>
235 
236 protected:
246  virtual void FilterVertexList(const pandora::VertexList *const pInputVertexList, HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV,
247  HitKDTree2D &kdTreeW, pandora::VertexVector &filteredVertices) const;
248 
255  virtual void GetBeamConstants(const pandora::VertexVector &vertexVector, BeamConstants &beamConstants) const;
256 
267  virtual void GetVertexScoreList(const pandora::VertexVector &vertexVector, const BeamConstants &beamConstants, HitKDTree2D &kdTreeU,
268  HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW, VertexScoreList &vertexScoreList) const = 0;
269 
278  void GetClusterLists(const pandora::StringVector &inputClusterListNames, pandora::ClusterList &clusterListU,
279  pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const;
280 
289  void CalculateClusterSlidingFits(const pandora::ClusterList &inputClusterList, const unsigned int minClusterCaloHits,
290  const unsigned int slidingFitWindow, SlidingFitDataList &slidingFitDataList) const;
291 
300  float GetBeamDeweightingScore(const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const;
301 
307  bool IsBeamModeOn() const;
308 
317  float GetVertexEnergy(const pandora::Vertex *const pVertex, const KDTreeMap &kdTreeMap) const;
318 
328  float VertexHitEnergy(const pandora::Vertex *const pVertex, const pandora::HitType hitType, HitKDTree2D &kdTree) const;
329 
330  pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle);
331 
332 private:
333  pandora::StatusCode Run();
334 
342  void InitializeKDTrees(HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW) const;
343 
353  bool IsVertexOnHit(const pandora::Vertex *const pVertex, const pandora::HitType hitType, HitKDTree2D &kdTree) const;
354 
363  bool IsVertexInGap(const pandora::Vertex *const pVertex, const pandora::HitType hitType) const;
364 
371  void SelectTopScoreVertices(VertexScoreList &vertexScoreList, pandora::VertexList &selectedVertexList) const;
372 
381  bool AcceptVertexLocation(const pandora::Vertex *const pVertex, const pandora::VertexList &selectedVertexList) const;
382 
391  static bool SortByVertexZPosition(const pandora::Vertex *const pLhs, const pandora::Vertex *const pRhs);
392 
393 private:
394  pandora::StringVector m_inputCaloHitListNames;
396 
398 
399  bool m_beamMode;
401 
403  unsigned int m_maxTopScoreSelections;
404 
406 
409 
412 
415 };
416 
417 //------------------------------------------------------------------------------------------------------------------------------------------
418 
419 inline float VertexSelectionBaseAlgorithm::GetBeamDeweightingScore(const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const
420 {
421  const float vertexMinZ(std::max(pVertex->GetPosition().GetZ(), beamConstants.GetMinZCoordinate()));
422  return (beamConstants.GetMinZCoordinate() - vertexMinZ) * beamConstants.GetDecayConstant();
423 }
424 
425 //------------------------------------------------------------------------------------------------------------------------------------------
426 
428 {
429  return m_beamMode;
430 }
431 
432 //------------------------------------------------------------------------------------------------------------------------------------------
433 //------------------------------------------------------------------------------------------------------------------------------------------
434 
435 inline VertexSelectionBaseAlgorithm::VertexScore::VertexScore(const pandora::Vertex *const pVertex, const float score) :
436  m_pVertex(pVertex),
437  m_score(score)
438 {
439 }
440 
441 //------------------------------------------------------------------------------------------------------------------------------------------
442 
444 {
445  return m_pVertex;
446 }
447 
448 //------------------------------------------------------------------------------------------------------------------------------------------
449 
451 {
452  return m_score;
453 }
454 
455 //------------------------------------------------------------------------------------------------------------------------------------------
456 
458 {
459  return (this->GetScore() > rhs.GetScore());
460 }
461 
462 //------------------------------------------------------------------------------------------------------------------------------------------
463 //------------------------------------------------------------------------------------------------------------------------------------------
464 
466 {
467  return m_minZCoordinate.Get();
468 }
469 
470 //------------------------------------------------------------------------------------------------------------------------------------------
471 
473 {
474  return m_decayConstant.Get();
475 }
476 
477 //------------------------------------------------------------------------------------------------------------------------------------------
478 
479 inline void VertexSelectionBaseAlgorithm::BeamConstants::SetConstants(const float minZCoordinate, const float decayConstant)
480 {
481  m_minZCoordinate = minZCoordinate;
482  m_decayConstant = decayConstant;
483 }
484 
485 //------------------------------------------------------------------------------------------------------------------------------------------
486 
487 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMinLayerDirection() const
488 {
489  return m_minLayerDirection;
490 }
491 
492 //------------------------------------------------------------------------------------------------------------------------------------------
493 
494 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMaxLayerDirection() const
495 {
496  return m_maxLayerDirection;
497 }
498 
499 //------------------------------------------------------------------------------------------------------------------------------------------
500 
501 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMinLayerPosition() const
502 {
503  return m_minLayerPosition;
504 }
505 
506 //------------------------------------------------------------------------------------------------------------------------------------------
507 
508 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMaxLayerPosition() const
509 {
510  return m_maxLayerPosition;
511 }
512 
513 //------------------------------------------------------------------------------------------------------------------------------------------
514 
515 inline const pandora::Cluster *VertexSelectionBaseAlgorithm::SlidingFitData::GetCluster() const
516 {
517  return m_pCluster;
518 }
519 
520 //------------------------------------------------------------------------------------------------------------------------------------------
521 
522 inline const pandora::ClusterList &VertexSelectionBaseAlgorithm::ShowerCluster::GetClusters() const
523 {
524  return m_clusterList;
525 }
526 
527 //------------------------------------------------------------------------------------------------------------------------------------------
528 
530 {
531  return m_twoDSlidingFitResult;
532 }
533 
534 } // namespace lar_content
535 
536 #endif // #ifndef LAR_VERTEX_SELECTION_BASE_ALGORITHM_H
const pandora::Cluster * m_pCluster
Pointer to the corresponding cluster.
float m_minCandidateScoreFraction
Ignore other top-scoring candidates with score less than a fraction of original.
pandora::CartesianPointVector m_coordinateVector
The coordinate vector.
void SetConstants(const float minZCoordinate, const float decayConstant)
Set the beam constants.
KDTreeNodeInfoT< const pandora::CaloHit *, 2 > HitKDNode2D
KDTreeLinkerAlgo< const pandora::CaloHit *, 2 > HitKDTree2D
virtual void FilterVertexList(const pandora::VertexList *const pInputVertexList, HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW, pandora::VertexVector &filteredVertices) const
Filter the input list of vertices to obtain a reduced number of vertex candidates.
std::string m_outputVertexListName
The name under which to save the output vertex list.
pandora::StringVector m_inputCaloHitListNames
The list of calo hit list names.
void GetClusterLists(const pandora::StringVector &inputClusterListNames, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
Get the cluster lists.
void CalculateClusterSlidingFits(const pandora::ClusterList &inputClusterList, const unsigned int minClusterCaloHits, const unsigned int slidingFitWindow, SlidingFitDataList &slidingFitDataList) const
Calculate the cluster sliding fits.
const pandora::CartesianVector & GetMaxLayerDirection() const
Get the max layer direction.
TwoDSlidingFitResult m_twoDSlidingFitResult
The fit to the hits of the cluster list.
pandora::CartesianVector m_minLayerPosition
The position of the fit at the max layer.
bool IsBeamModeOn() const
Whether algorithm is running in beam mode, assuming neutrinos travel in positive z-direction.
const pandora::CartesianVector & GetMinLayerPosition() const
Get the min layer position.
const pandora::ClusterList & GetClusters() const
Get the cluster list.
bool IsVertexOnHit(const pandora::Vertex *const pVertex, const pandora::HitType hitType, HitKDTree2D &kdTree) const
Whether the vertex lies on a hit in the specified view.
Data stored in each KDTree node. The dim1/dim2 fields are usually the duplication of some PFRecHit va...
pandora::CartesianVector m_maxLayerDirection
The direction of the fit at the min layer.
bool AcceptVertexLocation(const pandora::Vertex *const pVertex, const pandora::VertexList &selectedVertexList) const
Whether to accept a candidate vertex, based on its spatial position in relation to other selected can...
float VertexHitEnergy(const pandora::Vertex *const pVertex, const pandora::HitType hitType, HitKDTree2D &kdTree) const
Finds the energy of the nearest hit to the vertex candidate in this view.
std::map< pandora::HitType, const ShowerClusterList > ShowerClusterListMap
Map of shower cluster lists for passing to tools.
virtual void GetBeamConstants(const pandora::VertexVector &vertexVector, BeamConstants &beamConstants) const
Get the beam score constants for a provided list of candidate vertices.
unsigned int m_maxTopScoreSelections
Max number of top-scoring vertex candidate to select for output.
pandora::CartesianVector m_minLayerDirection
The direction of the fit at the min layer.
bool IsVertexInGap(const pandora::Vertex *const pVertex, const pandora::HitType hitType) const
Whether the vertex lies in a registered gap.
Header file for the lar support vector machine class.
MvaFeatureTool< const VertexSelectionBaseAlgorithm *const, const pandora::Vertex *const, const SlidingFitDataListMap &, const ClusterListMap &, const KDTreeMap &, const ShowerClusterListMap &, const float, float & > VertexFeatureTool
The base type for the vertex feature tools.
Header file for the lar two dimensional sliding fit result class.
std::map< pandora::HitType, const pandora::ClusterList & > ClusterListMap
Map array of cluster lists for passing to tools.
const TwoDSlidingFitResult & GetFit() const
Get the 2D sliding linear fit.
pandora::CartesianVector m_maxLayerPosition
The position of the fit at the max layer.
bool m_useDetectorGaps
Whether to account for registered detector gaps in vertex selection.
static bool SortByVertexZPosition(const pandora::Vertex *const pLhs, const pandora::Vertex *const pRhs)
Sort vertices by increasing z position.
VertexScore(const pandora::Vertex *const pVertex, const float score)
Constructor.
void InitializeKDTrees(HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW) const
Initialize kd trees with details of hits in algorithm-configured cluster lists.
const pandora::Vertex * m_pVertex
The address of the vertex.
bool operator<(const VertexScore &rhs) const
operator<
const pandora::Vertex * GetVertex() const
Get the address of the vertex.
const pandora::CartesianVector & GetMaxLayerPosition() const
Get the max layer position.
bool m_beamMode
Whether to run in beam mode, assuming neutrinos travel in positive z-direction.
bool m_isEmptyViewAcceptable
Whether views entirely empty of hits are classed as &#39;acceptable&#39; for candidate filtration.
bool m_selectSingleVertex
Whether to make a final decision and select just one vertex candidate.
std::map< pandora::HitType, const SlidingFitDataList > SlidingFitDataListMap
Map of sliding fit data lists for passing to tools.
float GetVertexEnergy(const pandora::Vertex *const pVertex, const KDTreeMap &kdTreeMap) const
Calculate the energy of a vertex candidate by summing values from all three planes.
HitType
Definition: HitType.h:12
unsigned int m_minVertexAcceptableViews
The minimum number of views in which a candidate must sit on/near a hit or in a gap (or view can be e...
std::vector< art::Ptr< recob::Vertex > > VertexVector
virtual void GetVertexScoreList(const pandora::VertexVector &vertexVector, const BeamConstants &beamConstants, HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW, VertexScoreList &vertexScoreList) const =0
Get the vertex score list for a provided list of candidate vertices.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
void SelectTopScoreVertices(VertexScoreList &vertexScoreList, pandora::VertexList &selectedVertexList) const
From the top-scoring candidate vertices, select a subset for further investigation.
std::map< pandora::HitType, const std::reference_wrapper< HitKDTree2D > > KDTreeMap
Map array of hit kd trees for passing to tools.
float GetBeamDeweightingScore(const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const
Get the beam deweighting score for a vertex.
float m_nDecayLengthsInZSpan
The number of score decay lengths to use over the course of the vertex z-span.
float m_minCandidateDisplacement
Ignore other top-scoring candidates located in close proximity to original.
bool m_replaceCurrentVertexList
Whether to replace the current vertex list with the output list.
MvaFeatureTool class template.
Definition: LArMvaHelper.h:33
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
const pandora::CartesianVector & GetMinLayerDirection() const
Get the min layer direction.
std::list< Vertex > VertexList
Definition: DCEL.h:169
float m_gapTolerance
The tolerance to use when querying whether a sampling point is in a gap, units cm.
float m_maxOnHitDisplacement
Max hit-vertex displacement for declaring vertex to lie on a hit in each view.
const pandora::Cluster * GetCluster() const
Get a pointer to the corresponding cluster.