Classes | Public Types | Public Member Functions | Protected Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
lar_content::VertexSelectionBaseAlgorithm Class Referenceabstract

VertexSelectionBaseAlgorithm class. More...

#include <VertexSelectionBaseAlgorithm.h>

Inheritance diagram for lar_content::VertexSelectionBaseAlgorithm:
lar_content::EnergyKickVertexSelectionAlgorithm lar_content::HitAngleVertexSelectionAlgorithm lar_content::TrainedVertexSelectionAlgorithm lar_content::CheatingVertexSelectionAlgorithm lar_content::MvaVertexSelectionAlgorithm< T >

Classes

class  BeamConstants
 Beam constants class. More...
 
class  ShowerCluster
 Shower cluster class. More...
 
class  SlidingFitData
 Sliding fit data class. More...
 
class  VertexScore
 VertexScore class. More...
 

Public Types

typedef std::vector< VertexScoreVertexScoreList
 
typedef std::vector< SlidingFitDataSlidingFitDataList
 
typedef std::vector< ShowerClusterShowerClusterList
 
typedef KDTreeNodeInfoT< const pandora::CaloHit *, 2 > HitKDNode2D
 
typedef std::vector< HitKDNode2DHitKDNode2DList
 
typedef KDTreeLinkerAlgo< const pandora::CaloHit *, 2 > HitKDTree2D
 
typedef std::map< pandora::HitType, const pandora::ClusterList & > ClusterListMap
 Map array of cluster lists for passing to tools. More...
 
typedef std::map< pandora::HitType, const SlidingFitDataListSlidingFitDataListMap
 Map of sliding fit data lists for passing to tools. More...
 
typedef std::map< pandora::HitType, const ShowerClusterListShowerClusterListMap
 Map of shower cluster lists for passing to tools. More...
 
typedef std::map< pandora::HitType, const std::reference_wrapper< HitKDTree2D > > KDTreeMap
 Map array of hit kd trees for passing to tools. More...
 
typedef 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. More...
 

Public Member Functions

 VertexSelectionBaseAlgorithm ()
 Default constructor. More...
 

Protected Member Functions

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. More...
 
virtual void GetBeamConstants (const pandora::VertexVector &vertexVector, BeamConstants &beamConstants) const
 Get the beam score constants for a provided list of candidate vertices. More...
 
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. More...
 
void GetClusterLists (const pandora::StringVector &inputClusterListNames, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
 Get the cluster lists. More...
 
void CalculateClusterSlidingFits (const pandora::ClusterList &inputClusterList, const unsigned int minClusterCaloHits, const unsigned int slidingFitWindow, SlidingFitDataList &slidingFitDataList) const
 Calculate the cluster sliding fits. More...
 
float GetBeamDeweightingScore (const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const
 Get the beam deweighting score for a vertex. More...
 
bool IsBeamModeOn () const
 Whether algorithm is running in beam mode, assuming neutrinos travel in positive z-direction. More...
 
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. More...
 
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. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Private Member Functions

pandora::StatusCode Run ()
 
void InitializeKDTrees (HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW) const
 Initialize kd trees with details of hits in algorithm-configured cluster lists. More...
 
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. More...
 
bool IsVertexInGap (const pandora::Vertex *const pVertex, const pandora::HitType hitType) const
 Whether the vertex lies in a registered gap. More...
 
void SelectTopScoreVertices (VertexScoreList &vertexScoreList, pandora::VertexList &selectedVertexList) const
 From the top-scoring candidate vertices, select a subset for further investigation. More...
 
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 candidates. More...
 

Static Private Member Functions

static bool SortByVertexZPosition (const pandora::Vertex *const pLhs, const pandora::Vertex *const pRhs)
 Sort vertices by increasing z position. More...
 

Private Attributes

pandora::StringVector m_inputCaloHitListNames
 The list of calo hit list names. 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...
 
bool m_beamMode
 Whether to run in beam mode, assuming neutrinos travel in positive z-direction. More...
 
float m_nDecayLengthsInZSpan
 The number of score decay lengths to use over the course of the vertex z-span. More...
 
bool m_selectSingleVertex
 Whether to make a final decision and select just one vertex candidate. More...
 
unsigned int m_maxTopScoreSelections
 Max number of top-scoring vertex candidate to select for output. More...
 
float m_maxOnHitDisplacement
 Max hit-vertex displacement for declaring vertex to lie on a hit in each view. More...
 
float m_minCandidateDisplacement
 Ignore other top-scoring candidates located in close proximity to original. More...
 
float m_minCandidateScoreFraction
 Ignore other top-scoring candidates with score less than a fraction of original. More...
 
bool m_useDetectorGaps
 Whether to account for registered detector gaps in vertex selection. More...
 
float m_gapTolerance
 The tolerance to use when querying whether a sampling point is in a gap, units cm. More...
 
bool m_isEmptyViewAcceptable
 Whether views entirely empty of hits are classed as 'acceptable' for candidate filtration. More...
 
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 empty) More...
 

Detailed Description

VertexSelectionBaseAlgorithm class.

Definition at line 32 of file VertexSelectionBaseAlgorithm.h.

Member Typedef Documentation

typedef std::map<pandora::HitType, const pandora::ClusterList &> lar_content::VertexSelectionBaseAlgorithm::ClusterListMap

Map array of cluster lists for passing to tools.

Definition at line 227 of file VertexSelectionBaseAlgorithm.h.

Definition at line 223 of file VertexSelectionBaseAlgorithm.h.

Definition at line 224 of file VertexSelectionBaseAlgorithm.h.

Definition at line 225 of file VertexSelectionBaseAlgorithm.h.

typedef std::map<pandora::HitType, const std::reference_wrapper<HitKDTree2D> > lar_content::VertexSelectionBaseAlgorithm::KDTreeMap

Map array of hit kd trees for passing to tools.

Definition at line 230 of file VertexSelectionBaseAlgorithm.h.

Definition at line 221 of file VertexSelectionBaseAlgorithm.h.

Map of shower cluster lists for passing to tools.

Definition at line 229 of file VertexSelectionBaseAlgorithm.h.

Definition at line 175 of file VertexSelectionBaseAlgorithm.h.

Map of sliding fit data lists for passing to tools.

Definition at line 228 of file VertexSelectionBaseAlgorithm.h.

typedef MvaFeatureTool<const VertexSelectionBaseAlgorithm *const, const pandora::Vertex *const, const SlidingFitDataListMap &, const ClusterListMap &, const KDTreeMap &, const ShowerClusterListMap &, const float, float &> lar_content::VertexSelectionBaseAlgorithm::VertexFeatureTool

The base type for the vertex feature tools.

Definition at line 234 of file VertexSelectionBaseAlgorithm.h.

Definition at line 82 of file VertexSelectionBaseAlgorithm.h.

Constructor & Destructor Documentation

lar_content::VertexSelectionBaseAlgorithm::VertexSelectionBaseAlgorithm ( )

Default constructor.

Definition at line 22 of file VertexSelectionBaseAlgorithm.cc.

22  :
24  m_beamMode(true),
31  m_useDetectorGaps(true),
32  m_gapTolerance(0.f),
35 {
36 }
float m_minCandidateScoreFraction
Ignore other top-scoring candidates with score less than a fraction of original.
unsigned int m_maxTopScoreSelections
Max number of top-scoring vertex candidate to select for output.
bool m_useDetectorGaps
Whether to account for registered detector gaps in vertex selection.
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.
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...
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.
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.

Member Function Documentation

bool lar_content::VertexSelectionBaseAlgorithm::AcceptVertexLocation ( const pandora::Vertex *const  pVertex,
const pandora::VertexList &  selectedVertexList 
) const
private

Whether to accept a candidate vertex, based on its spatial position in relation to other selected candidates.

Parameters
pVertexthe address of the vertex
selectedVertexListthe selected vertex list
Returns
boolean

Definition at line 314 of file VertexSelectionBaseAlgorithm.cc.

315 {
316  const CartesianVector &position(pVertex->GetPosition());
317  const float minCandidateDisplacementSquared(m_minCandidateDisplacement * m_minCandidateDisplacement);
318 
319  for (const Vertex *const pSelectedVertex : selectedVertexList)
320  {
321  if (pVertex == pSelectedVertex)
322  return false;
323 
324  if ((position - pSelectedVertex->GetPosition()).GetMagnitudeSquared() < minCandidateDisplacementSquared)
325  return false;
326  }
327 
328  return true;
329 }
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
float m_minCandidateDisplacement
Ignore other top-scoring candidates located in close proximity to original.
void lar_content::VertexSelectionBaseAlgorithm::CalculateClusterSlidingFits ( const pandora::ClusterList &  inputClusterList,
const unsigned int  minClusterCaloHits,
const unsigned int  slidingFitWindow,
SlidingFitDataList slidingFitDataList 
) const
protected

Calculate the cluster sliding fits.

Parameters
inputClusterListthe input cluster list
minClusterCaloHitsthe minimum number of cluster calo hits
slidingFitWindowthe sliding fit window
slidingFitDataListthe list of sliding fits to fill

Definition at line 120 of file VertexSelectionBaseAlgorithm.cc.

122 {
123  const float slidingFitPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
124 
125  ClusterVector sortedClusters(inputClusterList.begin(), inputClusterList.end());
126  std::sort(sortedClusters.begin(), sortedClusters.end(), LArClusterHelper::SortByNHits);
127 
128  for (const Cluster *const pCluster : sortedClusters)
129  {
130  if (pCluster->GetNCaloHits() < minClusterCaloHits)
131  continue;
132 
133  // Make sure the window size is such that there are not more layers than hits (following TwoDSlidingLinearFit calculation).
134  const unsigned int newSlidingFitWindow(
135  std::min(static_cast<int>(pCluster->GetNCaloHits()), static_cast<int>(slidingFitPitch * slidingFitWindow)));
136  slidingFitDataList.emplace_back(pCluster, newSlidingFitWindow, slidingFitPitch);
137  }
138 }
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.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void lar_content::VertexSelectionBaseAlgorithm::FilterVertexList ( const pandora::VertexList *const  pInputVertexList,
HitKDTree2D kdTreeU,
HitKDTree2D kdTreeV,
HitKDTree2D kdTreeW,
pandora::VertexVector &  filteredVertices 
) const
protectedvirtual

Filter the input list of vertices to obtain a reduced number of vertex candidates.

Parameters
pInputVertexListthe address of the input vertex list
kdTreeUthe kd tree for u hits
kdTreeVthe kd tree for v hits
kdTreeWthe kd tree for w hits
filteredVerticesto receive the filtered vertex list

Definition at line 40 of file VertexSelectionBaseAlgorithm.cc.

42 {
43  for (const Vertex *const pVertex : *pInputVertexList)
44  {
45  unsigned int nAcceptableViews(0);
46 
47  if ((m_isEmptyViewAcceptable && kdTreeU.empty()) || this->IsVertexOnHit(pVertex, TPC_VIEW_U, kdTreeU) || this->IsVertexInGap(pVertex, TPC_VIEW_U))
48  ++nAcceptableViews;
49 
50  if ((m_isEmptyViewAcceptable && kdTreeV.empty()) || this->IsVertexOnHit(pVertex, TPC_VIEW_V, kdTreeV) || this->IsVertexInGap(pVertex, TPC_VIEW_V))
51  ++nAcceptableViews;
52 
53  if ((m_isEmptyViewAcceptable && kdTreeW.empty()) || this->IsVertexOnHit(pVertex, TPC_VIEW_W, kdTreeW) || this->IsVertexInGap(pVertex, TPC_VIEW_W))
54  ++nAcceptableViews;
55 
56  if (nAcceptableViews >= m_minVertexAcceptableViews)
57  filteredVertices.push_back(pVertex);
58  }
59 
60  std::sort(filteredVertices.begin(), filteredVertices.end(), SortByVertexZPosition);
61 }
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.
bool IsVertexInGap(const pandora::Vertex *const pVertex, const pandora::HitType hitType) const
Whether the vertex lies in a registered gap.
static bool SortByVertexZPosition(const pandora::Vertex *const pLhs, const pandora::Vertex *const pRhs)
Sort vertices by increasing z position.
bool m_isEmptyViewAcceptable
Whether views entirely empty of hits are classed as &#39;acceptable&#39; for candidate filtration.
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...
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
void lar_content::VertexSelectionBaseAlgorithm::GetBeamConstants ( const pandora::VertexVector &  vertexVector,
BeamConstants beamConstants 
) const
protectedvirtual

Get the beam score constants for a provided list of candidate vertices.

Parameters
vertexVectorthe vertex vector
beamConstantsto receive the beam constants

Definition at line 65 of file VertexSelectionBaseAlgorithm.cc.

66 {
67  if (!m_beamMode)
68  return;
69 
70  if (vertexVector.empty())
71  throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
72 
73  float minZCoordinate(std::numeric_limits<float>::max()), maxZCoordinate(-std::numeric_limits<float>::max());
74 
75  for (const Vertex *const pVertex : vertexVector)
76  {
77  if (pVertex->GetPosition().GetZ() < minZCoordinate)
78  minZCoordinate = pVertex->GetPosition().GetZ();
79 
80  if (pVertex->GetPosition().GetZ() > maxZCoordinate)
81  maxZCoordinate = pVertex->GetPosition().GetZ();
82  }
83 
84  const float zSpan(maxZCoordinate - minZCoordinate);
85  const float decayConstant((zSpan < std::numeric_limits<float>::epsilon()) ? 0.f : (m_nDecayLengthsInZSpan / zSpan));
86  beamConstants.SetConstants(minZCoordinate, decayConstant);
87 }
static int max(int a, int b)
bool m_beamMode
Whether to run in beam mode, assuming neutrinos travel in positive z-direction.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
float m_nDecayLengthsInZSpan
The number of score decay lengths to use over the course of the vertex z-span.
float lar_content::VertexSelectionBaseAlgorithm::GetBeamDeweightingScore ( const BeamConstants beamConstants,
const pandora::Vertex *const  pVertex 
) const
inlineprotected

Get the beam deweighting score for a vertex.

Parameters
beamConstantsthe beam constants
pVertexaddress of the vertex
Returns
the score

Definition at line 419 of file VertexSelectionBaseAlgorithm.h.

420 {
421  const float vertexMinZ(std::max(pVertex->GetPosition().GetZ(), beamConstants.GetMinZCoordinate()));
422  return (beamConstants.GetMinZCoordinate() - vertexMinZ) * beamConstants.GetDecayConstant();
423 }
static int max(int a, int b)
void lar_content::VertexSelectionBaseAlgorithm::GetClusterLists ( const pandora::StringVector inputClusterListNames,
pandora::ClusterList &  clusterListU,
pandora::ClusterList &  clusterListV,
pandora::ClusterList &  clusterListW 
) const
protected

Get the cluster lists.

Parameters
inputClusterListNamesthe input cluster list names
clusterListUthe U-view cluster list to populate
clusterListVthe V-view cluster list to populate
clusterListWthe W-view cluster list to populate

Definition at line 91 of file VertexSelectionBaseAlgorithm.cc.

93 {
94  for (const std::string &clusterListName : inputClusterListNames)
95  {
96  const ClusterList *pClusterList(NULL);
97  PANDORA_THROW_RESULT_IF_AND_IF(
98  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, clusterListName, pClusterList));
99 
100  if (!pClusterList || pClusterList->empty())
101  {
102  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
103  std::cout << "EnergyKickVertexSelectionAlgorithm: unable to find cluster list " << clusterListName << std::endl;
104 
105  continue;
106  }
107 
108  const HitType hitType(LArClusterHelper::GetClusterHitType(*(pClusterList->begin())));
109 
110  if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
111  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
112 
113  ClusterList &clusterList((TPC_VIEW_U == hitType) ? clusterListU : (TPC_VIEW_V == hitType) ? clusterListV : clusterListW);
114  clusterList.insert(clusterList.end(), pClusterList->begin(), pClusterList->end());
115  }
116 }
enum cvn::HType HitType
std::string string
Definition: nybbler.cc:12
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
QTextStream & endl(QTextStream &s)
float lar_content::VertexSelectionBaseAlgorithm::GetVertexEnergy ( const pandora::Vertex *const  pVertex,
const KDTreeMap kdTreeMap 
) const
protected

Calculate the energy of a vertex candidate by summing values from all three planes.

Parameters
pVertexthe address of the vertex
kdTreeMapthe map of 2D hit kd trees
Returns
the summed vertex energy

Definition at line 243 of file VertexSelectionBaseAlgorithm.cc.

244 {
245  float totalEnergy(0.f);
246 
247  if (!this->IsVertexInGap(pVertex, TPC_VIEW_U))
248  totalEnergy += this->VertexHitEnergy(pVertex, TPC_VIEW_U, kdTreeMap.at(TPC_VIEW_U));
249 
250  if (!this->IsVertexInGap(pVertex, TPC_VIEW_V))
251  totalEnergy += this->VertexHitEnergy(pVertex, TPC_VIEW_V, kdTreeMap.at(TPC_VIEW_V));
252 
253  if (!this->IsVertexInGap(pVertex, TPC_VIEW_W))
254  totalEnergy += this->VertexHitEnergy(pVertex, TPC_VIEW_W, kdTreeMap.at(TPC_VIEW_W));
255 
256  return totalEnergy;
257 }
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.
bool IsVertexInGap(const pandora::Vertex *const pVertex, const pandora::HitType hitType) const
Whether the vertex lies in a registered gap.
virtual void lar_content::VertexSelectionBaseAlgorithm::GetVertexScoreList ( const pandora::VertexVector &  vertexVector,
const BeamConstants beamConstants,
HitKDTree2D kdTreeU,
HitKDTree2D kdTreeV,
HitKDTree2D kdTreeW,
VertexScoreList vertexScoreList 
) const
protectedpure virtual

Get the vertex score list for a provided list of candidate vertices.

Parameters
vertexVectorthe vertex vector
beamConstantsthe beam constants
kdTreeUthe kd tree for u hits
kdTreeVthe kd tree for v hits
kdTreeWthe kd tree for w hits
vertexScoreListto receive the vertex score list

Implemented in lar_content::TrainedVertexSelectionAlgorithm, lar_content::MvaVertexSelectionAlgorithm< T >, lar_content::EnergyKickVertexSelectionAlgorithm, lar_content::HitAngleVertexSelectionAlgorithm, and lar_content::CheatingVertexSelectionAlgorithm.

void lar_content::VertexSelectionBaseAlgorithm::InitializeKDTrees ( HitKDTree2D kdTreeU,
HitKDTree2D kdTreeV,
HitKDTree2D kdTreeW 
) const
private

Initialize kd trees with details of hits in algorithm-configured cluster lists.

Parameters
kdTreeUthe kd tree for u hits
kdTreeVthe kd tree for v hits
kdTreeWthe kd tree for w hits

Definition at line 186 of file VertexSelectionBaseAlgorithm.cc.

187 {
188  for (const std::string &caloHitListName : m_inputCaloHitListNames)
189  {
190  const CaloHitList *pCaloHitList = NULL;
191  PANDORA_THROW_RESULT_IF_AND_IF(
192  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, caloHitListName, pCaloHitList));
193 
194  if (!pCaloHitList || pCaloHitList->empty())
195  {
196  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
197  std::cout << "VertexSelectionBaseAlgorithm: unable to find calo hit list " << caloHitListName << std::endl;
198 
199  continue;
200  }
201 
202  const HitType hitType((*(pCaloHitList->begin()))->GetHitType());
203 
204  if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
205  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
206 
207  HitKDTree2D &kdTree((TPC_VIEW_U == hitType) ? kdTreeU : (TPC_VIEW_V == hitType) ? kdTreeV : kdTreeW);
208 
209  if (!kdTree.empty())
210  throw StatusCodeException(STATUS_CODE_FAILURE);
211 
212  HitKDNode2DList hitKDNode2DList;
213  KDTreeBox hitsBoundingRegion2D(fill_and_bound_2d_kd_tree(*pCaloHitList, hitKDNode2DList));
214  kdTree.build(hitKDNode2DList, hitsBoundingRegion2D);
215  }
216 }
KDTreeLinkerAlgo< const pandora::CaloHit *, 2 > HitKDTree2D
enum cvn::HType HitType
std::string string
Definition: nybbler.cc:12
pandora::StringVector m_inputCaloHitListNames
The list of calo hit list names.
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 >> &nodes)
fill_and_bound_2d_kd_tree
KDTreeBoxT< 2 > KDTreeBox
QTextStream & endl(QTextStream &s)
bool lar_content::VertexSelectionBaseAlgorithm::IsBeamModeOn ( ) const
inlineprotected

Whether algorithm is running in beam mode, assuming neutrinos travel in positive z-direction.

Returns
boolean

Definition at line 427 of file VertexSelectionBaseAlgorithm.h.

428 {
429  return m_beamMode;
430 }
bool m_beamMode
Whether to run in beam mode, assuming neutrinos travel in positive z-direction.
bool lar_content::VertexSelectionBaseAlgorithm::IsVertexInGap ( const pandora::Vertex *const  pVertex,
const pandora::HitType  hitType 
) const
private

Whether the vertex lies in a registered gap.

Parameters
pVertexthe address of the vertex
hitTypethe relevant hit type
Returns
boolean

Definition at line 233 of file VertexSelectionBaseAlgorithm.cc.

234 {
235  if (!m_useDetectorGaps)
236  return false;
237 
238  return LArGeometryHelper::IsInGap3D(this->GetPandora(), pVertex->GetPosition(), hitType, m_gapTolerance);
239 }
bool m_useDetectorGaps
Whether to account for registered detector gaps in vertex selection.
float m_gapTolerance
The tolerance to use when querying whether a sampling point is in a gap, units cm.
static bool IsInGap3D(const pandora::Pandora &pandora, const pandora::CartesianVector &testPoint3D, const pandora::HitType hitType, const float gapTolerance=0.f)
Whether a 3D test point lies in a registered gap with the associated hit type.
bool lar_content::VertexSelectionBaseAlgorithm::IsVertexOnHit ( const pandora::Vertex *const  pVertex,
const pandora::HitType  hitType,
HitKDTree2D kdTree 
) const
private

Whether the vertex lies on a hit in the specified view.

Parameters
pVertexthe address of the vertex
hitTypethe relevant hit type
kdTreethe relevant kd tree
Returns
boolean

Definition at line 220 of file VertexSelectionBaseAlgorithm.cc.

221 {
222  const CartesianVector vertexPosition2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
224 
226  kdTree.search(searchRegionHits, found);
227 
228  return (!found.empty());
229 }
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
KDTreeBoxT< 2 > KDTreeBox
float m_maxOnHitDisplacement
Max hit-vertex displacement for declaring vertex to lie on a hit in each view.
StatusCode lar_content::VertexSelectionBaseAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
protected

Definition at line 393 of file VertexSelectionBaseAlgorithm.cc.

394 {
395  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputCaloHitListNames", m_inputCaloHitListNames));
396 
397  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputVertexListName", m_outputVertexListName));
398 
399  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
400  XmlHelper::ReadValue(xmlHandle, "ReplaceCurrentVertexList", m_replaceCurrentVertexList));
401 
402  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "BeamMode", m_beamMode));
403 
404  PANDORA_RETURN_RESULT_IF_AND_IF(
405  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NDecayLengthsInZSpan", m_nDecayLengthsInZSpan));
406 
407  PANDORA_RETURN_RESULT_IF_AND_IF(
408  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SelectSingleVertex", m_selectSingleVertex));
409 
410  PANDORA_RETURN_RESULT_IF_AND_IF(
411  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxTopScoreSelections", m_maxTopScoreSelections));
412 
413  PANDORA_RETURN_RESULT_IF_AND_IF(
414  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxOnHitDisplacement", m_maxOnHitDisplacement));
415 
416  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
417  XmlHelper::ReadValue(xmlHandle, "MinCandidateDisplacement", m_minCandidateDisplacement));
418 
419  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
420  XmlHelper::ReadValue(xmlHandle, "MinCandidateScoreFraction", m_minCandidateScoreFraction));
421 
422  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "UseDetectorGaps", m_useDetectorGaps));
423 
424  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "GapTolerance", m_gapTolerance));
425 
426  PANDORA_RETURN_RESULT_IF_AND_IF(
427  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "IsEmptyViewAcceptable", m_isEmptyViewAcceptable));
428 
429  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
430  XmlHelper::ReadValue(xmlHandle, "MinVertexAcceptableViews", m_minVertexAcceptableViews));
431 
432  return STATUS_CODE_SUCCESS;
433 }
float m_minCandidateScoreFraction
Ignore other top-scoring candidates with score less than a fraction of original.
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.
unsigned int m_maxTopScoreSelections
Max number of top-scoring vertex candidate to select for output.
bool m_useDetectorGaps
Whether to account for registered detector gaps in vertex selection.
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.
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...
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.
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.
StatusCode lar_content::VertexSelectionBaseAlgorithm::Run ( )
private

Definition at line 142 of file VertexSelectionBaseAlgorithm.cc.

143 {
144  const VertexList *pInputVertexList(NULL);
145  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pInputVertexList));
146 
147  if (!pInputVertexList || pInputVertexList->empty())
148  {
149  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
150  std::cout << "VertexSelectionBaseAlgorithm: unable to find current vertex list " << std::endl;
151 
152  return STATUS_CODE_SUCCESS;
153  }
154 
155  HitKDTree2D kdTreeU, kdTreeV, kdTreeW;
156  this->InitializeKDTrees(kdTreeU, kdTreeV, kdTreeW);
157 
158  VertexVector filteredVertices;
159  this->FilterVertexList(pInputVertexList, kdTreeU, kdTreeV, kdTreeW, filteredVertices);
160 
161  if (filteredVertices.empty())
162  return STATUS_CODE_SUCCESS;
163 
164  BeamConstants beamConstants;
165  this->GetBeamConstants(filteredVertices, beamConstants);
166 
167  VertexScoreList vertexScoreList;
168  this->GetVertexScoreList(filteredVertices, beamConstants, kdTreeU, kdTreeV, kdTreeW, vertexScoreList);
169 
170  VertexList selectedVertexList;
171  this->SelectTopScoreVertices(vertexScoreList, selectedVertexList);
172 
173  if (!selectedVertexList.empty())
174  {
175  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList(*this, m_outputVertexListName, selectedVertexList));
176 
178  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Vertex>(*this, m_outputVertexListName));
179  }
180 
181  return STATUS_CODE_SUCCESS;
182 }
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.
virtual void GetBeamConstants(const pandora::VertexVector &vertexVector, BeamConstants &beamConstants) const
Get the beam score constants for a provided list of candidate vertices.
void InitializeKDTrees(HitKDTree2D &kdTreeU, HitKDTree2D &kdTreeV, HitKDTree2D &kdTreeW) const
Initialize kd trees with details of hits in algorithm-configured cluster lists.
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.
void SelectTopScoreVertices(VertexScoreList &vertexScoreList, pandora::VertexList &selectedVertexList) const
From the top-scoring candidate vertices, select a subset for further investigation.
bool m_replaceCurrentVertexList
Whether to replace the current vertex list with the output list.
std::list< Vertex > VertexList
Definition: DCEL.h:182
QTextStream & endl(QTextStream &s)
void lar_content::VertexSelectionBaseAlgorithm::SelectTopScoreVertices ( VertexScoreList vertexScoreList,
pandora::VertexList &  selectedVertexList 
) const
private

From the top-scoring candidate vertices, select a subset for further investigation.

Parameters
vertexScoreListthe vertex score list
selectedVertexListto receive the selected vertex list

Definition at line 286 of file VertexSelectionBaseAlgorithm.cc.

287 {
288  float bestScore(0.f);
289  std::sort(vertexScoreList.begin(), vertexScoreList.end());
290 
291  for (const VertexScore &vertexScore : vertexScoreList)
292  {
293  if (selectedVertexList.size() >= m_maxTopScoreSelections)
294  break;
295 
296  if (!selectedVertexList.empty() && !this->AcceptVertexLocation(vertexScore.GetVertex(), selectedVertexList))
297  continue;
298 
299  if (!selectedVertexList.empty() && (vertexScore.GetScore() < m_minCandidateScoreFraction * bestScore))
300  continue;
301 
302  selectedVertexList.push_back(vertexScore.GetVertex());
303 
305  return;
306 
307  if (vertexScore.GetScore() > bestScore)
308  bestScore = vertexScore.GetScore();
309  }
310 }
float m_minCandidateScoreFraction
Ignore other top-scoring candidates with score less than a fraction of original.
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...
unsigned int m_maxTopScoreSelections
Max number of top-scoring vertex candidate to select for output.
bool m_selectSingleVertex
Whether to make a final decision and select just one vertex candidate.
bool lar_content::VertexSelectionBaseAlgorithm::SortByVertexZPosition ( const pandora::Vertex *const  pLhs,
const pandora::Vertex *const  pRhs 
)
staticprivate

Sort vertices by increasing z position.

Parameters
pLhsaddress of the lhs vertex
pRhsaddress of the rhs vertex
Returns
whether lhs should precedes rhs

Definition at line 333 of file VertexSelectionBaseAlgorithm.cc.

334 {
335  const CartesianVector deltaPosition(pRhs->GetPosition() - pLhs->GetPosition());
336 
337  if (std::fabs(deltaPosition.GetZ()) > std::numeric_limits<float>::epsilon())
338  return (deltaPosition.GetZ() > std::numeric_limits<float>::epsilon());
339 
340  if (std::fabs(deltaPosition.GetX()) > std::numeric_limits<float>::epsilon())
341  return (deltaPosition.GetX() > std::numeric_limits<float>::epsilon());
342 
343  // ATTN No way to distinguish between vertices if still have a tie in y coordinate
344  return (deltaPosition.GetY() > std::numeric_limits<float>::epsilon());
345 }
float lar_content::VertexSelectionBaseAlgorithm::VertexHitEnergy ( const pandora::Vertex *const  pVertex,
const pandora::HitType  hitType,
HitKDTree2D kdTree 
) const
protected

Finds the energy of the nearest hit to the vertex candidate in this view.

Parameters
pVertexthe address of the vertex
hitTypethe relevant hit type
kdTreethe kd tree of 2D hits
Returns
the energy of the nearest hit

Definition at line 261 of file VertexSelectionBaseAlgorithm.cc.

262 {
263  const CartesianVector vertexPosition2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
265 
266  HitKDNode2DList foundHits;
267  kdTree.search(searchRegionHits, foundHits);
268 
270  float energy(0);
271 
272  for (auto hit : foundHits)
273  {
274  const float diff = (vertexPosition2D - hit.data->GetPositionVector()).GetMagnitude();
275  if (diff < dr)
276  {
277  dr = diff;
278  energy = hit.data->GetElectromagneticEnergy();
279  }
280  }
281  return energy;
282 }
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
static int max(int a, int b)
Detector simulation of raw signals on wires.
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
KDTreeBoxT< 2 > KDTreeBox
float m_maxOnHitDisplacement
Max hit-vertex displacement for declaring vertex to lie on a hit in each view.

Member Data Documentation

bool lar_content::VertexSelectionBaseAlgorithm::m_beamMode
private

Whether to run in beam mode, assuming neutrinos travel in positive z-direction.

Definition at line 399 of file VertexSelectionBaseAlgorithm.h.

float lar_content::VertexSelectionBaseAlgorithm::m_gapTolerance
private

The tolerance to use when querying whether a sampling point is in a gap, units cm.

Definition at line 411 of file VertexSelectionBaseAlgorithm.h.

pandora::StringVector lar_content::VertexSelectionBaseAlgorithm::m_inputCaloHitListNames
private

The list of calo hit list names.

Definition at line 394 of file VertexSelectionBaseAlgorithm.h.

bool lar_content::VertexSelectionBaseAlgorithm::m_isEmptyViewAcceptable
private

Whether views entirely empty of hits are classed as 'acceptable' for candidate filtration.

Definition at line 413 of file VertexSelectionBaseAlgorithm.h.

float lar_content::VertexSelectionBaseAlgorithm::m_maxOnHitDisplacement
private

Max hit-vertex displacement for declaring vertex to lie on a hit in each view.

Definition at line 405 of file VertexSelectionBaseAlgorithm.h.

unsigned int lar_content::VertexSelectionBaseAlgorithm::m_maxTopScoreSelections
private

Max number of top-scoring vertex candidate to select for output.

Definition at line 403 of file VertexSelectionBaseAlgorithm.h.

float lar_content::VertexSelectionBaseAlgorithm::m_minCandidateDisplacement
private

Ignore other top-scoring candidates located in close proximity to original.

Definition at line 407 of file VertexSelectionBaseAlgorithm.h.

float lar_content::VertexSelectionBaseAlgorithm::m_minCandidateScoreFraction
private

Ignore other top-scoring candidates with score less than a fraction of original.

Definition at line 408 of file VertexSelectionBaseAlgorithm.h.

unsigned int lar_content::VertexSelectionBaseAlgorithm::m_minVertexAcceptableViews
private

The minimum number of views in which a candidate must sit on/near a hit or in a gap (or view can be empty)

Definition at line 414 of file VertexSelectionBaseAlgorithm.h.

float lar_content::VertexSelectionBaseAlgorithm::m_nDecayLengthsInZSpan
private

The number of score decay lengths to use over the course of the vertex z-span.

Definition at line 400 of file VertexSelectionBaseAlgorithm.h.

std::string lar_content::VertexSelectionBaseAlgorithm::m_outputVertexListName
private

The name under which to save the output vertex list.

Definition at line 395 of file VertexSelectionBaseAlgorithm.h.

bool lar_content::VertexSelectionBaseAlgorithm::m_replaceCurrentVertexList
private

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

Definition at line 397 of file VertexSelectionBaseAlgorithm.h.

bool lar_content::VertexSelectionBaseAlgorithm::m_selectSingleVertex
private

Whether to make a final decision and select just one vertex candidate.

Definition at line 402 of file VertexSelectionBaseAlgorithm.h.

bool lar_content::VertexSelectionBaseAlgorithm::m_useDetectorGaps
private

Whether to account for registered detector gaps in vertex selection.

Definition at line 410 of file VertexSelectionBaseAlgorithm.h.


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