Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
VertexSplittingAlgorithm.cc
Go to the documentation of this file.
1
10
13
15
16using namespace pandora;
17
18namespace lar_content
19{
20
21VertexSplittingAlgorithm::VertexSplittingAlgorithm() : m_splitDisplacementSquared(4.f * 4.f), m_vertexDisplacementSquared(1.f * 1.f)
22{
23 // ATTN Some default values differ from base class
25}
26
27//------------------------------------------------------------------------------------------------------------------------------------------
28
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
82{
83 float splitDisplacement = std::sqrt(m_splitDisplacementSquared);
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);
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
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cluster helper class.
Header file for the geometry helper class.
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
Header file for the vertex splitting algorithm class.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
pandora::StatusCode FindBestSplitPosition(const TwoDSlidingFitResult &slidingFitResult, pandora::CartesianVector &splitPosition) const
Use sliding linear fit to identify the best split position.
float m_splitDisplacementSquared
Maximum displacement squared.
float m_vertexDisplacementSquared
Maximum displacement squared.
CartesianVector class.
Cluster class.
Definition Cluster.h:31
const Pandora & GetPandora() const
Get the associated pandora instance.
Definition Process.h:116
Vertex class.
Definition Vertex.h:26
VertexType GetVertexType() const
Get the vertex type.
Definition Vertex.h:124
const CartesianVector & GetPosition() const
Get the vertex position.
Definition Vertex.h:103
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
HitType
Calorimeter hit type enum.
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.