using FourVector = ROOT::Math::XYZTVector; using FourVectors = std::vector; using CylFourVector = ROOT::Math::RhoEtaPhiVector; %%cpp -d void fill_tree(const char *treeName, const char *fileName) { ROOT::RDataFrame d(50); int i(0); d.Define("b1", [&i]() { return (double)i; }) .Define("b2", [&i]() { auto j = i * i; ++i; return j; }) .Snapshot(treeName, fileName); } auto fileName = "df004_cutFlowReport.root"; auto treeName = "myTree"; fill_tree(treeName, fileName); ROOT::RDataFrame d(treeName, fileName, {"b1", "b2"}); auto cut1 = [](double b1) { return b1 > 25.; }; auto cut2 = [](int b2) { return 0 == b2 % 2; }; auto filtered1 = d.Filter(cut1, {"b1"}, "Cut1"); auto filtered2 = d.Filter(cut2, {"b2"}, "Cut2"); auto augmented1 = filtered2.Define("b3", [](double b1, int b2) { return b1 / b2; }); auto cut3 = [](double x) { return x < .5; }; auto filtered3 = augmented1.Filter(cut3, {"b3"}, "Cut3"); std::cout << "Cut3 stats:" << std::endl; filtered3.Report()->Print(); std::cout << "All stats:" << std::endl; auto allCutsReport = d.Report(); allCutsReport->Print(); std::cout << "Name\tAll\tPass\tEfficiency" << std::endl; for (auto &&cutInfo : allCutsReport) { std::cout << cutInfo.GetName() << "\t" << cutInfo.GetAll() << "\t" << cutInfo.GetPass() << "\t" << cutInfo.GetEff() << " %" << std::endl; } auto cutName = "Cut1"; auto cut = allCutsReport->At("Cut1"); std::cout << cutName << " efficiency is " << cut.GetEff() << " %" << std::endl; gROOT->GetListOfCanvases()->Draw()