VertexSplittingAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArTwoDReco/LArClusterSplitting/VertexSplittingAlgorithm.cc
3  *
4  * @brief Implementation of the vertex splitting algorithm class.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
13 
15 
16 using namespace pandora;
17 
18 namespace lar_content
19 {
20 
21 VertexSplittingAlgorithm::VertexSplittingAlgorithm() : m_splitDisplacementSquared(4.f * 4.f), m_vertexDisplacementSquared(1.f * 1.f)
22 {
23  // ATTN Some default values differ from base class
24  m_minClusterLength = 1.f;
25 }
26 
27 //------------------------------------------------------------------------------------------------------------------------------------------
28 
29 StatusCode VertexSplittingAlgorithm::FindBestSplitPosition(const TwoDSlidingFitResult &slidingFitResult, CartesianVector &splitPosition) const
30 {
31  // Identify event vertex
32  const VertexList *pVertexList(NULL);
33  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
34 
35  if (pVertexList->empty())
36  return STATUS_CODE_NOT_INITIALIZED;
37 
38  if (pVertexList->size() != 1)
39  return STATUS_CODE_OUT_OF_RANGE;
40 
41  const Cluster *const pCluster(slidingFitResult.GetCluster());
42  const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
43 
44  const Vertex *const pSelectedVertex(*(pVertexList->begin()));
45 
46  if (VERTEX_3D != pSelectedVertex->GetVertexType())
47  return STATUS_CODE_INVALID_PARAMETER;
48 
49  const CartesianVector theVertex2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pSelectedVertex->GetPosition(), hitType));
50 
51  const CartesianVector innerVertex2D(slidingFitResult.GetGlobalMinLayerPosition());
52  const CartesianVector outerVertex2D(slidingFitResult.GetGlobalMaxLayerPosition());
53 
54  if ((outerVertex2D - innerVertex2D).GetMagnitudeSquared() < 4.f * m_vertexDisplacementSquared)
55  return STATUS_CODE_NOT_FOUND;
56 
57  bool foundSplit(false);
58  const StatusCode statusCode(slidingFitResult.GetGlobalFitProjection(theVertex2D, splitPosition));
59 
60  if (STATUS_CODE_SUCCESS != statusCode)
61  return statusCode;
62 
63  const float splitDisplacementSquared((splitPosition - theVertex2D).GetMagnitudeSquared());
64  const float vertexDisplacementSquared(
65  std::min((splitPosition - innerVertex2D).GetMagnitudeSquared(), (splitPosition - outerVertex2D).GetMagnitudeSquared()));
66 
67  if ((splitDisplacementSquared < m_splitDisplacementSquared) && (vertexDisplacementSquared > m_vertexDisplacementSquared) &&
68  (splitDisplacementSquared < vertexDisplacementSquared))
69  {
70  foundSplit = true;
71  }
72 
73  if (!foundSplit)
74  return STATUS_CODE_NOT_FOUND;
75 
76  return STATUS_CODE_SUCCESS;
77 }
78 
79 //------------------------------------------------------------------------------------------------------------------------------------------
80 
81 StatusCode VertexSplittingAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
82 {
83  float splitDisplacement = std::sqrt(m_splitDisplacementSquared);
84  PANDORA_RETURN_RESULT_IF_AND_IF(
85  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SplitDisplacement", splitDisplacement));
86  m_splitDisplacementSquared = splitDisplacement * splitDisplacement;
87 
88  float vertexDisplacement = std::sqrt(m_vertexDisplacementSquared);
89  PANDORA_RETURN_RESULT_IF_AND_IF(
90  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexDisplacement", vertexDisplacement));
91  m_vertexDisplacementSquared = vertexDisplacement * vertexDisplacement;
92 
94 }
95 
96 } // namespace lar_content
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
pandora::StatusCode FindBestSplitPosition(const TwoDSlidingFitResult &slidingFitResult, pandora::CartesianVector &splitPosition) const
Use sliding linear fit to identify the best split position.
enum cvn::HType HitType
Header file for the vertex splitting algorithm class.
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 pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
Header file for the geometry helper class.
Header file for the cluster helper class.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
float m_vertexDisplacementSquared
Maximum displacement squared.
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
float m_splitDisplacementSquared
Maximum displacement squared.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
std::list< Vertex > VertexList
Definition: DCEL.h:182
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.