44 lines
1015 B
C++
44 lines
1015 B
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#ifndef JUNGFRAUJOCH_HISTOGRAM_H
|
|
#define JUNGFRAUJOCH_HISTOGRAM_H
|
|
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
#include <vector>
|
|
#include <mutex>
|
|
#include <jfjoch.pb.h>
|
|
|
|
template <class T>
|
|
class Histogram {
|
|
std::vector<T> sum;
|
|
std::vector<uint64_t> count;
|
|
std::mutex m;
|
|
public:
|
|
explicit Histogram(size_t bins) : sum(bins), count(bins) {}
|
|
void Add(size_t bin, T val) {
|
|
std::unique_lock<std::mutex> ul(m);
|
|
|
|
if (bin < sum.size()) {
|
|
sum[bin] += val;
|
|
count[bin] += 1;
|
|
}
|
|
}
|
|
|
|
void GetPlot(JFJochProtoBuf::Plot &plot) {
|
|
std::unique_lock<std::mutex> ul(m);
|
|
|
|
for (int i = 0; i < sum.size(); i++) {
|
|
plot.add_x(static_cast<float>(i));
|
|
if (count[i] > 0)
|
|
plot.add_y(static_cast<float>(sum[i]) / count[i]);
|
|
else
|
|
plot.add_y(0);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
#endif //JUNGFRAUJOCH_HISTOGRAM_H
|