The Gaudi Framework  v39r0 (5b8b5eda)
StaticHistogram.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
13 #include <Gaudi/Accumulators.h>
14 #include <Gaudi/MonitoringHub.h>
15 #include <GaudiKernel/HistoDef.h>
16 
17 #include <array>
18 #include <cmath>
19 #include <fmt/format.h>
20 #include <nlohmann/json.hpp>
21 #include <string>
22 #include <type_traits>
23 #include <utility>
24 #include <vector>
25 
26 namespace {
27  // Helper class creating a "subtuple" type from a tuple type by keeping only
28  // the first N items.
29  template <typename Tuple, typename Seq>
30  struct SubTuple;
31  template <typename Tuple, size_t... I>
32  struct SubTuple<Tuple, std::index_sequence<I...>> {
33  using type = decltype( std::make_tuple( std::get<I>( std::declval<Tuple>() )... ) );
34  };
35  template <typename Tuple, unsigned int N>
36  using SubTuple_t = typename SubTuple<Tuple, std::make_index_sequence<N>>::type;
37 
39  template <typename T, unsigned int ND, typename = std::make_integer_sequence<unsigned int, ND>>
40  struct make_tuple;
41  template <typename T, unsigned int ND, unsigned int... S>
42  struct make_tuple<T, ND, std::integer_sequence<unsigned int, S...>> {
43  template <unsigned int>
44  using typeMap = T;
45  using type = std::tuple<typeMap<S>...>;
46  };
47  template <typename T, unsigned int ND>
48  using make_tuple_t = typename make_tuple<T, ND>::type;
49 
51  template <typename AxisTupleType>
52  struct AxisToArithmetic;
53  template <typename... Axis>
54  struct AxisToArithmetic<std::tuple<Axis...>> {
55  using type = std::tuple<typename Axis::ArithmeticType...>;
56  };
57  template <typename AxisTupleType>
58  using AxisToArithmetic_t = typename AxisToArithmetic<AxisTupleType>::type;
59  template <typename ProfArithmetic, typename AxisTupleType>
60  using ProfileAxisToArithmetic_t = decltype( std::tuple_cat( std::declval<AxisToArithmetic_t<AxisTupleType>>(),
62 } // namespace
63 
64 namespace Gaudi::Accumulators {
65 
66  namespace details {
67  inline void requireValidTitle( std::string_view sv ) {
68  if ( !sv.empty() && ( std::isspace( sv.back() ) || std::isspace( sv.front() ) ) ) {
69  throw GaudiException(
70  fmt::format( "Histogram title \'{}\' has whitespace at front or back -- please remove", sv ),
71  "Gaudi::Accumulators", StatusCode::FAILURE );
72  }
73  }
74  } // namespace details
75 
79  struct ExtractWeight {
80  template <typename Arithmetic>
81  constexpr decltype( auto ) operator()( const std::pair<unsigned long, Arithmetic>& v ) const noexcept {
82  return v.second;
83  }
84  };
85 
89  struct WeightedProduct {
90  template <typename Arithmetic>
91  constexpr decltype( auto ) operator()( const std::pair<Arithmetic, Arithmetic>& v ) const noexcept {
92  return v.first * v.second;
93  }
94  };
95 
99  struct WeightedSquare {
100  template <typename Arithmetic>
101  constexpr decltype( auto ) operator()( const std::pair<Arithmetic, Arithmetic>& v ) const noexcept {
102  return v.first * v.first * v.second;
103  }
104  };
105 
111  template <typename Arithmetic, atomicity Atomicity>
112  struct WeightedAdder {
116  static constexpr bool isAtomic = Atomicity == atomicity::full;
117  using InternalType = std::conditional_t<isAtomic, AtomicType, OutputType>;
118  static constexpr OutputType getValue( const InternalType& v ) noexcept {
119  if constexpr ( isAtomic ) {
120  return { v.first.load( std::memory_order_relaxed ), v.second.load( std::memory_order_relaxed ) };
121  } else {
122  return v;
123  }
124  };
125  static RegularType exchange( InternalType& v, RegularType newv ) noexcept {
126  if constexpr ( isAtomic ) {
127  return { v.first.exchange( newv.first ), v.second.exchange( newv.second ) };
128  } else {
129  return { std::exchange( v.first, newv.first ), std::exchange( v.second, newv.second ) };
130  }
131  }
132  static constexpr OutputType DefaultValue() { return { 0, Arithmetic{} }; }
133  static void merge( InternalType& a, RegularType b ) noexcept {
134  if constexpr ( isAtomic ) {
135  fetch_add( a.first, b.first );
136  fetch_add( a.second, b.second );
137  } else {
138  a.first += b.first;
139  a.second += b.second;
140  }
141  };
142  };
143 
149  template <atomicity Atomicity, typename Arithmetic>
151  : GenericAccumulator<std::pair<Arithmetic, Arithmetic>, std::pair<unsigned long, Arithmetic>, Atomicity, Identity,
152  ExtractWeight, WeightedAdder<Arithmetic, Atomicity>> {
155  using Base::Base;
156  using Base::operator+=;
158  WeightedCountAccumulator operator+=( const Arithmetic weight ) {
159  *this += { 1ul, weight };
160  return *this;
161  }
162  unsigned long nEntries() const { return this->rawValue().first; }
163  Arithmetic sumOfWeights() const { return this->rawValue().second; }
164  };
165 
172  template <atomicity Atomicity, typename Arithmetic>
174  : GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity, WeightedProduct> {
175  using GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity,
177  Arithmetic sum() const { return this->value(); }
178  };
179 
185  template <atomicity Atomicity, typename Arithmetic = double>
187  : GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity, WeightedSquare> {
188  using GenericAccumulator<std::pair<Arithmetic, Arithmetic>, Arithmetic, Atomicity,
190  Arithmetic sum2() const { return this->value(); };
191  };
192 
198  template <atomicity Atomicity, typename Arithmetic>
201 
207  template <atomicity Atomicity, typename Arithmetic>
210 
217  template <typename Arithmetic>
218  class Axis {
219  public:
220  using ArithmeticType = Arithmetic;
221  Axis( unsigned int nBins = 0, Arithmetic minValue = Arithmetic{}, Arithmetic maxValue = Arithmetic{},
223  : m_title( std::move( title ) )
224  , nBins( nBins )
225  , m_minValue( minValue )
226  , m_maxValue( maxValue )
227  , m_labels( std::move( labels ) ) {
229  recomputeRatio();
230  for ( const auto& s : m_labels ) details::requireValidTitle( s );
231  };
232  explicit Axis( Gaudi::Histo1DDef const& def )
233  : Axis( (unsigned int)def.bins(), def.lowEdge(), def.highEdge(), def.title() ){};
234 
236  unsigned int index( Arithmetic value ) const {
237  // In case we use integer as Arithmetic type, we cannot use ratio for computing indices,
238  // as ratios < 1.0 will simply be 0, so we have to pay the division in such a case
239  int idx;
240  if constexpr ( std::is_integral_v<Arithmetic> ) {
241  idx = ( ( value - m_minValue ) * nBins / ( m_maxValue - m_minValue ) ) + 1;
242  } else {
243  idx = std::floor( ( value - m_minValue ) * m_ratio ) + 1;
244  }
245  return idx < 0 ? 0 : ( (unsigned int)idx > numBins() ? numBins() + 1 : (unsigned int)idx );
246  }
247 
248  friend std::ostream& operator<<( std::ostream& o, Axis const& axis ) {
249  // Note that we print python code here, as the generic toStream implementation uses this
250  // operator to generate python code.
251  o << "(" << axis.numBins() << ", " << axis.minValue() << ", " << axis.maxValue() << ", "
252  << "\"" << axis.m_title << "\", (";
253  for ( auto const& label : axis.m_labels ) { o << "\"" << label << "\", "; }
254  return o << "))";
255  }
256 
258  bool inAcceptance( Arithmetic value ) const { return value >= m_minValue && value <= m_maxValue; }
259 
260  // accessors
261  unsigned int numBins() const { return nBins; };
262  void setNumBins( unsigned int n ) {
263  nBins = n;
264  recomputeRatio();
265  }
266  Arithmetic minValue() const { return m_minValue; };
267  void setMinValue( Arithmetic v ) {
268  m_minValue = v;
269  recomputeRatio();
270  }
271  Arithmetic maxValue() const { return m_maxValue; };
272  void setMaxValue( Arithmetic v ) {
273  m_maxValue = v;
274  recomputeRatio();
275  }
276  std::string const& title() const { return m_title; }
277  void setTitle( std::string const& t ) { m_title = t; };
278  std::vector<std::string> const labels() const { return m_labels; }
279 
280  private:
283 
284  public:
287  unsigned int nBins;
288 
289  private:
291  Arithmetic m_minValue, m_maxValue;
296  Arithmetic m_ratio;
299 
300  void recomputeRatio() {
301  m_ratio = ( m_maxValue == m_minValue ) ? Arithmetic{} : nBins / ( m_maxValue - m_minValue );
302  }
303  };
304 
306  template <typename Arithmetic>
307  void to_json( nlohmann::json& j, const Axis<Arithmetic>& axis ) {
308  j = nlohmann::json{ { "nBins", axis.numBins() },
309  { "minValue", axis.minValue() },
310  { "maxValue", axis.maxValue() },
311  { "title", axis.title() } };
312  if ( !axis.labels().empty() ) { j["labels"] = axis.labels(); }
313  }
314 
330  template <typename Arithmetic, unsigned int NIndex>
331  struct HistoInputType : HistoInputType<make_tuple_t<Arithmetic, NIndex>, NIndex> {
333  };
334  template <unsigned int NIndex, typename... Elements>
335  struct HistoInputType<std::tuple<Elements...>, NIndex> : std::tuple<Elements...> {
336  using InternalType = std::tuple<Elements...>;
338  using std::tuple<Elements...>::tuple;
339  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
340  unsigned int computeIndex( std::tuple<AxisType...> const& axis ) const {
341  return computeIndexInternal<0, std::tuple<AxisType...>>( axis );
342  }
343  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
344  static unsigned int computeTotNBins( std::tuple<AxisType...> const& axis ) {
345  return computeTotNBinsInternal<0, std::tuple<AxisType...>>( axis );
346  }
347  auto forInternalCounter() const { return 1ul; }
348  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
349  bool inAcceptance( std::tuple<AxisType...> const& axis ) const {
350  return inAcceptanceInternal<0, std::tuple<AxisType...>>( axis );
351  }
352 
353  private:
354  template <int N, class Tuple>
355  unsigned int computeIndexInternal( Tuple const& allAxis ) const {
356  // compute global index. Bins are stored in a column first manner
357  auto const& axis = std::get<N>( allAxis );
358  unsigned int localIndex = axis.index( std::get<N>( *this ) );
359  if constexpr ( N + 1 == NIndex )
360  return localIndex;
361  else
362  return localIndex + ( axis.numBins() + 2 ) * computeIndexInternal<N + 1, Tuple>( allAxis );
363  }
364  template <int N, class Tuple>
365  static unsigned int computeTotNBinsInternal( Tuple const& allAxis ) {
366  auto const& axis = std::get<N>( allAxis );
367  unsigned int localNBins = axis.numBins() + 2;
368  if constexpr ( N + 1 == NIndex )
369  return localNBins;
370  else
371  return localNBins * computeTotNBinsInternal<N + 1, Tuple>( allAxis );
372  }
373  template <int N, class Tuple>
374  bool inAcceptanceInternal( Tuple const& allAxis ) const {
375  auto const& axis = std::get<N>( allAxis );
376  bool localAnswer = axis.inAcceptance( std::get<N>( *this ) );
377  if constexpr ( N + 1 == NIndex )
378  return localAnswer;
379  else
380  return localAnswer || inAcceptanceInternal<N + 1, Tuple>( allAxis );
381  }
382  };
383 
389  template <typename ArithmeticTuple, unsigned int NIndex, typename WArithmetic>
390  struct WeightedHistoInputType : std::pair<HistoInputType<ArithmeticTuple, NIndex>, WArithmetic> {
393  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
394  unsigned int computeIndex( std::tuple<AxisType...> const& axis ) const {
395  return this->first.computeIndex( axis );
396  }
397  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
398  static unsigned int computeTotNBins( std::tuple<AxisType...> const& axis ) {
400  }
401  auto forInternalCounter() const { return std::pair( this->first.forInternalCounter(), this->second ); }
402  template <class... AxisType, typename = typename std::enable_if_t<( sizeof...( AxisType ) == NIndex )>>
403  bool inAcceptance( std::tuple<AxisType...> const& axis ) const {
404  return this->first.inAcceptance( axis );
405  }
406  };
407 
453  template <atomicity Atomicity, typename InputType, typename Arithmetic,
454  template <atomicity Ato, typename Arith> typename BaseAccumulatorT, typename AxisTupleType>
456  template <atomicity, typename, typename, template <atomicity, typename> typename, typename>
458 
459  public:
461  using BaseAccumulator = BaseAccumulatorT<Atomicity, Arithmetic>;
462  using AxisTupleArithmeticType = typename InputType::ValueType;
464  : m_axis{ axis }
465  , m_totNBins{ InputType::computeTotNBins( m_axis ) }
467  reset();
468  }
469  template <atomicity ato>
473  : m_axis( other.m_axis ), m_totNBins{ other.m_totNBins }, m_value( new BaseAccumulator[m_totNBins] ) {
474  reset();
475  }
476  [[deprecated( "Use `++h1[x]`, `++h2[{x,y}]`, etc. instead." )]] HistogramingAccumulatorInternal&
477  operator+=( InputType v ) {
478  accumulator( v.computeIndex( m_axis ) ) += v.forInternalCounter();
479  return *this;
480  }
481  void reset() {
482  for ( unsigned int index = 0; index < m_totNBins; index++ ) accumulator( index ).reset();
483  }
484  template <atomicity ato>
487  assert( m_totNBins == other.m_totNBins );
488  for ( unsigned int index = 0; index < m_totNBins; index++ ) {
489  accumulator( index ).mergeAndReset( other.accumulator( index ) );
490  }
491  }
492  [[nodiscard]] auto operator[]( typename InputType::ValueType v ) {
494  }
495 
496  template <unsigned int N>
497  auto& axis() const {
498  return std::get<N>( m_axis );
499  }
500  auto& axis() const { return m_axis; }
501  auto binValue( unsigned int i ) const { return accumulator( i ).value(); }
502  auto nEntries( unsigned int i ) const { return accumulator( i ).nEntries(); }
503  auto totNBins() const { return m_totNBins; }
504 
505  // FIXME These methods are there for backwrad compatibility with previous implementation
506  // where all Axis had to be of type Axis<...> and were stored in an array
507  // Newer code should call axis<N>().foo for whatever foo is defined in that axis type
508  auto nBins( unsigned int i ) const { return _getAxis( i, std::integral_constant<size_t, 0>() ).numBins(); }
509  auto minValue( unsigned int i ) const { return _getAxis( i, std::integral_constant<size_t, 0>() ).minValue(); }
510  auto maxValue( unsigned int i ) const { return _getAxis( i, std::integral_constant<size_t, 0>() ).maxValue(); }
511 
512  private:
513  BaseAccumulator& accumulator( unsigned int index ) const {
514  assert( index < m_totNBins );
515  return m_value[index];
516  }
517 
518  // FIXME Only used for backward compatibility. should be dropped at some stage
519  // Can only work if all axis have same type, which is no more the case
520  std::tuple_element_t<0, AxisTupleType> const& _getAxis( size_t i,
521  typename std::tuple_size<AxisTupleType>::type ) const {
522  throw std::logic_error(
523  fmt::format( "Retrieving axis {} in Histogram of dimension {}", i, std::tuple_size_v<AxisTupleType> ) );
524  }
525  template <size_t N, typename = std::enable_if_t<std::tuple_size_v<AxisTupleType> != N>>
526  auto& _getAxis( size_t i, std::integral_constant<size_t, N> ) const {
527  if ( i == N ) return std::get<N>( m_axis );
529  }
530 
532  AxisTupleType m_axis;
534  unsigned int m_totNBins;
537  };
538 
544  template <atomicity Atomicity, typename Arithmetic, typename ND, typename AxisTupleType>
547  unsigned long, IntegralAccumulator, AxisTupleType>;
548 
554  template <atomicity Atomicity, typename Arithmetic, typename ND, typename AxisTupleType>
558  Arithmetic, WeightedCountAccumulator, AxisTupleType>;
559 
565  template <atomicity Atomicity, typename Arithmetic, typename ND, typename AxisTupleType>
569  Arithmetic, SigmaAccumulator, AxisTupleType>;
570 
576  template <atomicity Atomicity, typename Arithmetic, typename ND, typename AxisTupleType>
579  Arithmetic, WeightedSigmaAccumulator, AxisTupleType>;
580 
639  template <unsigned int ND, atomicity Atomicity, typename Arithmetic, const char* Type,
640  template <atomicity, typename, typename, typename> typename Accumulator, typename AxisTupleType>
642  template <unsigned int ND, atomicity Atomicity, typename Arithmetic, const char* Type,
643  template <atomicity, typename, typename, typename> typename Accumulator, typename... AxisTypes>
644  class HistogramingCounterBase<ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple<AxisTypes...>>
645  : public BufferableCounter<Atomicity, Accumulator, Arithmetic, std::integral_constant<unsigned int, ND>,
646  std::tuple<AxisTypes...>> {
647  public:
648  using AxisTupleType = std::tuple<AxisTypes...>;
651  using AccumulatorType = Accumulator<Atomicity, Arithmetic, NumberDimensions, AxisTupleType>;
652  using AxisTupleArithmeticType = typename AccumulatorType::AxisTupleArithmeticType;
654  using AxisArithmeticType = typename std::tuple_element<0, AxisTupleType>::type::ArithmeticType;
655  inline static const std::string typeString{ std::string{ Type } + ':' + typeid( Arithmetic ).name() };
657  template <typename OWNER>
658  HistogramingCounterBase( OWNER* owner, std::string const& name, std::string const& title, AxisTupleType axis )
659  : Parent( owner, name, *this, axis ), m_title( title ) {
660  details::requireValidTitle( m_title );
661  }
663  template <typename OWNER>
664  HistogramingCounterBase( OWNER* owner, std::string const& name, std::string const& title, AxisTypes... allAxis )
665  : HistogramingCounterBase( owner, name, title, std::make_tuple( allAxis... ) ) {}
666  using Parent::print;
667  template <typename stream>
668  stream& printImpl( stream& o, bool /*tableFormat*/ ) const {
669  o << ND << "D Histogram with config ";
670  std::apply( [&o]( auto&&... args ) { ( ( o << args << "\n" ), ... ); }, this->axis() );
671  return o;
672  }
673  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
674  return printImpl( o, tableFormat );
675  }
676  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
677  friend void reset( HistogramingCounterBase& c ) { c.reset(); }
678  friend void mergeAndReset( HistogramingCounterBase& h, HistogramingCounterBase& o ) { h.mergeAndReset( o ); }
679  friend void to_json( nlohmann::json& j, HistogramingCounterBase const& h ) { h.to_json( j ); }
680  virtual void to_json( nlohmann::json& j ) const {
681  // get all bin values and compute total nbEntries
683  bins.reserve( this->totNBins() );
684  unsigned long totNEntries{ 0 };
685  for ( unsigned int i = 0; i < this->totNBins(); i++ ) {
686  bins.push_back( this->binValue( i ) );
687  totNEntries += this->nEntries( i );
688  }
689  // build json
690  j = { { "type", std::string( Type ) + ":" + typeid( Arithmetic ).name() },
691  { "title", m_title },
692  { "dimension", ND },
693  { "empty", totNEntries == 0 },
694  { "nEntries", totNEntries },
695  { "axis", this->axis() },
696  { "bins", bins } };
697  }
698  std::string const& title() const { return m_title; }
699 
700  protected:
702  };
703 
704  namespace naming {
705  inline constexpr char histogramString[] = "histogram:Histogram";
706  inline constexpr char weightedHistogramString[] = "histogram:WeightedHistogram";
707  inline constexpr char profilehistogramString[] = "histogram:ProfileHistogram";
708  inline constexpr char weightedProfilehistogramString[] = "histogram:WeightedProfileHistogram";
709  } // namespace naming
710 
712  template <unsigned int ND, atomicity Atomicity = atomicity::full, typename Arithmetic = double,
713  typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
715  HistogramingAccumulator, AxisTupleType>;
716 
718  template <unsigned int ND, atomicity Atomicity = atomicity::full, typename Arithmetic = double,
719  typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
721  WeightedHistogramingAccumulator, AxisTupleType>;
722 
724  template <unsigned int ND, atomicity Atomicity = atomicity::full, typename Arithmetic = double,
725  typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
727  ProfileHistogramingAccumulator, AxisTupleType>;
728 
730  template <unsigned int ND, atomicity Atomicity = atomicity::full, typename Arithmetic = double,
731  typename AxisTupleType = make_tuple_t<Axis<Arithmetic>, ND>>
735 
736 } // namespace Gaudi::Accumulators
Gaudi::Accumulators::HistogramingAccumulatorInternal::operator[]
auto operator[](typename InputType::ValueType v)
Definition: StaticHistogram.h:492
Gaudi::Accumulators::ExtractWeight
A functor to extract weight, take a pair (valueTuple, weight) as input.
Definition: StaticHistogram.h:79
Gaudi::Accumulators::Axis::operator<<
friend std::ostream & operator<<(std::ostream &o, Axis const &axis)
Definition: StaticHistogram.h:248
std::floor
T floor(T... args)
std::make_tuple
T make_tuple(T... args)
std::integral_constant
Gaudi::Accumulators::WeightedSquareAccumulator
WeightedSquareAccumulator.
Definition: StaticHistogram.h:187
Write.stream
stream
Definition: Write.py:32
Gaudi::Accumulators::Axis::m_minValue
Arithmetic m_minValue
min and max values on this axis
Definition: StaticHistogram.h:291
std::string
STL class.
Gaudi::Accumulators::Axis::index
unsigned int index(Arithmetic value) const
returns the bin number for a given value, ranging from 0 (underflow) to nBins+1 (overflow)
Definition: StaticHistogram.h:236
IOTest.N
N
Definition: IOTest.py:112
Gaudi::Accumulators::details::requireValidTitle
void requireValidTitle(std::string_view sv)
Definition: StaticHistogram.h:67
std::move
T move(T... args)
Gaudi::Accumulators::WeightedProfileHistogramingAccumulator
HistogramingAccumulatorInternal< Atomicity, WeightedHistoInputType< ProfileAxisToArithmetic_t< Arithmetic, AxisTupleType >, ND::value, Arithmetic >, Arithmetic, WeightedSigmaAccumulator, AxisTupleType > WeightedProfileHistogramingAccumulator
Class implementing a weighted profile histogram accumulator.
Definition: StaticHistogram.h:579
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::printImpl
stream & printImpl(stream &o, bool) const
Definition: StaticHistogram.h:668
MonitoringHub.h
Gaudi::Accumulators::GenericAccumulator< std::pair< Arithmetic, Arithmetic >, std::pair< unsigned long, Arithmetic >, Atomicity, Identity, ExtractWeight, WeightedAdder< Arithmetic, Atomicity > >::rawValue
auto rawValue() const
Definition: Accumulators.h:514
Gaudi::Accumulators::HistogramingAccumulatorInternal::maxValue
auto maxValue(unsigned int i) const
Definition: StaticHistogram.h:510
std::pair
Gaudi::Accumulators::HistogramingAccumulatorInternal::minValue
auto minValue(unsigned int i) const
Definition: StaticHistogram.h:509
std::vector::reserve
T reserve(T... args)
Gaudi::Accumulators::atomicity::full
@ full
Gaudi::Accumulators::Axis::Axis
Axis(unsigned int nBins=0, Arithmetic minValue=Arithmetic{}, Arithmetic maxValue=Arithmetic{}, std::string title={}, std::vector< std::string > labels={})
Definition: StaticHistogram.h:221
gaudirun.s
string s
Definition: gaudirun.py:346
std::vector< std::string >
Gaudi::Accumulators::HistogramingCounterBase
A base counter dealing with Histograms.
Definition: StaticHistogram.h:641
Gaudi::Accumulators::Axis::ArithmeticType
Arithmetic ArithmeticType
Definition: StaticHistogram.h:220
Gaudi::Accumulators::Axis::title
std::string const & title() const
Definition: StaticHistogram.h:276
Gaudi::Accumulators::IntegralAccumulator
IntegralAccumulator.
Definition: Accumulators.h:640
jsonFromLHCbLog.json
json
Definition: jsonFromLHCbLog.py:86
Gaudi::Accumulators::WeightedAdder::InternalType
std::conditional_t< isAtomic, AtomicType, OutputType > InternalType
Definition: StaticHistogram.h:117
GaudiException
Definition: GaudiException.h:31
Gaudi::Accumulators::naming::weightedHistogramString
constexpr char weightedHistogramString[]
Definition: StaticHistogram.h:706
Gaudi::Accumulators::HistogramingAccumulatorInternal::m_totNBins
unsigned int m_totNBins
total number of bins in this histogram, under and overflow included
Definition: StaticHistogram.h:534
Gaudi::Accumulators::WeightedCountAccumulator::sumOfWeights
Arithmetic sumOfWeights() const
Definition: StaticHistogram.h:163
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::HistogramingCounterBase
HistogramingCounterBase(OWNER *owner, std::string const &name, std::string const &title, AxisTupleType axis)
This constructor takes the axis as a tuple.
Definition: StaticHistogram.h:658
Gaudi::Accumulators::WeightedSumAccumulator::sum
Arithmetic sum() const
Definition: StaticHistogram.h:177
Gaudi::Accumulators::HistogramingAccumulatorInternal::HistogramingAccumulatorInternal
HistogramingAccumulatorInternal(AxisTupleType axis)
Definition: StaticHistogram.h:463
std::tuple
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::to_json
virtual void to_json(nlohmann::json &j) const
Definition: StaticHistogram.h:680
gaudirun.c
c
Definition: gaudirun.py:525
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::AccumulatorType
Accumulator< Atomicity, Arithmetic, NumberDimensions, AxisTupleType > AccumulatorType
Definition: StaticHistogram.h:651
Gaudi::Accumulators::Axis::setMaxValue
void setMaxValue(Arithmetic v)
Definition: StaticHistogram.h:272
Gaudi::Accumulators::HistogramingAccumulatorInternal::m_axis
AxisTupleType m_axis
set of Axis of this Histogram
Definition: StaticHistogram.h:532
Gaudi::Accumulators::WeightedSigmaAccumulator
SigmaAccumulatorBase< Atomicity, Arithmetic, WeightedAveragingAccumulator, WeightedSquareAccumulator > WeightedSigmaAccumulator
WeightedSigmaAccumulator.
Definition: StaticHistogram.h:209
Gaudi::Accumulators::naming::weightedProfilehistogramString
constexpr char weightedProfilehistogramString[]
Definition: StaticHistogram.h:708
Gaudi::Accumulators::WeightedHistoInputType::inAcceptance
bool inAcceptance(std::tuple< AxisType... > const &axis) const
Definition: StaticHistogram.h:403
Gaudi::Accumulators::Axis::Axis
Axis(Gaudi::Histo1DDef const &def)
Definition: StaticHistogram.h:232
Gaudi::Accumulators::HistogramingAccumulatorInternal::axis
auto & axis() const
Definition: StaticHistogram.h:497
Gaudi::Accumulators::WeightedCountAccumulator::nEntries
unsigned long nEntries() const
Definition: StaticHistogram.h:162
Gaudi::Accumulators::AveragingAccumulatorBase
AveragingAccumulatorBase.
Definition: Accumulators.h:752
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::computeTotNBins
static unsigned int computeTotNBins(std::tuple< AxisType... > const &axis)
Definition: StaticHistogram.h:344
Gaudi::Accumulators::Axis::numBins
unsigned int numBins() const
Definition: StaticHistogram.h:261
Gaudi::Accumulators::WeightedSumAccumulator
WeightedSumAccumulator.
Definition: StaticHistogram.h:174
Gaudi::Accumulators::ProfileHistogramingAccumulator
HistogramingAccumulatorInternal< Atomicity, HistoInputType< ProfileAxisToArithmetic_t< Arithmetic, AxisTupleType >, ND::value >, Arithmetic, SigmaAccumulator, AxisTupleType > ProfileHistogramingAccumulator
Class implementing a profile histogram accumulator.
Definition: StaticHistogram.h:569
Gaudi::Accumulators::naming::profilehistogramString
constexpr char profilehistogramString[]
Definition: StaticHistogram.h:707
Gaudi::Accumulators::WeightedAdder::DefaultValue
static constexpr OutputType DefaultValue()
Definition: StaticHistogram.h:132
Gaudi::Accumulators::WeightedHistoInputType::computeTotNBins
static unsigned int computeTotNBins(std::tuple< AxisType... > const &axis)
Definition: StaticHistogram.h:398
HistoDef.h
Gaudi::Accumulators::Axis::m_labels
std::vector< std::string > m_labels
labels for the bins
Definition: StaticHistogram.h:298
Gaudi::Accumulators::SigmaAccumulator
SigmaAccumulatorBase< Atomicity, Arithmetic, AveragingAccumulator, SquareAccumulator > SigmaAccumulator
SigmaAccumulator.
Definition: Accumulators.h:832
std::vector::push_back
T push_back(T... args)
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::m_title
std::string const m_title
Definition: StaticHistogram.h:701
Gaudi::Accumulators::WeightedAdder::getValue
static constexpr OutputType getValue(const InternalType &v) noexcept
Definition: StaticHistogram.h:118
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::computeIndex
unsigned int computeIndex(std::tuple< AxisType... > const &axis) const
Definition: StaticHistogram.h:340
Gaudi::Accumulators::Axis::setNumBins
void setNumBins(unsigned int n)
Definition: StaticHistogram.h:262
bug_34121.t
t
Definition: bug_34121.py:31
Gaudi::Histo1DDef
Definition: HistoDef.h:41
Gaudi::Accumulators::HistoInputType
small class used as InputType for regular Histograms basically a tuple of the given values,...
Definition: StaticHistogram.h:331
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::computeTotNBinsInternal
static unsigned int computeTotNBinsInternal(Tuple const &allAxis)
Definition: StaticHistogram.h:365
details
Definition: AnyDataWrapper.h:19
Gaudi::Accumulators::Axis::labels
std::vector< std::string > const labels() const
Definition: StaticHistogram.h:278
Gaudi::Accumulators::Axis::nBins
unsigned int nBins
number of bins for this Axis FIXME : should be private and called m_nBins but will break backward com...
Definition: StaticHistogram.h:287
Gaudi::Accumulators::HistogramingAccumulatorInternal::totNBins
auto totNBins() const
Definition: StaticHistogram.h:503
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::title
std::string const & title() const
Definition: StaticHistogram.h:698
ProduceConsume.j
j
Definition: ProduceConsume.py:101
std::ostream
STL class.
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::AxisArithmeticType
typename std::tuple_element< 0, AxisTupleType >::type::ArithmeticType AxisArithmeticType
for backward compatibility with previous implementation, should not be used FIXME
Definition: StaticHistogram.h:654
Gaudi::Accumulators::HistogramingAccumulatorInternal::binValue
auto binValue(unsigned int i) const
Definition: StaticHistogram.h:501
AlgSequencer.h
h
Definition: AlgSequencer.py:31
Gaudi::Accumulators::WeightedHistoInputType
small class used as InputType for weighted Histograms only a pair of the InnerType and the weight.
Definition: StaticHistogram.h:390
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::forInternalCounter
auto forInternalCounter() const
Definition: StaticHistogram.h:347
Gaudi::Accumulators::GenericAccumulator< std::pair< Arithmetic, Arithmetic >, Arithmetic, Atomicity, WeightedProduct >::GenericAccumulator
friend class GenericAccumulator
Definition: Accumulators.h:473
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::mergeAndReset
friend void mergeAndReset(HistogramingCounterBase &h, HistogramingCounterBase &o)
Definition: StaticHistogram.h:678
Gaudi::Accumulators::HistogramingAccumulatorInternal::m_value
std::unique_ptr< BaseAccumulator[]> m_value
Histogram content.
Definition: StaticHistogram.h:536
Gaudi::Accumulators::WeightedAdder::exchange
static RegularType exchange(InternalType &v, RegularType newv) noexcept
Definition: StaticHistogram.h:125
Gaudi::Accumulators::WeightedHistoInputType::ValueType
typename HistoInputType< ArithmeticTuple, NIndex >::ValueType ValueType
Definition: StaticHistogram.h:391
Gaudi::Accumulators::WeightedAdder
An Adder ValueHandler, taking weight into account and computing a count plus the sum of the weights I...
Definition: StaticHistogram.h:112
std::logic_error
STL class.
Gaudi::Accumulators::Axis::inAcceptance
bool inAcceptance(Arithmetic value) const
says whether the given value is within the range of the axis
Definition: StaticHistogram.h:258
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
std::atomic< Arithmetic >
Gaudi::Accumulators::Axis::setTitle
void setTitle(std::string const &t)
Definition: StaticHistogram.h:277
Gaudi::Accumulators::GenericAccumulator
Generic Accumulator, templated by.
Definition: Accumulators.h:471
MsgStream
Definition: MsgStream.h:34
Gaudi::Accumulators::HistogramingAccumulatorInternal::_getAxis
std::tuple_element_t< 0, AxisTupleType > const & _getAxis(size_t i, typename std::tuple_size< AxisTupleType >::type) const
Definition: StaticHistogram.h:520
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: StaticHistogram.h:676
Gaudi::Accumulators::to_json
void to_json(nlohmann::json &j, const Axis< Arithmetic > &axis)
automatic conversion of the Axis type to json
Definition: StaticHistogram.h:307
Gaudi::Accumulators::HistogramingAccumulatorInternal::BaseAccumulator
BaseAccumulatorT< Atomicity, Arithmetic > BaseAccumulator
Definition: StaticHistogram.h:461
Gaudi::Accumulators::GenericAccumulator< std::pair< Arithmetic, Arithmetic >, Arithmetic, Atomicity, WeightedProduct >::value
OutputType value() const
Definition: Accumulators.h:501
cpluginsvc.n
n
Definition: cpluginsvc.py:234
Gaudi::Accumulators::WeightedProduct
A Product functor, take a pair (value, weight) as input.
Definition: StaticHistogram.h:89
Gaudi::Accumulators::BufferableCounter
An empty ancester of all counters that provides a buffer method that returns a buffer on itself Also ...
Definition: Accumulators.h:909
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: StaticHistogram.h:673
Gaudi::Accumulators::HistogramingAccumulatorInternal
Internal Accumulator class dealing with Histograming.
Definition: StaticHistogram.h:455
Gaudi::Accumulators::WeightedAdder::isAtomic
static constexpr bool isAtomic
Definition: StaticHistogram.h:116
Gaudi::Accumulators::Identity
An Identity functor.
Definition: Accumulators.h:283
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::reset
friend void reset(HistogramingCounterBase &c)
Definition: StaticHistogram.h:677
Accumulators.h
Gaudi::Accumulators
Definition: CounterArray.h:18
gaudirun.type
type
Definition: gaudirun.py:160
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::computeIndexInternal
unsigned int computeIndexInternal(Tuple const &allAxis) const
Definition: StaticHistogram.h:355
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
Gaudi::Accumulators::HistogramingAccumulatorInternal::nEntries
auto nEntries(unsigned int i) const
Definition: StaticHistogram.h:502
Gaudi::Accumulators::Axis::maxValue
Arithmetic maxValue() const
Definition: StaticHistogram.h:271
Gaudi::Accumulators::WeightedAdder::RegularType
std::pair< unsigned long, Arithmetic > RegularType
Definition: StaticHistogram.h:113
gaudirun.args
args
Definition: gaudirun.py:336
std
STL namespace.
Gaudi::Accumulators::WeightedSquare
A WeightedSquare functor, take a pair (value, weight) as input.
Definition: StaticHistogram.h:99
Gaudi::Accumulators::HistogramingAccumulatorInternal::HistogramingAccumulatorInternal
HistogramingAccumulatorInternal(construct_empty_t, const HistogramingAccumulatorInternal< ato, InputType, Arithmetic, BaseAccumulatorT, AxisTupleType > &other)
Definition: StaticHistogram.h:470
Gaudi::Accumulators::Axis::m_maxValue
Arithmetic m_maxValue
Definition: StaticHistogram.h:291
Gaudi::Accumulators::WeightedHistoInputType::forInternalCounter
auto forInternalCounter() const
Definition: StaticHistogram.h:401
Gaudi::Accumulators::HistogramingAccumulatorInternal::axis
auto & axis() const
Definition: StaticHistogram.h:500
Gaudi::Accumulators::Axis::m_title
std::string m_title
title of this axis
Definition: StaticHistogram.h:282
Gaudi::Accumulators::HistogramingAccumulatorInternal::HistogramingAccumulatorInternal
friend class HistogramingAccumulatorInternal
Definition: StaticHistogram.h:457
Gaudi::Accumulators::WeightedHistoInputType::computeIndex
unsigned int computeIndex(std::tuple< AxisType... > const &axis) const
Definition: StaticHistogram.h:394
Gaudi::Accumulators::SigmaAccumulatorBase
SigmaAccumulatorBase.
Definition: Accumulators.h:781
Gaudi::Accumulators::Buffer
Buffer is a non atomic Accumulator which, when it goes out-of-scope, updates the underlying thread-sa...
Definition: Accumulators.h:849
Gaudi::Accumulators::WeightedHistogramingAccumulator
HistogramingAccumulatorInternal< Atomicity, WeightedHistoInputType< AxisToArithmetic_t< AxisTupleType >, ND::value, Arithmetic >, Arithmetic, WeightedCountAccumulator, AxisTupleType > WeightedHistogramingAccumulator
Class implementing a weighted histogram accumulator.
Definition: StaticHistogram.h:558
std::isspace
T isspace(T... args)
Gaudi::Accumulators::Axis::recomputeRatio
void recomputeRatio()
Definition: StaticHistogram.h:300
Gaudi::Accumulators::atomicity
atomicity
Defines atomicity of the accumulators.
Definition: Accumulators.h:263
std::vector::empty
T empty(T... args)
Gaudi::Accumulators::fetch_add
void fetch_add(AtomicType &atVar, Arithmetic value)
generic fetch_add, also dealing with atomic types with no fetch_add member method
Definition: Accumulators.h:366
Gaudi::Accumulators::Axis::minValue
Arithmetic minValue() const
Definition: StaticHistogram.h:266
Properties.v
v
Definition: Properties.py:122
Gaudi::Accumulators::construct_empty_t
constant used to disambiguate construction of an empty Accumulator versus the copy constructor.
Definition: Accumulators.h:446
std::tuple_cat
T tuple_cat(T... args)
Gaudi::Accumulators::WeightedCountAccumulator
WeightedCountAccumulator.
Definition: StaticHistogram.h:152
Gaudi::Accumulators::Axis::setMinValue
void setMinValue(Arithmetic v)
Definition: StaticHistogram.h:267
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::to_json
friend void to_json(nlohmann::json &j, HistogramingCounterBase const &h)
Definition: StaticHistogram.h:679
Gaudi::Accumulators::HistogramingAccumulatorInternal::reset
void reset()
Definition: StaticHistogram.h:481
Gaudi::Accumulators::HistogramingAccumulator
HistogramingAccumulatorInternal< Atomicity, HistoInputType< AxisToArithmetic_t< AxisTupleType >, ND::value >, unsigned long, IntegralAccumulator, AxisTupleType > HistogramingAccumulator
Class implementing a regular histogram accumulator.
Definition: StaticHistogram.h:547
Gaudi::Accumulators::HistogramingAccumulatorInternal::accumulator
BaseAccumulator & accumulator(unsigned int index) const
Definition: StaticHistogram.h:513
Gaudi::Accumulators::HistogramingAccumulatorInternal::operator+=
HistogramingAccumulatorInternal & operator+=(InputType v)
Definition: StaticHistogram.h:477
Gaudi::Accumulators::naming::histogramString
constexpr char histogramString[]
Definition: StaticHistogram.h:705
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::inAcceptanceInternal
bool inAcceptanceInternal(Tuple const &allAxis) const
Definition: StaticHistogram.h:374
Gaudi::Accumulators::Axis::m_ratio
Arithmetic m_ratio
precomputed ratio to convert a value into bin number equal to nBins/(maxValue-minValue).
Definition: StaticHistogram.h:296
std::unique_ptr< BaseAccumulator[]>
Gaudi::Accumulators::WeightedSquareAccumulator::sum2
Arithmetic sum2() const
Definition: StaticHistogram.h:190
Gaudi::Accumulators::WeightedCountAccumulator::operator+=
WeightedCountAccumulator operator+=(const Arithmetic weight)
overload of operator+= to be able to only give weight and no value
Definition: StaticHistogram.h:158
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::AxisTupleArithmeticType
typename AccumulatorType::AxisTupleArithmeticType AxisTupleArithmeticType
Definition: StaticHistogram.h:652
Gaudi::Accumulators::Axis
Definition of a default type of Histogram Axis It contains number of bins, min and max value plus a t...
Definition: StaticHistogram.h:218
Gaudi::Accumulators::HistogramingAccumulatorInternal::mergeAndReset
void mergeAndReset(HistogramingAccumulatorInternal< ato, InputType, Arithmetic, BaseAccumulatorT, AxisTupleType > &other)
Definition: StaticHistogram.h:485
Gaudi::Accumulators::HistogramingAccumulatorInternal::_getAxis
auto & _getAxis(size_t i, std::integral_constant< size_t, N >) const
Definition: StaticHistogram.h:526
Gaudi::Accumulators::HistogramingCounterBase< ND, Atomicity, Arithmetic, Type, Accumulator, std::tuple< AxisTypes... > >::HistogramingCounterBase
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.
Definition: StaticHistogram.h:664
std::declval
T declval(T... args)
Gaudi::Accumulators::HistogramingAccumulatorInternal< Atomicity, HistoInputType< AxisToArithmetic_t< AxisTupleType >, ND >, unsigned long, IntegralAccumulator, AxisTupleType >::AxisTupleArithmeticType
typename InputType::ValueType AxisTupleArithmeticType
Definition: StaticHistogram.h:462
Gaudi::ParticleProperties::index
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...
Definition: IParticlePropertySvc.cpp:39
Gaudi::Accumulators::HistoInputType< std::tuple< Elements... >, NIndex >::inAcceptance
bool inAcceptance(std::tuple< AxisType... > const &axis) const
Definition: StaticHistogram.h:349
Gaudi::Accumulators::WeightedAdder::merge
static void merge(InternalType &a, RegularType b) noexcept
Definition: StaticHistogram.h:133
Gaudi::Accumulators::HistogramingAccumulatorInternal::nBins
auto nBins(unsigned int i) const
Definition: StaticHistogram.h:508