LArSoft  v10_04_05
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;
395  std::string m_inputVertexListName;
397 
399 
400  bool m_beamMode;
402 
404  unsigned int m_maxTopScoreSelections;
405 
407 
410 
413 
416 };
417 
418 //------------------------------------------------------------------------------------------------------------------------------------------
419 
420 inline float VertexSelectionBaseAlgorithm::GetBeamDeweightingScore(const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const
421 {
422  const float vertexMinZ(std::max(pVertex->GetPosition().GetZ(), beamConstants.GetMinZCoordinate()));
423  return (beamConstants.GetMinZCoordinate() - vertexMinZ) * beamConstants.GetDecayConstant();
424 }
425 
426 //------------------------------------------------------------------------------------------------------------------------------------------
427 
429 {
430  return m_beamMode;
431 }
432 
433 //------------------------------------------------------------------------------------------------------------------------------------------
434 //------------------------------------------------------------------------------------------------------------------------------------------
435 
436 inline VertexSelectionBaseAlgorithm::VertexScore::VertexScore(const pandora::Vertex *const pVertex, const float score) :
437  m_pVertex(pVertex),
438  m_score(score)
439 {
440 }
441 
442 //------------------------------------------------------------------------------------------------------------------------------------------
443 
445 {
446  return m_pVertex;
447 }
448 
449 //------------------------------------------------------------------------------------------------------------------------------------------
450 
452 {
453  return m_score;
454 }
455 
456 //------------------------------------------------------------------------------------------------------------------------------------------
457 
459 {
460  return (this->GetScore() > rhs.GetScore());
461 }
462 
463 //------------------------------------------------------------------------------------------------------------------------------------------
464 //------------------------------------------------------------------------------------------------------------------------------------------
465 
467 {
468  return m_minZCoordinate.Get();
469 }
470 
471 //------------------------------------------------------------------------------------------------------------------------------------------
472 
474 {
475  return m_decayConstant.Get();
476 }
477 
478 //------------------------------------------------------------------------------------------------------------------------------------------
479 
480 inline void VertexSelectionBaseAlgorithm::BeamConstants::SetConstants(const float minZCoordinate, const float decayConstant)
481 {
482  m_minZCoordinate = minZCoordinate;
483  m_decayConstant = decayConstant;
484 }
485 
486 //------------------------------------------------------------------------------------------------------------------------------------------
487 
488 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMinLayerDirection() const
489 {
490  return m_minLayerDirection;
491 }
492 
493 //------------------------------------------------------------------------------------------------------------------------------------------
494 
495 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMaxLayerDirection() const
496 {
497  return m_maxLayerDirection;
498 }
499 
500 //------------------------------------------------------------------------------------------------------------------------------------------
501 
502 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMinLayerPosition() const
503 {
504  return m_minLayerPosition;
505 }
506 
507 //------------------------------------------------------------------------------------------------------------------------------------------
508 
509 inline const pandora::CartesianVector &VertexSelectionBaseAlgorithm::SlidingFitData::GetMaxLayerPosition() const
510 {
511  return m_maxLayerPosition;
512 }
513 
514 //------------------------------------------------------------------------------------------------------------------------------------------
515 
516 inline const pandora::Cluster *VertexSelectionBaseAlgorithm::SlidingFitData::GetCluster() const
517 {
518  return m_pCluster;
519 }
520 
521 //------------------------------------------------------------------------------------------------------------------------------------------
522 
523 inline const pandora::ClusterList &VertexSelectionBaseAlgorithm::ShowerCluster::GetClusters() const
524 {
525  return m_clusterList;
526 }
527 
528 //------------------------------------------------------------------------------------------------------------------------------------------
529 
531 {
532  return m_twoDSlidingFitResult;
533 }
534 
535 } // namespace lar_content
536 
537 #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...
std::string m_inputVertexListName
The name of an input vertex list to check.
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.