Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
lar_content::EventSlicingTool Class Reference

EventSlicingTool class. More...

#include <EventSlicingTool.h>

Inheritance diagram for lar_content::EventSlicingTool:
lar_content::EventSlicingBaseTool

Public Member Functions

 EventSlicingTool ()
 Default constructor. More...
 
void RunSlicing (const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, const SlicingAlgorithm::HitTypeToNameMap &clusterListNames, SlicingAlgorithm::SliceList &sliceList)
 Run the slicing tool. More...
 

Private Types

typedef std::unordered_map< const pandora::Cluster *, const pandora::ParticleFlowObject * > ClusterToPfoMap
 
typedef std::vector< pandora::ClusterVector > ClusterSliceList
 
typedef std::unordered_map< const pandora::Cluster *, unsigned int > ClusterToSliceIndexMap
 
typedef KDTreeLinkerAlgo< const pandora::CartesianVector *, 2 > PointKDTree2D
 
typedef KDTreeNodeInfoT< const pandora::CartesianVector *, 2 > PointKDNode2D
 
typedef std::vector< PointKDNode2DPointKDNode2DList
 
typedef std::list< const pandora::CartesianVector * > PointList
 
typedef std::unordered_map< const pandora::CartesianVector *, unsigned int > PointToSliceIndexMap
 

Private Member Functions

void CopyAllHitsToSingleSlice (const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, SlicingAlgorithm::SliceList &sliceList) const
 Copy all the input hits in an event into a single slice. More...
 
void GetThreeDClusters (const pandora::Algorithm *const pAlgorithm, const std::string &pfoListName, pandora::ClusterList &clusters3D, ClusterToPfoMap &clusterToPfoMap) const
 Get the 3D clusters from a specified list of pfos, storing the 3D clusters in the provided list and populating a map from 3D cluster to parent pfo. More...
 
void GetClusterSliceList (const pandora::ClusterList &trackClusters3D, const pandora::ClusterList &showerClusters3D, ClusterSliceList &clusterSliceList) const
 Divide the provided lists of 3D track and shower clusters into slices. More...
 
void CollectAssociatedClusters (const pandora::Cluster *const pClusterInSlice, const pandora::ClusterVector &candidateClusters, const ThreeDSlidingFitResultMap &trackFitResults, const ThreeDSlidingConeFitResultMap &showerConeFitResults, pandora::ClusterVector &clusterSlice, pandora::ClusterSet &usedClusters) const
 Collect all clusters associated with a provided cluster. More...
 
bool PassPointing (const pandora::Cluster *const pClusterInSlice, const pandora::Cluster *const pCandidateCluster, const ThreeDSlidingFitResultMap &trackFitResults) const
 Compare the provided clusters to assess whether they are associated via pointing (checks association "both ways") More...
 
bool PassProximity (const pandora::Cluster *const pClusterInSlice, const pandora::Cluster *const pCandidateCluster) const
 Compare the provided clusters to assess whether they are associated via pointing. More...
 
bool PassShowerCone (const pandora::Cluster *const pConeCluster, const pandora::Cluster *const pNearbyCluster, const ThreeDSlidingConeFitResultMap &showerConeFitResults) const
 Compare the provided clusters to assess whether they are associated via cone fits to the shower cluster (single "direction" check) More...
 
bool CheckClosestApproach (const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
 Check closest approach metrics for a pair of pointing clusters. More...
 
bool CheckClosestApproach (const LArPointingCluster::Vertex &vertex1, const LArPointingCluster::Vertex &vertex2) const
 Check closest approach metrics for a pair of pointing cluster vertices. More...
 
bool IsNode (const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
 Check whether a pair of pointing clusters are nodally associated. More...
 
bool IsEmission (const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
 Check whether a pair of pointing clusters are consistent with an emission. More...
 
void CreateSlices (const ClusterSliceList &clusterSliceList, SlicingAlgorithm::SliceList &sliceList, ClusterToSliceIndexMap &clusterToSliceIndexMap) const
 Create new slices for each of the groupings of 3D clusters in the provided cluster slice list. More...
 
void CopyPfoHitsToSlices (const ClusterToSliceIndexMap &clusterToSliceIndexMap, const ClusterToPfoMap &clusterToPfoMap, SlicingAlgorithm::SliceList &sliceList, pandora::ClusterSet &assignedClusters) const
 Use 3D clusters in the cluster slice list, find their parent pfos and assign all hits in all 2D clusters in the pfos to the relevant slice in the output slice list. More...
 
void GetRemainingClusters (const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &clusterListNames, const pandora::ClusterSet &assignedClusters, pandora::ClusterList &remainingClusters) const
 Get the list of 2D clusters with hits yets to be assigned to slices. More...
 
void GetRemainingClusters (const pandora::Algorithm *const pAlgorithm, const std::string &clusterListName, const pandora::ClusterSet &assignedClusters, pandora::ClusterList &remainingClusters) const
 Get the list of 2D clusters (from a named 2D cluster list) with hits yets to be assigned to slices. More...
 
void AssignRemainingHitsToSlices (const pandora::ClusterList &remainingClusters, const ClusterToSliceIndexMap &clusterToSliceIndexMap, SlicingAlgorithm::SliceList &sliceList) const
 Use the list of remaining 2D clusters to assign all remaining 2D hits to existing slices in the slice list. More...
 
void GetKDTreeEntries2D (const SlicingAlgorithm::SliceList &sliceList, PointList &pointsU, PointList &pointsV, PointList &pointsW, PointToSliceIndexMap &pointToSliceIndexMap) const
 Use projections of 3D hits already assigned to slices to populate kd trees to aid assignment of remaining clusters. More...
 
void GetKDTreeEntries3D (const ClusterToSliceIndexMap &clusterToSliceIndexMap, PointList &pointsU, PointList &pointsV, PointList &pointsW, PointToSliceIndexMap &pointToSliceIndexMap) const
 Use 2D hits already assigned to slices to populate kd trees to aid assignment of remaining clusters. More...
 
const PointKDNode2DMatchClusterToSlice (const pandora::Cluster *const pCluster2D, PointKDTree2D &kdTree) const
 Use the provided kd tree to efficiently identify the most appropriate slice for the provided 2D cluster. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Static Private Member Functions

static bool SortPoints (const pandora::CartesianVector *const pLhs, const pandora::CartesianVector *const pRhs)
 Sort points (use Z, followed by X, followed by Y) More...
 

Private Attributes

std::string m_trackPfoListName
 The name of the input track pfo list. More...
 
std::string m_showerPfoListName
 The name of the input shower pfo list. More...
 
unsigned int m_minHitsPer3DCluster
 The minimum number of hits in a 3D cluster to warrant consideration in slicing. More...
 
unsigned int m_min3DHitsToSeedNewSlice
 The minimum number of hits in a 3D cluster to seed a new slice. More...
 
unsigned int m_halfWindowLayers
 The number of layers to use for half-window of sliding fit. More...
 
bool m_usePointingAssociation
 Whether to use pointing association. More...
 
float m_minVertexLongitudinalDistance
 Pointing association check: min longitudinal distance cut. More...
 
float m_maxVertexLongitudinalDistance
 Pointing association check: max longitudinal distance cut. More...
 
float m_maxVertexTransverseDistance
 Pointing association check: max transverse distance cut. More...
 
float m_vertexAngularAllowance
 Pointing association check: pointing angular allowance in degrees. More...
 
float m_maxClosestApproach
 Pointing association: max distance of closest approach between straight line fits. More...
 
float m_maxInterceptDistance
 Pointing association: max distance from cluster vertex to point of closest approach. More...
 
bool m_useProximityAssociation
 Whether to use proximity association. More...
 
float m_maxHitSeparationSquared
 Proximity association: max distance allowed between the closest pair of hits. More...
 
bool m_useShowerConeAssociation
 Whether to use shower cone association. More...
 
unsigned int m_nConeFitLayers
 The number of layers over which to sum fitted direction to obtain cone fit. More...
 
unsigned int m_nConeFits
 The number of cone fits to perform, spread roughly uniformly along the shower length. More...
 
float m_coneLengthMultiplier
 The cone length multiplier to use when calculating bounded cluster fractions. More...
 
float m_maxConeLength
 The maximum allowed cone length to use when calculating bounded cluster fractions. More...
 
float m_coneTanHalfAngle1
 The cone tan half angle to use when calculating bounded cluster fractions 1. More...
 
float m_coneBoundedFraction1
 The minimum cluster bounded fraction for association 1. More...
 
float m_coneTanHalfAngle2
 The cone tan half angle to use when calculating bounded cluster fractions 2. More...
 
float m_coneBoundedFraction2
 The minimum cluster bounded fraction for association 2. More...
 
bool m_use3DProjectionsInHitPickUp
 Whether to include 3D cluster projections when assigning remaining clusters to slices. More...
 

Detailed Description

EventSlicingTool class.

Definition at line 32 of file EventSlicingTool.h.

Member Typedef Documentation

typedef std::vector<pandora::ClusterVector> lar_content::EventSlicingTool::ClusterSliceList
private

Definition at line 68 of file EventSlicingTool.h.

typedef std::unordered_map<const pandora::Cluster *, const pandora::ParticleFlowObject *> lar_content::EventSlicingTool::ClusterToPfoMap
private

Definition at line 54 of file EventSlicingTool.h.

typedef std::unordered_map<const pandora::Cluster *, unsigned int> lar_content::EventSlicingTool::ClusterToSliceIndexMap
private

Definition at line 168 of file EventSlicingTool.h.

typedef KDTreeNodeInfoT<const pandora::CartesianVector *, 2> lar_content::EventSlicingTool::PointKDNode2D
private

Definition at line 224 of file EventSlicingTool.h.

Definition at line 225 of file EventSlicingTool.h.

typedef KDTreeLinkerAlgo<const pandora::CartesianVector *, 2> lar_content::EventSlicingTool::PointKDTree2D
private

Definition at line 223 of file EventSlicingTool.h.

typedef std::list<const pandora::CartesianVector *> lar_content::EventSlicingTool::PointList
private

Definition at line 227 of file EventSlicingTool.h.

typedef std::unordered_map<const pandora::CartesianVector *, unsigned int> lar_content::EventSlicingTool::PointToSliceIndexMap
private

Definition at line 228 of file EventSlicingTool.h.

Constructor & Destructor Documentation

lar_content::EventSlicingTool::EventSlicingTool ( )

Default constructor.

Definition at line 34 of file EventSlicingTool.cc.

34  :
46  m_maxHitSeparationSquared(25.f * 25.f),
48  m_nConeFitLayers(20),
49  m_nConeFits(5),
51  m_maxConeLength(126.f),
57 {
58 }
unsigned int m_nConeFits
The number of cone fits to perform, spread roughly uniformly along the shower length.
unsigned int m_min3DHitsToSeedNewSlice
The minimum number of hits in a 3D cluster to seed a new slice.
float m_maxHitSeparationSquared
Proximity association: max distance allowed between the closest pair of hits.
unsigned int m_nConeFitLayers
The number of layers over which to sum fitted direction to obtain cone fit.
float m_coneTanHalfAngle2
The cone tan half angle to use when calculating bounded cluster fractions 2.
float m_maxVertexTransverseDistance
Pointing association check: max transverse distance cut.
float m_coneBoundedFraction2
The minimum cluster bounded fraction for association 2.
unsigned int m_minHitsPer3DCluster
The minimum number of hits in a 3D cluster to warrant consideration in slicing.
float m_coneTanHalfAngle1
The cone tan half angle to use when calculating bounded cluster fractions 1.
float m_maxVertexLongitudinalDistance
Pointing association check: max longitudinal distance cut.
bool m_useProximityAssociation
Whether to use proximity association.
float m_maxClosestApproach
Pointing association: max distance of closest approach between straight line fits.
bool m_usePointingAssociation
Whether to use pointing association.
float m_coneLengthMultiplier
The cone length multiplier to use when calculating bounded cluster fractions.
float m_maxInterceptDistance
Pointing association: max distance from cluster vertex to point of closest approach.
float m_minVertexLongitudinalDistance
Pointing association check: min longitudinal distance cut.
bool m_use3DProjectionsInHitPickUp
Whether to include 3D cluster projections when assigning remaining clusters to slices.
float m_maxConeLength
The maximum allowed cone length to use when calculating bounded cluster fractions.
bool m_useShowerConeAssociation
Whether to use shower cone association.
float m_vertexAngularAllowance
Pointing association check: pointing angular allowance in degrees.
float m_coneBoundedFraction1
The minimum cluster bounded fraction for association 1.
unsigned int m_halfWindowLayers
The number of layers to use for half-window of sliding fit.

Member Function Documentation

void lar_content::EventSlicingTool::AssignRemainingHitsToSlices ( const pandora::ClusterList &  remainingClusters,
const ClusterToSliceIndexMap clusterToSliceIndexMap,
SlicingAlgorithm::SliceList sliceList 
) const
private

Use the list of remaining 2D clusters to assign all remaining 2D hits to existing slices in the slice list.

Parameters
remainingClustersthe list of 2D clusters with hits yet to be assigned to slices
clusterToSliceIndexMapthe mapping from 3D clusters to index in the slice list
sliceListthe list containing slices to be populated with 2D hits

Definition at line 527 of file EventSlicingTool.cc.

529 {
530  PointToSliceIndexMap pointToSliceIndexMap;
531 
532  try
533  {
534  PointList pointsU, pointsV, pointsW;
535  this->GetKDTreeEntries2D(sliceList, pointsU, pointsV, pointsW, pointToSliceIndexMap);
536 
538  this->GetKDTreeEntries3D(clusterToSliceIndexMap, pointsU, pointsV, pointsW, pointToSliceIndexMap);
539 
540  pointsU.sort(EventSlicingTool::SortPoints);
541  pointsV.sort(EventSlicingTool::SortPoints);
542  pointsW.sort(EventSlicingTool::SortPoints);
543 
544  PointKDNode2DList kDNode2DListU, kDNode2DListV, kDNode2DListW;
545  KDTreeBox boundingRegionU = fill_and_bound_2d_kd_tree(pointsU, kDNode2DListU);
546  KDTreeBox boundingRegionV = fill_and_bound_2d_kd_tree(pointsV, kDNode2DListV);
547  KDTreeBox boundingRegionW = fill_and_bound_2d_kd_tree(pointsW, kDNode2DListW);
548 
549  PointKDTree2D kdTreeU, kdTreeV, kdTreeW;
550  kdTreeU.build(kDNode2DListU, boundingRegionU);
551  kdTreeV.build(kDNode2DListV, boundingRegionV);
552  kdTreeW.build(kDNode2DListW, boundingRegionW);
553 
554  ClusterVector sortedRemainingClusters(remainingClusters.begin(), remainingClusters.end());
555  std::sort(sortedRemainingClusters.begin(), sortedRemainingClusters.end(), LArClusterHelper::SortByNHits);
556 
557  for (const Cluster *const pCluster2D : sortedRemainingClusters)
558  {
559  const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster2D));
560 
561  if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
562  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
563 
564  PointKDTree2D &kdTree((TPC_VIEW_U == hitType) ? kdTreeU : (TPC_VIEW_V == hitType) ? kdTreeV : kdTreeW);
565  const PointKDNode2D *pBestResultPoint(this->MatchClusterToSlice(pCluster2D, kdTree));
566 
567  if (!pBestResultPoint)
568  continue;
569 
570  Slice &slice(sliceList.at(pointToSliceIndexMap.at(pBestResultPoint->data)));
571  CaloHitList &targetList((TPC_VIEW_U == hitType) ? slice.m_caloHitListU : (TPC_VIEW_V == hitType) ? slice.m_caloHitListV : slice.m_caloHitListW);
572 
573  pCluster2D->GetOrderedCaloHitList().FillCaloHitList(targetList);
574  targetList.insert(targetList.end(), pCluster2D->GetIsolatedCaloHitList().begin(), pCluster2D->GetIsolatedCaloHitList().end());
575  }
576  }
577  catch (...)
578  {
579  std::cout << "EventSlicingTool::AssignRemainingHitsToSlices - exception " << std::endl;
580  for (const auto &pointMap : pointToSliceIndexMap)
581  delete pointMap.first;
582  throw;
583  }
584 
585  for (const auto &pointMap : pointToSliceIndexMap)
586  delete pointMap.first;
587 }
KDTreeLinkerAlgo< const pandora::CartesianVector *, 2 > PointKDTree2D
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
SlicingAlgorithm::Slice Slice
enum cvn::HType HitType
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
const PointKDNode2D * MatchClusterToSlice(const pandora::Cluster *const pCluster2D, PointKDTree2D &kdTree) const
Use the provided kd tree to efficiently identify the most appropriate slice for the provided 2D clust...
std::unordered_map< const pandora::CartesianVector *, unsigned int > PointToSliceIndexMap
KDTreeNodeInfoT< const pandora::CartesianVector *, 2 > PointKDNode2D
static bool SortPoints(const pandora::CartesianVector *const pLhs, const pandora::CartesianVector *const pRhs)
Sort points (use Z, followed by X, followed by Y)
std::list< const pandora::CartesianVector * > PointList
std::vector< PointKDNode2D > PointKDNode2DList
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 >> &nodes)
fill_and_bound_2d_kd_tree
bool m_use3DProjectionsInHitPickUp
Whether to include 3D cluster projections when assigning remaining clusters to slices.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void GetKDTreeEntries2D(const SlicingAlgorithm::SliceList &sliceList, PointList &pointsU, PointList &pointsV, PointList &pointsW, PointToSliceIndexMap &pointToSliceIndexMap) const
Use projections of 3D hits already assigned to slices to populate kd trees to aid assignment of remai...
void GetKDTreeEntries3D(const ClusterToSliceIndexMap &clusterToSliceIndexMap, PointList &pointsU, PointList &pointsV, PointList &pointsW, PointToSliceIndexMap &pointToSliceIndexMap) const
Use 2D hits already assigned to slices to populate kd trees to aid assignment of remaining clusters...
KDTreeBoxT< 2 > KDTreeBox
QTextStream & endl(QTextStream &s)
bool lar_content::EventSlicingTool::CheckClosestApproach ( const LArPointingCluster cluster1,
const LArPointingCluster cluster2 
) const
private

Check closest approach metrics for a pair of pointing clusters.

Parameters
cluster1the first pointing cluster
cluster2the second pointing cluster
Returns
whether the pointing clusters are declared to be in the same slice

Definition at line 345 of file EventSlicingTool.cc.

346 {
347  return (this->CheckClosestApproach(cluster1.GetInnerVertex(), cluster2.GetInnerVertex()) ||
348  this->CheckClosestApproach(cluster1.GetOuterVertex(), cluster2.GetInnerVertex()) ||
349  this->CheckClosestApproach(cluster1.GetInnerVertex(), cluster2.GetOuterVertex()) ||
350  this->CheckClosestApproach(cluster1.GetOuterVertex(), cluster2.GetOuterVertex()));
351 }
bool CheckClosestApproach(const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
Check closest approach metrics for a pair of pointing clusters.
bool lar_content::EventSlicingTool::CheckClosestApproach ( const LArPointingCluster::Vertex vertex1,
const LArPointingCluster::Vertex vertex2 
) const
private

Check closest approach metrics for a pair of pointing cluster vertices.

Parameters
vertex1the first pointing cluster vertex
vertex2the second pointing cluster vertex
Returns
whether the pointing clusters are declared to be in the same slice

Definition at line 355 of file EventSlicingTool.cc.

356 {
357  CartesianVector intersectionPoint(0.f, 0.f, 0.f);
358  float displacement1(std::numeric_limits<float>::max()), displacement2(std::numeric_limits<float>::max());
359 
360  try
361  {
362  LArPointingClusterHelper::GetIntersection(vertex1, vertex2, intersectionPoint, displacement1, displacement2);
363  }
364  catch (const StatusCodeException &)
365  {
366  return false;
367  }
368 
369  const CartesianVector approach1(vertex1.GetPosition() + vertex1.GetDirection() * displacement1);
370  const CartesianVector approach2(vertex2.GetPosition() + vertex2.GetDirection() * displacement2);
371  const float closestApproach((approach1 - approach2).GetMagnitude());
372 
373  return ((closestApproach < m_maxClosestApproach) && (std::fabs(displacement1) < m_maxInterceptDistance) &&
374  (std::fabs(displacement2) < m_maxInterceptDistance));
375 }
static void GetIntersection(const LArPointingCluster::Vertex &firstVertex, const LArPointingCluster::Vertex &secondVertex, pandora::CartesianVector &intersectPosition, float &firstDisplacement, float &secondDisplacement)
Get intersection of two vertices.
float m_maxClosestApproach
Pointing association: max distance of closest approach between straight line fits.
static int max(int a, int b)
float m_maxInterceptDistance
Pointing association: max distance from cluster vertex to point of closest approach.
void lar_content::EventSlicingTool::CollectAssociatedClusters ( const pandora::Cluster *const  pClusterInSlice,
const pandora::ClusterVector &  candidateClusters,
const ThreeDSlidingFitResultMap trackFitResults,
const ThreeDSlidingConeFitResultMap showerConeFitResults,
pandora::ClusterVector &  clusterSlice,
pandora::ClusterSet &  usedClusters 
) const
private

Collect all clusters associated with a provided cluster.

Parameters
pClusterInSlicethe address of the cluster already in a slice
candidateClustersthe list of candidate clusters
trackFitResultsthe map of sliding fit results for track candidate clusters
showerConeFitResultsthe map of sliding const fit results for shower candidate clusters
clusterSlicethe cluster slice
usedClustersthe list of clusters already added to slices

Definition at line 228 of file EventSlicingTool.cc.

231 {
232  ClusterVector addedClusters;
233 
234  for (const Cluster *const pCandidateCluster : candidateClusters)
235  {
236  if (usedClusters.count(pCandidateCluster) || (pClusterInSlice == pCandidateCluster))
237  continue;
238 
239  if ((m_usePointingAssociation && this->PassPointing(pClusterInSlice, pCandidateCluster, trackFitResults)) ||
240  (m_useProximityAssociation && this->PassProximity(pClusterInSlice, pCandidateCluster)) ||
241  (m_useShowerConeAssociation && (this->PassShowerCone(pClusterInSlice, pCandidateCluster, showerConeFitResults) ||
242  this->PassShowerCone(pCandidateCluster, pClusterInSlice, showerConeFitResults))))
243  {
244  addedClusters.push_back(pCandidateCluster);
245  (void)usedClusters.insert(pCandidateCluster);
246  }
247  }
248 
249  clusterSlice.insert(clusterSlice.end(), addedClusters.begin(), addedClusters.end());
250 
251  for (const Cluster *const pAddedCluster : addedClusters)
252  this->CollectAssociatedClusters(pAddedCluster, candidateClusters, trackFitResults, showerConeFitResults, clusterSlice, usedClusters);
253 }
bool PassShowerCone(const pandora::Cluster *const pConeCluster, const pandora::Cluster *const pNearbyCluster, const ThreeDSlidingConeFitResultMap &showerConeFitResults) const
Compare the provided clusters to assess whether they are associated via cone fits to the shower clust...
bool PassPointing(const pandora::Cluster *const pClusterInSlice, const pandora::Cluster *const pCandidateCluster, const ThreeDSlidingFitResultMap &trackFitResults) const
Compare the provided clusters to assess whether they are associated via pointing (checks association ...
void CollectAssociatedClusters(const pandora::Cluster *const pClusterInSlice, const pandora::ClusterVector &candidateClusters, const ThreeDSlidingFitResultMap &trackFitResults, const ThreeDSlidingConeFitResultMap &showerConeFitResults, pandora::ClusterVector &clusterSlice, pandora::ClusterSet &usedClusters) const
Collect all clusters associated with a provided cluster.
bool m_useProximityAssociation
Whether to use proximity association.
bool m_usePointingAssociation
Whether to use pointing association.
bool PassProximity(const pandora::Cluster *const pClusterInSlice, const pandora::Cluster *const pCandidateCluster) const
Compare the provided clusters to assess whether they are associated via pointing. ...
std::vector< art::Ptr< recob::Cluster > > ClusterVector
bool m_useShowerConeAssociation
Whether to use shower cone association.
void lar_content::EventSlicingTool::CopyAllHitsToSingleSlice ( const pandora::Algorithm *const  pAlgorithm,
const SlicingAlgorithm::HitTypeToNameMap caloHitListNames,
SlicingAlgorithm::SliceList sliceList 
) const
private

Copy all the input hits in an event into a single slice.

Parameters
pAlgorithmthe address of the calling algorithm
caloHitListNamesthe hit type to calo hit list name map
sliceListthe slice list to receive the single new slice

Definition at line 100 of file EventSlicingTool.cc.

101 {
102  if (!sliceList.empty())
103  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
104 
105  const CaloHitList *pCaloHitListU(nullptr);
106  PANDORA_THROW_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=,
107  PandoraContentApi::GetList(*pAlgorithm, caloHitListNames.at(TPC_VIEW_U), pCaloHitListU));
108 
109  const CaloHitList *pCaloHitListV(nullptr);
110  PANDORA_THROW_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=,
111  PandoraContentApi::GetList(*pAlgorithm, caloHitListNames.at(TPC_VIEW_V), pCaloHitListV));
112 
113  const CaloHitList *pCaloHitListW(nullptr);
114  PANDORA_THROW_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=,
115  PandoraContentApi::GetList(*pAlgorithm, caloHitListNames.at(TPC_VIEW_W), pCaloHitListW));
116 
117  if (pCaloHitListU || pCaloHitListV || pCaloHitListW)
118  {
119  sliceList.push_back(Slice());
120  Slice &slice(sliceList.at(0));
121 
122  if (pCaloHitListU)
123  slice.m_caloHitListU = *pCaloHitListU;
124  if (pCaloHitListV)
125  slice.m_caloHitListV = *pCaloHitListV;
126  if (pCaloHitListW)
127  slice.m_caloHitListW = *pCaloHitListW;
128  }
129 }
SlicingAlgorithm::Slice Slice
pandora::CaloHitList m_caloHitListU
The u calo hit list.
void lar_content::EventSlicingTool::CopyPfoHitsToSlices ( const ClusterToSliceIndexMap clusterToSliceIndexMap,
const ClusterToPfoMap clusterToPfoMap,
SlicingAlgorithm::SliceList sliceList,
pandora::ClusterSet &  assignedClusters 
) const
private

Use 3D clusters in the cluster slice list, find their parent pfos and assign all hits in all 2D clusters in the pfos to the relevant slice in the output slice list.

Parameters
clusterToSliceIndexMapthe mapping from 3D clusters to index in the slice list
clusterToPfoMapthe mapping from 3D clusters to parent pfos
sliceListthe list containing slices to be populated with 2D hits
assignedClustersto receive the list of 2D clusters with hits assigned to slices

Definition at line 445 of file EventSlicingTool.cc.

447 {
448  ClusterList clusterList;
449  for (const auto &mapEntry : clusterToSliceIndexMap)
450  clusterList.push_back(mapEntry.first);
451  clusterList.sort(LArClusterHelper::SortByNHits);
452 
453  for (const Cluster *const pCluster3D : clusterList)
454  {
455  const unsigned int index(clusterToSliceIndexMap.at(pCluster3D));
456 
457  const Pfo *const pPfo(clusterToPfoMap.at(pCluster3D));
458  Slice &slice(sliceList.at(index));
459 
460  ClusterList clusters2D;
461  LArPfoHelper::GetTwoDClusterList(pPfo, clusters2D);
462 
463  for (const Cluster *const pCluster2D : clusters2D)
464  {
465  const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster2D));
466 
467  if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
468  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
469 
470  CaloHitList &targetList((TPC_VIEW_U == hitType) ? slice.m_caloHitListU : (TPC_VIEW_V == hitType) ? slice.m_caloHitListV : slice.m_caloHitListW);
471 
472  pCluster2D->GetOrderedCaloHitList().FillCaloHitList(targetList);
473  targetList.insert(targetList.end(), pCluster2D->GetIsolatedCaloHitList().begin(), pCluster2D->GetIsolatedCaloHitList().end());
474 
475  if (!assignedClusters.insert(pCluster2D).second)
476  throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
477  }
478  }
479 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
SlicingAlgorithm::Slice Slice
enum cvn::HType HitType
static void GetTwoDClusterList(const pandora::ParticleFlowObject *const pPfo, pandora::ClusterList &clusterList)
Get the list of 2D clusters from an input pfo.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
void lar_content::EventSlicingTool::CreateSlices ( const ClusterSliceList clusterSliceList,
SlicingAlgorithm::SliceList sliceList,
ClusterToSliceIndexMap clusterToSliceIndexMap 
) const
private

Create new slices for each of the groupings of 3D clusters in the provided cluster slice list.

Parameters
clusterSliceListthe list of 3D clusters, divided into slices (one 3D cluster list per slice)
sliceListthe slice list to receive the new slices
clusterToSliceIndexMapto receive the mapping from 3D clusters to index in the slice list

Definition at line 423 of file EventSlicingTool.cc.

424 {
425  unsigned int index(0);
426 
427  for (const ClusterVector &clusterList : clusterSliceList)
428  {
429  for (const Cluster *const pCluster3D : clusterList)
430  {
431  if (TPC_3D != LArClusterHelper::GetClusterHitType(pCluster3D))
432  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
433 
434  if (!clusterToSliceIndexMap.insert(ClusterToSliceIndexMap::value_type(pCluster3D, index)).second)
435  throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
436  }
437 
438  sliceList.push_back(Slice());
439  ++index;
440  }
441 }
SlicingAlgorithm::Slice Slice
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void lar_content::EventSlicingTool::GetClusterSliceList ( const pandora::ClusterList &  trackClusters3D,
const pandora::ClusterList &  showerClusters3D,
ClusterSliceList clusterSliceList 
) const
private

Divide the provided lists of 3D track and shower clusters into slices.

Parameters
trackClusters3Dthe list of 3D track clusters
showerClusters3Dthe list of 3D shower clusters
clusterSliceListto receive the list of 3D clusters, divided into slices (one 3D cluster list per slice)

Definition at line 170 of file EventSlicingTool.cc.

171 {
172  const float layerPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
173 
174  ThreeDSlidingFitResultMap trackFitResults;
175 
176  for (const Cluster *const pCluster3D : trackClusters3D)
177  {
178  try
179  {
180  trackFitResults.insert(
181  ThreeDSlidingFitResultMap::value_type(pCluster3D, ThreeDSlidingFitResult(pCluster3D, m_halfWindowLayers, layerPitch)));
182  }
183  catch (StatusCodeException &)
184  {
185  std::cout << "EventSlicingTool: ThreeDSlidingFitResult failure for track cluster." << std::endl;
186  }
187  }
188 
189  ThreeDSlidingConeFitResultMap showerConeFitResults;
190 
191  for (const Cluster *const pCluster3D : showerClusters3D)
192  {
193  try
194  {
195  showerConeFitResults.insert(
196  ThreeDSlidingConeFitResultMap::value_type(pCluster3D, ThreeDSlidingConeFitResult(pCluster3D, m_halfWindowLayers, layerPitch)));
197  }
198  catch (StatusCodeException &)
199  {
200  std::cout << "EventSlicingTool: ThreeDSlidingConeFitResult failure for shower cluster." << std::endl;
201  }
202  }
203 
204  ClusterVector sortedClusters3D(trackClusters3D.begin(), trackClusters3D.end());
205  sortedClusters3D.insert(sortedClusters3D.end(), showerClusters3D.begin(), showerClusters3D.end());
206  std::sort(sortedClusters3D.begin(), sortedClusters3D.end(), LArClusterHelper::SortByNHits);
207 
208  ClusterSet usedClusters;
209 
210  for (const Cluster *const pCluster3D : sortedClusters3D)
211  {
212  if (usedClusters.count(pCluster3D))
213  continue;
214 
215  if (pCluster3D->GetNCaloHits() < m_min3DHitsToSeedNewSlice)
216  continue;
217 
218  clusterSliceList.push_back(ClusterVector(1, pCluster3D));
219  usedClusters.insert(pCluster3D);
220 
221  ClusterVector &clusterSlice(clusterSliceList.back());
222  this->CollectAssociatedClusters(pCluster3D, sortedClusters3D, trackFitResults, showerConeFitResults, clusterSlice, usedClusters);
223  }
224 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
unsigned int m_min3DHitsToSeedNewSlice
The minimum number of hits in a 3D cluster to seed a new slice.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
void CollectAssociatedClusters(const pandora::Cluster *const pClusterInSlice, const pandora::ClusterVector &candidateClusters, const ThreeDSlidingFitResultMap &trackFitResults, const ThreeDSlidingConeFitResultMap &showerConeFitResults, pandora::ClusterVector &clusterSlice, pandora::ClusterSet &usedClusters) const
Collect all clusters associated with a provided cluster.
std::unordered_map< const pandora::Cluster *, ThreeDSlidingFitResult > ThreeDSlidingFitResultMap
std::unordered_map< const pandora::Cluster *, ThreeDSlidingConeFitResult > ThreeDSlidingConeFitResultMap
std::vector< art::Ptr< recob::Cluster > > ClusterVector
QTextStream & endl(QTextStream &s)
unsigned int m_halfWindowLayers
The number of layers to use for half-window of sliding fit.
void lar_content::EventSlicingTool::GetKDTreeEntries2D ( const SlicingAlgorithm::SliceList sliceList,
PointList pointsU,
PointList pointsV,
PointList pointsW,
PointToSliceIndexMap pointToSliceIndexMap 
) const
private

Use projections of 3D hits already assigned to slices to populate kd trees to aid assignment of remaining clusters.

Parameters
sliceListthe slice list
pointsUto receive the points in the u view
pointsVto receive the points in the v view
pointsWto receive the points in the w view
pointToSliceIndexMapto receive the mapping from points to slice index

Definition at line 591 of file EventSlicingTool.cc.

593 {
594  unsigned int sliceIndex(0);
595 
596  for (const Slice &slice : sliceList)
597  {
598  for (const CaloHit *const pCaloHit : slice.m_caloHitListU)
599  {
600  const CartesianVector *const pPoint(new CartesianVector(pCaloHit->GetPositionVector()));
601  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pPoint, sliceIndex));
602  pointsU.push_back(pPoint);
603  }
604 
605  for (const CaloHit *const pCaloHit : slice.m_caloHitListV)
606  {
607  const CartesianVector *const pPoint(new CartesianVector(pCaloHit->GetPositionVector()));
608  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pPoint, sliceIndex));
609  pointsV.push_back(pPoint);
610  }
611 
612  for (const CaloHit *const pCaloHit : slice.m_caloHitListW)
613  {
614  const CartesianVector *const pPoint(new CartesianVector(pCaloHit->GetPositionVector()));
615  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pPoint, sliceIndex));
616  pointsW.push_back(pPoint);
617  }
618 
619  ++sliceIndex;
620  }
621 }
SlicingAlgorithm::Slice Slice
void lar_content::EventSlicingTool::GetKDTreeEntries3D ( const ClusterToSliceIndexMap clusterToSliceIndexMap,
PointList pointsU,
PointList pointsV,
PointList pointsW,
PointToSliceIndexMap pointToSliceIndexMap 
) const
private

Use 2D hits already assigned to slices to populate kd trees to aid assignment of remaining clusters.

Parameters
clusterToSliceIndexMapthe 3D cluster to slice index map
pointsUto receive the points in the u view
pointsVto receive the points in the v view
pointsWto receive the points in the w view
pointToSliceIndexMapto receive the mapping from points to slice index

Definition at line 625 of file EventSlicingTool.cc.

627 {
628  ClusterList clusterList;
629  for (const auto &mapEntry : clusterToSliceIndexMap)
630  clusterList.push_back(mapEntry.first);
631  clusterList.sort(LArClusterHelper::SortByNHits);
632 
633  for (const Cluster *const pCluster3D : clusterList)
634  {
635  const unsigned int sliceIndex(clusterToSliceIndexMap.at(pCluster3D));
636 
637  CaloHitList caloHitList;
638  pCluster3D->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
639 
640  for (const CaloHit *const pCaloHit3D : caloHitList)
641  {
642  if (TPC_3D != pCaloHit3D->GetHitType())
643  throw StatusCodeException(STATUS_CODE_FAILURE);
644 
645  const CartesianVector &position3D(pCaloHit3D->GetPositionVector());
646 
647  const CartesianVector *const pProjectionU(
648  new CartesianVector(LArGeometryHelper::ProjectPosition(this->GetPandora(), position3D, TPC_VIEW_U)));
649  const CartesianVector *const pProjectionV(
650  new CartesianVector(LArGeometryHelper::ProjectPosition(this->GetPandora(), position3D, TPC_VIEW_V)));
651  const CartesianVector *const pProjectionW(
652  new CartesianVector(LArGeometryHelper::ProjectPosition(this->GetPandora(), position3D, TPC_VIEW_W)));
653 
654  pointsU.push_back(pProjectionU);
655  pointsV.push_back(pProjectionV);
656  pointsW.push_back(pProjectionW);
657 
658  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pProjectionU, sliceIndex));
659  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pProjectionV, sliceIndex));
660  pointToSliceIndexMap.insert(PointToSliceIndexMap::value_type(pProjectionW, sliceIndex));
661  }
662  }
663 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
void lar_content::EventSlicingTool::GetRemainingClusters ( const pandora::Algorithm *const  pAlgorithm,
const SlicingAlgorithm::HitTypeToNameMap clusterListNames,
const pandora::ClusterSet &  assignedClusters,
pandora::ClusterList &  remainingClusters 
) const
private

Get the list of 2D clusters with hits yets to be assigned to slices.

Parameters
pAlgorithmthe address of the calling algorithm
clusterListNamesthe hit type to cluster list name map
assignedClustersthe list of 2D clusters with hits assigned to slices
remainingClustersto receive the list of 2D clusters with hits yet to be assigned to slices
void lar_content::EventSlicingTool::GetRemainingClusters ( const pandora::Algorithm *const  pAlgorithm,
const std::string clusterListName,
const pandora::ClusterSet &  assignedClusters,
pandora::ClusterList &  remainingClusters 
) const
private

Get the list of 2D clusters (from a named 2D cluster list) with hits yets to be assigned to slices.

Parameters
pAlgorithmthe address of the calling algorithm
clusterListNamethe cluster list name
assignedClustersthe list of 2D clusters with hits assigned to slices
remainingClustersto receive the list of 2D clusters with hits yet to be assigned to slices
void lar_content::EventSlicingTool::GetThreeDClusters ( const pandora::Algorithm *const  pAlgorithm,
const std::string pfoListName,
pandora::ClusterList &  clusters3D,
ClusterToPfoMap clusterToPfoMap 
) const
private

Get the 3D clusters from a specified list of pfos, storing the 3D clusters in the provided list and populating a map from 3D cluster to parent pfo.

Parameters
pAlgorithmthe address of the calling algorithm
pfoListNamethe pfo list name
clusters3Dto receive the list of 3D clusters
clusterToPfoMapto receive the mapping from 3D clusters to parent pfos

Definition at line 133 of file EventSlicingTool.cc.

135 {
136  const PfoList *pPfoList(nullptr);
137  PANDORA_THROW_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*pAlgorithm, pfoListName, pPfoList));
138 
139  if (!pPfoList || pPfoList->empty())
140  {
141  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
142  std::cout << "EventSlicingTool: unable to find pfo list " << pfoListName << std::endl;
143 
144  return;
145  }
146 
147  for (const ParticleFlowObject *const pPfo : *pPfoList)
148  {
149  ClusterList pfoClusters3D;
150  LArPfoHelper::GetThreeDClusterList(pPfo, pfoClusters3D);
151 
152  for (const Cluster *const pCluster3D : pfoClusters3D)
153  {
154  if (pCluster3D->GetNCaloHits() < m_minHitsPer3DCluster)
155  continue;
156 
157  if (!clusterToPfoMap.insert(ClusterToPfoMap::value_type(pCluster3D, pPfo)).second)
158  throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
159 
160  if (clusters3D.end() != std::find(clusters3D.begin(), clusters3D.end(), pCluster3D))
161  throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
162 
163  clusters3D.push_back(pCluster3D);
164  }
165  }
166 }
unsigned int m_minHitsPer3DCluster
The minimum number of hits in a 3D cluster to warrant consideration in slicing.
static void GetThreeDClusterList(const pandora::ParticleFlowObject *const pPfo, pandora::ClusterList &clusterList)
Get the list of 3D clusters from an input pfo.
QTextStream & endl(QTextStream &s)
bool lar_content::EventSlicingTool::IsEmission ( const LArPointingCluster cluster1,
const LArPointingCluster cluster2 
) const
private

Check whether a pair of pointing clusters are consistent with an emission.

Parameters
cluster1the first pointing cluster
cluster2the second pointing cluster
Returns
whether the pointing clusters are declared to be in the same slice

Definition at line 401 of file EventSlicingTool.cc.

402 {
403  return (LArPointingClusterHelper::IsEmission(cluster1.GetInnerVertex().GetPosition(), cluster2.GetInnerVertex(),
405  LArPointingClusterHelper::IsEmission(cluster1.GetOuterVertex().GetPosition(), cluster2.GetInnerVertex(),
407  LArPointingClusterHelper::IsEmission(cluster1.GetInnerVertex().GetPosition(), cluster2.GetOuterVertex(),
409  LArPointingClusterHelper::IsEmission(cluster1.GetOuterVertex().GetPosition(), cluster2.GetOuterVertex(),
411  LArPointingClusterHelper::IsEmission(cluster2.GetInnerVertex().GetPosition(), cluster1.GetInnerVertex(),
413  LArPointingClusterHelper::IsEmission(cluster2.GetOuterVertex().GetPosition(), cluster1.GetInnerVertex(),
415  LArPointingClusterHelper::IsEmission(cluster2.GetInnerVertex().GetPosition(), cluster1.GetOuterVertex(),
417  LArPointingClusterHelper::IsEmission(cluster2.GetOuterVertex().GetPosition(), cluster1.GetOuterVertex(),
419 }
float m_maxVertexTransverseDistance
Pointing association check: max transverse distance cut.
static bool IsEmission(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Whether pointing vertex is emitted from a given position.
float m_maxVertexLongitudinalDistance
Pointing association check: max longitudinal distance cut.
float m_minVertexLongitudinalDistance
Pointing association check: min longitudinal distance cut.
float m_vertexAngularAllowance
Pointing association check: pointing angular allowance in degrees.
bool lar_content::EventSlicingTool::IsNode ( const LArPointingCluster cluster1,
const LArPointingCluster cluster2 
) const
private

Check whether a pair of pointing clusters are nodally associated.

Parameters
cluster1the first pointing cluster
cluster2the second pointing cluster
Returns
whether the pointing clusters are declared to be in the same slice

Definition at line 379 of file EventSlicingTool.cc.

380 {
381  return (LArPointingClusterHelper::IsNode(cluster1.GetInnerVertex().GetPosition(), cluster2.GetInnerVertex(),
383  LArPointingClusterHelper::IsNode(cluster1.GetOuterVertex().GetPosition(), cluster2.GetInnerVertex(),
385  LArPointingClusterHelper::IsNode(cluster1.GetInnerVertex().GetPosition(), cluster2.GetOuterVertex(),
387  LArPointingClusterHelper::IsNode(cluster1.GetOuterVertex().GetPosition(), cluster2.GetOuterVertex(),
389  LArPointingClusterHelper::IsNode(cluster2.GetInnerVertex().GetPosition(), cluster1.GetInnerVertex(),
391  LArPointingClusterHelper::IsNode(cluster2.GetOuterVertex().GetPosition(), cluster1.GetInnerVertex(),
393  LArPointingClusterHelper::IsNode(cluster2.GetInnerVertex().GetPosition(), cluster1.GetOuterVertex(),
395  LArPointingClusterHelper::IsNode(cluster2.GetOuterVertex().GetPosition(), cluster1.GetOuterVertex(),
397 }
float m_maxVertexTransverseDistance
Pointing association check: max transverse distance cut.
float m_minVertexLongitudinalDistance
Pointing association check: min longitudinal distance cut.
static bool IsNode(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxTransverseDistance)
Whether pointing vertex is adjacent to a given position.
const EventSlicingTool::PointKDNode2D * lar_content::EventSlicingTool::MatchClusterToSlice ( const pandora::Cluster *const  pCluster2D,
PointKDTree2D kdTree 
) const
private

Use the provided kd tree to efficiently identify the most appropriate slice for the provided 2D cluster.

Parameters
pCluster2Dthe address of the 2D cluster
kdTreethe kd tree
Returns
the nearest-neighbour point identified by the kd tree

Definition at line 667 of file EventSlicingTool.cc.

668 {
669  PointList clusterPointList;
670  const PointKDNode2D *pBestResultPoint(nullptr);
671 
672  try
673  {
674  clusterPointList.push_back(new CartesianVector(pCluster2D->GetCentroid(pCluster2D->GetInnerPseudoLayer())));
675  clusterPointList.push_back(new CartesianVector(pCluster2D->GetCentroid(pCluster2D->GetOuterPseudoLayer())));
676  clusterPointList.push_back(new CartesianVector(
677  (pCluster2D->GetCentroid(pCluster2D->GetInnerPseudoLayer()) + pCluster2D->GetCentroid(pCluster2D->GetOuterPseudoLayer())) * 0.5f));
678 
679  float bestDistance(std::numeric_limits<float>::max());
680 
681  for (const CartesianVector *const pClusterPoint : clusterPointList)
682  {
683  const PointKDNode2D *pResultPoint(nullptr);
684  float resultDistance(std::numeric_limits<float>::max());
685  const PointKDNode2D targetPoint(pClusterPoint, pClusterPoint->GetX(), pClusterPoint->GetZ());
686  kdTree.findNearestNeighbour(targetPoint, pResultPoint, resultDistance);
687 
688  if (pResultPoint && (resultDistance < bestDistance))
689  {
690  pBestResultPoint = pResultPoint;
691  bestDistance = resultDistance;
692  }
693  }
694  }
695  catch (...)
696  {
697  std::cout << "EventSlicingTool::MatchClusterToSlice - exception " << std::endl;
698  for (const CartesianVector *const pPoint : clusterPointList)
699  delete pPoint;
700  throw;
701  }
702 
703  for (const CartesianVector *const pPoint : clusterPointList)
704  delete pPoint;
705 
706  return pBestResultPoint;
707 }
KDTreeNodeInfoT< const pandora::CartesianVector *, 2 > PointKDNode2D
static int max(int a, int b)
std::list< const pandora::CartesianVector * > PointList
QTextStream & endl(QTextStream &s)
bool lar_content::EventSlicingTool::PassPointing ( const pandora::Cluster *const  pClusterInSlice,
const pandora::Cluster *const  pCandidateCluster,
const ThreeDSlidingFitResultMap trackFitResults 
) const
private

Compare the provided clusters to assess whether they are associated via pointing (checks association "both ways")

Parameters
pClusterInSliceaddress of a cluster already in the slice
pCandidateClusteraddress of the candidate cluster
trackFitResultsthe map of sliding fit results for track candidate clusters
Returns
whether an addition to the cluster slice should be made

Definition at line 257 of file EventSlicingTool.cc.

259 {
260  ThreeDSlidingFitResultMap::const_iterator inSliceIter = trackFitResults.find(pClusterInSlice);
261  ThreeDSlidingFitResultMap::const_iterator candidateIter = trackFitResults.find(pCandidateCluster);
262 
263  if ((trackFitResults.end() == inSliceIter) || (trackFitResults.end() == candidateIter))
264  return false;
265 
266  const LArPointingCluster inSlicePointingCluster(inSliceIter->second);
267  const LArPointingCluster candidatePointingCluster(candidateIter->second);
268 
269  if (this->CheckClosestApproach(inSlicePointingCluster, candidatePointingCluster) ||
270  this->IsEmission(inSlicePointingCluster, candidatePointingCluster) || this->IsNode(inSlicePointingCluster, candidatePointingCluster))
271  {
272  return true;
273  }
274 
275  return false;
276 }
intermediate_table::const_iterator const_iterator
bool IsNode(const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
Check whether a pair of pointing clusters are nodally associated.
bool CheckClosestApproach(const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
Check closest approach metrics for a pair of pointing clusters.
bool IsEmission(const LArPointingCluster &cluster1, const LArPointingCluster &cluster2) const
Check whether a pair of pointing clusters are consistent with an emission.
bool lar_content::EventSlicingTool::PassProximity ( const pandora::Cluster *const  pClusterInSlice,
const pandora::Cluster *const  pCandidateCluster 
) const
private

Compare the provided clusters to assess whether they are associated via pointing.

Parameters
pClusterInSliceaddress of a cluster already in the slice
pCandidateClusteraddress of the candidate cluster
Returns
whether an addition to the cluster slice should be made

Definition at line 280 of file EventSlicingTool.cc.

281 {
282  for (const auto &orderedList1 : pClusterInSlice->GetOrderedCaloHitList())
283  {
284  for (const CaloHit *const pCaloHit1 : *(orderedList1.second))
285  {
286  const CartesianVector &positionVector1(pCaloHit1->GetPositionVector());
287 
288  for (const auto &orderedList2 : pCandidateCluster->GetOrderedCaloHitList())
289  {
290  for (const CaloHit *const pCaloHit2 : *(orderedList2.second))
291  {
292  if ((positionVector1 - pCaloHit2->GetPositionVector()).GetMagnitudeSquared() < m_maxHitSeparationSquared)
293  return true;
294  }
295  }
296  }
297  }
298 
299  return false;
300 }
float m_maxHitSeparationSquared
Proximity association: max distance allowed between the closest pair of hits.
bool lar_content::EventSlicingTool::PassShowerCone ( const pandora::Cluster *const  pConeCluster,
const pandora::Cluster *const  pNearbyCluster,
const ThreeDSlidingConeFitResultMap showerConeFitResults 
) const
private

Compare the provided clusters to assess whether they are associated via cone fits to the shower cluster (single "direction" check)

Parameters
pClusterInSliceaddress of a cluster already in the slice
pCandidateClusteraddress of the candidate cluster
showerConeFitResultsthe map of sliding cone fit results for shower candidate clusters
Returns
whether an addition to the cluster slice should be made

Definition at line 304 of file EventSlicingTool.cc.

306 {
307  ThreeDSlidingConeFitResultMap::const_iterator fitIter = showerConeFitResults.find(pConeCluster);
308 
309  if (showerConeFitResults.end() == fitIter)
310  return false;
311 
312  float clusterLength(0.f);
313  SimpleConeList simpleConeList;
314 
315  try
316  {
317  const ThreeDSlidingConeFitResult &slidingConeFitResult3D(fitIter->second);
318  const ThreeDSlidingFitResult &slidingFitResult3D(slidingConeFitResult3D.GetSlidingFitResult());
319  slidingConeFitResult3D.GetSimpleConeList(m_nConeFitLayers, m_nConeFits, CONE_BOTH_DIRECTIONS, simpleConeList);
320  clusterLength = (slidingFitResult3D.GetGlobalMaxLayerPosition() - slidingFitResult3D.GetGlobalMinLayerPosition()).GetMagnitude();
321  }
322  catch (const StatusCodeException &)
323  {
324  return false;
325  }
326 
327  for (const SimpleCone &simpleCone : simpleConeList)
328  {
329  const float coneLength(std::min(m_coneLengthMultiplier * clusterLength, m_maxConeLength));
330 
331  if (simpleCone.GetBoundedHitFraction(pNearbyCluster, coneLength, m_coneTanHalfAngle1) < m_coneBoundedFraction1)
332  continue;
333 
334  if (simpleCone.GetBoundedHitFraction(pNearbyCluster, coneLength, m_coneTanHalfAngle2) < m_coneBoundedFraction2)
335  continue;
336 
337  return true;
338  }
339 
340  return false;
341 }
unsigned int m_nConeFits
The number of cone fits to perform, spread roughly uniformly along the shower length.
unsigned int m_nConeFitLayers
The number of layers over which to sum fitted direction to obtain cone fit.
float m_coneTanHalfAngle2
The cone tan half angle to use when calculating bounded cluster fractions 2.
float m_coneBoundedFraction2
The minimum cluster bounded fraction for association 2.
std::vector< SimpleCone > SimpleConeList
intermediate_table::const_iterator const_iterator
float m_coneTanHalfAngle1
The cone tan half angle to use when calculating bounded cluster fractions 1.
float m_coneLengthMultiplier
The cone length multiplier to use when calculating bounded cluster fractions.
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
float m_maxConeLength
The maximum allowed cone length to use when calculating bounded cluster fractions.
float m_coneBoundedFraction1
The minimum cluster bounded fraction for association 1.
StatusCode lar_content::EventSlicingTool::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
private

Definition at line 726 of file EventSlicingTool.cc.

727 {
728  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "TrackPfoListName", m_trackPfoListName));
729 
730  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "ShowerPfoListName", m_showerPfoListName));
731 
732  PANDORA_RETURN_RESULT_IF_AND_IF(
733  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinHitsPer3DCluster", m_minHitsPer3DCluster));
734 
735  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
736  XmlHelper::ReadValue(xmlHandle, "Min3DHitsToSeedNewSlice", m_min3DHitsToSeedNewSlice));
737 
738  PANDORA_RETURN_RESULT_IF_AND_IF(
739  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitHalfWindow", m_halfWindowLayers));
740 
741  PANDORA_RETURN_RESULT_IF_AND_IF(
742  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "UsePointingAssociation", m_usePointingAssociation));
743 
744  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
745  XmlHelper::ReadValue(xmlHandle, "MinVertexLongitudinalDistance", m_minVertexLongitudinalDistance));
746 
747  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
748  XmlHelper::ReadValue(xmlHandle, "MaxVertexLongitudinalDistance", m_maxVertexLongitudinalDistance));
749 
750  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
751  XmlHelper::ReadValue(xmlHandle, "MaxVertexTransverseDistance", m_maxVertexTransverseDistance));
752 
753  PANDORA_RETURN_RESULT_IF_AND_IF(
754  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexAngularAllowance", m_vertexAngularAllowance));
755 
756  PANDORA_RETURN_RESULT_IF_AND_IF(
757  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxClosestApproach", m_maxClosestApproach));
758 
759  PANDORA_RETURN_RESULT_IF_AND_IF(
760  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxInterceptDistance", m_maxInterceptDistance));
761 
762  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
763  XmlHelper::ReadValue(xmlHandle, "UseProximityAssociation", m_useProximityAssociation));
764 
765  float maxHitSeparation = std::sqrt(m_maxHitSeparationSquared);
766  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxHitSeparation", maxHitSeparation));
767  m_maxHitSeparationSquared = maxHitSeparation * maxHitSeparation;
768 
769  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
770  XmlHelper::ReadValue(xmlHandle, "UseShowerConeAssociation", m_useShowerConeAssociation));
771 
772  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NConeFitLayers", m_nConeFitLayers));
773 
774  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NConeFits", m_nConeFits));
775 
776  PANDORA_RETURN_RESULT_IF_AND_IF(
777  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeLengthMultiplier", m_coneLengthMultiplier));
778 
779  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxConeLength", m_maxConeLength));
780 
781  PANDORA_RETURN_RESULT_IF_AND_IF(
782  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeTanHalfAngle1", m_coneTanHalfAngle1));
783 
784  PANDORA_RETURN_RESULT_IF_AND_IF(
785  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeBoundedFraction1", m_coneBoundedFraction1));
786 
787  PANDORA_RETURN_RESULT_IF_AND_IF(
788  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeTanHalfAngle2", m_coneTanHalfAngle2));
789 
790  PANDORA_RETURN_RESULT_IF_AND_IF(
791  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeBoundedFraction2", m_coneBoundedFraction2));
792 
793  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
794  XmlHelper::ReadValue(xmlHandle, "Use3DProjectionsInHitPickUp", m_use3DProjectionsInHitPickUp));
795 
796  return STATUS_CODE_SUCCESS;
797 }
unsigned int m_nConeFits
The number of cone fits to perform, spread roughly uniformly along the shower length.
unsigned int m_min3DHitsToSeedNewSlice
The minimum number of hits in a 3D cluster to seed a new slice.
float m_maxHitSeparationSquared
Proximity association: max distance allowed between the closest pair of hits.
unsigned int m_nConeFitLayers
The number of layers over which to sum fitted direction to obtain cone fit.
float m_coneTanHalfAngle2
The cone tan half angle to use when calculating bounded cluster fractions 2.
float m_maxVertexTransverseDistance
Pointing association check: max transverse distance cut.
float m_coneBoundedFraction2
The minimum cluster bounded fraction for association 2.
std::string m_showerPfoListName
The name of the input shower pfo list.
unsigned int m_minHitsPer3DCluster
The minimum number of hits in a 3D cluster to warrant consideration in slicing.
float m_coneTanHalfAngle1
The cone tan half angle to use when calculating bounded cluster fractions 1.
float m_maxVertexLongitudinalDistance
Pointing association check: max longitudinal distance cut.
std::string m_trackPfoListName
The name of the input track pfo list.
bool m_useProximityAssociation
Whether to use proximity association.
float m_maxClosestApproach
Pointing association: max distance of closest approach between straight line fits.
bool m_usePointingAssociation
Whether to use pointing association.
float m_coneLengthMultiplier
The cone length multiplier to use when calculating bounded cluster fractions.
float m_maxInterceptDistance
Pointing association: max distance from cluster vertex to point of closest approach.
float m_minVertexLongitudinalDistance
Pointing association check: min longitudinal distance cut.
bool m_use3DProjectionsInHitPickUp
Whether to include 3D cluster projections when assigning remaining clusters to slices.
float m_maxConeLength
The maximum allowed cone length to use when calculating bounded cluster fractions.
bool m_useShowerConeAssociation
Whether to use shower cone association.
float m_vertexAngularAllowance
Pointing association check: pointing angular allowance in degrees.
float m_coneBoundedFraction1
The minimum cluster bounded fraction for association 1.
unsigned int m_halfWindowLayers
The number of layers to use for half-window of sliding fit.
void lar_content::EventSlicingTool::RunSlicing ( const pandora::Algorithm *const  pAlgorithm,
const SlicingAlgorithm::HitTypeToNameMap caloHitListNames,
const SlicingAlgorithm::HitTypeToNameMap clusterListNames,
SlicingAlgorithm::SliceList sliceList 
)
virtual

Run the slicing tool.

Parameters
pAlgorithmaddress of the calling algorithm
caloHitListNamesthe hit type to calo hit list name map
clusterListNamesthe hit type to cluster list name map
sliceListto receive the populated slice list

Implements lar_content::EventSlicingBaseTool.

Definition at line 62 of file EventSlicingTool.cc.

64 {
65  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
66  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
67 
68  ClusterToPfoMap clusterToPfoMap;
69 
70  ClusterList trackClusters3D;
71  this->GetThreeDClusters(pAlgorithm, m_trackPfoListName, trackClusters3D, clusterToPfoMap);
72 
73  ClusterList showerClusters3D;
74  this->GetThreeDClusters(pAlgorithm, m_showerPfoListName, showerClusters3D, clusterToPfoMap);
75 
76  ClusterSliceList clusterSliceList;
77  this->GetClusterSliceList(trackClusters3D, showerClusters3D, clusterSliceList);
78 
79  if (clusterSliceList.size() < 2)
80  {
81  return this->CopyAllHitsToSingleSlice(pAlgorithm, caloHitListNames, sliceList);
82  }
83  else
84  {
85  ClusterToSliceIndexMap clusterToSliceIndexMap;
86  this->CreateSlices(clusterSliceList, sliceList, clusterToSliceIndexMap);
87 
88  ClusterSet assignedClusters;
89  this->CopyPfoHitsToSlices(clusterToSliceIndexMap, clusterToPfoMap, sliceList, assignedClusters);
90 
91  ClusterList remainingClusters;
92  this->GetRemainingClusters(pAlgorithm, clusterListNames, assignedClusters, remainingClusters);
93 
94  this->AssignRemainingHitsToSlices(remainingClusters, clusterToSliceIndexMap, sliceList);
95  }
96 }
void GetThreeDClusters(const pandora::Algorithm *const pAlgorithm, const std::string &pfoListName, pandora::ClusterList &clusters3D, ClusterToPfoMap &clusterToPfoMap) const
Get the 3D clusters from a specified list of pfos, storing the 3D clusters in the provided list and p...
void GetClusterSliceList(const pandora::ClusterList &trackClusters3D, const pandora::ClusterList &showerClusters3D, ClusterSliceList &clusterSliceList) const
Divide the provided lists of 3D track and shower clusters into slices.
void CopyPfoHitsToSlices(const ClusterToSliceIndexMap &clusterToSliceIndexMap, const ClusterToPfoMap &clusterToPfoMap, SlicingAlgorithm::SliceList &sliceList, pandora::ClusterSet &assignedClusters) const
Use 3D clusters in the cluster slice list, find their parent pfos and assign all hits in all 2D clust...
std::unordered_map< const pandora::Cluster *, const pandora::ParticleFlowObject * > ClusterToPfoMap
void AssignRemainingHitsToSlices(const pandora::ClusterList &remainingClusters, const ClusterToSliceIndexMap &clusterToSliceIndexMap, SlicingAlgorithm::SliceList &sliceList) const
Use the list of remaining 2D clusters to assign all remaining 2D hits to existing slices in the slice...
std::string m_showerPfoListName
The name of the input shower pfo list.
void GetRemainingClusters(const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &clusterListNames, const pandora::ClusterSet &assignedClusters, pandora::ClusterList &remainingClusters) const
Get the list of 2D clusters with hits yets to be assigned to slices.
std::string m_trackPfoListName
The name of the input track pfo list.
std::vector< pandora::ClusterVector > ClusterSliceList
void CopyAllHitsToSingleSlice(const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, SlicingAlgorithm::SliceList &sliceList) const
Copy all the input hits in an event into a single slice.
std::unordered_map< const pandora::Cluster *, unsigned int > ClusterToSliceIndexMap
void CreateSlices(const ClusterSliceList &clusterSliceList, SlicingAlgorithm::SliceList &sliceList, ClusterToSliceIndexMap &clusterToSliceIndexMap) const
Create new slices for each of the groupings of 3D clusters in the provided cluster slice list...
QTextStream & endl(QTextStream &s)
bool lar_content::EventSlicingTool::SortPoints ( const pandora::CartesianVector *const  pLhs,
const pandora::CartesianVector *const  pRhs 
)
staticprivate

Sort points (use Z, followed by X, followed by Y)

Parameters
pLhsaddress of first point
pRhsaddress of second point

Definition at line 711 of file EventSlicingTool.cc.

712 {
713  const CartesianVector deltaPosition(*pRhs - *pLhs);
714 
715  if (std::fabs(deltaPosition.GetZ()) > std::numeric_limits<float>::epsilon())
716  return (deltaPosition.GetZ() > std::numeric_limits<float>::epsilon());
717 
718  if (std::fabs(deltaPosition.GetX()) > std::numeric_limits<float>::epsilon())
719  return (deltaPosition.GetX() > std::numeric_limits<float>::epsilon());
720 
721  return (deltaPosition.GetY() > std::numeric_limits<float>::epsilon());
722 }

Member Data Documentation

float lar_content::EventSlicingTool::m_coneBoundedFraction1
private

The minimum cluster bounded fraction for association 1.

Definition at line 298 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_coneBoundedFraction2
private

The minimum cluster bounded fraction for association 2.

Definition at line 300 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_coneLengthMultiplier
private

The cone length multiplier to use when calculating bounded cluster fractions.

Definition at line 295 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_coneTanHalfAngle1
private

The cone tan half angle to use when calculating bounded cluster fractions 1.

Definition at line 297 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_coneTanHalfAngle2
private

The cone tan half angle to use when calculating bounded cluster fractions 2.

Definition at line 299 of file EventSlicingTool.h.

unsigned int lar_content::EventSlicingTool::m_halfWindowLayers
private

The number of layers to use for half-window of sliding fit.

Definition at line 279 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxClosestApproach
private

Pointing association: max distance of closest approach between straight line fits.

Definition at line 286 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxConeLength
private

The maximum allowed cone length to use when calculating bounded cluster fractions.

Definition at line 296 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxHitSeparationSquared
private

Proximity association: max distance allowed between the closest pair of hits.

Definition at line 290 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxInterceptDistance
private

Pointing association: max distance from cluster vertex to point of closest approach.

Definition at line 287 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxVertexLongitudinalDistance
private

Pointing association check: max longitudinal distance cut.

Definition at line 283 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_maxVertexTransverseDistance
private

Pointing association check: max transverse distance cut.

Definition at line 284 of file EventSlicingTool.h.

unsigned int lar_content::EventSlicingTool::m_min3DHitsToSeedNewSlice
private

The minimum number of hits in a 3D cluster to seed a new slice.

Definition at line 278 of file EventSlicingTool.h.

unsigned int lar_content::EventSlicingTool::m_minHitsPer3DCluster
private

The minimum number of hits in a 3D cluster to warrant consideration in slicing.

Definition at line 277 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_minVertexLongitudinalDistance
private

Pointing association check: min longitudinal distance cut.

Definition at line 282 of file EventSlicingTool.h.

unsigned int lar_content::EventSlicingTool::m_nConeFitLayers
private

The number of layers over which to sum fitted direction to obtain cone fit.

Definition at line 293 of file EventSlicingTool.h.

unsigned int lar_content::EventSlicingTool::m_nConeFits
private

The number of cone fits to perform, spread roughly uniformly along the shower length.

Definition at line 294 of file EventSlicingTool.h.

std::string lar_content::EventSlicingTool::m_showerPfoListName
private

The name of the input shower pfo list.

Definition at line 275 of file EventSlicingTool.h.

std::string lar_content::EventSlicingTool::m_trackPfoListName
private

The name of the input track pfo list.

Definition at line 274 of file EventSlicingTool.h.

bool lar_content::EventSlicingTool::m_use3DProjectionsInHitPickUp
private

Whether to include 3D cluster projections when assigning remaining clusters to slices.

Definition at line 302 of file EventSlicingTool.h.

bool lar_content::EventSlicingTool::m_usePointingAssociation
private

Whether to use pointing association.

Definition at line 281 of file EventSlicingTool.h.

bool lar_content::EventSlicingTool::m_useProximityAssociation
private

Whether to use proximity association.

Definition at line 289 of file EventSlicingTool.h.

bool lar_content::EventSlicingTool::m_useShowerConeAssociation
private

Whether to use shower cone association.

Definition at line 292 of file EventSlicingTool.h.

float lar_content::EventSlicingTool::m_vertexAngularAllowance
private

Pointing association check: pointing angular allowance in degrees.

Definition at line 285 of file EventSlicingTool.h.


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