53 std::deque<RNTupleProcessorDS::RFieldInfo> &fieldInfos,
bool convertToRVec)
85 std::uint16_t nFieldInfosAdded = 0;
100 bool representableAsRVec =
101 convertToRVec && (field.
GetTypeName().substr(0, 19) ==
"ROOT::VecOps::RVec<" ||
104 AddField(*
f, colName, procProvenance, fieldInfos, representableAsRVec);
110 }
else if (nRepetitions > 0) {
113 AddField(*
f, colName, procProvenance, fieldInfos);
118 auto innerName = colName.empty() ?
f->GetFieldName() : (std::string(colName) +
"." +
f->GetFieldName());
120 AddField(*
f, innerName, procProvenance, fieldInfos);
131 if (!fieldOrException)
133 auto valueField = fieldOrException.Unwrap();
136 if (cardinalityField->As32Bit()) {
137 valueField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint32_t>>(field.
GetFieldName());
138 }
else if (cardinalityField->As64Bit()) {
139 valueField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint64_t>>(field.
GetFieldName());
141 R__ASSERT(
false &&
"cardinality field stored with an unexpected integer type");
146 auto valueSubfields = valueField->GetMutableSubfields();
148 for (
unsigned i = 0; i < valueSubfields.size(); ++i) {
149 valueSubfields[i]->SetOnDiskId(fieldSubfields[i]->GetOnDiskId());
152 std::unique_ptr<ROOT::RFieldBase> cardinalityField;
154 if (!fieldInfos.empty()) {
155 const auto &info = fieldInfos.back();
156 const std::string
name =
157 (procProvenance.
Empty() ?
"R_rdf_sizeof_" : procProvenance.
Get() +
"_R_rdf_sizeof_") + info.fFieldName;
158 if (info.fNRepetitions > 0) {
159 cardinalityField = std::make_unique<ROOT::Internal::RDF::RArraySizeField>(
name, info.fNRepetitions);
161 cardinalityField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::size_t>>(
name);
163 cardinalityField->SetOnDiskId(info.fFieldId);
166 for (
auto i = fieldInfos.rbegin(); i != fieldInfos.rend(); ++i) {
167 const auto &fieldInfo = *i;
169 const auto valueFieldName = valueField->GetFieldName();
171 if (fieldInfo.fNRepetitions > 0) {
174 std::make_unique<ROOT::RArrayAsRVecField>(valueFieldName, valueField->Clone(
"_0"), fieldInfo.fNRepetitions);
179 valueField = std::make_unique<ROOT::RRVecField>(valueFieldName, valueField->Clone(
"_0"));
181 auto outerFieldType = fieldInfo.fTypeName;
186 valueField->SetOnDiskId(fieldInfo.fFieldId);
190 if (i != fieldInfos.rbegin()) {
191 const auto cardinalityFieldName = cardinalityField->GetFieldName();
192 if (fieldInfo.fNRepetitions > 0) {
194 cardinalityField = std::make_unique<ROOT::RArrayAsRVecField>(
195 cardinalityFieldName, cardinalityField->Clone(
"_0"), fieldInfo.fNRepetitions);
198 cardinalityField = std::make_unique<ROOT::RRVecField>(cardinalityFieldName, cardinalityField->Clone(
"_0"));
201 cardinalityField->SetOnDiskId(fieldInfo.fFieldId);
205 if (cardinalityField) {
206 std::string cardinalityFieldName =
207 (procProvenance.
Empty() ?
"R_rdf_sizeof_" : procProvenance.
Get() +
"_R_rdf_sizeof_") + std::string(colName);
209 fColumnTypes.emplace_back(cardinalityField->GetTypeName());
210 fProcessor->AddFieldToEntry(std::move(cardinalityField), cardinalityFieldName,
nullptr,
216 std::string canonicalName = (procProvenance.
Empty() ?
"" : procProvenance.
Get() +
".") + std::string(colName);
221 if (fieldInfos.size() > 1) {
222 fProcessor->AddFieldToEntry(std::move(valueField), canonicalName,
nullptr,
226 for (std::uint16_t i = 0; i < nFieldInfosAdded; i++) {
227 fieldInfos.pop_back();
232 : fProcessor(std::move(processor))
237 for (
auto fieldIdx : entry.GetFieldIndices()) {
238 const auto &field = entry.GetValue(fieldIdx).GetField();
239 std::deque<RNTupleProcessorDS::RFieldInfo> fieldInfos{};
240 AddField(field, entry.GetQualifiedFieldName(fieldIdx), entry.GetFieldProvenance(fieldIdx), fieldInfos);
251std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase>
260 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
261 auto reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
273 std::unique_ptr<Internal::RDF::RNTupleProcessorColumnReader> reader;
275 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
276 reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
279 throw std::runtime_error(
"RNTupleProcessorDS: Column \"" + std::string(
name) +
"\" does not exist");
284 const auto &field =
fProcessor->GetEntry().GetField(*fieldIdx);
285 const std::string strName = std::string(
name);
286 std::unique_ptr<ROOT::RFieldBase> newField;
288 if (requestedType ==
"bool") {
289 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<bool>>(strName);
290 }
else if (requestedType ==
"char") {
291 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<char>>(strName);
292 }
else if (requestedType ==
"std::int8_t") {
293 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int8_t>>(strName);
294 }
else if (requestedType ==
"std::uint8_t") {
295 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint8_t>>(strName);
296 }
else if (requestedType ==
"std::int16_t") {
297 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int16_t>>(strName);
298 }
else if (requestedType ==
"std::uint16_t") {
299 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint16_t>>(strName);
300 }
else if (requestedType ==
"std::int32_t") {
301 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int32_t>>(strName);
302 }
else if (requestedType ==
"std::uint32_t") {
303 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint32_t>>(strName);
304 }
else if (requestedType ==
"std::int64_t") {
305 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::int64_t>>(strName);
306 }
else if (requestedType ==
"std::uint64_t") {
307 newField = std::make_unique<ROOT::Internal::RDF::RRDFCardinalityField<std::uint64_t>>(strName);
309 throw std::runtime_error(
"RNTupleProcessorDS: Could not create field with type \"" + requestedType +
310 "\" for column \"" + strName +
"\"");
315 if (!newAltProtoFieldOrException) {
316 throw std::runtime_error(
"RNTupleProcessorDS: Could not create field with type \"" + requestedType +
317 "\" for column \"" + strName +
"\"");
319 newField = newAltProtoFieldOrException.Unwrap();
321 newField->SetOnDiskId(field.GetOnDiskId());
326 std::string msg =
"RNTupleProcessorDS: invalid type \"" + requestedType +
"\" for column \"" + strName +
327 "\" with on-disk type \"" + field.GetTypeName() +
"\"";
328 throw std::runtime_error(msg);
331 auto valuePtr =
fProcessor->RequestField(std::string(
name), requestedType);
332 auto reader = std::make_unique<Internal::RDF::RNTupleProcessorColumnReader>(valuePtr);
362 auto msg = std::string(
"RNTupleProcessorDS: There is no column with name \"") + std::string(colName) +
"\"";
363 throw std::runtime_error(msg);
392 Warning(
"RNTupleProcessorDS",
"MT is not yet supported. Using single-threaded processing instead.");
405 colReader->SetEntryLoaded(entry);
412 unsigned int ,
const std::unordered_map<std::string, ROOT::RDF::Experimental::RSample *> &sampleMap)
const
414 const auto &ntupleID =
fProcessor->GetOptions().GetProcessorName();
418 if (sampleMap.empty())
421 if (sampleMap.find(ntupleID) == sampleMap.end())
422 throw std::runtime_error(
"Full sample identifier '" + ntupleID +
"' cannot be found in the available samples.");
432 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)
void * GetImpl(Long64_t entry) final
Long64_t fLastLoadedEntry
RNTupleProcessorColumnReader(RNTupleProcessorOptionalPtr< void > &valuePtr)
RNTupleProcessorOptionalPtr< void > fValuePtr
Container for the value of the column.
~RNTupleProcessorColumnReader() override=default
RNTupleProcessorDS(std::unique_ptr< ROOT::Experimental::RNTupleProcessor > processor)
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
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.
bool SetEntry(unsigned int, ULong64_t) final
Advance the "cursors" returned by GetColumnReaders to the selected entry for a particular slot.
void AddField(const ROOT::RFieldBase &field, std::string_view colName, Internal::RNTupleProcessorProvenance procProvenance, std::deque< RFieldInfo > &fieldInfos, bool convertToRVec=true)
Provides the RDF column "colName" given the field.
void SetNSlots(unsigned int nSlots) final
Inform RDataSource of the number of processing slots (i.e.
RNTupleProcessor::REntryMapping fEntryMapping
std::string Get() const
Get the full processor provenance, in the form of "x.y.z".
std::shared_ptr< void > GetPtr() const
Get the pointer to the field value managed by the processor's entry.
ROOT::NTupleSize_t GetEntryNumber() const
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
RDataFrame FromRNTupleProcessor(std::unique_ptr< ROOT::Experimental::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.