{
"cells": [
{
"cell_type": "markdown",
"id": "f493e052",
"metadata": {},
"source": [
"# ntpl015_processor_join\n",
"Demonstrate the RNTupleProcessor for horizontal compositions (joins) of RNTuples\n",
"\n",
"\n",
"\n",
"\n",
"**Author:** The ROOT Team \n",
"This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, May 19, 2026 at 08:15 PM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "124ee61e",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:32.998056Z",
"iopub.status.busy": "2026-05-19T20:15:32.997946Z",
"iopub.status.idle": "2026-05-19T20:15:33.035238Z",
"shell.execute_reply": "2026-05-19T20:15:33.034639Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"#include \n",
"#include \n",
"#include \n",
"\n",
"#include \n",
"#include \n",
"#include \n",
"\n",
"using ROOT::Experimental::RNTupleOpenSpec;\n",
"using ROOT::Experimental::RNTupleProcessor;\n",
"\n",
"const std::string kPrimaryNTupleName = \"mainNTuple\";\n",
"const std::string kMainNTuplePath = \"main_ntuple.root\";\n",
"const std::string kAuxNTupleName = \"auxNTuple\";\n",
"const std::string kAuxNTuplePath = \"aux_ntuple.root\";\n",
"\n",
"constexpr int kNEvents = 10000;"
]
},
{
"cell_type": "markdown",
"id": "085d1ce0",
"metadata": {},
"source": [
" NOTE: The RNTupleProcessor and related classes are experimental at this point.\n",
"Functionality and interface are still subject to changes.\n",
"Import classes from the `Experimental` namespace for the time being.\n",
"Number of events to generate for the auxiliary ntuple. The primary ntuple will have a fifth of this number.\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1bc8e2c9",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:33.037043Z",
"iopub.status.busy": "2026-05-19T20:15:33.036921Z",
"iopub.status.idle": "2026-05-19T20:15:33.265522Z",
"shell.execute_reply": "2026-05-19T20:15:33.264782Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"void WritePrimary(std::string_view ntupleName, std::string_view ntupleFileName)\n",
"{\n",
" auto model = ROOT::RNTupleModel::Create();\n",
"\n",
" auto fldI = model->MakeField(\"i\");\n",
" auto fldVpx = model->MakeField(\"vpx\");\n",
"\n",
" auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), ntupleName, ntupleFileName);\n",
"\n",
" // The primary ntuple only contains a subset of the entries present in the auxiliary ntuple.\n",
" for (int i = 0; i < kNEvents; i += 5) {\n",
" *fldI = i;\n",
" *fldVpx = gRandom->Gaus();\n",
"\n",
" writer->Fill();\n",
" }\n",
"\n",
" std::cout << \"Wrote \" << writer->GetNEntries() << \" to the primary RNTuple\" << std::endl;\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "b9426993",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "540820ca",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:33.267059Z",
"iopub.status.busy": "2026-05-19T20:15:33.266935Z",
"iopub.status.idle": "2026-05-19T20:15:33.374836Z",
"shell.execute_reply": "2026-05-19T20:15:33.374148Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"void WriteAux(std::string_view ntupleName, std::string_view ntupleFileName)\n",
"{\n",
" auto model = ROOT::RNTupleModel::Create();\n",
"\n",
" auto fldI = model->MakeField(\"i\");\n",
" auto fldVpy = model->MakeField(\"vpy\");\n",
"\n",
" auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), ntupleName, ntupleFileName);\n",
"\n",
" for (int i = 0; i < kNEvents; ++i) {\n",
" *fldI = i;\n",
" *fldVpy = gRandom->Gaus();\n",
"\n",
" writer->Fill();\n",
" }\n",
"\n",
" std::cout << \"Wrote \" << writer->GetNEntries() << \" to the auxiliary RNTuple\" << std::endl;\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "15a2cfc5",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "08cefa9d",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:33.376441Z",
"iopub.status.busy": "2026-05-19T20:15:33.376312Z",
"iopub.status.idle": "2026-05-19T20:15:33.511304Z",
"shell.execute_reply": "2026-05-19T20:15:33.511004Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[runStaticInitializersOnce]: Failed to materialize symbols: { (main, { _ZNRSt8__detail9__variant14_UninitializedINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0EE6_M_getEv, _ZNSt8__detail9__variant15_Variadic_unionILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC1IJRKS7_EEESt16in_place_index_tILm0EEDpOT_, _ZNSt15__uniq_ptr_implIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EE6_M_ptrEv, _ZNKSt12__shared_ptrIfLN9__gnu_cxx12_Lock_policyE2EEcvbEv, _ZNSt8__detail9__variant13_Variant_baseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC2ILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC2ERKS6_, _ZNSt8__detail9__variant14_UninitializedINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0EEC2IJRKS7_EEESt16in_place_index_tILm0EEDpOT_, _ZN4ROOT12Experimental16RNTupleProcessor9RIteratorC2ERS1_m, _ZNSt15__uniq_ptr_implIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EE10_M_deleterEv, _ZNKSt19__shared_ptr_accessIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2ELb0ELb0EE6_M_getEv, cling_module_259_, _ZSt3getILm1EJPN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEERNSt13tuple_elementIXT_ESt5tupleIJDpT0_EEE4typeERSA_, _ZNSt10_Head_baseILm1ESt14default_deleteIN4ROOT12Experimental16RNTupleProcessorEELb1EE7_M_headERS5_, _ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_, _ZNK4ROOT12Experimental16RNTupleProcessor20GetNEntriesProcessedEv, _ZNSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC1IRKS5_vvS5_vEEOT_, _ZNSt8__detail9__variant17_Move_assign_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEECI2NS0_16_Variant_storageILb0EJS7_S9_EEEILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZNSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZN4ROOT12Experimental16RNTupleProcessor12RequestFieldIfEENS0_27RNTupleProcessorOptionalPtrIT_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPv, _ZNSt10shared_ptrIfEC1EDn, _ZNSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC1ILm0EJRKS5_ES5_vEESt16in_place_index_tIXT_EEDpOT0_, _ZN4ROOT12Experimental15RNTupleOpenSpecD1Ev, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEED2Ev, _ZNSt10shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryEED1Ev, _ZNSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE5clearEv, _ZSt12__get_helperILm0EPN4ROOT12Experimental16RNTupleProcessorEJSt14default_deleteIS2_EEERT0_RSt11_Tuple_implIXT_EJS6_DpT1_EE, _ZNSt8__detail21_Hashtable_ebo_helperILi0ESaINS_10_Hash_nodeImLb0EEEELb1EE6_M_getEv, _ZNSt8__detail9__variant15_Variadic_unionILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC2IJRKS7_EEESt16in_place_index_tILm0EEDpOT_, _ZNKSt15__uniq_ptr_implIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EE6_M_ptrEv, _ZNSt8__detail9__variant15_Move_ctor_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZNK4ROOT12Experimental8Internal21RNTupleProcessorEntry12IsValidFieldEm, _ZSt10__do_visitIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRSt7variantIJS8_SA_EEEEDcOT0_DpOT1_, _ZNSt12__shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2EED2Ev, _ZNRSt8__detail9__variant14_UninitializedIP10TDirectoryLb1EE6_M_getEv, _ZNSt8__detail9__variant5__getILm1ERSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEEEDcOT0_, _ZNKSt14default_deleteIN4ROOT12Experimental16RNTupleProcessorEEclEPS2_, _ZNKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3endEv, _ZNKSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EE3getEv, _ZNSt10shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryEED2Ev, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEE22_M_deallocate_node_ptrEPS2_, _ZNSt10_Head_baseILm0EPN4ROOT12Experimental16RNTupleProcessorELb0EE7_M_headERKS4_, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEE17_M_node_allocatorEv, _ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1ESt16initializer_listIS5_ERKS6_, _ZNSt15__new_allocatorINSt8__detail10_Hash_nodeImLb0EEEED2Ev, _ZNKSt19__shared_ptr_accessIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2ELb0ELb0EEptEv, _ZN4ROOT12Experimental27RNTupleProcessorOptionalPtrIfEC1EPNS0_8Internal21RNTupleProcessorEntryEm, _ZN4ROOT12Experimental16RNTupleProcessor3endEv, _ZNSt20__uninitialized_copyILb0EE13__uninit_copyIPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPS7_EET0_T_SC_SB_, _ZNKSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE5indexEv, _ZNSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED1Ev, _ZNSt11_Tuple_implILm1EJSt14default_deleteIN4ROOT12Experimental16RNTupleProcessorEEEE7_M_headERS5_, _ZStanSt12memory_orderSt23__memory_order_modifier, _ZNK4ROOT10RFieldBase6RValue6GetPtrIfEESt10shared_ptrIT_Ev, _ZNSt8__detail9__variant17_Move_assign_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZNSt8__detail9__variant7__get_nILm0ERNS0_15_Variadic_unionILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEEEEDcOT0_, _ZNSt11_Tuple_implILm0EJPN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEE7_M_headERKS6_, _ZSt16__do_uninit_copyIPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPS5_ET0_T_SA_S9_, _ZNKSt6atomicIPKSt9type_infoE4loadESt12memory_order, _ZNSt19__ptr_traits_ptr_toIPNSt8__detail10_Hash_nodeImLb0EEES2_Lb0EE10pointer_toERS2_, _ZN8TAttFill12SetFillColorEs, _ZNK4ROOT12Experimental27RNTupleProcessorOptionalPtrIfEdeEv, _ZNKSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE8_M_beginEv, $.cling-module-259.__inits.0, _ZNSt6atomicIPKSt9type_infoE5storeES2_St12memory_order, _ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEOS8_PKS5_, _ZNSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC2ILm0EJRKS5_ES5_vEESt16in_place_index_tIXT_EEDpOT0_, _ZNSt12__shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2EEC2ERKS6_, _ZN7TObjectnwEm, _ZSt8_DestroyIP10TDirectoryEvPT_, _ZNSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EE11get_deleterEv, _ZNKSt9type_info4nameEv, _ZNSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EED1Ev, _ZSt3getILm0EJPN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEERKNSt13tuple_elementIXT_ESt5tupleIJDpT0_EEE4typeERKSA_, _ZNSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_deallocate_bucketsEv, _ZNSt8__detail9__variant17__gen_vtable_implINS0_12_Multi_arrayIPFvOZNS0_16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_RSt7variantIJS9_SB_EEEJEEESt16integer_sequenceImJLm0EEEE14__visit_invokeESG_SJ_, _ZNSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_deallocate_bucketsEPPNS1_15_Hash_node_baseEm, _ZNSt10shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryEEC2ERKS4_, _ZNSt13unordered_setImSt4hashImESt8equal_toImESaImEED2Ev, _ZNK4ROOT10RFieldBase6RValue18EnsureMatchingTypeIfEEvv, _ZN9__gnu_cxx16__aligned_membufINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE7_M_addrEv, _Z4Readv, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEE21_M_deallocate_bucketsEPPNS_15_Hash_node_baseEm, _ZSt22__uninitialized_copy_aIPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPS5_S5_ET0_T_SA_S9_RSaIT1_E, _ZNSt13unordered_setImSt4hashImESt8equal_toImESaImEED1Ev, cling_module_259_.33, _ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_PKS5_, _ZNSt8__detail9__variant15_Copy_ctor_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEECI2NS0_16_Variant_storageILb0EJS7_S9_EEEILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZNKSt9type_infoeqERKS_, __orc_init_func.cling-module-259, _ZNKSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEdeEv, _ZZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvENUlOT_E_clIRS7_EEDaSC_, _ZSt13__invoke_implIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRSA_EESC_St14__invoke_otherOT0_DpOT1_, cling_module_259_.32, _ZNKSt12__shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2EE3getEv, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEE19_M_deallocate_nodesEPS2_, _ZNSt8__detail9__variant15_Copy_ctor_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZZSt10__do_visitIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRSt7variantIJS8_SA_EEEEDcOT0_DpOT1_ENKUlSH_zE_clB5cxx11ESH_z, _ZNSt15__new_allocatorINSt8__detail10_Hash_nodeImLb0EEEE10deallocateEPS2_m, _ZNSt10shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryEEC1ERKS4_, _ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEOS8_RKS8_, _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ISt17basic_string_viewIcS2_EvEERKT_RKS3_, _ZNSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEED2Ev, _ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC2ESt16initializer_listIS5_ERKS6_, _ZN4ROOT12Experimental16RNTupleProcessor5beginEv, _ZNKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4sizeEv, _ZSt13__invoke_implIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRS8_EESC_St14__invoke_otherOT0_DpOT1_, _ZNKSt8__detail10_Hash_nodeImLb0EE7_M_nextEv, _ZNSt11_Tuple_implILm0EJPN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEE7_M_headERS6_, _ZN9__gnu_cxx16__aligned_bufferImE7_M_addrEv, _ZSt12__get_helperILm0EPN4ROOT12Experimental16RNTupleProcessorEJSt14default_deleteIS2_EEERKT0_RKSt11_Tuple_implIXT_EJS6_DpT1_EE, _ZNK4ROOT12Experimental8Internal21RNTupleProcessorEntry8GetValueEm, _ZNKSt6vectorIN4ROOT12Experimental8Internal21RNTupleProcessorEntry15RProcessorValueESaIS4_EEixEm, _ZNSt8__detail9__variant5__getILm0ERSt7variantIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEEEDcOT0_, _ZNSt8__detail9__variant17_Copy_assign_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEECI2NS0_16_Variant_storageILb0EJS7_S9_EEEILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZSt14__variant_castIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryERNSt8__detail9__variant16_Variant_storageILb0EJS5_S7_EEEEDcOT0_, _ZNKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5beginEv, _ZNSt8__detail9__variant17__gen_vtable_implINS0_12_Multi_arrayIPFvOZNS0_16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_RSt7variantIJS9_SB_EEEJEEESt16integer_sequenceImJLm1EEEE14__visit_invokeESG_SJ_, _ZN4ROOT12Experimental16RNTupleProcessor9RIteratorC1ERS1_m, _ZSt3getILm0EJPN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEERNSt13tuple_elementIXT_ESt5tupleIJDpT0_EEE4typeERSA_, _ZZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvENUlOT_E_clIRS9_EEDaSC_, _ZSt10__invoke_rIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRS8_EENSt9enable_ifIX16is_invocable_r_vISC_T0_DpT1_EESC_E4typeEOSH_DpOSI_, _ZN4ROOT12Experimental27RNTupleProcessorOptionalPtrIfEC2EPNS0_8Internal21RNTupleProcessorEntryEm, _ZN4ROOT12Experimental15RNTupleOpenSpecD2Ev, _ZNSt10_Head_baseILm0EPN4ROOT12Experimental16RNTupleProcessorELb0EE7_M_headERS4_, _ZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZNSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEED1Ev, cling_module_259_.31, _ZNKSt10_HashtableImmSaImENSt8__detail9_IdentityESt8equal_toImESt4hashImENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_uses_single_bucketEPPNS1_15_Hash_node_baseE, _ZN4ROOT12Experimental16RNTupleProcessor9RIteratordeEv, _ZNKSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_validEv, _ZNKSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EEptEv, _ZN4ROOT12Experimental15RNTupleOpenSpecC2ESt17basic_string_viewIcSt11char_traitsIcEERKNSt7__cxx1112basic_stringIcS4_SaIcEEE, _ZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEv, _ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE21_M_range_initialize_nIPKS5_EEvT_SB_m, _ZNSt8__detail9__variant14_UninitializedINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0EEC1IJRKS7_EEESt16in_place_index_tILm0EEDpOT_, _ZNSt10unique_ptrIN4ROOT12Experimental16RNTupleProcessorESt14default_deleteIS2_EED2Ev, _ZN4ROOT12Experimental16RNTupleProcessor9RIteratorppEv, _ZN4ROOT12Experimental8Internal26RNTupleProcessorProvenanceC1Ev, _ZN9__gnu_cxx16__aligned_membufINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE6_M_ptrEv, _ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeImLb0EEEEE18_M_deallocate_nodeEPS2_, _ZSt12__str_concatINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_PKNS6_10value_typeENS6_9size_typeES9_SA_RKNS6_14allocator_typeE, _ZNSt8__detail21_Hashtable_ebo_helperILi0ESaINS_10_Hash_nodeImLb0EEEELb1EED2Ev, _ZNSt8__detail9__variant7__get_nILm1ERNS0_15_Variadic_unionILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEEEEDcOT0_, _ZN4ROOT12Experimental15RNTupleOpenSpecC1ESt17basic_string_viewIcSt11char_traitsIcEERKNSt7__cxx1112basic_stringIcS4_SaIcEEE, _ZNSt8__detail9__variant17_Copy_assign_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZNSt8__detail9__variant15_Move_ctor_baseILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEECI2NS0_16_Variant_storageILb0EJS7_S9_EEEILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZSt12__get_helperILm1ESt14default_deleteIN4ROOT12Experimental16RNTupleProcessorEEJEERT0_RSt11_Tuple_implIXT_EJS5_DpT1_EE, _ZN4ROOT12Experimental8Internal26RNTupleProcessorProvenanceC2Ev, _ZN4ROOT12Experimental8Internal26RNTupleProcessorProvenanceD2Ev, _ZNK4ROOT12Experimental27RNTupleProcessorOptionalPtrIfE6GetPtrEv, _ZN4ROOT12ExperimentalneERKNS0_16RNTupleProcessor9RIteratorES4_, _ZN4ROOT12Experimental8Internal26RNTupleProcessorProvenanceD1Ev, _ZNSt8__detail9__variant13_Variant_baseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEED2Ev, _ZSt18uninitialized_copyIPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPS5_ET0_T_SA_S9_, _ZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEEC2ILm0EJRKS7_EEESt16in_place_index_tIXT_EEDpOT0_, _ZSt10__invoke_rIvZNSt8__detail9__variant16_Variant_storageILb0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP10TDirectoryEE8_M_resetEvEUlOT_E_JRSA_EENSt9enable_ifIX16is_invocable_r_vISC_T0_DpT1_EESC_E4typeEOSH_DpOSI_, _ZNKSt12__shared_ptrIN4ROOT12Experimental8Internal21RNTupleProcessorEntryELN9__gnu_cxx12_Lock_policyE2EEcvbEv, _ZN9__gnu_cxx16__aligned_bufferImE6_M_ptrEv }) }\n"
]
}
],
"source": [
"%%cpp -d\n",
"void Read()\n",
"{\n",
" auto c = new TCanvas(\"c\", \"RNTupleJoinProcessor Example\", 200, 10, 700, 500);\n",
" TH1F hPy(\"h\", \"This is the px + py distribution\", 100, -4, 4);\n",
" hPy.SetFillColor(48);\n",
"\n",
" // The first specified ntuple is the primary ntuple and will be used to drive the processor loop. The subsequent\n",
" // list of ntuples (in this case, only one) are auxiliary and will be joined with the entries from the primary\n",
" // ntuple. We specify field \"i\" as the join field. This field, which should be present in all ntuples specified is\n",
" // used to identify which entries belong together. Multiple join fields can be specified, in which case the\n",
" // combination of field values is used. It is possible to specify up to 4 join fields. Providing an empty list of\n",
" // join fields signals to the processor that all entries are aligned.\n",
" auto processor =\n",
" RNTupleProcessor::CreateJoin({kPrimaryNTupleName, kMainNTuplePath}, {kAuxNTupleName, kAuxNTuplePath}, {\"i\"});\n",
"\n",
" // Access to the processor's fields is done by first requesting them through RNTupleProcessor::RequestField(). The\n",
" // returned value can be used to read the current entry's value for that particular field. Fields from the primary\n",
" // ntuple are requested by their original name.\n",
" auto px = processor->RequestField(\"vpx\");\n",
" // Fields from auxiliary ntuples are requested by prepending the name of the auxiliary ntuple.\n",
" auto py = processor->RequestField(kAuxNTupleName + \".vpy\");\n",
"\n",
" // The iterator value is the index of the current entry being processed. In this example, we don't use it.\n",
" for (auto _ : *processor) {\n",
" hPy.Fill(*px + *py);\n",
" }\n",
"\n",
" std::cout << \"Processed a total of \" << processor->GetNEntriesProcessed() << \" entries\" << std::endl;\n",
"\n",
" hPy.DrawCopy();\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "32b475a1",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:33.513109Z",
"iopub.status.busy": "2026-05-19T20:15:33.512987Z",
"iopub.status.idle": "2026-05-19T20:15:34.060840Z",
"shell.execute_reply": "2026-05-19T20:15:34.060278Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"cling JIT session error: Failed to materialize symbols: { (main, { _Z4Readv }) }\n",
"[runStaticInitializersOnce]: Failed to materialize symbols: { (main, { _ZN12__cling_N51816__cling_Un1Qu317EPv, cling_module_260_.9, cling_module_260_.8, cling_module_260_, __orc_init_func.cling-module-260, $.cling-module-260.__inits.0, cling_module_260_.10 }) }\n"
]
}
],
"source": [
"WritePrimary(kPrimaryNTupleName, kMainNTuplePath);\n",
"WriteAux(kAuxNTupleName, kAuxNTuplePath);\n",
"\n",
"Read();"
]
},
{
"cell_type": "markdown",
"id": "437e8bf5",
"metadata": {},
"source": [
"Draw all canvases "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "34507892",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2026-05-19T20:15:34.062574Z",
"iopub.status.busy": "2026-05-19T20:15:34.062459Z",
"iopub.status.idle": "2026-05-19T20:15:34.267137Z",
"shell.execute_reply": "2026-05-19T20:15:34.266489Z"
}
},
"outputs": [],
"source": [
"gROOT->GetListOfCanvases()->Draw()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ROOT C++",
"language": "c++",
"name": "root"
},
"language_info": {
"codemirror_mode": "text/x-c++src",
"file_extension": ".C",
"mimetype": " text/x-c++src",
"name": "c++"
}
},
"nbformat": 4,
"nbformat_minor": 5
}