ShowerAsymmetryFeatureTool.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArVertex/ShowerAsymmetryFeatureTool.cc
3  *
4  * @brief Implementation of the shower asymmetry feature tool class.
5  *
6  * $Log: $
7  */
8 
10 #include "Pandora/AlgorithmHeaders.h"
13 
14 using namespace pandora;
15 
16 namespace lar_content
17 {
18 
19 ShowerAsymmetryFeatureTool::ShowerAsymmetryFeatureTool() : AsymmetryFeatureBaseTool(), m_vertexClusterDistance(4.f)
20 {
21 }
22 
23 //------------------------------------------------------------------------------------------------------------------------------------------
24 
25 float ShowerAsymmetryFeatureTool::GetAsymmetryForView(const CartesianVector &vertexPosition2D,
27 {
28  float showerAsymmetry(1.f);
29 
30  for (const VertexSelectionBaseAlgorithm::ShowerCluster &showerCluster : showerClusterList)
31  {
32  if (this->ShouldUseShowerCluster(vertexPosition2D, showerCluster))
33  {
34  const TwoDSlidingFitResult &showerFit = showerCluster.GetFit();
35 
36  float rL(0.f), rT(0.f);
37  showerFit.GetLocalPosition(vertexPosition2D, rL, rT);
38 
39  CartesianVector showerDirection(0.f, 0.f, 0.f);
40  if (STATUS_CODE_SUCCESS != showerFit.GetGlobalFitDirection(rL, showerDirection))
41  continue;
42 
43  ClusterVector asymmetryClusters;
44  std::copy(showerCluster.GetClusters().begin(), showerCluster.GetClusters().end(), std::back_inserter(asymmetryClusters));
45 
46  showerAsymmetry = this->CalculateAsymmetry(true, vertexPosition2D, asymmetryClusters, showerDirection);
47 
48  break;
49  }
50  }
51 
52  return showerAsymmetry;
53 }
54 
55 //------------------------------------------------------------------------------------------------------------------------------------------
56 
58  const CartesianVector &vertexPosition, const VertexSelectionBaseAlgorithm::ShowerCluster &showerCluster) const
59 {
60  for (const Cluster *const pCluster : showerCluster.GetClusters())
61  {
62  if (LArClusterHelper::GetClosestDistance(vertexPosition, pCluster) < m_vertexClusterDistance)
63  return true;
64  }
65 
66  return false;
67 }
68 
69 //------------------------------------------------------------------------------------------------------------------------------------------
70 //------------------------------------------------------------------------------------------------------------------------------------------
71 
72 StatusCode ShowerAsymmetryFeatureTool::ReadSettings(const TiXmlHandle xmlHandle)
73 {
74  PANDORA_RETURN_RESULT_IF_AND_IF(
75  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexClusterDistance", m_vertexClusterDistance));
76 
78 }
79 
80 } // namespace lar_content
virtual float CalculateAsymmetry(const bool useEnergyMetrics, const pandora::CartesianVector &vertexPosition2D, const pandora::ClusterVector &asymmetryClusters, const pandora::CartesianVector &localWeightedDirectionSum) const
Calculate the asymmetry feature.
const pandora::ClusterList & GetClusters() const
Get the cluster list.
Header file for the geometry helper class.
float m_vertexClusterDistance
The distance around the vertex to look for shower clusters.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle) override
Header file for the cluster helper class.
AsymmetryFeatureBaseTool class.
pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const
Get global fit direction for a given longitudinal coordinate.
T copy(T const &v)
float GetAsymmetryForView(const pandora::CartesianVector &vertexPosition2D, const VertexSelectionBaseAlgorithm::SlidingFitDataList &, const VertexSelectionBaseAlgorithm::ShowerClusterList &showerClusterList) const override
Get the shower asymmetry feature for a given view.
Header file for the shower asymmetry feature tool class.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
bool ShouldUseShowerCluster(const pandora::CartesianVector &vertexPosition, const VertexSelectionBaseAlgorithm::ShowerCluster &showerCluster) const
Get whether we should use a given shower cluster for asymmetry calculation.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.