LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
lar_content::MvaLowEClusterMergingAlgorithm< T > Class Template Reference

MvaLowEClusterMergingAlgorithm class. More...

#include "MvaLowEClusterMergingAlgorithm.h"

Inheritance diagram for lar_content::MvaLowEClusterMergingAlgorithm< T >:

Public Member Functions

 MvaLowEClusterMergingAlgorithm ()
 Default constructor. More...
 
virtual ~MvaLowEClusterMergingAlgorithm ()
 Destructor. More...
 

Protected Member Functions

pandora::StatusCode Run ()
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
const pandora::MCParticle * GetMCForCluster (const pandora::Cluster *const cluster, std::map< const pandora::Cluster *, const pandora::MCParticle * > &clusterToMCMap) const
 Get the MC particle for a given cluster, caching to a map. More...
 
bool IsValidToUse (const pandora::Cluster *const cluster, std::map< const pandora::Cluster *, bool > &clusterIsUsed) const
 
double Angle (const pandora::CartesianVector vector1, const pandora::CartesianVector vector2) const
 
const pandora::CaloHitList EdgeHitFinder (const pandora::Cluster *const cluster, pandora::CaloHitList &clusterEdgeHits) const
 
bool ClusterTool (std::vector< std::string > featureOrder, LArMvaHelper::MvaFeatureMap featureMap) const
 
pandora::StatusCode EdgeHitComparer (const pandora::ClusterList *const pClusterList, const std::string &listName) const
 

Protected Attributes

pandora::StringVector m_inputClusterListNames
 The names of the input cluster lists. More...
 
std::string m_mcParticleListName
 Input MC particle list name. More...
 
bool m_trainingSetMode
 Whether to train. More...
 
bool m_enableProbability
 Whether to use probabilities instead of binary classification. More...
 
float m_minProbabilityCut
 The minimum probability to label a cluster as track-like. More...
 
std::string m_treeName
 Input tree name for ROOT. More...
 
std::string m_fileName
 Input file name for ROOT. More...
 
int m_event
 Event Number Counter. More...
 
float m_maxClusterFraction
 The maximum fraction a cluster can be contaminated by to be considered clean. More...
 
float m_minNCaloHits
 The minimum number of hits for a cluster to be deemed true for IsAvailableToUse. More...
 
bool m_writeTree
 Whether a tree should be output with recorded parameters. More...
 
float m_upperHitThreshold
 Max number of hits for cluster to be considered. More...
 
std::string m_trainingOutputFile
 The training output file. More...
 
std::string m_filePathEnvironmentVariable
 The environment variable providing a list of paths to mva files. More...
 
std::string m_mvaFileName
 The mva input file. More...
 
std::string m_mvaName
 The name of the mva to find. More...
 
m_mva
 The mva. More...
 
float m_countHitsThreshold
 A cut on whether cluster merges will occur depending on total event hits. More...
 
std::string m_vertexListName
 Input Vertex List name for vertex based calculation. More...
 
float m_contactThreshold
 Distance value for hits to be considered in contact. More...
 
float m_proximityThreshold
 Distance value for hits to be considered in proximity. More...
 
float m_divisions
 Number of sectors to search in with Edge Hit Finder Function. More...
 
float m_sectorTolerance
 Tolerance in radians for dot product between sector and centroid to CaloHit vector. More...
 
bool m_printOut
 Whether the algorithm outputs cluster size information. More...
 

Detailed Description

template<typename T>
class lar_content::MvaLowEClusterMergingAlgorithm< T >

MvaLowEClusterMergingAlgorithm class.

Definition at line 26 of file MvaLowEClusterMergingAlgorithm.h.

Constructor & Destructor Documentation

Default constructor.

Definition at line 35 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::MvaLowEClusterMergingAlgorithm< T >::m_contactThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_countHitsThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_divisions, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_enableProbability, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_event, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_filePathEnvironmentVariable, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_maxClusterFraction, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minNCaloHits, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minProbabilityCut, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_printOut, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_proximityThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_sectorTolerance, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_upperHitThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_vertexListName, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_writeTree.

35  :
36  m_trainingSetMode{false},
37  m_enableProbability{true},
38  m_minProbabilityCut{0.5f},
39  m_event{-1},
41  m_minNCaloHits{1},
42  m_writeTree{true},
44  m_filePathEnvironmentVariable{"FW_SEARCH_PATH"},
46  m_vertexListName{"NeutrinoVertices3D"},
49  m_divisions{8},
50  m_sectorTolerance{0.03},
51  m_printOut{false}
52 {
53 }
bool m_printOut
Whether the algorithm outputs cluster size information.
float m_contactThreshold
Distance value for hits to be considered in contact.
float m_minProbabilityCut
The minimum probability to label a cluster as track-like.
float m_maxClusterFraction
The maximum fraction a cluster can be contaminated by to be considered clean.
bool m_enableProbability
Whether to use probabilities instead of binary classification.
float m_minNCaloHits
The minimum number of hits for a cluster to be deemed true for IsAvailableToUse.
float m_proximityThreshold
Distance value for hits to be considered in proximity.
float m_countHitsThreshold
A cut on whether cluster merges will occur depending on total event hits.
std::string m_vertexListName
Input Vertex List name for vertex based calculation.
float m_sectorTolerance
Tolerance in radians for dot product between sector and centroid to CaloHit vector.
std::string m_filePathEnvironmentVariable
The environment variable providing a list of paths to mva files.
float m_divisions
Number of sectors to search in with Edge Hit Finder Function.
bool m_writeTree
Whether a tree should be output with recorded parameters.
float m_upperHitThreshold
Max number of hits for cluster to be considered.

Destructor.

Definition at line 57 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::MvaLowEClusterMergingAlgorithm< T >::m_fileName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_treeName, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_writeTree.

58 {
59  if (m_writeTree)
60  {
61  PANDORA_MONITORING_API(SaveTree(this->GetPandora(), m_treeName.c_str(), m_fileName.c_str(), "RECREATE"));
62  }
63 }
std::string m_fileName
Input file name for ROOT.
std::string m_treeName
Input tree name for ROOT.
bool m_writeTree
Whether a tree should be output with recorded parameters.

Member Function Documentation

template<typename T >
double lar_content::MvaLowEClusterMergingAlgorithm< T >::Angle ( const pandora::CartesianVector  vector1,
const pandora::CartesianVector  vector2 
) const
protected

Definition at line 568 of file MvaLowEClusterMergingAlgorithm.cc.

569 {
570  const double dx{vector1.GetX() - vector2.GetX()};
571  const double dz{vector1.GetZ() - vector2.GetZ()};
572  double angle{tan(dx / dz)};
573 
574  return angle;
575 }
template<typename T >
bool lar_content::MvaLowEClusterMergingAlgorithm< T >::ClusterTool ( std::vector< std::string >  featureOrder,
LArMvaHelper::MvaFeatureMap  featureMap 
) const
protected

Definition at line 464 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::LArMvaHelper::CalculateProbability(), lar_content::LArMvaHelper::Classify(), lar_content::MvaLowEClusterMergingAlgorithm< T >::m_enableProbability, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minProbabilityCut, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mva.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer().

465 {
466  if (!m_enableProbability)
467  {
468  return LArMvaHelper::Classify(m_mva, featureOrder, featureMap);
469  }
470  else
471  {
472  return (LArMvaHelper::CalculateProbability(m_mva, featureOrder, featureMap) > m_minProbabilityCut);
473  }
474 }
static bool Classify(const MvaInterface &classifier, TCONTAINER &&featureContainer)
Use the trained classifier to predict the boolean class of an example.
Definition: LArMvaHelper.h:331
float m_minProbabilityCut
The minimum probability to label a cluster as track-like.
bool m_enableProbability
Whether to use probabilities instead of binary classification.
static double CalculateProbability(const MvaInterface &classifier, TCONTAINER &&featureContainer)
Use the trained mva to calculate a classification probability for an example.
Definition: LArMvaHelper.h:369
template<typename T >
StatusCode lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer ( const pandora::ClusterList *const  pClusterList,
const std::string &  listName 
) const
protected

Definition at line 156 of file MvaLowEClusterMergingAlgorithm.cc.

References util::abs(), lar_content::MvaLowEClusterMergingAlgorithm< T >::ClusterTool(), lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitFinder(), f, lar_content::LArClusterHelper::GetClusterHitType(), lar_content::MvaLowEClusterMergingAlgorithm< T >::GetMCForCluster(), hits(), lar_content::MvaLowEClusterMergingAlgorithm< T >::IsValidToUse(), lar_content::MvaLowEClusterMergingAlgorithm< T >::m_contactThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_countHitsThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_event, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_printOut, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_proximityThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_trainingOutputFile, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_trainingSetMode, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_treeName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_vertexListName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_writeTree, lar_content::LArMvaHelper::ProduceTrainingExample(), and lar_content::LArGeometryHelper::ProjectPosition().

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::Run().

157 {
158  std::map<const Cluster *, const MCParticle *> clusterToMCParticleMap;
159  std::map<const Cluster *, bool> clusterIsUsed;
160  std::map<const Cluster *, ClusterVector> clustersToMerge;
161  int countHits{0};
162 
163  for (const Cluster *const pCluster : *pClusterList)
164  {
165  try
166  {
167  countHits += pCluster->GetNCaloHits();
168  }
169  catch (StatusCodeException)
170  {
171  }
172  }
173 
174  for (auto iter = pClusterList->begin(); iter != pClusterList->end(); ++iter)
175  {
176 
177  const Cluster *const cluster(*iter);
178  CaloHitList hits;
179  cluster->GetOrderedCaloHitList().FillCaloHitList(hits);
180  const CaloHitList &isoHits{cluster->GetIsolatedCaloHitList()};
181  hits.insert(hits.end(), isoHits.begin(), isoHits.end());
182 
183  if (!cluster || hits.empty())
184  continue;
185 
186  if (!this->IsValidToUse(cluster, clusterIsUsed))
187  continue;
188 
189  CaloHitList clusterEdgeHits;
190  CartesianVector centroid11(0.f, 0.f, 0.f), centroid12(0.f, 0.f, 0.f), centroid21(0.f, 0.f, 0.f), centroid22(0.f, 0.f, 0.f);
191  try
192  {
193  centroid11 = cluster->GetCentroid(cluster->GetInnerPseudoLayer());
194  centroid12 = cluster->GetCentroid(cluster->GetOuterPseudoLayer());
195  }
196  catch (...)
197  {
198  CaloHitList tempHits;
199  cluster->GetOrderedCaloHitList().FillCaloHitList(tempHits);
200  const CaloHitList &tempIsoHits{cluster->GetIsolatedCaloHitList()};
201  tempHits.insert(tempHits.end(), tempIsoHits.begin(), tempIsoHits.end());
202  centroid11 = tempHits.front()->GetPositionVector();
203  centroid12 = tempHits.back()->GetPositionVector();
204  }
205 
206  const CartesianVector centroid1((centroid11 + centroid12) * 0.5f);
207 
208  this->EdgeHitFinder(cluster, clusterEdgeHits);
209 
210  const unsigned int clusterNHits{cluster->GetNCaloHits()};
211 
212  for (auto iter2 = std::next(iter); iter2 != pClusterList->end(); ++iter2)
213  {
214  const Cluster *const otherCluster(*iter2);
215  CaloHitList otherHits;
216  otherCluster->GetOrderedCaloHitList().FillCaloHitList(otherHits);
217  const CaloHitList &otherIsoHits{otherCluster->GetIsolatedCaloHitList()};
218  otherHits.insert(otherHits.end(), otherIsoHits.begin(), otherIsoHits.end());
219 
220  if (!otherCluster || otherHits.empty())
221  continue;
222 
223  if (!this->IsValidToUse(otherCluster, clusterIsUsed))
224  continue;
225 
226  try
227  {
228  centroid21 = otherCluster->GetCentroid(otherCluster->GetInnerPseudoLayer());
229  centroid22 = otherCluster->GetCentroid(otherCluster->GetOuterPseudoLayer());
230  }
231  catch (...)
232  {
233  CaloHitList tempHits;
234  cluster->GetOrderedCaloHitList().FillCaloHitList(tempHits);
235  const CaloHitList &tempIsoHits{cluster->GetIsolatedCaloHitList()};
236  tempHits.insert(tempHits.end(), tempIsoHits.begin(), tempIsoHits.end());
237  centroid21 = tempHits.front()->GetPositionVector();
238  centroid22 = tempHits.back()->GetPositionVector();
239  }
240 
241  const CartesianVector centroid2((centroid21 + centroid22) * 0.5f);
242  const float centroidSeparation{std::sqrt(centroid1.GetDistanceSquared(centroid2))};
243  const CartesianVector centroidVector(centroid2 - centroid1);
244  const VertexList *pVertexList{nullptr};
245  float vtxClusterAngle{std::numeric_limits<float>::lowest()};
246  PANDORA_RETURN_RESULT_IF_AND_IF(
247  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, m_vertexListName, pVertexList));
248 
249  if (pVertexList && !pVertexList->empty())
250  {
251  const Vertex *pVertex{pVertexList->front()};
253  CartesianVector vertexPosition(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
254  const CartesianVector vtxToCluster(centroid1 - vertexPosition), vtxToOtherCluster(centroid2 - vertexPosition);
255  const float D1(vtxToCluster.GetMagnitude()), D2(vtxToOtherCluster.GetMagnitude());
256 
257  if (D1 * D2 != 0)
258  {
259  vtxClusterAngle = (vtxToCluster.GetDotProduct(vtxToOtherCluster) / (D1 * D2));
260  }
261  }
262  CaloHitList otherClusterEdgeHits;
263 
264  this->EdgeHitFinder(otherCluster, otherClusterEdgeHits);
265 
266  const unsigned int otherClusterNHits{otherCluster->GetNCaloHits()};
267  CaloHitList largestList, smallestList;
268  CartesianVector vectorTool(0.f, 0.f, 0.f);
269 
270  if (clusterEdgeHits.size() > otherClusterEdgeHits.size())
271  {
272  largestList = clusterEdgeHits;
273  smallestList = otherClusterEdgeHits;
274  vectorTool = centroid2;
275  }
276  else
277  {
278  largestList = otherClusterEdgeHits;
279  smallestList = clusterEdgeHits;
280  vectorTool = centroid1;
281  }
282  std::vector<float> distanceDistribution;
283  float finalDistance{0.f}, maxEdgeHitSeparation{std::numeric_limits<float>::lowest()},
284  minEdgeHitSeparation{std::numeric_limits<float>::max()}, adc1{0.f}, adc2{0.f};
285  int contact{0}, proximity{0};
286  ;
287 
288  for (const CaloHit *const caloHit1 : largestList)
289  {
290  CartesianVector hit1Position(caloHit1->GetPositionVector());
291  float nearestHit{std::numeric_limits<float>::lowest()};
292  adc1 += caloHit1->GetInputEnergy();
293 
294  for (const CaloHit *const caloHit2 : smallestList)
295  {
296  CartesianVector hit2Position(caloHit2->GetPositionVector());
297  float distance{std::sqrt(hit1Position.GetDistanceSquared(hit2Position))};
298  CartesianVector vector1(hit2Position - hit1Position), tangent(centroidVector.GetZ(), 0.f, -centroidVector.GetX());
299  double smallestAngle{std::numeric_limits<float>::max()};
300  const float c(tangent.GetX() * vectorTool.GetX() + tangent.GetZ() * vectorTool.GetZ()),
301  intercept(tangent.GetX() * hit2Position.GetX() + tangent.GetZ() * hit2Position.GetZ());
302  adc2 += caloHit2->GetInputEnergy();
303 
304  if (distance < m_proximityThreshold)
305  {
306  ++proximity;
307  if (distance < m_contactThreshold)
308  {
309  ++contact;
310  --proximity;
311  }
312  }
313 
314  if (intercept < c)
315  continue;
316 
317  if (distance > maxEdgeHitSeparation)
318  {
319  maxEdgeHitSeparation = distance;
320  }
321 
322  if (distance < minEdgeHitSeparation)
323  {
324  minEdgeHitSeparation = distance;
325  }
326 
327  if (distance < nearestHit)
328  {
329  nearestHit = distance;
330  }
331  if (std::abs(vector1.GetDotProduct(centroidVector)) > smallestAngle)
332  continue;
333 
334  smallestAngle = std::abs(vector1.GetDotProduct(centroidVector));
335  finalDistance = distance;
336  }
337  distanceDistribution.push_back(finalDistance);
338  }
339 
340  const double avgDistance{!distanceDistribution.empty()
341  ? std::accumulate(distanceDistribution.begin(), distanceDistribution.end(), 0.0) / distanceDistribution.size()
342  : -1.0};
343 
344  std::vector<std::string> featureOrder;
345  featureOrder.emplace_back("VertexClusterAngle");
346  featureOrder.emplace_back("MinEdgeHitSeparation");
347  featureOrder.emplace_back("Cluster1NHits");
348  featureOrder.emplace_back("Cluster2NHits");
349  featureOrder.emplace_back("NHitsInContact");
350  featureOrder.emplace_back("NHitsInProximity");
351  featureOrder.emplace_back("CentroidSeparation");
352  featureOrder.emplace_back("AvgDistance");
353  featureOrder.emplace_back("CentroidVectorX");
354  featureOrder.emplace_back("CentroidVectorZ");
355  featureOrder.emplace_back("Cluster1ADC");
356  featureOrder.emplace_back("Cluster2ADC");
357 
358  if (m_trainingSetMode)
359  {
360  const MCParticle *clusterMC(this->GetMCForCluster(cluster, clusterToMCParticleMap)),
361  *otherClusterMC(this->GetMCForCluster(otherCluster, clusterToMCParticleMap));
362  const bool mcMatch(clusterMC == otherClusterMC);
363  LArMvaHelper::MvaFeatureVector featureVector;
364 
365  featureVector.emplace_back(static_cast<double>(vtxClusterAngle));
366  featureVector.emplace_back(static_cast<double>(minEdgeHitSeparation));
367  featureVector.emplace_back(static_cast<double>(clusterNHits));
368  featureVector.emplace_back(static_cast<double>(otherClusterNHits));
369  featureVector.emplace_back(static_cast<double>(contact));
370  featureVector.emplace_back(static_cast<double>(proximity));
371  featureVector.emplace_back(static_cast<double>(centroidSeparation));
372  featureVector.emplace_back(static_cast<double>(avgDistance));
373  featureVector.emplace_back(static_cast<double>(centroidVector.GetX()));
374  featureVector.emplace_back(static_cast<double>(centroidVector.GetZ()));
375  featureVector.emplace_back(static_cast<double>(adc1));
376  featureVector.emplace_back(static_cast<double>(adc2));
377 
379  }
380 
381  if (!m_trainingSetMode)
382  {
383  LArMvaHelper::MvaFeatureMap featureMap;
384 
385  featureMap["VertexClusterAngle"] = vtxClusterAngle;
386  featureMap["MinEdgeHitSeparation"] = minEdgeHitSeparation;
387  featureMap["Cluster1NHits"] = clusterNHits;
388  featureMap["Cluster2NHits"] = otherClusterNHits;
389  featureMap["NHitsInContact"] = contact;
390  featureMap["NHitsInProximity"] = proximity;
391  featureMap["CentroidSeparation"] = centroidSeparation;
392  featureMap["AvgDistance"] = avgDistance;
393  featureMap["CentroidVectorX"] = centroidVector.GetX();
394  featureMap["CentroidVectorZ"] = centroidVector.GetZ();
395  featureMap["Cluster1ADC"] = adc1;
396  featureMap["Cluster2ADC"] = adc2;
397 
398  const bool areClustersToMerge(this->ClusterTool(featureOrder, featureMap));
399  if (areClustersToMerge && countHits > m_countHitsThreshold)
400  {
401  clusterIsUsed[cluster] = true;
402  clusterIsUsed[otherCluster] = true;
403  clustersToMerge[cluster].push_back(otherCluster);
404  }
405  }
406 
407  if (m_writeTree)
408  {
409 #ifdef MONITORING
410  const int nClusters(pClusterList->size());
411  const unsigned long int clusterNEdgeHits{clusterEdgeHits.size()};
412  const unsigned long int otherClusterNEdgeHits{otherClusterEdgeHits.size()};
413  float combinedNClusterHits(clusterNHits + otherClusterNHits), combinedNClusterEdgeHits(clusterNEdgeHits + otherClusterNEdgeHits);
414 #endif
415  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "EventNumber", m_event));
416  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "VertexClusterAngle", vtxClusterAngle));
417  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "maxEdgeHitSeparation", maxEdgeHitSeparation));
418  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "NHitsInContact", contact));
419  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "NHitsInProximity", proximity));
420  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "minEdgeHitSeparation", minEdgeHitSeparation));
421  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "CentroidSeparation", centroidSeparation));
422  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "NClusters", nClusters));
423  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "CentroidVectorX", centroidVector.GetX()));
424  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "CentroidVectorZ", centroidVector.GetZ()));
425  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "TotalNClusterHits", (int)combinedNClusterHits));
426  PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(), m_treeName.c_str(), "TotalNClusterEdgeHits", (int)combinedNClusterEdgeHits));
427  PANDORA_MONITORING_API(FillTree(this->GetPandora(), m_treeName.c_str()));
428  }
429  }
430  }
431 
432  for (auto clusterToMergePair : clustersToMerge)
433  {
434  const Cluster *currentCluster{clusterToMergePair.first};
435  const auto clusters{clusterToMergePair.second};
436 
437  for (auto clusterToMerge : clusters)
438  {
439  if (!clusterToMerge->IsAvailable())
440  continue;
441 
442  if (m_printOut)
443  {
444  std::cout << "Number of hits in clusters: " << currentCluster->GetNCaloHits() << " | " << clusterToMerge->GetNCaloHits() << std::endl;
445  }
446 
447  try
448  {
449  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=,
450  PandoraContentApi::MergeAndDeleteClusters(*this, currentCluster, clusterToMerge, listName, listName));
451  }
452  catch (StatusCodeException)
453  {
454  }
455  }
456  }
457 
458  return STATUS_CODE_SUCCESS;
459 }
bool m_printOut
Whether the algorithm outputs cluster size information.
float m_contactThreshold
Distance value for hits to be considered in contact.
MvaTypes::MvaFeatureVector MvaFeatureVector
Definition: LArMvaHelper.h:75
const pandora::MCParticle * GetMCForCluster(const pandora::Cluster *const cluster, std::map< const pandora::Cluster *, const pandora::MCParticle * > &clusterToMCMap) const
Get the MC particle for a given cluster, caching to a map.
static pandora::StatusCode ProduceTrainingExample(const std::string &trainingOutputFile, const bool result, TCONTAINER &&featureContainer)
Produce a training example with the given features and result.
Definition: LArMvaHelper.h:285
const pandora::CaloHitList EdgeHitFinder(const pandora::Cluster *const cluster, pandora::CaloHitList &clusterEdgeHits) const
constexpr auto abs(T v)
Returns the absolute value of the argument.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
bool IsValidToUse(const pandora::Cluster *const cluster, std::map< const pandora::Cluster *, bool > &clusterIsUsed) const
Cluster finding and building.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
MvaTypes::MvaFeatureMap MvaFeatureMap
Definition: LArMvaHelper.h:78
TFile f
Definition: plotHisto.C:6
void hits()
Definition: readHits.C:15
float m_proximityThreshold
Distance value for hits to be considered in proximity.
bool ClusterTool(std::vector< std::string > featureOrder, LArMvaHelper::MvaFeatureMap featureMap) const
float m_countHitsThreshold
A cut on whether cluster merges will occur depending on total event hits.
std::string m_vertexListName
Input Vertex List name for vertex based calculation.
std::string m_treeName
Input tree name for ROOT.
HitType
Definition: HitType.h:12
std::string m_trainingOutputFile
The training output file.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
bool m_writeTree
Whether a tree should be output with recorded parameters.
std::list< Vertex > VertexList
Definition: DCEL.h:169
template<typename T >
const CaloHitList lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitFinder ( const pandora::Cluster *const  cluster,
pandora::CaloHitList &  clusterEdgeHits 
) const
protected

Definition at line 479 of file MvaLowEClusterMergingAlgorithm.cc.

References util::abs(), f, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_divisions, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_printOut, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_sectorTolerance.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer().

480 {
481  CartesianVector vector1(0.f, 0.f, 0.f), vector2(0.f, 0.f, 0.f), clusterCentroid(0.f, 0.f, 0.f), centroidI(0.f, 0.f, 0.f),
482  centroidJ(0.f, 0.f, 0.f);
483  CaloHitList clusterCaloHits;
484  std::map<const Cluster *, bool> clusterIsUsed;
485 
486  try
487  {
488  cluster->GetOrderedCaloHitList().FillCaloHitList(clusterCaloHits);
489  const CaloHitList &clusterIsoHits{cluster->GetIsolatedCaloHitList()};
490  clusterCaloHits.insert(clusterCaloHits.end(), clusterIsoHits.begin(), clusterIsoHits.end());
491  }
492  catch (StatusCodeException &)
493  {
494  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
495  std::cout << "Couldn't fill cluster with CaloHits" << std::endl;
496  }
497  try
498  {
499  centroidI = cluster->GetCentroid(cluster->GetInnerPseudoLayer());
500  centroidJ = cluster->GetCentroid(cluster->GetOuterPseudoLayer());
501  }
502  catch (...)
503  {
504  CaloHitList tempHits;
505  cluster->GetOrderedCaloHitList().FillCaloHitList(tempHits);
506  const CaloHitList &tempIsoHits{cluster->GetIsolatedCaloHitList()};
507  tempHits.insert(tempHits.end(), tempIsoHits.begin(), tempIsoHits.end());
508  centroidI = tempHits.front()->GetPositionVector();
509  centroidJ = tempHits.back()->GetPositionVector();
510  }
511 
512  const CartesianVector centroid((centroidI + centroidJ) * 0.5f);
513  std::map<const CaloHit *, bool> hitIsUsed;
514 
515  for (int i = 0; i < m_divisions; i++)
516  {
517  float maxMag{0}, phi((6.28318 * i) / m_divisions);
518  CartesianVector vec(std::cos(phi), 0.f, std::sin(phi));
519  CaloHitList sectorHits;
520  sectorHits.clear();
521 
522  for (const CaloHit *pCaloHit : clusterCaloHits)
523  {
524  if (hitIsUsed.count(pCaloHit) == 0)
525  {
526  const CartesianVector hitPosition(pCaloHit->GetPositionVector().GetX(), 0.f, pCaloHit->GetPositionVector().GetZ());
527  const CartesianVector centroidToHitVec(hitPosition - centroid);
528  const float mag(centroidToHitVec.GetMagnitude());
529  const CartesianVector normCentroidVec(centroidToHitVec * (1 / mag));
530  const float dotProduct(vec.GetDotProduct(normCentroidVec));
531 
532  if (std::abs(dotProduct) < m_sectorTolerance)
533  {
534  if (maxMag < mag)
535  {
536  maxMag = mag;
537  sectorHits.clear();
538  hitIsUsed[pCaloHit] = true;
539  sectorHits.push_back(pCaloHit);
540  }
541  }
542  }
543  }
544 
545  for (const CaloHit *pCaloHit : sectorHits)
546  {
547  clusterEdgeHits.push_back(pCaloHit);
548  }
549 
550  if (m_printOut)
551  {
552  std::cout << "SectorHit size: " << sectorHits.size() << std::endl;
553  std::cout << "Cluster Hit Size: " << clusterCaloHits.size() << " | Edge Hit Size: " << clusterEdgeHits.size() << std::endl;
554  }
555 
556  if (clusterCaloHits.size() < clusterEdgeHits.size())
557  {
558  std::cout << "Error in Edge Hit Algorithm: Incorrect edge hit classification !!!!" << std::endl;
559  }
560  }
561 
562  return clusterEdgeHits;
563 }
bool m_printOut
Whether the algorithm outputs cluster size information.
constexpr auto abs(T v)
Returns the absolute value of the argument.
Cluster finding and building.
TFile f
Definition: plotHisto.C:6
float m_sectorTolerance
Tolerance in radians for dot product between sector and centroid to CaloHit vector.
float m_divisions
Number of sectors to search in with Edge Hit Finder Function.
template<typename T >
const MCParticle * lar_content::MvaLowEClusterMergingAlgorithm< T >::GetMCForCluster ( const pandora::Cluster *const  cluster,
std::map< const pandora::Cluster *, const pandora::MCParticle * > &  clusterToMCMap 
) const
protected

Get the MC particle for a given cluster, caching to a map.

Parameters
clusterThe current cluster to lookup
clusterToMCMapMap from Cluster to MC to cache results.

Definition at line 109 of file MvaLowEClusterMergingAlgorithm.cc.

References e.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer().

111 {
112  const MCParticle *clusterMC{nullptr};
113 
114  if (clusterToMCMap.count(cluster) > 0)
115  {
116  clusterMC = clusterToMCMap.at(cluster);
117  }
118  else
119  {
120  try
121  {
122  clusterMC = MCParticleHelper::GetMainMCParticle(cluster);
123  clusterToMCMap[cluster] = clusterMC;
124  }
125  catch (StatusCodeException e)
126  {
127  std::cout << "Failed to get MC particle for cluster of " << cluster->GetOrderedCaloHitList().size() << " : " << e.ToString() << std::endl;
128  }
129  }
130 
131  return clusterMC;
132 }
Cluster finding and building.
Float_t e
Definition: plot.C:35
template<typename T >
bool lar_content::MvaLowEClusterMergingAlgorithm< T >::IsValidToUse ( const pandora::Cluster *const  cluster,
std::map< const pandora::Cluster *, bool > &  clusterIsUsed 
) const
protected

Definition at line 137 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minNCaloHits, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_upperHitThreshold.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer().

138 {
139  if (!cluster->IsAvailable())
140  return false;
141 
142  if (clusterIsUsed.count(cluster) > 0)
143  return false;
144 
145  if (cluster->GetNCaloHits() < m_minNCaloHits)
146  return false;
147 
148  if (cluster->GetNCaloHits() > m_upperHitThreshold)
149  return false;
150 
151  return true;
152 }
Cluster finding and building.
float m_minNCaloHits
The minimum number of hits for a cluster to be deemed true for IsAvailableToUse.
float m_upperHitThreshold
Max number of hits for cluster to be considered.
template<typename T >
StatusCode lar_content::MvaLowEClusterMergingAlgorithm< T >::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
protected

Definition at line 579 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::LArFileHelper::FindFileInPath(), lar_content::MvaLowEClusterMergingAlgorithm< T >::m_contactThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_countHitsThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_divisions, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_enableProbability, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_fileName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_filePathEnvironmentVariable, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_inputClusterListNames, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mcParticleListName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minNCaloHits, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minProbabilityCut, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mva, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mvaFileName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mvaName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_printOut, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_proximityThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_sectorTolerance, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_trainingOutputFile, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_trainingSetMode, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_treeName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_upperHitThreshold, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_vertexListName, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_writeTree.

580 {
581  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "TrainingSetMode", m_trainingSetMode));
582 
583  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "PrintOut", m_printOut));
584 
585  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
586  XmlHelper::ReadValue(xmlHandle, "FilePathEnvironmentVariable", m_filePathEnvironmentVariable));
587 
588  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MvaFileName", m_mvaFileName));
589 
590  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MvaName", m_mvaName));
591 
592  PANDORA_RETURN_RESULT_IF_AND_IF(
593  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "EnableProbability", m_enableProbability));
594 
595  PANDORA_RETURN_RESULT_IF_AND_IF(
596  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinProbabilityCut", m_minProbabilityCut));
597 
598  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputClusterListNames", m_inputClusterListNames));
599 
600  PANDORA_RETURN_RESULT_IF_AND_IF(
601  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
602 
603  PANDORA_RETURN_RESULT_IF_AND_IF(
604  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "UpperHitThreshold", m_upperHitThreshold));
605 
606  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinNCaloHits", m_minNCaloHits));
607 
608  PANDORA_RETURN_RESULT_IF_AND_IF(
609  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "CountHitsThreshold", m_countHitsThreshold));
610 
611  PANDORA_RETURN_RESULT_IF_AND_IF(
612  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ContactThreshold", m_contactThreshold));
613 
614  PANDORA_RETURN_RESULT_IF_AND_IF(
615  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ProximityThreshold", m_proximityThreshold));
616 
617  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "EdgeHitToolDivisions", m_divisions));
618 
619  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SectorTolerance", m_sectorTolerance));
620 
621  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "WriteTree", m_writeTree));
622 
623  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexListName", m_vertexListName));
624 
625  if (m_writeTree)
626  {
627  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "TreeName", m_treeName));
628 
629  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "FileName", m_fileName));
630  }
631 
632  if (m_trainingSetMode)
633  {
634  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
635  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "TrainingOutputFileName", m_trainingOutputFile));
636  }
637  else
638  {
639  if (m_mvaFileName.empty() || m_mvaName.empty())
640  {
641  std::cout << "MvaLowEClusterMergingAlgorithm: MvaFileName and MvaName must be set if in classification mode " << std::endl;
642 
643  return STATUS_CODE_INVALID_PARAMETER;
644  }
645 
647  m_mva.Initialize(fullMvaFileName, m_mvaName);
648  }
649 
650  return STATUS_CODE_SUCCESS;
651 }
bool m_printOut
Whether the algorithm outputs cluster size information.
float m_contactThreshold
Distance value for hits to be considered in contact.
std::string m_fileName
Input file name for ROOT.
float m_minProbabilityCut
The minimum probability to label a cluster as track-like.
std::string m_mvaName
The name of the mva to find.
bool m_enableProbability
Whether to use probabilities instead of binary classification.
std::string m_mcParticleListName
Input MC particle list name.
float m_minNCaloHits
The minimum number of hits for a cluster to be deemed true for IsAvailableToUse.
float m_proximityThreshold
Distance value for hits to be considered in proximity.
static std::string FindFileInPath(const std::string &unqualifiedFileName, const std::string &environmentVariable, const std::string &delimiter=":")
Find the fully-qualified file name by searching through a list of delimiter-separated paths in a name...
float m_countHitsThreshold
A cut on whether cluster merges will occur depending on total event hits.
std::string m_vertexListName
Input Vertex List name for vertex based calculation.
float m_sectorTolerance
Tolerance in radians for dot product between sector and centroid to CaloHit vector.
std::string m_filePathEnvironmentVariable
The environment variable providing a list of paths to mva files.
std::string m_treeName
Input tree name for ROOT.
pandora::StringVector m_inputClusterListNames
The names of the input cluster lists.
std::string m_trainingOutputFile
The training output file.
float m_divisions
Number of sectors to search in with Edge Hit Finder Function.
bool m_writeTree
Whether a tree should be output with recorded parameters.
float m_upperHitThreshold
Max number of hits for cluster to be considered.
template<typename T >
StatusCode lar_content::MvaLowEClusterMergingAlgorithm< T >::Run ( )
protected

Definition at line 67 of file MvaLowEClusterMergingAlgorithm.cc.

References lar_content::MvaLowEClusterMergingAlgorithm< T >::EdgeHitComparer(), lar_content::MvaLowEClusterMergingAlgorithm< T >::m_event, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_fileName, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_inputClusterListNames, lar_content::MvaLowEClusterMergingAlgorithm< T >::m_treeName, and lar_content::MvaLowEClusterMergingAlgorithm< T >::m_writeTree.

68 {
69  ++m_event;
70  std::map<const Cluster *, ClusterVector> clustersToMerge;
71 
72  for (const std::string &clusterListName : m_inputClusterListNames)
73  {
74  try
75  {
76  const ClusterList *pClusterList{nullptr};
77  PANDORA_RETURN_RESULT_IF_AND_IF(
78  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, clusterListName, pClusterList));
79 
80  if (!pClusterList || pClusterList->empty())
81  {
82  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
83  std::cout << "ClusterMergingAlgorithm: unable to find cluster list " << clusterListName << std::endl;
84 
85  continue;
86  }
87  PandoraContentApi::ParticleFlowObject::Metadata lowEClustersMetadata;
88 
89  this->EdgeHitComparer(pClusterList, clusterListName);
90  }
91 
92  catch (StatusCodeException &statusCodeException)
93  {
94  throw statusCodeException;
95  }
96 
97  if (m_writeTree)
98  {
99  PANDORA_MONITORING_API(SaveTree(this->GetPandora(), m_treeName.c_str(), m_fileName.c_str(), "RECREATE"))
100  }
101  }
102 
103  return STATUS_CODE_SUCCESS;
104 }
std::string m_fileName
Input file name for ROOT.
pandora::StatusCode EdgeHitComparer(const pandora::ClusterList *const pClusterList, const std::string &listName) const
std::string m_treeName
Input tree name for ROOT.
pandora::StringVector m_inputClusterListNames
The names of the input cluster lists.
bool m_writeTree
Whether a tree should be output with recorded parameters.

Member Data Documentation

template<typename T >
float lar_content::MvaLowEClusterMergingAlgorithm< T >::m_countHitsThreshold
protected
template<typename T >
std::string lar_content::MvaLowEClusterMergingAlgorithm< T >::m_filePathEnvironmentVariable
protected
template<typename T >
pandora::StringVector lar_content::MvaLowEClusterMergingAlgorithm< T >::m_inputClusterListNames
protected
template<typename T >
float lar_content::MvaLowEClusterMergingAlgorithm< T >::m_maxClusterFraction
protected

The maximum fraction a cluster can be contaminated by to be considered clean.

Definition at line 70 of file MvaLowEClusterMergingAlgorithm.h.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::MvaLowEClusterMergingAlgorithm().

template<typename T >
std::string lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mcParticleListName
protected

Input MC particle list name.

Definition at line 63 of file MvaLowEClusterMergingAlgorithm.h.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::ReadSettings().

template<typename T >
float lar_content::MvaLowEClusterMergingAlgorithm< T >::m_minNCaloHits
protected
template<typename T >
std::string lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mvaFileName
protected

The mva input file.

Definition at line 76 of file MvaLowEClusterMergingAlgorithm.h.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::ReadSettings().

template<typename T >
std::string lar_content::MvaLowEClusterMergingAlgorithm< T >::m_mvaName
protected

The name of the mva to find.

Definition at line 77 of file MvaLowEClusterMergingAlgorithm.h.

Referenced by lar_content::MvaLowEClusterMergingAlgorithm< T >::ReadSettings().

template<typename T >
float lar_content::MvaLowEClusterMergingAlgorithm< T >::m_sectorTolerance
protected
template<typename T >
std::string lar_content::MvaLowEClusterMergingAlgorithm< T >::m_trainingOutputFile
protected

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