Belle II Software  release-08-01-10
ClusterCache.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <pxd/reconstruction/ClusterCache.h>
10 
11 namespace Belle2 {
17  namespace PXD {
18 
19  ClusterCache::ClusterCache(unsigned int maxU): m_maxU(maxU + 2)
20  {
23  clear();
24  }
25 
27  {
28  delete[] m_clsTop;
29  delete[] m_clsCur;
30  }
31 
34  {
35  memset(m_clsTop, 0, m_maxU * sizeof(ClusterCandidate*));
36  memset(m_clsCur, 0, m_maxU * sizeof(ClusterCandidate*));
37  m_curV = 0;
38  m_currCluster = m_clusters.begin();
39  }
40 
42  ClusterCandidate& ClusterCache::findCluster(unsigned int u, unsigned int v)
43  {
44  if (u >= m_maxU - 2) {
45  throw std::out_of_range("u cell id is outside of valid range");
46  }
47  switchRow(v);
48  const unsigned int u1 = u + 1;
49  //Look for cluster top of current pixel (0,0 at top left corner, rows going
50  //down, columns going left) The ClusterCache is two columns wider than the
51  //actual pixel sensor to get rid of edge effects. Column 0 is at index 1 so
52  //the three neighbors of column u have the indices (u,u+1,u+2)
53 
54  //So the left neighbor has index u in the current row
55  ClusterCandidate* cls = m_clsCur[u];
56  //And the topleft, top and topright clusters have u+i, i in 0..2 But if we
57  //already have a left neighbor we do not need to check topleft and top as
58  //those are guaranteed to be already merged with the left one
59  if (!cls) {
60  cls = mergeCluster(cls, m_clsTop[u]);
61  cls = mergeCluster(cls, m_clsTop[u1]);
62  }
63  cls = mergeCluster(cls, m_clsTop[u + 2]);
64 
65  //If no cluster was found create a new one
66  if (!cls) {
67  if (m_currCluster == m_clusters.end()) {
68  //We already use all ClusterCandidates, create a new one
69  m_clusters.emplace_front();
70  cls = &m_clusters.front();
71  } else {
72  //There are some Candidates left, use them
73  cls = &(*m_currCluster++);
74  cls->clear();
75  }
76  }
77  //Save the cluster and the current position in the cache
78  m_curV = v;
79  m_clsCur[u1] = cls;
80  //Return the cluster
81  return *cls;
82  }
83 
86  {
87  if (cls2) {
88  if (!cls1 || cls1 == cls2) return cls2;
89  return cls1->merge(*cls2);
90  }
91  return cls1;
92  }
93 
95  void ClusterCache::switchRow(unsigned int v)
96  {
97  if (v == m_curV) return;
98  //Clear top row
99  std::memset(m_clsTop, 0, m_maxU * sizeof(ClusterCandidate*));
100  //We skipped a row, forget current row, no need to switch rows, both got emptied
101  if (v > m_curV + 1) {
102  std::memset(m_clsCur, 0, m_maxU * sizeof(ClusterCandidate*));
103  } else {
104  //Switch rows, Current row will be top and we reuse memory of last top
105  //row as new current row
106  std::swap(m_clsTop, m_clsCur);
107  }
108  //save current row coordinate
109  m_curV = v;
110  }
111  }
113 } //Belle2 namespace
ClusterCandidate & findCluster(unsigned int u, unsigned int v)
Find a cluster adjacent to the given coordinates.
Definition: ClusterCache.cc:42
~ClusterCache()
Delete the cache and free the memory.
Definition: ClusterCache.cc:26
const unsigned int m_maxU
number of columns of the cache.
Definition: ClusterCache.h:141
std::deque< ClusterCandidate > m_clusters
list of all the clusters created so far
Definition: ClusterCache.h:149
ClusterCandidate * mergeCluster(ClusterCandidate *cls1, ClusterCandidate *cls2)
Merge two cluster and update the list of cached clusters.
Definition: ClusterCache.cc:85
ClusterCandidate ** m_clsCur
cache of the current row
Definition: ClusterCache.h:147
ClusterCandidate ** m_clsTop
cache of the top row
Definition: ClusterCache.h:145
std::deque< ClusterCandidate >::iterator m_currCluster
iterator to the next free cluster to be used if a new cluster is needed.
Definition: ClusterCache.h:157
ClusterCache(unsigned int maxU=c_defaultNumberColumns)
Create a new cache.
Definition: ClusterCache.cc:19
void switchRow(unsigned int v)
Switch the internal rows.
Definition: ClusterCache.cc:95
void clear()
Clear the cache structure.
Definition: ClusterCache.cc:33
unsigned int m_curV
current v coordinate, needed to switch top row
Definition: ClusterCache.h:143
Class representing a possible cluster during clustering of the PXD It supports merging of different c...
ClusterCandidate * merge(ClusterCandidate &cls)
Merge the given cluster with this one.
void clear()
Clear the Cluster information (to reuse the same cluster instance)
Abstract base class for different kinds of events.