@@ -398,128 +398,153 @@ TEST(TFileMerger, MergeSelectiveTutorial)
398398// https://github.com/root-project/root/issues/14558
399399TEST (TFileMerger, ImportBranches)
400400{
401- TTree atree (" atree" , " atitle" );
402- int value;
403- atree.Branch (" a" , &value);
404- value = 11 ;
405- atree.Fill ();
406- TTree abtree (" abtree" , " abtitle" );
407- abtree.Branch (" a" , &value);
408- abtree.Branch (" b" , &value);
409- value = 42 ;
410- abtree.Fill ();
411-
412- TTree dummy (" ztree" , " zeroBranches" );
413- TList treelist;
414-
415- // Case 1 - Static: ZeroBranches + 1 entry (1 branch) + 1 entry (2 branch)
416- treelist.Add (&dummy);
417- treelist.Add (&atree);
418- treelist.Add (&abtree);
419- std::unique_ptr<TFile> file1 (TFile::Open (" b4716.root" , " RECREATE" ));
420- auto rtree = TTree::MergeTrees (&treelist, " ImportBranches" );
421- file1->Write ();
422- ASSERT_TRUE (rtree->FindBranch (" a" ));
423- EXPECT_EQ (rtree->FindBranch (" a" )->GetEntries (), 2 );
424- ASSERT_TRUE (rtree->FindBranch (" b" ));
425- EXPECT_EQ (rtree->FindBranch (" b" )->GetEntries (), 2 );
426- ASSERT_TRUE (atree.FindBranch (" a" ));
427- ASSERT_FALSE (atree.FindBranch (" b" ));
428- ASSERT_TRUE (abtree.FindBranch (" a" ));
429- ASSERT_TRUE (abtree.FindBranch (" b" ));
430- EXPECT_EQ (atree.FindBranch (" a" )->GetEntries (), 1 );
431- EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
432- EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
433- EXPECT_EQ (dummy.FindBranch (" a" ), nullptr );
434- EXPECT_EQ (dummy.FindBranch (" b" ), nullptr );
435-
436- // Case 2 - this (ZeroBranches) + 1 entry (1 branch) + 1 entry (2 branch)
437- treelist.Clear ();
438- treelist.Add (&atree);
439- treelist.Add (&abtree);
440- std::unique_ptr<TFile> file2 (TFile::Open (" c4716.root" , " RECREATE" ));
441- TFileMergeInfo info2 (file2.get ());
442- info2.fOptions += " ImportBranches" ;
443- dummy.Merge (&treelist, &info2);
444- file2->Write ();
445- ASSERT_TRUE (dummy.FindBranch (" a" ));
446- EXPECT_EQ (dummy.FindBranch (" a" )->GetEntries (), 2 );
447- ASSERT_TRUE (dummy.FindBranch (" b" ));
448- EXPECT_EQ (dummy.FindBranch (" b" )->GetEntries (), 2 );
449- EXPECT_EQ (atree.GetName (),
450- " ztree" ); // As a side effect of trees with zero branches being ignored but it's name kept since it's first
451- // in list, the first tree with branches (name) gets ztree's name.
452- ASSERT_TRUE (atree.FindBranch (" a" ));
453- EXPECT_EQ (atree.FindBranch (" a" )->GetEntries (), 2 ); // As a side effect, the first with branches (atree) has been
454- // modified and has now 2 entries instead of 1, and ztree's name
455- ASSERT_TRUE (atree.FindBranch (" b" ));
456- EXPECT_EQ (atree.FindBranch (" b" )->GetEntries (), 2 ); // As a side effect, the first with branches (atree) has been
457- // modified and has now 2 entries instead of 1, and ztree's name
458- ASSERT_TRUE (abtree.FindBranch (" a" ));
459- ASSERT_TRUE (abtree.FindBranch (" b" ));
460- EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
461- EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
462-
463- // Case 3 - this (0 entry / 1 branch) + 1 entry (1 branch) + 1 entry (2 branch)
464- TTree atree_ (" atree" , " atitle" ); // Recreate original atree
465- atree_.Branch (" a" , &value);
466- value = 11 ;
467- atree_.Fill ();
468- treelist.Clear ();
469- treelist.Add (&atree_);
470- treelist.Add (&abtree);
471- TTree a0tree (" a0tree" , " a0title" );
472- a0tree.Branch (" a" , &value);
473- std::unique_ptr<TFile> file3 (TFile::Open (" d4716.root" , " RECREATE" ));
474- TFileMergeInfo info3 (file3.get ());
475- info3.fOptions += " ImportBranches" ;
476- a0tree.Merge (&treelist, &info3);
477- file3->Write ();
478- ASSERT_TRUE (a0tree.FindBranch (" a" ));
479- EXPECT_EQ (a0tree.FindBranch (" a" )->GetEntries (), 2 );
480- ASSERT_TRUE (a0tree.FindBranch (" b" ));
481- EXPECT_EQ (a0tree.FindBranch (" b" )->GetEntries (), 2 );
482- ASSERT_TRUE (atree_.FindBranch (" a" ));
483- ASSERT_FALSE (atree_.FindBranch (" b" ));
484- ASSERT_TRUE (abtree.FindBranch (" a" ));
485- ASSERT_TRUE (abtree.FindBranch (" b" ));
486- EXPECT_EQ (atree_.FindBranch (" a" )->GetEntries (), 1 );
487- EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
488- EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
489-
490- // Case 4 - this 1 entry (3 branch) + 1 entry (1 branch) + (0 entry / 1 branch)
491- TTree abctree (" abctree" , " abctitle" );
492- abctree.Branch (" a" , &value);
493- abctree.Branch (" b" , &value);
494- abctree.Branch (" c" , &value);
495- value = 11 ;
496- abctree.Fill ();
497- TTree ctree (" ctree" , " ctitle" );
498- ctree.Branch (" c" , &value);
499- value = 42 ;
500- ctree.Fill ();
501- TTree c0tree (" c0tree" , " c0title" );
502- c0tree.Branch (" c" , &value);
503- std::unique_ptr<TFile> file4 (TFile::Open (" e4716.root" , " RECREATE" ));
504- TFileMergeInfo info4 (file4.get ());
505- info4.fOptions += " ImportBranches" ;
506- treelist.Clear ();
507- treelist.Add (&ctree);
508- treelist.Add (&c0tree);
509- abctree.Merge (&treelist, &info4);
510- file4->Write ();
511- ASSERT_TRUE (abctree.FindBranch (" a" ));
512- ASSERT_TRUE (abctree.FindBranch (" b" ));
513- ASSERT_TRUE (abctree.FindBranch (" c" ));
514- EXPECT_EQ (abctree.FindBranch (" a" )->GetEntries (), 2 );
515- EXPECT_EQ (abctree.FindBranch (" b" )->GetEntries (), 2 );
516- EXPECT_EQ (abctree.FindBranch (" c" )->GetEntries (), 2 );
517- ASSERT_FALSE (ctree.FindBranch (" a" ));
518- ASSERT_FALSE (ctree.FindBranch (" b" ));
519- ASSERT_TRUE (ctree.FindBranch (" c" ));
520- EXPECT_EQ (ctree.FindBranch (" c" )->GetEntries (), 1 );
521- ASSERT_FALSE (c0tree.FindBranch (" a" ));
522- ASSERT_FALSE (c0tree.FindBranch (" b" ));
523- ASSERT_TRUE (c0tree.FindBranch (" c" ));
524- EXPECT_EQ (c0tree.FindBranch (" c" )->GetEntries (), 0 );
401+ {
402+ // Case 1 - Static: ZeroBranches + 1 entry (1 branch) + 1 entry (2 branch)
403+ TTree atree (" atree" , " atitle" );
404+ int value;
405+ atree.Branch (" a" , &value);
406+ value = 11 ;
407+ atree.Fill ();
408+ TTree abtree (" abtree" , " abtitle" );
409+ abtree.Branch (" a" , &value);
410+ abtree.Branch (" b" , &value);
411+ value = 42 ;
412+ abtree.Fill ();
413+
414+ TTree dummy (" ztree" , " zeroBranches" );
415+ TList treelist;
416+ treelist.Add (&dummy);
417+ treelist.Add (&atree);
418+ treelist.Add (&abtree);
419+ std::unique_ptr<TFile> file1 (TFile::Open (" b4716.root" , " RECREATE" ));
420+ auto rtree = TTree::MergeTrees (&treelist, " ImportBranches" );
421+ file1->Write ();
422+ ASSERT_TRUE (rtree->FindBranch (" a" ));
423+ EXPECT_EQ (rtree->FindBranch (" a" )->GetEntries (), 2 );
424+ ASSERT_TRUE (rtree->FindBranch (" b" ));
425+ EXPECT_EQ (rtree->FindBranch (" b" )->GetEntries (), 2 );
426+ ASSERT_TRUE (atree.FindBranch (" a" ));
427+ ASSERT_FALSE (atree.FindBranch (" b" ));
428+ ASSERT_TRUE (abtree.FindBranch (" a" ));
429+ ASSERT_TRUE (abtree.FindBranch (" b" ));
430+ EXPECT_EQ (atree.FindBranch (" a" )->GetEntries (), 1 );
431+ EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
432+ EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
433+ EXPECT_EQ (dummy.FindBranch (" a" ), nullptr );
434+ EXPECT_EQ (dummy.FindBranch (" b" ), nullptr );
435+ }
436+ {
437+ // Case 2 - this (ZeroBranches) + 1 entry (1 branch) + 1 entry (2 branch)
438+ TTree atree (" atree" , " atitle" );
439+ int value;
440+ atree.Branch (" a" , &value);
441+ value = 11 ;
442+ atree.Fill ();
443+ TTree abtree (" abtree" , " abtitle" );
444+ abtree.Branch (" a" , &value);
445+ abtree.Branch (" b" , &value);
446+ value = 42 ;
447+ abtree.Fill ();
448+
449+ TTree dummy (" ztree" , " zeroBranches" );
450+ TList treelist;
451+ treelist.Add (&atree);
452+ treelist.Add (&abtree);
453+ std::unique_ptr<TFile> file2 (TFile::Open (" c4716.root" , " RECREATE" ));
454+ TFileMergeInfo info2 (file2.get ());
455+ info2.fOptions += " ImportBranches" ;
456+ dummy.Merge (&treelist, &info2);
457+ file2->Write ();
458+ ASSERT_TRUE (dummy.FindBranch (" a" ));
459+ EXPECT_EQ (dummy.FindBranch (" a" )->GetEntries (), 2 );
460+ ASSERT_TRUE (dummy.FindBranch (" b" ));
461+ EXPECT_EQ (dummy.FindBranch (" b" )->GetEntries (), 2 );
462+ EXPECT_EQ (atree.GetName (),
463+ " ztree" ); // As a side effect of trees with zero branches being ignored but it's name kept since it's first
464+ // in list, the first tree with branches (name) gets ztree's name.
465+ ASSERT_TRUE (atree.FindBranch (" a" ));
466+ EXPECT_EQ (atree.FindBranch (" a" )->GetEntries (), 2 ); // As a side effect, the first with branches (atree) has been
467+ // modified and has now 2 entries instead of 1, and ztree's name
468+ ASSERT_TRUE (atree.FindBranch (" b" ));
469+ EXPECT_EQ (atree.FindBranch (" b" )->GetEntries (), 2 ); // As a side effect, the first with branches (atree) has been
470+ // modified and has now 2 entries instead of 1, and ztree's name
471+ ASSERT_TRUE (abtree.FindBranch (" a" ));
472+ ASSERT_TRUE (abtree.FindBranch (" b" ));
473+ EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
474+ EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
475+ }
476+ {
477+ // Case 3 - this (0 entry / 1 branch) + 1 entry (1 branch) + 1 entry (2 branch)
478+ TTree atree (" atree" , " atitle" );
479+ int value;
480+ atree.Branch (" a" , &value);
481+ value = 11 ;
482+ atree.Fill ();
483+ TTree abtree (" abtree" , " abtitle" );
484+ abtree.Branch (" a" , &value);
485+ abtree.Branch (" b" , &value);
486+ value = 42 ;
487+ abtree.Fill ();
488+
489+ TList treelist;
490+ treelist.Add (&atree);
491+ treelist.Add (&abtree);
492+ TTree a0tree (" a0tree" , " a0title" );
493+ a0tree.Branch (" a" , &value);
494+ std::unique_ptr<TFile> file3 (TFile::Open (" d4716.root" , " RECREATE" ));
495+ TFileMergeInfo info3 (file3.get ());
496+ info3.fOptions += " ImportBranches" ;
497+ a0tree.Merge (&treelist, &info3);
498+ file3->Write ();
499+ ASSERT_TRUE (a0tree.FindBranch (" a" ));
500+ EXPECT_EQ (a0tree.FindBranch (" a" )->GetEntries (), 2 );
501+ ASSERT_TRUE (a0tree.FindBranch (" b" ));
502+ EXPECT_EQ (a0tree.FindBranch (" b" )->GetEntries (), 2 );
503+ ASSERT_TRUE (atree.FindBranch (" a" ));
504+ ASSERT_FALSE (atree.FindBranch (" b" ));
505+ ASSERT_TRUE (abtree.FindBranch (" a" ));
506+ ASSERT_TRUE (abtree.FindBranch (" b" ));
507+ EXPECT_EQ (atree.FindBranch (" a" )->GetEntries (), 1 );
508+ EXPECT_EQ (abtree.FindBranch (" a" )->GetEntries (), 1 );
509+ EXPECT_EQ (abtree.FindBranch (" b" )->GetEntries (), 1 );
510+ }
511+ {
512+ // Case 4 - this 1 entry (3 branch) + 1 entry (1 branch) + (0 entry / 1 branch)
513+ TTree abctree (" abctree" , " abctitle" );
514+ int value;
515+ abctree.Branch (" a" , &value);
516+ abctree.Branch (" b" , &value);
517+ abctree.Branch (" c" , &value);
518+ value = 11 ;
519+ abctree.Fill ();
520+ TTree ctree (" ctree" , " ctitle" );
521+ ctree.Branch (" c" , &value);
522+ value = 42 ;
523+ ctree.Fill ();
524+ TTree c0tree (" c0tree" , " c0title" );
525+ c0tree.Branch (" c" , &value);
526+
527+ std::unique_ptr<TFile> file4 (TFile::Open (" e4716.root" , " RECREATE" ));
528+ TFileMergeInfo info4 (file4.get ());
529+ info4.fOptions += " ImportBranches" ;
530+ TList treelist;
531+ treelist.Add (&ctree);
532+ treelist.Add (&c0tree);
533+ abctree.Merge (&treelist, &info4);
534+ file4->Write ();
535+ ASSERT_TRUE (abctree.FindBranch (" a" ));
536+ ASSERT_TRUE (abctree.FindBranch (" b" ));
537+ ASSERT_TRUE (abctree.FindBranch (" c" ));
538+ EXPECT_EQ (abctree.FindBranch (" a" )->GetEntries (), 2 );
539+ EXPECT_EQ (abctree.FindBranch (" b" )->GetEntries (), 2 );
540+ EXPECT_EQ (abctree.FindBranch (" c" )->GetEntries (), 2 );
541+ ASSERT_FALSE (ctree.FindBranch (" a" ));
542+ ASSERT_FALSE (ctree.FindBranch (" b" ));
543+ ASSERT_TRUE (ctree.FindBranch (" c" ));
544+ EXPECT_EQ (ctree.FindBranch (" c" )->GetEntries (), 1 );
545+ ASSERT_FALSE (c0tree.FindBranch (" a" ));
546+ ASSERT_FALSE (c0tree.FindBranch (" b" ));
547+ ASSERT_TRUE (c0tree.FindBranch (" c" ));
548+ EXPECT_EQ (c0tree.FindBranch (" c" )->GetEntries (), 0 );
549+ }
525550}
0 commit comments