@@ -23,6 +23,8 @@ TEST(RProfile, Constructor)
2323 EXPECT_EQ (profile.GetNDimensions (), 2 );
2424 const auto &engine = profile.GetEngine ();
2525 EXPECT_EQ (engine.GetNDimensions (), 2 );
26+ const auto &stats = profile.GetStats ();
27+ EXPECT_EQ (stats.GetNDimensions (), 3 );
2628 EXPECT_EQ (profile.GetAxes ().size (), 2 );
2729 // Both axes include underflow and overflow bins.
2830 EXPECT_EQ (profile.GetTotalNBins (), (Bins + 2 ) * (Bins + 2 ));
@@ -73,6 +75,13 @@ TEST(RProfile, Fill)
7375 EXPECT_EQ (bin9.fSumValues2 , 625.0 );
7476 EXPECT_EQ (bin9.fSum , 1.0 );
7577 EXPECT_EQ (bin9.fSum2 , 1.0 );
78+
79+ EXPECT_EQ (profile.GetNEntries (), 2 );
80+ EXPECT_FLOAT_EQ (profile.ComputeNEffectiveEntries (), 2 );
81+ EXPECT_FLOAT_EQ (profile.ComputeMean (0 ), 9 );
82+ EXPECT_FLOAT_EQ (profile.ComputeStdDev (0 ), 0.5 );
83+ EXPECT_FLOAT_EQ (profile.ComputeMean (1 ), 24.0 );
84+ EXPECT_FLOAT_EQ (profile.ComputeStdDev (1 ), 1.0 );
7685}
7786
7887TEST (RProfile, FillInvalidNumberOfArguments)
@@ -111,6 +120,14 @@ TEST(RProfile, FillWeight)
111120 EXPECT_FLOAT_EQ (bin9.fSumValues2 , 562.5 );
112121 EXPECT_FLOAT_EQ (bin9.fSum , 0.9 );
113122 EXPECT_FLOAT_EQ (bin9.fSum2 , 0.81 );
123+
124+ EXPECT_EQ (profile.GetNEntries (), 2 );
125+ EXPECT_FLOAT_EQ (profile.GetStats ().GetSumW (), 1.7 );
126+ EXPECT_FLOAT_EQ (profile.GetStats ().GetSumW2 (), 1.45 );
127+ // Cross-checked with TH1
128+ EXPECT_FLOAT_EQ (profile.ComputeNEffectiveEntries (), 1.9931034 );
129+ EXPECT_FLOAT_EQ (profile.ComputeMean (0 ), 9.0294118 );
130+ EXPECT_FLOAT_EQ (profile.ComputeStdDev (0 ), 0.49913420 );
114131}
115132
116133TEST (RProfile, FillWeightInvalidNumberOfArguments)
@@ -151,6 +168,9 @@ TEST(RProfile, FillCategorical)
151168 EXPECT_EQ (bin2.fSumValues2 , 625.0 );
152169 EXPECT_EQ (bin2.fSum , 1.0 );
153170 EXPECT_EQ (bin2.fSum2 , 1.0 );
171+
172+ EXPECT_EQ (profile.GetNEntries (), 2 );
173+ EXPECT_FLOAT_EQ (profile.ComputeNEffectiveEntries (), 2 );
154174}
155175
156176TEST (RProfile, FillCategoricalWeight)
@@ -173,6 +193,37 @@ TEST(RProfile, FillCategoricalWeight)
173193 EXPECT_FLOAT_EQ (bin2.fSumValues2 , 562.5 );
174194 EXPECT_FLOAT_EQ (bin2.fSum , 0.9 );
175195 EXPECT_FLOAT_EQ (bin2.fSum2 , 0.81 );
196+
197+ EXPECT_EQ (profile.GetNEntries (), 2 );
198+ EXPECT_FLOAT_EQ (profile.GetStats ().GetSumW (), 1.7 );
199+ EXPECT_FLOAT_EQ (profile.GetStats ().GetSumW2 (), 1.45 );
200+ // Cross-checked with TH1
201+ EXPECT_FLOAT_EQ (profile.ComputeNEffectiveEntries (), 1.9931034 );
202+ }
203+
204+ TEST (RProfile, FillExceptionSafety)
205+ {
206+ static constexpr std::size_t Bins = 20 ;
207+ const RRegularAxis axis (Bins, {0 , Bins});
208+ RProfile profile ({axis, axis});
209+
210+ profile.Fill (1.5 , 2.5 , 3.5 );
211+ ASSERT_EQ (profile.GetNEntries (), 1 );
212+ ASSERT_EQ (profile.GetBinContent (RBinIndex (1 ), RBinIndex (2 )).fSumValues , 3.5 );
213+
214+ EXPECT_THROW (profile.Fill (1.5 , " b" , 3.5 ), std::invalid_argument);
215+ EXPECT_THROW (profile.Fill (std::make_tuple (1.5 , " b" ), 3.5 ), std::invalid_argument);
216+ EXPECT_THROW (profile.Fill (1.5 , " b" , 3.5 , RWeight (1 )), std::invalid_argument);
217+ EXPECT_THROW (profile.Fill (std::make_tuple (1.5 , " b" ), 3.5 , RWeight (1 )), std::invalid_argument);
218+
219+ // Verify exception safety. Only the first entry should be there.
220+ EXPECT_EQ (profile.GetNEntries (), 1 );
221+ EXPECT_EQ (profile.GetBinContent (RBinIndex (1 ), RBinIndex (2 )).fSumValues , 3.5 );
222+ EXPECT_EQ (profile.GetStats ().GetSumW (), 1 );
223+ EXPECT_EQ (profile.GetStats ().GetSumW2 (), 1 );
224+ EXPECT_EQ (profile.GetStats ().GetDimensionStats (0 ).fSumWX , 1.5 );
225+ EXPECT_EQ (profile.GetStats ().GetDimensionStats (1 ).fSumWX , 2.5 );
226+ EXPECT_EQ (profile.GetStats ().GetDimensionStats (2 ).fSumWX , 3.5 );
176227}
177228
178229class CopyArgument final {
@@ -201,20 +252,23 @@ int CopyArgument::gCopies = 0;
201252TEST (RProfile, FillForward)
202253{
203254 static constexpr std::size_t Bins = 20 ;
204- RProfile profile (Bins, {0 , Bins});
255+ const RRegularAxis axis (Bins, {0 , Bins});
256+ RProfile profile (axis, axis);
205257 CopyArgument value (23.0 );
206258
207- std::tuple<CopyArgument> args (1.5 );
259+ std::tuple<CopyArgument, CopyArgument > args (1.5 , 2 .5 );
208260 profile.Fill (args, value);
209261 profile.Fill (args, value, RWeight (0.5 ));
210- EXPECT_EQ (profile.GetBinContent (1 ).fSumValues , 34.5 );
262+ EXPECT_EQ (profile.GetNEntries (), 2 );
263+ EXPECT_EQ (profile.GetBinContent (1 , 2 ).fSumValues , 34.5 );
211264
212265 ASSERT_FALSE (CopyArgument::HasBeenCopied ());
213266
214- CopyArgument arg (2.5 );
215- profile.Fill (arg, value);
216- profile.Fill (arg, value, RWeight (0.5 ));
217- EXPECT_EQ (profile.GetBinContent (2 ).fSumValues , 34.5 );
267+ CopyArgument arg1 (3.5 ), arg2 (4.5 );
268+ profile.Fill (arg1, arg2, value);
269+ profile.Fill (arg1, arg2, value, RWeight (0.5 ));
270+ EXPECT_EQ (profile.GetNEntries (), 4 );
271+ EXPECT_EQ (profile.GetBinContent (3 , 4 ).fSumValues , 34.5 );
218272
219273 ASSERT_FALSE (CopyArgument::HasBeenCopied ());
220274}
0 commit comments