#include "SimpleInfo.hh" void SimpleNtupleIdxs() { gInterpreter->GenerateDictionary("SimpleInfo;std::vector", "SimpleInfo.hh"); SimpleInfo single_obj; std::vector vector_obj; TFile* file = new TFile("simple_ntuple.root", "RECREATE"); TTree* tree = new TTree("ntuple", ""); int buffsize = 32000; int splitlevel = 99; tree->Branch("single_obj", &single_obj, buffsize, splitlevel); tree->Branch("vector_obj", &vector_obj, buffsize, splitlevel); int n_events = 10; int n_elements = 2; int n_subelements = 3; for (int i_event = 0; i_event < n_events; ++i_event) { single_obj.idxs.clear(); vector_obj.clear(); single_obj.pdg = i_event+1; single_obj.time = 1.1*single_obj.pdg; // dummy pdg and time values single_obj.idxs.push_back(0); single_obj.idxs.push_back(1); for (int i_element = 0; i_element < n_elements; ++i_element) { SimpleInfo element; element.pdg = -i_event-1; element.time = 1.1*element.pdg - i_element*0.1; element.idxs.push_back(2); element.idxs.push_back(3); vector_obj.push_back(element); } tree->Fill(); } tree->Print(); file->Write(); file->Close(); TFile* infile = new TFile("simple_ntuple.root", "READ"); ROOT::RDataFrame df("ntuple", infile); auto colNames = df.GetColumnNames(); // Print columns' names for (auto &&colName : colNames) { std::cout << colName << ": " << df.GetColumnType(colName) << std::endl; } // single-object branches auto disp = df.Display({"single_obj", "single_obj.pdg", "single_obj.time", "single_obj.idxs"}); disp->Print(); // OK // vector-object branches auto disp2 = df.Display({"vector_obj", "vector_obj.pdg", "vector_obj.time", "vector_obj.idxs"}); disp2->Print(); // get a bad alloc }