Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArOverlapTensor.h
Go to the documentation of this file.
1
8#ifndef LAR_OVERLAP_TENSOR_H
9#define LAR_OVERLAP_TENSOR_H 1
10
12
13#include <unordered_map>
14#include <vector>
15
16namespace lar_content
17{
18
22template <typename T>
24{
25public:
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
60
67
74
81
87 bool operator<(const Element &rhs) const;
88
89 private:
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
160 typedef typename TheTensor::const_iterator const_iterator;
161
166
171
177 void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const;
178
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
216
223
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
265private:
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
293};
294
295//------------------------------------------------------------------------------------------------------------------------------------------
296
297template <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
307template <typename T>
308inline 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
316template <typename T>
318{
319 return m_overlapTensor.begin();
320}
321
322//------------------------------------------------------------------------------------------------------------------------------------------
323
324template <typename T>
326{
327 return m_overlapTensor.end();
328}
329
330//------------------------------------------------------------------------------------------------------------------------------------------
331
332template <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
347template <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
362template <typename T>
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
375template <typename T>
377{
378 return m_clusterNavigationMapUV;
379}
380
381//------------------------------------------------------------------------------------------------------------------------------------------
382
383template <typename T>
385{
386 return m_clusterNavigationMapVW;
387}
388
389//------------------------------------------------------------------------------------------------------------------------------------------
390
391template <typename T>
393{
394 return m_clusterNavigationMapWU;
395}
396
397//------------------------------------------------------------------------------------------------------------------------------------------
398
399template <typename T>
401{
402 m_overlapTensor.clear();
403 m_clusterNavigationMapUV.clear();
404 m_clusterNavigationMapVW.clear();
405 m_clusterNavigationMapWU.clear();
406}
407
408//------------------------------------------------------------------------------------------------------------------------------------------
409//------------------------------------------------------------------------------------------------------------------------------------------
410
411template <typename T>
412inline 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
423template <typename T>
425{
426 return m_pClusterU;
427}
428
429//------------------------------------------------------------------------------------------------------------------------------------------
430
431template <typename T>
433{
434 return m_pClusterV;
435}
436
437//------------------------------------------------------------------------------------------------------------------------------------------
438
439template <typename T>
441{
442 return m_pClusterW;
443}
444
445//------------------------------------------------------------------------------------------------------------------------------------------
446
447template <typename T>
449{
450 return m_overlapResult;
451}
452
453//------------------------------------------------------------------------------------------------------------------------------------------
454
455template <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
Header file defining relevant internal typedefs, sort and string conversion functions.
TheMatrix::const_iterator const_iterator
OverlapResult m_overlapResult
The overlap result.
const pandora::Cluster * GetClusterW() const
Get the address of the w cluster.
const pandora::Cluster * GetCluster(const pandora::HitType hitType) const
Get the address of the given hit type cluster.
const OverlapResult & GetOverlapResult() const
Get the overlap result.
bool operator<(const Element &rhs) const
Element less than operator.
const pandora::Cluster * m_pClusterW
The address of the w cluster.
const pandora::Cluster * m_pClusterU
The address of the u cluster.
Element(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Constructor.
const pandora::Cluster * GetClusterU() const
Get the address of the u cluster.
const pandora::Cluster * m_pClusterV
The address of the v cluster.
const pandora::Cluster * GetClusterV() const
Get the address of the v cluster.
const ClusterNavigationMap & GetClusterNavigationMapVW() const
Get the cluster navigation map V->W.
std::unordered_map< const pandora::Cluster *, OverlapList > OverlapMatrix
const ClusterNavigationMap & GetClusterNavigationMapWU() const
Get the cluster navigation map W->U.
const_iterator end() const
Returns an iterator referring to the past-the-end element in the overlap tensor.
ClusterNavigationMap m_clusterNavigationMapWU
The cluster navigation map W->U.
void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Set overlap result.
void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
Get a list of elements connected to a specified cluster.
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.
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 OverlapList & GetOverlapList(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV) const
Get the overlap list for a specified pair of clusters.
ClusterNavigationMap m_clusterNavigationMapUV
The cluster navigation map U->V.
TheTensor::const_iterator const_iterator
std::unordered_map< const pandora::Cluster *, pandora::ClusterList > ClusterNavigationMap
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.
void Clear()
Clear overlap tensor.
const OverlapMatrix & GetOverlapMatrix(const pandora::Cluster *const pClusterU) const
Get the cluster overlap matrix for a specified cluster.
TheTensor m_overlapTensor
The overlap tensor.
void GetUnambiguousElements(const bool ignoreUnavailable, ElementList &elementList) const
Get unambiguous elements.
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.
const_iterator begin() const
Returns an iterator referring to the first element in the overlap tensor.
void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const
Get a sorted vector of key clusters (U clusters with current implementation)
std::unordered_map< const pandora::Cluster *, OverlapResult > OverlapList
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::vector< Element > ElementList
void RemoveCluster(const pandora::Cluster *const pCluster)
Remove entries from tensor corresponding to specified cluster.
const ClusterNavigationMap & GetClusterNavigationMapUV() const
Get the cluster navigation map U->V.
ClusterNavigationMap m_clusterNavigationMapVW
The cluster navigation map V->W.
std::unordered_map< const pandora::Cluster *, OverlapMatrix > TheTensor
Cluster class.
Definition Cluster.h:31
StatusCodeException class.
HitType
Calorimeter hit type enum.
std::vector< const Cluster * > ClusterVector
MANAGED_CONTAINER< const Cluster * > ClusterList