Skip to content

Commit 57dd8d0

Browse files
committed
[RDF] Add tests for GetClusterBoundaries
1 parent 73ed51f commit 57dd8d0

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

tree/dataframe/test/dataframe_utils.cxx

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "ROOT/RDataFrame.hxx"
22
#include "ROOT/RDF/Utils.hxx"
3+
#include "ROOT/RNTupleDS.hxx"
34
#include "TTree.h"
45

56
#include "gtest/gtest.h"
@@ -8,6 +9,7 @@
89
#include <vector>
910

1011
#include <TBranch.h>
12+
#include <TSystem.h>
1113

1214
namespace RDFInt = ROOT::Internal::RDF;
1315

@@ -237,3 +239,81 @@ TEST(RDataFrameUtils, TypeName2TypeID)
237239
EXPECT_THROW(RDFInt::TypeName2TypeID("float *"), std::runtime_error);
238240
EXPECT_THROW(RDFInt::TypeName2TypeID("float &"), std::runtime_error);
239241
}
242+
243+
TEST(RDataFrameUtils, GetClusterRanges)
244+
{
245+
const std::string fnameTTree1 = "dataframe_interfaceAndUtils_2_tree_1.root";
246+
const std::string fnameTTree2 = "dataframe_interfaceAndUtils_2_tree_2.root";
247+
const std::string fnameRNTuple1 = "dataframe_interfaceAndUtils_2_rntuple_1.root";
248+
const std::string fnameRNTuple2 = "dataframe_interfaceAndUtils_2_rntuple_2.root";
249+
const int nEntries = 1000;
250+
const int clusterSize = 250;
251+
252+
// Test TTree single file
253+
{
254+
ROOT::RDF::RSnapshotOptions opts;
255+
opts.fAutoFlush = clusterSize;
256+
auto df = ROOT::RDataFrame(nEntries).Define("i", "rdfentry_");
257+
df.Snapshot("t", fnameTTree1, {"i"}, opts);
258+
df.Snapshot("t", fnameTTree2, {"i"}, opts);
259+
}
260+
{
261+
ROOT::RDataFrame dfTTree("t", fnameTTree1);
262+
auto rangesTTree = RDFInt::GetClusterBoundaries(dfTTree);
263+
264+
EXPECT_EQ(rangesTTree.size(), nEntries / clusterSize);
265+
for (size_t i = 0; i < rangesTTree.size(); ++i) {
266+
EXPECT_EQ(rangesTTree[i].first, i * clusterSize);
267+
EXPECT_EQ(rangesTTree[i].second, (i + 1) * clusterSize);
268+
}
269+
}
270+
271+
// Test TTree multiple files (chain)
272+
{
273+
ROOT::RDataFrame dfTTreeChain("t", {fnameTTree1, fnameTTree2});
274+
auto rangesTTreeChain = RDFInt::GetClusterBoundaries(dfTTreeChain);
275+
276+
EXPECT_EQ(rangesTTreeChain.size(), 2 * nEntries / clusterSize);
277+
for (size_t i = 0; i < rangesTTreeChain.size(); ++i) {
278+
EXPECT_EQ(rangesTTreeChain[i].first, i * clusterSize);
279+
EXPECT_EQ(rangesTTreeChain[i].second, (i + 1) * clusterSize);
280+
}
281+
}
282+
gSystem->Unlink(fnameTTree1.c_str());
283+
gSystem->Unlink(fnameTTree2.c_str());
284+
285+
// Test RNTuple single file
286+
{
287+
ROOT::RDF::RSnapshotOptions opts;
288+
opts.fOutputFormat = ROOT::RDF::ESnapshotOutputFormat::kRNTuple;
289+
auto df = ROOT::RDataFrame(nEntries).Define("i", "rdfentry_");
290+
df.Snapshot("nt", fnameRNTuple1, {"i"}, opts);
291+
df.Snapshot("nt", fnameRNTuple2, {"i"}, opts);
292+
}
293+
{
294+
auto dfRNTuple = ROOT::RDF::FromRNTuple("nt", fnameRNTuple1);
295+
auto rangesRNTuple = RDFInt::GetClusterBoundaries(dfRNTuple);
296+
297+
EXPECT_FALSE(rangesRNTuple.empty());
298+
EXPECT_EQ(rangesRNTuple.front().first, 0u);
299+
EXPECT_EQ(rangesRNTuple.back().second, ULong64_t(nEntries));
300+
for (size_t i = 1; i < rangesRNTuple.size(); ++i) {
301+
EXPECT_EQ(rangesRNTuple[i].first, rangesRNTuple[i - 1].second);
302+
}
303+
}
304+
305+
// Test RNTuple multiple files
306+
{
307+
auto dfRNTupleChain = ROOT::RDF::FromRNTuple("nt", {fnameRNTuple1, fnameRNTuple2});
308+
auto rangesRNTupleChain = RDFInt::GetClusterBoundaries(dfRNTupleChain);
309+
310+
EXPECT_FALSE(rangesRNTupleChain.empty());
311+
EXPECT_EQ(rangesRNTupleChain.front().first, 0u);
312+
EXPECT_EQ(rangesRNTupleChain.back().second, ULong64_t(2 * nEntries));
313+
for (size_t i = 1; i < rangesRNTupleChain.size(); ++i) {
314+
EXPECT_EQ(rangesRNTupleChain[i].first, rangesRNTupleChain[i - 1].second);
315+
}
316+
}
317+
gSystem->Unlink(fnameRNTuple1.c_str());
318+
gSystem->Unlink(fnameRNTuple2.c_str());
319+
}

0 commit comments

Comments
 (0)