Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RNTupleWriter.cxx
Go to the documentation of this file.
1/// \file RNTupleReader.cxx
2/// \ingroup NTuple ROOT7
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \date 2024-02-20
5/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
6/// is welcome!
7
8/*************************************************************************
9 * Copyright (C) 1995-2024, Rene Brun and Fons Rademakers. *
10 * All rights reserved. *
11 * *
12 * For the licensing terms see $ROOTSYS/LICENSE. *
13 * For the list of contributors see $ROOTSYS/README/CREDITS. *
14 *************************************************************************/
15
17
18#include <ROOT/RLogger.hxx>
22#include <ROOT/RNTupleModel.hxx>
24#include <ROOT/RPageSinkBuf.hxx>
25#include <ROOT/RPageStorage.hxx>
27
28#include <TFile.h>
29#include <TROOT.h>
30
31#include <utility>
32
33ROOT::Experimental::RNTupleWriter::RNTupleWriter(std::unique_ptr<ROOT::Experimental::RNTupleModel> model,
34 std::unique_ptr<ROOT::Experimental::Internal::RPageSink> sink)
35 : fFillContext(std::move(model), std::move(sink)), fMetrics("RNTupleWriter")
36{
37#ifdef R__USE_IMT
38 if (IsImplicitMTEnabled() &&
39 fFillContext.fSink->GetWriteOptions().GetUseImplicitMT() == ROOT::RNTupleWriteOptions::EImplicitMT::kDefault) {
40 fZipTasks = std::make_unique<Internal::RNTupleImtTaskScheduler>();
41 fFillContext.fSink->SetTaskScheduler(fZipTasks.get());
42 }
43#endif
44 // Observe directly the sink's metrics to avoid an additional prefix from the fill context.
46}
47
49{
50 try {
51 CommitDataset();
52 } catch (const RException &err) {
53 R__LOG_ERROR(ROOT::Internal::NTupleLog()) << "failure committing ntuple: " << err.GetError().GetReport();
54 }
55}
56
57std::unique_ptr<ROOT::Experimental::RNTupleWriter>
58ROOT::Experimental::RNTupleWriter::Create(std::unique_ptr<RNTupleModel> model,
59 std::unique_ptr<Internal::RPageSink> sink,
60 const ROOT::RNTupleWriteOptions &options)
61{
62 if (model->GetRegisteredSubfieldNames().size() > 0) {
63 throw RException(R__FAIL("cannot create an RNTupleWriter from a model with registered subfields"));
64 }
65 for (const auto &field : model->GetConstFieldZero()) {
66 if (field.GetTraits() & RFieldBase::kTraitEmulatedField)
67 throw RException(
68 R__FAIL("creating a RNTupleWriter from a model containing emulated fields is currently unsupported."));
69 }
70 if (options.GetUseBufferedWrite()) {
71 sink = std::make_unique<Internal::RPageSinkBuf>(std::move(sink));
72 }
73 return std::unique_ptr<RNTupleWriter>(new RNTupleWriter(std::move(model), std::move(sink)));
74}
75
76std::unique_ptr<ROOT::Experimental::RNTupleWriter>
77ROOT::Experimental::RNTupleWriter::Recreate(std::unique_ptr<RNTupleModel> model, std::string_view ntupleName,
78 std::string_view storage, const ROOT::RNTupleWriteOptions &options)
79{
81 return Create(std::move(model), std::move(sink), options);
82}
83
84std::unique_ptr<ROOT::Experimental::RNTupleWriter>
85ROOT::Experimental::RNTupleWriter::Recreate(std::initializer_list<std::pair<std::string_view, std::string_view>> fields,
86 std::string_view ntupleName, std::string_view storage,
87 const ROOT::RNTupleWriteOptions &options)
88{
90 auto model = RNTupleModel::Create();
91 for (const auto &fieldDesc : fields) {
92 std::string typeName(fieldDesc.first);
93 std::string fieldName(fieldDesc.second);
94 auto field = RFieldBase::Create(fieldName, typeName);
95 model->AddField(field.Unwrap());
96 }
97 return Create(std::move(model), std::move(sink), options);
98}
99
100std::unique_ptr<ROOT::Experimental::RNTupleWriter>
101ROOT::Experimental::RNTupleWriter::Append(std::unique_ptr<RNTupleModel> model, std::string_view ntupleName,
103{
104 auto file = fileOrDirectory.GetFile();
105 if (!file) {
106 throw RException(R__FAIL("RNTupleWriter only supports writing to a ROOT file. Cannot write into a directory "
107 "that is not backed by a file"));
108 }
109 if (!file->IsBinary()) {
110 throw RException(R__FAIL("RNTupleWriter only supports writing to a ROOT file. Cannot write into " +
111 std::string(file->GetName())));
112 }
113
114 auto sink = std::make_unique<Internal::RPageSinkFile>(ntupleName, fileOrDirectory, options);
115 return Create(std::move(model), std::move(sink), options);
116}
117
119{
120 if (GetNEntries() == fLastCommittedClusterGroup)
121 return;
122 fFillContext.fSink->CommitClusterGroup();
123 fLastCommittedClusterGroup = GetNEntries();
124}
125
127{
128 if (fFillContext.fModel->IsExpired()) {
129 throw RException(R__FAIL("invalid attempt to update expired model"));
130 }
131 return *fFillContext.fModel;
132}
133
135{
136 if (fFillContext.GetModel().IsExpired())
137 return;
138
139 CommitCluster(true /* commitClusterGroup */);
140 fFillContext.fSink->CommitDataset();
141 fFillContext.fModel->Expire();
142}
143
144std::unique_ptr<ROOT::Experimental::RNTupleWriter>
145ROOT::Experimental::Internal::CreateRNTupleWriter(std::unique_ptr<ROOT::Experimental::RNTupleModel> model,
146 std::unique_ptr<ROOT::Experimental::Internal::RPageSink> sink)
147{
148 return std::unique_ptr<ROOT::Experimental::RNTupleWriter>(
149 new ROOT::Experimental::RNTupleWriter(std::move(model), std::move(sink)));
150}
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
Definition RError.hxx:299
#define R__LOG_ERROR(...)
Definition RLogger.hxx:357
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void ObserveMetrics(RNTupleMetrics &observee)
static std::unique_ptr< RPageSink > Create(std::string_view ntupleName, std::string_view location, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Guess the concrete derived page source from the location.
@ kTraitEmulatedField
This field is a user defined type that was missing dictionaries and was reconstructed from the on-dis...
static RResult< std::unique_ptr< RFieldBase > > Create(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
Factory method to resurrect a field from the stored on-disk type information.
std::unique_ptr< Internal::RPageSink > fSink
The RNTupleModel encapulates the schema of an ntuple.
static std::unique_ptr< RNTupleModel > Create()
An RNTuple that gets filled with entries (data) and writes them to storage.
RNTupleWriter(std::unique_ptr< RNTupleModel > model, std::unique_ptr< Internal::RPageSink > sink)
static std::unique_ptr< RNTupleWriter > Append(std::unique_ptr< RNTupleModel > model, std::string_view ntupleName, TDirectory &fileOrDirectory, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Throws an exception if the model is null.
std::unique_ptr< Internal::RPageStorage::RTaskScheduler > fZipTasks
The page sink's parallel page compression scheduler if IMT is on.
static std::unique_ptr< RNTupleWriter > Create(std::unique_ptr< RNTupleModel > model, std::unique_ptr< Internal::RPageSink > sink, const ROOT::RNTupleWriteOptions &options)
Create a writer, potentially wrapping the sink in a RPageSinkBuf.
void CommitDataset()
Closes the underlying file (page sink) and expires the model.
Detail::RNTupleMetrics fMetrics
static std::unique_ptr< RNTupleWriter > Recreate(std::unique_ptr< RNTupleModel > model, std::string_view ntupleName, std::string_view storage, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Throws an exception if the model is null.
Base class for all ROOT issued exceptions.
Definition RError.hxx:79
const RError & GetError() const
Definition RError.hxx:84
Common user-tunable settings for storing ntuples.
Describe directory structure in memory.
Definition TDirectory.h:45
std::unique_ptr< RNTupleWriter > CreateRNTupleWriter(std::unique_ptr< RNTupleModel > model, std::unique_ptr< Internal::RPageSink > sink)
ROOT::RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
Definition TROOT.cxx:570