53 std::deque<RNTupleProcessorDS::RFieldInfo> &fieldInfos,
bool convertToRVec)
85 std::uint16_t nFieldInfosAdded = 0;
92 const std::string
name = (procProvenance.
Empty() ?
"" : procProvenance.
Get() +
".") + std::string(colName);
102 bool representableAsRVec =
103 convertToRVec && (field.
GetTypeName().substr(0, 19) ==
"ROOT::VecOps::RVec<" ||
106 AddField(*
f, colName, procProvenance, fieldInfos, representableAsRVec);
112 }
else if (nRepetitions > 0) {
115 AddField(*
f, colName, procProvenance, fieldInfos);
120 auto innerName = colName.empty() ?
f->GetFieldName() : (std::string(colName) +
"." +
f->GetFieldName());
122 AddField(*
f, innerName, procProvenance, fieldInfos);
133 auto fieldInfoIt = fieldInfos.begin();
134 while (fieldName ==
"_0") {
135 assert(fieldInfoIt != fieldInfos.end());
136 fieldName = fieldInfoIt->fFieldName;
140 if (!fieldOrException)
142 auto valueField = fieldOrException.Unwrap();
145 if (cardinalityField->As32Bit()) {
146 valueField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint32_t>>(field.
GetFieldName());
147 }
else if (cardinalityField->As64Bit()) {
148 valueField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint64_t>>(field.
GetFieldName());
150 R__ASSERT(
false &&
"cardinality field stored with an unexpected integer type");
155 auto valueSubfields = valueField->GetMutableSubfields();
157 for (
unsigned i = 0; i < valueSubfields.size(); ++i) {
158 valueSubfields[i]->SetOnDiskId(fieldSubfields[i]->GetOnDiskId());
161 std::unique_ptr<ROOT::RFieldBase> cardinalityField;
163 if (!fieldInfos.empty()) {
164 const auto &info = fieldInfos.back();
165 const std::string
name =
166 (procProvenance.
Empty() ?
"R_rdf_sizeof_" : procProvenance.
Get() +
"_R_rdf_sizeof_") + info.fFieldName;
167 if (info.fNRepetitions > 0) {
168 cardinalityField = std::make_unique<ROOT::Internal::RDF::RArraySizeField>(
name, info.fNRepetitions);
170 cardinalityField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::size_t>>(
name);
172 cardinalityField->SetOnDiskId(info.fOnDiskId);
175 for (
auto i = fieldInfos.rbegin(); i != fieldInfos.rend(); ++i) {
176 const auto &fieldInfo = *i;
178 const auto valueFieldName = valueField->GetFieldName();
180 if (fieldInfo.fNRepetitions > 0) {
183 std::make_unique<ROOT::RArrayAsRVecField>(valueFieldName, valueField->Clone(
"_0"), fieldInfo.fNRepetitions);
188 valueField = std::make_unique<ROOT::RRVecField>(valueFieldName, valueField->Clone(
"_0"));
190 auto outerFieldType = fieldInfo.fTypeName;
195 valueField->SetOnDiskId(fieldInfo.fOnDiskId);
199 if (i != fieldInfos.rbegin()) {
200 const auto cardinalityFieldName = cardinalityField->GetFieldName();
201 if (fieldInfo.fNRepetitions > 0) {
203 cardinalityField = std::make_unique<ROOT::RArrayAsRVecField>(
204 cardinalityFieldName, cardinalityField->Clone(
"_0"), fieldInfo.fNRepetitions);
207 cardinalityField = std::make_unique<ROOT::RRVecField>(cardinalityFieldName, cardinalityField->Clone(
"_0"));
210 cardinalityField->SetOnDiskId(fieldInfo.fOnDiskId);
214 std::string canonicalName = (procProvenance.
Empty() ?
"" : procProvenance.
Get() +
".") + std::string(colName);
219 if (
auto optFieldIdx =
fProcessor->GetEntry().FindFieldIndex(canonicalName);
221 fieldIdx = *optFieldIdx;
223 fieldIdx =
fProcessor->AddFieldToEntry(std::move(valueField), canonicalName,
nullptr,
227 if (cardinalityField) {
229 std::string cardinalityFieldName =
230 (procProvenance.
Empty() ?
"R_rdf_sizeof_" : procProvenance.
Get() +
".R_rdf_sizeof_") + std::string(colName);
232 fColumnTypes.emplace_back(cardinalityField->GetTypeName());
233 auto cardinalityFieldIdx =
fProcessor->AddFieldToEntry(std::move(cardinalityField), cardinalityFieldName,
nullptr,
235 if (!fieldInfos.empty()) {
236 const auto &fieldInfo = fieldInfos.back();
237 fieldIdx = fieldInfo.fEntryFieldIdx;
239 fProcessor->GetEntry().SetFieldOriginIdx(cardinalityFieldIdx, fieldIdx);
242 for (std::uint16_t i = 0; i < nFieldInfosAdded; i++) {
243 fieldInfos.pop_back();
248 : fProcessor(std::move(processor))
253 for (
auto fieldIdx : entry.GetFieldIndices()) {
254 const auto &field = entry.GetValue(fieldIdx).GetField();
255 std::deque<RNTupleProcessorDS::RFieldInfo> fieldInfos{};
256 AddField(field, entry.GetQualifiedFieldName(fieldIdx), entry.GetFieldProvenance(fieldIdx), fieldInfos);
267std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase>
276 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
277 auto reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
289 std::unique_ptr<Internal::RDF::RNTupleProcessorColumnReader> reader;
291 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
292 reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
295 throw std::runtime_error(
"RNTupleProcessorDS: Column \"" + std::string(
name) +
"\" does not exist");
300 const auto &field =
fProcessor->GetEntry().GetField(*fieldIdx);
301 const std::string strName = std::string(
name);
302 std::unique_ptr<ROOT::RFieldBase> newField;
304 if (requestedType ==
"bool") {
305 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<bool>>(strName);
306 }
else if (requestedType ==
"char") {
307 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<char>>(strName);
308 }
else if (requestedType ==
"std::int8_t") {
309 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int8_t>>(strName);
310 }
else if (requestedType ==
"std::uint8_t") {
311 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint8_t>>(strName);
312 }
else if (requestedType ==
"std::int16_t") {
313 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int16_t>>(strName);
314 }
else if (requestedType ==
"std::uint16_t") {
315 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint16_t>>(strName);
316 }
else if (requestedType ==
"std::int32_t") {
317 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int32_t>>(strName);
318 }
else if (requestedType ==
"std::uint32_t") {
319 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint32_t>>(strName);
320 }
else if (requestedType ==
"std::int64_t") {
321 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int64_t>>(strName);
322 }
else if (requestedType ==
"std::uint64_t") {
323 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint64_t>>(strName);
325 throw std::runtime_error(
"RNTupleProcessorDS: Could not create field with type \"" + requestedType +
326 "\" for column \"" + strName +
"\"");
331 if (!newAltProtoFieldOrException) {
332 throw std::runtime_error(
"RNTupleProcessorDS: Could not create field with type \"" + requestedType +
333 "\" for column \"" + strName +
"\"");
335 newField = newAltProtoFieldOrException.Unwrap();
337 newField->SetOnDiskId(field.GetOnDiskId());
342 std::string msg =
"RNTupleProcessorDS: invalid type \"" + requestedType +
"\" for column \"" + strName +
343 "\" with on-disk type \"" + field.GetTypeName() +
"\"";
344 throw std::runtime_error(msg);
347 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
348 auto reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
378 auto msg = std::string(
"RNTupleProcessorDS: There is no column with name \"") + std::string(colName) +
"\"";
379 throw std::runtime_error(msg);
408 Warning(
"RNTupleProcessorDS",
"MT is not yet supported. Using single-threaded processing instead.");
421 colReader->SetEntryLoaded(entry);
428 unsigned int ,
const std::unordered_map<std::string, ROOT::RDF::Experimental::RSample *> &sampleMap)
const
430 const auto &ntupleID =
fProcessor->GetOptions().GetProcessorName();
434 if (sampleMap.empty())
437 if (sampleMap.find(ntupleID) == sampleMap.end())
438 throw std::runtime_error(
"Full sample identifier '" + ntupleID +
"' cannot be found in the available samples.");
447 std::make_unique<ROOT::Experimental::Internal::RDF::RNTupleProcessorDS>(std::move(processor)));
long long Long64_t
Portable signed long integer 8 bytes.
unsigned long long ULong64_t
Portable unsigned long integer 8 bytes.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Every RDF column is represented by exactly one RNTuple field.
void SetEntryLoaded(Long64_t entry)
RNTupleProcessorValuePtr< void > fValuePtr
Container for the value of the column.
RNTupleProcessorColumnReader(RNTupleProcessorValuePtr< void > &valuePtr)
void * GetImpl(Long64_t entry) final
Long64_t fLastLoadedEntry
~RNTupleProcessorColumnReader() override=default
std::string GetTypeName(std::string_view colName) const final
Type of a column as a string, e.g.
~RNTupleProcessorDS() final
std::unique_ptr< RNTupleProcessor > fProcessor
void Finalize() final
Convenience method called after concluding an event-loop.
bool HasColumn(std::string_view colName) const final
Checks if the dataset has a certain column.
std::vector< std::pair< ULong64_t, ULong64_t > > GetEntryRanges() final
Return ranges of entries to distribute to tasks.
void FinalizeSlot(unsigned int slot) final
Convenience method called at the end of the data processing associated to a slot.
Record_t GetColumnReadersImpl(std::string_view name, const std::type_info &) final
type-erased vector of pointers to pointers to column values - one per slot
std::vector< std::string > fColumnNames
RNTupleProcessorDS(std::unique_ptr< ROOT::RNTupleProcessor > processor)
void Initialize() final
Convenience method called before starting an event-loop.
std::vector< ROOT::Experimental::Internal::RDF::RNTupleProcessorColumnReader * > fColumnReaders
std::unique_ptr< ROOT::Detail::RDF::RColumnReaderBase > GetColumnReaders(unsigned int slot, std::string_view name, const std::type_info &) final
If the other GetColumnReaders overload returns an empty vector, this overload will be called instead.
std::vector< std::string > fColumnTypes
std::vector< std::pair< ULong64_t, ULong64_t > > fCurrentRanges
void InitSlot(unsigned int slot, ULong64_t firstEntry) final
Convenience method called at the start of the data processing associated to a slot.
void AddField(const ROOT::RFieldBase &field, std::string_view colName, ROOT::Internal::RNTupleProcessorProvenance procProvenance, std::deque< RFieldInfo > &fieldInfos, bool convertToRVec=true)
Provides the RDF column "colName" given the field.
bool SetEntry(unsigned int, ULong64_t) final
Advance the "cursors" returned by GetColumnReaders to the selected entry for a particular slot.
void SetNSlots(unsigned int nSlots) final
Inform RDataSource of the number of processing slots (i.e.
RNTupleProcessor::REntryMapping fEntryMapping
std::uint64_t FieldIndex_t
std::string Get() const
Get the full processor provenance, in the form of "x.y.z".
An artificial field that transforms an RNTuple column that contains the offset of collections into co...
friend ROOT::RDF::RSampleInfo ROOT::Internal::RDF::CreateSampleInfo(const ROOT::RDF::RDataSource &, unsigned int, const std::unordered_map< std::string, ROOT::RDF::Experimental::RSample * > &)
std::vector< void * > Record_t
This type represents a sample identifier, to be used in conjunction with RDataFrame features such as ...
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
Base class for all ROOT issued exceptions.
A field translates read and write calls from/to underlying columns to/from tree values.
ROOT::ENTupleStructure GetStructure() const
std::vector< const RFieldBase * > GetConstSubfields() const
const std::string & GetFieldName() const
static RResult< std::unique_ptr< RFieldBase > > Create(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
Factory method to resurrect a field from the stored on-disk type information.
std::size_t GetNRepetitions() const
const std::string & GetTypeName() const
ROOT::DescriptorId_t GetOnDiskId() const
std::shared_ptr< void > GetPtr() const
Get the pointer to the field value managed by the processor's entry.
ROOT::NTupleSize_t GetEntryNumber() const
RDataFrame FromRNTupleProcessor(std::unique_ptr< ROOT::RNTupleProcessor > processor)
std::string TypeID2TypeName(const std::type_info &id)
Returns the name of a type starting from its type_info An empty string is returned in case of failure...
std::string GetRenormalizedTypeName(const std::string &metaNormalizedName)
Given a type name normalized by ROOT meta, renormalize it for RNTuple. E.g., insert std::prefix.
constexpr NTupleSize_t kInvalidNTupleIndex
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.