Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
CutClusterCharacterisationAlgorithm.cc
Go to the documentation of this file.
1
10
13
16
18
19using namespace pandora;
20
21namespace lar_content
22{
23
25 m_slidingFitWindow(5),
26 m_slidingShowerFitWindow(10),
27 m_minCaloHitsCut(6),
28 m_maxShowerLengthCut(80.f),
29 m_pathLengthRatioCut(1.005f),
30 m_rTWidthRatioCut(0.05f),
31 m_vertexDistanceRatioCut(0.5f),
32 m_showerWidthRatioCut(0.35f)
33{
34}
35
36//------------------------------------------------------------------------------------------------------------------------------------------
37
38float CutClusterCharacterisationAlgorithm::GetVertexDistance(const Algorithm *const pAlgorithm, const Cluster *const pCluster)
39{
40 const VertexList *pVertexList = nullptr;
41 (void)PandoraContentApi::GetCurrentList(*pAlgorithm, pVertexList);
42
43 if (!pVertexList || (pVertexList->size() != 1) || (VERTEX_3D != pVertexList->front()->GetVertexType()))
44 return -1.f;
45
46 const Vertex *const pVertex(pVertexList->front());
47 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
48
49 const CartesianVector vertexPosition2D(LArGeometryHelper::ProjectPosition(pAlgorithm->GetPandora(), pVertex->GetPosition(), hitType));
50 return LArClusterHelper::GetClosestDistance(vertexPosition2D, pCluster);
51}
52
53//------------------------------------------------------------------------------------------------------------------------------------------
54
55float CutClusterCharacterisationAlgorithm::GetShowerFitWidth(const Algorithm *const pAlgorithm, const Cluster *const pCluster, const unsigned int showerFitWindow)
56{
57 try
58 {
59 const TwoDSlidingShowerFitResult showerFitResult(pCluster, showerFitWindow, LArGeometryHelper::GetWireZPitch(pAlgorithm->GetPandora()));
60 const LayerFitResultMap &layerFitResultMapS(showerFitResult.GetShowerFitResult().GetLayerFitResultMap());
61 const LayerFitResultMap &layerFitResultMapP(showerFitResult.GetPositiveEdgeFitResult().GetLayerFitResultMap());
62 const LayerFitResultMap &layerFitResultMapN(showerFitResult.GetNegativeEdgeFitResult().GetLayerFitResultMap());
63
64 if (!layerFitResultMapS.empty())
65 {
66 float showerFitWidth(0.f);
67
68 for (const auto &mapEntryS : layerFitResultMapS)
69 {
70 LayerFitResultMap::const_iterator iterP = layerFitResultMapP.find(mapEntryS.first);
71 LayerFitResultMap::const_iterator iterN = layerFitResultMapN.find(mapEntryS.first);
72
73 if ((layerFitResultMapP.end() != iterP) && (layerFitResultMapN.end() != iterN))
74 showerFitWidth += std::fabs(iterP->second.GetFitT() - iterN->second.GetFitT());
75 }
76
77 return showerFitWidth;
78 }
79 }
80 catch (const StatusCodeException &)
81 {
82 }
83
84 return -1.f;
85}
86
87//------------------------------------------------------------------------------------------------------------------------------------------
88
90{
91 if (pCluster->GetNCaloHits() < m_minCaloHitsCut)
92 return false;
93
94 float straightLineLength(-1.f), integratedPathLength(-1.f);
95 float rTMin(+std::numeric_limits<float>::max()), rTMax(-std::numeric_limits<float>::max());
96
97 try
98 {
100 const CartesianVector globalMinLayerPosition(slidingFitResult.GetGlobalMinLayerPosition());
101 straightLineLength = (slidingFitResult.GetGlobalMaxLayerPosition() - globalMinLayerPosition).GetMagnitude();
102
103 integratedPathLength = 0.f;
104 CartesianVector previousFitPosition(globalMinLayerPosition);
105
106 for (const auto &mapEntry : slidingFitResult.GetLayerFitResultMap())
107 {
108 rTMin = std::min(rTMin, static_cast<float>(mapEntry.second.GetFitT()));
109 rTMax = std::max(rTMax, static_cast<float>(mapEntry.second.GetFitT()));
110
111 CartesianVector thisFitPosition(0.f, 0.f, 0.f);
112 slidingFitResult.GetGlobalPosition(mapEntry.second.GetL(), mapEntry.second.GetFitT(), thisFitPosition);
113 integratedPathLength += (thisFitPosition - previousFitPosition).GetMagnitude();
114 previousFitPosition = thisFitPosition;
115 }
116 }
117 catch (const StatusCodeException &)
118 {
119 }
120
121 if (straightLineLength < std::numeric_limits<float>::epsilon())
122 return false;
123
124 if (straightLineLength > m_maxShowerLengthCut)
125 return true;
126
127 if ((integratedPathLength < std::numeric_limits<float>::epsilon()) || (integratedPathLength / straightLineLength > m_pathLengthRatioCut))
128 return false;
129
130 if ((rTMax - rTMin) / straightLineLength > m_rTWidthRatioCut)
131 return false;
132
133 const float vertexDistance(CutClusterCharacterisationAlgorithm::GetVertexDistance(this, pCluster));
134
135 if ((vertexDistance > std::numeric_limits<float>::epsilon()) && ((vertexDistance / straightLineLength) > m_vertexDistanceRatioCut))
136 return false;
137
138 const float showerFitWidth(CutClusterCharacterisationAlgorithm::GetShowerFitWidth(this, pCluster, m_slidingShowerFitWindow));
139
140 if ((showerFitWidth < std::numeric_limits<float>::epsilon()) || ((showerFitWidth / straightLineLength) > m_showerWidthRatioCut))
141 return false;
142
143 return true;
144}
145
146//------------------------------------------------------------------------------------------------------------------------------------------
147
149{
151 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitWindow", m_slidingFitWindow));
152
154 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingShowerFitWindow", m_slidingShowerFitWindow));
155
156 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinCaloHitsCut", m_minCaloHitsCut));
157
159 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxShowerLengthCut", m_maxShowerLengthCut));
160
162 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "PathLengthRatioCut", m_pathLengthRatioCut));
163
164 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "RTWidthRatioCut", m_rTWidthRatioCut));
165
167 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexDistanceRatioCut", m_vertexDistanceRatioCut));
168
170 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowerWidthRatioCut", m_showerWidthRatioCut));
171
173}
174
175} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cut based cluster characterisation algorithm class.
Header file for the cluster helper class.
Header file for the geometry helper class.
Header file for the lar two dimensional sliding fit result class.
Header file for the lar two dimensional sliding shower fit result class.
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
static float GetShowerFitWidth(const pandora::Algorithm *const pAlgorithm, const pandora::Cluster *const pCluster, const unsigned int showerFitWindow)
Get a measure of the width of a cluster, using a sliding shower fit result.
unsigned int m_slidingShowerFitWindow
The layer window for the sliding shower fits.
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
float m_showerWidthRatioCut
The maximum ratio of shower fit width to straight line length to qualify as a track.
virtual bool IsClearTrack(const pandora::Cluster *const pCluster) const
Whether cluster is identified as a clear track.
float m_pathLengthRatioCut
The maximum ratio of path length to straight line length to qualify as a track.
float m_vertexDistanceRatioCut
The maximum ratio of vertex separation to straight line length to qualify as a track.
unsigned int m_minCaloHitsCut
The minimum number of calo hits to qualify as a track.
float m_rTWidthRatioCut
The maximum ratio of transverse fit position width to straight line length to qualify as a track.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
float m_maxShowerLengthCut
The maximum cluster length to qualify as a shower.
static float GetVertexDistance(const pandora::Algorithm *const pAlgorithm, const pandora::Cluster *const pCluster)
Get the distance between the interaction vertex (if present in the current vertex list) and a provide...
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
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.
const LayerFitResultMap & GetLayerFitResultMap() const
Get the layer fit result map.
void GetGlobalPosition(const float rL, const float rT, pandora::CartesianVector &position) const
Get global coordinates for given sliding linear fit coordinates.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
const TwoDSlidingFitResult & GetNegativeEdgeFitResult() const
Get the sliding fit result for the negative shower edge.
const TwoDSlidingFitResult & GetShowerFitResult() const
Get the sliding fit result for the full shower cluster.
const TwoDSlidingFitResult & GetPositiveEdgeFitResult() const
Get the sliding fit result for the positive shower edge.
Algorithm class. Algorithm addresses are held only by the algorithm manager. They have a fully define...
Definition Algorithm.h:21
CartesianVector class.
Cluster class.
Definition Cluster.h:31
unsigned int GetNCaloHits() const
Get the number of calo hits in the cluster.
Definition Cluster.h:484
const Pandora & GetPandora() const
Get the associated pandora instance.
Definition Process.h:116
StatusCodeException class.
Vertex class.
Definition Vertex.h:26
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
std::map< int, LayerFitResult > LayerFitResultMap
HitType
Calorimeter hit type enum.
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.