histogram/examples/guide_custom_accumulators_with_metadata.cpp

48 lines
1.2 KiB
C++

// Copyright 2019 Hans Dembinski
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//[ guide_custom_accumulators_with_metadata
#include <boost/histogram.hpp>
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
int main() {
using namespace boost::histogram;
// derive custom accumulator from one of the builtins
struct accumulator_with_metadata : accumulators::count<> {
std::string meta; // custom meta data
// arbitrary additional data and interface could be added here
};
// make 1D histogram with custom accmulator
auto h = make_histogram_with(dense_storage<accumulator_with_metadata>(),
axis::integer<>(1, 4));
// fill some weighted entries
auto x = {1, 0, 2, 1};
h.fill(x);
// assigning meta data to two bins
h[0].meta = "Foo";
h[2].meta = "Bar";
std::ostringstream os;
for (auto&& x : indexed(h))
os << x.bin() << " value " << x->value() << " meta " << x->meta << "\n";
std::cout << os.str() << std::flush;
assert(os.str() == "1 value 2 meta Foo\n"
"2 value 1 meta \n"
"3 value 0 meta Bar\n");
}
//]