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

ConeClusterMopUpAlgorithm class. More...

#include <ConeClusterMopUpAlgorithm.h>

Inheritance diagram for lar_content::ConeClusterMopUpAlgorithm:
lar_content::ClusterMopUpBaseAlgorithm lar_content::MopUpBaseAlgorithm

Public Member Functions

 ConeClusterMopUpAlgorithm ()
 Default constructor. More...
 
- Public Member Functions inherited from lar_content::ClusterMopUpBaseAlgorithm
 ClusterMopUpBaseAlgorithm ()
 Default constructor. More...
 
- Public Member Functions inherited from lar_content::MopUpBaseAlgorithm
template<typename T >
const std::string GetListName (const T *const pT) const
 Find the name of the list hosting a specific object. More...
 

Private Types

typedef std::pair< float, float > Coordinate
 
typedef std::vector< CoordinateCoordinateList
 

Private Member Functions

void ClusterMopUp (const pandora::ClusterList &pfoClusters, const pandora::ClusterList &remnantClusters) const
 Cluster mop up for a single view. This function is responsible for instructing pandora to make cluster alterations. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Static Private Member Functions

static bool SortCoordinates (const Coordinate &lhs, const Coordinate &rhs)
 Sort coordinates by increasing transverse displacement. More...
 

Private Attributes

unsigned int m_slidingFitWindow
 The layer window for the sliding linear fits. More...
 
float m_showerEdgeMultiplier
 Artificially tune width of shower envelope so as to make it more/less inclusive. More...
 
float m_coneAngleCentile
 Cluster cone angle is defined using specified centile of distribution of hit half angles. More...
 
float m_maxConeLengthMultiplier
 Consider hits as bound if inside cone, with projected distance less than N times cone length. More...
 
float m_minBoundedFraction
 The minimum cluster bounded fraction for merging. More...
 

Additional Inherited Members

- Protected Types inherited from lar_content::ClusterMopUpBaseAlgorithm
typedef std::unordered_map< const pandora::Cluster *, float > AssociationDetails
 
typedef std::unordered_map< const pandora::Cluster *, AssociationDetailsClusterAssociationMap
 
- Protected Member Functions inherited from lar_content::ClusterMopUpBaseAlgorithm
virtual pandora::StatusCode Run ()
 
virtual void GetPfoClusterLists (pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
 Get the two dimensional clusters contained in the input pfo list, divided into three different views. More...
 
virtual void GetDaughterClusterLists (pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
 Get the two dimensional clusters contained in the input remant/daughter cluster lists, divided into three different views. More...
 
virtual void GetClusterLists (const pandora::ClusterList &inputClusterList, const bool availabilityFlag, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
 Get the two dimensional clusters contained in an input cluster list, divided into three different views. More...
 
virtual void MakeClusterMerges (const ClusterAssociationMap &clusterAssociationMap) const
 Make the cluster merges specified in the cluster association map, using list name information in the cluster list name map. More...
 
- Protected Attributes inherited from lar_content::ClusterMopUpBaseAlgorithm
pandora::StringVector m_pfoListNames
 The list of pfo list names. More...
 
bool m_excludePfosContainingTracks
 Whether to exclude any pfos containing clusters flagged as fixed tracks. More...
 
- Protected Attributes inherited from lar_content::MopUpBaseAlgorithm
pandora::StringVector m_daughterListNames
 The list of potential daughter object list names. More...
 

Detailed Description

ConeClusterMopUpAlgorithm class.

Definition at line 21 of file ConeClusterMopUpAlgorithm.h.

Member Typedef Documentation

typedef std::pair<float, float> lar_content::ConeClusterMopUpAlgorithm::Coordinate
private

Definition at line 32 of file ConeClusterMopUpAlgorithm.h.

Definition at line 33 of file ConeClusterMopUpAlgorithm.h.

Constructor & Destructor Documentation

lar_content::ConeClusterMopUpAlgorithm::ConeClusterMopUpAlgorithm ( )

Default constructor.

Definition at line 23 of file ConeClusterMopUpAlgorithm.cc.

23  :
26  m_coneAngleCentile(0.85f),
29 {
30 }
float m_maxConeLengthMultiplier
Consider hits as bound if inside cone, with projected distance less than N times cone length...
float m_minBoundedFraction
The minimum cluster bounded fraction for merging.
float m_showerEdgeMultiplier
Artificially tune width of shower envelope so as to make it more/less inclusive.
float m_coneAngleCentile
Cluster cone angle is defined using specified centile of distribution of hit half angles...
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.

Member Function Documentation

void lar_content::ConeClusterMopUpAlgorithm::ClusterMopUp ( const pandora::ClusterList &  pfoClusters,
const pandora::ClusterList &  remnantClusters 
) const
privatevirtual

Cluster mop up for a single view. This function is responsible for instructing pandora to make cluster alterations.

Parameters
pfoClustersthe list of pfo clusters
remnantClustersthe list of remnant clusters

Implements lar_content::ClusterMopUpBaseAlgorithm.

Definition at line 34 of file ConeClusterMopUpAlgorithm.cc.

35 {
36  ClusterAssociationMap clusterAssociationMap;
37  const float slidingFitPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
38 
39  const VertexList *pVertexList(NULL);
40  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
41 
42  if ((pVertexList->size() != 1) || (VERTEX_3D != (*(pVertexList->begin()))->GetVertexType()))
43  return;
44 
45  const Vertex *const pVertex(*(pVertexList->begin()));
46 
47  ClusterVector sortedPfoClusters(pfoClusters.begin(), pfoClusters.end());
48  std::sort(sortedPfoClusters.begin(), sortedPfoClusters.end(), LArClusterHelper::SortByNHits);
49 
50  ClusterVector sortedRemnantClusters(remnantClusters.begin(), remnantClusters.end());
51  std::sort(sortedRemnantClusters.begin(), sortedRemnantClusters.end(), LArClusterHelper::SortByNHits);
52 
53  for (const Cluster *const pPfoCluster : sortedPfoClusters)
54  {
55  try
56  {
57  const TwoDSlidingShowerFitResult showerFitResult(pPfoCluster, m_slidingFitWindow, slidingFitPitch, m_showerEdgeMultiplier);
58 
59  const LayerFitResultMap &layerFitResultMapS(showerFitResult.GetShowerFitResult().GetLayerFitResultMap());
60  const LayerFitResultMap &layerFitResultMapP(showerFitResult.GetPositiveEdgeFitResult().GetLayerFitResultMap());
61  const LayerFitResultMap &layerFitResultMapN(showerFitResult.GetNegativeEdgeFitResult().GetLayerFitResultMap());
62 
63  if (layerFitResultMapS.size() < 2)
64  continue;
65 
66  // Cone direction
67  CartesianVector minLayerPositionOnAxis(0.f, 0.f, 0.f), maxLayerPositionOnAxis(0.f, 0.f, 0.f);
68  showerFitResult.GetShowerFitResult().GetGlobalPosition(layerFitResultMapS.begin()->second.GetL(), 0.f, minLayerPositionOnAxis);
69  showerFitResult.GetShowerFitResult().GetGlobalPosition(layerFitResultMapS.rbegin()->second.GetL(), 0.f, maxLayerPositionOnAxis);
70 
71  const HitType hitType(LArClusterHelper::GetClusterHitType(pPfoCluster));
72  const CartesianVector vertexPosition2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), pVertex->GetPosition(), hitType));
73  const bool vertexAtMinL((vertexPosition2D - minLayerPositionOnAxis).GetMagnitudeSquared() <
74  (vertexPosition2D - maxLayerPositionOnAxis).GetMagnitudeSquared());
75 
76  // Cone edges
77  CoordinateList coordinateListP, coordinateListN;
78 
79  for (LayerFitResultMap::const_iterator iterS = layerFitResultMapS.begin(); iterS != layerFitResultMapS.end(); ++iterS)
80  {
81  LayerFitResultMap::const_iterator iterP = layerFitResultMapP.find(iterS->first);
82  LayerFitResultMap::const_iterator iterN = layerFitResultMapN.find(iterS->first);
83 
84  if (layerFitResultMapP.end() != iterP)
85  coordinateListP.push_back(Coordinate(iterP->second.GetL(), iterP->second.GetFitT()));
86 
87  if (layerFitResultMapN.end() != iterN)
88  coordinateListN.push_back(Coordinate(iterN->second.GetL(), iterN->second.GetFitT()));
89  }
90 
91  if (coordinateListP.empty() || coordinateListN.empty())
92  continue;
93 
94  std::sort(coordinateListP.begin(), coordinateListP.end(), ConeClusterMopUpAlgorithm::SortCoordinates);
95  std::sort(coordinateListN.begin(), coordinateListN.end(), ConeClusterMopUpAlgorithm::SortCoordinates);
96 
97  const Coordinate maxP(coordinateListP.at(m_coneAngleCentile * coordinateListP.size()));
98  const Coordinate minP(vertexAtMinL
99  ? Coordinate(layerFitResultMapP.begin()->second.GetL(), layerFitResultMapP.begin()->second.GetFitT())
100  : Coordinate(layerFitResultMapP.rbegin()->second.GetL(), layerFitResultMapP.rbegin()->second.GetFitT()));
101 
102  const Coordinate maxN(coordinateListN.at((1.f - m_coneAngleCentile) * coordinateListN.size()));
103  const Coordinate minN(vertexAtMinL
104  ? Coordinate(layerFitResultMapN.begin()->second.GetL(), layerFitResultMapN.begin()->second.GetFitT())
105  : Coordinate(layerFitResultMapN.rbegin()->second.GetL(), layerFitResultMapN.rbegin()->second.GetFitT()));
106 
107  const float minL(layerFitResultMapS.begin()->second.GetL());
108  const float maxL(minL + m_maxConeLengthMultiplier * std::fabs(layerFitResultMapS.rbegin()->second.GetL() - minL));
109 
110  if ((std::fabs(maxP.first - minP.first) < std::numeric_limits<float>::epsilon()) ||
111  (std::fabs(maxN.first - minN.first) < std::numeric_limits<float>::epsilon()) ||
112  (std::fabs(maxL - minL) < std::numeric_limits<float>::epsilon()))
113  {
114  continue;
115  }
116 
117  // Bounded fraction calculation
118  for (const Cluster *const pRemnantCluster : sortedRemnantClusters)
119  {
120  const unsigned int nHits(pRemnantCluster->GetNCaloHits());
121 
122  unsigned int nMatchedHits(0);
123  const OrderedCaloHitList &orderedCaloHitList(pRemnantCluster->GetOrderedCaloHitList());
124 
125  for (OrderedCaloHitList::const_iterator iter = orderedCaloHitList.begin(), iterEnd = orderedCaloHitList.end(); iter != iterEnd; ++iter)
126  {
127  for (CaloHitList::const_iterator hIter = iter->second->begin(), hIterEnd = iter->second->end(); hIter != hIterEnd; ++hIter)
128  {
129  float rL(0.f), rT(0.f);
130  showerFitResult.GetShowerFitResult().GetLocalPosition((*hIter)->GetPositionVector(), rL, rT);
131 
132  if ((rL < minL) || (rL > maxL))
133  continue;
134 
135  const float rTP(minP.second + (rL - minP.first) * ((maxP.second - minP.second) / (maxP.first - minP.first)));
136  const float rTN(minN.second + (rL - minN.first) * ((maxN.second - minN.second) / (maxN.first - minN.first)));
137 
138  if ((rT > rTP) || (rT < rTN))
139  continue;
140 
141  ++nMatchedHits;
142  }
143  }
144 
145  const float boundedFraction((nHits > 0) ? static_cast<float>(nMatchedHits) / static_cast<float>(nHits) : 0.f);
146 
147  if (boundedFraction < m_minBoundedFraction)
148  continue;
149 
150  AssociationDetails &associationDetails(clusterAssociationMap[pRemnantCluster]);
151 
152  if (!associationDetails.insert(AssociationDetails::value_type(pPfoCluster, boundedFraction)).second)
153  throw StatusCodeException(STATUS_CODE_FAILURE);
154  }
155  }
156  catch (StatusCodeException &statusCodeException)
157  {
158  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
159  throw statusCodeException;
160  }
161  }
162 
163  this->MakeClusterMerges(clusterAssociationMap);
164 }
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.
virtual void MakeClusterMerges(const ClusterAssociationMap &clusterAssociationMap) const
Make the cluster merges specified in the cluster association map, using list name information in the ...
enum cvn::HType HitType
static bool SortCoordinates(const Coordinate &lhs, const Coordinate &rhs)
Sort coordinates by increasing transverse displacement.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
intermediate_table::const_iterator const_iterator
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
std::unordered_map< const pandora::Cluster *, AssociationDetails > ClusterAssociationMap
float m_maxConeLengthMultiplier
Consider hits as bound if inside cone, with projected distance less than N times cone length...
float m_minBoundedFraction
The minimum cluster bounded fraction for merging.
float m_showerEdgeMultiplier
Artificially tune width of shower envelope so as to make it more/less inclusive.
std::map< int, LayerFitResult > LayerFitResultMap
std::unordered_map< const pandora::Cluster *, float > AssociationDetails
float m_coneAngleCentile
Cluster cone angle is defined using specified centile of distribution of hit half angles...
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
std::vector< art::Ptr< recob::Cluster > > ClusterVector
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
std::list< Vertex > VertexList
Definition: DCEL.h:182
StatusCode lar_content::ConeClusterMopUpAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
privatevirtual

Reimplemented from lar_content::ClusterMopUpBaseAlgorithm.

Definition at line 175 of file ConeClusterMopUpAlgorithm.cc.

176 {
177  PANDORA_RETURN_RESULT_IF_AND_IF(
178  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitWindow", m_slidingFitWindow));
179 
180  PANDORA_RETURN_RESULT_IF_AND_IF(
181  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowerEdgeMultiplier", m_showerEdgeMultiplier));
182 
183  PANDORA_RETURN_RESULT_IF_AND_IF(
184  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ConeAngleCentile", m_coneAngleCentile));
185 
186  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
187  XmlHelper::ReadValue(xmlHandle, "MaxConeLengthMultiplier", m_maxConeLengthMultiplier));
188 
189  PANDORA_RETURN_RESULT_IF_AND_IF(
190  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinBoundedFraction", m_minBoundedFraction));
191 
192  return ClusterMopUpBaseAlgorithm::ReadSettings(xmlHandle);
193 }
float m_maxConeLengthMultiplier
Consider hits as bound if inside cone, with projected distance less than N times cone length...
float m_minBoundedFraction
The minimum cluster bounded fraction for merging.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_showerEdgeMultiplier
Artificially tune width of shower envelope so as to make it more/less inclusive.
float m_coneAngleCentile
Cluster cone angle is defined using specified centile of distribution of hit half angles...
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
bool lar_content::ConeClusterMopUpAlgorithm::SortCoordinates ( const Coordinate lhs,
const Coordinate rhs 
)
staticprivate

Sort coordinates by increasing transverse displacement.

Parameters
lhsthe first coordinate for comparison
rhsthe second coordinate for comparison
Returns
boolean

Definition at line 168 of file ConeClusterMopUpAlgorithm.cc.

169 {
170  return (lhs.second < rhs.second);
171 }

Member Data Documentation

float lar_content::ConeClusterMopUpAlgorithm::m_coneAngleCentile
private

Cluster cone angle is defined using specified centile of distribution of hit half angles.

Definition at line 49 of file ConeClusterMopUpAlgorithm.h.

float lar_content::ConeClusterMopUpAlgorithm::m_maxConeLengthMultiplier
private

Consider hits as bound if inside cone, with projected distance less than N times cone length.

Definition at line 50 of file ConeClusterMopUpAlgorithm.h.

float lar_content::ConeClusterMopUpAlgorithm::m_minBoundedFraction
private

The minimum cluster bounded fraction for merging.

Definition at line 51 of file ConeClusterMopUpAlgorithm.h.

float lar_content::ConeClusterMopUpAlgorithm::m_showerEdgeMultiplier
private

Artificially tune width of shower envelope so as to make it more/less inclusive.

Definition at line 48 of file ConeClusterMopUpAlgorithm.h.

unsigned int lar_content::ConeClusterMopUpAlgorithm::m_slidingFitWindow
private

The layer window for the sliding linear fits.

Definition at line 47 of file ConeClusterMopUpAlgorithm.h.


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