Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions structure/attributes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Attributes

## Fields

* `Int{32}`
* `Attr`

one regular and one attribute field.

## Entries

1. Attribute set name
2. Attribute set description
3. List of attribute entries with value and regular field range

The values can be found in the reference file `structure.attributes.json`.
72 changes: 72 additions & 0 deletions structure/attributes/read.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include <ROOT/RNTupleReader.hxx>
#include <ROOT/RVersion.hxx>

#include <iostream>

void read(std::string_view input = "structure.attributes.root",
std::string_view output = "structure.attributes.json") {
#if ROOT_VERSION_CODE < ROOT_VERSION(6, 40, 0)
std::cout << "Skipped structure/attributes/read.C - ROOT version too old."
<< std::endl;
#else
// same logic as is read_structure.hxx, with additional special part for
// attributes
std::unique_ptr<ROOT::RNTupleReader> reader;
try {
reader = ROOT::RNTupleReader::Open("ntpl", input);
} catch (const ROOT::RException &e) {
std::ofstream os(std::string{output});
std::string msgWithoutStacktrace;
std::getline(std::istringstream(e.what()), msgWithoutStacktrace);
os << "{\n";
os << " \"error\": \"" << msgWithoutStacktrace << "\"\n";
os << "}\n";
return;
} catch (const runtime_error &e) {
cout << "Skipped structure/attributes/read.C - " << e.what() << endl;
return;
}

std::ofstream os(std::string{output});
os << "[\n";
auto Int32 =
reader->GetModel().GetDefaultEntry().GetPtr<std::int32_t>("Int32");
bool first = true;

auto attrSet = reader->OpenAttributeSet("Attributes");
auto attr = attrSet->GetModel().GetDefaultEntry().GetPtr<std::int32_t>("attr");

os << " {\n";
os << " \"Attribute set name\": \"" << attrSet->GetDescriptor().GetName() << "\"\n";
os << " }, \n";
os << " {\n";
os << " \"Description\": \"" << attrSet->GetDescriptor().GetDescription() << "\"\n";
os << " },\n";

// list of values for attr with its range
os << " {\n";
os << " \"Attr\": " << "[\n";
first = true;
for (auto attrIdx : attrSet->GetAttributes()) {
auto range = attrSet->LoadEntry(attrIdx);
os << " {\n";
os << " \"Value\": " << *attr << ",\n";
os << " \"Range\": [" << *range.GetFirst() << ", " << *range.GetLast() << "]\n";
if (first) {
os << " },\n";
first = false;
} else {
os << " }\n";
}
std::cout << " attr = " << *attr << " (valid for range [" << *range.GetFirst() << ", " << *range.GetLast() << "])\n";
}
os << " ]\n";
os << " }";

if (!first) {
os << "\n";
}

os << "]\n";
#endif
}
43 changes: 43 additions & 0 deletions structure/attributes/write.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <ROOT/RNTupleModel.hxx>
#include <ROOT/RNTupleWriteOptions.hxx>
#include <ROOT/RNTupleWriter.hxx>
#include <ROOT/RVersion.hxx>

#include <TFile.h>
#include <cstdint>
#include <string_view>

void write(std::string_view filename = "structure.attributes.root") {
#if ROOT_VERSION_CODE < ROOT_VERSION(6, 40, 0)
std::cout << "Skipped structure/attributes/write.C - ROOT version too old."
<< std::endl;
#else
auto model = ROOT::RNTupleModel::Create();
auto Int32 = model->MakeField<std::int32_t>("Int32");

auto file = std::unique_ptr<TFile>(TFile::Open(std::string(filename).c_str(), "RECREATE"));
auto writer = ROOT::RNTupleWriter::Append(std::move(model), "ntpl", *file);

// definition of attribute set with attribute fields
auto attrModel = ROOT::RNTupleModel::Create();
attrModel->SetDescription("Attribute set for testing");
auto attr = attrModel->MakeField<std::int32_t>("attr");
auto attrSet = writer->CreateAttributeSet(std::move(attrModel), "Attributes");

// first entry
auto attrRange = attrSet->BeginRange();
*Int32 = 1;
writer->Fill();
*attr = 1;
attrSet->CommitRange(std::move(attrRange));

// second and third entry
attrRange = attrSet->BeginRange();
*attr = 2;
*Int32 = 2;
writer->Fill();
*Int32 = 3;
writer->Fill();
attrSet->CommitRange(std::move(attrRange));
#endif
}