File indexing completed on 2025-09-16 09:08:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef ROOT_RNTupleWriter
0015 #define ROOT_RNTupleWriter
0016
0017 #include <ROOT/RConfig.hxx> // for R__unlikely
0018 #include <ROOT/REntry.hxx>
0019 #include <ROOT/RError.hxx>
0020 #include <ROOT/RNTupleFillContext.hxx>
0021 #include <ROOT/RNTupleFillStatus.hxx>
0022 #include <ROOT/RNTupleMetrics.hxx>
0023 #include <ROOT/RNTupleModel.hxx>
0024 #include <ROOT/RNTupleUtil.hxx>
0025 #include <ROOT/RPageStorage.hxx>
0026 #include <ROOT/RRawPtrWriteEntry.hxx>
0027
0028 #include <cstddef>
0029 #include <cstdint>
0030 #include <memory>
0031 #include <string_view>
0032 #include <utility>
0033
0034 class TDirectory;
0035
0036 namespace ROOT {
0037
0038 class RNTupleWriteOptions;
0039
0040 namespace Internal {
0041
0042 std::unique_ptr<RNTupleWriter>
0043 CreateRNTupleWriter(std::unique_ptr<ROOT::RNTupleModel> model, std::unique_ptr<Internal::RPageSink> sink);
0044 }
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 class RNTupleWriter {
0059 friend ROOT::RNTupleModel::RUpdater;
0060 friend std::unique_ptr<RNTupleWriter>
0061 Internal::CreateRNTupleWriter(std::unique_ptr<ROOT::RNTupleModel>, std::unique_ptr<Internal::RPageSink>);
0062
0063 private:
0064
0065
0066 std::unique_ptr<Internal::RPageStorage::RTaskScheduler> fZipTasks;
0067 Experimental::RNTupleFillContext fFillContext;
0068 Experimental::Detail::RNTupleMetrics fMetrics;
0069
0070 ROOT::NTupleSize_t fLastCommittedClusterGroup = 0;
0071
0072 RNTupleWriter(std::unique_ptr<ROOT::RNTupleModel> model, std::unique_ptr<Internal::RPageSink> sink);
0073
0074 ROOT::RNTupleModel &GetUpdatableModel();
0075 Internal::RPageSink &GetSink() { return *fFillContext.fSink; }
0076
0077
0078 void CommitClusterGroup();
0079
0080
0081 static std::unique_ptr<RNTupleWriter> Create(std::unique_ptr<ROOT::RNTupleModel> model,
0082 std::unique_ptr<Internal::RPageSink> sink,
0083 const ROOT::RNTupleWriteOptions &options);
0084
0085 public:
0086
0087 static std::unique_ptr<RNTupleWriter>
0088 Recreate(std::unique_ptr<ROOT::RNTupleModel> model, std::string_view ntupleName, std::string_view storage,
0089 const ROOT::RNTupleWriteOptions &options = ROOT::RNTupleWriteOptions());
0090 static std::unique_ptr<RNTupleWriter>
0091 Recreate(std::initializer_list<std::pair<std::string_view, std::string_view>> fields, std::string_view ntupleName,
0092 std::string_view storage, const ROOT::RNTupleWriteOptions &options = ROOT::RNTupleWriteOptions());
0093
0094 static std::unique_ptr<RNTupleWriter> Append(std::unique_ptr<ROOT::RNTupleModel> model, std::string_view ntupleName,
0095 TDirectory &fileOrDirectory,
0096 const ROOT::RNTupleWriteOptions &options = ROOT::RNTupleWriteOptions());
0097 RNTupleWriter(const RNTupleWriter &) = delete;
0098 RNTupleWriter &operator=(const RNTupleWriter &) = delete;
0099 ~RNTupleWriter();
0100
0101
0102
0103 std::size_t Fill() { return fFillContext.Fill(fFillContext.fModel->GetDefaultEntry()); }
0104
0105
0106
0107 std::size_t Fill(ROOT::REntry &entry) { return fFillContext.Fill(entry); }
0108
0109
0110 void FillNoFlush(ROOT::REntry &entry, RNTupleFillStatus &status) { fFillContext.FillNoFlush(entry, status); }
0111
0112
0113
0114
0115 std::size_t Fill(Experimental::Detail::RRawPtrWriteEntry &entry) { return fFillContext.Fill(entry); }
0116
0117
0118 void FillNoFlush(Experimental::Detail::RRawPtrWriteEntry &entry, RNTupleFillStatus &status)
0119 {
0120 fFillContext.FillNoFlush(entry, status);
0121 }
0122
0123
0124
0125 void FlushColumns() { fFillContext.FlushColumns(); }
0126
0127 void FlushCluster() { fFillContext.FlushCluster(); }
0128
0129 void CommitCluster(bool commitClusterGroup = false)
0130 {
0131 fFillContext.FlushCluster();
0132 if (commitClusterGroup)
0133 CommitClusterGroup();
0134 }
0135
0136
0137
0138 void CommitDataset();
0139
0140 std::unique_ptr<ROOT::REntry> CreateEntry() const { return fFillContext.CreateEntry(); }
0141 std::unique_ptr<Experimental::Detail::RRawPtrWriteEntry> CreateRawPtrWriteEntry() const
0142 {
0143 return fFillContext.CreateRawPtrWriteEntry();
0144 }
0145
0146
0147 ROOT::NTupleSize_t GetLastFlushed() const { return fFillContext.GetLastFlushed(); }
0148
0149 ROOT::NTupleSize_t GetLastCommitted() const { return fFillContext.GetLastFlushed(); }
0150
0151 ROOT::NTupleSize_t GetLastCommittedClusterGroup() const { return fLastCommittedClusterGroup; }
0152
0153 ROOT::NTupleSize_t GetNEntries() const { return fFillContext.GetNEntries(); }
0154
0155 void EnableMetrics() { fMetrics.Enable(); }
0156 const Experimental::Detail::RNTupleMetrics &GetMetrics() const { return fMetrics; }
0157
0158 const ROOT::RNTupleModel &GetModel() const { return *fFillContext.fModel; }
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 std::unique_ptr<ROOT::RNTupleModel::RUpdater> CreateModelUpdater()
0178 {
0179 return std::make_unique<ROOT::RNTupleModel::RUpdater>(*this);
0180 }
0181 };
0182
0183 }
0184
0185 #endif