@@ -48,6 +48,40 @@ TEST(RHistStats, GetDimensionStats)
48
48
}
49
49
}
50
50
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
+
51
85
TEST (RHistStats, ComputeNEffectiveEntries)
52
86
{
53
87
RHistStats stats (1 );
@@ -65,6 +99,24 @@ TEST(RHistStats, ComputeNEffectiveEntries)
65
99
EXPECT_DOUBLE_EQ (stats.ComputeNEffectiveEntries (), Entries);
66
100
}
67
101
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
+
68
120
TEST (RHistStats, ComputeMean)
69
121
{
70
122
RHistStats stats (3 );
@@ -84,6 +136,26 @@ TEST(RHistStats, ComputeMean)
84
136
EXPECT_DOUBLE_EQ (stats.ComputeMean (2 ), 123.5 );
85
137
}
86
138
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
+
87
159
TEST (RHistStats, ComputeVariance)
88
160
{
89
161
RHistStats stats (3 );
@@ -103,6 +175,26 @@ TEST(RHistStats, ComputeVariance)
103
175
EXPECT_DOUBLE_EQ (stats.ComputeVariance (2 ), 12881.05 );
104
176
}
105
177
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
+
106
198
TEST (RHistStats, ComputeStdDev)
107
199
{
108
200
RHistStats stats (3 );
@@ -122,6 +214,26 @@ TEST(RHistStats, ComputeStdDev)
122
214
EXPECT_DOUBLE_EQ (stats.ComputeStdDev (2 ), std::sqrt (12881.05 ));
123
215
}
124
216
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, numerical differences with EXPECT_DOUBLE_EQ
232
+ EXPECT_FLOAT_EQ (stats.ComputeStdDev (/* =0*/ ), 5.15142602 );
233
+ EXPECT_FLOAT_EQ (stats.ComputeStdDev (1 ), 10.3028520 );
234
+ EXPECT_FLOAT_EQ (stats.ComputeStdDev (2 ), 114.266905 );
235
+ }
236
+
125
237
TEST (RHistStats, ComputeSkewness)
126
238
{
127
239
RHistStats stats (3 );
@@ -142,6 +254,26 @@ TEST(RHistStats, ComputeSkewness)
142
254
EXPECT_FLOAT_EQ (stats.ComputeSkewness (2 ), 0.66125456 );
143
255
}
144
256
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
+
145
277
TEST (RHistStats, ComputeKurtosis)
146
278
{
147
279
RHistStats stats (3 );
@@ -162,6 +294,26 @@ TEST(RHistStats, ComputeKurtosis)
162
294
EXPECT_FLOAT_EQ (stats.ComputeKurtosis (2 ), -0.84198253 );
163
295
}
164
296
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
+
165
317
TEST (RHistStats, FillInvalidNumberOfArguments)
166
318
{
167
319
RHistStats stats1 (1 );
@@ -174,3 +326,29 @@ TEST(RHistStats, FillInvalidNumberOfArguments)
174
326
EXPECT_NO_THROW (stats2.Fill (1 , 2 ));
175
327
EXPECT_THROW (stats2.Fill (1 , 2 , 3 ), std::invalid_argument);
176
328
}
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