Skip to content

Commit 98bde47

Browse files
committed
[hist] Conversion of RBinWithError
1 parent d13e88c commit 98bde47

File tree

4 files changed

+77
-6
lines changed

4 files changed

+77
-6
lines changed

hist/histv7util/inc/ROOT/Hist/ConvertToTH1.hxx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef ROOT_Hist_ConvertToTH1
66
#define ROOT_Hist_ConvertToTH1
77

8+
#include <ROOT/RBinWithError.hxx>
89
#include <ROOT/RHist.hxx>
910
#include <ROOT/RHistEngine.hxx>
1011

@@ -61,6 +62,11 @@ std::unique_ptr<TH1F> ConvertToTH1F(const RHistEngine<float> &engine);
6162
/// \copydetails ConvertToTH1I(const RHistEngine<int> &engine)
6263
std::unique_ptr<TH1D> ConvertToTH1D(const RHistEngine<double> &engine);
6364

65+
/// Convert a one-dimensional histogram to TH1D.
66+
///
67+
/// \copydetails ConvertToTH1I(const RHistEngine<int> &engine)
68+
std::unique_ptr<TH1D> ConvertToTH1D(const RHistEngine<RBinWithError> &engine);
69+
6470
/// Convert a one-dimensional histogram to TH1C.
6571
///
6672
/// \copydetails ConvertToTH1I(const RHist<int> &hist)
@@ -99,6 +105,11 @@ std::unique_ptr<TH1F> ConvertToTH1F(const RHist<float> &hist);
99105
/// \copydetails ConvertToTH1I(const RHist<int> &hist)
100106
std::unique_ptr<TH1D> ConvertToTH1D(const RHist<double> &hist);
101107

108+
/// Convert a one-dimensional histogram to TH1D.
109+
///
110+
/// \copydetails ConvertToTH1I(const RHist<int> &hist)
111+
std::unique_ptr<TH1D> ConvertToTH1D(const RHist<RBinWithError> &hist);
112+
102113
} // namespace Hist
103114
} // namespace Experimental
104115
} // namespace ROOT

hist/histv7util/src/ConvertToTH1.cxx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <cstddef>
1414
#include <memory>
1515
#include <stdexcept>
16+
#include <type_traits>
1617
#include <variant>
1718
#include <vector>
1819

@@ -27,8 +28,20 @@ std::unique_ptr<Hist> ConvertToTH1Impl(const RHistEngine<T> &engine)
2728
}
2829

2930
std::unique_ptr<Hist> ret;
30-
auto copyBinContent = [&ret, &engine](Int_t i, RBinIndex index) {
31-
ret->GetArray()[i] = engine.GetBinContent(index);
31+
Double_t *sumw2 = nullptr;
32+
auto copyBinContent = [&ret, &engine, &sumw2](Int_t i, RBinIndex index) {
33+
if constexpr (std::is_same_v<T, RBinWithError>) {
34+
if (sumw2 == nullptr) {
35+
ret->Sumw2();
36+
sumw2 = ret->GetSumw2()->GetArray();
37+
}
38+
const RBinWithError &c = engine.GetBinContent(index);
39+
ret->GetArray()[i] = c.fSum;
40+
sumw2[i] = c.fSum2;
41+
} else {
42+
(void)sumw2;
43+
ret->GetArray()[i] = engine.GetBinContent(index);
44+
}
3245
};
3346

3447
const auto &axes = engine.GetAxes();
@@ -114,6 +127,11 @@ std::unique_ptr<TH1D> ConvertToTH1D(const RHistEngine<double> &engine)
114127
return ConvertToTH1Impl<TH1D>(engine);
115128
}
116129

130+
std::unique_ptr<TH1D> ConvertToTH1D(const RHistEngine<RBinWithError> &engine)
131+
{
132+
return ConvertToTH1Impl<TH1D>(engine);
133+
}
134+
117135
std::unique_ptr<TH1C> ConvertToTH1C(const RHist<char> &hist)
118136
{
119137
auto ret = ConvertToTH1C(hist.GetEngine());
@@ -163,6 +181,13 @@ std::unique_ptr<TH1D> ConvertToTH1D(const RHist<double> &hist)
163181
return ret;
164182
}
165183

184+
std::unique_ptr<TH1D> ConvertToTH1D(const RHist<RBinWithError> &hist)
185+
{
186+
auto ret = ConvertToTH1D(hist.GetEngine());
187+
ConvertGlobalStatistics(*ret, hist.GetStats());
188+
return ret;
189+
}
190+
166191
} // namespace Hist
167192
} // namespace Experimental
168193
} // namespace ROOT

hist/histv7util/test/hist_convert_TH1.cxx

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,50 @@ TEST(ConvertToTH1F, RHist)
208208
TEST(ConvertToTH1D, RHistEngine)
209209
{
210210
static constexpr std::size_t Bins = 20;
211-
const RHistEngine<double> engine(Bins, {0, Bins});
211+
const RHistEngine<double> engineD(Bins, {0, Bins});
212212

213-
auto th1d = ConvertToTH1D(engine);
213+
auto th1d = ConvertToTH1D(engineD);
214214
ASSERT_TRUE(th1d);
215+
216+
RHistEngine<RBinWithError> engineE(Bins, {0, Bins});
217+
for (std::size_t i = 0; i < Bins; i++) {
218+
engineE.Fill(i, RWeight(0.1 + i * 0.03));
219+
}
220+
221+
th1d = ConvertToTH1D(engineE);
222+
ASSERT_TRUE(th1d);
223+
const Double_t *sumw2 = th1d->GetSumw2()->GetArray();
224+
ASSERT_TRUE(sumw2 != nullptr);
225+
226+
for (std::size_t i = 1; i <= Bins; i++) {
227+
const double weight = 0.1 + (i - 1) * 0.03;
228+
EXPECT_EQ(th1d->GetBinContent(i), weight);
229+
EXPECT_EQ(sumw2[i], weight * weight);
230+
}
215231
}
216232

217233
TEST(ConvertToTH1D, RHist)
218234
{
219235
static constexpr std::size_t Bins = 20;
220-
const RHist<double> hist(Bins, {0, Bins});
236+
const RHist<double> histD(Bins, {0, Bins});
221237

222-
auto th1d = ConvertToTH1D(hist);
238+
auto th1d = ConvertToTH1D(histD);
223239
ASSERT_TRUE(th1d);
240+
241+
RHist<RBinWithError> histE(Bins, {0, Bins});
242+
for (std::size_t i = 0; i < Bins; i++) {
243+
histE.Fill(i, RWeight(0.1 + i * 0.03));
244+
}
245+
246+
th1d = ConvertToTH1D(histE);
247+
ASSERT_TRUE(th1d);
248+
249+
ASSERT_EQ(histE.GetNEntries(), Bins);
250+
EXPECT_EQ(th1d->GetEntries(), Bins);
251+
Double_t stats[4];
252+
th1d->GetStats(stats);
253+
EXPECT_DOUBLE_EQ(stats[0], 7.7);
254+
EXPECT_DOUBLE_EQ(stats[1], 3.563);
255+
EXPECT_DOUBLE_EQ(stats[2], 93.1);
256+
EXPECT_DOUBLE_EQ(stats[3], 1330.0);
224257
}

hist/histv7util/test/histutil_test.hxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
#define histutil_test
33

44
#include <ROOT/Hist/ConvertToTH1.hxx>
5+
#include <ROOT/RBinWithError.hxx>
56
#include <ROOT/RHist.hxx>
67
#include <ROOT/RHistEngine.hxx>
78
#include <ROOT/RWeight.hxx>
89

910
using namespace ROOT::Experimental::Hist;
11+
using ROOT::Experimental::RBinWithError;
1012
using ROOT::Experimental::RHist;
1113
using ROOT::Experimental::RHistEngine;
1214
using ROOT::Experimental::RRegularAxis;

0 commit comments

Comments
 (0)