void df023_aggregate() { // Column to be aggregated const std::string columnName = "x"; ROOT::EnableImplicitMT(2); auto rdf = ROOT::RDataFrame(5); auto d = rdf.Define(columnName, "rdfentry_ + 1."); // Aggregator function. It receives an accumulator (acc) and a column value (x). The variable acc is shared among the // calls, so the function has to specify how the value has to be aggregated in the accumulator. auto aggregator = [](double acc, double x) { return acc * x; }; // If multithread is enabled, the aggregator function will be called by more threads and will produce a vector of // partial accumulators. The merger function performs the final aggregation of these partial results. auto merger = [](std::vector &accumulators) { auto size = accumulators.size(); for (int i = 1; i < size; ++i) { accumulators[0] *= accumulators[i]; } }; // The accumulator is initialized at this value by every thread. double initValue = 1.; // Multiplies all elements of the column "x" auto result = d.Aggregate(aggregator, merger, columnName, initValue); std::cout << *result << std::endl; }