Trace.h
Go to the documentation of this file.
1 #ifndef _utl_Trace_h_
2 #define _utl_Trace_h_
3 
16 #include <algorithm>
17 #include <complex>
18 #include <iostream>
19 #include <string>
20 #include <vector>
21 #include <utl/ErrorLogger.h>
22 #include <utl/SVector.h>
23 #include <utl/ShadowPtr_fwd.h>
24 #include <utl/IteratorRange.h>
25 
26 
27 //#define TRACE_CHECKED_ACCESS
28 
29 namespace utl {
30 
31  // threevector of doubles, e.g., for time-series e-field data
33 
34  // threevector of complex, e.g., for frequency-spectrum e-field data
36 
37 
53  template<typename T>
54  class Trace {
55 
56  public:
57  typedef T ValueType;
58  typedef typename std::vector<T>::size_type SizeType;
59  typedef typename std::vector<T>::iterator Iterator;
60  typedef typename std::vector<T>::const_iterator ConstIterator;
61 
62  Trace() = default;
63 
64  Trace(const SizeType size, const double binning, const T& init = T())
65  : fArray(size, init), fBinning(binning), fStop(size) { }
66 
68  Trace(const SizeType size, const T* const cArray, const double binning)
69  : fArray(cArray, cArray + size), fBinning(binning), fStop(size) { }
70 
71  Trace(const std::vector<T>& trace, const double binning,
72  const SizeType start, const SizeType stop)
73  : fArray(trace), fBinning(binning), fStart(start), fStop(stop) { }
74 
75  Iterator Begin() { return fArray.begin(); }
76  Iterator End() { return fArray.end(); }
77  ConstIterator Begin() const { return fArray.begin(); }
78  ConstIterator End() const { return fArray.end(); }
80 
81 
89  template<typename T2>
90  void
91  Adopt(const T2* const cArray, const SizeType size)
92  {
93  fArray.resize(size);
94  copy(cArray, cArray + size, fArray.begin());
95  fStart = 0;
96  fStop = size;
97  }
98 
99  template<typename T2>
100  void
101  Assign(const T2& begin, const T2& end)
102  {
103  fArray.assign(begin, end);
104  fStart = 0;
105  fStop = fArray.size();
106  }
107 
108  template<typename T2>
109  void
110  Append(const T2& begin, const T2& end)
111  {
112  fArray.append(fArray.end(), begin, end);
113  fStart = 0;
114  fStop = fArray.size();
115  }
116 
118  void
119  PushBack(const T& value)
120  {
121  // increase fStop if it points to the end of the trace
122  if (fStop == (GetSize() - 1))
123  ++fStop;
124  fArray.push_back(value);
125  }
126 
128  void
130  {
131  // decrease fStop if it points to the end of the trace
132  if (fStop == (GetSize() - 1))
133  --fStop;
134  fArray.pop_back();
135  }
136 
138  double GetBinning() const { return fBinning; }
139  void SetBinning(const double binning) { fBinning = binning; }
140 
142  SizeType GetStart() const { return fStart; }
143 
145  void SetStart(const SizeType start) { fStart = start; }
146 
148  SizeType GetStop() const { return fStop; }
149 
151  void SetStop(const SizeType stop) { fStop = stop; }
152 
153  double GetScale() const { return fScale; }
154  void SetScale(const double s) { fScale = s; }
155 
156  SizeType GetSize() const { return fArray.size(); }
157 
158  void Clear() { fArray.clear(); }
159 
160  void ResetAll(const T& value = T()) { std::fill(fArray.begin(), fArray.end(), value); }
161 
162  Trace<T>
164  const
165  {
167  transform(fArray.begin(), fArray.end(), result.Begin(), std::negate<T>());
168  result.fStart = fStart;
169  result.fStop = fStop;
170  result.fScale = fScale;
171  return result;
172  }
173 
174  Trace<T> operator+(const Trace<T>& trace) const;
175  Trace<T> operator-(const Trace<T>& trace) const;
176  Trace<T> operator*(const Trace<T>& trace) const;
177 
178  Trace<T>& operator+=(const Trace<T>& trace);
179  Trace<T>& operator-=(const Trace<T>& trace);
180  Trace<T>& operator*=(const Trace<T>& trace);
181 
182  Trace<T>& operator+=(const T value);
183  Trace<T>& operator-=(const T value);
184  Trace<T>& operator*=(const T value);
185  Trace<T>& operator/=(const T value);
186 
187  bool IsSameTypeAs(const Trace<T>& t) const
188  { return fArray.size() == t.fArray.size() && fBinning == t.fBinning && fScale == t.fScale; }
189 
190  bool operator==(const Trace<T>& t) const
191  { return IsSameTypeAs(t) && fArray == t.fArray && fStart == t.fStart && fStop == t.fStop; }
192 
193  bool operator!=(const Trace<T>& trace) const
194  { return !operator==(trace); }
195 
196 #ifdef TRACE_CHECKED_ACCESS
197  T& operator[](const SizeType i) { return At(i); }
198  const T& operator[](const SizeType i) const { return At(i); }
199 #else
200  T& operator[](const SizeType i) { return fArray[i]; }
201  const T& operator[](const SizeType i) const { return fArray[i]; }
202 #endif
203 
205  T& At(const SizeType i) { return fArray.at(i); }
206 
208  const T& At(const SizeType i) const { return fArray.at(i); }
209 
210  void
212  {
213  std::swap(fArray, t.fArray);
214  std::swap(fBinning, t.fBinning);
215  std::swap(fStart, t.fStart);
216  std::swap(fStop, t.fStop);
217  std::swap(fScale, t.fScale);
218  }
219 
220  protected:
221  std::vector<T> fArray;
222 
223  double fBinning = 0;
226  double fScale = 1;
227 
228  friend class ShadowPtr<Trace<T>>;
229 
230  };
231 
232  // To keep the forward declarations consistent
233  // modify Trace-fwd when changing/adding below
235  typedef Trace<short int> TraceSI;
237  typedef Trace<int> TraceI;
238  typedef Trace<float> TraceF;
239  typedef Trace<double> TraceD;
240  typedef Trace<char> TraceB;
242  typedef Trace<Vector3D> TraceV3D;
243  typedef Trace<Vector3C> TraceV3C;
244 
245 
246  // Trace<T> + - * Trace<T>
247  #define INNER_ARITHMETIC_BINARY_OPERATOR(_op_) \
248  template<typename T> \
249  Trace<T> \
250  Trace<T>::operator _op_(const Trace<T>& trace) \
251  const \
252  { \
253  const SizeType size = GetSize(); \
254  if (IsSameTypeAs(trace)) { \
255  Trace<T> result(size, fBinning); \
256  transform(fArray.begin(), fArray.end(), trace.Begin(), result.Begin(), \
257  [](const auto& l, const auto& r) { return l _op_ r;} ); \
258  result.fStart = fStart; \
259  result.fStop = fStop; \
260  result.fScale = fScale; \
261  return result; \
262  } else { \
263  ERROR("Attempting to operate on two traces of different type"); \
264  Trace<T> foo; \
265  return foo; \
266  } \
267  }
268 
272 
273  #undef INNER_ARITHMETIC_BINARY_OPERATOR
274 
275 
276  // Trace<T> += -= *= Trace<T>
277  #define INNER_AUGMENTED_ARITHMETIC_OPERATOR(_op_) \
278  template<typename T> \
279  Trace<T>& \
280  Trace<T>::operator _op_##=(const Trace<T>& trace) \
281  { \
282  if (IsSameTypeAs(trace)) { \
283  transform(fArray.begin(), fArray.end(), trace.Begin(), fArray.begin(), \
284  [](const auto& l, const auto& r) { return l _op_ r;} ); \
285  } else \
286  ERROR("Attempting to operate on two traces of different types"); \
287  return *this; \
288  }
289 
293 
294  #undef INNER_AUGMENTED_ARITHMETIC_OPERATOR
295 
296 
297  // Trace<T> += -= *= /= T
298  #define OUTER_AUGMENTED_ARITHMETIC_OPERATOR(_op_) \
299  template<typename T> \
300  Trace<T>& \
301  Trace<T>::operator _op_##=(const T value) \
302  { \
303  transform(fArray.begin(), fArray.end(), fArray.begin(), \
304  [&value](const auto& elem) { return elem _op_ value; }); \
305  return *this; \
306  }
307 
312 
313  #undef OUTER_AUGMENTED_ARITHMETIC_OPERATOR
314 
315 
316  // left: Trace<T1> + - * T2
317  // right: T2 + - * Trace<T1>
318  #define LEFT_OUTER_ARITHMETIC_OPERATOR(_op_) \
319  template <typename _T1_, typename _T2_> \
320  utl::Trace<_T2_> \
321  operator _op_(const utl::Trace<_T1_>& trace, const _T2_ value) \
322  { \
323  utl::Trace<_T2_> result(trace.GetSize(), trace.GetBinning()); \
324  transform(trace.Begin(), trace.End(), result.Begin(), \
325  [&value](const auto& elem) { return elem _op_ value; }); \
326  result.SetStart(trace.GetStart()); \
327  result.SetStop(trace.GetStop()); \
328  result.SetScale(trace.GetScale()); \
329  return result; \
330  }
331 
332  #define RIGHT_OUTER_ARITHMETIC_OPERATOR(_op_) \
333  template <typename _T1_, typename _T2_> \
334  utl::Trace<_T2_> \
335  operator _op_(const _T2_ value, const utl::Trace<_T1_>& trace) \
336  { \
337  utl::Trace<_T2_> result(trace.GetSize(), trace.GetBinning()); \
338  transform(trace.Begin(), trace.End(), result.Begin(), \
339  [&value](const auto& elem) { return value _op_ elem; }); \
340  result.SetStart(trace.GetStart()); \
341  result.SetStop(trace.GetStop()); \
342  result.SetScale(trace.GetScale()); \
343  return result; \
344  }
345 
353 
354  #undef LEFT_OUTER_ARITHMETIC_OPERATOR
355  #undef RIGHT_OUTER_ARITHMETIC_OPERATOR
356 
357 } // utl
358 
359 
360 namespace std {
361 
362  template<typename T>
363  inline void swap(utl::Trace<T>& t1, utl::Trace<T>& t2)
364  { t1.Swap(t2); }
365 
366 }
367 
368 
369 #undef TRACE_CHECKED_ACCESS
370 
371 
372 #endif
pointer with built-in initialization, deletion, deep copying
Definition: ShadowPtr.h:163
#define RIGHT_OUTER_ARITHMETIC_OPERATOR(_op_)
Definition: Trace.h:332
Trace< T > & operator+=(const Trace< T > &trace)
Definition: Trace.h:290
void SetStop(const SizeType stop)
Set valid data stop bin.
Definition: Trace.h:151
Trace< std::complex< double > > TraceC
Definition: Trace-fwd.h:29
Trace< T > & operator*=(const Trace< T > &trace)
Definition: Trace.h:292
void swap(utl::Trace< T > &t1, utl::Trace< T > &t2)
Definition: Trace.h:363
T & At(const SizeType i)
trace entry with checked address
Definition: Trace.h:205
void Adopt(const T2 *const cArray, const SizeType size)
Definition: Trace.h:91
void Assign(const T2 &begin, const T2 &end)
Definition: Trace.h:101
bool operator==(const Trace< T > &t) const
Definition: Trace.h:190
#define INNER_ARITHMETIC_BINARY_OPERATOR(_op_)
Definition: Trace.h:247
#define OFFLINE_MAKE_BOTH_FRIEND_RANGES(_Iterator_, _ConstIterator_, _Class_)
#define OUTER_AUGMENTED_ARITHMETIC_OPERATOR(_op_)
Definition: Trace.h:298
SizeType fStart
Definition: Trace.h:224
std::vector< T > fArray
Definition: Trace.h:221
SizeType GetStop() const
Get valid data stop bin.
Definition: Trace.h:148
Trace< int > TraceI
Definition: Trace-fwd.h:24
Trace< unsigned short int > TraceUSI
Definition: Trace-fwd.h:19
double GetBinning() const
size of one slot
Definition: Trace.h:138
const T & operator[](const SizeType i) const
Definition: Trace.h:201
utl::SVector< 3, double > Vector3D
Definition: Trace-fwd.h:32
void Append(const T2 &begin, const T2 &end)
Definition: Trace.h:110
void Swap(Trace< T > &t)
Definition: Trace.h:211
ConstIterator Begin() const
Definition: Trace.h:77
Trace< T > & operator-=(const Trace< T > &trace)
Definition: Trace.h:291
std::vector< T >::const_iterator ConstIterator
Definition: Trace.h:60
Trace< double > TraceD
Definition: Trace-fwd.h:26
Iterator Begin()
Definition: Trace.h:75
T & operator[](const SizeType i)
Definition: Trace.h:200
double fBinning
Definition: Trace.h:223
constexpr double s
Definition: AugerUnits.h:163
std::vector< T >::size_type SizeType
Definition: Trace.h:58
void PopBack()
Remove one value at the end of the trace.
Definition: Trace.h:129
Trace< short int > TraceSI
Definition: Trace-fwd.h:22
const Data result[]
const T & At(const SizeType i) const
trace entry with checked address
Definition: Trace.h:208
void SetScale(const double s)
Definition: Trace.h:154
void SetStart(const SizeType start)
Set valid data start bin.
Definition: Trace.h:145
Trace< T > operator+(const Trace< T > &trace) const
Definition: Trace.h:269
bool operator!=(const Trace< T > &trace) const
Definition: Trace.h:193
void Clear()
Definition: Trace.h:158
utl::SVector< 3, std::complex< double > > Vector3C
Definition: Trace-fwd.h:34
SizeType GetSize() const
Definition: Trace.h:156
Trace< char > TraceB
Definition: Trace-fwd.h:28
a second level trigger
Definition: XbT2.h:8
void ResetAll(const T &value=T())
Definition: Trace.h:160
void SetBinning(const double binning)
Definition: Trace.h:139
#define LEFT_OUTER_ARITHMETIC_OPERATOR(_op_)
Definition: Trace.h:318
Trace< Vector3C > TraceV3C
Definition: Trace-fwd.h:37
Trace< T > & operator/=(const T value)
Definition: Trace.h:311
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
Definition: Trace-fwd.h:19
SizeType GetStart() const
Get valid data start bin.
Definition: Trace.h:142
#define INNER_AUGMENTED_ARITHMETIC_OPERATOR(_op_)
Definition: Trace.h:277
Trace< float > TraceF
Definition: Trace-fwd.h:25
ConstIterator End() const
Definition: Trace.h:78
bool IsSameTypeAs(const Trace< T > &t) const
Definition: Trace.h:187
double GetScale() const
Definition: Trace.h:153
Trace< unsigned int > TraceUI
Definition: Trace-fwd.h:23
double fScale
Definition: Trace.h:226
SizeType fStop
Definition: Trace.h:225
Trace< Vector3D > TraceV3D
Definition: Trace-fwd.h:36
Trace< T > operator*(const Trace< T > &trace) const
Definition: Trace.h:271
T ValueType
Definition: Trace.h:57
void PushBack(const T &value)
Insert a single value at the end.
Definition: Trace.h:119
Iterator End()
Definition: Trace.h:76
std::vector< T >::iterator Iterator
Definition: Trace.h:59
Trace(const std::vector< T > &trace, const double binning, const SizeType start, const SizeType stop)
Definition: Trace.h:71
Trace()=default
Trace< T > operator-() const
Definition: Trace.h:163
Trace(const SizeType size, const T *const cArray, const double binning)
Construct from a c-array of T of size length.
Definition: Trace.h:68

, generated on Tue Sep 26 2023.