38 template <
typename HistogramType,
40 std::make_integer_sequence<unsigned int, std::tuple_size_v<typename HistogramType::AxisTupleType>>>
42 template <
typename HistogramType,
unsigned int... ND>
47 template <
unsigned int I>
48 using AxisType = std::tuple_element_t<I, AxisTupleType>;
51 template <
typename OWNER>
53 typename HistogramType::AxisTupleType axis = {},
bool doNotInitialize = false )
54 : m_name{
name }, m_title{ title }, m_axis{ axis } {
56 owner->declareProperty( titlePropertyName(), m_title,
fmt::format(
"Title of histogram {}",
name ) )
57 ->template setOwnerType<OWNER>();
59 ->declareProperty( axisPropertyName<ND>(), std::get<ND>( m_axis ),
61 ->template setOwnerType<OWNER>(),
64 if ( !doNotInitialize ) {
68 createHistogram( *owner );
76 template <
typename OWNER>
78 typename HistogramType::AxisTupleType axis = {} )
79 : m_name{
name }, m_title{ title }, m_axis{ axis } {
80 createHistogram( *owner );
83 template <
typename OWNER>
88 [[nodiscard]]
auto operator[](
typename HistogramType::AxisTupleArithmeticType&&
v ) {
92 return m_histo.value()[std::forward<typename HistogramType::AxisTupleArithmeticType>(
v )];
96 template <
typename OWNER>
98 m_histo.emplace( &owner, m_name, m_title, m_axis );
105 j =
h.m_histo.value();
112 fmt::format(
"Cannot modify title of histogram {} after it has been initialized", m_name ) );
115 template <
unsigned int N>
116 void setAxis( std::tuple_element_t<N, typename HistogramType::AxisTupleType>
const& axis ) {
119 fmt::format(
"Cannot modify axis {} of histogram {} after it has been initialized",
N, m_name ) );
120 std::get<N>( m_axis ) = axis;
129 return m_histo->buffer();
142 template <
unsigned int N>
144 return fmt::format(
"{}_Axis{}", basePropertyName(),
N );
150 typename HistogramType::AxisTupleType m_axis{};
151 std::optional<HistogramType> m_histo{};
154 template <
typename HistogramType>