21 #include <utl/ErrorLogger.h>
22 #include <utl/SVector.h>
23 #include <utl/ShadowPtr_fwd.h>
24 #include <utl/IteratorRange.h>
58 typedef typename std::vector<T>::size_type
SizeType;
59 typedef typename std::vector<T>::iterator
Iterator;
71 Trace(
const std::vector<T>& trace,
const double binning,
94 copy(cArray, cArray + size,
fArray.begin());
103 fArray.assign(begin, end);
108 template<
typename T2>
167 transform(
fArray.begin(),
fArray.end(), result.Begin(), std::negate<T>());
169 result.fStop =
fStop;
196 #ifdef TRACE_CHECKED_ACCESS
247 #define INNER_ARITHMETIC_BINARY_OPERATOR(_op_) \
248 template<typename T> \
250 Trace<T>::operator _op_(const Trace<T>& trace) \
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; \
263 ERROR("Attempting to operate on two traces of different type"); \
273 #undef INNER_ARITHMETIC_BINARY_OPERATOR
277 #define INNER_AUGMENTED_ARITHMETIC_OPERATOR(_op_) \
278 template<typename T> \
280 Trace<T>::operator _op_##=(const Trace<T>& trace) \
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;} ); \
286 ERROR("Attempting to operate on two traces of different types"); \
294 #undef INNER_AUGMENTED_ARITHMETIC_OPERATOR
298 #define OUTER_AUGMENTED_ARITHMETIC_OPERATOR(_op_) \
299 template<typename T> \
301 Trace<T>::operator _op_##=(const T value) \
303 transform(fArray.begin(), fArray.end(), fArray.begin(), \
304 [&value](const auto& elem) { return elem _op_ value; }); \
313 #undef OUTER_AUGMENTED_ARITHMETIC_OPERATOR
318 #define LEFT_OUTER_ARITHMETIC_OPERATOR(_op_) \
319 template <typename _T1_, typename _T2_> \
321 operator _op_(const utl::Trace<_T1_>& trace, const _T2_ value) \
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()); \
332 #define RIGHT_OUTER_ARITHMETIC_OPERATOR(_op_) \
333 template <typename _T1_, typename _T2_> \
335 operator _op_(const _T2_ value, const utl::Trace<_T1_>& trace) \
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()); \
354 #undef LEFT_OUTER_ARITHMETIC_OPERATOR
355 #undef RIGHT_OUTER_ARITHMETIC_OPERATOR
369 #undef TRACE_CHECKED_ACCESS
pointer with built-in initialization, deletion, deep copying
#define RIGHT_OUTER_ARITHMETIC_OPERATOR(_op_)
Trace< T > & operator+=(const Trace< T > &trace)
void SetStop(const SizeType stop)
Set valid data stop bin.
Trace< std::complex< double > > TraceC
Trace< T > & operator*=(const Trace< T > &trace)
void swap(utl::Trace< T > &t1, utl::Trace< T > &t2)
T & At(const SizeType i)
trace entry with checked address
void Adopt(const T2 *const cArray, const SizeType size)
void Assign(const T2 &begin, const T2 &end)
bool operator==(const Trace< T > &t) const
#define INNER_ARITHMETIC_BINARY_OPERATOR(_op_)
#define OFFLINE_MAKE_BOTH_FRIEND_RANGES(_Iterator_, _ConstIterator_, _Class_)
#define OUTER_AUGMENTED_ARITHMETIC_OPERATOR(_op_)
SizeType GetStop() const
Get valid data stop bin.
Trace< unsigned short int > TraceUSI
double GetBinning() const
size of one slot
const T & operator[](const SizeType i) const
utl::SVector< 3, double > Vector3D
void Append(const T2 &begin, const T2 &end)
ConstIterator Begin() const
Trace< T > & operator-=(const Trace< T > &trace)
std::vector< T >::const_iterator ConstIterator
T & operator[](const SizeType i)
std::vector< T >::size_type SizeType
void PopBack()
Remove one value at the end of the trace.
Trace< short int > TraceSI
const T & At(const SizeType i) const
trace entry with checked address
void SetScale(const double s)
void SetStart(const SizeType start)
Set valid data start bin.
Trace< T > operator+(const Trace< T > &trace) const
bool operator!=(const Trace< T > &trace) const
utl::SVector< 3, std::complex< double > > Vector3C
void ResetAll(const T &value=T())
void SetBinning(const double binning)
#define LEFT_OUTER_ARITHMETIC_OPERATOR(_op_)
Trace< Vector3C > TraceV3C
Trace< T > & operator/=(const T value)
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
SizeType GetStart() const
Get valid data start bin.
#define INNER_AUGMENTED_ARITHMETIC_OPERATOR(_op_)
ConstIterator End() const
bool IsSameTypeAs(const Trace< T > &t) const
Trace< unsigned int > TraceUI
Trace< Vector3D > TraceV3D
Trace< T > operator*(const Trace< T > &trace) const
void PushBack(const T &value)
Insert a single value at the end.
std::vector< T >::iterator Iterator
Trace(const std::vector< T > &trace, const double binning, const SizeType start, const SizeType stop)
Trace< T > operator-() const
Trace(const SizeType size, const T *const cArray, const double binning)
Construct from a c-array of T of size length.