Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
ntpl005_introspection.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_ntuple
3/// \notebook
4/// Write and read an RNTuple from a user-defined class. Adapted from tv3.C
5/// Illustrates various RNTuple introspection methods.
6///
7/// \macro_image
8/// \macro_code
9///
10/// \date April 2020
11/// \author The ROOT Team
12
13// NOTE: The RNTuple classes are experimental at this point.
14// Functionality and interface are still subject to changes.
15
16#include <ROOT/RNTupleModel.hxx>
20
21#include <Compression.h>
22#include <TCanvas.h>
23#include <TH1.h>
24#include <TRandom.h>
25#include <TSystem.h>
26
27#include <cassert>
28
29// Import classes from experimental namespace for the time being
31using RNTupleModel = ROOT::Experimental::RNTupleModel;
32using RNTupleReader = ROOT::Experimental::RNTupleReader;
33using RNTupleWriter = ROOT::Experimental::RNTupleWriter;
34using RNTupleWriteOptions = ROOT::Experimental::RNTupleWriteOptions;
35
36constexpr char const* kNTupleFileName = "ntpl005_introspection.root";
37
38// Store entries of type Vector3 in the ntuple
39class Vector3 {
40private:
41 double fX = 0;
42 double fY = 0;
43 double fZ = 0;
44
45public:
46 double x() const { return fX; }
47 double y() const { return fY; }
48 double z() const { return fZ; }
49
50 void SetXYZ(double x, double y, double z) {
51 fX = x;
52 fY = y;
53 fZ = z;
54 }
55};
56
57
58void Generate()
59{
60 auto model = RNTupleModel::Create();
61 auto fldVector3 = model->MakeField<Vector3>("v3");
62
63 // Explicitly enforce a certain compression algorithm
64 RNTupleWriteOptions options;
66
67 auto ntuple = RNTupleWriter::Recreate(std::move(model), "Vector3", kNTupleFileName, options);
68 TRandom r;
69 for (unsigned int i = 0; i < 500000; ++i) {
70 fldVector3->SetXYZ(r.Gaus(0,1), r.Landau(0,1), r.Gaus(100,10));
71 ntuple->Fill();
72 }
73}
74
75
77 Generate();
78
79 auto ntuple = RNTupleReader::Open("Vector3", kNTupleFileName);
80
81 // Display the schema of the ntuple
82 ntuple->PrintInfo();
83
84 // Display information about the storage layout of the data
85 ntuple->PrintInfo(ENTupleInfo::kStorageDetails);
86
87 // Display the first entry
88 ntuple->Show(0);
89
90 // Collect I/O runtime counters when processing the data set.
91 // Maintaining the counters comes with a small performance overhead, so it has to be explicitly enabled
92 ntuple->EnableMetrics();
93
94 // Plot the y components of vector3
95 TCanvas *c1 = new TCanvas("c1","RNTuple Demo", 10, 10, 600, 800);
96 c1->Divide(1,2);
97 c1->cd(1);
98 TH1F h1("x", "x component of Vector3", 100, -3, 3);
99 {
100 /// We enclose viewX in a scope in order to indicate to the RNTuple when we are not
101 /// anymore interested in v3.fX
102 auto viewX = ntuple->GetView<double>("v3.fX");
103 for (auto i : ntuple->GetEntryRange()) {
104 h1.Fill(viewX(i));
105 }
106 }
107 h1.DrawCopy();
108
109 c1->cd(2);
111 auto viewY = ntuple->GetView<double>("v3.fY");
112 for (auto i : ntuple->GetEntryRange()) {
114 }
116
117 // Display the I/O operation statistics performed by the RNTuple reader
118 ntuple->PrintInfo(ENTupleInfo::kMetrics);
119
120 // We read 2 out of the 3 Vector3 members and thus should have requested approximately 2/3 of the file
123 assert(retval == 0);
124 float fileSize = static_cast<float>(fileStat.fSize);
125 float nbytesRead = ntuple->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.szReadPayload")->GetValueAsInt() +
126 ntuple->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.szReadOverhead")->GetValueAsInt();
127
128 std::cout << "File size: " << fileSize / 1024. / 1024. << " MiB" << std::endl;
129 std::cout << "Read from file: " << nbytesRead / 1024. / 1024. << " MiB" << std::endl;
130 std::cout << "Ratio: " << nbytesRead / fileSize << std::endl;
131}
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
R__EXTERN TSystem * gSystem
Definition TSystem.h:572
The RNTupleModel encapulates the schema of an ntuple.
An RNTuple that is used to read data from storage.
An RNTuple that gets filled with entries (data) and writes them to storage.
Common user-tunable settings for storing ntuples.
The Canvas class.
Definition TCanvas.h:23
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:645
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition TH1.cxx:3315
virtual TH1 * DrawCopy(Option_t *option="", const char *name_postfix="_copy") const
Copy this histogram and Draw in the current pad.
Definition TH1.cxx:3084
This is the base class for the ROOT Random number generators.
Definition TRandom.h:27
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
Definition TSystem.cxx:1398
Double_t y[n]
Definition legend1.C:17
return c1
Definition legend1.C:41
Double_t x[n]
Definition legend1.C:17
TH1F * h1
Definition legend1.C:5
ENTupleInfo
Listing of the different options that can be printed by RNTupleReader::GetInfo()
@ kUseGeneralPurpose
Use the new recommended general-purpose setting; it is a best trade-off between compression ratio/dec...
Definition Compression.h:58