71std::unique_ptr<ROOT::RFieldBase>
76 streamerField->SetOnDiskId(
fFieldId);
97 std::vector<std::unique_ptr<ROOT::RFieldBase>> memberFields;
98 memberFields.reserve(
fLinkIds.size());
101 auto field = memberDesc.
CreateField(ntplDesc, options);
104 memberFields.emplace_back(std::move(field));
106 auto recordField = std::make_unique<ROOT::RRecordField>(
GetFieldName(), std::move(memberFields));
118 collectionField->SetOnDiskId(
fFieldId);
119 return collectionField;
134 for (
auto &subfield : *field) {
135 const auto subfieldId = ntplDesc.
FindFieldId(subfield.GetFieldName(), subfield.GetParent()->GetOnDiskId());
136 subfield.SetOnDiskId(subfieldId);
140 return invalidField.
Clone(fieldName);
189 if (firstInPage + pi.GetNElements() > idxInCluster) {
193 firstInPage += pi.GetNElements();
202 std::size_t left = 0;
203 std::size_t right =
N - 1;
204 std::size_t midpoint =
N;
205 while (left <= right) {
206 midpoint = (left + right) / 2;
215 right = midpoint - 1;
220 decltype(idxInCluster) firstInPage = (midpoint == 0) ? 0 : (*fCumulativeNElements)[midpoint - 1];
222 R__ASSERT((firstInPage + pageInfo.GetNElements()) > idxInCluster);
229 std::size_t pageSize)
234 const auto nElements =
236 [](std::size_t
n,
const auto &pageInfo) { return n + pageInfo.GetNElements(); });
237 const auto nElementsRequired =
static_cast<std::uint64_t
>(columnRange.
GetNElements());
239 if (nElementsRequired == nElements)
241 R__ASSERT((nElementsRequired > nElements) &&
"invalid attempt to shrink RPageRange");
243 std::vector<RPageInfo> pageInfos;
245 const std::uint64_t nElementsPerPage = pageSize / element.
GetSize();
247 for (
auto nRemainingElements = nElementsRequired - nElements; nRemainingElements > 0;) {
249 pageInfo.
SetNElements(std::min(nElementsPerPage, nRemainingElements));
254 pageInfos.emplace_back(pageInfo);
258 pageInfos.insert(pageInfos.end(), std::make_move_iterator(
fPageInfos.begin()),
261 return nElementsRequired - nElements;
272 std::uint64_t nbytes = 0;
274 for (
const auto &pi : pr.second.GetPageInfos()) {
275 nbytes += pi.GetLocator().GetNBytesOnStorage();
336 if (!cd.second.ContainsColumn(physicalColumnId))
338 auto columnRange = cd.second.GetColumnRange(physicalColumnId);
339 result = std::max(
result, columnRange.GetFirstElementIndex() + columnRange.GetNElements());
346std::vector<ROOT::Internal::RNTupleClusterBoundaries>
349 std::vector<Internal::RNTupleClusterBoundaries> boundaries;
354 R__ASSERT(clusterDesc.GetNEntries() > 0);
356 clusterDesc.GetFirstEntryIndex(), clusterDesc.GetFirstEntryIndex() + clusterDesc.GetNEntries()});
365 std::string leafName(fieldName);
366 auto posDot = leafName.find_last_of(
'.');
367 if (posDot != std::string::npos) {
368 auto parentName = leafName.substr(0, posDot);
369 leafName = leafName.substr(posDot + 1);
375 for (
const auto linkId : itrFieldDesc->second.GetLinkIds()) {
390 return fieldDescriptor.GetFieldName();
391 return prefix +
"." + fieldDescriptor.GetFieldName();
413 std::uint32_t columnIndex,
414 std::uint16_t representationIndex)
const
419 if (columnIndex >= itr->second.GetColumnCardinality())
421 const auto idx = representationIndex * itr->second.GetColumnCardinality() + columnIndex;
422 if (itr->second.GetLogicalColumnIds().size() <= idx)
424 return itr->second.GetLogicalColumnIds()[idx];
428 std::uint32_t columnIndex,
429 std::uint16_t representationIndex)
const
445 std::size_t cgLeft = 0;
447 while (cgLeft <= cgRight) {
448 const std::size_t cgMidpoint = (cgLeft + cgRight) / 2;
454 if (!clusterDesc.ContainsColumn(physicalColumnId))
457 const auto firstElementInGroup = clusterDesc.GetColumnRange(physicalColumnId).GetFirstElementIndex();
458 if (firstElementInGroup >
index) {
461 cgRight = cgMidpoint - 1;
465 const auto &lastColumnRange =
GetClusterDescriptor(clusterIds.back()).GetColumnRange(physicalColumnId);
466 if ((lastColumnRange.GetFirstElementIndex() + lastColumnRange.GetNElements()) <=
index) {
468 cgLeft = cgMidpoint + 1;
474 std::size_t clusterLeft = 0;
475 std::size_t clusterRight = clusterIds.size() - 1;
476 while (clusterLeft <= clusterRight) {
477 const std::size_t clusterMidpoint = (clusterLeft + clusterRight) / 2;
478 const auto clusterId = clusterIds[clusterMidpoint];
481 if (columnRange.Contains(
index))
484 if (columnRange.GetFirstElementIndex() >
index) {
486 clusterRight = clusterMidpoint - 1;
490 if (columnRange.GetFirstElementIndex() + columnRange.GetNElements() <=
index) {
491 clusterLeft = clusterMidpoint + 1;
507 std::size_t cgLeft = 0;
509 while (cgLeft <= cgRight) {
510 const std::size_t cgMidpoint = (cgLeft + cgRight) / 2;
513 if (cgDesc.GetMinEntry() > entryIdx) {
515 cgRight = cgMidpoint - 1;
519 if (cgDesc.GetMinEntry() + cgDesc.GetEntrySpan() <= entryIdx) {
520 cgLeft = cgMidpoint + 1;
526 const auto &clusterIds = cgDesc.GetClusterIds();
528 std::size_t clusterLeft = 0;
529 std::size_t clusterRight = clusterIds.size() - 1;
530 while (clusterLeft <= clusterRight) {
531 const std::size_t clusterMidpoint = (clusterLeft + clusterRight) / 2;
534 if (clusterDesc.GetFirstEntryIndex() > entryIdx) {
536 clusterRight = clusterMidpoint - 1;
540 if (clusterDesc.GetFirstEntryIndex() + clusterDesc.GetNEntries() <= entryIdx) {
541 clusterLeft = clusterMidpoint + 1;
545 return clusterIds[clusterMidpoint];
559 const auto firstEntryInNextCluster = clusterDesc.GetFirstEntryIndex() + clusterDesc.GetNEntries();
570 if (clusterDesc.GetFirstEntryIndex() == 0)
575std::vector<ROOT::DescriptorId_t>
578 std::vector<ROOT::DescriptorId_t> fields;
581 fields.emplace_back(fieldId);
595 std::deque<ROOT::DescriptorId_t> fieldIdQueue{ntuple.
GetFieldZeroId()};
597 while (!fieldIdQueue.empty()) {
598 auto currFieldId = fieldIdQueue.front();
599 fieldIdQueue.pop_front();
601 const auto &columns = ntuple.GetFieldDescriptor(currFieldId).GetLogicalColumnIds();
602 fColumns.insert(fColumns.end(), columns.begin(), columns.end());
604 for (const auto &field : ntuple.GetFieldIterable(currFieldId)) {
605 auto fieldId = field.GetId();
606 fieldIdQueue.push_back(fieldId);
613 std::vector<std::uint64_t>
result;
614 unsigned int base = 0;
615 std::uint64_t flags = 0;
617 if ((
f > 0) && ((
f % 64) == 0))
619 while (
f > base + 64) {
620 result.emplace_back(flags);
625 flags |= std::uint64_t(1) <<
f;
627 result.emplace_back(flags);
632 std::vector<RClusterDescriptor> &clusterDescs)
636 return R__FAIL(
"invalid attempt to add details of unknown cluster group");
637 if (iter->second.HasClusterDetails())
638 return R__FAIL(
"invalid attempt to re-populate cluster group details");
639 if (iter->second.GetNClusters() != clusterDescs.size())
640 return R__FAIL(
"mismatch of number of clusters");
642 std::vector<ROOT::DescriptorId_t> clusterIds;
643 for (
unsigned i = 0; i < clusterDescs.size(); ++i) {
644 clusterIds.emplace_back(clusterDescs[i].GetId());
647 return R__FAIL(
"invalid attempt to re-populate existing cluster");
651 return fClusterDescriptors[a].GetFirstEntryIndex() < fClusterDescriptors[b].GetFirstEntryIndex();
654 cgBuilder.AddSortedClusters(clusterIds);
655 iter->second = cgBuilder.MoveDescriptor().Unwrap();
663 return R__FAIL(
"invalid attempt to drop cluster details of unknown cluster group");
664 if (!iter->second.HasClusterDetails())
665 return R__FAIL(
"invalid attempt to drop details of cluster group summary");
667 for (
auto clusterId : iter->second.GetClusterIds())
669 iter->second = iter->second.CloneSummary();
677 std::unordered_set<ROOT::DescriptorId_t> invalidFields;
680 auto fieldId = colDesc.GetFieldId();
685 fieldId = field.GetParentId();
687 invalidFields.insert(fieldId);
697 "cannot create Model: descriptor contains unknown column types. Use 'SetForwardCompatible(true)' on the "
698 "RCreateModelOptions to create a partial model containing only the fields made up by known columns."));
700 auto fieldZero = std::make_unique<ROOT::RFieldZero>();
708 if (invalidFields.count(topDesc.GetId()) > 0) {
713 auto field = topDesc.CreateField(*
this, createFieldOpts);
720 const auto &invalid =
static_cast<const RInvalidField &
>(*field);
724 throw invalid.GetError();
731 model->AddProjectedField(std::move(field), [
this](
const std::string &targetName) -> std::string {
735 model->AddField(std::move(field));
823 std::uint64_t firstElementIndex,
824 std::uint32_t compressionSettings,
828 return R__FAIL(
"column ID mismatch");
829 if (
fCluster.fColumnRanges.count(physicalId) > 0)
830 return R__FAIL(
"column ID conflict");
833 columnRange.IncrementNElements(pi.GetNElements());
836 fCluster.fColumnRanges[physicalId] = columnRange;
843 if (
fCluster.fColumnRanges.count(physicalId) > 0)
844 return R__FAIL(
"column ID conflict");
849 fCluster.fColumnRanges[physicalId] = columnRange;
856 for (
auto &[
_, columnRange] :
fCluster.fColumnRanges) {
857 if (!columnRange.IsSuppressed())
864 for (
const auto otherColumnLogicalId : fieldDesc.GetLogicalColumnIds()) {
866 if (otherColumnDesc.GetRepresentationIndex() == columnDesc.GetRepresentationIndex())
868 if (otherColumnDesc.GetIndex() != columnDesc.GetIndex())
872 const auto &otherColumnRange =
fCluster.GetColumnRange(otherColumnDesc.GetPhysicalId());
873 if (otherColumnRange.IsSuppressed())
876 columnRange.SetFirstElementIndex(otherColumnRange.GetFirstElementIndex());
877 columnRange.SetNElements(otherColumnRange.GetNElements());
882 return R__FAIL(std::string(
"cannot find non-suppressed column for column ID ") +
883 std::to_string(columnRange.GetPhysicalColumnId()) +
884 ", cluster ID: " + std::to_string(
fCluster.GetId()));
896 auto fnTraverseSubtree = [&](
ROOT::DescriptorId_t rootFieldId, std::uint64_t nRepetitionsAtThisLevel,
897 const auto &visitField,
const auto &enterSubtree) ->
void {
898 visitField(rootFieldId, nRepetitionsAtThisLevel);
900 const std::uint64_t nRepetitions = std::max(
f.GetNRepetitions(), std::uint64_t{1U}) * nRepetitionsAtThisLevel;
901 enterSubtree(
f.GetId(), nRepetitions, visitField, enterSubtree);
913 topLevelField.GetId(), std::max(topLevelField.GetNRepetitions(), std::uint64_t{1U}),
915 for (const auto &c : desc.GetColumnIterable(fieldId)) {
916 const ROOT::DescriptorId_t physicalId = c.GetPhysicalId();
917 auto &columnRange = fCluster.fColumnRanges[physicalId];
922 if (columnRange.GetPhysicalColumnId() == ROOT::kInvalidDescriptorId) {
923 columnRange.SetPhysicalColumnId(physicalId);
924 columnRange.SetFirstElementIndex(0);
925 columnRange.SetNElements(0);
926 columnRange.SetIsSuppressed(c.IsSuppressedDeferredColumn());
934 if (c.IsDeferredColumn()) {
935 columnRange.SetFirstElementIndex(fCluster.GetFirstEntryIndex() * nRepetitions);
936 columnRange.SetNElements(fCluster.GetNEntries() * nRepetitions);
937 if (!columnRange.IsSuppressed()) {
938 auto &pageRange = fCluster.fPageRanges[physicalId];
939 pageRange.fPhysicalColumnId = physicalId;
940 const auto element = ROOT::Internal::RColumnElementBase::Generate<void>(c.GetType());
941 pageRange.ExtendToFitColumnRange(columnRange, *element, ROOT::Internal::RPage::kPageZeroSize);
943 } else if (!columnRange.IsSuppressed()) {
944 fCluster.fPageRanges[physicalId].fPhysicalColumnId = physicalId;
956 return R__FAIL(
"unset cluster ID");
958 return R__FAIL(
"empty cluster");
959 for (
auto &pr :
fCluster.fPageRanges) {
960 if (
fCluster.fColumnRanges.count(pr.first) == 0) {
961 return R__FAIL(
"missing column range");
963 pr.second.fCumulativeNElements.reset();
964 const auto nPages = pr.second.fPageInfos.size();
966 pr.second.fCumulativeNElements = std::make_unique<std::vector<NTupleSize_t>>();
967 pr.second.fCumulativeNElements->reserve(nPages);
969 for (
const auto &pi : pr.second.fPageInfos) {
970 sum += pi.GetNElements();
971 pr.second.fCumulativeNElements->emplace_back(
sum);
998 return R__FAIL(
"unset cluster group ID");
1019 if (
fDescriptor.fFieldDescriptors.count(fieldId) == 0)
1020 return R__FAIL(
"field with id '" + std::to_string(fieldId) +
"' doesn't exist");
1027 return R__FAIL(
"unset or unsupported RNTuple epoch version");
1036 for (
const auto &[fieldId, fieldDesc] :
fDescriptor.fFieldDescriptors) {
1039 return R__FAIL(
"field with id '" + std::to_string(fieldId) +
"' has an invalid parent id");
1043 const auto columnCardinality = fieldDesc.GetColumnCardinality();
1044 if (columnCardinality == 0)
1049 const auto &logicalColumnIds = fieldDesc.GetLogicalColumnIds();
1050 const auto nColumns = logicalColumnIds.size();
1052 if ((nColumns + 1) == columnCardinality)
1055 const auto &lastColumn =
fDescriptor.GetColumnDescriptor(logicalColumnIds.back());
1056 if (lastColumn.GetIndex() + 1 != columnCardinality)
1057 return R__FAIL(
"field with id '" + std::to_string(fieldId) +
"' has incomplete column representations");
1067 for (
const auto &[
id,
_] :
fDescriptor.fClusterGroupDescriptors)
1068 fDescriptor.fSortedClusterGroupIds.emplace_back(
id);
1071 return fDescriptor.fClusterGroupDescriptors[a].GetMinEntry() <
1072 fDescriptor.fClusterGroupDescriptors[b].GetMinEntry();
1080 std::uint16_t versionMinor, std::uint16_t versionPatch)
1083 throw RException(
R__FAIL(
"unsupported RNTuple epoch version: " + std::to_string(versionEpoch)));
1100 const std::string_view description)
1103 fDescriptor.fDescription = std::string(description);
1108 if (flag > 0 && flag % 64 == 0)
1116 if (
fDesc.fName.empty())
1117 return R__FAIL(
"attribute set name cannot be empty");
1118 if (
fDesc.fAnchorLength == 0)
1119 return R__FAIL(
"invalid anchor length");
1121 return R__FAIL(
"invalid locator type");
1123 return std::move(
fDesc);
1129 return R__FAIL(
"invalid logical column id");
1131 return R__FAIL(
"invalid physical column id");
1133 return R__FAIL(
"invalid field id, dangling column");
1142 if (
fColumn.GetBitsOnStorage() < minBits ||
fColumn.GetBitsOnStorage() > maxBits)
1143 return R__FAIL(
"invalid column bit width");
1173 return R__FAIL(
"invalid field id");
1176 return R__FAIL(
"invalid field structure");
1179 return R__FAIL(
"invalid SoA flag on non-collection field");
1187 if (
fField.GetFieldName().empty()) {
1188 return R__FAIL(
"name cannot be empty string \"\"");
1198 fDescriptor.fHeaderExtension->MarkExtendedField(fieldDesc);
1211 return R__FAIL(
"child field with id '" + std::to_string(linkId) +
"' doesn't exist in NTuple");
1214 return R__FAIL(
"cannot make FieldZero a child field");
1217 auto parentId =
fDescriptor.fFieldDescriptors.at(linkId).GetParentId();
1219 return R__FAIL(
"field '" + std::to_string(linkId) +
"' already has a parent ('" + std::to_string(parentId) +
")");
1221 if (fieldId == linkId) {
1222 return R__FAIL(
"cannot make field '" + std::to_string(fieldId) +
"' a child of itself");
1224 fDescriptor.fFieldDescriptors.at(linkId).fParentId = fieldId;
1225 fDescriptor.fFieldDescriptors.at(fieldId).fLinkIds.push_back(linkId);
1236 return R__FAIL(
"projected field with id '" + std::to_string(targetId) +
"' doesn't exist in NTuple");
1239 return R__FAIL(
"cannot make FieldZero a projected field");
1241 if (sourceId == targetId) {
1242 return R__FAIL(
"cannot make field '" + std::to_string(targetId) +
"' a projection of itself");
1244 if (
fDescriptor.fFieldDescriptors.at(sourceId).IsProjectedField()) {
1245 return R__FAIL(
"cannot make field '" + std::to_string(targetId) +
"' a projection of an already projected field");
1248 auto &targetDesc =
fDescriptor.fFieldDescriptors.at(targetId);
1249 if (targetDesc.IsProjectedField() && targetDesc.GetProjectionSourceId() != sourceId) {
1250 return R__FAIL(
"field '" + std::to_string(targetId) +
"' has already a projection source ('" +
1251 std::to_string(targetDesc.GetProjectionSourceId()) +
")");
1253 fDescriptor.fFieldDescriptors.at(targetId).fProjectionSourceId = sourceId;
1259 const auto fieldId = columnDesc.GetFieldId();
1260 const auto columnIndex = columnDesc.GetIndex();
1261 const auto representationIndex = columnDesc.GetRepresentationIndex();
1267 auto &fieldDesc =
fDescriptor.fFieldDescriptors.find(fieldId)->second;
1269 if (columnDesc.IsAliasColumn()) {
1270 if (columnDesc.GetType() !=
fDescriptor.GetColumnDescriptor(columnDesc.GetPhysicalId()).GetType())
1271 return R__FAIL(
"alias column type mismatch");
1274 return R__FAIL(
"column index clash");
1276 if (columnIndex > 0) {
1278 return R__FAIL(
"out of bounds column index");
1280 if (representationIndex > 0) {
1282 return R__FAIL(
"out of bounds representation index");
1284 if (columnIndex == 0) {
1285 assert(fieldDesc.fColumnCardinality > 0);
1286 if (
fDescriptor.FindLogicalColumnId(fieldId, fieldDesc.fColumnCardinality - 1, representationIndex - 1) ==
1288 return R__FAIL(
"incomplete column representations");
1291 if (columnIndex >= fieldDesc.fColumnCardinality)
1292 return R__FAIL(
"irregular column representations");
1296 fieldDesc.fColumnCardinality = columnIndex + 1;
1299 const auto logicalId = columnDesc.GetLogicalId();
1300 fieldDesc.fLogicalColumnIds.emplace_back(logicalId);
1302 if (!columnDesc.IsAliasColumn())
1304 fDescriptor.fColumnDescriptors.emplace(logicalId, std::move(columnDesc));
1306 fDescriptor.fHeaderExtension->MarkExtendedColumn(columnDesc);
1313 const auto id = clusterGroup.GetId();
1314 if (
fDescriptor.fClusterGroupDescriptors.count(
id) > 0)
1315 return R__FAIL(
"cluster group id clash");
1316 fDescriptor.fNEntries = std::max(
fDescriptor.fNEntries, clusterGroup.GetMinEntry() + clusterGroup.GetEntrySpan());
1317 fDescriptor.fNClusters += clusterGroup.GetNClusters();
1318 fDescriptor.fClusterGroupDescriptors.emplace(
id, std::move(clusterGroup));
1330 fDescriptor.fHeaderExtension = std::make_unique<RNTupleDescriptor::RHeaderExtension>();
1344 for (
auto &link :
fDescriptor.fFieldDescriptors[
c.fFieldId].fLogicalColumnIds) {
1345 if (link ==
c.fLogicalColumnId) {
1352 fDescriptor.fColumnDescriptors.emplace(
c.fLogicalColumnId, std::move(
c));
1358 auto clusterId = clusterDesc.GetId();
1359 if (
fDescriptor.fClusterDescriptors.count(clusterId) > 0)
1360 return R__FAIL(
"cluster id clash");
1361 fDescriptor.fClusterDescriptors.emplace(clusterId, std::move(clusterDesc));
1369 if (std::find(
fDescriptor.fExtraTypeInfoDescriptors.begin(),
fDescriptor.fExtraTypeInfoDescriptors.end(),
1370 extraTypeInfoDesc) !=
fDescriptor.fExtraTypeInfoDescriptors.end()) {
1371 return R__FAIL(
"extra type info duplicates");
1373 fDescriptor.fExtraTypeInfoDescriptors.emplace_back(std::move(extraTypeInfoDesc));
1379 auto it = std::find(
fDescriptor.fExtraTypeInfoDescriptors.begin(),
fDescriptor.fExtraTypeInfoDescriptors.end(),
1381 if (it !=
fDescriptor.fExtraTypeInfoDescriptors.end())
1382 *it = std::move(extraTypeInfoDesc);
1384 fDescriptor.fExtraTypeInfoDescriptors.emplace_back(std::move(extraTypeInfoDesc));
1391 if (std::find_if(attrSets.begin(), attrSets.end(), [&
name = attrSetDesc.GetName()](
const auto &desc) {
1392 return desc.GetName() == name;
1393 }) != attrSets.end()) {
1394 return R__FAIL(
"attribute sets with duplicate names");
1396 attrSets.push_back(std::move(attrSetDesc));
1501 if (fieldDesc.
GetTypeName().rfind(
"std::", 0) == 0)
1508 static const std::string gIntTypeNames[] = {
"bool",
"char",
"std::int8_t",
"std::uint8_t",
1509 "std::int16_t",
"std::uint16_t",
"std::int32_t",
"std::uint32_t",
1510 "std::int64_t",
"std::uint64_t"};
1511 return std::find(std::begin(gIntTypeNames), std::end(gIntTypeNames),
1519 return (fieldDesc.
GetTypeName().rfind(
"std::atomic<", 0) == 0);
#define R__FORWARD_ERROR(res)
Short-hand to return an RResult<T> in an error state (i.e. after checking)
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
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
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
ROOT::Experimental::RNTupleAttrSetDescriptor fDesc
RResult< ROOT::Experimental::RNTupleAttrSetDescriptor > MoveDescriptor()
Attempt to make an AttributeSet descriptor.
Used to loop over all the Attribute Sets linked to an RNTuple.
Metadata stored for every Attribute Set linked to an RNTuple.
bool operator==(const RNTupleAttrSetDescriptor &other) const
RNTupleAttrSetDescriptor()=default
std::uint16_t fSchemaVersionMajor
RNTupleAttrSetDescriptor Clone() const
std::uint32_t fAnchorLength
uncompressed size of the linked anchor
RNTupleLocator fAnchorLocator
std::uint16_t fSchemaVersionMinor
A helper class for piece-wise construction of an RClusterDescriptor.
RClusterDescriptor fCluster
RResult< void > MarkSuppressedColumnRange(ROOT::DescriptorId_t physicalId)
Books the given column ID as being suppressed in this cluster.
RResult< void > CommitColumnRange(ROOT::DescriptorId_t physicalId, std::uint64_t firstElementIndex, std::uint32_t compressionSettings, const RClusterDescriptor::RPageRange &pageRange)
RClusterDescriptorBuilder & AddExtendedColumnRanges(const RNTupleDescriptor &desc)
Add column and page ranges for columns created during late model extension missing in this cluster.
RResult< void > CommitSuppressedColumnRanges(const RNTupleDescriptor &desc)
Sets the first element index and number of elements for all the suppressed column ranges.
RResult< RClusterDescriptor > MoveDescriptor()
Move out the full cluster descriptor including page locations.
A helper class for piece-wise construction of an RClusterGroupDescriptor.
RClusterGroupDescriptorBuilder & EntrySpan(std::uint64_t entrySpan)
RClusterGroupDescriptorBuilder & PageListLocator(const RNTupleLocator &pageListLocator)
RClusterGroupDescriptorBuilder()=default
static RClusterGroupDescriptorBuilder FromSummary(const RClusterGroupDescriptor &clusterGroupDesc)
RClusterGroupDescriptorBuilder & PageListLength(std::uint64_t pageListLength)
RClusterGroupDescriptorBuilder & MinEntry(std::uint64_t minEntry)
RClusterGroupDescriptor fClusterGroup
RResult< RClusterGroupDescriptor > MoveDescriptor()
RClusterGroupDescriptorBuilder & ClusterGroupId(ROOT::DescriptorId_t clusterGroupId)
RClusterGroupDescriptorBuilder & NClusters(std::uint32_t nClusters)
RResult< RColumnDescriptor > MakeDescriptor() const
Attempt to make a column descriptor.
RColumnDescriptor fColumn
A column element encapsulates the translation between basic C++ types and their column representation...
static std::pair< std::uint16_t, std::uint16_t > GetValidBitRange(ROOT::ENTupleColumnType type)
Most types have a fixed on-disk bit width.
std::size_t GetSize() const
std::size_t GetPackedSize(std::size_t nElements=1U) const
A helper class for piece-wise construction of an RFieldDescriptor.
RFieldDescriptorBuilder & NRepetitions(std::uint64_t nRepetitions)
RFieldDescriptorBuilder & Structure(const ROOT::ENTupleStructure &structure)
RFieldDescriptorBuilder()=default
Make an empty dangling field descriptor.
RFieldDescriptorBuilder & TypeAlias(const std::string &typeAlias)
RFieldDescriptorBuilder & TypeVersion(std::uint32_t typeVersion)
RFieldDescriptorBuilder & IsSoACollection(bool val)
RFieldDescriptorBuilder & TypeChecksum(const std::optional< std::uint32_t > typeChecksum)
RResult< RFieldDescriptor > MakeDescriptor() const
Attempt to make a field descriptor.
static RFieldDescriptorBuilder FromField(const ROOT::RFieldBase &field)
Make a new RFieldDescriptorBuilder based off a live RNTuple field.
RFieldDescriptorBuilder & FieldDescription(const std::string &fieldDescription)
RFieldDescriptorBuilder & FieldVersion(std::uint32_t fieldVersion)
RFieldDescriptorBuilder & FieldName(const std::string &fieldName)
RFieldDescriptorBuilder & TypeName(const std::string &typeName)
void SetNTuple(const std::string_view name, const std::string_view description)
void SetSchemaFromExisting(const RNTupleDescriptor &descriptor)
Copies the "schema" part of descriptor into the builder's descriptor.
void SetVersionForWriting()
RResult< void > AddColumn(RColumnDescriptor &&columnDesc)
RResult< void > AddAttributeSet(Experimental::RNTupleAttrSetDescriptor &&attrSetDesc)
RResult< void > AddFieldProjection(ROOT::DescriptorId_t sourceId, ROOT::DescriptorId_t targetId)
void ReplaceExtraTypeInfo(RExtraTypeInfoDescriptor &&extraTypeInfoDesc)
RResult< void > AddExtraTypeInfo(RExtraTypeInfoDescriptor &&extraTypeInfoDesc)
void ShiftAliasColumns(std::uint32_t offset)
Shift column IDs of alias columns by offset
void SetVersion(std::uint16_t versionEpoch, std::uint16_t versionMajor, std::uint16_t versionMinor, std::uint16_t versionPatch)
RNTupleDescriptor MoveDescriptor()
void BeginHeaderExtension()
Mark the beginning of the header extension; any fields and columns added after a call to this functio...
RResult< void > AddCluster(RClusterDescriptor &&clusterDesc)
RResult< void > EnsureValidDescriptor() const
Checks whether invariants hold:
RResult< void > AddFieldLink(ROOT::DescriptorId_t fieldId, ROOT::DescriptorId_t linkId)
void AddField(const RFieldDescriptor &fieldDesc)
RResult< void > AddClusterGroup(RClusterGroupDescriptor &&clusterGroup)
RResult< void > EnsureFieldExists(ROOT::DescriptorId_t fieldId) const
void SetFeature(unsigned int flag)
Sets the flag-th bit of the feature flag to 1.
RNTupleDescriptor fDescriptor
A helper class for serializing and deserialization of the RNTuple binary format.
The window of element indexes of a particular column in a particular cluster.
bool IsSuppressed() const
void SetPhysicalColumnId(ROOT::DescriptorId_t id)
ROOT::DescriptorId_t GetPhysicalColumnId() const
void SetIsSuppressed(bool suppressed)
ROOT::NTupleSize_t GetNElements() const
Metadata for RNTuple clusters.
ROOT::NTupleSize_t fFirstEntryIndex
Clusters can be swapped by adjusting the entry offsets of the cluster and all ranges.
RClusterDescriptor()=default
std::unordered_map< ROOT::DescriptorId_t, RColumnRange > fColumnRanges
ROOT::NTupleSize_t fNEntries
ROOT::DescriptorId_t fClusterId
RClusterDescriptor Clone() const
bool operator==(const RClusterDescriptor &other) const
RColumnRangeIterable GetColumnRangeIterable() const
Returns an iterator over pairs { columnId, columnRange }. The iteration order is unspecified.
std::unordered_map< ROOT::DescriptorId_t, RPageRange > fPageRanges
std::uint64_t GetNBytesOnStorage() const
Clusters are bundled in cluster groups.
RNTupleLocator fPageListLocator
The page list that corresponds to the cluster group.
RClusterGroupDescriptor Clone() const
std::vector< ROOT::DescriptorId_t > fClusterIds
The cluster IDs can be empty if the corresponding page list is not loaded.
ROOT::DescriptorId_t GetId() const
std::uint64_t fMinEntry
The minimum first entry number of the clusters in the cluster group.
std::uint32_t fNClusters
Number of clusters is always known even if the cluster IDs are not (yet) populated.
std::uint32_t GetNClusters() const
std::uint64_t fPageListLength
Uncompressed size of the page list.
std::uint64_t GetPageListLength() const
std::uint64_t GetMinEntry() const
std::uint64_t GetEntrySpan() const
RClusterGroupDescriptor()=default
RNTupleLocator GetPageListLocator() const
ROOT::DescriptorId_t fClusterGroupId
std::uint64_t fEntrySpan
Number of entries that are (partially for sharded clusters) covered by this cluster group.
bool operator==(const RClusterGroupDescriptor &other) const
RClusterGroupDescriptor CloneSummary() const
Creates a clone without the cluster IDs.
Metadata stored for every column of an RNTuple.
ROOT::DescriptorId_t fPhysicalColumnId
Usually identical to the logical column ID, except for alias columns where it references the shadowed...
bool operator==(const RColumnDescriptor &other) const
RColumnDescriptor()=default
ROOT::DescriptorId_t fLogicalColumnId
The actual column identifier, which is the link to the corresponding field.
ROOT::DescriptorId_t fFieldId
Every column belongs to one and only one field.
std::int64_t fFirstElementIndex
The absolute value specifies the index for the first stored element for this column.
std::uint32_t fIndex
A field can be serialized into several columns, which are numbered from zero to $n$.
std::uint16_t fBitsOnStorage
The size in bits of elements of this column.
std::uint16_t fRepresentationIndex
A field may use multiple column representations, which are numbered from zero to $m$.
ROOT::ENTupleColumnType fType
The on-disk column type.
std::optional< RValueRange > fValueRange
Optional value range (used e.g. by quantized real fields)
RColumnDescriptor Clone() const
Get a copy of the descriptor.
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
@ kTraitSoACollection
The field represents a collection in SoA layout.
@ kTraitInvalidField
This field is an instance of RInvalidField and can be safely static_cast to it.
@ kTraitTypeChecksum
The TClass checksum is set and valid.
const std::string & GetFieldName() const
const std::string & GetTypeAlias() const
const std::string & GetDescription() const
Get the field's description.
virtual std::uint32_t GetFieldVersion() const
Indicates an evolution of the mapping scheme from C++ type to columns.
virtual std::uint32_t GetTypeChecksum() const
Return the current TClass reported checksum of this class. Only valid if kTraitTypeChecksum is set.
std::uint32_t GetTraits() const
std::size_t GetNRepetitions() const
const std::string & GetTypeName() const
std::unique_ptr< RFieldBase > Clone(std::string_view newName) const
Copies the field and its subfields using a possibly new name and a new, unconnected set of columns.
virtual std::uint32_t GetTypeVersion() const
Indicates an evolution of the C++ type itself.
Metadata stored for every field of an RNTuple.
const std::string & GetTypeAlias() const
std::unique_ptr< ROOT::RFieldBase > CreateField(const RNTupleDescriptor &ntplDesc, const ROOT::RCreateFieldOptions &options={}) const
In general, we create a field simply from the C++ type name.
std::uint32_t fFieldVersion
The version of the C++-type-to-column translation mechanics.
ROOT::DescriptorId_t fFieldId
RFieldDescriptor Clone() const
Get a copy of the descriptor.
ROOT::DescriptorId_t GetId() const
std::uint64_t fNRepetitions
The number of elements per entry for fixed-size arrays.
std::uint32_t fColumnCardinality
The number of columns in the column representations of the field.
ROOT::DescriptorId_t fProjectionSourceId
For projected fields, the source field ID.
ROOT::ENTupleStructure GetStructure() const
bool operator==(const RFieldDescriptor &other) const
std::string fFieldDescription
Free text set by the user.
ROOT::DescriptorId_t fParentId
Establishes sub field relationships, such as classes and collections.
ROOT::DescriptorId_t GetParentId() const
std::string fTypeAlias
A typedef or using directive that resolved to the type name during field creation.
ROOT::ENTupleStructure fStructure
The structural information carried by this field in the data model tree.
std::vector< ROOT::DescriptorId_t > fLinkIds
The pointers in the other direction from parent to children.
std::string fFieldName
The leaf name, not including parent fields.
bool fIsSoACollection
Indicates if this is a collection that should be represented in memory by a SoA layout.
std::uint32_t fTypeVersion
The version of the C++ type itself.
std::string fTypeName
The C++ type that was used when writing the field.
const std::string & GetFieldName() const
RFieldDescriptor()=default
std::vector< ROOT::DescriptorId_t > fLogicalColumnIds
The ordered list of columns attached to this field: first by representation index then by column inde...
const std::string & GetTypeName() const
std::optional< std::uint32_t > fTypeChecksum
For custom classes, we store the ROOT TClass reported checksum to facilitate the use of I/O rules tha...
Used in RFieldBase::Check() to record field creation failures.
@ kGeneric
Generic unrecoverable error.
@ kUnknownStructure
The field could not be created because its descriptor had an unknown structural role.
ECategory GetCategory() const
Used to loop over all the clusters of an RNTuple (in unspecified order)
Used to loop over all the cluster groups of an RNTuple (in unspecified order)
Used to loop over a field's associated columns.
const RNTupleDescriptor & fNTuple
The associated RNTuple for this range.
std::vector< ROOT::DescriptorId_t > fColumns
The descriptor ids of the columns ordered by field, representation, and column index.
RColumnDescriptorIterable(const RNTupleDescriptor &ntuple, const RFieldDescriptor &fieldDesc)
Used to loop over a field's child fields.
The on-storage metadata of an RNTuple.
const RClusterGroupDescriptor & GetClusterGroupDescriptor(ROOT::DescriptorId_t clusterGroupId) const
const RColumnDescriptor & GetColumnDescriptor(ROOT::DescriptorId_t columnId) const
ROOT::DescriptorId_t FindNextClusterId(ROOT::DescriptorId_t clusterId) const
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
std::set< unsigned int > fFeatureFlags
std::unordered_map< ROOT::DescriptorId_t, RClusterGroupDescriptor > fClusterGroupDescriptors
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
std::uint64_t fNPhysicalColumns
Updated by the descriptor builder when columns are added.
std::vector< Experimental::RNTupleAttrSetDescriptor > fAttributeSets
List of AttributeSets linked to this RNTuple.
ROOT::DescriptorId_t fFieldZeroId
Set by the descriptor builder.
std::uint64_t fNEntries
Updated by the descriptor builder when the cluster groups are added.
RClusterGroupDescriptorIterable GetClusterGroupIterable() const
RColumnDescriptorIterable GetColumnIterable() const
bool operator==(const RNTupleDescriptor &other) const
std::uint64_t fOnDiskFooterSize
Like fOnDiskHeaderSize, contains both cluster summaries and page locations.
std::uint16_t fVersionMinor
Set by the descriptor builder when deserialized.
ROOT::DescriptorId_t FindClusterId(ROOT::NTupleSize_t entryIdx) const
std::vector< std::uint64_t > GetFeatureFlags() const
ROOT::DescriptorId_t GetFieldZeroId() const
Returns the logical parent of all top-level RNTuple data fields.
std::unique_ptr< ROOT::RNTupleModel > CreateModel(const RCreateModelOptions &options=RCreateModelOptions()) const
Re-create the C++ model from the stored metadata.
std::string GetTypeNameForComparison(const RFieldDescriptor &fieldDesc) const
Adjust the type name of the passed RFieldDescriptor for comparison with another renormalized type nam...
std::unordered_map< ROOT::DescriptorId_t, RClusterDescriptor > fClusterDescriptors
Potentially a subset of all the available clusters.
std::size_t GetNClusters() const
ROOT::DescriptorId_t FindPhysicalColumnId(ROOT::DescriptorId_t fieldId, std::uint32_t columnIndex, std::uint16_t representationIndex) const
RExtraTypeInfoDescriptorIterable GetExtraTypeInfoIterable() const
const RHeaderExtension * GetHeaderExtension() const
Return header extension information; if the descriptor does not have a header extension,...
std::uint64_t fNClusters
Updated by the descriptor builder when the cluster groups are added.
std::uint64_t fOnDiskHeaderXxHash3
Set by the descriptor builder when deserialized.
const RClusterDescriptor & GetClusterDescriptor(ROOT::DescriptorId_t clusterId) const
ROOT::DescriptorId_t FindFieldId(std::string_view fieldName, ROOT::DescriptorId_t parentId) const
std::string fName
The RNTuple name needs to be unique in a given storage location (file)
std::uint64_t fOnDiskHeaderSize
Set by the descriptor builder when deserialized.
RNTupleDescriptor()=default
RResult< void > DropClusterGroupDetails(ROOT::DescriptorId_t clusterGroupId)
std::uint16_t fVersionMajor
Set by the descriptor builder when deserialized.
std::vector< ROOT::DescriptorId_t > fSortedClusterGroupIds
References cluster groups sorted by entry range and thus allows for binary search.
std::unordered_map< ROOT::DescriptorId_t, RColumnDescriptor > fColumnDescriptors
ROOT::DescriptorId_t FindLogicalColumnId(ROOT::DescriptorId_t fieldId, std::uint32_t columnIndex, std::uint16_t representationIndex) const
std::unordered_map< ROOT::DescriptorId_t, RFieldDescriptor > fFieldDescriptors
ROOT::NTupleSize_t GetNElements(ROOT::DescriptorId_t physicalColumnId) const
RResult< void > AddClusterGroupDetails(ROOT::DescriptorId_t clusterGroupId, std::vector< RClusterDescriptor > &clusterDescs)
Methods to load and drop cluster group details (cluster IDs and page locations)
std::uint16_t fVersionPatch
Set by the descriptor builder when deserialized.
std::string fDescription
Free text from the user.
ROOT::Experimental::RNTupleAttrSetDescriptorIterable GetAttrSetIterable() const
RFieldDescriptorIterable GetTopLevelFields() const
std::uint16_t fVersionEpoch
Set by the descriptor builder when deserialized.
std::vector< RExtraTypeInfoDescriptor > fExtraTypeInfoDescriptors
RNTupleDescriptor Clone() const
std::size_t GetNClusterGroups() const
std::string GetQualifiedFieldName(ROOT::DescriptorId_t fieldId) const
Walks up the parents of the field ID and returns a field name of the form a.b.c.d In case of invalid ...
RClusterDescriptorIterable GetClusterIterable() const
RNTupleDescriptor CloneSchema() const
Creates a descriptor containing only the schema information about this RNTuple, i....
std::uint64_t fGeneration
The generation of the descriptor.
ROOT::DescriptorId_t FindPrevClusterId(ROOT::DescriptorId_t clusterId) const
std::unique_ptr< RHeaderExtension > fHeaderExtension
Generic information about the physical location of data.
void SetType(ELocatorType type)
void SetNBytesOnStorage(std::uint64_t nBytesOnStorage)
static std::unique_ptr< RNTupleModel > Create()
static std::unique_ptr< RNTupleModel > CreateBare()
Creates a "bare model", i.e. an RNTupleModel with no default entry.
static constexpr std::uint16_t kVersionPatch
static constexpr std::uint16_t kVersionMajor
static constexpr std::uint16_t kVersionEpoch
static constexpr std::uint16_t kVersionMinor
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
static std::unique_ptr< RVectorField > CreateUntyped(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
ROOT::DescriptorId_t CallFindClusterIdOn(const ROOT::RNTupleDescriptor &desc, ROOT::NTupleSize_t entryIdx)
RResult< void > EnsureValidNameForRNTuple(std::string_view name, std::string_view where)
Check whether a given string is a valid name according to the RNTuple specification.
ROOT::RResult< std::unique_ptr< ROOT::RFieldBase > > CallFieldBaseCreate(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
bool IsCustomEnumFieldDesc(const RNTupleDescriptor &desc, const RFieldDescriptor &fieldDesc)
Tells if the field describes a user-defined enum type.
std::vector< ROOT::Internal::RNTupleClusterBoundaries > GetClusterBoundaries(const RNTupleDescriptor &desc)
Return the cluster boundaries for each cluster in this RNTuple.
std::string GetRenormalizedTypeName(const std::string &metaNormalizedName)
Given a type name normalized by ROOT meta, renormalize it for RNTuple. E.g., insert std::prefix.
bool IsStdAtomicFieldDesc(const RFieldDescriptor &fieldDesc)
Tells if the field describes a std::atomic<T> type.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
constexpr NTupleSize_t kInvalidNTupleIndex
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
constexpr DescriptorId_t kInvalidDescriptorId
Additional information about a page in an in-memory RPageRange.
Information about a single page in the context of a cluster's page range.
void SetLocator(const RNTupleLocator &locator)
std::uint32_t GetNElements() const
void SetNElements(std::uint32_t n)
void SetEmulateUnknownTypes(bool v)
void SetReturnInvalidOnError(bool v)
bool GetReturnInvalidOnError() const
Modifiers passed to CreateModel()
bool GetCreateBare() const
bool GetEmulateUnknownTypes() const
bool GetReconstructProjections() const
bool GetForwardCompatible() const
static uint64_t sum(uint64_t i)