Skip to content

Commit 600ffef

Browse files
committed
[ntuple] Add tests for subfields
1 parent 94f6d58 commit 600ffef

2 files changed

Lines changed: 68 additions & 9 deletions

File tree

tree/ntuple/test/ntuple_processor.cxx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,24 +94,28 @@ class RNTupleProcessorTest : public testing::Test {
9494
auto fldI = model->MakeField<int>("i");
9595
auto fldX = model->MakeField<float>("x");
9696
auto fldY = model->MakeField<std::vector<float>>("y");
97+
auto fldStruct = model->MakeField<CustomStruct>("struct");
9798
auto ntuple = RNTupleWriter::Recreate(std::move(model), fNTupleNames[0], fFileNames[0]);
9899

99100
for (unsigned i = 0; i < 5; i++) {
100101
*fldI = i;
101102
*fldX = static_cast<float>(i);
102103
*fldY = {static_cast<float>(i), static_cast<float>(i * 2)};
104+
fldStruct->a = i * 1.f;
103105
ntuple->Fill();
104106
}
105107
}
106108
{
107109
auto model = RNTupleModel::Create();
108110
auto fldI = model->MakeField<int>("i");
109111
auto fldZ = model->MakeField<float>("z");
112+
auto fldStruct = model->MakeField<CustomStruct>("struct");
110113
auto ntuple = RNTupleWriter::Recreate(std::move(model), fNTupleNames[1], fFileNames[1]);
111114

112115
for (unsigned i = 0; i < 5; ++i) {
113116
*fldI = i;
114117
*fldZ = i * 2.f;
118+
fldStruct->a = i * 2.f;
115119
ntuple->Fill();
116120
}
117121
}
@@ -120,11 +124,14 @@ class RNTupleProcessorTest : public testing::Test {
120124
auto model = RNTupleModel::Create();
121125
auto fldI = model->MakeField<int>("i");
122126
auto fldZ = model->MakeField<float>("z");
127+
auto fldStruct = model->MakeField<CustomStruct>("struct");
123128
auto ntuple = RNTupleWriter::Recreate(std::move(model), fNTupleNames[2], fFileNames[2]);
124129

125130
for (int i = 4; i >= 0; --i) {
126131
*fldI = i;
127132
*fldZ = i * 3.f;
133+
fldStruct->a = i * 3.f;
134+
128135
ntuple->Fill();
129136
}
130137
}
@@ -133,13 +140,15 @@ class RNTupleProcessorTest : public testing::Test {
133140
auto model = RNTupleModel::Create();
134141
auto fldI = model->MakeField<int>("i");
135142
auto fldZ = model->MakeField<float>("z");
143+
auto fldStruct = model->MakeField<CustomStruct>("struct");
136144
auto ntuple = RNTupleWriter::Recreate(std::move(model), fNTupleNames[3], fFileNames[3]);
137145

138146
for (unsigned i = 0; i < 5; ++i) {
139147
if (i % 2 == 1)
140148
continue;
141149
*fldI = i;
142150
*fldZ = i * 4.f;
151+
fldStruct->a = i * 4.f;
143152
ntuple->Fill();
144153
}
145154
}
@@ -251,6 +260,19 @@ TEST_F(RNTupleProcessorTest, AlternativeTypes)
251260
}
252261
}
253262

263+
TEST_F(RNTupleProcessorTest, Subfields)
264+
{
265+
auto proc = RNTupleProcessor::Create({fNTupleNames[0], fFileNames[0]});
266+
267+
auto strct = proc->RequestField<CustomStruct>("struct");
268+
auto strct_a = proc->RequestField<float>("struct.a");
269+
270+
for (auto idx : *proc) {
271+
EXPECT_FLOAT_EQ(idx, idx);
272+
EXPECT_FLOAT_EQ(strct->a, *strct_a);
273+
}
274+
}
275+
254276
TEST_F(RNTupleProcessorTest, PrintStructureSingle)
255277
{
256278
auto proc = RNTupleProcessor::Create({fNTupleNames[0], fFileNames[0]});
@@ -311,6 +333,7 @@ TEST_F(RNTupleProcessorTest, ChainedJoin)
311333
auto i = proc->RequestField<int>("i");
312334
auto x = proc->RequestField<float>("x");
313335
auto z = proc->RequestField<float>("ntuple_aux.z");
336+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
314337

315338
for (auto idx : *proc) {
316339
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -319,6 +342,7 @@ TEST_F(RNTupleProcessorTest, ChainedJoin)
319342

320343
EXPECT_EQ(static_cast<float>(*i), *x);
321344
EXPECT_EQ(*x * 2, *z);
345+
EXPECT_EQ(*z, *strct_a);
322346
}
323347
EXPECT_EQ(10, proc->GetNEntriesProcessed());
324348
}
@@ -336,6 +360,7 @@ TEST_F(RNTupleProcessorTest, ChainedJoinUnaligned)
336360
auto i = proc->RequestField<int>("i");
337361
auto x = proc->RequestField<float>("x");
338362
auto z = proc->RequestField<float>("ntuple_aux.z");
363+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
339364

340365
for (auto idx : *proc) {
341366
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -344,6 +369,7 @@ TEST_F(RNTupleProcessorTest, ChainedJoinUnaligned)
344369

345370
EXPECT_EQ(static_cast<float>(*i), *x);
346371
EXPECT_EQ(*x * 3, *z);
372+
EXPECT_EQ(*z, *strct_a);
347373
}
348374
EXPECT_EQ(10, proc->GetNEntriesProcessed());
349375
}
@@ -361,6 +387,7 @@ TEST_F(RNTupleProcessorTest, ChainedJoinMissingEntries)
361387
auto i = proc->RequestField<int>("i");
362388
auto x = proc->RequestField<float>("x");
363389
auto z = proc->RequestField<float>("ntuple_aux.z");
390+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
364391

365392
for (auto idx : *proc) {
366393
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -371,9 +398,12 @@ TEST_F(RNTupleProcessorTest, ChainedJoinMissingEntries)
371398

372399
if ((idx % 5) % 2 == 1) {
373400
EXPECT_FALSE(z.HasValue());
401+
EXPECT_FALSE(strct_a.HasValue());
374402
} else {
375403
EXPECT_TRUE(z.HasValue());
404+
EXPECT_TRUE(strct_a.HasValue());
376405
EXPECT_EQ(*x * 4, *z);
406+
EXPECT_EQ(*z, *strct_a);
377407
}
378408
}
379409
EXPECT_EQ(10, proc->GetNEntriesProcessed());
@@ -392,6 +422,7 @@ TEST_F(RNTupleProcessorTest, JoinedChain)
392422
auto i = proc->RequestField<int>("i");
393423
auto x = proc->RequestField<float>("x");
394424
auto z = proc->RequestField<float>("ntuple_aux.z");
425+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
395426

396427
for (auto idx : *proc) {
397428
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -400,6 +431,7 @@ TEST_F(RNTupleProcessorTest, JoinedChain)
400431

401432
EXPECT_EQ(static_cast<float>(*i), *x);
402433
EXPECT_EQ(*x * 2, *z);
434+
EXPECT_EQ(*z, *strct_a);
403435
}
404436
EXPECT_EQ(10, proc->GetNEntriesProcessed());
405437
}
@@ -417,6 +449,7 @@ TEST_F(RNTupleProcessorTest, JoinedChainUnaligned)
417449
auto i = proc->RequestField<int>("i");
418450
auto x = proc->RequestField<float>("x");
419451
auto z = proc->RequestField<float>("ntuple_aux.z");
452+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
420453

421454
for (auto idx : *proc) {
422455
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -425,6 +458,7 @@ TEST_F(RNTupleProcessorTest, JoinedChainUnaligned)
425458

426459
EXPECT_EQ(static_cast<float>(*i), *x);
427460
EXPECT_EQ(*x * 3, *z);
461+
EXPECT_EQ(*z, *strct_a);
428462
}
429463
EXPECT_EQ(10, proc->GetNEntriesProcessed());
430464
}
@@ -442,6 +476,7 @@ TEST_F(RNTupleProcessorTest, JoinedChainMissingEntries)
442476
auto i = proc->RequestField<int>("i");
443477
auto x = proc->RequestField<float>("x");
444478
auto z = proc->RequestField<float>("ntuple_aux.z");
479+
auto strct_a = proc->RequestField<float>("ntuple_aux.struct.a");
445480

446481
for (auto idx : *proc) {
447482
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -452,9 +487,12 @@ TEST_F(RNTupleProcessorTest, JoinedChainMissingEntries)
452487

453488
if ((idx % 5) % 2 == 1) {
454489
EXPECT_FALSE(z.HasValue());
490+
EXPECT_FALSE(strct_a.HasValue());
455491
} else {
456492
EXPECT_TRUE(z.HasValue());
493+
EXPECT_TRUE(strct_a.HasValue());
457494
EXPECT_EQ(*x * 4, *z);
495+
EXPECT_EQ(*z, *strct_a);
458496
}
459497
}
460498
EXPECT_EQ(10, proc->GetNEntriesProcessed());
@@ -472,7 +510,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedPrimary)
472510
auto i = proc->RequestField<int>("i");
473511
auto x = proc->RequestField<float>("x");
474512
auto z1 = proc->RequestField<float>("ntuple_aux.z");
513+
auto strct_a1 = proc->RequestField<float>("ntuple_aux.struct.a");
475514
auto z2 = proc->RequestField<float>("ntuple_aux2.z");
515+
auto strct_a2 = proc->RequestField<float>("ntuple_aux2.struct.a");
476516

477517
for (auto idx : *proc) {
478518
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -481,7 +521,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedPrimary)
481521

482522
EXPECT_EQ(static_cast<float>(*i), *x);
483523
EXPECT_EQ(*x * 2, *z1);
524+
EXPECT_EQ(*x * 2, *strct_a1);
484525
EXPECT_EQ(*x * 3, *z2);
526+
EXPECT_EQ(*x * 3, *strct_a2);
485527
}
486528
EXPECT_EQ(5, proc->GetNEntriesProcessed());
487529
}
@@ -498,7 +540,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedPrimaryMissingEntries)
498540
auto i = proc->RequestField<int>("i");
499541
auto x = proc->RequestField<float>("x");
500542
auto z1 = proc->RequestField<float>("ntuple_aux.z");
543+
auto strct_a1 = proc->RequestField<float>("ntuple_aux.struct.a");
501544
auto z2 = proc->RequestField<float>("ntuple_aux2.z");
545+
auto strct_a2 = proc->RequestField<float>("ntuple_aux2.struct.a");
502546

503547
for (auto idx : *proc) {
504548
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -507,12 +551,16 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedPrimaryMissingEntries)
507551

508552
EXPECT_EQ(static_cast<float>(*i), *x);
509553
EXPECT_EQ(*x * 2, *z1);
554+
EXPECT_EQ(*x * 2, *strct_a1);
510555

511556
if (idx % 2 == 1) {
512557
EXPECT_FALSE(z2.HasValue());
558+
EXPECT_FALSE(strct_a2.HasValue());
513559
} else {
514560
EXPECT_TRUE(z2.HasValue());
561+
EXPECT_TRUE(strct_a2.HasValue());
515562
EXPECT_EQ(*x * 4, *z2);
563+
EXPECT_EQ(*x * 4, *strct_a2);
516564
}
517565
}
518566
EXPECT_EQ(5, proc->GetNEntriesProcessed());
@@ -532,7 +580,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedAuxiliary)
532580
auto i = proc->RequestField<int>("i");
533581
auto x = proc->RequestField<float>("x");
534582
auto z1 = proc->RequestField<float>("ntuple_aux.z");
583+
auto strct_a1 = proc->RequestField<float>("ntuple_aux.struct.a");
535584
auto z2 = proc->RequestField<float>("ntuple_aux.ntuple_aux2.z");
585+
auto strct_a2 = proc->RequestField<float>("ntuple_aux.ntuple_aux2.struct.a");
536586

537587
for (auto idx : *proc) {
538588
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -541,7 +591,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedAuxiliary)
541591

542592
EXPECT_EQ(static_cast<float>(*i), *x);
543593
EXPECT_EQ(*x * 2, *z1);
594+
EXPECT_EQ(*x * 2, *strct_a1);
544595
EXPECT_EQ(*x * 3, *z2);
596+
EXPECT_EQ(*x * 3, *strct_a2);
545597
}
546598

547599
EXPECT_EQ(5, proc->GetNEntriesProcessed());
@@ -561,7 +613,9 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedAuxiliaryMissingEntries)
561613
auto i = proc->RequestField<int>("i");
562614
auto x = proc->RequestField<float>("x");
563615
auto z1 = proc->RequestField<float>("ntuple_aux.z");
616+
auto strct_a1 = proc->RequestField<float>("ntuple_aux.struct.a");
564617
auto z2 = proc->RequestField<float>("ntuple_aux.ntuple_aux2.z");
618+
auto strct_a2 = proc->RequestField<float>("ntuple_aux.ntuple_aux2.struct.a");
565619

566620
for (auto idx : *proc) {
567621
EXPECT_EQ(idx + 1, proc->GetNEntriesProcessed());
@@ -570,12 +624,16 @@ TEST_F(RNTupleProcessorTest, JoinedJoinComposedAuxiliaryMissingEntries)
570624

571625
EXPECT_EQ(static_cast<float>(*i), *x);
572626
EXPECT_EQ(*x * 2, *z1);
627+
EXPECT_EQ(*x * 2, *strct_a1);
573628

574629
if (idx % 2 == 1) {
575630
EXPECT_FALSE(z2.HasValue());
631+
EXPECT_FALSE(strct_a2.HasValue());
576632
} else {
577633
EXPECT_TRUE(z2.HasValue());
634+
EXPECT_TRUE(strct_a2.HasValue());
578635
EXPECT_EQ(*x * 4, *z2);
636+
EXPECT_EQ(*x * 4, *strct_a2);
579637
}
580638
}
581639

tree/ntuple/test/ntuple_processor_join.cxx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,13 @@ TEST(RNTupleJoinProcessor, NameConflict)
128128
FileRaii fileGuard("ntuple_processor_join_name_conflict.root");
129129
{
130130
auto model = RNTupleModel::Create();
131-
auto fldA = model->MakeField<float>("a");
131+
auto fldStruct = model->MakeField<CustomStruct>("struct");
132132

133133
auto file = std::unique_ptr<TFile>(TFile::Open(fileGuard.GetPath().c_str(), "RECREATE"));
134134
auto ntuple = RNTupleWriter::Append(std::move(model), "ntuple", *file);
135135

136136
for (unsigned i = 0; i < 5; ++i) {
137-
*fldA = i;
137+
fldStruct->a = i;
138138
ntuple->Fill();
139139
}
140140
}
@@ -143,23 +143,24 @@ TEST(RNTupleJoinProcessor, NameConflict)
143143
auto fldB = model->MakeField<float>("b");
144144

145145
auto file = std::unique_ptr<TFile>(TFile::Open(fileGuard.GetPath().c_str(), "UPDATE"));
146-
auto ntuple = RNTupleWriter::Append(std::move(model), "a", *file);
146+
auto ntuple = RNTupleWriter::Append(std::move(model), "struct", *file);
147147

148148
for (unsigned i = 0; i < 5; ++i) {
149149
*fldB = i * 2;
150150
ntuple->Fill();
151151
}
152152
}
153153

154-
auto proc = RNTupleProcessor::CreateJoin({"ntuple", fileGuard.GetPath()}, {"a", fileGuard.GetPath()}, {});
154+
auto proc = RNTupleProcessor::CreateJoin({"ntuple", fileGuard.GetPath()}, {"struct", fileGuard.GetPath()}, {});
155155

156156
try {
157-
proc->RequestField<float>("a");
157+
proc->RequestField<float>("struct.a");
158158
} catch (const ROOT::RException &err) {
159-
EXPECT_THAT(err.what(), testing::HasSubstr(
160-
"ambiguous field name: \"a\" is present in the primary RNTupleProcessor \"ntuple\", "
161-
"but may also refer to a field in the auxiliary RNTupleProcessor named \"a\". To "
162-
"avoid this ambiguity, rename the auxiliary RNTupleProcessor."));
159+
EXPECT_THAT(
160+
err.what(),
161+
testing::HasSubstr("ambiguous field name: \"struct.a\" is present in the primary RNTupleProcessor \"ntuple\", "
162+
"but may also refer to a field in the auxiliary RNTupleProcessor named \"struct\". To "
163+
"avoid this ambiguity, rename the auxiliary RNTupleProcessor."));
163164
}
164165
}
165166

0 commit comments

Comments
 (0)