Loading [MathJax]/extensions/tex2jax.js
Go to the documentation of this file.
20 #include <fmt/format.h>
21 #include <nlohmann/json.hpp>
23 #include <type_traits>
30 template <
typename Tuple,
typename Seq>
32 template <
typename Tuple,
size_t... I>
33 struct SubTuple<Tuple,
std::index_sequence<I...>> {
36 template <
typename Tuple,
unsigned int N>
37 using SubTuple_t =
typename SubTuple<Tuple, std::make_index_sequence<N>>
::type;
40 template <
typename T,
unsigned int ND,
typename = std::make_
integer_sequence<
unsigned int, ND>>
42 template <
typename T,
unsigned int ND,
unsigned int... S>
43 struct make_tuple<T, ND,
std::integer_sequence<unsigned int, S...>> {
44 template <
unsigned int>
48 template <
typename T,
unsigned int ND>
52 template <
typename AxisTupleType>
53 struct AxisToArithmetic;
54 template <
typename... Axis>
55 struct AxisToArithmetic<
std::tuple<Axis...>> {
58 template <
typename AxisTupleType>
60 template <
typename ProfArithmetic,
typename AxisTupleType>
71 fmt::format(
"Histogram title \'{}\' has whitespace at front or back -- please remove", sv ),
81 template <
typename Arithmetic>
91 template <
typename Arithmetic>
93 return v.first *
v.second;
101 template <
typename Arithmetic>
103 return v.first *
v.first *
v.second;
111 template <
typename Arithmetic>
122 template <
typename Arithmetic, atomicity Atomicity>
128 using InternalType = std::conditional_t<isAtomic, AtomicType, OutputType>;
131 return {
v.first.load( std::memory_order_relaxed ),
v.second.load( std::memory_order_relaxed ) };
138 return {
v.first.exchange( newv.first ),
v.second.exchange( newv.second ) };
140 return { std::exchange(
v.first, newv.first ), std::exchange(
v.second, newv.second ) };
150 a.second += b.second;
160 template <atomicity Atomicity,
typename Arithmetic>
162 :
GenericAccumulator<std::pair<Arithmetic, Arithmetic>, std::pair<unsigned long, Arithmetic>, Atomicity,
163 WeightedProfileTransform, ExtractWeight, WeightedAdder<Arithmetic, Atomicity>> {
167 using Base::operator+=;
170 *
this += { 1ul, weight };
183 template <atomicity Atomicity,
typename Arithmetic>
185 :
GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity, WeightedProduct> {
196 template <atomicity Atomicity,
typename Arithmetic =
double>
198 :
GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity, WeightedSquare> {
209 template <atomicity Atomicity,
typename Arithmetic>
218 template <atomicity Atomicity,
typename Arithmetic>
228 template <
typename Arithmetic>
244 :
Axis( (unsigned int)def.bins(), def.lowEdge(), def.highEdge(), def.
title() ) {}
247 unsigned int index( Arithmetic value )
const {
251 if constexpr ( std::is_integral_v<Arithmetic> ) {
256 return idx < 0 ? 0 : ( (
unsigned int)idx >
numBins() ?
numBins() + 1 : (
unsigned int)idx );
263 <<
"\"" << axis.
m_title <<
"\", (";
264 for (
auto const& label : axis.
m_labels ) { o <<
"\"" << label <<
"\", "; }
317 template <
typename Arithmetic>
322 {
"title", axis.
title() } };
341 template <
typename Arithmetic,
unsigned int NIndex>
345 template <
unsigned int NIndex,
typename... Elements>
350 template <
class... AxisType>
353 return computeIndexInternal<0,
std::tuple<AxisType...>>( axis );
355 template <
class... AxisType>
356 requires(
sizeof...( AxisType ) == NIndex )
358 return computeTotNBinsInternal<0,
std::tuple<AxisType...>>( axis );
361 template <
class... AxisType>
364 return inAcceptanceInternal<0,
std::tuple<AxisType...>>( axis );
368 template <
int N,
class Tuple>
369 unsigned int computeIndexInternal( Tuple
const& allAxis )
const {
371 auto const& axis = std::get<N>( allAxis );
372 unsigned int localIndex = axis.index( std::get<N>( *
this ) );
373 if constexpr (
N + 1 == NIndex )
376 return localIndex + ( axis.numBins() + 2 ) * computeIndexInternal<N + 1, Tuple>( allAxis );
378 template <
int N,
class Tuple>
379 static unsigned int computeTotNBinsInternal( Tuple
const& allAxis ) {
380 auto const& axis = std::get<N>( allAxis );
381 unsigned int localNBins = axis.numBins() + 2;
382 if constexpr (
N + 1 == NIndex )
385 return localNBins * computeTotNBinsInternal<N + 1, Tuple>( allAxis );
387 template <
int N,
class Tuple>
389 auto const& axis = std::get<N>( allAxis );
390 bool localAnswer = axis.inAcceptance( std::get<N>( *
this ) );
391 if constexpr (
N + 1 == NIndex )
394 return localAnswer || inAcceptanceInternal<N + 1, Tuple>( allAxis );
403 template <
typename ArithmeticTuple,
unsigned int NIndex,
typename WArithmetic>
407 template <
class... AxisType>
410 return this->first.computeIndex( axis );
412 template <
class... AxisType>
413 requires(
sizeof...( AxisType ) == NIndex )
418 template <
class... AxisType>
419 requires(
sizeof...( AxisType ) == NIndex )
421 return this->first.inAcceptance( axis );
470 template <
atomicity Atomicity,
typename InputType,
typename Arithmetic,
471 template <atomicity Ato,
typename Arith>
typename BaseAccumulatorT,
typename AxisTupleType>
473 template <atomicity,
typename,
typename,
template <atomicity,
typename>
typename,
typename>
486 template <atomicity ato>
501 template <atomicity ato>
509 [[nodiscard]]
auto operator[](
typename InputType::ValueType
v ) {
513 template <
unsigned int N>
515 return std::get<N>(
m_axis );
538 std::tuple_element_t<0, AxisTupleType>
const&
_getAxis(
size_t i,
541 fmt::format(
"Retrieving axis {} in Histogram of dimension {}", i, std::tuple_size_v<AxisTupleType> ) );
546 if ( i ==
N )
return std::get<N>(
m_axis );
563 template <atomicity Atomicity,
typename Arithmetic,
typename ND,
typename AxisTupleType>
573 template <atomicity Atomicity,
typename Arithmetic,
typename ND,
typename AxisTupleType>
584 template <atomicity Atomicity,
typename Arithmetic,
typename ND,
typename AxisTupleType>
595 template <atomicity Atomicity,
typename Arithmetic,
typename ND,
typename AxisTupleType>
658 template <
unsigned int ND,
atomicity Atomicity,
typename Arithmetic,
const char* Type,
659 template <atomicity,
typename,
typename,
typename>
typename Accumulator,
typename AxisTupleType>
661 template <
unsigned int ND,
atomicity Atomicity,
typename Arithmetic,
const char* Type,
662 template <atomicity,
typename,
typename,
typename>
typename Accumulator,
typename... AxisTypes>
664 :
public BufferableCounter<Atomicity, Accumulator, Arithmetic, std::integral_constant<unsigned int, ND>,
665 std::tuple<AxisTypes...>> {
670 using AccumulatorType = Accumulator<Atomicity, Arithmetic, NumberDimensions, AxisTupleType>;
676 template <
typename OWNER>
678 :
Parent( owner,
name, *this, axis ), m_title( title ) {
682 template <
typename OWNER>
686 template <
typename stream>
688 o << ND <<
"D Histogram with config ";
689 std::apply( [&o](
auto&&...
args ) { ( ( o <<
args <<
"\n" ), ... ); }, this->axis() );
693 return printImpl( o, tableFormat );
702 bins.
reserve( this->totNBins() );
703 unsigned long totNEntries{ 0 };
704 for (
unsigned int i = 0; i < this->totNBins(); i++ ) {
706 totNEntries += this->nEntries( i );
710 {
"title", m_title },
712 {
"empty", totNEntries == 0 },
713 {
"nEntries", totNEntries },
714 {
"axis", this->axis() },
732 typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
738 typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
744 typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
750 typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
auto operator[](typename InputType::ValueType v)
friend std::ostream & operator<<(std::ostream &o, Axis const &axis)
WeightedSquareAccumulator.
Arithmetic m_minValue
min and max values on this axis
unsigned int index(Arithmetic value) const
returns the bin number for a given value, ranging from 0 (underflow) to nBins+1 (overflow)
void requireValidTitle(std::string_view sv)
HistogramingAccumulatorInternal< Atomicity, WeightedHistoInputType< ProfileAxisToArithmetic_t< Arithmetic, AxisTupleType >, ND::value, Arithmetic >, Arithmetic, WeightedSigmaAccumulator, AxisTupleType > WeightedProfileHistogramingAccumulator
Class implementing a weighted profile histogram accumulator.
stream & printImpl(stream &o, bool) const
auto maxValue(unsigned int i) const
auto minValue(unsigned int i) const
Axis(unsigned int nBins=0, Arithmetic minValue=Arithmetic{}, Arithmetic maxValue=Arithmetic{}, std::string title={}, std::vector< std::string > labels={})
A base counter dealing with Histograms.
Arithmetic ArithmeticType
std::string const & title() const
std::conditional_t< isAtomic, AtomicType, OutputType > InternalType
constexpr char weightedHistogramString[]
unsigned int m_totNBins
total number of bins in this histogram, under and overflow included
Arithmetic sumOfWeights() const
HistogramingCounterBase(OWNER *owner, std::string const &name, std::string const &title, AxisTupleType axis)
This constructor takes the axis as a tuple.
HistogramingAccumulatorInternal(AxisTupleType axis)
virtual void to_json(nlohmann::json &j) const
Accumulator< Atomicity, Arithmetic, NumberDimensions, AxisTupleType > AccumulatorType
void setMaxValue(Arithmetic v)
AxisTupleType m_axis
set of Axis of this Histogram
SigmaAccumulatorBase< Atomicity, Arithmetic, WeightedAveragingAccumulator, WeightedSquareAccumulator > WeightedSigmaAccumulator
WeightedSigmaAccumulator.
constexpr char weightedProfilehistogramString[]
Axis(Gaudi::Histo1DDef const &def)
unsigned long nEntries() const
AveragingAccumulatorBase.
unsigned int numBins() const
HistogramingAccumulatorInternal< Atomicity, HistoInputType< ProfileAxisToArithmetic_t< Arithmetic, AxisTupleType >, ND::value >, Arithmetic, SigmaAccumulator, AxisTupleType > ProfileHistogramingAccumulator
Class implementing a profile histogram accumulator.
constexpr char profilehistogramString[]
static constexpr OutputType DefaultValue()
std::vector< std::string > m_labels
labels for the bins
SigmaAccumulatorBase< Atomicity, Arithmetic, AveragingAccumulator, SquareAccumulator > SigmaAccumulator
SigmaAccumulator.
std::string const m_title
static constexpr OutputType getValue(const InternalType &v) noexcept
void setNumBins(unsigned int n)
std::vector< std::string > const labels() const
unsigned int nBins
number of bins for this Axis FIXME : should be private and called m_nBins but will break backward com...
std::string const & title() const
typename std::tuple_element< 0, AxisTupleType >::type::ArithmeticType AxisArithmeticType
for backward compatibility with previous implementation, should not be used FIXME
auto binValue(unsigned int i) const
friend class GenericAccumulator
friend void mergeAndReset(HistogramingCounterBase &h, HistogramingCounterBase &o)
std::unique_ptr< BaseAccumulator[]> m_value
Histogram content.
static RegularType exchange(InternalType &v, RegularType newv) noexcept
An Adder ValueHandler, taking weight into account and computing a count plus the sum of the weights I...
bool inAcceptance(Arithmetic value) const
says whether the given value is within the range of the axis
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
void setTitle(std::string const &t)
Generic Accumulator, templated by.
std::tuple_element_t< 0, AxisTupleType > const & _getAxis(size_t i, typename std::tuple_size< AxisTupleType >::type) const
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
void to_json(nlohmann::json &j, const Axis< Arithmetic > &axis)
automatic conversion of the Axis type to json
BaseAccumulatorT< Atomicity, Arithmetic > BaseAccumulator
A Product functor, take a pair (value, weight) as input.
An empty ancester of all counters that provides a buffer method that returns a buffer on itself Also ...
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Internal Accumulator class dealing with Histograming.
static constexpr bool isAtomic
friend void reset(HistogramingCounterBase &c)
auto nEntries(unsigned int i) const
Arithmetic maxValue() const
std::pair< unsigned long, Arithmetic > RegularType
A WeightedSquare functor, take a pair (value, weight) as input.
HistogramingAccumulatorInternal(construct_empty_t, const HistogramingAccumulatorInternal< ato, InputType, Arithmetic, BaseAccumulatorT, AxisTupleType > &other)
std::string m_title
title of this axis
friend class HistogramingAccumulatorInternal
Buffer is a non atomic Accumulator which, when it goes out-of-scope, updates the underlying thread-sa...
HistogramingAccumulatorInternal< Atomicity, WeightedHistoInputType< AxisToArithmetic_t< AxisTupleType >, ND::value, Arithmetic >, Arithmetic, WeightedCountAccumulator, AxisTupleType > WeightedHistogramingAccumulator
Class implementing a weighted histogram accumulator.
atomicity
Defines atomicity of the accumulators.
void fetch_add(AtomicType &atVar, Arithmetic value)
generic fetch_add, also dealing with atomic types with no fetch_add member method
Arithmetic minValue() const
constant used to disambiguate construction of an empty Accumulator versus the copy constructor.
WeightedCountAccumulator.
requires(is_optional_v< OptOut >) void put(const OutHandle &out_handle
void setMinValue(Arithmetic v)
constexpr static const auto FAILURE
friend void to_json(nlohmann::json &j, HistogramingCounterBase const &h)
HistogramingAccumulatorInternal< Atomicity, HistoInputType< AxisToArithmetic_t< AxisTupleType >, ND::value >, unsigned long, IntegralAccumulator, AxisTupleType > HistogramingAccumulator
Class implementing a regular histogram accumulator.
BaseAccumulator & accumulator(unsigned int index) const
HistogramingAccumulatorInternal & operator+=(InputType v)
constexpr char histogramString[]
Arithmetic m_ratio
precomputed ratio to convert a value into bin number equal to nBins/(maxValue-minValue).
WeightedCountAccumulator operator+=(const Arithmetic weight)
overload of operator+= to be able to only give weight and no value
typename AccumulatorType::AxisTupleArithmeticType AxisTupleArithmeticType
Definition of a default type of Histogram Axis It contains number of bins, min and max value plus a t...
void mergeAndReset(HistogramingAccumulatorInternal< ato, InputType, Arithmetic, BaseAccumulatorT, AxisTupleType > &other)
HistogramingCounterBase(OWNER *owner, std::string const &name, std::string const &title, AxisTypes... allAxis)
This constructor takes the axis one by one, when ND >= 2. If ND = 1, the other one can be used.
typename InputType::ValueType AxisTupleArithmeticType
size_t index(const Gaudi::ParticleProperty *property, const Gaudi::Interfaces::IParticlePropertySvc *service)
helper utility for mapping of Gaudi::ParticleProperty object into non-negative integral sequential id...
static void merge(InternalType &a, RegularType b) noexcept
return _getAxis(i, std::integral_constant< size_t, N+1 >())
requires(std::tuple_size_v< AxisTupleType > !=N) auto &_getAxis(size_t i
auto nBins(unsigned int i) const