LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
LArOverlapTensor.h
Go to the documentation of this file.
1 
8 #ifndef LAR_OVERLAP_TENSOR_H
9 #define LAR_OVERLAP_TENSOR_H 1
10 
11 #include "Pandora/PandoraInternal.h"
12 
13 #include <unordered_map>
14 #include <vector>
15 
16 namespace lar_content
17 {
18 
22 template <typename T>
24 {
25 public:
26  typedef T OverlapResult;
27 
31  class Element
32  {
33  public:
42  Element(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW,
43  const OverlapResult &overlapResult);
44 
52  const pandora::Cluster *GetCluster(const pandora::HitType hitType) const;
53 
59  const pandora::Cluster *GetClusterU() const;
60 
66  const pandora::Cluster *GetClusterV() const;
67 
73  const pandora::Cluster *GetClusterW() const;
74 
80  const OverlapResult &GetOverlapResult() const;
81 
87  bool operator<(const Element &rhs) const;
88 
89  private:
90  const pandora::Cluster *m_pClusterU;
91  const pandora::Cluster *m_pClusterV;
92  const pandora::Cluster *m_pClusterW;
93  OverlapResult m_overlapResult;
94  };
95 
96  typedef std::vector<Element> ElementList;
97 
104  void GetUnambiguousElements(const bool ignoreUnavailable, ElementList &elementList) const;
105 
118  bool DefaultAmbiguityFunction(const pandora::ClusterList &clusterListU, const pandora::ClusterList &clusterListV,
119  const pandora::ClusterList &clusterListW, const pandora::Cluster *&pClusterU, const pandora::Cluster *&pClusterV,
120  const pandora::Cluster *&pClusterW) const;
121 
131  void GetNConnections(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, unsigned int &nU, unsigned int &nV, unsigned int &nW) const;
132 
140  void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const;
141 
152  void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList,
153  unsigned int &nU, unsigned int &nV, unsigned int &nW) const;
154 
155  typedef std::unordered_map<const pandora::Cluster *, pandora::ClusterList> ClusterNavigationMap;
156  typedef std::unordered_map<const pandora::Cluster *, OverlapResult> OverlapList;
157  typedef std::unordered_map<const pandora::Cluster *, OverlapList> OverlapMatrix;
158  typedef std::unordered_map<const pandora::Cluster *, OverlapMatrix> TheTensor;
159 
161 
165  const_iterator begin() const;
166 
170  const_iterator end() const;
171 
177  void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const;
178 
188  const OverlapResult &GetOverlapResult(
189  const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW) const;
190 
199  const OverlapList &GetOverlapList(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV) const;
200 
208  const OverlapMatrix &GetOverlapMatrix(const pandora::Cluster *const pClusterU) const;
209 
215  const ClusterNavigationMap &GetClusterNavigationMapUV() const;
216 
222  const ClusterNavigationMap &GetClusterNavigationMapVW() const;
223 
229  const ClusterNavigationMap &GetClusterNavigationMapWU() const;
230 
239  void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV,
240  const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult);
241 
250  void ReplaceOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV,
251  const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult);
252 
258  void RemoveCluster(const pandora::Cluster *const pCluster);
259 
263  void Clear();
264 
265 private:
275  void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList,
276  pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const;
277 
286  void ExploreConnections(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, pandora::ClusterList &clusterListU,
287  pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const;
288 
289  TheTensor m_overlapTensor;
290  ClusterNavigationMap m_clusterNavigationMapUV;
291  ClusterNavigationMap m_clusterNavigationMapVW;
292  ClusterNavigationMap m_clusterNavigationMapWU;
293 };
294 
295 //------------------------------------------------------------------------------------------------------------------------------------------
296 
297 template <typename T>
299  const pandora::Cluster *const pCluster, const bool ignoreUnavailable, unsigned int &nU, unsigned int &nV, unsigned int &nW) const
300 {
301  ElementList elementList;
302  this->GetConnectedElements(pCluster, ignoreUnavailable, elementList, nU, nV, nW);
303 }
304 
305 //------------------------------------------------------------------------------------------------------------------------------------------
306 
307 template <typename T>
308 inline void OverlapTensor<T>::GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
309 {
310  unsigned int nU(0), nV(0), nW(0);
311  this->GetConnectedElements(pCluster, ignoreUnavailable, elementList, nU, nV, nW);
312 }
313 
314 //------------------------------------------------------------------------------------------------------------------------------------------
315 
316 template <typename T>
318 {
319  return m_overlapTensor.begin();
320 }
321 
322 //------------------------------------------------------------------------------------------------------------------------------------------
323 
324 template <typename T>
326 {
327  return m_overlapTensor.end();
328 }
329 
330 //------------------------------------------------------------------------------------------------------------------------------------------
331 
332 template <typename T>
334  const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW) const
335 {
336  const OverlapList &overlapList(this->GetOverlapList(pClusterU, pClusterV));
337  typename OverlapList::const_iterator iter = overlapList.find(pClusterW);
338 
339  if (overlapList.end() == iter)
340  throw pandora::StatusCodeException(pandora::STATUS_CODE_NOT_FOUND);
341 
342  return iter->second;
343 }
344 
345 //------------------------------------------------------------------------------------------------------------------------------------------
346 
347 template <typename T>
349  const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV) const
350 {
351  const OverlapMatrix &overlapMatrix(this->GetOverlapMatrix(pClusterU));
352  typename OverlapMatrix::const_iterator iter = overlapMatrix.find(pClusterV);
353 
354  if (overlapMatrix.end() == iter)
355  throw pandora::StatusCodeException(pandora::STATUS_CODE_NOT_FOUND);
356 
357  return iter->second;
358 }
359 
360 //------------------------------------------------------------------------------------------------------------------------------------------
361 
362 template <typename T>
363 inline const typename OverlapTensor<T>::OverlapMatrix &OverlapTensor<T>::GetOverlapMatrix(const pandora::Cluster *const pClusterU) const
364 {
365  typename TheTensor::const_iterator iter = m_overlapTensor.find(pClusterU);
366 
367  if (m_overlapTensor.end() == iter)
368  throw pandora::StatusCodeException(pandora::STATUS_CODE_NOT_FOUND);
369 
370  return iter->second;
371 }
372 
373 //------------------------------------------------------------------------------------------------------------------------------------------
374 
375 template <typename T>
377 {
379 }
380 
381 //------------------------------------------------------------------------------------------------------------------------------------------
382 
383 template <typename T>
385 {
387 }
388 
389 //------------------------------------------------------------------------------------------------------------------------------------------
390 
391 template <typename T>
393 {
395 }
396 
397 //------------------------------------------------------------------------------------------------------------------------------------------
398 
399 template <typename T>
401 {
402  m_overlapTensor.clear();
403  m_clusterNavigationMapUV.clear();
404  m_clusterNavigationMapVW.clear();
405  m_clusterNavigationMapWU.clear();
406 }
407 
408 //------------------------------------------------------------------------------------------------------------------------------------------
409 //------------------------------------------------------------------------------------------------------------------------------------------
410 
411 template <typename T>
412 inline OverlapTensor<T>::Element::Element(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV,
413  const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult) :
414  m_pClusterU(pClusterU),
415  m_pClusterV(pClusterV),
416  m_pClusterW(pClusterW),
417  m_overlapResult(overlapResult)
418 {
419 }
420 
421 //------------------------------------------------------------------------------------------------------------------------------------------
422 
423 template <typename T>
424 inline const pandora::Cluster *OverlapTensor<T>::Element::GetClusterU() const
425 {
426  return m_pClusterU;
427 }
428 
429 //------------------------------------------------------------------------------------------------------------------------------------------
430 
431 template <typename T>
432 inline const pandora::Cluster *OverlapTensor<T>::Element::GetClusterV() const
433 {
434  return m_pClusterV;
435 }
436 
437 //------------------------------------------------------------------------------------------------------------------------------------------
438 
439 template <typename T>
440 inline const pandora::Cluster *OverlapTensor<T>::Element::GetClusterW() const
441 {
442  return m_pClusterW;
443 }
444 
445 //------------------------------------------------------------------------------------------------------------------------------------------
446 
447 template <typename T>
449 {
450  return m_overlapResult;
451 }
452 
453 //------------------------------------------------------------------------------------------------------------------------------------------
454 
455 template <typename T>
457 {
458  if (this == &rhs)
459  return false;
460 
461  return (this->GetOverlapResult() < rhs.GetOverlapResult());
462 }
463 
464 } // namespace lar_content
465 
466 #endif // #ifndef LAR_OVERLAP_TENSOR_H
OverlapResult m_overlapResult
The overlap result.
OverlapTensor class.
ClusterNavigationMap m_clusterNavigationMapVW
The cluster navigation map V->W.
const ClusterNavigationMap & GetClusterNavigationMapVW() const
Get the cluster navigation map V->W.
ClusterNavigationMap m_clusterNavigationMapUV
The cluster navigation map U->V.
const pandora::Cluster * GetClusterW() const
Get the address of the w cluster.
const_iterator begin() const
Returns an iterator referring to the first element in the overlap tensor.
void GetNConnections(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, unsigned int &nU, unsigned int &nV, unsigned int &nW) const
Get the number of connections for a specified cluster.
const pandora::Cluster * m_pClusterW
The address of the w cluster.
std::unordered_map< const pandora::Cluster *, OverlapMatrix > TheTensor
void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
Get a list of elements connected to a specified cluster.
const ClusterNavigationMap & GetClusterNavigationMapUV() const
Get the cluster navigation map U->V.
void ExploreConnections(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW) const
Explore connections associated with a given cluster.
intermediate_table::const_iterator const_iterator
void ReplaceOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
SetReplace an existing overlap result.
const pandora::Cluster * GetClusterU() const
Get the address of the u cluster.
TheTensor m_overlapTensor
The overlap tensor.
const OverlapList & GetOverlapList(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV) const
Get the overlap list for a specified pair of clusters.
const_iterator end() const
Returns an iterator referring to the past-the-end element in the overlap tensor.
void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Set overlap result.
void Clear()
Clear overlap tensor.
std::vector< Element > ElementList
void GetUnambiguousElements(const bool ignoreUnavailable, ElementList &elementList) const
Get unambiguous elements.
const OverlapMatrix & GetOverlapMatrix(const pandora::Cluster *const pClusterU) const
Get the cluster overlap matrix for a specified cluster.
TheMatrix::const_iterator const_iterator
void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const
Get a sorted vector of key clusters (U clusters with current implementation)
Element(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Constructor.
const pandora::Cluster * GetCluster(const pandora::HitType hitType) const
Get the address of the given hit type cluster.
const pandora::Cluster * m_pClusterU
The address of the u cluster.
ClusterNavigationMap m_clusterNavigationMapWU
The cluster navigation map W->U.
const OverlapResult & GetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW) const
Get the overlap result for a specified trio of clusters.
std::unordered_map< const pandora::Cluster *, OverlapResult > OverlapList
HitType
Definition: HitType.h:12
bool operator<(const Element &rhs) const
Element less than operator.
const OverlapResult & GetOverlapResult() const
Get the overlap result.
std::unordered_map< const pandora::Cluster *, pandora::ClusterList > ClusterNavigationMap
const pandora::Cluster * m_pClusterV
The address of the v cluster.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
const pandora::Cluster * GetClusterV() const
Get the address of the v cluster.
void RemoveCluster(const pandora::Cluster *const pCluster)
Remove entries from tensor corresponding to specified cluster.
bool DefaultAmbiguityFunction(const pandora::ClusterList &clusterListU, const pandora::ClusterList &clusterListV, const pandora::ClusterList &clusterListW, const pandora::Cluster *&pClusterU, const pandora::Cluster *&pClusterV, const pandora::Cluster *&pClusterW) const
Default ambiguity function, checking that only one U, V and W cluster is found.
std::unordered_map< const pandora::Cluster *, OverlapList > OverlapMatrix
const ClusterNavigationMap & GetClusterNavigationMapWU() const
Get the cluster navigation map W->U.
TheTensor::const_iterator const_iterator