@@ -48,6 +48,40 @@ TEST(RHistStats, GetDimensionStats)
4848 }
4949}
5050
51+ TEST (RHistStats, GetDimensionStatsWeighted)
52+ {
53+ RHistStats stats (3 );
54+ ASSERT_EQ (stats.GetNEntries (), 0 );
55+
56+ static constexpr std::size_t Entries = 20 ;
57+ for (std::size_t i = 0 ; i < Entries; i++) {
58+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
59+ }
60+
61+ ASSERT_EQ (stats.GetNEntries (), Entries);
62+ {
63+ const auto &dimensionStats = stats.GetDimensionStats (/* =0*/ );
64+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX , 93.1 );
65+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX2 , 1330.0 );
66+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX3 , 20489.98 );
67+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX4 , 330265.6 );
68+ }
69+ {
70+ const auto &dimensionStats = stats.GetDimensionStats (1 );
71+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX , 2 * 93.1 );
72+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX2 , 4 * 1330.0 );
73+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX3 , 8 * 20489.98 );
74+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX4 , 16 * 330265.6 );
75+ }
76+ {
77+ const auto &dimensionStats = stats.GetDimensionStats (2 );
78+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX , 1330.0 );
79+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX2 , 330265.6 );
80+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX3 , 93164182.0 );
81+ EXPECT_DOUBLE_EQ (dimensionStats.fSumWX4 , 28108731464.8 );
82+ }
83+ }
84+
5185TEST (RHistStats, ComputeNEffectiveEntries)
5286{
5387 RHistStats stats (1 );
@@ -65,6 +99,24 @@ TEST(RHistStats, ComputeNEffectiveEntries)
6599 EXPECT_DOUBLE_EQ (stats.ComputeNEffectiveEntries (), Entries);
66100}
67101
102+ TEST (RHistStats, ComputeNEffectiveEntriesWeighted)
103+ {
104+ RHistStats stats (1 );
105+ ASSERT_EQ (stats.GetNEntries (), 0 );
106+ EXPECT_EQ (stats.ComputeNEffectiveEntries (), 0 );
107+
108+ static constexpr std::size_t Entries = 20 ;
109+ for (std::size_t i = 0 ; i < Entries; i++) {
110+ stats.Fill (1 , RWeight (0.1 + 0.03 * i));
111+ }
112+
113+ ASSERT_EQ (stats.GetNEntries (), Entries);
114+ EXPECT_DOUBLE_EQ (stats.GetSumW (), 7.7 );
115+ EXPECT_DOUBLE_EQ (stats.GetSumW2 (), 3.563 );
116+ // Cross-checked with TH1
117+ EXPECT_DOUBLE_EQ (stats.ComputeNEffectiveEntries (), 16.640471512770137 );
118+ }
119+
68120TEST (RHistStats, ComputeMean)
69121{
70122 RHistStats stats (3 );
@@ -84,6 +136,26 @@ TEST(RHistStats, ComputeMean)
84136 EXPECT_DOUBLE_EQ (stats.ComputeMean (2 ), 123.5 );
85137}
86138
139+ TEST (RHistStats, ComputeMeanWeighted)
140+ {
141+ RHistStats stats (3 );
142+ ASSERT_EQ (stats.GetNEntries (), 0 );
143+ EXPECT_EQ (stats.ComputeMean (/* =0*/ ), 0 );
144+ EXPECT_EQ (stats.ComputeMean (1 ), 0 );
145+ EXPECT_EQ (stats.ComputeMean (2 ), 0 );
146+
147+ static constexpr std::size_t Entries = 20 ;
148+ for (std::size_t i = 0 ; i < Entries; i++) {
149+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
150+ }
151+
152+ ASSERT_EQ (stats.GetNEntries (), Entries);
153+ // Cross-checked with TH1
154+ EXPECT_DOUBLE_EQ (stats.ComputeMean (/* =0*/ ), 12.090909090909090 );
155+ EXPECT_DOUBLE_EQ (stats.ComputeMean (1 ), 24.181818181818180 );
156+ EXPECT_DOUBLE_EQ (stats.ComputeMean (2 ), 172.72727272727272 );
157+ }
158+
87159TEST (RHistStats, ComputeVariance)
88160{
89161 RHistStats stats (3 );
@@ -103,6 +175,26 @@ TEST(RHistStats, ComputeVariance)
103175 EXPECT_DOUBLE_EQ (stats.ComputeVariance (2 ), 12881.05 );
104176}
105177
178+ TEST (RHistStats, ComputeVarianceWeighted)
179+ {
180+ RHistStats stats (3 );
181+ ASSERT_EQ (stats.GetNEntries (), 0 );
182+ EXPECT_EQ (stats.ComputeVariance (/* =0*/ ), 0 );
183+ EXPECT_EQ (stats.ComputeVariance (1 ), 0 );
184+ EXPECT_EQ (stats.ComputeVariance (2 ), 0 );
185+
186+ static constexpr std::size_t Entries = 20 ;
187+ for (std::size_t i = 0 ; i < Entries; i++) {
188+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
189+ }
190+
191+ ASSERT_EQ (stats.GetNEntries (), Entries);
192+ // Cross-checked with TH1::GetStdDev squared, numerical differences with EXPECT_DOUBLE_EQ
193+ EXPECT_FLOAT_EQ (stats.ComputeVariance (/* =0*/ ), 26.5371900 );
194+ EXPECT_FLOAT_EQ (stats.ComputeVariance (1 ), 106.148760 );
195+ EXPECT_FLOAT_EQ (stats.ComputeVariance (2 ), 13056.9256 );
196+ }
197+
106198TEST (RHistStats, ComputeStdDev)
107199{
108200 RHistStats stats (3 );
@@ -122,6 +214,26 @@ TEST(RHistStats, ComputeStdDev)
122214 EXPECT_DOUBLE_EQ (stats.ComputeStdDev (2 ), std::sqrt (12881.05 ));
123215}
124216
217+ TEST (RHistStats, ComputeStdDevWeighted)
218+ {
219+ RHistStats stats (3 );
220+ ASSERT_EQ (stats.GetNEntries (), 0 );
221+ EXPECT_EQ (stats.ComputeStdDev (/* =0*/ ), 0 );
222+ EXPECT_EQ (stats.ComputeStdDev (1 ), 0 );
223+ EXPECT_EQ (stats.ComputeStdDev (2 ), 0 );
224+
225+ static constexpr std::size_t Entries = 20 ;
226+ for (std::size_t i = 0 ; i < Entries; i++) {
227+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
228+ }
229+
230+ ASSERT_EQ (stats.GetNEntries (), Entries);
231+ // Cross-checked with TH1
232+ EXPECT_DOUBLE_EQ (stats.ComputeStdDev (/* =0*/ ), 5.151426024184432 );
233+ EXPECT_DOUBLE_EQ (stats.ComputeStdDev (1 ), 10.302852048368864 );
234+ EXPECT_DOUBLE_EQ (stats.ComputeStdDev (2 ), 114.266905181836051 );
235+ }
236+
125237TEST (RHistStats, ComputeSkewness)
126238{
127239 RHistStats stats (3 );
@@ -142,6 +254,26 @@ TEST(RHistStats, ComputeSkewness)
142254 EXPECT_FLOAT_EQ (stats.ComputeSkewness (2 ), 0.66125456 );
143255}
144256
257+ TEST (RHistStats, ComputeSkewnessWeighted)
258+ {
259+ RHistStats stats (3 );
260+ ASSERT_EQ (stats.GetNEntries (), 0 );
261+ EXPECT_EQ (stats.ComputeSkewness (/* =0*/ ), 0 );
262+ EXPECT_EQ (stats.ComputeSkewness (1 ), 0 );
263+ EXPECT_EQ (stats.ComputeSkewness (2 ), 0 );
264+
265+ static constexpr std::size_t Entries = 20 ;
266+ for (std::size_t i = 0 ; i < Entries; i++) {
267+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
268+ }
269+
270+ ASSERT_EQ (stats.GetNEntries (), Entries);
271+ // Cross-checked with TH1, numerical differences with EXPECT_DOUBLE_EQ
272+ EXPECT_FLOAT_EQ (stats.ComputeSkewness (/* =0*/ ), -0.50554999 );
273+ EXPECT_FLOAT_EQ (stats.ComputeSkewness (1 ), -0.50554999 );
274+ EXPECT_FLOAT_EQ (stats.ComputeSkewness (2 ), 0.12072240 );
275+ }
276+
145277TEST (RHistStats, ComputeKurtosis)
146278{
147279 RHistStats stats (3 );
@@ -162,6 +294,26 @@ TEST(RHistStats, ComputeKurtosis)
162294 EXPECT_FLOAT_EQ (stats.ComputeKurtosis (2 ), -0.84198253 );
163295}
164296
297+ TEST (RHistStats, ComputeKurtosisWeighted)
298+ {
299+ RHistStats stats (3 );
300+ ASSERT_EQ (stats.GetNEntries (), 0 );
301+ EXPECT_EQ (stats.ComputeKurtosis (/* =0*/ ), 0 );
302+ EXPECT_EQ (stats.ComputeKurtosis (1 ), 0 );
303+ EXPECT_EQ (stats.ComputeKurtosis (2 ), 0 );
304+
305+ static constexpr std::size_t Entries = 20 ;
306+ for (std::size_t i = 0 ; i < Entries; i++) {
307+ stats.Fill (i, 2 * i, i * i, RWeight (0.1 + 0.03 * i));
308+ }
309+
310+ ASSERT_EQ (stats.GetNEntries (), Entries);
311+ // Cross-checked with TH1, numerical differences with EXPECT_DOUBLE_EQ
312+ EXPECT_FLOAT_EQ (stats.ComputeKurtosis (/* =0*/ ), -0.74828797 );
313+ EXPECT_FLOAT_EQ (stats.ComputeKurtosis (1 ), -0.74828797 );
314+ EXPECT_FLOAT_EQ (stats.ComputeKurtosis (2 ), -1.2483086 );
315+ }
316+
165317TEST (RHistStats, FillInvalidNumberOfArguments)
166318{
167319 RHistStats stats1 (1 );
@@ -174,3 +326,29 @@ TEST(RHistStats, FillInvalidNumberOfArguments)
174326 EXPECT_NO_THROW (stats2.Fill (1 , 2 ));
175327 EXPECT_THROW (stats2.Fill (1 , 2 , 3 ), std::invalid_argument);
176328}
329+
330+ TEST (RHistStats, FillWeightInvalidNumberOfArguments)
331+ {
332+ RHistStats stats1 (1 );
333+ RHistStats stats2 (2 );
334+
335+ EXPECT_NO_THROW (stats1.Fill (1 , RWeight (1 )));
336+ EXPECT_THROW (stats1.Fill (1 , 2 , RWeight (1 )), std::invalid_argument);
337+
338+ EXPECT_THROW (stats2.Fill (1 , RWeight (1 )), std::invalid_argument);
339+ EXPECT_NO_THROW (stats2.Fill (1 , 2 , RWeight (1 )));
340+ EXPECT_THROW (stats2.Fill (1 , 2 , 3 , RWeight (1 )), std::invalid_argument);
341+ }
342+
343+ TEST (RHistStats, FillTupleWeightInvalidNumberOfArguments)
344+ {
345+ RHistStats stats1 (1 );
346+ RHistStats stats2 (2 );
347+
348+ EXPECT_NO_THROW (stats1.Fill (std::make_tuple (1 ), RWeight (1 )));
349+ EXPECT_THROW (stats1.Fill (std::make_tuple (1 , 2 ), RWeight (1 )), std::invalid_argument);
350+
351+ EXPECT_THROW (stats2.Fill (std::make_tuple (1 ), RWeight (1 )), std::invalid_argument);
352+ EXPECT_NO_THROW (stats2.Fill (std::make_tuple (1 , 2 ), RWeight (1 )));
353+ EXPECT_THROW (stats2.Fill (std::make_tuple (1 , 2 , 3 ), RWeight (1 )), std::invalid_argument);
354+ }
0 commit comments