Skip to content

Commit 0683fb2

Browse files
committed
[ntuple] Support processing from TDirectory
... and its subclasses. The option to specificy the location of an ntuple as a `TDirectory` instead of a plain file name provides more flexibility for creating `RNTupleProcessor` objects. Among others, it supports processing ntuples stored in subdirectories and `TMemFile`s.
1 parent 7dbc538 commit 0683fb2

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

tree/ntuple/v7/inc/ROOT/RNTupleProcessor.hxx

+4-2
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ struct RNTupleProcessorEntryLoader;
3939
/// Used to specify the underlying RNTuples in RNTupleProcessor
4040
struct RNTupleOpenSpec {
4141
std::string fNTupleName;
42-
std::string fStorage;
42+
std::variant<std::string, TDirectory *> fStorage;
4343

44-
RNTupleOpenSpec(std::string_view n, std::string_view s) : fNTupleName(n), fStorage(s) {}
44+
RNTupleOpenSpec(std::string_view n, const std::variant<std::string, TDirectory *> &s) : fNTupleName(n), fStorage(s)
45+
{
46+
}
4547
};
4648

4749
// clang-format off

tree/ntuple/v7/src/RNTupleProcessor.cxx

+19-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#include <ROOT/RNTupleProcessor.hxx>
1717

1818
#include <ROOT/RFieldBase.hxx>
19+
#include <ROOT/RNTuple.hxx>
20+
#include <ROOT/RPageStorageFile.hxx>
21+
22+
#include <TDirectory.h>
1923

2024
namespace {
2125
using ROOT::Experimental::RNTupleOpenSpec;
@@ -29,6 +33,16 @@ void EnsureUniqueNTupleNames(const RNTupleOpenSpec &primaryNTuple, const std::ve
2933
}
3034
}
3135
}
36+
37+
std::unique_ptr<ROOT::Experimental::Internal::RPageSource> CreatePageSourceFromSpec(const RNTupleOpenSpec &spec)
38+
{
39+
if (const std::string *storagePath = std::get_if<std::string>(&spec.fStorage))
40+
return ROOT::Experimental::Internal::RPageSource::Create(spec.fNTupleName, *storagePath);
41+
42+
auto dir = std::get<TDirectory *>(spec.fStorage);
43+
auto ntuple = std::unique_ptr<ROOT::RNTuple>(dir->Get<ROOT::RNTuple>(spec.fNTupleName.c_str()));
44+
return ROOT::Experimental::Internal::RPageSourceFile::CreateFromAnchor(*ntuple);
45+
}
3246
} // anonymous namespace
3347

3448
std::unique_ptr<ROOT::Experimental::RNTupleProcessor>
@@ -66,7 +80,7 @@ ROOT::Experimental::RNTupleProcessor::CreateChain(const std::vector<RNTupleOpenS
6680

6781
// If no model is provided, infer it from the first ntuple.
6882
if (!model) {
69-
auto firstPageSource = Internal::RPageSource::Create(ntuples[0].fNTupleName, ntuples[0].fStorage);
83+
auto firstPageSource = CreatePageSourceFromSpec(ntuples[0]);
7084
firstPageSource->Attach();
7185
model = firstPageSource->GetSharedDescriptorGuard()->CreateModel();
7286
}
@@ -180,7 +194,7 @@ ROOT::Experimental::RNTupleSingleProcessor::RNTupleSingleProcessor(const RNTuple
180194
: RNTupleProcessor(processorName, std::move(model)), fNTupleSpec(ntuple)
181195
{
182196
if (!fModel) {
183-
fPageSource = Internal::RPageSource::Create(fNTupleSpec.fNTupleName, fNTupleSpec.fStorage);
197+
fPageSource = CreatePageSourceFromSpec(fNTupleSpec);
184198
fPageSource->Attach();
185199
fModel = fPageSource->GetSharedDescriptorGuard()->CreateModel();
186200
}
@@ -236,7 +250,7 @@ void ROOT::Experimental::RNTupleSingleProcessor::Connect()
236250
return;
237251

238252
if (!fPageSource)
239-
fPageSource = Internal::RPageSource::Create(fNTupleSpec.fNTupleName, fNTupleSpec.fStorage);
253+
fPageSource = CreatePageSourceFromSpec(fNTupleSpec);
240254
fPageSource->Attach();
241255
fNEntries = fPageSource->GetNEntries();
242256

@@ -343,7 +357,7 @@ ROOT::Experimental::RNTupleJoinProcessor::RNTupleJoinProcessor(const RNTupleOpen
343357
: RNTupleProcessor(processorName, nullptr)
344358
{
345359
fNTuples.emplace_back(mainNTuple);
346-
fPageSource = Internal::RPageSource::Create(mainNTuple.fNTupleName, mainNTuple.fStorage);
360+
fPageSource = CreatePageSourceFromSpec(mainNTuple);
347361
fPageSource->Attach();
348362

349363
if (fPageSource->GetNEntries() == 0) {
@@ -396,7 +410,7 @@ void ROOT::Experimental::RNTupleJoinProcessor::AddAuxiliary(const RNTupleOpenSpe
396410

397411
fNTuples.emplace_back(auxNTuple);
398412

399-
auto pageSource = Internal::RPageSource::Create(auxNTuple.fNTupleName, auxNTuple.fStorage);
413+
auto pageSource = CreatePageSourceFromSpec(auxNTuple);
400414
pageSource->Attach();
401415

402416
if (pageSource->GetNEntries() == 0) {

0 commit comments

Comments
 (0)