28namespace Experimental {
31using RAxisVariant = std::variant<RRegularAxis, RVariableBinAxis, RCategoricalAxis>;
44 friend class ::ROOT::Experimental::RHistEngine;
46 std::vector<RAxisVariant>
fAxes;
53 throw std::invalid_argument(
"must have at least 1 axis object");
58 const std::vector<RAxisVariant> &
Get()
const {
return fAxes; }
71 for (
auto &&axis :
fAxes) {
72 if (
auto *
regular = std::get_if<RRegularAxis>(&axis)) {
74 }
else if (
auto *variable = std::get_if<RVariableBinAxis>(&axis)) {
76 }
else if (
auto *
categorical = std::get_if<RCategoricalAxis>(&axis)) {
79 throw std::logic_error(
"unimplemented axis type");
86 template <std::size_t
I, std::size_t
N,
typename... A>
89 using ArgumentType = std::tuple_element_t<
I, std::tuple<A...>>;
90 const auto &axis =
fAxes[
I];
92 if (
auto *
regular = std::get_if<RRegularAxis>(&axis)) {
93 if constexpr (std::is_convertible_v<ArgumentType, RRegularAxis::ArgumentType>) {
97 throw std::invalid_argument(
"invalid type of argument");
99 }
else if (
auto *variable = std::get_if<RVariableBinAxis>(&axis)) {
100 if constexpr (std::is_convertible_v<ArgumentType, RVariableBinAxis::ArgumentType>) {
101 index *= variable->GetTotalNBins();
102 linIndex = variable->ComputeLinearizedIndex(std::get<I>(args));
104 throw std::invalid_argument(
"invalid type of argument");
106 }
else if (
auto *
categorical = std::get_if<RCategoricalAxis>(&axis)) {
107 if constexpr (std::is_convertible_v<ArgumentType, RCategoricalAxis::ArgumentType>) {
111 throw std::invalid_argument(
"invalid type of argument");
114 throw std::logic_error(
"unimplemented axis type");
120 if constexpr (
I + 1 <
N) {
123 return {
index,
true};
126 template <std::size_t
N,
typename... A>
140 template <
typename... A>
143 if (
sizeof...(A) !=
fAxes.size()) {
144 throw std::invalid_argument(
"invalid number of arguments to ComputeGlobalIndex");
153 template <std::
size_t N>
157 throw std::invalid_argument(
"invalid number of indices passed to ComputeGlobalIndex");
160 for (std::size_t i = 0; i <
N; i++) {
162 const auto &axis =
fAxes[i];
164 if (
auto *
regular = std::get_if<RRegularAxis>(&axis)) {
167 }
else if (
auto *variable = std::get_if<RVariableBinAxis>(&axis)) {
170 }
else if (
auto *
categorical = std::get_if<RCategoricalAxis>(&axis)) {
174 throw std::logic_error(
"unimplemented axis type");
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Bin configurations for all dimensions of a histogram.
friend bool operator==(const RAxes &lhs, const RAxes &rhs)
std::size_t GetNDimensions() const
friend bool operator!=(const RAxes &lhs, const RAxes &rhs)
RLinearizedIndex ComputeGlobalIndexImpl(std::size_t index, const std::tuple< A... > &args) const
RLinearizedIndex ComputeGlobalIndex(const std::tuple< A... > &args) const
Compute the global index for all axes.
RLinearizedIndex ComputeGlobalIndexImpl(const std::tuple< A... > &args) const
std::uint64_t ComputeTotalNBins() const
Compute the total number of bins for all axes.
RAxes(std::vector< RAxisVariant > axes)
void Streamer(TBuffer &)
ROOT Streamer function to throw when trying to store an object of this class.
RLinearizedIndex ComputeGlobalIndex(const std::array< RBinIndex, N > &indices) const
Compute the global index for all axes.
std::vector< RAxisVariant > fAxes
const std::vector< RAxisVariant > & Get() const
A histogram data structure to bin data along multiple dimensions.
Buffer base class used for serializing objects.
std::variant< RRegularAxis, RVariableBinAxis, RCategoricalAxis > RAxisVariant
Variant of all supported axis types.
A linearized index that can be invalid.