12#ifndef ALICEO2_TPC_CALARRAY_H_
13#define ALICEO2_TPC_CALARRAY_H_
24#ifndef GPUCA_ALIGPUCODE
26#include <boost/format.hpp>
59 mPadSubset(padSubset),
60 mPadSubsetNumber(padSubsetNumber)
73 mPadSubsetNumber(padSubsetNumber)
85 mPadSubset(padSubset),
86 mPadSubsetNumber(padSubsetNumber)
103 assert(channel < mData.size());
104 return mData[channel];
108 const T
getValue(
const size_t row,
const size_t pad)
const;
111 const std::string&
getName()
const {
return mName; }
113 const std::vector<T>&
getData()
const {
return mData; }
117 template <
typename U = T>
120 return std::accumulate(mData.begin(), mData.end(), U{});
156 std::fill(mData.begin(), mData.end(),
val);
160 template <
typename U = T>
163 const auto& vals = mData;
164 const U nVal =
static_cast<U
>(vals.size());
165 const U
sum = std::accumulate(vals.begin(), vals.end(), 0.f);
167 return (nVal > 0) ?
sum / nVal : U{0};
175 std::vector<T> mData;
177 int mPadSubsetNumber;
183#ifndef GPUCA_ALIGPUCODE
187void CalArray<T>::initData()
191 switch (mPadSubset) {
193 mData.resize(ROC(mPadSubsetNumber).rocType() ==
RocType::IROC ? mapper.getPadsInIROC() : mapper.getPadsInOROC());
195 setName(boost::str(boost::format(
"ROC_%1$02d") % mPadSubsetNumber));
200 mData.resize(mapper.getPartitionInfo(mPadSubsetNumber % mapper.getNumberOfPartitions()).getNumberOfPads());
202 setName(boost::str(boost::format(
"Partition_%1$03d") % mPadSubsetNumber));
207 mData.resize(mapper.getPadRegionInfo(mPadSubsetNumber % mapper.getNumberOfPadRegions()).getNumberOfPads());
209 setName(boost::str(boost::format(
"Region_%1$03d") % mPadSubsetNumber));
221 size_t position = mapper.getPadNumber(mPadSubset, mPadSubsetNumber,
row, pad);
222 setValue(position,
value);
231 size_t position = mapper.getPadNumber(mPadSubset, mPadSubsetNumber,
row, pad);
239 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
240 LOG(error) <<
"You are trying to operate on incompatible objects: Pad subset type and number must be the same on both objects";
243 for (
size_t i = 0;
i < mData.size(); ++
i) {
244 if constexpr (std::is_same_v<T, bool>) {
257 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
258 LOG(error) <<
"You are trying to operate on incompatible objects: Pad subset type and number must be the same on both objects";
261 for (
size_t i = 0;
i < mData.size(); ++
i) {
271 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
272 LOG(error) <<
"pad subset type of the objects it not compatible";
275 for (
size_t i = 0;
i < mData.size(); ++
i) {
276 if constexpr (std::is_same_v<T, bool>) {
289 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
290 LOG(error) <<
"pad subset type of the objects it not compatible";
293 for (
size_t i = 0;
i < mData.size(); ++
i) {
294 if (
other.getValue(
i) != 0) {
298 LOG(
debug) <<
"Division by 0 detected! Value was set to 0.";
308 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
309 LOG(error) <<
"pad subset type of the objects it not compatible";
312 bool isSame = (mData ==
other.mData);
320 for (
auto&
data : mData) {
330 for (
auto&
data : mData) {
340 for (
auto&
data : mData) {
350 for (
auto&
data : mData) {
CalArray()=default
Default constructor.
std::vector< T > & getData()
const CalArray< T > & multiply(const T &val)
Multiply all val to all channels.
const CalArray & operator+=(const CalArray &other)
Add other to this channel by channel.
void setValue(const size_t channel, const T &value)
const U getSum() const
calculate the sum of all elements
const CalArray & operator/=(const CalArray &other)
Divide this by other channel by channel.
const CalArray & operator-=(const CalArray &other)
Subtract other from this channel by channel.
CalArray(const PadSubset padSubset, const int padSubsetNumber)
const std::string & getName() const
PadSubset getPadSubset() const
const CalArray & operator=(const T &val)
assigment to all channls
const std::vector< T > & getData() const
int getPadSubsetNumber() const
CalArray(const std::string_view name, const PadSubset padSubset, const int padSubsetNumber)
const CalArray & operator*=(const CalArray &other)
Multiply other to this channel by channel.
CalArray(const std::string_view name, const int padSubsetNumber)
bool operator==(const CalArray &other) const
check for equality
~CalArray()=default
Default destructor.
void setName(const std::string &name)
const T getValue(const size_t channel) const
static Mapper & instance(const std::string mappingDir="")
GLuint const GLchar * name
GLsizei const GLfloat * value
PadSubset
Definition of the different pad subsets.
@ Partition
Partitions (up to 36*5)
@ Region
Regions (up to 36*10)
DataT sum(const Vector< DataT, N > &a)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
double getValue(DPVAL dp)
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"