11#ifndef ROOT_RDF_TINTERFACE
12#define ROOT_RDF_TINTERFACE
47#include <initializer_list>
57#include <unordered_set>
80template <
typename Proxied,
typename DataSource>
83using RNode = RInterface<::ROOT::Detail::RDF::RNodeBase, void>;
109template <
typename Proxied,
typename DataSource =
void>
118 template <
typename T,
typename W>
147 template <typename T = Proxied, typename = std::enable_if_t<std::is_same<T, RLoopManager>::value,
int>>
214 template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value,
int> = 0>
218 RDFInternal::CheckFilter(
f);
219 using ColTypes_t =
typename TTraits::CallableTraits<F>::arg_types;
220 constexpr auto nColumns = ColTypes_t::list_size;
238 template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value,
int> = 0>
254 template <
typename F>
289 using BaseNodeType_t =
typename std::remove_pointer_t<
decltype(upcastNodeOnHeap)>::element_type;
291 const auto jittedFilter =
337 template <typename F, typename std::enable_if_t<!std::is_convertible<F, std::string>::value,
int> = 0>
340 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::None>(
name, std::move(expression), columns,
"Define");
366 template <
typename F>
369 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::Slot>(
name, std::move(expression), columns,
"DefineSlot");
396 template <
typename F>
399 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::SlotAndEntry>(
name, std::move(expression), columns,
427 constexpr auto where =
"Define";
438 newCols.
AddDefine(std::move(jittedDefine));
456 template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value,
int> = 0>
459 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::None>(
name, std::move(expression), columns,
"Redefine");
475 template <
typename F>
478 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::Slot>(
name, std::move(expression), columns,
"RedefineSlot");
494 template <
typename F>
497 return DefineImpl<F, RDFDetail::ExtraArgsForDefine::SlotAndEntry>(
name, std::move(expression), columns,
498 "RedefineSlotEntry");
517 constexpr auto where =
"Redefine";
528 newCols.
AddDefine(std::move(jittedDefine));
565 template <typename F, typename RetType_t = typename TTraits::CallableTraits<F>::ret_type>
573 if (retTypeName.empty()) {
577 retTypeName =
"CLING_UNKNOWN_TYPE_" + demangledType;
581 std::make_shared<RDFDetail::RDefinePerSample<F>>(
name, retTypeName, std::move(expression), *
fLoopManager);
584 newCols.AddDefine(std::move(newColumn));
639 newCols.
AddDefine(std::move(jittedDefine));
692 template <
typename F>
694 const std::vector<std::string> &variationTags, std::string_view variationName =
"")
696 std::vector<std::string> colNames{{std::string(colName)}};
697 const std::string theVariationName{variationName.empty() ? colName : variationName};
699 return VaryImpl<true>(std::move(colNames), std::forward<F>(expression), inputColumns, variationTags,
731 template <
typename F>
733 std::size_t nVariations, std::string_view variationName =
"")
735 R__ASSERT(nVariations > 0 &&
"Must have at least one variation.");
737 std::vector<std::string> variationTags;
738 variationTags.reserve(nVariations);
739 for (std::size_t i = 0u; i < nVariations; ++i)
740 variationTags.emplace_back(std::to_string(i));
742 const std::string theVariationName{variationName.empty() ? colName : variationName};
744 return Vary(colName, std::forward<F>(expression), inputColumns, std::move(variationTags), theVariationName);
779 template <
typename F>
782 const std::vector<std::string> &variationTags, std::string_view variationName)
784 return VaryImpl<false>(colNames, std::forward<F>(expression), inputColumns, variationTags, variationName);
801 template <
typename F>
804 const std::vector<std::string> &variationTags, std::string_view variationName)
806 return Vary(std::vector<std::string>(colNames), std::forward<F>(expression), inputColumns, variationTags, variationName);
841 template <
typename F>
844 std::size_t nVariations, std::string_view variationName)
846 R__ASSERT(nVariations > 0 &&
"Must have at least one variation.");
848 std::vector<std::string> variationTags;
849 variationTags.reserve(nVariations);
850 for (std::size_t i = 0u; i < nVariations; ++i)
851 variationTags.emplace_back(std::to_string(i));
853 return Vary(colNames, std::forward<F>(expression), inputColumns, std::move(variationTags), variationName);
872 template <
typename F>
875 std::size_t nVariations, std::string_view variationName)
877 return Vary(std::vector<std::string>(colNames), std::forward<F>(expression), inputColumns, nVariations, variationName);
906 const std::vector<std::string> &variationTags, std::string_view variationName =
"")
908 std::vector<std::string> colNames{{std::string(colName)}};
909 const std::string theVariationName{variationName.empty() ? colName : variationName};
911 return JittedVaryImpl(colNames, expression, variationTags, theVariationName,
true);
939 std::string_view variationName =
"")
941 std::vector<std::string> variationTags;
942 variationTags.reserve(nVariations);
943 for (std::size_t i = 0u; i < nVariations; ++i)
944 variationTags.emplace_back(std::to_string(i));
946 return Vary(colName, expression, std::move(variationTags), variationName);
976 std::size_t nVariations, std::string_view variationName)
978 std::vector<std::string> variationTags;
979 variationTags.reserve(nVariations);
980 for (std::size_t i = 0u; i < nVariations; ++i)
981 variationTags.emplace_back(std::to_string(i));
983 return Vary(colNames, expression, std::move(variationTags), variationName);
1000 std::size_t nVariations, std::string_view variationName)
1002 return Vary(std::vector<std::string>(colNames), expression, nVariations, variationName);
1028 const std::vector<std::string> &variationTags, std::string_view variationName)
1030 return JittedVaryImpl(colNames, expression, variationTags, variationName,
false);
1054 constexpr auto where =
"Alias";
1062 newCols.AddAlias(alias, validColumnName);
1066 return newInterface;
1128 template <
typename... ColumnTypes>
1158 const auto pairOfColumnLists =
1160 std::move(colListNoAliases), std::move(colListNoPoundSizes));
1161 const auto &colListNoAliasesWithSizeBranches = pairOfColumnLists.first;
1162 const auto &colListWithAliasesAndSizeBranches = pairOfColumnLists.second;
1165 const auto fullTreeName = treename;
1167 treename = parsedTreePath.fTreeName;
1168 const auto &dirname = parsedTreePath.fDirName;
1170 auto snapHelperArgs = std::make_shared<RDFInternal::SnapshotHelperArgs>(
1171 RDFInternal::SnapshotHelperArgs{std::string(
filename), std::string(dirname), std::string(treename),
1172 colListWithAliasesAndSizeBranches, options});
1182 fullTreeName,
filename, colListNoAliasesWithSizeBranches,
false));
1184 auto resPtr = CreateAction<RDFInternal::ActionTags::Snapshot, RDFDetail::RInferredType>(
1185 colListNoAliasesWithSizeBranches, newRDF, snapHelperArgs,
fProxiedPtr,
1186 colListNoAliasesWithSizeBranches.size());
1207 std::string_view columnNameRegexp =
"",
1216 std::copy_if(dsColumns.begin(), dsColumns.end(), std::back_inserter(dsColumnsWithoutSizeColumns),
1217 [](
const std::string &
name) { return name.size() < 13 || name.substr(0, 13) !=
"R_rdf_sizeof_"; });
1219 columnNames.reserve(definedColumns.size() + treeBranchNames.size() + dsColumnsWithoutSizeColumns.size());
1220 columnNames.insert(columnNames.end(), definedColumns.begin(), definedColumns.end());
1221 columnNames.insert(columnNames.end(), treeBranchNames.begin(), treeBranchNames.end());
1222 columnNames.insert(columnNames.end(), dsColumnsWithoutSizeColumns.begin(), dsColumnsWithoutSizeColumns.end());
1247 std::initializer_list<std::string> columnList,
1289 template <
typename... ColumnTypes>
1292 auto staticSeq = std::make_index_sequence<
sizeof...(ColumnTypes)>();
1293 return CacheImpl<ColumnTypes...>(columnList, staticSeq);
1306 if (columnList.empty()) {
1307 auto nEntries = *this->
Count();
1312 std::stringstream cacheCall;
1319 cacheCall <<
"*reinterpret_cast<ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager>*>("
1321 <<
") = reinterpret_cast<ROOT::RDF::RInterface<ROOT::Detail::RDF::RNodeBase>*>("
1326 const auto validColumnNames =
1330 for (
const auto &colType : colTypes)
1331 cacheCall << colType <<
", ";
1332 if (!columnListWithoutSizeColumns.empty())
1333 cacheCall.seekp(-2, cacheCall.cur);
1334 cacheCall <<
">(*reinterpret_cast<std::vector<std::string>*>("
1355 const auto treeBranchNames =
1360 std::copy_if(dsColumns.begin(), dsColumns.end(), std::back_inserter(dsColumnsWithoutSizeColumns),
1361 [](
const std::string &
name) { return name.size() < 13 || name.substr(0, 13) !=
"R_rdf_sizeof_"; });
1363 columnNames.reserve(definedColumns.size() + treeBranchNames.size() + dsColumns.size());
1364 columnNames.insert(columnNames.end(), definedColumns.begin(), definedColumns.end());
1365 columnNames.insert(columnNames.end(), treeBranchNames.begin(), treeBranchNames.end());
1366 columnNames.insert(columnNames.end(), dsColumns.begin(), dsColumns.end());
1368 return Cache(selectedColumns);
1380 return Cache(selectedColumns);
1404 if (stride == 0 || (end != 0 && end < begin))
1405 throw std::runtime_error(
"Range: stride must be strictly greater than 0 and end must be greater than begin.");
1409 auto rangePtr = std::make_shared<Range_t>(begin, end, stride,
fProxiedPtr);
1411 return newInterface;
1441 template <
typename F>
1444 using arg_types =
typename TTraits::CallableTraits<
decltype(
f)>::arg_types_nodecay;
1445 using ret_type =
typename TTraits::CallableTraits<
decltype(
f)>::ret_type;
1446 ForeachSlot(RDFInternal::AddSlotParameter<ret_type>(
f, arg_types()), columns);
1471 template <
typename F>
1475 constexpr auto nColumns = ColTypes_t::list_size;
1480 using Helper_t = RDFInternal::ForeachSlotHelper<F>;
1518 template <typename F, typename T = typename TTraits::CallableTraits<F>::ret_type>
1522 std::is_default_constructible<T>::value,
1523 "reduce object cannot be default-constructed. Please provide an initialisation value (redIdentity)");
1524 return Reduce(std::move(
f), columnName, T());
1541 template <typename F, typename T = typename TTraits::CallableTraits<F>::ret_type>
1563 auto cSPtr = std::make_shared<ULong64_t>(0);
1564 using Helper_t = RDFInternal::CountHelper;
1568 return MakeResultPtr(cSPtr, *
fLoopManager, std::move(action));
1591 template <
typename T,
typename COLL = std::vector<T>>
1599 using Helper_t = RDFInternal::TakeHelper<T, T, COLL>;
1601 auto valuesPtr = std::make_shared<COLL>();
1606 return MakeResultPtr(valuesPtr, *
fLoopManager, std::move(action));
1634 template <
typename V = RDFDetail::RInferredType>
1641 std::shared_ptr<::TH1D>
h(
nullptr);
1643 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1644 h = model.GetHistogram();
1645 h->SetDirectory(
nullptr);
1648 if (
h->GetXaxis()->GetXmax() ==
h->GetXaxis()->GetXmin())
1649 RDFInternal::HistoUtils<::TH1D>::SetCanExtendAllAxes(*
h);
1650 return CreateAction<RDFInternal::ActionTags::Histo1D, V>(validatedColumns,
h,
h,
fProxiedPtr);
1670 template <
typename V = RDFDetail::RInferredType>
1673 const auto h_name = std::string(vName);
1674 const auto h_title = h_name +
";" + h_name +
";count";
1675 return Histo1D<V>({h_name.c_str(), h_title.c_str(), 128u, 0., 0.}, vName);
1696 template <
typename V = RDFDetail::RInferredType,
typename W = RDFDetail::RInferredType>
1699 const std::vector<std::string_view> columnViews = {vName, wName};
1703 std::shared_ptr<::TH1D>
h(
nullptr);
1705 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1708 return CreateAction<RDFInternal::ActionTags::Histo1D, V, W>(userColumns,
h,
h,
fProxiedPtr);
1730 template <
typename V = RDFDetail::RInferredType,
typename W = RDFDetail::RInferredType>
1734 std::string str_vName{vName};
1735 std::string str_wName{wName};
1736 const auto h_name = str_vName +
"_weighted_" + str_wName;
1737 const auto h_title = str_vName +
", weights: " + str_wName +
";" + str_vName +
";count * " + str_wName;
1738 return Histo1D<V, W>({h_name.c_str(), h_title.c_str(), 128u, 0., 0.}, vName, wName);
1750 template <
typename V,
typename W>
1753 return Histo1D<V, W>(model,
"",
"");
1784 template <
typename V1 = RDFDetail::RInferredType,
typename V2 = RDFDetail::RInferredType>
1787 std::shared_ptr<::TH2D>
h(
nullptr);
1789 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1792 if (!RDFInternal::HistoUtils<::TH2D>::HasAxisLimits(*
h)) {
1793 throw std::runtime_error(
"2D histograms with no axes limits are not supported yet.");
1795 const std::vector<std::string_view> columnViews = {v1Name, v2Name};
1799 return CreateAction<RDFInternal::ActionTags::Histo2D, V1, V2>(userColumns,
h,
h,
fProxiedPtr);
1828 Histo2D(
const TH2DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view wName)
1830 std::shared_ptr<::TH2D>
h(
nullptr);
1832 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1835 if (!RDFInternal::HistoUtils<::TH2D>::HasAxisLimits(*
h)) {
1836 throw std::runtime_error(
"2D histograms with no axes limits are not supported yet.");
1838 const std::vector<std::string_view> columnViews = {v1Name, v2Name, wName};
1842 return CreateAction<RDFInternal::ActionTags::Histo2D, V1, V2, W>(userColumns,
h,
h,
fProxiedPtr);
1845 template <
typename V1,
typename V2,
typename W>
1848 return Histo2D<V1, V2, W>(model,
"",
"",
"");
1881 std::string_view v3Name =
"")
1883 std::shared_ptr<::TH3D>
h(
nullptr);
1885 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1888 if (!RDFInternal::HistoUtils<::TH3D>::HasAxisLimits(*
h)) {
1889 throw std::runtime_error(
"3D histograms with no axes limits are not supported yet.");
1891 const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name};
1895 return CreateAction<RDFInternal::ActionTags::Histo3D, V1, V2, V3>(userColumns,
h,
h,
fProxiedPtr);
1930 std::string_view v3Name, std::string_view wName)
1932 std::shared_ptr<::TH3D>
h(
nullptr);
1934 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1937 if (!RDFInternal::HistoUtils<::TH3D>::HasAxisLimits(*
h)) {
1938 throw std::runtime_error(
"3D histograms with no axes limits are not supported yet.");
1940 const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name, wName};
1944 return CreateAction<RDFInternal::ActionTags::Histo3D, V1, V2, V3, W>(userColumns,
h,
h,
fProxiedPtr);
1947 template <
typename V1,
typename V2,
typename V3,
typename W>
1950 return Histo3D<V1, V2, V3, W>(model,
"",
"",
"",
"");
1975 template <
typename FirstColumn,
typename... OtherColumns>
1978 std::shared_ptr<::THnD>
h(
nullptr);
1980 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
1983 if (
int(columnList.size()) == (
h->GetNdimensions() + 1)) {
1985 }
else if (
int(columnList.size()) !=
h->GetNdimensions()) {
1986 throw std::runtime_error(
"Wrong number of columns for the specified number of histogram axes.");
1989 return CreateAction<RDFInternal::ActionTags::HistoND, FirstColumn, OtherColumns...>(columnList,
h,
h,
2012 std::shared_ptr<::THnD>
h(
nullptr);
2014 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
2017 if (
int(columnList.size()) == (
h->GetNdimensions() + 1)) {
2019 }
else if (
int(columnList.size()) !=
h->GetNdimensions()) {
2020 throw std::runtime_error(
"Wrong number of columns for the specified number of histogram axes.");
2023 return CreateAction<RDFInternal::ActionTags::HistoND, RDFDetail::RInferredType>(columnList,
h,
h,
fProxiedPtr,
2055 template <
typename X = RDFDetail::RInferredType,
typename Y = RDFDetail::RInferredType>
2058 auto graph = std::make_shared<::TGraph>();
2059 const std::vector<std::string_view> columnViews = {
x,
y};
2067 const auto g_name = validatedColumns[1] +
"_vs_" + validatedColumns[0];
2068 const auto g_title = validatedColumns[1] +
" vs " + validatedColumns[0];
2069 graph->SetNameTitle(g_name.c_str(), g_title.c_str());
2070 graph->GetXaxis()->SetTitle(validatedColumns[0].c_str());
2071 graph->GetYaxis()->SetTitle(validatedColumns[1].c_str());
2073 return CreateAction<RDFInternal::ActionTags::Graph, X, Y>(validatedColumns,
graph,
graph,
fProxiedPtr);
2110 std::string_view exh =
"", std::string_view eyl =
"", std::string_view eyh =
"")
2112 auto graph = std::make_shared<::TGraphAsymmErrors>();
2113 const std::vector<std::string_view> columnViews = {
x,
y, exl, exh, eyl, eyh};
2121 const auto g_name = validatedColumns[1] +
"_vs_" + validatedColumns[0];
2122 const auto g_title = validatedColumns[1] +
" vs " + validatedColumns[0];
2123 graph->SetNameTitle(g_name.c_str(), g_title.c_str());
2124 graph->GetXaxis()->SetTitle(validatedColumns[0].c_str());
2125 graph->GetYaxis()->SetTitle(validatedColumns[1].c_str());
2127 return CreateAction<RDFInternal::ActionTags::GraphAsymmErrors, X, Y, EXL, EXH, EYL, EYH>(validatedColumns,
graph,
2154 template <
typename V1 = RDFDetail::RInferredType,
typename V2 = RDFDetail::RInferredType>
2158 std::shared_ptr<::TProfile>
h(
nullptr);
2160 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
2164 if (!RDFInternal::HistoUtils<::TProfile>::HasAxisLimits(*
h)) {
2165 throw std::runtime_error(
"Profiles with no axes limits are not supported yet.");
2167 const std::vector<std::string_view> columnViews = {v1Name, v2Name};
2171 return CreateAction<RDFInternal::ActionTags::Profile1D, V1, V2>(userColumns,
h,
h,
fProxiedPtr);
2203 std::shared_ptr<::TProfile>
h(
nullptr);
2205 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
2209 if (!RDFInternal::HistoUtils<::TProfile>::HasAxisLimits(*
h)) {
2210 throw std::runtime_error(
"Profile histograms with no axes limits are not supported yet.");
2212 const std::vector<std::string_view> columnViews = {v1Name, v2Name, wName};
2216 return CreateAction<RDFInternal::ActionTags::Profile1D, V1, V2, W>(userColumns,
h,
h,
fProxiedPtr);
2222 template <
typename V1,
typename V2,
typename W>
2225 return Profile1D<V1, V2, W>(model,
"",
"",
"");
2258 std::string_view v2Name =
"", std::string_view v3Name =
"")
2260 std::shared_ptr<::TProfile2D>
h(
nullptr);
2262 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
2266 if (!RDFInternal::HistoUtils<::TProfile2D>::HasAxisLimits(*
h)) {
2267 throw std::runtime_error(
"2D profiles with no axes limits are not supported yet.");
2269 const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name};
2273 return CreateAction<RDFInternal::ActionTags::Profile2D, V1, V2, V3>(userColumns,
h,
h,
fProxiedPtr);
2306 std::string_view v3Name, std::string_view wName)
2308 std::shared_ptr<::TProfile2D>
h(
nullptr);
2310 ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
2314 if (!RDFInternal::HistoUtils<::TProfile2D>::HasAxisLimits(*
h)) {
2315 throw std::runtime_error(
"2D profiles with no axes limits are not supported yet.");
2317 const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name, wName};
2321 return CreateAction<RDFInternal::ActionTags::Profile2D, V1, V2, V3, W>(userColumns,
h,
h,
fProxiedPtr);
2326 template <
typename V1,
typename V2,
typename V3,
typename W>
2329 return Profile2D<V1, V2, V3, W>(model,
"",
"",
"",
"");
2369 auto h = std::make_shared<std::decay_t<T>>(std::forward<T>(model));
2370 if (!RDFInternal::HistoUtils<T>::HasAxisLimits(*
h)) {
2371 throw std::runtime_error(
"The absence of axes limits is not supported yet.");
2392 template <
typename V = RDFDetail::RInferredType>
2396 if (!
value.empty()) {
2397 columns.emplace_back(std::string(
value));
2400 if (std::is_same<V, RDFDetail::RInferredType>::value) {
2403 return Fill<V>(
TStatistic(), validColumnNames);
2424 template <
typename V = RDFDetail::RInferredType,
typename W = RDFDetail::RInferredType>
2428 constexpr auto vIsInferred = std::is_same<V, RDFDetail::RInferredType>::value;
2429 constexpr auto wIsInferred = std::is_same<W, RDFDetail::RInferredType>::value;
2435 if (vIsInferred && wIsInferred) {
2437 }
else if (vIsInferred != wIsInferred) {
2438 std::string error(
"The ");
2439 error += vIsInferred ?
"value " :
"weight ";
2440 error +=
"column type is explicit, while the ";
2441 error += vIsInferred ?
"weight " :
"value ";
2442 error +=
" is specified to be inferred. This case is not supported: please specify both types or none.";
2443 throw std::runtime_error(error);
2445 return Fill<V, W>(
TStatistic(), validColumnNames);
2470 template <
typename T = RDFDetail::RInferredType>
2474 using RetType_t = RDFDetail::MinReturnType_t<T>;
2475 auto minV = std::make_shared<RetType_t>(std::numeric_limits<RetType_t>::max());
2476 return CreateAction<RDFInternal::ActionTags::Min, T>(userColumns, minV, minV,
fProxiedPtr);
2500 template <
typename T = RDFDetail::RInferredType>
2504 using RetType_t = RDFDetail::MaxReturnType_t<T>;
2505 auto maxV = std::make_shared<RetType_t>(std::numeric_limits<RetType_t>::lowest());
2506 return CreateAction<RDFInternal::ActionTags::Max, T>(userColumns, maxV, maxV,
fProxiedPtr);
2529 template <
typename T = RDFDetail::RInferredType>
2533 auto meanV = std::make_shared<double>(0);
2534 return CreateAction<RDFInternal::ActionTags::Mean, T>(userColumns, meanV, meanV,
fProxiedPtr);
2557 template <
typename T = RDFDetail::RInferredType>
2561 auto stdDeviationV = std::make_shared<double>(0);
2562 return CreateAction<RDFInternal::ActionTags::StdDev, T>(userColumns, stdDeviationV, stdDeviationV,
fProxiedPtr);
2588 template <
typename T = RDFDetail::RInferredType>
2590 Sum(std::string_view columnName =
"",
2591 const RDFDetail::SumReturnType_t<T> &initValue = RDFDetail::SumReturnType_t<T>{})
2594 auto sumV = std::make_shared<RDFDetail::SumReturnType_t<T>>(initValue);
2595 return CreateAction<RDFInternal::ActionTags::Sum, T>(userColumns, sumV, sumV,
fProxiedPtr);
2625 bool returnEmptyReport =
false;
2632 returnEmptyReport =
true;
2634 auto rep = std::make_shared<RCutFlowReport>();
2635 using Helper_t = RDFInternal::ReportHelper<Proxied>;
2641 return MakeResultPtr(rep, *
fLoopManager, std::move(action));
2705 template <typename AccFun, typename MergeFun, typename R = typename TTraits::CallableTraits<AccFun>::ret_type,
2706 typename ArgTypes =
typename TTraits::CallableTraits<AccFun>::arg_types,
2707 typename ArgTypesNoDecay =
typename TTraits::CallableTraits<AccFun>::arg_types_nodecay,
2708 typename U = TTraits::TakeFirstParameter_t<ArgTypes>,
2709 typename T = TTraits::TakeFirstParameter_t<TTraits::RemoveFirstParameter_t<ArgTypes>>>
2712 RDFInternal::CheckAggregate<R, MergeFun>(ArgTypesNoDecay());
2718 auto accObjPtr = std::make_shared<U>(aggIdentity);
2719 using Helper_t = RDFInternal::AggregateHelper<AccFun, MergeFun, R, T, U>;
2721 auto action = std::make_unique<Action_t>(
2722 Helper_t(std::move(aggregator), std::move(merger), accObjPtr,
fLoopManager->GetNSlots()), validColumnNames,
2724 return MakeResultPtr(accObjPtr, *
fLoopManager, std::move(action));
2740 template <typename AccFun, typename MergeFun, typename R = typename TTraits::CallableTraits<AccFun>::ret_type,
2741 typename ArgTypes =
typename TTraits::CallableTraits<AccFun>::arg_types,
2742 typename U = TTraits::TakeFirstParameter_t<ArgTypes>,
2743 typename T = TTraits::TakeFirstParameter_t<TTraits::RemoveFirstParameter_t<ArgTypes>>>
2747 std::is_default_constructible<U>::value,
2748 "aggregated object cannot be default-constructed. Please provide an initialisation value (aggIdentity)");
2749 return Aggregate(std::move(aggregator), std::move(merger), columnName, U());
2817 using HelperT = std::decay_t<Helper>;
2820 static_assert(std::is_base_of<AH, HelperT>::value && std::is_convertible<HelperT *, AH *>::value,
2821 "Action helper of type T must publicly inherit from ROOT::Detail::RDF::RActionImpl<T>");
2823 auto hPtr = std::make_shared<HelperT>(std::forward<Helper>(helper));
2824 auto resPtr = hPtr->GetResultPtr();
2826 if (std::is_same<FirstColumn, RDFDetail::RInferredType>::value && columns.empty()) {
2829 return CreateAction<RDFInternal::ActionTags::Book, FirstColumn, OtherColumns...>(columns, resPtr, hPtr,
2859 template <
typename... ColumnTypes>
2863 auto newCols = columnList;
2864 newCols.insert(newCols.begin(),
"rdfentry_");
2865 auto displayer = std::make_shared<RDisplay>(newCols,
GetColumnTypeNamesList(newCols), nMaxCollectionElements);
2866 using displayHelperArgs_t = std::pair<size_t, std::shared_ptr<RDisplay>>;
2869 std::move(newCols), displayer, std::make_shared<displayHelperArgs_t>(nRows, displayer),
fProxiedPtr);
2886 auto newCols = columnList;
2887 newCols.insert(newCols.begin(),
"rdfentry_");
2888 auto displayer = std::make_shared<RDisplay>(newCols,
GetColumnTypeNamesList(newCols), nMaxCollectionElements);
2889 using displayHelperArgs_t = std::pair<size_t, std::shared_ptr<RDisplay>>;
2890 return CreateAction<RDFInternal::ActionTags::Display, RDFDetail::RInferredType>(
2891 std::move(newCols), displayer, std::make_shared<displayHelperArgs_t>(nRows, displayer),
fProxiedPtr,
2892 columnList.size() + 1);
2906 Display(std::string_view columnNameRegexp =
"",
size_t nRows = 5,
size_t nMaxCollectionElements = 10)
2910 return Display(selectedColumns, nRows, nMaxCollectionElements);
2922 Display(std::initializer_list<std::string> columnList,
size_t nRows = 5,
size_t nMaxCollectionElements = 10)
2925 return Display(selectedColumns, nRows, nMaxCollectionElements);
2929 template <typename F, typename DefineType, typename RetType = typename TTraits::CallableTraits<F>::ret_type>
2933 if (where.compare(0, 8,
"Redefine") != 0) {
2943 using ArgTypes_t =
typename TTraits::CallableTraits<F>::arg_types;
2945 std::is_same<DefineType, RDFDetail::ExtraArgsForDefine::Slot>::value, ArgTypes_t>
::type;
2947 std::is_same<DefineType, RDFDetail::ExtraArgsForDefine::SlotAndEntry>::value, ColTypesTmp_t>
::type;
2949 constexpr auto nColumns = ColTypes_t::list_size;
2956 if (retTypeName.empty()) {
2960 retTypeName =
"CLING_UNKNOWN_TYPE_" + demangledType;
2964 auto newColumn = std::make_shared<NewCol_t>(
name, retTypeName, std::forward<F>(expression), validColumnNames,
2968 newCols.
AddDefine(std::move(newColumn));
2972 return newInterface;
2978 template <typename F, typename DefineType, typename RetType = typename TTraits::CallableTraits<F>::ret_type,
2979 bool IsFStringConv = std::is_convertible<F, std::string>::value,
2980 bool IsRetTypeDefConstr = std::is_default_constructible<RetType>::value>
2981 std::enable_if_t<!IsFStringConv && !IsRetTypeDefConstr, RInterface<Proxied, DS_t>>
2984 static_assert(std::is_default_constructible<typename TTraits::CallableTraits<F>::ret_type>
::value,
2985 "Error in `Define`: type returned by expression is not default-constructible");
2989 template <
typename... ColumnTypes>
2997 const auto validCols =
GetValidatedColumnNames(columnListWithoutSizeColumns.size(), columnListWithoutSizeColumns);
3002 const auto &treename = parsedTreePath.fTreeName;
3003 const auto &dirname = parsedTreePath.fDirName;
3005 auto snapHelperArgs = std::make_shared<RDFInternal::SnapshotHelperArgs>(RDFInternal::SnapshotHelperArgs{
3006 std::string(
filename), std::string(dirname), std::string(treename), columnListWithoutSizeColumns, options});
3016 fullTreeName,
filename, columnListWithoutSizeColumns,
false));
3020 auto resPtr =
CreateAction<RDFInternal::ActionTags::Snapshot, ColumnTypes...>(validCols, newRDF, snapHelperArgs,
3030 template <
typename... ColTypes, std::size_t... S>
3036 constexpr bool areCopyConstructible =
3037 RDFInternal::TEvalAnd<std::is_copy_constructible<ColTypes>::value...>
::value;
3038 static_assert(areCopyConstructible,
"Columns of a type which is not copy constructible cannot be cached yet.");
3042 auto colHolders = std::make_tuple(Take<ColTypes>(columnListWithoutSizeColumns[S])...);
3043 auto ds = std::make_unique<
RLazyDS<ColTypes...>>(
3044 std::make_pair(columnListWithoutSizeColumns[S], std::get<S>(colHolders))...);
3051 template <
bool IsSingleColumn,
typename F>
3054 const std::vector<std::string> &variationTags, std::string_view variationName)
3056 using F_t = std::decay_t<F>;
3057 using ColTypes_t =
typename TTraits::CallableTraits<F_t>::arg_types;
3058 using RetType =
typename TTraits::CallableTraits<F_t>::ret_type;
3059 constexpr auto nColumns = ColTypes_t::list_size;
3061 SanityChecksForVary<RetType>(colNames, variationTags, variationName);
3067 if (retTypeName.empty()) {
3071 retTypeName =
"CLING_UNKNOWN_TYPE_" + demangledType;
3074 auto variation = std::make_shared<RDFInternal::RVariation<F_t, IsSingleColumn>>(
3079 newCols.AddVariation(std::move(variation));
3083 return newInterface;
3087 const std::vector<std::string> &variationTags,
3088 std::string_view variationName,
bool isSingleColumn)
3090 R__ASSERT(!variationTags.empty() &&
"Must have at least one variation.");
3091 R__ASSERT(!colNames.empty() &&
"Must have at least one varied column.");
3092 R__ASSERT(!variationName.empty() &&
"Must provide a variation name.");
3094 for (
auto &colName : colNames) {
3102 if (colNames.size() > 1) {
3103 std::set<std::string> uniqueCols(colNames.begin(), colNames.end());
3104 if (uniqueCols.size() != colNames.size())
3105 throw std::logic_error(
"A column name was passed to the same Vary invocation multiple times.");
3109 auto jittedVariation =
3114 newColRegister.
AddVariation(std::move(jittedVariation));
3118 return newInterface;
3121 template <
typename Helper,
typename ActionResultType>
3123 const std::shared_ptr<Helper> &hPtr,
3127 return CreateAction<RDFInternal::ActionTags::Book>({}, resPtr, hPtr,
fProxiedPtr, 0u);
3130 template <
typename Helper,
typename ActionResultType,
typename... Others>
3131 RResultPtr<ActionResultType>
3133 const std::shared_ptr<Helper>& ,
3136 throw std::logic_error(std::string(
"An action was booked with no input columns, but the action requires "
3137 "columns! The action helper type was ") +
3138 typeid(Helper).
name());
unsigned long long ULong64_t
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Base class for action helpers, see RInterface::Book() for more information.
The head node of a RDF computation graph.
Helper class that provides the operation graph nodes.
A RDataFrame node that produces a result.
A binder for user-defined columns, variations and aliases.
std::vector< std::string_view > GenerateColumnNames() const
Return the list of the names of the defined columns (Defines + Aliases).
void AddVariation(std::shared_ptr< RVariationBase > variation)
Register a new systematic variation.
void AddDefine(std::shared_ptr< RDFDetail::RDefineBase > column)
Add a new defined column.
The dataset specification for RDataFrame.
virtual const std::vector< std::string > & GetColumnNames() const =0
Returns a reference to the collection of the dataset's column names.
ColumnNames_t GetValidatedColumnNames(const unsigned int nColumns, const ColumnNames_t &columns)
ColumnNames_t GetColumnTypeNamesList(const ColumnNames_t &columnList)
std::shared_ptr< ROOT::Detail::RDF::RLoopManager > fLoopManager
< The RLoopManager at the root of this computation graph. Never null.
RResultPtr< ActionResultType > CreateAction(const ColumnNames_t &columns, const std::shared_ptr< ActionResultType > &r, const std::shared_ptr< HelperArgType > &helperArg, const std::shared_ptr< RDFNode > &proxiedPtr, const int=-1)
Create RAction object, return RResultPtr for the action Overload for the case in which all column typ...
RDataSource * fDataSource
Non-owning pointer to a data-source object. Null if no data-source. RLoopManager has ownership of the...
void CheckAndFillDSColumns(ColumnNames_t validCols, TTraits::TypeList< ColumnTypes... > typeList)
void CheckIMTDisabled(std::string_view callerName)
ColumnNames_t GetColumnNames()
Returns the names of the available columns.
RDFInternal::RColumnRegister fColRegister
Contains the columns defined up to this node.
The public interface to the RDataFrame federation of classes.
RResultPtr<::THnD > HistoND(const THnDModel &model, const ColumnNames_t &columnList)
Fill and return an N-dimensional histogram (lazy action).
RInterface(const RInterface &)=default
Copy-ctor for RInterface.
RResultPtr<::TH1D > Histo1D(std::string_view vName, std::string_view wName)
Fill and return a one-dimensional histogram with the weighted values of a column (lazy action).
RInterface(const std::shared_ptr< Proxied > &proxied, RLoopManager &lm, const RDFInternal::RColumnRegister &colRegister)
RResultPtr<::TH1D > Histo1D(const TH1DModel &model={"", "", 128u, 0., 0.})
Fill and return a one-dimensional histogram with the weighted values of a column (lazy action).
RResultPtr<::TH2D > Histo2D(const TH2DModel &model)
RResultPtr<::TProfile > Profile1D(const TProfile1DModel &model, std::string_view v1Name="", std::string_view v2Name="")
Fill and return a one-dimensional profile (lazy action).
RResultPtr<::THnD > HistoND(const THnDModel &model, const ColumnNames_t &columnList)
Fill and return an N-dimensional histogram (lazy action).
std::enable_if_t<!IsFStringConv &&!IsRetTypeDefConstr, RInterface< Proxied, DS_t > > DefineImpl(std::string_view, F, const ColumnNames_t &, const std::string &)
RResultPtr< RInterface< RLoopManager > > Snapshot(std::string_view treename, std::string_view filename, std::string_view columnNameRegexp="", const RSnapshotOptions &options=RSnapshotOptions())
Save selected columns to disk, in a new TTree treename in file filename.
RResultPtr< TStatistic > Stats(std::string_view value="")
Return a TStatistic object, filled once per event (lazy action).
RInterface< Proxied, DS_t > Vary(std::string_view colName, F &&expression, const ColumnNames_t &inputColumns, std::size_t nVariations, std::string_view variationName="")
Register systematic variations for a single existing column using auto-generated variation tags.
RInterface< Proxied, DS_t > Vary(std::string_view colName, std::string_view expression, std::size_t nVariations, std::string_view variationName="")
Register systematic variations for a single existing column using auto-generated variation tags.
RResultPtr<::TGraph > Graph(std::string_view x="", std::string_view y="")
Fill and return a TGraph object (lazy action).
RResultPtr< ActionResultType > CallCreateActionWithoutColsIfPossible(const std::shared_ptr< ActionResultType > &, const std::shared_ptr< Helper > &, Others...)
RInterface< Proxied, DS_t > DefineSlot(std::string_view name, F expression, const ColumnNames_t &columns={})
Define a new column with a value dependent on the processing slot.
RResultPtr< double > StdDev(std::string_view columnName="")
Return the unbiased standard deviation of processed column values (lazy action).
std::enable_if_t< std::is_default_constructible< RetType >::value, RInterface< Proxied, DS_t > > DefineImpl(std::string_view name, F &&expression, const ColumnNames_t &columns, const std::string &where)
RInterface< Proxied, DS_t > DefinePerSample(std::string_view name, F expression)
Define a new column that is updated when the input sample changes.
RInterface & operator=(RInterface &&)=default
Move-assignment operator for RInterface.
RInterface< Proxied, DS_t > Vary(const std::vector< std::string > &colNames, F &&expression, const ColumnNames_t &inputColumns, std::size_t nVariations, std::string_view variationName)
Register systematic variations for multiple existing columns using auto-generated tags.
void ForeachSlot(F f, const ColumnNames_t &columns={})
Execute a user-defined function requiring a processing slot index on each entry (instant action).
RInterface< Proxied, DS_t > Vary(std::string_view colName, std::string_view expression, const std::vector< std::string > &variationTags, std::string_view variationName="")
Register systematic variations for a single existing column using custom variation tags.
RResultPtr< RDisplay > Display(const ColumnNames_t &columnList, size_t nRows=5, size_t nMaxCollectionElements=10)
Provides a representation of the columns in the dataset.
RInterface< RLoopManager > Cache(const ColumnNames_t &columnList)
Save selected columns in memory.
RInterface< Proxied, DS_t > Define(std::string_view name, F expression, const ColumnNames_t &columns={})
Define a new column.
RResultPtr< TStatistic > Stats(std::string_view value, std::string_view weight)
Return a TStatistic object, filled once per event (lazy action).
RInterface< Proxied, DS_t > Redefine(std::string_view name, std::string_view expression)
Overwrite the value and/or type of an existing column.
auto CallCreateActionWithoutColsIfPossible(const std::shared_ptr< ActionResultType > &resPtr, const std::shared_ptr< Helper > &hPtr, TTraits::TypeList< RDFDetail::RInferredType >) -> decltype(hPtr->Exec(0u), RResultPtr< ActionResultType >{})
RInterface< Proxied, DS_t > Vary(const std::vector< std::string > &colNames, std::string_view expression, std::size_t nVariations, std::string_view variationName)
Register systematic variations for multiple existing columns using auto-generated variation tags.
RResultPtr<::TH2D > Histo2D(const TH2DModel &model, std::string_view v1Name="", std::string_view v2Name="")
Fill and return a two-dimensional histogram (lazy action).
RResultPtr< RInterface< RLoopManager > > SnapshotImpl(std::string_view fullTreeName, std::string_view filename, const ColumnNames_t &columnList, const RSnapshotOptions &options)
RInterface< Proxied, DS_t > Vary(std::initializer_list< std::string > colNames, F &&expression, const ColumnNames_t &inputColumns, const std::vector< std::string > &variationTags, std::string_view variationName)
Register systematic variations for multiple existing columns using custom variation tags.
RResultPtr<::TProfile > Profile1D(const TProfile1DModel &model)
Fill and return a one-dimensional profile (lazy action).
RInterface(const std::shared_ptr< RLoopManager > &proxied)
Build a RInterface from a RLoopManager.
RInterface< RDFDetail::RFilter< F, Proxied >, DS_t > Filter(F f, const std::initializer_list< std::string > &columns)
Append a filter to the call graph.
RInterface< Proxied, DS_t > DefinePerSample(std::string_view name, std::string_view expression)
Define a new column that is updated when the input sample changes.
RResultPtr< double > Mean(std::string_view columnName="")
Return the mean of processed column values (lazy action).
RResultPtr< RInterface< RLoopManager > > Snapshot(std::string_view treename, std::string_view filename, std::initializer_list< std::string > columnList, const RSnapshotOptions &options=RSnapshotOptions())
Save selected columns to disk, in a new TTree treename in file filename.
RResultPtr< RDisplay > Display(std::initializer_list< std::string > columnList, size_t nRows=5, size_t nMaxCollectionElements=10)
Provides a representation of the columns in the dataset.
RInterface< Proxied, DS_t > Alias(std::string_view alias, std::string_view columnName)
Allow to refer to a column with a different name.
RInterface< RLoopManager > Cache(const ColumnNames_t &columnList)
Save selected columns in memory.
RInterface< Proxied, DS_t > Redefine(std::string_view name, F expression, const ColumnNames_t &columns={})
Overwrite the value and/or type of an existing column.
RInterface< RLoopManager > Cache(std::string_view columnNameRegexp="")
Save selected columns in memory.
RInterface< Proxied, DS_t > VaryImpl(const std::vector< std::string > &colNames, F &&expression, const ColumnNames_t &inputColumns, const std::vector< std::string > &variationTags, std::string_view variationName)
RResultPtr< typename std::decay_t< Helper >::Result_t > Book(Helper &&helper, const ColumnNames_t &columns={})
Book execution of a custom action using a user-defined helper object.
RResultPtr< RDisplay > Display(std::string_view columnNameRegexp="", size_t nRows=5, size_t nMaxCollectionElements=10)
Provides a representation of the columns in the dataset.
friend class RDFInternal::GraphDrawing::GraphCreatorHelper
RResultPtr<::TH2D > Histo2D(const TH2DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view wName)
Fill and return a weighted two-dimensional histogram (lazy action).
RInterface & operator=(const RInterface &)=default
Copy-assignment operator for RInterface.
RResultPtr< RDFDetail::SumReturnType_t< T > > Sum(std::string_view columnName="", const RDFDetail::SumReturnType_t< T > &initValue=RDFDetail::SumReturnType_t< T >{})
Return the sum of processed column values (lazy action).
RInterface< Proxied, DS_t > Vary(std::string_view colName, F &&expression, const ColumnNames_t &inputColumns, const std::vector< std::string > &variationTags, std::string_view variationName="")
Register systematic variations for a single existing column using custom variation tags.
RResultPtr< ULong64_t > Count()
Return the number of entries processed (lazy action).
RInterface< Proxied, DS_t > Vary(const std::vector< std::string > &colNames, std::string_view expression, const std::vector< std::string > &variationTags, std::string_view variationName)
Register systematic variations for multiple existing columns using custom variation tags.
RInterface< Proxied, DS_t > Define(std::string_view name, std::string_view expression)
Define a new column.
std::shared_ptr< Proxied > fProxiedPtr
Smart pointer to the graph node encapsulated by this RInterface.
RResultPtr<::TH1D > Histo1D(std::string_view vName)
Fill and return a one-dimensional histogram with the values of a column (lazy action).
RInterface< Proxied, DS_t > Vary(const std::vector< std::string > &colNames, F &&expression, const ColumnNames_t &inputColumns, const std::vector< std::string > &variationTags, std::string_view variationName)
Register systematic variations for multiple existing columns using custom variation tags.
RInterface< Proxied, DS_t > RedefineSlotEntry(std::string_view name, F expression, const ColumnNames_t &columns={})
Overwrite the value and/or type of an existing column.
RResultPtr<::TH1D > Histo1D(const TH1DModel &model, std::string_view vName, std::string_view wName)
Fill and return a one-dimensional histogram with the weighted values of a column (lazy action).
RInterface< RLoopManager > CacheImpl(const ColumnNames_t &columnList, std::index_sequence< S... >)
Implementation of cache.
RInterface< RDFDetail::RRange< Proxied >, DS_t > Range(unsigned int end)
Creates a node that filters entries based on range.
RResultPtr< COLL > Take(std::string_view column="")
Return a collection of values of a column (lazy action, returns a std::vector by default).
RInterface< RLoopManager > Cache(std::initializer_list< std::string > columnList)
Save selected columns in memory.
RResultPtr<::TProfile2D > Profile2D(const TProfile2DModel &model, std::string_view v1Name="", std::string_view v2Name="", std::string_view v3Name="")
Fill and return a two-dimensional profile (lazy action).
const std::shared_ptr< Proxied > & GetProxiedPtr() const
RInterface< Proxied, DS_t > JittedVaryImpl(const std::vector< std::string > &colNames, std::string_view expression, const std::vector< std::string > &variationTags, std::string_view variationName, bool isSingleColumn)
RResultPtr<::TH3D > Histo3D(const TH3DModel &model, std::string_view v1Name="", std::string_view v2Name="", std::string_view v3Name="")
Fill and return a three-dimensional histogram (lazy action).
RInterface< Proxied, DS_t > Vary(std::initializer_list< std::string > colNames, F &&expression, const ColumnNames_t &inputColumns, std::size_t nVariations, std::string_view variationName)
Register systematic variations for for multiple existing columns using custom variation tags.
RResultPtr< std::decay_t< T > > Fill(T &&model, const ColumnNames_t &columnList)
Return an object of type T on which T::Fill will be called once per event (lazy action).
RResultPtr< RInterface< RLoopManager > > Snapshot(std::string_view treename, std::string_view filename, const ColumnNames_t &columnList, const RSnapshotOptions &options=RSnapshotOptions())
Save selected columns to disk, in a new TTree treename in file filename.
RResultPtr< RDisplay > Display(const ColumnNames_t &columnList, size_t nRows=5, size_t nMaxCollectionElements=10)
Provides a representation of the columns in the dataset.
RResultPtr< RCutFlowReport > Report()
Gather filtering statistics.
RInterface< Proxied, DS_t > RedefineSlot(std::string_view name, F expression, const ColumnNames_t &columns={})
Overwrite the value and/or type of an existing column.
RResultPtr<::TProfile2D > Profile2D(const TProfile2DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view v3Name, std::string_view wName)
Fill and return a two-dimensional profile (lazy action).
RResultPtr<::TGraphAsymmErrors > GraphAsymmErrors(std::string_view x="", std::string_view y="", std::string_view exl="", std::string_view exh="", std::string_view eyl="", std::string_view eyh="")
Fill and return a TGraphAsymmErrors object (lazy action).
RResultPtr< RInterface< RLoopManager > > Snapshot(std::string_view treename, std::string_view filename, const ColumnNames_t &columnList, const RSnapshotOptions &options=RSnapshotOptions())
Save selected columns to disk, in a new TTree treename in file filename.
RResultPtr< U > Aggregate(AccFun aggregator, MergeFun merger, std::string_view columnName="")
Execute a user-defined accumulation operation on the processed column values in each processing slot.
RInterface< Proxied, DS_t > DefineSlotEntry(std::string_view name, F expression, const ColumnNames_t &columns={})
Define a new column with a value dependent on the processing slot and the current entry.
RResultPtr< RDFDetail::MinReturnType_t< T > > Min(std::string_view columnName="")
Return the minimum of processed column values (lazy action).
RResultPtr< T > Reduce(F f, std::string_view columnName="")
Execute a user-defined reduce operation on the values of a column.
void Foreach(F f, const ColumnNames_t &columns={})
Execute a user-defined function on each entry (instant action).
RInterface< RDFDetail::RJittedFilter, DS_t > Filter(std::string_view expression, std::string_view name="")
Append a filter to the call graph.
RResultPtr<::TProfile2D > Profile2D(const TProfile2DModel &model)
Fill and return a two-dimensional profile (lazy action).
RInterface< RDFDetail::RFilter< F, Proxied >, DS_t > Filter(F f, const ColumnNames_t &columns={}, std::string_view name="")
Append a filter to the call graph.
RResultPtr< U > Aggregate(AccFun aggregator, MergeFun merger, std::string_view columnName, const U &aggIdentity)
Execute a user-defined accumulation operation on the processed column values in each processing slot.
RInterface(RInterface &&)=default
Move-ctor for RInterface.
RResultPtr< T > Reduce(F f, std::string_view columnName, const T &redIdentity)
Execute a user-defined reduce operation on the values of a column.
RResultPtr<::TH3D > Histo3D(const TH3DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view v3Name, std::string_view wName)
Fill and return a three-dimensional histogram (lazy action).
RInterface< RDFDetail::RFilter< F, Proxied >, DS_t > Filter(F f, std::string_view name)
Append a filter to the call graph.
RInterface< RDFDetail::RRange< Proxied >, DS_t > Range(unsigned int begin, unsigned int end, unsigned int stride=1)
Creates a node that filters entries based on range: [begin, end).
std::vector< std::string > GetFilterNames()
Returns the names of the filters created.
RResultPtr<::TH1D > Histo1D(const TH1DModel &model={"", "", 128u, 0., 0.}, std::string_view vName="")
Fill and return a one-dimensional histogram with the values of a column (lazy action).
RResultPtr<::TProfile > Profile1D(const TProfile1DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view wName)
Fill and return a one-dimensional profile (lazy action).
RResultPtr<::TH3D > Histo3D(const TH3DModel &model)
RResultPtr< RDFDetail::MaxReturnType_t< T > > Max(std::string_view columnName="")
Return the maximum of processed column values (lazy action).
RInterface< Proxied, DS_t > Vary(std::initializer_list< std::string > colNames, std::string_view expression, std::size_t nVariations, std::string_view variationName)
Register systematic variations for multiple existing columns using auto-generated variation tags.
A RDataSource implementation which is built on top of result proxies.
Smart pointer for the return type of actions.
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
typename RemoveFirstParameter< T >::type RemoveFirstParameter_t
TDirectory::TContext keeps track and restore the current directory.
A TGraph is an object made of two arrays X and Y with npoints each.
Statistical variable, defined by its mean and variance (RMS).
std::shared_ptr< ROOT::Detail::RDF::RLoopManager > CreateLMFromTTree(std::string_view datasetName, std::string_view fileNameGlob, const std::vector< std::string > &defaultColumns, bool checkFile=true)
Create an RLoopManager that reads a TChain.
void CheckForNoVariations(const std::string &where, std::string_view definedColView, const RColumnRegister &colRegister)
Throw if the column has systematic variations attached.
ParsedTreePath ParseTreePath(std::string_view fullTreeName)
void CheckForRedefinition(const std::string &where, std::string_view definedColView, const RColumnRegister &colRegister, const ColumnNames_t &treeColumns, const ColumnNames_t &dataSourceColumns)
Throw if column definedColView is already there.
void CheckForDefinition(const std::string &where, std::string_view definedColView, const RColumnRegister &colRegister, const ColumnNames_t &treeColumns, const ColumnNames_t &dataSourceColumns)
Throw if column definedColView is not already there.
void ChangeEmptyEntryRange(const ROOT::RDF::RNode &node, std::pair< ULong64_t, ULong64_t > &&newRange)
std::shared_ptr< RJittedDefine > BookDefineJit(std::string_view name, std::string_view expression, RLoopManager &lm, RDataSource *ds, const RColumnRegister &colRegister, const ColumnNames_t &branches, std::shared_ptr< RNodeBase > *upcastNodeOnHeap)
Book the jitting of a Define call.
void CheckValidCppVarName(std::string_view var, const std::string &where)
void ChangeSpec(const ROOT::RDF::RNode &node, ROOT::RDF::Experimental::RDatasetSpec &&spec)
Changes the input dataset specification of an RDataFrame.
void RemoveDuplicates(ColumnNames_t &columnNames)
std::shared_ptr< RNodeBase > UpcastNode(std::shared_ptr< RNodeBase > ptr)
std::string TypeID2TypeName(const std::type_info &id)
Returns the name of a type starting from its type_info An empty string is returned in case of failure...
std::vector< std::string > GetFilterNames(const std::shared_ptr< RLoopManager > &loopManager)
std::string PrettyPrintAddr(const void *const addr)
void TriggerRun(ROOT::RDF::RNode node)
Trigger the execution of an RDataFrame computation graph.
void CheckTypesAndPars(unsigned int nTemplateParams, unsigned int nColumnNames)
std::string DemangleTypeIdName(const std::type_info &typeInfo)
bool AtLeastOneEmptyString(const std::vector< std::string_view > strings)
std::shared_ptr< RDFDetail::RJittedFilter > BookFilterJit(std::shared_ptr< RDFDetail::RNodeBase > *prevNodeOnHeap, std::string_view name, std::string_view expression, const ColumnNames_t &branches, const RColumnRegister &colRegister, TTree *tree, RDataSource *ds)
Book the jitting of a Filter call.
ColumnNames_t FilterArraySizeColNames(const ColumnNames_t &columnNames, const std::string &action)
Take a list of column names, return that list with entries starting by '#' filtered out.
std::shared_ptr< RJittedVariation > BookVariationJit(const std::vector< std::string > &colNames, std::string_view variationName, const std::vector< std::string > &variationTags, std::string_view expression, RLoopManager &lm, RDataSource *ds, const RColumnRegister &colRegister, const ColumnNames_t &branches, std::shared_ptr< RNodeBase > *upcastNodeOnHeap, bool isSingleColumn)
Book the jitting of a Vary call.
void CheckForDuplicateSnapshotColumns(const ColumnNames_t &cols)
ColumnNames_t ConvertRegexToColumns(const ColumnNames_t &colNames, std::string_view columnNameRegexp, std::string_view callerName)
std::pair< std::vector< std::string >, std::vector< std::string > > AddSizeBranches(const std::vector< std::string > &branches, TTree *tree, std::vector< std::string > &&colsWithoutAliases, std::vector< std::string > &&colsWithAliases)
Return copies of colsWithoutAliases and colsWithAliases with size branches for variable-sized array b...
std::shared_ptr< RJittedDefine > BookDefinePerSampleJit(std::string_view name, std::string_view expression, RLoopManager &lm, const RColumnRegister &colRegister, std::shared_ptr< RNodeBase > *upcastNodeOnHeap)
Book the jitting of a DefinePerSample call.
std::vector< std::string > GetTopLevelBranchNames(TTree &t)
Get all the top-level branches names, including the ones of the friend trees.
RInterface<::ROOT::Detail::RDF::RNodeBase, void > RNode
std::vector< std::string > ColumnNames_t
ROOT type_traits extensions.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
void DisableImplicitMT()
Disables the implicit multi-threading in ROOT (see EnableImplicitMT).
type is TypeList if MustRemove is false, otherwise it is a TypeList with the first type removed
A collection of options to steer the creation of the dataset on file.
bool fLazy
Do not start the event loop when Snapshot is called.
A struct which stores the parameters of a TH1D.
std::shared_ptr<::TH1D > GetHistogram() const
A struct which stores the parameters of a TH2D.
std::shared_ptr<::TH2D > GetHistogram() const
A struct which stores the parameters of a TH3D.
std::shared_ptr<::TH3D > GetHistogram() const
A struct which stores the parameters of a THnD.
std::shared_ptr<::THnD > GetHistogram() const
A struct which stores the parameters of a TProfile.
std::shared_ptr<::TProfile > GetProfile() const
A struct which stores the parameters of a TProfile2D.
std::shared_ptr<::TProfile2D > GetProfile() const
Lightweight storage for a collection of types.