auto filename = gROOT->GetTutorialDir() + "/dataframe/df017_vecOpsHEP.root"; auto treename = "myDataset"; using namespace ROOT; %%cpp -d void WithTTreeReader() { TFile f(filename); TTreeReader tr(treename, &f); TTreeReaderArray px(tr, "px"); TTreeReaderArray py(tr, "py"); TTreeReaderArray E(tr, "E"); TH1F h("pt", "pt", 16, 0, 4); while (tr.Next()) { for (auto i=0U;i < px.GetSize(); ++i) { if (E[i] > 100) h.Fill(sqrt(px[i]*px[i] + py[i]*py[i])); } } h.DrawCopy(); } %%cpp -d void WithRDataFrame() { RDataFrame f(treename, filename.Data()); auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) { RVecD v; for (auto i=0U;i < px.size(); ++i) { if (E[i] > 100) { v.emplace_back(sqrt(px[i]*px[i] + py[i]*py[i])); } } return v; }; f.Define("pt", CalcPt, {"px", "py", "E"}) .Histo1D({"pt", "pt", 16, 0, 4}, "pt")->DrawCopy(); } %%cpp -d void WithRDataFrameVecOps() { RDataFrame f(treename, filename.Data()); auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) { auto pt = sqrt(px*px + py*py); return pt[E>100]; }; f.Define("good_pt", CalcPt, {"px", "py", "E"}) .Histo1D({"pt", "pt", 16, 0, 4}, "good_pt")->DrawCopy(); } %%cpp -d void WithRDataFrameVecOpsJit() { RDataFrame f(treename, filename.Data()); f.Define("good_pt", "sqrt(px*px + py*py)[E>100]") .Histo1D({"pt", "pt", 16, 0, 4}, "good_pt")->DrawCopy(); } auto c = new TCanvas(); c->Divide(2,2); c->cd(1); WithTTreeReader(); c->cd(2); WithRDataFrame(); c->cd(3); WithRDataFrameVecOps(); c->cd(4); WithRDataFrameVecOpsJit(); gROOT->GetListOfCanvases()->Draw()