12#ifndef ALICEO2_TPC_CALARRAY_H_
13#define ALICEO2_TPC_CALARRAY_H_
24#ifndef GPUCA_ALIGPUCODE
26#include <boost/format.hpp>
54 mPadSubset(padSubset),
55 mPadSubsetNumber(padSubsetNumber)
68 mPadSubsetNumber(padSubsetNumber)
80 mPadSubset(padSubset),
81 mPadSubsetNumber(padSubsetNumber)
96 const T
getValue(
const size_t channel)
const {
return mData[channel]; }
99 const T
getValue(
const size_t row,
const size_t pad)
const;
102 const std::string&
getName()
const {
return mName; }
104 const std::vector<T>&
getData()
const {
return mData; }
108 template <
typename U = T>
111 return std::accumulate(mData.begin(), mData.end(), U{});
147 std::fill(mData.begin(), mData.end(),
val);
151 template <
typename U = T>
154 const auto& vals = mData;
155 const U nVal =
static_cast<U
>(vals.size());
156 const U
sum = std::accumulate(vals.begin(), vals.end(), 0.f);
158 return (nVal > 0) ?
sum / nVal : U{0};
166 std::vector<T> mData;
168 int mPadSubsetNumber;
174#ifndef GPUCA_ALIGPUCODE
178void CalArray<T>::initData()
182 switch (mPadSubset) {
184 mData.resize(ROC(mPadSubsetNumber).rocType() ==
RocType::IROC ? mapper.getPadsInIROC() : mapper.getPadsInOROC());
186 setName(boost::str(boost::format(
"ROC_%1$02d") % mPadSubsetNumber));
191 mData.resize(mapper.getPartitionInfo(mPadSubsetNumber % mapper.getNumberOfPartitions()).getNumberOfPads());
193 setName(boost::str(boost::format(
"Partition_%1$03d") % mPadSubsetNumber));
198 mData.resize(mapper.getPadRegionInfo(mPadSubsetNumber % mapper.getNumberOfPadRegions()).getNumberOfPads());
200 setName(boost::str(boost::format(
"Region_%1$03d") % mPadSubsetNumber));
212 size_t position = mapper.getPadNumber(mPadSubset, mPadSubsetNumber,
row, pad);
213 setValue(position,
value);
222 size_t position = mapper.getPadNumber(mPadSubset, mPadSubsetNumber,
row, pad);
223 return getValue(position);
230 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
231 LOG(error) <<
"You are trying to operate on incompatible objects: Pad subset type and number must be the same on both objects";
234 for (
size_t i = 0;
i < mData.size(); ++
i) {
235 if constexpr (std::is_same_v<T, bool>) {
248 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
249 LOG(error) <<
"You are trying to operate on incompatible objects: Pad subset type and number must be the same on both objects";
252 for (
size_t i = 0;
i < mData.size(); ++
i) {
262 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
263 LOG(error) <<
"pad subset type of the objects it not compatible";
266 for (
size_t i = 0;
i < mData.size(); ++
i) {
267 if constexpr (std::is_same_v<T, bool>) {
280 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
281 LOG(error) <<
"pad subset type of the objects it not compatible";
284 for (
size_t i = 0;
i < mData.size(); ++
i) {
285 if (
other.getValue(
i) != 0) {
289 LOG(
debug) <<
"Division by 0 detected! Value was set to 0.";
299 if (!((mPadSubset ==
other.mPadSubset) && (mPadSubsetNumber ==
other.mPadSubsetNumber))) {
300 LOG(error) <<
"pad subset type of the objects it not compatible";
303 bool isSame = (mData ==
other.mData);
311 for (
auto&
data : mData) {
321 for (
auto&
data : mData) {
331 for (
auto&
data : mData) {
341 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 ...
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"