Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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  // look up content by idx specified as a std::vector<unsigned int>
81  const T &operator[](const std::vector<unsigned int> &idx) const
82  {
83  if(idx.size() != m_step.size()) {
84  throw std::runtime_error("FPGATrackSimBinArray: index size does not match array dimensions");
85  }
86 
87  // Translate N-dim index to 1-d index
88  unsigned int offset = 0;
89  for (unsigned int i = 0; i < m_step.size(); i++)
90  {
91  if (idx.at(i) >= m_dims.at(i))
92  {
93  throw std::runtime_error("FPGATrackSimBinArray: index out of range i=" + std::to_string(i) +
94  " idx[i]=" + std::to_string(idx.at(i)) +
95  " dims[i]=" + std::to_string(m_dims.at(i)) + "\n");
96  }
97  offset += idx.at(i) * m_step.at(i);
98  }
99 
100  // Return data from 1-d vector
101  return m_data.at(offset);
102  }
103 
104  // convient to also be able to use a signed integer vector
105  const T &operator[](const std::vector<int> &idx) const
106  {
107  std::vector<unsigned int> idx_unsigned;
108  for (auto &d : idx)
109  idx_unsigned.push_back(d);
110  return (*this)[idx_unsigned];
111  }
112 
113  // make non-const version of the operator[]
114  // just call the const version and cast away the constness
115  // of the return value
116  T& operator[](const std::vector<int> &idx) {
117  T& retv ATLAS_THREAD_SAFE = const_cast<T&>(std::as_const(*this)[idx]);
118  return retv;
119  }
120  T& operator[](const std::vector<unsigned> &idx) {
121  T &retv ATLAS_THREAD_SAFE = const_cast<T &>(std::as_const(*this)[idx]);
122  return retv;
123  }
124 
125  // ConstIterator implemenation
127  {
129  using iterator_category = std::forward_iterator_tag;
131  using difference_type = void;
134 
135  // Constructor
136  ConstIterator(const std::vector<unsigned int> &idx,
137  const FPGATrackSimBinArray<T> &itrdata)
138  : m_idx(idx), m_itrdata(itrdata) {
139  if (m_idx.size() != m_itrdata.dims().size()) {
140  throw std::runtime_error(
141  "FPGATrackSimBinArray::Interator array size mismatch in "
142  "constructor");
143  }
144  }
145 
146  ConstIterator &operator*() { return *this; }
147  ConstIterator *operator->() { return this; }
148 
149  // Prefix increment
151  {
152  ++m_idx.at(0);
153  for (unsigned int i = 0; i < m_idx.size() - 1; i++)
154  {
155  if (m_idx.at(i) >= m_itrdata.dims().at(i))
156  {
157  ++m_idx.at(i + 1);
158  m_idx.at(i) = 0;
159  }
160  }
161  return *this;
162  }
163 
164  const std::vector<unsigned int> &idx() const { return m_idx; }
165  const T &data() { return m_itrdata[m_idx]; }
166 
167  // Postfix increment
169  {
170  ConstIterator tmp = *this;
171  ++(*this);
172  return tmp;
173  }
174 
175  friend bool operator==(const ConstIterator &a, const ConstIterator &b) { return a.m_idx == b.m_idx; };
176  friend bool operator!=(const ConstIterator &a, const ConstIterator &b)
177  {
178  return a.m_idx != b.m_idx;
179  };
180 
181  private:
182  // current state of the iterator
183  std::vector<unsigned int> m_idx;
184 
185  // reference back to the array being iterated over
187  };
188 
189  // Iterator implemenation
190  struct Iterator : public ConstIterator
191  {
193  using iterator_category = std::forward_iterator_tag;
195  using difference_type = void;
198 
199  // Constructor
200  Iterator(const std::vector<unsigned int> &idx,
201  FPGATrackSimBinArray<T> &itrdata)
202  : ConstIterator(idx,itrdata) {}
203 
204  Iterator &operator*() { return *this; }
205  Iterator *operator->() { return this; }
206 
207  // Prefix increment
209  {
210  ++(*(ConstIterator*)this);
211  return *this;
212  }
213 
214  // Call const version and cast away const
215  T &data() {
216  T &retv ATLAS_THREAD_SAFE = const_cast<T &>(((ConstIterator*)this)->data());
217  return retv;
218  }
219 
220  // Postfix increment
222  {
223  Iterator tmp = *this;
224  ++(*this);
225  return tmp;
226  }
227 
228  friend bool operator==(const Iterator &a, const Iterator &b) { return (ConstIterator&)a == (ConstIterator&)b; }
229  friend bool operator!=(const Iterator &a, const Iterator &b) { return (ConstIterator&)a != (ConstIterator&)b; }
230  };
231 
232  // ussual std iterator meanings of begin, end, and size
233  Iterator begin() { return Iterator(std::vector<unsigned int>(m_dims.size(), 0), *this); }
234  Iterator end()
235  {
236  std::vector<unsigned int> retv;
237  for (auto &d : m_dims)
238  retv.push_back(d - 1);
239  return ++Iterator(retv, *this);
240  }
241 
242  auto begin() const { return ConstIterator(std::vector<unsigned int>(m_dims.size(), 0), *this); }
243  auto end() const
244  {
245  std::vector<unsigned int> retv;
246  for (auto &d : m_dims)
247  retv.push_back(d - 1);
248  return ++ConstIterator(retv, *this);
249  }
250 
251 
252 private:
253  unsigned int m_entries{};
254  std::vector<unsigned int> m_dims{};
255  std::vector<unsigned int> m_step{};
256  std::vector<T> m_data{};
257 };
258 
259 #endif // FPGATrackSimBinArray_H
FPGATrackSimBinArray::ConstIterator::difference_type
void difference_type
Definition: FPGATrackSimBinArray.h:131
yodamerge_tmp.dim
dim
Definition: yodamerge_tmp.py:239
FPGATrackSimBinArray::ConstIterator::m_itrdata
const FPGATrackSimBinArray< T > & m_itrdata
Definition: FPGATrackSimBinArray.h:186
FPGATrackSimBinArray::operator[]
const T & operator[](const std::vector< int > &idx) const
Definition: FPGATrackSimBinArray.h:105
hist_file_dump.d
d
Definition: hist_file_dump.py:143
FPGATrackSimBinArray::m_dims
std::vector< unsigned int > m_dims
Definition: FPGATrackSimBinArray.h:254
FPGATrackSimBinArray::operator[]
T & operator[](const std::vector< int > &idx)
Definition: FPGATrackSimBinArray.h:116
FPGATrackSimBinArray::Iterator::operator++
Iterator & operator++()
Definition: FPGATrackSimBinArray.h:208
FPGATrackSimBinArray::ConstIterator::operator++
ConstIterator & operator++()
Definition: FPGATrackSimBinArray.h:150
FPGATrackSimBinArray::end
auto end() const
Definition: FPGATrackSimBinArray.h:243
FPGATrackSimBinArray::ConstIterator::operator++
ConstIterator operator++(int)
Definition: FPGATrackSimBinArray.h:168
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:136
FPGATrackSimBinArray::Iterator::data
T & data()
Definition: FPGATrackSimBinArray.h:215
lumiFormat.i
int i
Definition: lumiFormat.py:85
FPGATrackSimBinArray::Iterator::operator!=
friend bool operator!=(const Iterator &a, const Iterator &b)
Definition: FPGATrackSimBinArray.h:229
FPGATrackSimBinArray::operator[]
T & operator[](const std::vector< unsigned > &idx)
Definition: FPGATrackSimBinArray.h:120
FPGATrackSimBinArray::Iterator::Iterator
Iterator(const std::vector< unsigned int > &idx, FPGATrackSimBinArray< T > &itrdata)
Definition: FPGATrackSimBinArray.h:200
FPGATrackSimBinArray::ConstIterator::idx
const std::vector< unsigned int > & idx() const
Definition: FPGATrackSimBinArray.h:164
FPGATrackSimBinArray
Definition: FPGATrackSimBinArray.h:41
FPGATrackSimBinArray::ConstIterator::operator==
friend bool operator==(const ConstIterator &a, const ConstIterator &b)
Definition: FPGATrackSimBinArray.h:175
FPGATrackSimBinArray::ConstIterator
Definition: FPGATrackSimBinArray.h:127
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
FPGATrackSimBinArray::Iterator::operator->
Iterator * operator->()
Definition: FPGATrackSimBinArray.h:205
FPGATrackSimBinArray::begin
Iterator begin()
Definition: FPGATrackSimBinArray.h:233
FPGATrackSimBinArray::Iterator::operator*
Iterator & operator*()
Definition: FPGATrackSimBinArray.h:204
FPGATrackSimBinArray::ConstIterator::m_idx
std::vector< unsigned int > m_idx
Definition: FPGATrackSimBinArray.h:179
FPGATrackSimBinArray::ConstIterator::operator*
ConstIterator & operator*()
Definition: FPGATrackSimBinArray.h:146
FPGATrackSimBinArray::flatdata
const std::vector< T > & flatdata() const
Definition: FPGATrackSimBinArray.h:75
FPGATrackSimBinArray::ConstIterator::operator->
ConstIterator * operator->()
Definition: FPGATrackSimBinArray.h:147
FPGATrackSimBinArray::ConstIterator::operator!=
friend bool operator!=(const ConstIterator &a, const ConstIterator &b)
Definition: FPGATrackSimBinArray.h:176
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
FPGATrackSimBinArray::begin
auto begin() const
Definition: FPGATrackSimBinArray.h:242
FPGATrackSimBinArray::dims
const std::vector< unsigned int > & dims() const
Definition: FPGATrackSimBinArray.h:78
FPGATrackSimBinArray::Iterator
Definition: FPGATrackSimBinArray.h:191
FPGATrackSimBinArray::Iterator::operator==
friend bool operator==(const Iterator &a, const Iterator &b)
Definition: FPGATrackSimBinArray.h:228
FPGATrackSimBinArray::ConstIterator::data
const T & data()
Definition: FPGATrackSimBinArray.h:165
FPGATrackSimBinArray::m_data
std::vector< T > m_data
Definition: FPGATrackSimBinArray.h:256
a
TList * a
Definition: liststreamerinfos.cxx:10
FPGATrackSimBinArray::m_entries
unsigned int m_entries
Definition: FPGATrackSimBinArray.h:253
FPGATrackSimBinArray::m_step
std::vector< unsigned int > m_step
Definition: FPGATrackSimBinArray.h:255
FPGATrackSimBinArray::end
Iterator end()
Definition: FPGATrackSimBinArray.h:234
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:129
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
FPGATrackSimBinArray::Iterator::operator++
Iterator operator++(int)
Definition: FPGATrackSimBinArray.h:221
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:81
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
FPGATrackSimBinArray::FPGATrackSimBinArray
FPGATrackSimBinArray()=default