// Copyright (2019-2023) Paul Scherrer Institute #ifndef JUNGFRAUJOCH_HISTOGRAM_H #define JUNGFRAUJOCH_HISTOGRAM_H #include #include #include #include #include "Plot.h" template class Histogram { std::vector sum; std::vector count; std::mutex m; public: explicit Histogram(size_t bins) : sum(bins), count(bins) {} void Add(size_t bin, T val) { std::unique_lock ul(m); if (bin < sum.size()) { sum[bin] += val; count[bin] += 1; } } Plot GetPlot() { std::unique_lock ul(m); Plot ret; ret.x.resize(sum.size()); ret.y.resize(sum.size()); for (int i = 0; i < sum.size(); i++) { ret.x[i] = static_cast(i); if (count[i] > 0) ret.y[i] = static_cast(sum[i]) / count[i]; else ret.y[i] = 0; } return ret; } }; #endif //JUNGFRAUJOCH_HISTOGRAM_H