#include #include #include // A function that adds a "lazy" histogram to a computation graph. // The event loop will not run if only the RResultPtr is declared. ROOT::RDF::RResultPtr histoLater(ROOT::RDF::RNode & rdf) { return rdf.Histo1D({"Histo2", "Histogram running later", 10, 0, 20}, {"x"}); } // A function that immediately produces a result. std::shared_ptr histoNow(ROOT::RDF::RNode & rdf) { auto histo = rdf.Histo1D({"Histo2", "Histogram running later", 10, 0, 20}, {"x"}); return histo.GetSharedPtr(); } void df039_RResultPtr_basics() { // Create a simple dataframe that fills event numbers into a histogram. ROOT::RDataFrame bare_rdf(10); auto rdf = bare_rdf.Define("x", [&](unsigned long long entry) -> unsigned int { if (entry == 0) std::cout << "Event loop is running\n"; return entry; }, {"rdfentry_"}); // Book a histogram action. This will be stored as RResultPtr. // The action won't run yet. ROOT::RDF::RResultPtr histo1 = rdf.Histo1D({"Histo1", "Histogram", 10, 0, 10}, {"x"}); std::cout << "Declared histo1\n"; // When RDF results are declared in functions, one has to choose if one wants run it to immediately or lazily. // To run the event loop in a lazy fashion, return RResultPtr. This is equivalent to histo1 above, but happens // inside a function. auto rNode = ROOT::RDF::AsRNode(rdf); ROOT::RDF::RResultPtr histo2 = histoLater(rNode); std::cout << "Declared histo2\n"; // If the function should produce the result immediately, a shared_ptr to the underlying result should be returned. std::shared_ptr histo3 = histoNow(rNode); std::cout << "Declared histo3\n"; }