File indexing completed on 2026-07-16 08:07:43
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include <array>
0012 #include <string>
0013 #include <tuple>
0014
0015 #include <boost/histogram.hpp>
0016
0017 namespace Acts::Experimental {
0018
0019 using BoostVariableAxis = boost::histogram::axis::variable<double, std::string>;
0020 using BoostRegularAxis =
0021 boost::histogram::axis::regular<double, boost::histogram::use_default,
0022 std::string>;
0023
0024
0025
0026
0027
0028 using AxisVariant =
0029 boost::histogram::axis::variant<BoostVariableAxis, BoostRegularAxis>;
0030
0031
0032 using BoostHist = decltype(boost::histogram::make_histogram(
0033 std::declval<std::vector<AxisVariant>>()));
0034
0035
0036 using BoostProfileHist = decltype(boost::histogram::make_profile(
0037 std::declval<std::vector<AxisVariant>>()));
0038
0039
0040
0041
0042
0043
0044
0045 template <std::size_t Dim>
0046 class Histogram {
0047 public:
0048
0049
0050
0051
0052
0053 Histogram(std::string name, std::string title,
0054 const std::array<AxisVariant, Dim>& axes)
0055 : m_name(std::move(name)),
0056 m_title(std::move(title)),
0057 m_hist(boost::histogram::make_histogram(axes.begin(), axes.end())) {}
0058
0059
0060
0061
0062 void fill(const std::array<double, Dim>& values) {
0063 std::apply([this](auto... v) { m_hist(v...); }, std::tuple_cat(values));
0064 }
0065
0066
0067 const std::string& name() const { return m_name; }
0068
0069
0070 const std::string& title() const { return m_title; }
0071
0072
0073 static constexpr std::size_t rank() { return Dim; }
0074
0075
0076 const BoostHist& histogram() const { return m_hist; }
0077
0078 private:
0079 std::string m_name;
0080 std::string m_title;
0081
0082 BoostHist m_hist;
0083 };
0084
0085
0086 using Histogram1 = Histogram<1>;
0087 using Histogram2 = Histogram<2>;
0088
0089
0090
0091
0092
0093
0094
0095
0096 template <std::size_t Dim>
0097 class ProfileHistogram {
0098 public:
0099
0100
0101
0102
0103
0104
0105 ProfileHistogram(std::string name, std::string title,
0106 const std::array<AxisVariant, Dim>& axes,
0107 std::string sampleAxisTitle)
0108 : m_name(std::move(name)),
0109 m_title(std::move(title)),
0110 m_sampleAxisTitle(std::move(sampleAxisTitle)),
0111 m_hist(boost::histogram::make_profile(axes.begin(), axes.end())) {}
0112
0113
0114
0115
0116
0117 void fill(const std::array<double, Dim>& values, double sample) {
0118 std::apply(
0119 [&](auto... v) { m_hist(v..., boost::histogram::sample(sample)); },
0120 std::tuple_cat(values));
0121 }
0122
0123
0124 const std::string& name() const { return m_name; }
0125
0126
0127 const std::string& title() const { return m_title; }
0128
0129
0130 static constexpr std::size_t rank() { return Dim; }
0131
0132
0133 const std::string& sampleAxisTitle() const { return m_sampleAxisTitle; }
0134
0135
0136 const BoostProfileHist& histogram() const { return m_hist; }
0137
0138 private:
0139 std::string m_name;
0140 std::string m_title;
0141 std::string m_sampleAxisTitle;
0142
0143 BoostProfileHist m_hist;
0144 };
0145
0146
0147 using ProfileHistogram1 = ProfileHistogram<1>;
0148
0149
0150
0151
0152
0153
0154
0155
0156 template <std::size_t Dim>
0157 class Efficiency {
0158 public:
0159
0160
0161
0162
0163
0164 Efficiency(std::string name, std::string title,
0165 const std::array<AxisVariant, Dim>& axes)
0166 : m_name(std::move(name)),
0167 m_title(std::move(title)),
0168 m_accepted(boost::histogram::make_histogram(axes.begin(), axes.end())),
0169 m_total(boost::histogram::make_histogram(axes.begin(), axes.end())) {}
0170
0171
0172
0173
0174
0175 void fill(const std::array<double, Dim>& values, bool accepted) {
0176 std::apply(
0177 [&](auto... v) {
0178 m_total(v...);
0179 if (accepted) {
0180 m_accepted(v...);
0181 }
0182 },
0183 std::tuple_cat(values));
0184 }
0185
0186
0187 const std::string& name() const { return m_name; }
0188
0189
0190 const std::string& title() const { return m_title; }
0191
0192
0193 static constexpr std::size_t rank() { return Dim; }
0194
0195
0196 const BoostHist& acceptedHistogram() const { return m_accepted; }
0197
0198
0199 const BoostHist& totalHistogram() const { return m_total; }
0200
0201 private:
0202 std::string m_name;
0203 std::string m_title;
0204
0205 BoostHist m_accepted;
0206 BoostHist m_total;
0207 };
0208
0209
0210 using Efficiency1 = Efficiency<1>;
0211 using Efficiency2 = Efficiency<2>;
0212
0213
0214
0215
0216
0217 Histogram1 projectionX(const Histogram2& hist2d);
0218
0219
0220
0221
0222
0223 Histogram1 projectionY(const Histogram2& hist2d);
0224
0225 }