Skip to content

Commit 0fdfc3e

Browse files
committed
Add Real32Quant
1 parent a91c84c commit 0fdfc3e

File tree

4 files changed

+175
-3
lines changed

4 files changed

+175
-3
lines changed

types/fundamental/README.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
* [`misc`](misc): `Bit`, `Byte`, `Char`
55
* [`real`](real): `Real{16,32,64}`, `SplitReal{32,64}`
66
* [`real32trunc`](real32trunc): `Real32Trunc`
7+
* [`real32quant`](real32quant): `Real32Quant`
78

89
__Covered under a different category:__
910
* `[Split]Index{32,64}`: with [`std::string`](../string) and [`std::vector`](../vector)
1011
* `Switch`: with [`std::variant`](../variant)
11-
12-
__Missing:__
13-
* `Real32Quant`
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Real Column Types with variable width and value range
2+
3+
## Fields
4+
5+
* `FloatReal32Quant1`
6+
* `FloatReal32Quant8`
7+
* `FloatReal32Quant32` with value range `[-pi, pi]` (where `pi` is truncated to `float`)
8+
* `DoubleReal32Quant8`
9+
* `DoubleReal32Quant20`
10+
* `DoubleReal32Quant32` with value range `[-100, 25]`
11+
12+
with the corresponding field types, column type `Real32Quant`, with corresponding bit width
13+
and a value range of `[-1, 1]` unless noted otherwise.
14+
15+
## Entries
16+
17+
1. Ascending values
18+
2. All 1s in the mantissa
19+
3. Middle values of the fields' value range
20+
4. Min values of the fields' value range
21+
5. Max values of the fields' value range

types/fundamental/real32quant/read.C

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <ROOT/REntry.hxx>
2+
#include <ROOT/RNTupleReader.hxx>
3+
4+
using ROOT::Experimental::REntry;
5+
using ROOT::Experimental::RNTupleReader;
6+
7+
#include <fstream>
8+
#include <ios>
9+
#include <ostream>
10+
#include <string>
11+
#include <string_view>
12+
13+
template <typename T>
14+
static void PrintRealValue(const REntry &entry, std::string_view name,
15+
std::ostream &os, bool last = false) {
16+
T value = *entry.GetPtr<T>(name);
17+
os << " \"" << name << "\": \"" << value << "\"";
18+
if (!last) {
19+
os << ",";
20+
}
21+
os << "\n";
22+
}
23+
24+
void read(std::string_view input = "types.fundamental.real32quant.root",
25+
std::string_view output = "types.fundamental.real32quant.json") {
26+
std::ofstream os(std::string{output});
27+
// Print floating-point numbers as hexadecimal literals.
28+
os << std::hexfloat;
29+
os << "[\n";
30+
31+
auto reader = RNTupleReader::Open("ntpl", input);
32+
auto &entry = reader->GetModel().GetDefaultEntry();
33+
bool first = true;
34+
for (auto index : *reader) {
35+
reader->LoadEntry(index);
36+
37+
if (first) {
38+
first = false;
39+
} else {
40+
os << ",\n";
41+
}
42+
os << " {\n";
43+
44+
PrintRealValue<float>(entry, "FloatReal32Quant1", os);
45+
PrintRealValue<float>(entry, "FloatReal32Quant8", os);
46+
PrintRealValue<float>(entry, "FloatReal32Quant32", os);
47+
PrintRealValue<double>(entry, "DoubleReal32Quant1", os);
48+
PrintRealValue<double>(entry, "DoubleReal32Quant20", os);
49+
PrintRealValue<double>(entry, "DoubleReal32Quant32", os, /*last=*/true);
50+
51+
os << " }";
52+
// Newline is intentionally missing, may need to print a comma before the
53+
// next entry.
54+
}
55+
os << "\n";
56+
os << "]\n";
57+
}

types/fundamental/real32quant/write.C

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#include <ROOT/RField.hxx>
2+
#include <ROOT/RNTupleModel.hxx>
3+
#include <ROOT/RNTupleUtil.hxx>
4+
#include <ROOT/RNTupleWriteOptions.hxx>
5+
#include <ROOT/RNTupleWriter.hxx>
6+
7+
using ROOT::Experimental::EColumnType;
8+
using ROOT::Experimental::RField;
9+
using ROOT::Experimental::RNTupleModel;
10+
using ROOT::Experimental::RNTupleWriteOptions;
11+
using ROOT::Experimental::RNTupleWriter;
12+
13+
#include <limits>
14+
#include <memory>
15+
#include <string_view>
16+
17+
static constexpr double pi = 3.14159265358979323846;
18+
19+
template <typename T>
20+
static std::shared_ptr<T> MakeFieldReal32Quant(RNTupleModel &model,
21+
std::string_view name,
22+
int nBits, double min, double max) {
23+
assert(nBits >= 1 && nBits <= 32);
24+
assert(max > min);
25+
auto field = std::make_unique<RField<T>>(name);
26+
field->SetQuantized(min, max, nBits);
27+
model.AddField(std::move(field));
28+
return model.GetDefaultEntry().GetPtr<T>(name);
29+
}
30+
31+
void write(std::string_view filename = "types.fundamental.real32quant.root") {
32+
auto model = RNTupleModel::Create();
33+
34+
auto FloatReal32Quant1 =
35+
MakeFieldReal32Quant<float>(*model, "FloatReal32Quant1", 1, -1, 1);
36+
auto FloatReal32Quant8 =
37+
MakeFieldReal32Quant<float>(*model, "FloatReal32Quant8", 8, -1, 1);
38+
auto FloatReal32Quant32 =
39+
MakeFieldReal32Quant<float>(*model, "FloatReal32Quant32", 32, -(float)pi, (float)pi);
40+
auto DoubleReal32Quant1 =
41+
MakeFieldReal32Quant<double>(*model, "DoubleReal32Quant1", 1, -1, 1);
42+
auto DoubleReal32Quant20 =
43+
MakeFieldReal32Quant<double>(*model, "DoubleReal32Quant20", 20, -1, 1);
44+
auto DoubleReal32Quant32 =
45+
MakeFieldReal32Quant<double>(*model, "DoubleReal32Quant32", 32, -100, 25);
46+
47+
RNTupleWriteOptions options;
48+
options.SetCompression(0);
49+
auto writer = RNTupleWriter::Recreate(std::move(model), "ntpl", filename, options);
50+
51+
// First entry: ascending values
52+
*FloatReal32Quant1 = -1.0f;
53+
*FloatReal32Quant8 = -0.5f;
54+
*FloatReal32Quant32 = 0.25f;
55+
*DoubleReal32Quant1 = 0.5;
56+
*DoubleReal32Quant20 = 1.0;
57+
*DoubleReal32Quant32 = 2.0;
58+
writer->Fill();
59+
60+
// Second entry: a value containing all 1s in the mantissa
61+
static constexpr float ValueAllOnes = 2.3509885e-38f;
62+
*FloatReal32Quant1 = ValueAllOnes;
63+
*FloatReal32Quant8 = ValueAllOnes;
64+
*FloatReal32Quant32 = ValueAllOnes;
65+
*DoubleReal32Quant1 = ValueAllOnes;
66+
*DoubleReal32Quant20 = ValueAllOnes;
67+
*DoubleReal32Quant32 = ValueAllOnes;
68+
writer->Fill();
69+
70+
// Third entry: middle values of the value range
71+
*FloatReal32Quant1 = 0;
72+
*FloatReal32Quant8 = 0;
73+
*FloatReal32Quant32 = 0;
74+
*DoubleReal32Quant1 = 0;
75+
*DoubleReal32Quant20 = 0;
76+
*DoubleReal32Quant32 = -37.5;
77+
writer->Fill();
78+
79+
// Fourth entry: min values
80+
*FloatReal32Quant1 = -1;
81+
*FloatReal32Quant8 = -1;
82+
*FloatReal32Quant32 = -pi;
83+
*DoubleReal32Quant1 = -1;
84+
*DoubleReal32Quant20 = -1;
85+
*DoubleReal32Quant32 = -100;
86+
writer->Fill();
87+
88+
// Fifth entry: max values
89+
*FloatReal32Quant1 = 1;
90+
*FloatReal32Quant8 = 1;
91+
*FloatReal32Quant32 = pi;
92+
*DoubleReal32Quant1 = 1;
93+
*DoubleReal32Quant20 = 1;
94+
*DoubleReal32Quant32 = 25;
95+
writer->Fill();
96+
}

0 commit comments

Comments
 (0)