Skip to content

Commit 797693e

Browse files
authored
feat: RNTuples with custom-length floats and suppressed columns (#167)
* Added code and root files for RNTuples with custom floats and suppressed columns * Minor include fixes
1 parent ef38efa commit 797693e

File tree

4 files changed

+179
-0
lines changed

4 files changed

+179
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/* https://root.cern/doc/master/ntpl001__staff_8C.html */
2+
R__LOAD_LIBRARY(ROOTNTuple)
3+
#include <ROOT/RField.hxx>
4+
#include <ROOT/RNTuple.hxx>
5+
#include <ROOT/RNTupleModel.hxx>
6+
#include <ROOT/RNTupleWriter.hxx>
7+
#include <ROOT/RNTupleUtil.hxx>
8+
#include <ROOT/RRawFile.hxx>
9+
10+
#include <cassert>
11+
#include <variant>
12+
13+
using RNTupleModel = ROOT::Experimental::RNTupleModel;
14+
using RNTupleWriter = ROOT::Experimental::RNTupleWriter;
15+
template <typename T>
16+
using RField = ROOT::Experimental::RField<T>;
17+
using EColumnType = ROOT::Experimental::EColumnType;
18+
19+
void rntuple_float_types() {
20+
std::string rootFileName{"test_float_types_rntuple_v1-0-0-0.root"};
21+
auto model = RNTupleModel::Create();
22+
23+
auto trunc10 = std::make_unique<RField<float>>("trunc10");
24+
trunc10->SetColumnRepresentatives({{EColumnType::kReal32Trunc}});
25+
trunc10->SetTruncated(10);
26+
model->AddField(std::move(trunc10));
27+
28+
auto trunc16 = std::make_unique<RField<float>>("trunc16");
29+
trunc16->SetColumnRepresentatives({{EColumnType::kReal32Trunc}});
30+
trunc16->SetTruncated(16);
31+
model->AddField(std::move(trunc16));
32+
33+
auto trunc24 = std::make_unique<RField<float>>("trunc24");
34+
trunc24->SetColumnRepresentatives({{EColumnType::kReal32Trunc}});
35+
trunc24->SetTruncated(24);
36+
model->AddField(std::move(trunc24));
37+
38+
auto trunc31 = std::make_unique<RField<float>>("trunc31");
39+
trunc31->SetColumnRepresentatives({{EColumnType::kReal32Trunc}});
40+
trunc31->SetTruncated(31);
41+
model->AddField(std::move(trunc31));
42+
43+
auto quant1 = std::make_unique<RField<float>>("quant1");
44+
quant1->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
45+
quant1->SetQuantized(-2.f, 3.f, 1);
46+
model->AddField(std::move(quant1));
47+
48+
auto quant8 = std::make_unique<RField<float>>("quant8");
49+
quant8->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
50+
quant8->SetQuantized(-2.f, 3.f, 8);
51+
model->AddField(std::move(quant8));
52+
53+
auto quant16 = std::make_unique<RField<float>>("quant16");
54+
quant16->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
55+
quant16->SetQuantized(-2.f, 3.f, 16);
56+
model->AddField(std::move(quant16));
57+
58+
auto quant20 = std::make_unique<RField<float>>("quant20");
59+
quant20->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
60+
quant20->SetQuantized(-2.f, 3.f, 20);
61+
model->AddField(std::move(quant20));
62+
63+
auto quant24 = std::make_unique<RField<float>>("quant24");
64+
quant24->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
65+
quant24->SetQuantized(-2.f, 3.f, 24);
66+
model->AddField(std::move(quant24));
67+
68+
auto quant25 = std::make_unique<RField<float>>("quant25");
69+
quant25->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
70+
quant25->SetQuantized(-2.f, 3.f, 25);
71+
model->AddField(std::move(quant25));
72+
73+
auto quant32 = std::make_unique<RField<float>>("quant32");
74+
quant32->SetColumnRepresentatives({{EColumnType::kReal32Quant}});
75+
quant32->SetQuantized(-2.f, 3.f, 32);
76+
model->AddField(std::move(quant32));
77+
78+
auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", rootFileName);
79+
auto e = ntuple->CreateEntry();
80+
81+
*e->GetPtr<float>("trunc10") = 1.23456789f; // 00111111100111100000011001010010
82+
*e->GetPtr<float>("trunc16") = 1.23456789f;
83+
*e->GetPtr<float>("trunc24") = 1.23456789f;
84+
*e->GetPtr<float>("trunc31") = 1.23456789f;
85+
*e->GetPtr<float>("quant1") = 1.23456789f;
86+
*e->GetPtr<float>("quant8") = 1.23456789f;
87+
*e->GetPtr<float>("quant16") = 1.23456789f;
88+
*e->GetPtr<float>("quant20") = 1.23456789f;
89+
*e->GetPtr<float>("quant24") = 1.23456789f;
90+
*e->GetPtr<float>("quant25") = 1.23456789f;
91+
*e->GetPtr<float>("quant32") = 1.23456789f;
92+
93+
ntuple->Fill(*e);
94+
95+
*e->GetPtr<float>("trunc10") = 1.4660155e13f; // 01010101010101010101010101010101
96+
*e->GetPtr<float>("trunc16") = 1.4660155e13f;
97+
*e->GetPtr<float>("trunc24") = 1.4660155e13f;
98+
*e->GetPtr<float>("trunc31") = 1.4660155e13f;
99+
*e->GetPtr<float>("quant1") = 1.6666666f; // 00111111110101010101010101010101
100+
*e->GetPtr<float>("quant8") = 1.6666666f;
101+
*e->GetPtr<float>("quant16") = 1.6666666f;
102+
*e->GetPtr<float>("quant20") = 1.6666666f;
103+
*e->GetPtr<float>("quant24") = 1.6666666f;
104+
*e->GetPtr<float>("quant25") = 1.6666666f;
105+
*e->GetPtr<float>("quant32") = 1.6666666f;
106+
107+
ntuple->Fill(*e);
108+
109+
*e->GetPtr<float>("trunc10") = -6.2875986e-22f; // 10011100001111100000011111110000
110+
*e->GetPtr<float>("trunc16") = -6.2875986e-22f;
111+
*e->GetPtr<float>("trunc24") = -6.2875986e-22f;
112+
*e->GetPtr<float>("trunc31") = -6.2875986e-22f;
113+
*e->GetPtr<float>("quant1") = -6.2875986e-22f;
114+
*e->GetPtr<float>("quant8") = -6.2875986e-22f;
115+
*e->GetPtr<float>("quant16") = -6.2875986e-22f;
116+
*e->GetPtr<float>("quant20") = -6.2875986e-22f;
117+
*e->GetPtr<float>("quant24") = -6.2875986e-22f;
118+
*e->GetPtr<float>("quant25") = -6.2875986e-22f;
119+
*e->GetPtr<float>("quant32") = -6.2875986e-22f;
120+
121+
ntuple->Fill(*e);
122+
123+
*e->GetPtr<float>("trunc10") = -1.9060668f; // 10111111111100111111100111111111
124+
*e->GetPtr<float>("trunc16") = -1.9060668f;
125+
*e->GetPtr<float>("trunc24") = -1.9060668f;
126+
*e->GetPtr<float>("trunc31") = -1.9060668f;
127+
*e->GetPtr<float>("quant1") = -1.9060668f;
128+
*e->GetPtr<float>("quant8") = -1.9060668f;
129+
*e->GetPtr<float>("quant16") = -1.9060668f;
130+
*e->GetPtr<float>("quant20") = -1.9060668f;
131+
*e->GetPtr<float>("quant24") = -1.9060668f;
132+
*e->GetPtr<float>("quant25") = -1.9060668f;
133+
*e->GetPtr<float>("quant32") = -1.9060668f;
134+
135+
ntuple->Fill(*e);
136+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* https://root.cern/doc/master/ntpl001__staff_8C.html */
2+
R__LOAD_LIBRARY(ROOTNTuple)
3+
#include <ROOT/RNTuple.hxx>
4+
#include <ROOT/RFieldBase.hxx>
5+
#include <ROOT/RNTupleModel.hxx>
6+
#include <ROOT/RNTupleWriter.hxx>
7+
#include <ROOT/RNTupleUtil.hxx>
8+
#include <ROOT/RRawFile.hxx>
9+
10+
#include <cassert>
11+
#include <variant>
12+
13+
using RNTupleModel = ROOT::Experimental::RNTupleModel;
14+
using RNTupleWriter = ROOT::Experimental::RNTupleWriter;
15+
using RFieldBase = ROOT::Experimental::RFieldBase;
16+
using EColumnType = ROOT::Experimental::EColumnType;
17+
18+
void rntuple_multiple_representations() {
19+
std::string rootFileName{"test_multiple_representations_rntuple_v1-0-0-0.root"};
20+
auto model = RNTupleModel::Create();
21+
22+
auto fldReal = RFieldBase::Create("real", "float").Unwrap();
23+
fldReal->SetColumnRepresentatives({{EColumnType::kReal32}, {EColumnType::kReal16}});
24+
model->AddField(std::move(fldReal));
25+
auto ptrReal = model->GetDefaultEntry().GetPtr<float>("real");
26+
27+
auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", rootFileName);
28+
29+
*ptrReal = 1.0;
30+
ntuple->Fill();
31+
ntuple->CommitCluster();
32+
33+
ROOT::Experimental::Internal::RFieldRepresentationModifier::SetPrimaryColumnRepresentation(
34+
const_cast<RFieldBase &>(ntuple->GetModel().GetConstField("real")), 1);
35+
*ptrReal = 2.0;
36+
ntuple->Fill();
37+
ntuple->CommitCluster();
38+
39+
ROOT::Experimental::Internal::RFieldRepresentationModifier::SetPrimaryColumnRepresentation(
40+
const_cast<RFieldBase &>(ntuple->GetModel().GetConstField("real")), 0);
41+
*ptrReal = 3.0;
42+
ntuple->Fill();
43+
}
1.85 KB
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)