|
| 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