33 namespace Experimental {
60 std::unique_ptr<RNTupleModel> fModel;
62 NTupleSize_t fNEntries;
65 explicit RNTuple(std::unique_ptr<RNTupleModel> model);
68 RNTuple(
const RNTuple&) =
delete;
69 RNTuple& operator =(
const RNTuple&) =
delete;
72 RNTupleModel* GetModel() {
return fModel.get(); }
81 enum class ENTupleInfo {
100 class RNTupleReader :
public Detail::RNTuple {
102 std::unique_ptr<Detail::RPageSource> fSource;
103 Detail::RNTupleMetrics fMetrics;
109 class RIterator :
public std::iterator<std::forward_iterator_tag, NTupleSize_t> {
111 using iterator = RIterator;
112 NTupleSize_t fIndex = kInvalidNTupleIndex;
114 RIterator() =
default;
115 explicit RIterator(NTupleSize_t index) : fIndex(index) {}
116 ~RIterator() =
default;
118 iterator operator++(
int) {
auto r = *
this; fIndex++;
return r; }
119 iterator& operator++() { ++fIndex;
return *
this; }
120 reference operator* () {
return fIndex; }
121 pointer operator->() {
return &fIndex; }
122 bool operator==(
const iterator& rh)
const {
return fIndex == rh.fIndex; }
123 bool operator!=(
const iterator& rh)
const {
return fIndex != rh.fIndex; }
127 static std::unique_ptr<RNTupleReader> Open(std::unique_ptr<RNTupleModel> model,
128 std::string_view ntupleName,
129 std::string_view storage);
130 static std::unique_ptr<RNTupleReader> Open(std::string_view ntupleName, std::string_view storage);
133 RNTupleReader(std::unique_ptr<RNTupleModel> model, std::unique_ptr<Detail::RPageSource> source);
135 explicit RNTupleReader(std::unique_ptr<Detail::RPageSource> source);
136 std::unique_ptr<RNTupleReader> Clone() {
return std::make_unique<RNTupleReader>(fSource->Clone()); }
139 NTupleSize_t GetNEntries()
const {
return fNEntries; }
140 const RNTupleDescriptor &GetDescriptor()
const {
return fSource->GetDescriptor(); }
143 void PrintInfo(
const ENTupleInfo what = ENTupleInfo::kSummary, std::ostream &output = std::cout);
147 void LoadEntry(NTupleSize_t index) { LoadEntry(index, fModel->GetDefaultEntry()); }
149 void LoadEntry(NTupleSize_t index, REntry* entry) {
150 for (
auto& value : *entry) {
151 value.GetField()->Read(index, &value);
155 RNTupleGlobalRange GetViewRange() {
return RNTupleGlobalRange(0, fNEntries); }
160 template <
typename T>
161 RNTupleView<T> GetView(std::string_view fieldName) {
162 auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName);
163 return RNTupleView<T>(fieldId, fSource.get());
165 RNTupleViewCollection GetViewCollection(std::string_view fieldName) {
166 auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName);
167 return RNTupleViewCollection(fieldId, fSource.get());
170 RIterator begin() {
return RIterator(0); }
171 RIterator end() {
return RIterator(fNEntries); }
173 void EnableMetrics() { fMetrics.Enable(); }
188 class RNTupleWriter :
public Detail::RNTuple {
190 static constexpr NTupleSize_t kDefaultClusterSizeEntries = 64000;
191 std::unique_ptr<Detail::RPageSink> fSink;
192 NTupleSize_t fClusterSizeEntries;
193 NTupleSize_t fLastCommitted;
196 static std::unique_ptr<RNTupleWriter> Recreate(std::unique_ptr<RNTupleModel> model,
197 std::string_view ntupleName,
198 std::string_view storage,
199 const RNTupleWriteOptions &options = RNTupleWriteOptions());
200 RNTupleWriter(std::unique_ptr<RNTupleModel> model, std::unique_ptr<Detail::RPageSink> sink);
201 RNTupleWriter(
const RNTupleWriter&) =
delete;
202 RNTupleWriter& operator=(
const RNTupleWriter&) =
delete;
206 void Fill() { Fill(fModel->GetDefaultEntry()); }
209 void Fill(REntry *entry) {
210 for (
auto& value : *entry) {
211 value.GetField()->Append(value);
214 if ((fNEntries % fClusterSizeEntries) == 0)
218 void CommitCluster();
232 class RCollectionNTuple {
234 ClusterSize_t fOffset;
235 std::unique_ptr<REntry> fDefaultEntry;
237 explicit RCollectionNTuple(std::unique_ptr<REntry> defaultEntry);
238 RCollectionNTuple(
const RCollectionNTuple&) =
delete;
239 RCollectionNTuple& operator=(
const RCollectionNTuple&) =
delete;
240 ~RCollectionNTuple() =
default;
242 void Fill() { Fill(fDefaultEntry.get()); }
243 void Fill(REntry *entry) {
244 for (
auto& treeValue : *entry) {
245 treeValue.GetField()->Append(treeValue);
250 ClusterSize_t* GetOffsetPtr() {
return &fOffset; }