94 DemoDouble32() =
default;
95 void Set(Double_t ref)
97 fD64 = fF32 = fI32 = fI30 = fI28 = fI26 = fI24 = fI22 = fI20 = fI18 = fI16 = fI14 = fI12 = fI10 = fI8 = fI6 =
98 fI4 = fI2 = fR14 = fR12 = fR10 = fR8 = fR6 = fR4 = fR2 = ref;
104 const auto nEntries = 40000;
105 const auto xmax = TMath::Pi();
106 const auto xmin = -xmax;
109 TFile::Open(
"DemoDouble32.root",
"recreate");
110 TTree tree(
"tree",
"DemoDouble32");
111 DemoDouble32 demoInstance;
112 auto demoInstanceBranch = tree.Branch(
"d",
"DemoDouble32", &demoInstance, 4000);
114 for (
auto i : ROOT::TSeqI(nEntries)) {
115 demoInstance.Set(r.Uniform(xmin, xmax));
123 auto branches = demoInstanceBranch->GetListOfBranches();
124 const auto nb = branches->GetEntries();
125 auto br =
static_cast<TBranch *
>(branches->At(0));
126 const Long64_t zip64 = br->GetZipBytes();
128 auto h =
new TH1F(
"h",
"Double32_t compression and precision", nb, 0, nb);
132 auto gcx =
new TGraph();
134 gcx->SetMarkerStyle(kFullSquare);
135 gcx->SetMarkerColor(kBlue);
137 auto gdrange =
new TGraph();
138 gdrange->SetName(
"gdrange");
139 gdrange->SetMarkerStyle(kFullCircle);
140 gdrange->SetMarkerColor(kRed);
142 auto gdval =
new TGraph();
143 gdval->SetName(
"gdval");
144 gdval->SetMarkerStyle(kFullTriangleUp);
145 gdval->SetMarkerColor(kBlack);
148 for (
auto i : ROOT::TSeqI(nb)) {
149 auto br =
static_cast<TBranch *
>(branches->At(i));
150 const auto brName = br->GetName();
152 h->GetXaxis()->SetBinLabel(i + 1, brName);
153 const auto cx = double(zip64) / br->GetZipBytes();
154 gcx->SetPoint(i, i + 0.5, cx);
155 if (i == 0 )
continue;
157 tree.Draw(Form(
"(fD64-%s)/(%g)", brName, xmax - xmin),
"",
"goff");
158 const auto rmsDrange = TMath::RMS(nEntries, tree.GetV1());
159 const auto drange = TMath::Max(0., -TMath::Log10(rmsDrange));
160 gdrange->SetPoint(i-1, i + 0.5, drange);
162 tree.Draw(Form(
"(fD64-%s)/fD64", brName),
"",
"goff");
163 const auto rmsDVal = TMath::RMS(nEntries, tree.GetV1());
164 const auto dval = TMath::Max(0., -TMath::Log10(rmsDVal));
165 gdval->SetPoint(i-1, i + 0.5, dval);
167 tree.Draw(Form(
"(fD64-%s) >> hdvalabs_%s", brName, brName),
"",
"goff");
168 auto hdval = gDirectory->Get<TH1F>(Form(
"hdvalabs_%s", brName));
169 hdval->GetXaxis()->SetTitle(
"Difference wrt reference value");
170 auto c =
new TCanvas(brName, brName, 800, 600);
176 auto c1 =
new TCanvas(
"c1",
"c1", 800, 600);
180 h->GetXaxis()->LabelsOption(
"v");
186 auto legend =
new TLegend(0.3, 0.6, 0.9, 0.9);
187 legend->SetHeader(Form(
"%d entries within the [-#pi, #pi] range", nEntries));
188 legend->AddEntry(gcx,
"Compression factor",
"lp");
189 legend->AddEntry(gdrange,
"Log of precision wrt range: p = -Log_{10}( RMS( #frac{Ref - x}{range} ) ) ",
"lp");
190 legend->AddEntry(gdval,
"Log of precision wrt value: p = -Log_{10}( RMS( #frac{Ref - x}{Ref} ) ) ",
"lp");