@@ -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+
254276TEST_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
0 commit comments