27 #include <unordered_map>
34 ROOT::Experimental::Detail::RNTuple::RNTuple(std::unique_ptr<ROOT::Experimental::RNTupleModel> model)
35 : fModel(std::move(model))
40 ROOT::Experimental::Detail::RNTuple::~RNTuple()
46 void ROOT::Experimental::RNTupleReader::ConnectModel() {
47 std::unordered_map<const Detail::RFieldBase *, DescriptorId_t> fieldPtr2Id;
48 fieldPtr2Id[fModel->GetRootField()] = fSource->GetDescriptor().FindFieldId(
"", kInvalidDescriptorId);
49 for (
auto &field : *fModel->GetRootField()) {
50 auto parentId = fieldPtr2Id[field.GetParent()];
51 auto fieldId = fSource->GetDescriptor().FindFieldId(field.GetName(), parentId);
52 R__ASSERT(fieldId != kInvalidDescriptorId);
53 fieldPtr2Id[&field] = fieldId;
54 Detail::RFieldFuse::Connect(fieldId, *fSource, field);
58 ROOT::Experimental::RNTupleReader::RNTupleReader(
59 std::unique_ptr<ROOT::Experimental::RNTupleModel> model,
60 std::unique_ptr<ROOT::Experimental::Detail::RPageSource> source)
61 : ROOT::Experimental::Detail::RNTuple(std::move(model))
62 , fSource(std::move(source))
63 , fMetrics(
"RNTupleReader")
67 fNEntries = fSource->GetNEntries();
68 fMetrics.ObserveMetrics(fSource->GetMetrics());
71 ROOT::Experimental::RNTupleReader::RNTupleReader(std::unique_ptr<ROOT::Experimental::Detail::RPageSource> source)
72 : ROOT::Experimental::Detail::RNTuple(nullptr)
73 , fSource(std::move(source))
74 , fMetrics(
"RNTupleReader")
77 fModel = fSource->GetDescriptor().GenerateModel();
79 fNEntries = fSource->GetNEntries();
80 fMetrics.ObserveMetrics(fSource->GetMetrics());
83 ROOT::Experimental::RNTupleReader::~RNTupleReader()
89 std::unique_ptr<ROOT::Experimental::RNTupleReader> ROOT::Experimental::RNTupleReader::Open(
90 std::unique_ptr<RNTupleModel> model,
91 std::string_view ntupleName,
92 std::string_view storage)
94 return std::make_unique<RNTupleReader>(std::move(model), Detail::RPageSource::Create(ntupleName, storage));
97 std::unique_ptr<ROOT::Experimental::RNTupleReader> ROOT::Experimental::RNTupleReader::Open(
98 std::string_view ntupleName,
99 std::string_view storage)
101 return std::make_unique<RNTupleReader>(Detail::RPageSource::Create(ntupleName, storage));
104 void ROOT::Experimental::RNTupleReader::PrintInfo(
const ENTupleInfo what, std::ostream &output)
107 char frameSymbol =
'*';
115 std::string name = fSource->GetDescriptor().GetName();
117 RPrepareVisitor prepVisitor;
119 RPrintVisitor printVisitor(output);
121 case ENTupleInfo::kSummary:
122 for (
int i = 0; i < (width/2 + width%2 - 4); ++i)
123 output << frameSymbol;
124 output <<
" NTUPLE ";
125 for (
int i = 0; i < (width/2 - 4); ++i)
126 output << frameSymbol;
129 output << frameSymbol <<
" N-Tuple : " << RNTupleFormatter::FitString(name, width-13) << frameSymbol << std::endl;
130 output << frameSymbol <<
" Entries : " << RNTupleFormatter::FitString(std::to_string(GetNEntries()), width - 13) << frameSymbol << std::endl;
131 GetModel()->GetRootField()->TraverseVisitor(prepVisitor);
133 printVisitor.SetFrameSymbol(frameSymbol);
134 printVisitor.SetWidth(width);
135 printVisitor.SetDeepestLevel(prepVisitor.GetDeepestLevel());
136 printVisitor.SetNumFields(prepVisitor.GetNumFields());
137 GetModel()->GetRootField()->TraverseVisitor(printVisitor);
139 for (
int i = 0; i < width; ++i)
140 output << frameSymbol;
143 case ENTupleInfo::kStorageDetails:
144 fSource->GetDescriptor().PrintInfo(output);
146 case ENTupleInfo::kMetrics:
147 fMetrics.Print(output);
156 ROOT::Experimental::RNTupleWriter::RNTupleWriter(
157 std::unique_ptr<ROOT::Experimental::RNTupleModel> model,
158 std::unique_ptr<ROOT::Experimental::Detail::RPageSink> sink)
159 : ROOT::Experimental::Detail::RNTuple(std::move(model))
160 , fSink(std::move(sink))
161 , fClusterSizeEntries(kDefaultClusterSizeEntries)
164 fSink->Create(*fModel.get());
167 ROOT::Experimental::RNTupleWriter::~RNTupleWriter()
170 fSink->CommitDataset();
175 std::unique_ptr<ROOT::Experimental::RNTupleWriter> ROOT::Experimental::RNTupleWriter::Recreate(
176 std::unique_ptr<RNTupleModel> model,
177 std::string_view ntupleName,
178 std::string_view storage,
179 const RNTupleWriteOptions &options)
181 return std::make_unique<RNTupleWriter>(std::move(model), Detail::RPageSink::Create(ntupleName, storage, options));
185 void ROOT::Experimental::RNTupleWriter::CommitCluster()
187 if (fNEntries == fLastCommitted)
return;
188 for (
auto& field : *fModel->GetRootField()) {
190 field.CommitCluster();
192 fSink->CommitCluster(fNEntries);
193 fLastCommitted = fNEntries;
200 ROOT::Experimental::RCollectionNTuple::RCollectionNTuple(std::unique_ptr<REntry> defaultEntry)
201 : fOffset(0), fDefaultEntry(std::move(defaultEntry))