28 namespace Experimental {
30 ROOT::Experimental::RNTupleDS::RNTupleDS(std::unique_ptr<ROOT::Experimental::RNTupleReader> ntuple)
32 fReaders.emplace_back(std::move(ntuple));
33 auto rootField = fReaders[0]->GetModel()->GetRootField();
34 for (
auto &f : *rootField) {
35 if (f.GetParent() != rootField)
37 fColumnNames.push_back(f.GetName());
38 fColumnTypes.push_back(f.GetType());
42 const std::vector<std::string>& RNTupleDS::GetColumnNames()
const
48 RDF::RDataSource::Record_t RNTupleDS::GetColumnReadersImpl(std::string_view name,
const std::type_info& )
50 const auto index = std::distance(
51 fColumnNames.begin(), std::find(fColumnNames.begin(), fColumnNames.end(), name));
55 std::vector<void*> ptrs;
56 for (
unsigned i = 0; i < fNSlots; ++i)
57 ptrs.push_back(&fValuePtrs[i][index]);
62 bool RNTupleDS::SetEntry(
unsigned int slot, ULong64_t entryIndex)
64 fReaders[slot]->LoadEntry(entryIndex, fEntries[slot].
get());
68 std::vector<std::pair<ULong64_t, ULong64_t>> RNTupleDS::GetEntryRanges()
71 std::vector<std::pair<ULong64_t, ULong64_t>> ranges;
72 if (fHasSeenAllRanges)
return ranges;
74 auto nEntries = fReaders[0]->GetNEntries();
75 const auto chunkSize = nEntries / fNSlots;
76 const auto reminder = 1U == fNSlots ? 0 : nEntries % fNSlots;
79 for (
auto i : ROOT::TSeqU(fNSlots)) {
82 ranges.emplace_back(start, end);
85 ranges.back().second += reminder;
86 fHasSeenAllRanges =
true;
91 std::string RNTupleDS::GetTypeName(std::string_view colName)
const
93 const auto index = std::distance(
94 fColumnNames.begin(), std::find(fColumnNames.begin(), fColumnNames.end(), colName));
95 return fColumnTypes[index];
99 bool RNTupleDS::HasColumn(std::string_view colName)
const
101 return std::find(fColumnNames.begin(), fColumnNames.end(), colName) !=
106 void RNTupleDS::Initialise()
108 fHasSeenAllRanges =
false;
112 void RNTupleDS::SetNSlots(
unsigned int nSlots)
114 R__ASSERT(fNSlots == 0);
115 R__ASSERT(nSlots > 0);
118 for (
unsigned int i = 1; i < fNSlots; ++i) {
119 fReaders.emplace_back(fReaders[0]->Clone());
122 for (
unsigned int i = 0; i < fNSlots; ++i) {
123 auto entry = fReaders[i]->GetModel()->CreateEntry();
124 fValuePtrs.emplace_back(std::vector<void*>());
125 for (
unsigned j = 0; j < fColumnNames.size(); ++j) {
126 fValuePtrs[i].emplace_back(entry->GetValue(fColumnNames[j]).GetRawPtr());
128 fEntries.emplace_back(std::move(entry));
133 RDataFrame MakeNTupleDataFrame(std::string_view ntupleName, std::string_view fileName)
135 auto ntuple = RNTupleReader::Open(ntupleName, fileName);
136 ROOT::RDataFrame rdf(std::make_unique<RNTupleDS>(std::move(ntuple)));