From 642d36f1c55f0b20a4957f198df99d5fca67de84 Mon Sep 17 00:00:00 2001 From: Mingrun Li Date: Wed, 4 Mar 2026 16:51:39 +0800 Subject: [PATCH 1/4] feat: RNTuple with inherited structs --- .../rntuple_inherited_structs/CMakeLists.txt | 21 ++++++ .../rntuple_inherited_structs/LinkDef.h | 13 ++++ .../rntuple_inherited_structs/README.md | 11 +++ .../rntuple_inherited_structs/main.cpp | 68 ++++++++++++++++++ .../rntuple_inherited_structs/structs.h | 33 +++++++++ src/skhep_testdata/data/uproot-pr-1589.root | Bin 0 -> 3122 bytes 6 files changed, 146 insertions(+) create mode 100644 dev/make-root/rntuple_inherited_structs/CMakeLists.txt create mode 100644 dev/make-root/rntuple_inherited_structs/LinkDef.h create mode 100644 dev/make-root/rntuple_inherited_structs/README.md create mode 100644 dev/make-root/rntuple_inherited_structs/main.cpp create mode 100644 dev/make-root/rntuple_inherited_structs/structs.h create mode 100644 src/skhep_testdata/data/uproot-pr-1589.root diff --git a/dev/make-root/rntuple_inherited_structs/CMakeLists.txt b/dev/make-root/rntuple_inherited_structs/CMakeLists.txt new file mode 100644 index 0000000..7d67ee1 --- /dev/null +++ b/dev/make-root/rntuple_inherited_structs/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.20) + +project(rntuple-inherited-structs) + +find_package(ROOT 6.36.0 REQUIRED) + +add_executable(gen-test-data + main.cpp +) + +target_link_libraries(gen-test-data + ROOT::Core + ROOT::RIO + ROOT::ROOTNTuple +) + +ROOT_GENERATE_DICTIONARY(test_rntpl_dict + structs.h + LINKDEF LinkDef.h + MODULE gen-test-data +) diff --git a/dev/make-root/rntuple_inherited_structs/LinkDef.h b/dev/make-root/rntuple_inherited_structs/LinkDef.h new file mode 100644 index 0000000..a26fb09 --- /dev/null +++ b/dev/make-root/rntuple_inherited_structs/LinkDef.h @@ -0,0 +1,13 @@ +#ifdef __CLING__ + +# pragma link off all globals; +# pragma link off all classes; +# pragma link off all functions; + +# pragma link C++ class BaseA + ; +# pragma link C++ class BaseB + ; +# pragma link C++ class Child + ; +# pragma link C++ class GrandChild + ; +# pragma link C++ class MultiParent + ; +# pragma link C++ class MultiGrandParent + ; +#endif diff --git a/dev/make-root/rntuple_inherited_structs/README.md b/dev/make-root/rntuple_inherited_structs/README.md new file mode 100644 index 0000000..da45fe0 --- /dev/null +++ b/dev/make-root/rntuple_inherited_structs/README.md @@ -0,0 +1,11 @@ +To generate data, run: + +```bash +mkdir build +cd build +cmake .. +make +./gen-test-data +``` + +A file `uproot-pr-1589.root` will be generated in the `build` directory. diff --git a/dev/make-root/rntuple_inherited_structs/main.cpp b/dev/make-root/rntuple_inherited_structs/main.cpp new file mode 100644 index 0000000..a329bce --- /dev/null +++ b/dev/make-root/rntuple_inherited_structs/main.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include "structs.h" + +using namespace ROOT; + +void fill_BaseA( BaseA& obj, int i ) { + obj.base_a1 = i; + obj.base_a2 = i * 0.1; + obj.base_a3.clear(); + for ( int j = 0; j < 3; j++ ) { obj.base_a3.push_back( i * j ); } +} + +void fill_BaseB( BaseB& obj, int i ) { obj.base_b = i * 10.0; } + +void fill_Child( Child& obj, int i ) { + fill_BaseA( obj, i ); + obj.child_1 = i * 2; + obj.child_2 = i * 20.0; +} + +void fill_GrandChild( GrandChild& obj, int i ) { + fill_Child( obj, i ); + obj.grandchild_1 = i * 3; + obj.grandchild_2 = i * 30; +} + +void fill_MultiParent( MultiParent& obj, int i ) { + fill_BaseA( obj, i ); + fill_BaseB( obj, i ); + obj.multi_parent_1 = i * 4; + obj.multi_parent_2 = i * 40.0; +} + +void fill_MultiGrandParent( MultiGrandParent& obj, int i ) { + fill_Child( obj, i ); + fill_MultiParent( obj, i ); + obj.multi_grand_parent1 = i * 5; + obj.multi_grand_parent2 = i * 50.0; +} + +int main() { + std::string fname{ "uproot-pr-1589.root" }; + + auto model = RNTupleModel::Create(); + + auto field_child = model->MakeField( "child" ); + auto field_grandchild = model->MakeField( "grandchild" ); + auto field_multi_parent = model->MakeField( "multi_parent" ); + auto field_multi_grandparent = model->MakeField( "multi_grandparent" ); + + auto writer = RNTupleWriter::Recreate( std::move( model ), "rntpl", fname ); + + for ( int i = 0; i < 10; i++ ) + { + fill_Child( *field_child, i ); + fill_GrandChild( *field_grandchild, i ); + fill_MultiParent( *field_multi_parent, i ); + fill_MultiGrandParent( *field_multi_grandparent, i ); + + writer->Fill(); + } + + writer.reset(); + + return 0; +} diff --git a/dev/make-root/rntuple_inherited_structs/structs.h b/dev/make-root/rntuple_inherited_structs/structs.h new file mode 100644 index 0000000..3b52f8d --- /dev/null +++ b/dev/make-root/rntuple_inherited_structs/structs.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +struct BaseA { + int base_a1; + double base_a2; + std::vector base_a3; +}; + +struct BaseB { + double base_b; +}; + +struct Child : public BaseA { + int child_1; + double child_2; +}; + +struct GrandChild : public Child { + int grandchild_1; + double grandchild_2; +}; + +struct MultiParent : public BaseA, BaseB { + int multi_parent_1; + double multi_parent_2; +}; + +struct MultiGrandParent : public Child, MultiParent { + int multi_grand_parent1; + double multi_grand_parent2; +}; diff --git a/src/skhep_testdata/data/uproot-pr-1589.root b/src/skhep_testdata/data/uproot-pr-1589.root new file mode 100644 index 0000000000000000000000000000000000000000..ff94534c62ff7bf06db5c1c53f627f676cd99963 GIT binary patch literal 3122 zcmbVOd0f-S5}#Zogb+fA5&^l19D)hqhyf8Ik5dsbP{c|kCL9{B5D+{nS|}(=L3wgm zA0Qggwo$3H*w(YqiXc^Z@<2Q|s@7M1f<-HWQBR1JVzg#>?-igAz8m#en55kp~#RJIBLcMO;d!)x@lnIkeT!8R z`WNS)&cMtt>>iCZRHgQN$60Hh%`8g@5dvAN7$9af<^wD!sbJr<==FM~eli^-bc{wo zKwIT0iZq!%8bqvIDYVS;aN&Bmu-SQIYIKI+0a(CqNKBGRmVJMgYww0bGQNl{h|7@r zWi&6W_5utMiNt6wisMie5qnoxOvjle5brHb))lV>ib}7bDKC zZWwK`sXba#l0+H7mO4~Dpbw-|f~`q;Y}#%bJKM@Hk7;EkuqiRL%HjWf=wNvOLv{Z@ zcki9PYBUtTJEQs>@P--A`UmnLigPJ?tMmCpeb(?IwN0Ds-~1PpC!tg}tVUL|odtk%-%d{xuEF zMj~MGIwUfMN~2FNysy7{_?MozDf31Yxt;*wpp9J1@JtLSuuxUyRt0VeRo9@hl3NMf z_{xs6ZQXqX!w()khNW)^0}RLIir!^6n)iJ72ams4gG~)>{xy02(w97ju1K0DQutV#VnJ>GF*7_!(!(m$5vw6Nje{I>P4)NpH&n|fJ zUI>3-tRyKVU6C~lk+qm8n^&%oqr*41cl8bkkNIneU;ARmiP5UbKXv{h_+A`9mqG9v zaZ;*0GiTeZ^OHH!``mNaqqhwfAmwTz&Dyp&Q0O9sT1eQ8n z**6G=Xj8rxJWLDj`KD+Q>(PpaB>I{%#OFtZ2{Y4VQi8TRp*tH@aulW7Ez><<%(OGW zuAk;qr#Y;i;m85dXn>;NBRpPaCrWb2&>G>THG=oX2vl*WN%Ed*J^hyWI}T`G z9U4e|p%yY|781Qjv?L)2mnUT?D6186X`*50h|%?-&D4E|C2Y4LS6=fE*f!?}X$Z+R+_tlNW3kw4d;B0HIqt;G z{)zan`Y1nU-5MS5@ajxzJeafP^T90~udCsqUJs3A!3*_+%HDKE}RSgyn7METUN4d zp^Cdl&Yc?HS9)X5SkBA(IcKE$7G?kTYNH(tq#BeObrqcadNH&XV^|K>i&~PUdua69 zy#*7;vmzRHJ~+Nx)U*Cyjo}>ZtDxBO;2*zoUD>+SK9aCjxx3i}?+=mk2C#;uRnI1Bb;r+@-tp#U zR~(w~rx;{BDcaaZ8m{v{AhEf;zNC26;GQXW#jD?!Ha8tG<<}ihjU;~;`a{h+y=6vX z84Gvh_NL+UtdjjV3;IsgiFmbKgHNmq3O$(@-CfGAnWQbf+u8kL_FR)&lRgL9Hugkr z+^fjPx(@WkUjOjE38C>B(Xm}&%&B>tOxv7AFr|FPno5u630pb@HCc-#`?7XhChTd9 zy&U)>vk3FinH|L3^R8>p-8X0UpOFR`)0_^GWWCP=VRU;?TsOOy!T$k!Y`Nb6 literal 0 HcmV?d00001 From ef73228abcf10d961e4710023b47e5b6458b4338 Mon Sep 17 00:00:00 2001 From: Mingrun Li Date: Thu, 5 Mar 2026 02:47:18 +0800 Subject: [PATCH 2/4] Use single file to generate test data --- .../main.cpp => rntuple_inheritance_class.C} | 44 ++++++++++++++++--- .../rntuple_inherited_structs/CMakeLists.txt | 21 --------- .../rntuple_inherited_structs/LinkDef.h | 13 ------ .../rntuple_inherited_structs/README.md | 11 ----- .../rntuple_inherited_structs/structs.h | 33 -------------- 5 files changed, 37 insertions(+), 85 deletions(-) rename dev/make-root/{rntuple_inherited_structs/main.cpp => rntuple_inheritance_class.C} (69%) delete mode 100644 dev/make-root/rntuple_inherited_structs/CMakeLists.txt delete mode 100644 dev/make-root/rntuple_inherited_structs/LinkDef.h delete mode 100644 dev/make-root/rntuple_inherited_structs/README.md delete mode 100644 dev/make-root/rntuple_inherited_structs/structs.h diff --git a/dev/make-root/rntuple_inherited_structs/main.cpp b/dev/make-root/rntuple_inheritance_class.C similarity index 69% rename from dev/make-root/rntuple_inherited_structs/main.cpp rename to dev/make-root/rntuple_inheritance_class.C index a329bce..34532c1 100644 --- a/dev/make-root/rntuple_inherited_structs/main.cpp +++ b/dev/make-root/rntuple_inheritance_class.C @@ -1,9 +1,41 @@ #include #include -#include "structs.h" - -using namespace ROOT; +#include +#include + +using ROOT::RNTupleModel; +using ROOT::RNTupleWriter; + +struct BaseA { + int base_a1; + double base_a2; + std::vector base_a3; +}; + +struct BaseB { + double base_b; +}; + +struct Child : public BaseA { + int child_1; + double child_2; +}; + +struct GrandChild : public Child { + int grandchild_1; + double grandchild_2; +}; + +struct MultiParent : public BaseA, BaseB { + int multi_parent_1; + double multi_parent_2; +}; + +struct MultiGrandParent : public Child, MultiParent { + int multi_grand_parent1; + double multi_grand_parent2; +}; void fill_BaseA( BaseA& obj, int i ) { obj.base_a1 = i; @@ -40,8 +72,8 @@ void fill_MultiGrandParent( MultiGrandParent& obj, int i ) { obj.multi_grand_parent2 = i * 50.0; } -int main() { - std::string fname{ "uproot-pr-1589.root" }; +void rntuple_inherited_structs() { + std::string fname{ "test_class_inheritance_rntuple_v1-0-1-0.root" }; auto model = RNTupleModel::Create(); @@ -63,6 +95,4 @@ int main() { } writer.reset(); - - return 0; } diff --git a/dev/make-root/rntuple_inherited_structs/CMakeLists.txt b/dev/make-root/rntuple_inherited_structs/CMakeLists.txt deleted file mode 100644 index 7d67ee1..0000000 --- a/dev/make-root/rntuple_inherited_structs/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -cmake_minimum_required(VERSION 3.20) - -project(rntuple-inherited-structs) - -find_package(ROOT 6.36.0 REQUIRED) - -add_executable(gen-test-data - main.cpp -) - -target_link_libraries(gen-test-data - ROOT::Core - ROOT::RIO - ROOT::ROOTNTuple -) - -ROOT_GENERATE_DICTIONARY(test_rntpl_dict - structs.h - LINKDEF LinkDef.h - MODULE gen-test-data -) diff --git a/dev/make-root/rntuple_inherited_structs/LinkDef.h b/dev/make-root/rntuple_inherited_structs/LinkDef.h deleted file mode 100644 index a26fb09..0000000 --- a/dev/make-root/rntuple_inherited_structs/LinkDef.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifdef __CLING__ - -# pragma link off all globals; -# pragma link off all classes; -# pragma link off all functions; - -# pragma link C++ class BaseA + ; -# pragma link C++ class BaseB + ; -# pragma link C++ class Child + ; -# pragma link C++ class GrandChild + ; -# pragma link C++ class MultiParent + ; -# pragma link C++ class MultiGrandParent + ; -#endif diff --git a/dev/make-root/rntuple_inherited_structs/README.md b/dev/make-root/rntuple_inherited_structs/README.md deleted file mode 100644 index da45fe0..0000000 --- a/dev/make-root/rntuple_inherited_structs/README.md +++ /dev/null @@ -1,11 +0,0 @@ -To generate data, run: - -```bash -mkdir build -cd build -cmake .. -make -./gen-test-data -``` - -A file `uproot-pr-1589.root` will be generated in the `build` directory. diff --git a/dev/make-root/rntuple_inherited_structs/structs.h b/dev/make-root/rntuple_inherited_structs/structs.h deleted file mode 100644 index 3b52f8d..0000000 --- a/dev/make-root/rntuple_inherited_structs/structs.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include - -struct BaseA { - int base_a1; - double base_a2; - std::vector base_a3; -}; - -struct BaseB { - double base_b; -}; - -struct Child : public BaseA { - int child_1; - double child_2; -}; - -struct GrandChild : public Child { - int grandchild_1; - double grandchild_2; -}; - -struct MultiParent : public BaseA, BaseB { - int multi_parent_1; - double multi_parent_2; -}; - -struct MultiGrandParent : public Child, MultiParent { - int multi_grand_parent1; - double multi_grand_parent2; -}; From 845e2d42b55cc867e2ed77380e903dd42950dd50 Mon Sep 17 00:00:00 2001 From: Mingrun Li Date: Thu, 5 Mar 2026 02:53:22 +0800 Subject: [PATCH 3/4] fix file's name and script's name --- ...ntuple_inheritance_class.C => rntuple_class_inheritance.C} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename dev/make-root/{rntuple_inheritance_class.C => rntuple_class_inheritance.C} (95%) diff --git a/dev/make-root/rntuple_inheritance_class.C b/dev/make-root/rntuple_class_inheritance.C similarity index 95% rename from dev/make-root/rntuple_inheritance_class.C rename to dev/make-root/rntuple_class_inheritance.C index 34532c1..c2f62fe 100644 --- a/dev/make-root/rntuple_inheritance_class.C +++ b/dev/make-root/rntuple_class_inheritance.C @@ -72,8 +72,8 @@ void fill_MultiGrandParent( MultiGrandParent& obj, int i ) { obj.multi_grand_parent2 = i * 50.0; } -void rntuple_inherited_structs() { - std::string fname{ "test_class_inheritance_rntuple_v1-0-1-0.root" }; +void rntuple_class_inheritance() { + std::string fname{ "test_class_inheritance_rntuple_v1-0-0-1.root" }; auto model = RNTupleModel::Create(); From 012e7d629005e5d0edeac80d6cbd52b5b1a9c669 Mon Sep 17 00:00:00 2001 From: Andres Rios Tascon Date: Wed, 4 Mar 2026 13:59:52 -0500 Subject: [PATCH 4/4] Rename uproot-pr-1589.root to test_class_inheritance_rntuple_v1-0-0-1.root --- ...=> test_class_inheritance_rntuple_v1-0-0-1.root} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename src/skhep_testdata/data/{uproot-pr-1589.root => test_class_inheritance_rntuple_v1-0-0-1.root} (100%) diff --git a/src/skhep_testdata/data/uproot-pr-1589.root b/src/skhep_testdata/data/test_class_inheritance_rntuple_v1-0-0-1.root similarity index 100% rename from src/skhep_testdata/data/uproot-pr-1589.root rename to src/skhep_testdata/data/test_class_inheritance_rntuple_v1-0-0-1.root