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
14 changes: 14 additions & 0 deletions structure/attributes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Attributes

## Fields

* `Int{32}`

one regular and one attribute field.

## Entries

1. Simple values
2. Zero / empty values

The values can be found in the reference file `structure.attributes.json`.
127 changes: 127 additions & 0 deletions structure/attributes/read.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#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;
// for (auto index : *reader) {
// reader->LoadEntry(index);

// if (first) {
// first = false;
// } else {
// os << ",\n";
// }
// os << " {\n";
// os << " \"Int32\": " << *Int32 << "\n";
// os << " }";
// // Newline is intentionally missing, may need to print a comma before the
// // next entry.
// }

// // read available attribute sets
// for (const auto &attrSetDesc : reader->GetDescriptor().GetAttrSetIterable()) {
// os << ",\n";
// os << " {\n";
// os << " \"Attribute set\": \"" << attrSetDesc.GetName() << "\"\n";
// os << " }";
// }

// auto attrSet = reader->OpenAttributeSet("Attributes");
// os << ",\n";
// os << " {\n";
// os << " \"Description\": \"" << attrSet->GetDescriptor().GetDescription() << "\"\n";
// os << " }";

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

// for (auto idx : reader->GetEntryRange()) {
// std::cout << "Entry " << idx << " has the following attributes associated to it:\n";
// for (auto attrIdx : attrSet->GetAttributes(idx)) {
// auto range = attrSet->LoadEntry(attrIdx);
// std::cout << " runNumber = " << *attr << " (valid for range [" << *range.GetFirst() << ", "
// << *range.GetLast() << "])\n";
// }
// }

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

std::cout << "\nOpened attribute set '" << attrSet->GetDescriptor().GetName() << "' with description: \""
<< attrSet->GetDescriptor().GetDescription() << "\"\n";

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

first = true;
for (auto mainIdx : reader->GetEntryRange()) {
reader->LoadEntry(mainIdx);
std::cout << "Entry " << mainIdx << " with value " << *Int32 << " has the following attributes associated to it:\n";

if (first) {
first = false;
} else {
os << ",\n";
}
os << " {\n";
os << " \"Int32\": " << *Int32 << "\n";
os << " }";
for (auto attrIdx : attrSet->GetAttributes(mainIdx)) {
auto range = attrSet->LoadEntry(attrIdx);
if (*attr1 > 0) {
os << ",\n {\n";
os << " \"Attr1\": " << *attr1 << "\n";
os << " }";
}
if (*attr2 > 0) {
os << ",\n {\n";
os << " \"Attr2\": " << *attr2 << "\n";
os << " }";
}
std::cout << " attr1 = " << *attr1 << " (valid for range [" << *range.GetFirst() << ", "
<< *range.GetLast() << "])\n";
std::cout << " attr2 = " << *attr2 << " (valid for range [" << *range.GetFirst() << ", "
<< *range.GetLast() << "])\n";
}
}

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

os << "]\n";
#endif
}
56 changes: 56 additions & 0 deletions structure/attributes/write.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#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("Informationless description for attribute set");
auto attr1 = attrModel->MakeField<std::int32_t>("attr1");
auto attr2 = attrModel->MakeField<std::int32_t>("attr2");

// creation of attribute set
auto attrSet = writer->CreateAttributeSet(std::move(attrModel), "Attributes");
auto attrRange = attrSet->BeginRange();
*attr1 = 0;
*attr2 = 0;

int num_entries = 3;
for (int i=0; i<num_entries; i++) {
*Int32 = (i+1) * 5;
writer->Fill();

// attr1 attached to first entry, attr2 attached to second and third entry
if (i == 0) {
*attr1 = i+1;
attrSet->CommitRange(std::move(attrRange));
attrRange = attrSet->BeginRange();
*attr1 = 0;
} else {
*attr2 = i+1;
attrSet->CommitRange(std::move(attrRange));
attrRange = attrSet->BeginRange();
*attr2 = 0;
}
}

if (attrRange) {
attrSet->CommitRange(std::move(attrRange));
}
#endif
}