Public Member Functions | Protected Types | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
lar_content::TwoDSlidingFitConsolidationAlgorithm Class Referenceabstract

TwoDSlidingFitConsolidationAlgorithm class. More...

#include <TwoDSlidingFitConsolidationAlgorithm.h>

Inheritance diagram for lar_content::TwoDSlidingFitConsolidationAlgorithm:
lar_content::TrackConsolidationAlgorithm

Public Member Functions

 TwoDSlidingFitConsolidationAlgorithm ()
 Default constructor. More...
 

Protected Types

typedef std::unordered_map< const pandora::Cluster *, pandora::CaloHitList > ClusterToHitMap
 

Protected Member Functions

pandora::StatusCode Run ()
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 
virtual void GetReclusteredHits (const TwoDSlidingFitResultList &slidingFitResultList, const pandora::ClusterVector &showerClusters, ClusterToHitMap &caloHitsToAdd, ClusterToHitMap &caloHitsToRemove) const =0
 Get the list of hits to be added or removed from clusters. More...
 

Private Member Functions

void SortInputClusters (const pandora::ClusterList *const pClusterList, pandora::ClusterVector &trackClusters, pandora::ClusterVector &showerClusters) const
 Sort input cluster list into track-like clusters and shower-like clusters. More...
 
void BuildSlidingLinearFits (const pandora::ClusterVector &trackClusters, TwoDSlidingFitResultList &slidingFitResultList) const
 Apply sliding linear fits to track clusters. More...
 
pandora::StatusCode RemoveHitsFromClusters (const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
 Remove hits from clusters. More...
 
pandora::StatusCode AddHitsToClusters (const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
 Add hits to clusters. More...
 
pandora::StatusCode RebuildClusters (const ClusterToHitMap &clustersAtStart, const pandora::ClusterSet &unavailableClusters) const
 Re-build clusters. More...
 

Private Attributes

std::string m_reclusteringAlgorithmName
 Name of daughter algorithm to use for cluster re-building. More...
 
float m_minTrackLength
 Minimum length of track clusters to consolidate. More...
 
float m_maxClusterLength
 Maximum length of shower clusters to use in re-building. More...
 
unsigned int m_halfWindowLayers
 Size of layer window for sliding fit results. More...
 

Detailed Description

TwoDSlidingFitConsolidationAlgorithm class.

Definition at line 23 of file TwoDSlidingFitConsolidationAlgorithm.h.

Member Typedef Documentation

typedef std::unordered_map<const pandora::Cluster *, pandora::CaloHitList> lar_content::TwoDSlidingFitConsolidationAlgorithm::ClusterToHitMap
protected

Definition at line 35 of file TwoDSlidingFitConsolidationAlgorithm.h.

Constructor & Destructor Documentation

lar_content::TwoDSlidingFitConsolidationAlgorithm::TwoDSlidingFitConsolidationAlgorithm ( )

Default constructor.

Definition at line 21 of file TwoDSlidingFitConsolidationAlgorithm.cc.

21  :
22  m_minTrackLength(7.5f),
25 {
26 }
unsigned int m_halfWindowLayers
Size of layer window for sliding fit results.
float m_maxClusterLength
Maximum length of shower clusters to use in re-building.
float m_minTrackLength
Minimum length of track clusters to consolidate.

Member Function Documentation

StatusCode lar_content::TwoDSlidingFitConsolidationAlgorithm::AddHitsToClusters ( const ClusterToHitMap clustersToRebuild,
pandora::ClusterSet &  unavailableClusters 
) const
private

Add hits to clusters.

Parameters
clustersToRebuildthe list of hits to be added to clusters
unavailableClustersthe list of modified clusters

Definition at line 146 of file TwoDSlidingFitConsolidationAlgorithm.cc.

147 {
148  ClusterList clusterList;
149 
150  for (const auto &mapEntry : clustersToExpand)
151  {
152  if (!unavailableClusters.count(mapEntry.first))
153  clusterList.push_back(mapEntry.first);
154  }
155 
156  clusterList.sort(LArClusterHelper::SortByNHits);
157 
158  for (const Cluster *const pCluster : clusterList)
159  {
160  const CaloHitList &caloHitList(clustersToExpand.at(pCluster));
161 
162  if (caloHitList.empty())
163  continue;
164 
165  if (unavailableClusters.count(pCluster))
166  continue;
167 
168  unavailableClusters.insert(pCluster);
169 
170  for (const CaloHit *const pCaloHit : caloHitList)
171  {
172  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*this, pCluster, pCaloHit));
173  }
174  }
175 
176  return STATUS_CODE_SUCCESS;
177 }
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.
void lar_content::TwoDSlidingFitConsolidationAlgorithm::BuildSlidingLinearFits ( const pandora::ClusterVector &  trackClusters,
TwoDSlidingFitResultList slidingFitResultList 
) const
private

Apply sliding linear fits to track clusters.

Parameters
trackClustersthe input vector of track-like clusters
slidingFitResultListthe output list of sliding linear fits

Definition at line 80 of file TwoDSlidingFitConsolidationAlgorithm.cc.

81 {
82  const float slidingFitPitch(LArGeometryHelper::GetWireZPitch(this->GetPandora()));
83 
84  for (ClusterVector::const_iterator iter = trackClusters.begin(), iterEnd = trackClusters.end(); iter != iterEnd; ++iter)
85  {
86  try
87  {
88  const TwoDSlidingFitResult slidingFitResult(*iter, m_halfWindowLayers, slidingFitPitch);
89  slidingFitResultList.push_back(slidingFitResult);
90  }
91  catch (StatusCodeException &statusCodeException)
92  {
93  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
94  throw statusCodeException;
95  }
96  }
97 }
unsigned int m_halfWindowLayers
Size of layer window for sliding fit results.
intermediate_table::const_iterator const_iterator
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
virtual void lar_content::TwoDSlidingFitConsolidationAlgorithm::GetReclusteredHits ( const TwoDSlidingFitResultList slidingFitResultList,
const pandora::ClusterVector &  showerClusters,
ClusterToHitMap caloHitsToAdd,
ClusterToHitMap caloHitsToRemove 
) const
protectedpure virtual

Get the list of hits to be added or removed from clusters.

Parameters
slidingFitResultListthe list of sliding linear fits to track clusters
showerClustersthe vector of shower clusters
caloHitsToAddthe output map of hits to be added to clusters
caloHitsToRemovethe output map of hits to be removed from clusters

Implemented in lar_content::TrackConsolidationAlgorithm.

StatusCode lar_content::TwoDSlidingFitConsolidationAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
protected

Definition at line 221 of file TwoDSlidingFitConsolidationAlgorithm.cc.

222 {
223  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*this, xmlHandle, "ClusterRebuilding", m_reclusteringAlgorithmName));
224 
225  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinTrackLength", m_minTrackLength));
226 
227  PANDORA_RETURN_RESULT_IF_AND_IF(
228  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MaxClusterLength", m_maxClusterLength));
229 
230  PANDORA_RETURN_RESULT_IF_AND_IF(
231  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SlidingFitHalfWindow", m_halfWindowLayers));
232 
233  return STATUS_CODE_SUCCESS;
234 }
unsigned int m_halfWindowLayers
Size of layer window for sliding fit results.
float m_maxClusterLength
Maximum length of shower clusters to use in re-building.
float m_minTrackLength
Minimum length of track clusters to consolidate.
std::string m_reclusteringAlgorithmName
Name of daughter algorithm to use for cluster re-building.
StatusCode lar_content::TwoDSlidingFitConsolidationAlgorithm::RebuildClusters ( const ClusterToHitMap clustersAtStart,
const pandora::ClusterSet &  unavailableClusters 
) const
private

Re-build clusters.

Parameters
clustersAtStartthe initial mapping of clusters to hits
unavailableClustersthe list of unavailable clusters

Definition at line 181 of file TwoDSlidingFitConsolidationAlgorithm.cc.

182 {
183  if (clustersToRebuild.empty())
184  return STATUS_CODE_SUCCESS;
185 
186  ClusterVector sortedClusters;
187  for (const auto &mapEntry : clustersToRebuild)
188  {
189  if (!unavailableClusters.count(mapEntry.first))
190  sortedClusters.push_back(mapEntry.first);
191  }
192 
193  std::sort(sortedClusters.begin(), sortedClusters.end(), LArClusterHelper::SortByNHits);
194 
195  for (const Cluster *const pCluster : sortedClusters)
196  {
197  const CaloHitList &caloHitList(clustersToRebuild.at(pCluster));
198  const Cluster *const pClusterToDelete(pCluster);
199 
200  if (caloHitList.empty())
201  continue;
202 
203  std::string currentClusterListName;
204  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentListName<Cluster>(*this, currentClusterListName));
205  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Cluster>(*this, pClusterToDelete));
206 
207  const ClusterList *pClusterList = NULL;
208  std::string newClusterListName;
209  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=,
210  PandoraContentApi::RunClusteringAlgorithm(*this, m_reclusteringAlgorithmName, pClusterList, newClusterListName));
211 
212  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Cluster>(*this, newClusterListName, currentClusterListName));
213  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Cluster>(*this, currentClusterListName));
214  }
215 
216  return STATUS_CODE_SUCCESS;
217 }
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.
std::string string
Definition: nybbler.cc:12
std::string m_reclusteringAlgorithmName
Name of daughter algorithm to use for cluster re-building.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
StatusCode lar_content::TwoDSlidingFitConsolidationAlgorithm::RemoveHitsFromClusters ( const ClusterToHitMap clustersToRebuild,
pandora::ClusterSet &  unavailableClusters 
) const
private

Remove hits from clusters.

Parameters
clustersToRebuildthe list of hits to be removed from clusters
unavailableClustersthe list of deleted clusters

Definition at line 101 of file TwoDSlidingFitConsolidationAlgorithm.cc.

102 {
103  ClusterList clusterList;
104  for (const auto &mapEntry : clustersToContract)
105  clusterList.push_back(mapEntry.first);
106  clusterList.sort(LArClusterHelper::SortByNHits);
107 
108  for (const Cluster *const pCluster : clusterList)
109  {
110  const CaloHitList &caloHitListToRemove(clustersToContract.at(pCluster));
111 
112  if (caloHitListToRemove.empty())
113  continue;
114 
115  if (unavailableClusters.count(pCluster))
116  continue;
117 
118  CaloHitList caloHitList, caloHitListToKeep;
119  pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
120 
121  for (const CaloHit *const pCaloHit : caloHitList)
122  {
123  if (caloHitListToRemove.end() == std::find(caloHitListToRemove.begin(), caloHitListToRemove.end(), pCaloHit))
124  caloHitListToKeep.push_back(pCaloHit);
125  }
126 
127  if (caloHitListToKeep.empty())
128  {
129  // ATTN clustersToContract and unavailable clusters now contain dangling pointers
130  unavailableClusters.insert(pCluster);
131  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Cluster>(*this, pCluster));
132  continue;
133  }
134 
135  for (const CaloHit *const pCaloHit : caloHitListToRemove)
136  {
137  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::RemoveFromCluster(*this, pCluster, pCaloHit));
138  }
139  }
140 
141  return STATUS_CODE_SUCCESS;
142 }
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.
StatusCode lar_content::TwoDSlidingFitConsolidationAlgorithm::Run ( )
protected

Definition at line 30 of file TwoDSlidingFitConsolidationAlgorithm.cc.

31 {
32  const ClusterList *pClusterList = NULL;
33  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pClusterList));
34 
35  // Select tracks and showers for re-clustering (Note: samples not mutually exclusive)
36  ClusterVector trackClusters, showerClusters;
37  this->SortInputClusters(pClusterList, trackClusters, showerClusters);
38 
39  // Build sliding linear fits from track clusters
40  TwoDSlidingFitResultList slidingFitResultList;
41  this->BuildSlidingLinearFits(trackClusters, slidingFitResultList);
42 
43  // Recluster the hits
44  ClusterToHitMap clustersToExpand, clustersToContract;
45  this->GetReclusteredHits(slidingFitResultList, showerClusters, clustersToExpand, clustersToContract);
46 
47  // Consolidate and re-build clusters
48  ClusterSet unavailableClusters;
49  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->RemoveHitsFromClusters(clustersToContract, unavailableClusters));
50  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->AddHitsToClusters(clustersToExpand, unavailableClusters));
51  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->RebuildClusters(clustersToContract, unavailableClusters));
52 
53  return STATUS_CODE_SUCCESS;
54 }
std::unordered_map< const pandora::Cluster *, pandora::CaloHitList > ClusterToHitMap
void BuildSlidingLinearFits(const pandora::ClusterVector &trackClusters, TwoDSlidingFitResultList &slidingFitResultList) const
Apply sliding linear fits to track clusters.
std::vector< TwoDSlidingFitResult > TwoDSlidingFitResultList
void SortInputClusters(const pandora::ClusterList *const pClusterList, pandora::ClusterVector &trackClusters, pandora::ClusterVector &showerClusters) const
Sort input cluster list into track-like clusters and shower-like clusters.
virtual void GetReclusteredHits(const TwoDSlidingFitResultList &slidingFitResultList, const pandora::ClusterVector &showerClusters, ClusterToHitMap &caloHitsToAdd, ClusterToHitMap &caloHitsToRemove) const =0
Get the list of hits to be added or removed from clusters.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
pandora::StatusCode AddHitsToClusters(const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
Add hits to clusters.
pandora::StatusCode RemoveHitsFromClusters(const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
Remove hits from clusters.
pandora::StatusCode RebuildClusters(const ClusterToHitMap &clustersAtStart, const pandora::ClusterSet &unavailableClusters) const
Re-build clusters.
void lar_content::TwoDSlidingFitConsolidationAlgorithm::SortInputClusters ( const pandora::ClusterList *const  pClusterList,
pandora::ClusterVector &  trackClusters,
pandora::ClusterVector &  showerClusters 
) const
private

Sort input cluster list into track-like clusters and shower-like clusters.

Parameters
pClusterListthe input cluster list
trackClustersthe output vector of track-like clusters
showerClustersthe output vector of shower-like clusters

Definition at line 58 of file TwoDSlidingFitConsolidationAlgorithm.cc.

60 {
61  for (ClusterList::const_iterator iter = pClusterList->begin(), iterEnd = pClusterList->end(); iter != iterEnd; ++iter)
62  {
63  const Cluster *const pCluster = *iter;
64 
65  const float thisLengthSquared(LArClusterHelper::GetLengthSquared(pCluster));
66 
67  if (thisLengthSquared < m_maxClusterLength * m_maxClusterLength)
68  showerClusters.push_back(pCluster);
69 
70  if (thisLengthSquared > m_minTrackLength * m_minTrackLength)
71  trackClusters.push_back(pCluster);
72  }
73 
74  std::sort(trackClusters.begin(), trackClusters.end(), LArClusterHelper::SortByNHits);
75  std::sort(showerClusters.begin(), showerClusters.end(), LArClusterHelper::SortByNHits);
76 }
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.
float m_maxClusterLength
Maximum length of shower clusters to use in re-building.
float m_minTrackLength
Minimum length of track clusters to consolidate.
intermediate_table::const_iterator const_iterator
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.

Member Data Documentation

unsigned int lar_content::TwoDSlidingFitConsolidationAlgorithm::m_halfWindowLayers
private

Size of layer window for sliding fit results.

Definition at line 94 of file TwoDSlidingFitConsolidationAlgorithm.h.

float lar_content::TwoDSlidingFitConsolidationAlgorithm::m_maxClusterLength
private

Maximum length of shower clusters to use in re-building.

Definition at line 93 of file TwoDSlidingFitConsolidationAlgorithm.h.

float lar_content::TwoDSlidingFitConsolidationAlgorithm::m_minTrackLength
private

Minimum length of track clusters to consolidate.

Definition at line 92 of file TwoDSlidingFitConsolidationAlgorithm.h.

std::string lar_content::TwoDSlidingFitConsolidationAlgorithm::m_reclusteringAlgorithmName
private

Name of daughter algorithm to use for cluster re-building.

Definition at line 91 of file TwoDSlidingFitConsolidationAlgorithm.h.


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