All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Private Member Functions | Private Attributes | List of all members
lar_content::LayerSplittingAlgorithm Class Reference

LayerSplittingAlgorithm class. More...

#include <LayerSplittingAlgorithm.h>

Inheritance diagram for lar_content::LayerSplittingAlgorithm:
lar_content::ClusterSplittingAlgorithm

Public Member Functions

 LayerSplittingAlgorithm ()
 Default constructor. More...
 

Private Member Functions

pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
pandora::StatusCode DivideCaloHits (const pandora::Cluster *const pCluster, pandora::CaloHitList &firstCaloHitList, pandora::CaloHitList &secondCaloHitList) const
 Divide calo hits in a cluster into two lists, each associated with a separate fragment cluster. More...
 
pandora::StatusCode FindBestSplitLayer (const pandora::Cluster *const pCluster, unsigned int &splitLayer) const
 Find the best layer for splitting the cluster. More...
 
pandora::StatusCode DivideCaloHits (const pandora::Cluster *const pCluster, const unsigned int &splitLayer, pandora::CaloHitList &firstCaloHitList, pandora::CaloHitList &secondCaloHitList) const
 Split the cluster into two fragments at the input layer. More...
 
float CalculateRms (const pandora::Cluster *const pCluster, const unsigned int &firstLayer, const unsigned int &secondLayer) const
 Calculate rms deviation of cluster centroids between two extremal layers. More...
 

Private Attributes

unsigned int m_minClusterLayers
 
unsigned int m_layerWindow
 
float m_maxScatterRms
 
float m_maxScatterCosTheta
 
float m_maxSlidingCosTheta
 

Additional Inherited Members

- Protected Member Functions inherited from lar_content::ClusterSplittingAlgorithm
virtual pandora::StatusCode Run ()
 
pandora::StatusCode RunUsingCurrentList () const
 Run the algorithm using the current cluster list as input. More...
 

Detailed Description

LayerSplittingAlgorithm class.

Definition at line 19 of file LayerSplittingAlgorithm.h.

Constructor & Destructor Documentation

lar_content::LayerSplittingAlgorithm::LayerSplittingAlgorithm ( )

Member Function Documentation

float lar_content::LayerSplittingAlgorithm::CalculateRms ( const pandora::Cluster *const  pCluster,
const unsigned int &  firstLayer,
const unsigned int &  secondLayer 
) const
private

Calculate rms deviation of cluster centroids between two extremal layers.

Parameters
pClusterthe input cluster
firstLayerthe first extremal layer
secondLayerthe second extremal layer

Definition at line 117 of file LayerSplittingAlgorithm.cc.

118 {
119  const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
120 
121  const unsigned int innerLayer(std::min(firstLayer, secondLayer));
122  const unsigned int outerLayer(std::max(firstLayer, secondLayer));
123 
124  const CartesianVector innerPosition(pCluster->GetCentroid(innerLayer));
125  const CartesianVector outerPosition(pCluster->GetCentroid(outerLayer));
126  const CartesianVector predictedDirection((outerPosition - innerPosition).GetUnitVector());
127 
128  float totalChi2(0.f);
129  float totalLayers(0.f);
130 
131  for (unsigned int iLayer = innerLayer + 1; iLayer + 1 < outerLayer; ++iLayer)
132  {
133  if (orderedCaloHitList.find(iLayer) == orderedCaloHitList.end())
134  continue;
135 
136  const CartesianVector hitPosition(pCluster->GetCentroid(iLayer));
137  const CartesianVector predictedPosition(innerPosition + predictedDirection * predictedDirection.GetDotProduct(hitPosition - innerPosition));
138 
139  totalChi2 += (predictedPosition - hitPosition).GetMagnitudeSquared();
140  totalLayers += 1.f;
141  }
142 
143  if (totalLayers > 0.f)
144  return std::sqrt(totalChi2 / totalLayers);
145 
146  return 0.f;
147 }
pandora::StatusCode lar_content::LayerSplittingAlgorithm::DivideCaloHits ( const pandora::Cluster *const  pCluster,
pandora::CaloHitList &  firstCaloHitList,
pandora::CaloHitList &  secondCaloHitList 
) const
privatevirtual

Divide calo hits in a cluster into two lists, each associated with a separate fragment cluster.

Parameters
pClusteraddress of the cluster
firstCaloHitListthe hits in the first fragment
secondCaloHitListthe hits in the second fragment

Implements lar_content::ClusterSplittingAlgorithm.

pandora::StatusCode lar_content::LayerSplittingAlgorithm::DivideCaloHits ( const pandora::Cluster *const  pCluster,
const unsigned int &  splitLayer,
pandora::CaloHitList &  firstCaloHitList,
pandora::CaloHitList &  secondCaloHitList 
) const
private

Split the cluster into two fragments at the input layer.

Parameters
pClusterthe input cluster
splitLayerthe split layer
firstCaloHitListthe hits in the first cluster fragment
secondCaloHitListthe hits in the second cluster fragment
StatusCode lar_content::LayerSplittingAlgorithm::FindBestSplitLayer ( const pandora::Cluster *const  pCluster,
unsigned int &  splitLayer 
) const
private

Find the best layer for splitting the cluster.

Parameters
pClusterthe input cluster
splitLayerthe best layer

Definition at line 41 of file LayerSplittingAlgorithm.cc.

42 {
43  const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
44 
45  if (orderedCaloHitList.size() < m_minClusterLayers)
46  return STATUS_CODE_NOT_FOUND;
47 
48  bool foundSplit(false);
49 
50  float bestCosTheta(1.f);
51  CartesianVector bestPosition(0.f, 0.f, 0.f);
52 
53  for (unsigned int iLayer = pCluster->GetInnerPseudoLayer() + 4; iLayer + 4 <= pCluster->GetOuterPseudoLayer(); ++iLayer)
54  {
55  if (orderedCaloHitList.find(iLayer) == orderedCaloHitList.end())
56  continue;
57 
58  unsigned int innerLayer((pCluster->GetInnerPseudoLayer() + m_layerWindow > iLayer) ? pCluster->GetInnerPseudoLayer() : iLayer - m_layerWindow);
59  unsigned int outerLayer((iLayer + m_layerWindow > pCluster->GetOuterPseudoLayer()) ? pCluster->GetOuterPseudoLayer() : iLayer + m_layerWindow);
60 
61  for (; innerLayer >= pCluster->GetInnerPseudoLayer(); --innerLayer)
62  {
63  if (orderedCaloHitList.find(innerLayer) != orderedCaloHitList.end())
64  break;
65  }
66 
67  for (; outerLayer <= pCluster->GetOuterPseudoLayer(); ++outerLayer)
68  {
69  if (orderedCaloHitList.find(outerLayer) != orderedCaloHitList.end())
70  break;
71  }
72 
73  const CartesianVector splitPosition(pCluster->GetCentroid(iLayer));
74  const CartesianVector innerPosition(pCluster->GetCentroid(innerLayer));
75  const CartesianVector outerPosition(pCluster->GetCentroid(outerLayer));
76 
77  const CartesianVector r1(innerPosition - splitPosition);
78  const CartesianVector r2(outerPosition - splitPosition);
79  const CartesianVector p1(r1.GetUnitVector());
80  const CartesianVector p2(r2.GetUnitVector());
81 
82  const float cosTheta(-p1.GetDotProduct(p2));
83  const float rms1(this->CalculateRms(pCluster, innerLayer, iLayer));
84  const float rms2(this->CalculateRms(pCluster, outerLayer, iLayer));
85  const float rms(std::max(rms1, rms2));
86 
87  float rmsCut(std::numeric_limits<float>::max());
88 
89  if (cosTheta > 0.f)
90  {
91  rmsCut = m_maxScatterRms;
92 
93  if (cosTheta > m_maxScatterCosTheta)
94  {
95  rmsCut *= ((m_maxSlidingCosTheta > cosTheta) ? (m_maxSlidingCosTheta - cosTheta) / (m_maxSlidingCosTheta - m_maxScatterCosTheta) : 0.f);
96  }
97  }
98 
99  if (rms < rmsCut && cosTheta < bestCosTheta)
100  {
101  bestCosTheta = cosTheta;
102  bestPosition = splitPosition;
103 
104  splitLayer = iLayer;
105  foundSplit = true;
106  }
107  }
108 
109  if (!foundSplit)
110  return STATUS_CODE_NOT_FOUND;
111 
112  return STATUS_CODE_SUCCESS;
113 }
float CalculateRms(const pandora::Cluster *const pCluster, const unsigned int &firstLayer, const unsigned int &secondLayer) const
Calculate rms deviation of cluster centroids between two extremal layers.
physics associatedGroupsWithLeft p1
StatusCode lar_content::LayerSplittingAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
privatevirtual

Reimplemented from lar_content::ClusterSplittingAlgorithm.

Definition at line 183 of file LayerSplittingAlgorithm.cc.

184 {
185  PANDORA_RETURN_RESULT_IF_AND_IF(
186  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinClusterLayers", m_minClusterLayers));
187 
188  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "LayerWindow", m_layerWindow));
189 
190  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxScatterRms", m_maxScatterRms));
191 
192  PANDORA_RETURN_RESULT_IF_AND_IF(
193  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxScatterCosTheta", m_maxScatterCosTheta));
194 
195  PANDORA_RETURN_RESULT_IF_AND_IF(
196  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxSlidingCosTheta", m_maxSlidingCosTheta));
197 
198  return ClusterSplittingAlgorithm::ReadSettings(xmlHandle);
199 }
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)

Member Data Documentation

unsigned int lar_content::LayerSplittingAlgorithm::m_layerWindow
private

Definition at line 61 of file LayerSplittingAlgorithm.h.

float lar_content::LayerSplittingAlgorithm::m_maxScatterCosTheta
private

Definition at line 63 of file LayerSplittingAlgorithm.h.

float lar_content::LayerSplittingAlgorithm::m_maxScatterRms
private

Definition at line 62 of file LayerSplittingAlgorithm.h.

float lar_content::LayerSplittingAlgorithm::m_maxSlidingCosTheta
private

Definition at line 64 of file LayerSplittingAlgorithm.h.

unsigned int lar_content::LayerSplittingAlgorithm::m_minClusterLayers
private

Definition at line 60 of file LayerSplittingAlgorithm.h.


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