ATLAS Offline Software
FPGATrackSimBinArray.h
Go to the documentation of this file.
1 // Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 #ifndef FPGATrackSimBinArray_H
3 #define FPGATrackSimBinArray_H
4 
32 #include <vector>
33 #include <string>
34 #include <stdexcept>
35 #include <utility>
36 
38 
39 template <typename T>
41 {
42 public:
43  // constructors
44  FPGATrackSimBinArray() = default;
45  FPGATrackSimBinArray(const std::vector<unsigned int> &dims, const T &initval)
46  {
47  setsize(dims, initval);
48  }
49 
50  // resize the array (need to provide reference to initialize elements to)
51  void setsize(const std::vector<unsigned int> &dims, const T &initval)
52  {
53  m_dims = dims;
54 
55  // Caclulate the number of entries and a "step"-size needed for translating
56  // N-dim indices into a 1-d index
57  m_entries = 1;
58  for (auto &dim : dims)
59  {
60  m_step.push_back(m_entries);
61  m_entries *= dim;
62  }
63 
64  // Allocate 1-d array
65  m_data.resize(m_entries, initval);
66  }
67 
68  // full size of the array (i.e. product of the size in each dimension)
69  unsigned int size() const { return m_entries; }
70 
71  // access to internal 1-d std::vector as a const so that you can
72  // use various std::count and std::for_each on the elements
73  // note you can change the vector because it's const, but you can
74  // change the elements
75  const std::vector<T>& flatdata() const {return m_data;}
76 
77  // get the array with the size in each dimension of the
78  const std::vector<unsigned int> &dims() const { return m_dims; }
79 
80  // Check if index is a valid entry
81  bool isValid(const std::vector<unsigned int> &idx) const {
82  if (idx.size() != m_dims.size()) return false;
83  for (unsigned int i = 0; i < m_dims.size(); i++)
84  {
85  if (idx[i]>=m_dims[i]) return false;
86  }
87  return true;
88  }
89 
90  // look up content by idx specified as a std::vector<unsigned int>
91  const T &operator[](const std::vector<unsigned int> &idx) const
92  {
93  if(idx.size() != m_step.size()) {
94  throw std::runtime_error("FPGATrackSimBinArray: index size does not match array dimensions");
95  }
96 
97  // Translate N-dim index to 1-d index
98  unsigned int offset = 0;
99  for (unsigned int i = 0; i < m_step.size(); i++)
100  {
101  if (idx.at(i) >= m_dims.at(i))
102  {
103  throw std::runtime_error("FPGATrackSimBinArray: index out of range i=" + std::to_string(i) +
104  " idx[i]=" + std::to_string(idx.at(i)) +
105  " dims[i]=" + std::to_string(m_dims.at(i)) + "\n");
106  }
107  offset += idx.at(i) * m_step.at(i);
108  }
109 
110  // Return data from 1-d vector
111  return m_data.at(offset);
112  }
113 
114  // convient to also be able to use a signed integer vector
115  const T &operator[](const std::vector<int> &idx) const
116  {
117  std::vector<unsigned int> idx_unsigned;
118  for (auto &d : idx)
119  idx_unsigned.push_back(d);
120  return (*this)[idx_unsigned];
121  }
122 
123  // make non-const version of the operator[]
124  // just call the const version and cast away the constness
125  // of the return value
126  T& operator[](const std::vector<int> &idx) {
127  T& retv ATLAS_THREAD_SAFE = const_cast<T&>(std::as_const(*this)[idx]);
128  return retv;
129  }
130  T& operator[](const std::vector<unsigned> &idx) {
131  T &retv ATLAS_THREAD_SAFE = const_cast<T &>(std::as_const(*this)[idx]);
132  return retv;
133  }
134 
135  // ConstIterator implemenation
137  {
139  using iterator_category = std::forward_iterator_tag;
141  using difference_type = void;
144 
145  // Constructor
146  ConstIterator(const std::vector<unsigned int> &idx,
147  const FPGATrackSimBinArray<T> &itrdata)
148  : m_idx(idx), m_itrdata(itrdata) {
149  if (m_idx.size() != m_itrdata.dims().size()) {
150  throw std::runtime_error(
151  "FPGATrackSimBinArray::Interator array size mismatch in "
152  "constructor");
153  }
154  }
155 
156  ConstIterator &operator*() { return *this; }
157  ConstIterator *operator->() { return this; }
158 
159  // Prefix increment
161  {
162  ++m_idx.at(0);
163  for (unsigned int i = 0; i < m_idx.size() - 1; i++)
164  {
165  if (m_idx.at(i) >= m_itrdata.dims().at(i))
166  {
167  ++m_idx.at(i + 1);
168  m_idx.at(i) = 0;
169  }
170  }
171  return *this;
172  }
173 
174  const std::vector<unsigned int> &idx() const { return m_idx; }
175  const T &data() { return m_itrdata[m_idx]; }
176 
177  // Postfix increment
179  {
180  ConstIterator tmp = *this;
181  ++(*this);
182  return tmp;
183  }
184 
185  friend bool operator==(const ConstIterator &a, const ConstIterator &b) { return a.m_idx == b.m_idx; };
186  friend bool operator!=(const ConstIterator &a, const ConstIterator &b)
187  {
188  return a.m_idx != b.m_idx;
189  };
190 
191  private:
192  // current state of the iterator
193  std::vector<unsigned int> m_idx;
194 
195  // reference back to the array being iterated over
197  };
198 
199  // Iterator implemenation
200  struct Iterator : public ConstIterator
201  {
203  using iterator_category = std::forward_iterator_tag;
205  using difference_type = void;
208 
209  // Constructor
210  Iterator(const std::vector<unsigned int> &idx,
211  FPGATrackSimBinArray<T> &itrdata)
212  : ConstIterator(idx,itrdata) {}
213 
214  Iterator &operator*() { return *this; }
215  Iterator *operator->() { return this; }
216 
217  // Prefix increment
219  {
220  ++(*(ConstIterator*)this);
221  return *this;
222  }
223 
224  // Call const version and cast away const
225  T &data() {
226  T &retv ATLAS_THREAD_SAFE = const_cast<T &>(((ConstIterator*)this)->data());
227  return retv;
228  }
229 
230  // Postfix increment
232  {
233  Iterator tmp = *this;
234  ++(*this);
235  return tmp;
236  }
237 
238  friend bool operator==(const Iterator &a, const Iterator &b) { return (ConstIterator&)a == (ConstIterator&)b; }
239  friend bool operator!=(const Iterator &a, const Iterator &b) { return (ConstIterator&)a != (ConstIterator&)b; }
240  };
241 
242  // ussual std iterator meanings of begin, end, and size
243  Iterator begin() { return Iterator(std::vector<unsigned int>(m_dims.size(), 0), *this); }
244  Iterator end()
245  {
246  std::vector<unsigned int> retv;
247  for (auto &d : m_dims)
248  retv.push_back(d - 1);
249  return ++Iterator(retv, *this);
250  }
251 
252  auto begin() const { return ConstIterator(std::vector<unsigned int>(m_dims.size(), 0), *this); }
253  auto end() const
254  {
255  std::vector<unsigned int> retv;
256  for (auto &d : m_dims)
257  retv.push_back(d - 1);
258  return ++ConstIterator(retv, *this);
259  }
260 
261 
262 private:
263  unsigned int m_entries{};
264  std::vector<unsigned int> m_dims{};
265  std::vector<unsigned int> m_step{};
266  std::vector<T> m_data{};
267 };
268 
269 #endif // FPGATrackSimBinArray_H
FPGATrackSimBinArray::ConstIterator::difference_type
void difference_type
Definition: FPGATrackSimBinArray.h:141
yodamerge_tmp.dim
dim
Definition: yodamerge_tmp.py:239
FPGATrackSimBinArray::ConstIterator::m_itrdata
const FPGATrackSimBinArray< T > & m_itrdata
Definition: FPGATrackSimBinArray.h:196
FPGATrackSimBinArray::operator[]
const T & operator[](const std::vector< int > &idx) const
Definition: FPGATrackSimBinArray.h:115
hist_file_dump.d
d
Definition: hist_file_dump.py:142
FPGATrackSimBinArray::m_dims
std::vector< unsigned int > m_dims
Definition: FPGATrackSimBinArray.h:264
FPGATrackSimBinArray::operator[]
T & operator[](const std::vector< int > &idx)
Definition: FPGATrackSimBinArray.h:126
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:74
FPGATrackSimBinArray::Iterator::operator++
Iterator & operator++()
Definition: FPGATrackSimBinArray.h:218
FPGATrackSimBinArray::ConstIterator::operator++
ConstIterator & operator++()
Definition: FPGATrackSimBinArray.h:160
FPGATrackSimBinArray::end
auto end() const
Definition: FPGATrackSimBinArray.h:253
FPGATrackSimBinArray::ConstIterator::operator++
ConstIterator operator++(int)
Definition: FPGATrackSimBinArray.h:178
FPGATrackSimBinArray::size
unsigned int size() const
Definition: FPGATrackSimBinArray.h:69
FPGATrackSimBinArray::setsize
void setsize(const std::vector< unsigned int > &dims, const T &initval)
Definition: FPGATrackSimBinArray.h:51
FPGATrackSimBinArray::ConstIterator::ConstIterator
ConstIterator(const std::vector< unsigned int > &idx, const FPGATrackSimBinArray< T > &itrdata)
Definition: FPGATrackSimBinArray.h:146
FPGATrackSimBinArray::Iterator::data
T & data()
Definition: FPGATrackSimBinArray.h:225
lumiFormat.i
int i
Definition: lumiFormat.py:85
FPGATrackSimBinArray::Iterator::operator!=
friend bool operator!=(const Iterator &a, const Iterator &b)
Definition: FPGATrackSimBinArray.h:239
FPGATrackSimBinArray::operator[]
T & operator[](const std::vector< unsigned > &idx)
Definition: FPGATrackSimBinArray.h:130
FPGATrackSimBinArray::Iterator::Iterator
Iterator(const std::vector< unsigned int > &idx, FPGATrackSimBinArray< T > &itrdata)
Definition: FPGATrackSimBinArray.h:210
FPGATrackSimBinArray::ConstIterator::idx
const std::vector< unsigned int > & idx() const
Definition: FPGATrackSimBinArray.h:174
FPGATrackSimBinArray
Definition: FPGATrackSimBinArray.h:41
FPGATrackSimBinArray::ConstIterator::operator==
friend bool operator==(const ConstIterator &a, const ConstIterator &b)
Definition: FPGATrackSimBinArray.h:185
FPGATrackSimBinArray::isValid
bool isValid(const std::vector< unsigned int > &idx) const
Definition: FPGATrackSimBinArray.h:81
FPGATrackSimBinArray::ConstIterator
Definition: FPGATrackSimBinArray.h:137
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
FPGATrackSimBinArray::Iterator::operator->
Iterator * operator->()
Definition: FPGATrackSimBinArray.h:215
FPGATrackSimBinArray::begin
Iterator begin()
Definition: FPGATrackSimBinArray.h:243
FPGATrackSimBinArray::Iterator::operator*
Iterator & operator*()
Definition: FPGATrackSimBinArray.h:214
FPGATrackSimBinArray::ConstIterator::m_idx
std::vector< unsigned int > m_idx
Definition: FPGATrackSimBinArray.h:189
FPGATrackSimBinArray::ConstIterator::operator*
ConstIterator & operator*()
Definition: FPGATrackSimBinArray.h:156
FPGATrackSimBinArray::flatdata
const std::vector< T > & flatdata() const
Definition: FPGATrackSimBinArray.h:75
FPGATrackSimBinArray::ConstIterator::operator->
ConstIterator * operator->()
Definition: FPGATrackSimBinArray.h:157
FPGATrackSimBinArray::ConstIterator::operator!=
friend bool operator!=(const ConstIterator &a, const ConstIterator &b)
Definition: FPGATrackSimBinArray.h:186
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
FPGATrackSimBinArray::begin
auto begin() const
Definition: FPGATrackSimBinArray.h:252
FPGATrackSimBinArray::dims
const std::vector< unsigned int > & dims() const
Definition: FPGATrackSimBinArray.h:78
FPGATrackSimBinArray::Iterator
Definition: FPGATrackSimBinArray.h:201
FPGATrackSimBinArray::Iterator::operator==
friend bool operator==(const Iterator &a, const Iterator &b)
Definition: FPGATrackSimBinArray.h:238
FPGATrackSimBinArray::ConstIterator::data
const T & data()
Definition: FPGATrackSimBinArray.h:175
FPGATrackSimBinArray::m_data
std::vector< T > m_data
Definition: FPGATrackSimBinArray.h:266
a
TList * a
Definition: liststreamerinfos.cxx:10
FPGATrackSimBinArray::m_entries
unsigned int m_entries
Definition: FPGATrackSimBinArray.h:263
FPGATrackSimBinArray::m_step
std::vector< unsigned int > m_step
Definition: FPGATrackSimBinArray.h:265
FPGATrackSimBinArray::end
Iterator end()
Definition: FPGATrackSimBinArray.h:244
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
FPGATrackSimBinArray::ConstIterator::iterator_category
std::forward_iterator_tag iterator_category
Definition: FPGATrackSimBinArray.h:139
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
FPGATrackSimBinArray::Iterator::operator++
Iterator operator++(int)
Definition: FPGATrackSimBinArray.h:231
checker_macros.h
Define macros for attributes used to control the static checker.
FPGATrackSimBinArray::FPGATrackSimBinArray
FPGATrackSimBinArray(const std::vector< unsigned int > &dims, const T &initval)
Definition: FPGATrackSimBinArray.h:45
FPGATrackSimBinArray::operator[]
const T & operator[](const std::vector< unsigned int > &idx) const
Definition: FPGATrackSimBinArray.h:91
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
FPGATrackSimBinArray::FPGATrackSimBinArray
FPGATrackSimBinArray()=default