70std::unique_ptr<ROOT::RFieldBase>
 
   74      auto streamerField = std::make_unique<ROOT::RStreamerField>(GetFieldName(), GetTypeName());
 
   83         auto invalidField = std::make_unique<ROOT::RInvalidField>(GetFieldName(), GetTypeName(), 
"",
 
   88         throw RException(
R__FAIL(
"unexpected on-disk field structure value for field \"" + GetFieldName() + 
"\""));
 
   93   if (GetTypeName().empty()) {
 
   94      switch (GetStructure()) {
 
   96         std::vector<std::unique_ptr<ROOT::RFieldBase>> 
memberFields;
 
   98         for (
auto id : fLinkIds) {
 
  110         if (fLinkIds.size() != 1) {
 
  111            throw RException(
R__FAIL(
"unsupported untyped collection for field \"" + GetFieldName() + 
"\""));
 
  120      default: 
throw RException(
R__FAIL(
"unsupported untyped field structure for field \"" + GetFieldName() + 
"\""));
 
  126      const auto &typeName = GetTypeAlias().empty() ? GetTypeName() : GetTypeAlias();
 
  131      field->SetOnDiskId(fFieldId);
 
  146         return std::make_unique<ROOT::RInvalidField>(GetFieldName(), GetTypeName(), 
ex.GetError().GetReport(),
 
 
  159   if (fTypeName.empty())
 
  163      if (fTypeName.compare(0, 10, 
"std::pair<") == 0)
 
  165      if (fTypeName.compare(0, 11, 
"std::tuple<") == 0)
 
 
  176   if (fTypeName.rfind(
"std::", 0) == 0)
 
  183   static const std::string 
gIntTypeNames[] = {
"bool",         
"char",          
"std::int8_t",  
"std::uint8_t",
 
  184                                               "std::int16_t", 
"std::uint16_t", 
"std::int32_t", 
"std::uint32_t",
 
  185                                               "std::int64_t", 
"std::uint64_t"};
 
 
  194   return (fTypeName.rfind(
"std::atomic<", 0) == 0);
 
 
  201   return fLogicalColumnId == 
other.fLogicalColumnId && fPhysicalColumnId == 
other.fPhysicalColumnId &&
 
  202          fBitsOnStorage == 
other.fBitsOnStorage && fType == 
other.fType && fFieldId == 
other.fFieldId &&
 
  203          fIndex == 
other.fIndex && fRepresentationIndex == 
other.fRepresentationIndex &&
 
  204          fValueRange == 
other.fValueRange;
 
 
  227   const auto N = fCumulativeNElements.size();
 
  231   std::size_t left = 0;
 
  232   std::size_t right = 
N - 1;
 
  234   while (left <= right) {
 
 
  264      std::accumulate(fPageInfos.begin(), fPageInfos.end(), 0U,
 
  265                      [](std::size_t 
n, 
const auto &
pageInfo) { return n + pageInfo.GetNElements(); });
 
  288                    std::make_move_iterator(fPageInfos.end()));
 
 
  295   return fClusterId == 
other.fClusterId && fFirstEntryIndex == 
other.fFirstEntryIndex &&
 
  296          fNEntries == 
other.fNEntries && fColumnRanges == 
other.fColumnRanges && fPageRanges == 
other.fPageRanges;
 
 
  302   for (
const auto &
pr : fPageRanges) {
 
  303      for (
const auto &pi : 
pr.second.GetPageInfos()) {
 
  304         nbytes += pi.GetLocator().GetNBytesOnStorage();
 
 
  317   for (
const auto &
d : fPageRanges)
 
 
  326   return fContentId == 
other.fContentId && fTypeName == 
other.fTypeName && fTypeVersion == 
other.fTypeVersion;
 
 
  344   return fName == 
other.fName &&
 
  345          fDescription == 
other.fDescription &&
 
  346          fNEntries == 
other.fNEntries &&
 
  347          fGeneration == 
other.fGeneration &&
 
  348          fFieldZeroId == 
other.fFieldZeroId &&
 
  349          fFieldDescriptors == 
other.fFieldDescriptors &&
 
  350          fColumnDescriptors == 
other.fColumnDescriptors &&
 
  351          fClusterGroupDescriptors == 
other.fClusterGroupDescriptors &&
 
  352          fClusterDescriptors == 
other.fClusterDescriptors;
 
 
  359   for (
const auto &cd : fClusterDescriptors) {
 
 
  370std::vector<ROOT::Internal::RNTupleClusterBoundaries>
 
  373   std::vector<Internal::RNTupleClusterBoundaries> boundaries;
 
 
  391   if (
posDot != std::string::npos) {
 
 
  420   std::string typeName = 
fieldDesc.GetTypeName();
 
  424   if (fVersionMajor == 0 && fVersionMinor == 0 && fVersionPatch < 1) {
 
 
  433   return FindFieldId(
fieldName, GetFieldZeroId());
 
 
  441   if (
itr == fFieldDescriptors.cend())
 
  446   if (
itr->second.GetLogicalColumnIds().size() <= idx)
 
  448   return itr->second.GetLogicalColumnIds()[idx];
 
 
  458   return GetColumnDescriptor(
logicalId).GetPhysicalId();
 
 
  464   if (GetNClusterGroups() == 0)
 
  470   std::size_t 
cgRight = GetNClusterGroups() - 1;
 
  473      const auto &
clusterIds = GetClusterGroupDescriptor(fSortedClusterGroupIds[
cgMidpoint]).GetClusterIds();
 
 
  526   if (GetNClusterGroups() == 0)
 
  532   std::size_t 
cgRight = GetNClusterGroups() - 1;
 
  535      const auto &
cgDesc = GetClusterGroupDescriptor(fSortedClusterGroupIds[
cgMidpoint]);
 
 
  596   return FindClusterId(
clusterDesc.GetFirstEntryIndex() - 1);
 
 
  599std::vector<ROOT::DescriptorId_t>
 
  604   std::vector<ROOT::DescriptorId_t> 
fields;
 
  605   for (
const auto fieldId : fFieldIdsOrder) {
 
 
  614   : fNTuple(
ntuple), fColumns(
field.GetLogicalColumnIds())
 
 
  639   std::vector<std::uint64_t> 
result;
 
  640   unsigned int base = 0;
 
  641   std::uint64_t flags = 0;
 
  643      if ((
f > 0) && ((
f % 64) == 0))
 
  645      while (
f > base + 64) {
 
  646         result.emplace_back(flags);
 
  653   result.emplace_back(flags);
 
 
  662      return R__FAIL(
"invalid attempt to add details of unknown cluster group");
 
  663   if (iter->second.HasClusterDetails())
 
  664      return R__FAIL(
"invalid attempt to re-populate cluster group details");
 
  666      return R__FAIL(
"mismatch of number of clusters");
 
  673         return R__FAIL(
"invalid attempt to re-populate existing cluster");
 
  677      return fClusterDescriptors[a].GetFirstEntryIndex() < fClusterDescriptors[b].GetFirstEntryIndex();
 
  681   iter->second = 
cgBuilder.MoveDescriptor().Unwrap();
 
 
  689      return R__FAIL(
"invalid attempt to drop cluster details of unknown cluster group");
 
  690   if (!iter->second.HasClusterDetails())
 
  691      return R__FAIL(
"invalid attempt to drop details of cluster group summary");
 
  693   for (
auto clusterId : iter->second.GetClusterIds())
 
  695   iter->second = iter->second.CloneSummary();
 
 
  723         "cannot create Model: descriptor contains unknown column types. Use 'SetForwardCompatible(true)' on the " 
  724         "RCreateModelOptions to create a partial model containing only the fields made up by known columns."));
 
  726   auto fieldZero = std::make_unique<ROOT::RFieldZero>();
 
  747         const auto cat = 
invalid.GetCategory();
 
  757         model->AddProjectedField(std::move(
field), [
this](
const std::string &
targetName) -> std::string {
 
  761         model->AddField(std::move(
field));
 
 
  822   return fClusterGroupId == 
other.fClusterGroupId && fClusterIds == 
other.fClusterIds &&
 
 
  854      return R__FAIL(
"column ID mismatch");
 
  855   if (fCluster.fColumnRanges.count(
physicalId) > 0)
 
  856      return R__FAIL(
"column ID conflict");
 
  858   for (
const auto &pi : 
pageRange.fPageInfos) {
 
 
  869   if (fCluster.fColumnRanges.count(
physicalId) > 0)
 
  870      return R__FAIL(
"column ID conflict");
 
 
  908         return R__FAIL(std::string(
"cannot find non-suppressed column for column ID ") +
 
  909                        std::to_string(
columnRange.GetPhysicalColumnId()) +
 
  910                        ", cluster ID: " + std::to_string(fCluster.GetId()));
 
 
  941            for (const auto &c : desc.GetColumnIterable(fieldId)) {
 
  942               const ROOT::DescriptorId_t physicalId = c.GetPhysicalId();
 
  943               auto &columnRange = fCluster.fColumnRanges[physicalId];
 
  948               if (columnRange.GetPhysicalColumnId() == ROOT::kInvalidDescriptorId) {
 
  949                  columnRange.SetPhysicalColumnId(physicalId);
 
  950                  columnRange.SetFirstElementIndex(0);
 
  951                  columnRange.SetNElements(0);
 
  952                  columnRange.SetIsSuppressed(c.IsSuppressedDeferredColumn());
 
  960               if (c.IsDeferredColumn()) {
 
  961                  columnRange.SetFirstElementIndex(fCluster.GetFirstEntryIndex() * nRepetitions);
 
  962                  columnRange.SetNElements(fCluster.GetNEntries() * nRepetitions);
 
  963                  if (!columnRange.IsSuppressed()) {
 
  964                     auto &pageRange = fCluster.fPageRanges[physicalId];
 
  965                     pageRange.fPhysicalColumnId = physicalId;
 
  966                     const auto element = ROOT::Internal::RColumnElementBase::Generate<void>(c.GetType());
 
  967                     pageRange.ExtendToFitColumnRange(columnRange, *element, ROOT::Internal::RPage::kPageZeroSize);
 
  969               } else if (!columnRange.IsSuppressed()) {
 
  970                  fCluster.fPageRanges[physicalId].fPhysicalColumnId = physicalId;
 
 
  982      return R__FAIL(
"unset cluster ID");
 
  983   if (fCluster.fNEntries == 0)
 
  984      return R__FAIL(
"empty cluster");
 
  985   for (
auto &
pr : fCluster.fPageRanges) {
 
  986      if (fCluster.fColumnRanges.count(
pr.first) == 0) {
 
  987         return R__FAIL(
"missing column range");
 
  989      pr.second.fCumulativeNElements.clear();
 
  990      pr.second.fCumulativeNElements.reserve(
pr.second.fPageInfos.size());
 
  992      for (
const auto &pi : 
pr.second.fPageInfos) {
 
  993         sum += pi.GetNElements();
 
  994         pr.second.fCumulativeNElements.emplace_back(
sum);
 
  998   std::swap(
result, fCluster);
 
 
 1020      return R__FAIL(
"unset cluster group ID");
 
 1022   std::swap(
result, fClusterGroup);
 
 
 1033   std::swap(
result, fExtraTypeInfo);
 
 
 1041   if (fDescriptor.fFieldDescriptors.count(
fieldId) == 0)
 
 1042      return R__FAIL(
"field with id '" + std::to_string(
fieldId) + 
"' doesn't exist");
 
 
 1049      return R__FAIL(
"unset or unsupported RNTuple epoch version");
 
 1061         return R__FAIL(
"field with id '" + std::to_string(
fieldId) + 
"' has an invalid parent id");
 
 1079         return R__FAIL(
"field with id '" + std::to_string(
fieldId) + 
"' has incomplete column representations");
 
 
 1087   EnsureValidDescriptor().ThrowOnError();
 
 1089   for (
const auto &[
id, 
_] : fDescriptor.fClusterGroupDescriptors)
 
 1090      fDescriptor.fSortedClusterGroupIds.emplace_back(
id);
 
 1091   std::sort(fDescriptor.fSortedClusterGroupIds.begin(), fDescriptor.fSortedClusterGroupIds.end(),
 
 1093                return fDescriptor.fClusterGroupDescriptors[a].GetMinEntry() <
 
 1094                       fDescriptor.fClusterGroupDescriptors[b].GetMinEntry();
 
 1097   std::swap(
result, fDescriptor);
 
 
 1124   fDescriptor.fName = std::string(
name);
 
 1125   fDescriptor.fDescription = std::string(
description);
 
 
 1132   fDescriptor.fFeatureFlags.insert(
flag);
 
 
 1138   if (fDesc.fName.empty())
 
 1139      return R__FAIL(
"attribute set name cannot be empty");
 
 1140   if (fDesc.fAnchorLength == 0)
 
 1141      return R__FAIL(
"invalid anchor length");
 
 1143      return R__FAIL(
"invalid locator type");
 
 1145   return std::move(fDesc);
 
 
 1151      return R__FAIL(
"invalid logical column id");
 
 1153      return R__FAIL(
"invalid physical column id");
 
 1155      return R__FAIL(
"invalid field id, dangling column");
 
 1164      if (fColumn.GetBitsOnStorage() < 
minBits || fColumn.GetBitsOnStorage() > 
maxBits)
 
 1165         return R__FAIL(
"invalid column bit width");
 
 1168   return fColumn.Clone();
 
 
 1176      .TypeVersion(
field.GetTypeVersion())
 
 1177      .FieldName(
field.GetFieldName())
 
 1178      .FieldDescription(
field.GetDescription())
 
 1179      .TypeName(
field.GetTypeName())
 
 1180      .TypeAlias(
field.GetTypeAlias())
 
 1181      .Structure(
field.GetStructure())
 
 1182      .NRepetitions(
field.GetNRepetitions());
 
 
 1191      return R__FAIL(
"invalid field id");
 
 1194      return R__FAIL(
"invalid field structure");
 
 1202      if (fField.GetFieldName().empty()) {
 
 1203         return R__FAIL(
"name cannot be empty string \"\"");
 
 1206   return fField.Clone();
 
 
 1212   if (fDescriptor.fHeaderExtension)
 
 1213      fDescriptor.fHeaderExtension->MarkExtendedField(
fieldDesc);
 
 1215      fDescriptor.fFieldZeroId = 
fieldDesc.GetId();
 
 
 1226      return R__FAIL(
"child field with id '" + std::to_string(
linkId) + 
"' doesn't exist in NTuple");
 
 1228   if (
linkId == fDescriptor.GetFieldZeroId()) {
 
 1229      return R__FAIL(
"cannot make FieldZero a child field");
 
 1232   auto parentId = fDescriptor.fFieldDescriptors.at(
linkId).GetParentId();
 
 1234      return R__FAIL(
"field '" + std::to_string(
linkId) + 
"' already has a parent ('" + std::to_string(
parentId) + 
")");
 
 1237      return R__FAIL(
"cannot make field '" + std::to_string(
fieldId) + 
"' a child of itself");
 
 1239   fDescriptor.fFieldDescriptors.at(
linkId).fParentId = 
fieldId;
 
 1240   fDescriptor.fFieldDescriptors.at(
fieldId).fLinkIds.push_back(
linkId);
 
 
 1251      return R__FAIL(
"projected field with id '" + std::to_string(
targetId) + 
"' doesn't exist in NTuple");
 
 1253   if (
targetId == fDescriptor.GetFieldZeroId()) {
 
 1254      return R__FAIL(
"cannot make FieldZero a projected field");
 
 1257      return R__FAIL(
"cannot make field '" + std::to_string(
targetId) + 
"' a projection of itself");
 
 1259   if (fDescriptor.fFieldDescriptors.at(
sourceId).IsProjectedField()) {
 
 1260      return R__FAIL(
"cannot make field '" + std::to_string(
targetId) + 
"' a projection of an already projected field");
 
 1265      return R__FAIL(
"field '" + std::to_string(
targetId) + 
"' has already a projection source ('" +
 
 1266                     std::to_string(
targetDesc.GetProjectionSourceId()) + 
")");
 
 
 1285      if (
columnDesc.GetType() != fDescriptor.GetColumnDescriptor(
columnDesc.GetPhysicalId()).GetType())
 
 1286         return R__FAIL(
"alias column type mismatch");
 
 1289      return R__FAIL(
"column index clash");
 
 1293         return R__FAIL(
"out of bounds column index");
 
 1297         return R__FAIL(
"out of bounds representation index");
 
 1303            return R__FAIL(
"incomplete column representations");
 
 1307            return R__FAIL(
"irregular column representations");
 
 1318      fDescriptor.fNPhysicalColumns++;
 
 1320   if (fDescriptor.fHeaderExtension)
 
 1321      fDescriptor.fHeaderExtension->MarkExtendedColumn(
columnDesc);
 
 
 1329   if (fDescriptor.fClusterGroupDescriptors.count(
id) > 0)
 
 1330      return R__FAIL(
"cluster group id clash");
 
 1333   fDescriptor.fClusterGroupDescriptors.emplace(
id, std::move(
clusterGroup));
 
 
 1344   if (!fDescriptor.fHeaderExtension)
 
 1345      fDescriptor.fHeaderExtension = std::make_unique<RNTupleDescriptor::RHeaderExtension>();
 
 
 1350   if (fDescriptor.GetNLogicalColumns() == 0)
 
 1352   R__ASSERT(fDescriptor.GetNPhysicalColumns() > 0);
 
 1354   for (
ROOT::DescriptorId_t id = fDescriptor.GetNLogicalColumns() - 1; 
id >= fDescriptor.GetNPhysicalColumns(); --
id) {
 
 1355      auto c = fDescriptor.fColumnDescriptors[
id].Clone();
 
 1358      fDescriptor.fColumnDescriptors.erase(
id);
 
 1359      for (
auto &
link : fDescriptor.fFieldDescriptors[
c.fFieldId].fLogicalColumnIds) {
 
 1360         if (
link == 
c.fLogicalColumnId) {
 
 1366      R__ASSERT(fDescriptor.fColumnDescriptors.count(
c.fLogicalColumnId) == 0);
 
 1367      fDescriptor.fColumnDescriptors.emplace(
c.fLogicalColumnId, std::move(
c));
 
 
 1374   if (fDescriptor.fClusterDescriptors.count(
clusterId) > 0)
 
 1375      return R__FAIL(
"cluster id clash");
 
 
 1384   if (std::find(fDescriptor.fExtraTypeInfoDescriptors.begin(), fDescriptor.fExtraTypeInfoDescriptors.end(),
 
 1386      return R__FAIL(
"extra type info duplicates");
 
 1388   fDescriptor.fExtraTypeInfoDescriptors.emplace_back(std::move(
extraTypeInfoDesc));
 
 
 1394   auto it = std::find(fDescriptor.fExtraTypeInfoDescriptors.begin(), fDescriptor.fExtraTypeInfoDescriptors.end(),
 
 1396   if (it != fDescriptor.fExtraTypeInfoDescriptors.end())
 
 1399      fDescriptor.fExtraTypeInfoDescriptors.emplace_back(std::move(
extraTypeInfoDesc));
 
 
 1405   auto &
attrSets = fDescriptor.fAttributeSets;
 
 1407          return desc.GetName() == name;
 
 1409      return R__FAIL(
"attribute sets with duplicate names");
 
 
 1418   const auto &desc = GetDescriptor();
 
 1445   for (
const auto &
extraTypeInfo : desc.GetExtraTypeInfoIterable()) {
 
 
 1538   return fAnchorLength == 
other.fAnchorLength && fSchemaVersionMajor == 
other.fSchemaVersionMajor &&
 
 1539          fSchemaVersionMinor == 
other.fSchemaVersionMinor && fAnchorLocator == 
other.fAnchorLocator &&
 
 
#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...
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
#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
 
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
 
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.
 
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)
 
static RClusterGroupDescriptorBuilder FromSummary(const RClusterGroupDescriptor &clusterGroupDesc)
 
RClusterGroupDescriptorBuilder & PageListLength(std::uint64_t pageListLength)
 
RClusterGroupDescriptorBuilder & MinEntry(std::uint64_t minEntry)
 
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.
 
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.
 
A helper class for piece-wise construction of an RFieldDescriptor.
 
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.
 
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)
 
ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t BuildStreamerInfos() const
Get the streamer info records for custom classes. Currently requires the corresponding dictionaries t...
 
RResult< void > AddClusterGroup(RClusterGroupDescriptor &&clusterGroup)
 
RResult< void > EnsureFieldExists(ROOT::DescriptorId_t fieldId) const
 
void SetFeature(unsigned int flag)
 
A helper class for serializing and deserialization of the RNTuple binary format.
 
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
 
static RResult< StreamerInfoMap_t > DeserializeStreamerInfos(const std::string &extraTypeInfoContent)
 
The window of element indexes of a particular column in a particular cluster.
 
Metadata for RNTuple clusters.
 
ROOT::NTupleSize_t fFirstEntryIndex
Clusters can be swapped by adjusting the entry offsets of the cluster and all ranges.
 
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.
 
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::uint64_t fPageListLength
Uncompressed size of the page list.
 
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
 
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.
 
@ kTraitInvalidField
This field is an instance of RInvalidField and can be safely static_cast to it.
 
@ kTraitTypeChecksum
The TClass checksum is set and valid.
 
Metadata stored for every field of an RNTuple.
 
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.
 
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.
 
bool IsCustomEnum(const RNTupleDescriptor &desc) const
Tells if the field describes a user-defined enum type.
 
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.
 
bool IsCustomClass() const
Tells if the field describes a user-defined class rather than a fundamental type, a collection,...
 
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.
 
std::uint32_t fTypeVersion
The version of the C++ type itself.
 
std::string fTypeName
The C++ type that was used when writing the field.
 
std::vector< ROOT::DescriptorId_t > fLogicalColumnIds
The ordered list of columns attached to this field: first by representation index then by column inde...
 
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.
 
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.
 
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 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.
 
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::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.
 
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
 
const_iterator begin() const
 
const_iterator end() const
 
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)
 
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
 
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)
 
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.
 
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.
 
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)