31static constexpr char const *kNTupleName =
"ntpl";
32static constexpr char const *kNTupleFileName =
"ntpl018_low_precision_floats.root";
33static constexpr int kNEvents = 50;
36 std::vector<float> fPt;
37 std::vector<double> fE;
49 auto fieldReal16 = std::make_unique<ROOT::RField<float>>(
"myReal16");
50 fieldReal16->SetHalfPrecision();
51 model->AddField(std::move(fieldReal16));
54 auto fieldReal32Trunc = std::make_unique<ROOT::RField<float>>(
"myReal32Trunc");
57 fieldReal32Trunc->SetTruncated(20);
58 model->AddField(std::move(fieldReal32Trunc));
61 auto fieldReal32Quant = std::make_unique<ROOT::RField<float>>(
"myReal32Quant");
64 fieldReal32Quant->SetQuantized(24, {-1., 1.});
65 model->AddField(std::move(fieldReal32Quant));
70 auto fieldEvents = std::make_unique<ROOT::RField<Event>>(
"myEvents");
82 for (
auto &field : *fieldEvents) {
84 std::cout <<
"Setting field " << field.GetQualifiedFieldName() <<
" to truncated.\n";
85 fldDouble->SetTruncated(16);
87 std::cout <<
"Setting field " << field.GetQualifiedFieldName() <<
" to truncated.\n";
88 fldFloat->SetTruncated(16);
91 model->AddField(std::move(fieldEvents));
95 const auto &entry = model->GetDefaultEntry();
96 auto myReal16 = entry.GetPtr<
float>(
"myReal16");
97 auto myReal32Trunc = entry.GetPtr<
float>(
"myReal32Trunc");
98 auto myReal32Quant = entry.GetPtr<
float>(
"myReal32Quant");
99 auto myEvents = entry.GetPtr<
Event>(
"myEvents");
105 for (
int i = 0; i < kNEvents; i++) {
107 *myReal32Trunc =
gRandom->Rndm();
108 *myReal32Quant =
gRandom->Rndm();
109 myEvents->fPt.push_back(i);
110 myEvents->fE.push_back(i);
121 const auto &entry = reader->GetModel().GetDefaultEntry();
122 auto myReal16 = entry.GetPtr<
float>(
"myReal16");
123 auto myReal32Trunc = entry.GetPtr<
float>(
"myReal32Trunc");
124 auto myReal32Quant = entry.GetPtr<
float>(
"myReal32Quant");
125 auto myEvents = entry.GetPtr<
Event>(
"myEvents");
127 for (
auto idx : reader->GetEntryRange()) {
128 reader->LoadEntry(idx);
130 float eventsAvgPt = 0.f;
131 for (
float pt : myEvents->fPt)
133 eventsAvgPt /= myEvents->fPt.size();
134 double eventsAvgE = 0.f;
135 for (
double e : myEvents->fE)
137 eventsAvgE /= myEvents->fE.size();
139 std::cout <<
"[" << idx <<
"] Real16: " << *myReal16 <<
", Real32Trunc: " << *myReal32Trunc
140 <<
", Real32Quant: " << *myReal32Quant <<
", Events avg pt: " << eventsAvgPt <<
", E: " << eventsAvgE
145void ntpl018_low_precision_floats()
Classes with dictionaries that can be inspected by TClass.
static std::unique_ptr< RNTupleModel > Create()
static std::unique_ptr< RNTupleReader > Open(std::string_view ntupleName, std::string_view storage, const ROOT::RNTupleReadOptions &options=ROOT::RNTupleReadOptions())
Open an RNTuple for reading.
static std::unique_ptr< RNTupleWriter > Recreate(std::unique_ptr< ROOT::RNTupleModel > model, std::string_view ntupleName, std::string_view storage, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Creates an RNTupleWriter backed by storage, overwriting it if one with the same URI exists.