Skip to content

Commit a5442c1

Browse files
committed
Add RNTupleDS LHCB benchmark
From https://github.com/jblomer/iotools/lhcb.cxx.
1 parent fc49ead commit a5442c1

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

root/tree/dataframe/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ if(rootbench-datafiles)
5252
DOWNLOAD_DATAFILES zpeak_data_small.root
5353
LABEL long)
5454
endif()
55+
56+
if (ROOT_root7_FOUND)
57+
RB_ADD_GBENCHMARK(RNTupleDSBenchmarks
58+
RNTupleDSBenchmarks.cxx
59+
LIBRARIES Core Hist RIO TreePlayer ROOTDataFrame
60+
DOWNLOAD_DATAFILES B2HHH~none.ntuple
61+
LABEL short)
62+
endif()
5563
endif()
5664

5765
add_subdirectory(LoopSUSYFrame)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <ROOT/RNTupleDS.hxx>
2+
#include <ROOT/RDataFrame.hxx>
3+
4+
#include <benchmark/benchmark.h>
5+
#include <string>
6+
#include <vector>
7+
8+
#include <rootbench/RBConfig.h>
9+
10+
namespace {
11+
12+
constexpr double kKaonMassMeV = 493.677;
13+
14+
double GetP2(double px, double py, double pz)
15+
{
16+
return px*px + py*py + pz*pz;
17+
}
18+
19+
double GetKE(double px, double py, double pz)
20+
{
21+
double p2 = GetP2(px, py, pz);
22+
return sqrt(p2 + kKaonMassMeV*kKaonMassMeV);
23+
}
24+
25+
auto Dataframe(ROOT::RDataFrame &frame)
26+
{
27+
auto fn_muon_cut = [](int is_muon) { return !is_muon; };
28+
auto fn_k_cut = [](double prob_k) { return prob_k > 0.5; };
29+
auto fn_pi_cut = [](double prob_pi) { return prob_pi < 0.5; };
30+
auto fn_sum = [](double p1, double p2, double p3) { return p1 + p2 + p3; };
31+
auto fn_mass = [](double B_E, double B_P2) { double r = sqrt(B_E*B_E - B_P2); return r; };
32+
33+
auto df_muon_cut = frame.Filter(fn_muon_cut, {"H1_isMuon"})
34+
.Filter(fn_muon_cut, {"H2_isMuon"})
35+
.Filter(fn_muon_cut, {"H3_isMuon"});
36+
auto df_k_cut = df_muon_cut.Filter(fn_k_cut, {"H1_ProbK"})
37+
.Filter(fn_k_cut, {"H2_ProbK"})
38+
.Filter(fn_k_cut, {"H3_ProbK"});
39+
auto df_pi_cut = df_k_cut.Filter(fn_pi_cut, {"H1_ProbPi"})
40+
.Filter(fn_pi_cut, {"H2_ProbPi"})
41+
.Filter(fn_pi_cut, {"H3_ProbPi"});
42+
auto df_mass = df_pi_cut.Define("B_PX", fn_sum, {"H1_PX", "H2_PX", "H3_PX"})
43+
.Define("B_PY", fn_sum, {"H1_PY", "H2_PY", "H3_PY"})
44+
.Define("B_PZ", fn_sum, {"H1_PZ", "H2_PZ", "H3_PZ"})
45+
.Define("B_P2", GetP2, {"B_PX", "B_PY", "B_PZ"})
46+
.Define("K1_E", GetKE, {"H1_PX", "H1_PY", "H1_PZ"})
47+
.Define("K2_E", GetKE, {"H2_PX", "H2_PY", "H2_PZ"})
48+
.Define("K3_E", GetKE, {"H3_PX", "H3_PY", "H3_PZ"})
49+
.Define("B_E", fn_sum, {"K1_E", "K2_E", "K3_E"})
50+
.Define("B_m", fn_mass, {"B_E", "B_P2"});
51+
auto hMass = df_mass.Histo1D<double>({"B_mass", "", 500, 5050, 5500}, "B_m");
52+
53+
return hMass;
54+
}
55+
} // namespace
56+
57+
static void BM_RNTupleDS_LHCB(benchmark::State &state)
58+
{
59+
auto df = ROOT::Experimental::MakeNTupleDataFrame("DecayTree", RB::GetDataDir() + "/B2HHH~none.ntuple");
60+
auto h_ptr = Dataframe(df);
61+
for (auto _ : state)
62+
*h_ptr;
63+
RB::Ensure(int(h_ptr->GetMean()) == 5262);
64+
RB::Ensure(int(h_ptr->GetEntries()) == 23895);
65+
}
66+
BENCHMARK(BM_RNTupleDS_LHCB)->Unit(benchmark::kMicrosecond)->Iterations(1);
67+
68+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)