11#ifndef ROOT_RDF_TINTERFACE 
   12#define ROOT_RDF_TINTERFACE 
   47#include <initializer_list> 
   57#include <unordered_set> 
   85template <
typename Proxied, 
typename DataSource>
 
   88using RNode = RInterface<::ROOT::Detail::RDF::RNodeBase, void>;
 
  102template <
typename Proxied, 
typename DataSource = 
void>
 
  111   template <
typename T, 
typename W>
 
  138   template <typename T = Proxied, typename = std::enable_if_t<std::is_same<T, RLoopManager>::value, 
int>>
 
  205   template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value, 
int> = 0>
 
  209      RDFInternal::CheckFilter(
f);
 
  210      using ColTypes_t = 
typename TTraits::CallableTraits<F>::arg_types;
 
  211      constexpr auto nColumns = ColTypes_t::list_size;
 
  229   template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value, 
int> = 0>
 
  245   template <
typename F>
 
  280      using BaseNodeType_t = 
typename std::remove_pointer_t<
decltype(upcastNodeOnHeap)>::element_type;
 
  282      const auto jittedFilter =
 
  328   template <typename F, typename std::enable_if_t<!std::is_convertible<F, std::string>::value, 
int> = 0>
 
  331      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::None>(
name, std::move(expression), columns, 
"Define");
 
  357   template <
typename F>
 
  360      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::Slot>(
name, std::move(expression), columns, 
"DefineSlot");
 
  387   template <
typename F>
 
  390      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::SlotAndEntry>(
name, std::move(expression), columns,
 
  418      constexpr auto where = 
"Define";
 
  429      newCols.
AddDefine(std::move(jittedDefine));
 
  447   template <typename F, std::enable_if_t<!std::is_convertible<F, std::string>::value, 
int> = 0>
 
  450      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::None>(
name, std::move(expression), columns, 
"Redefine");
 
  466   template <
typename F>
 
  469      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::Slot>(
name, std::move(expression), columns, 
"RedefineSlot");
 
  485   template <
typename F>
 
  488      return DefineImpl<F, RDFDetail::ExtraArgsForDefine::SlotAndEntry>(
name, std::move(expression), columns,
 
  489                                                                        "RedefineSlotEntry");
 
  508      constexpr auto where = 
"Redefine";
 
  519      newCols.
AddDefine(std::move(jittedDefine));
 
  556   template <typename F, typename RetType_t = typename TTraits::CallableTraits<F>::ret_type>
 
  564      if (retTypeName.empty()) {
 
  568         retTypeName = 
"CLING_UNKNOWN_TYPE_" + demangledType;
 
  572         std::make_shared<RDFDetail::RDefinePerSample<F>>(
name, retTypeName, std::move(expression), *
fLoopManager);
 
  575      newCols.AddDefine(std::move(newColumn));
 
  630      newCols.
AddDefine(std::move(jittedDefine));
 
  669   template <
typename F>
 
  671                                  const std::vector<std::string> &variationTags, std::string_view variationName = 
"")
 
  673      std::vector<std::string> colNames{{std::string(colName)}};
 
  674      const std::string theVariationName{variationName.empty() ? colName : variationName};
 
  676      return VaryImpl<true>(std::move(colNames), std::forward<F>(expression), inputColumns, variationTags,
 
  684   template <
typename F>
 
  686                                  std::size_t nVariations, std::string_view variationName = 
"")
 
  688      R__ASSERT(nVariations > 0 && 
"Must have at least one variation.");
 
  690      std::vector<std::string> variationTags;
 
  691      variationTags.reserve(nVariations);
 
  692      for (std::size_t i = 0u; i < nVariations; ++i)
 
  693         variationTags.emplace_back(std::to_string(i));
 
  695      const std::string theVariationName{variationName.empty() ? colName : variationName};
 
  697      return Vary(colName, std::forward<F>(expression), inputColumns, std::move(variationTags), theVariationName);
 
  714   template <
typename F>
 
  717        const std::vector<std::string> &variationTags, std::string_view variationName)
 
  719      return VaryImpl<false>(colNames, std::forward<F>(expression), inputColumns, variationTags, variationName);
 
  723   template <
typename F>
 
  726        const std::vector<std::string> &variationTags, std::string_view variationName)
 
  728      return Vary(std::vector<std::string>(colNames), std::forward<F>(expression), inputColumns, variationTags, variationName);
 
  735   template <
typename F>
 
  738        std::size_t nVariations, std::string_view variationName)
 
  740      R__ASSERT(nVariations > 0 && 
"Must have at least one variation.");
 
  742      std::vector<std::string> variationTags;
 
  743      variationTags.reserve(nVariations);
 
  744      for (std::size_t i = 0u; i < nVariations; ++i)
 
  745         variationTags.emplace_back(std::to_string(i));
 
  747      return Vary(colNames, std::forward<F>(expression), inputColumns, std::move(variationTags), variationName);
 
  751   template <
typename F>
 
  754        std::size_t nVariations, std::string_view variationName)
 
  756      return Vary(std::vector<std::string>(colNames), std::forward<F>(expression), inputColumns, nVariations, variationName);
 
  779                                  const std::vector<std::string> &variationTags, std::string_view variationName = 
"")
 
  781      std::vector<std::string> colNames{{std::string(colName)}};
 
  782      const std::string theVariationName{variationName.empty() ? colName : variationName};
 
  784      return JittedVaryImpl(colNames, expression, variationTags, theVariationName, 
true);
 
  797                                  std::string_view variationName = 
"")
 
  799      std::vector<std::string> variationTags;
 
  800      variationTags.reserve(nVariations);
 
  801      for (std::size_t i = 0u; i < nVariations; ++i)
 
  802         variationTags.emplace_back(std::to_string(i));
 
  804      return Vary(colName, expression, std::move(variationTags), variationName);
 
  825                                  std::size_t nVariations, std::string_view variationName)
 
  827      std::vector<std::string> variationTags;
 
  828      variationTags.reserve(nVariations);
 
  829      for (std::size_t i = 0u; i < nVariations; ++i)
 
  830         variationTags.emplace_back(std::to_string(i));
 
  832      return Vary(colNames, expression, std::move(variationTags), variationName);
 
  837                                  std::size_t nVariations, std::string_view variationName)
 
  839      return Vary(std::vector<std::string>(colNames), expression, nVariations, variationName);
 
  860                                  const std::vector<std::string> &variationTags, std::string_view variationName)
 
  862      return JittedVaryImpl(colNames, expression, variationTags, variationName, 
false);
 
  886      constexpr auto where = 
"Alias";
 
  894      newCols.AddAlias(alias, validColumnName);
 
  960   template <
typename... ColumnTypes>
 
  990      const auto pairOfColumnLists =
 
  992                                      std::move(colListNoAliases), std::move(colListNoPoundSizes));
 
  993      const auto &colListNoAliasesWithSizeBranches = pairOfColumnLists.first;
 
  994      const auto &colListWithAliasesAndSizeBranches = pairOfColumnLists.second;
 
  997      const auto fullTreeName = treename;
 
  999      treename = parsedTreePath.fTreeName;
 
 1000      const auto &dirname = parsedTreePath.fDirName;
 
 1002      auto snapHelperArgs = std::make_shared<RDFInternal::SnapshotHelperArgs>(
 
 1003         RDFInternal::SnapshotHelperArgs{std::string(
filename), std::string(dirname), std::string(treename),
 
 1004                                         colListWithAliasesAndSizeBranches, options});
 
 1007      auto newRDF = std::make_shared<ROOT::RDataFrame>(fullTreeName, 
filename, colListNoAliasesWithSizeBranches);
 
 1009      auto resPtr = CreateAction<RDFInternal::ActionTags::Snapshot, RDFDetail::RInferredType>(
 
 1010         colListNoAliasesWithSizeBranches, newRDF, snapHelperArgs, 
fProxiedPtr,
 
 1011         colListNoAliasesWithSizeBranches.size());
 
 1032                                                 std::string_view columnNameRegexp = 
"",
 
 1041      std::copy_if(dsColumns.begin(), dsColumns.end(), std::back_inserter(dsColumnsWithoutSizeColumns),
 
 1042                   [](
const std::string &
name) { return name.size() < 13 || name.substr(0, 13) != 
"R_rdf_sizeof_"; });
 
 1044      columnNames.reserve(definedColumns.size() + treeBranchNames.size() + dsColumnsWithoutSizeColumns.size());
 
 1045      columnNames.insert(columnNames.end(), definedColumns.begin(), definedColumns.end());
 
 1046      columnNames.insert(columnNames.end(), treeBranchNames.begin(), treeBranchNames.end());
 
 1047      columnNames.insert(columnNames.end(), dsColumnsWithoutSizeColumns.begin(), dsColumnsWithoutSizeColumns.end());
 
 1072                                                 std::initializer_list<std::string> columnList,
 
 1114   template <
typename... ColumnTypes>
 
 1117      auto staticSeq = std::make_index_sequence<
sizeof...(ColumnTypes)>();
 
 1118      return CacheImpl<ColumnTypes...>(columnList, staticSeq);
 
 1131      if (columnList.empty()) {
 
 1132         auto nEntries = *this->
Count();
 
 1137      std::stringstream cacheCall;
 
 1144      cacheCall << 
"*reinterpret_cast<ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager>*>(" 
 1146                << 
") = reinterpret_cast<ROOT::RDF::RInterface<ROOT::Detail::RDF::RNodeBase>*>(" 
 1151      const auto validColumnNames =
 
 1155      for (
const auto &colType : colTypes)
 
 1156         cacheCall << colType << 
", ";
 
 1157      if (!columnListWithoutSizeColumns.empty())
 
 1158         cacheCall.seekp(-2, cacheCall.cur);                         
 
 1159      cacheCall << 
">(*reinterpret_cast<std::vector<std::string>*>("  
 1180      const auto treeBranchNames =
 
 1185      std::copy_if(dsColumns.begin(), dsColumns.end(), std::back_inserter(dsColumnsWithoutSizeColumns),
 
 1186                   [](
const std::string &
name) { return name.size() < 13 || name.substr(0, 13) != 
"R_rdf_sizeof_"; });
 
 1188      columnNames.reserve(definedColumns.size() + treeBranchNames.size() + dsColumns.size());
 
 1189      columnNames.insert(columnNames.end(), definedColumns.begin(), definedColumns.end());
 
 1190      columnNames.insert(columnNames.end(), treeBranchNames.begin(), treeBranchNames.end());
 
 1191      columnNames.insert(columnNames.end(), dsColumns.begin(), dsColumns.end());
 
 1193      return Cache(selectedColumns);
 
 1205      return Cache(selectedColumns);
 
 1229      if (stride == 0 || (end != 0 && end < begin))
 
 1230         throw std::runtime_error(
"Range: stride must be strictly greater than 0 and end must be greater than begin.");
 
 1234      auto rangePtr = std::make_shared<Range_t>(begin, end, stride, 
fProxiedPtr);
 
 1236      return newInterface;
 
 1266   template <
typename F>
 
 1269      using arg_types = 
typename TTraits::CallableTraits<
decltype(
f)>::arg_types_nodecay;
 
 1270      using ret_type = 
typename TTraits::CallableTraits<
decltype(
f)>::ret_type;
 
 1271      ForeachSlot(RDFInternal::AddSlotParameter<ret_type>(
f, arg_types()), columns);
 
 1296   template <
typename F>
 
 1300      constexpr auto nColumns = ColTypes_t::list_size;
 
 1305      using Helper_t = RDFInternal::ForeachSlotHelper<F>;
 
 1343   template <typename F, typename T = typename TTraits::CallableTraits<F>::ret_type>
 
 1347         std::is_default_constructible<T>::value,
 
 1348         "reduce object cannot be default-constructed. Please provide an initialisation value (redIdentity)");
 
 1349      return Reduce(std::move(
f), columnName, T());
 
 1366   template <typename F, typename T = typename TTraits::CallableTraits<F>::ret_type>
 
 1388      auto cSPtr = std::make_shared<ULong64_t>(0);
 
 1389      using Helper_t = RDFInternal::CountHelper;
 
 1393      return MakeResultPtr(cSPtr, *
fLoopManager, std::move(action));
 
 1416   template <
typename T, 
typename COLL = std::vector<T>>
 
 1424      using Helper_t = RDFInternal::TakeHelper<T, T, COLL>;
 
 1426      auto valuesPtr = std::make_shared<COLL>();
 
 1431      return MakeResultPtr(valuesPtr, *
fLoopManager, std::move(action));
 
 1459   template <
typename V = RDFDetail::RInferredType>
 
 1466      std::shared_ptr<::TH1D> 
h(
nullptr);
 
 1468         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1469         h = model.GetHistogram();
 
 1470         h->SetDirectory(
nullptr);
 
 1473      if (
h->GetXaxis()->GetXmax() == 
h->GetXaxis()->GetXmin())
 
 1474         RDFInternal::HistoUtils<::TH1D>::SetCanExtendAllAxes(*
h);
 
 1475      return CreateAction<RDFInternal::ActionTags::Histo1D, V>(validatedColumns, 
h, 
h, 
fProxiedPtr);
 
 1495   template <
typename V = RDFDetail::RInferredType>
 
 1498      const auto h_name = std::string(vName);
 
 1499      const auto h_title = h_name + 
";" + h_name + 
";count";
 
 1500      return Histo1D<V>({h_name.c_str(), h_title.c_str(), 128u, 0., 0.}, vName);
 
 1521   template <
typename V = RDFDetail::RInferredType, 
typename W = RDFDetail::RInferredType>
 
 1524      const std::vector<std::string_view> columnViews = {vName, wName};
 
 1528      std::shared_ptr<::TH1D> 
h(
nullptr);
 
 1530         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1533      return CreateAction<RDFInternal::ActionTags::Histo1D, V, W>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 1555   template <
typename V = RDFDetail::RInferredType, 
typename W = RDFDetail::RInferredType>
 
 1559      std::string str_vName{vName};
 
 1560      std::string str_wName{wName};
 
 1561      const auto h_name = str_vName + 
"_weighted_" + str_wName;
 
 1562      const auto h_title = str_vName + 
", weights: " + str_wName + 
";" + str_vName + 
";count * " + str_wName;
 
 1563      return Histo1D<V, W>({h_name.c_str(), h_title.c_str(), 128u, 0., 0.}, vName, wName);
 
 1575   template <
typename V, 
typename W>
 
 1578      return Histo1D<V, W>(model, 
"", 
"");
 
 1609   template <
typename V1 = RDFDetail::RInferredType, 
typename V2 = RDFDetail::RInferredType>
 
 1612      std::shared_ptr<::TH2D> 
h(
nullptr);
 
 1614         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1617      if (!RDFInternal::HistoUtils<::TH2D>::HasAxisLimits(*
h)) {
 
 1618         throw std::runtime_error(
"2D histograms with no axes limits are not supported yet.");
 
 1620      const std::vector<std::string_view> columnViews = {v1Name, v2Name};
 
 1624      return CreateAction<RDFInternal::ActionTags::Histo2D, V1, V2>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 1653   Histo2D(
const TH2DModel &model, std::string_view v1Name, std::string_view v2Name, std::string_view wName)
 
 1655      std::shared_ptr<::TH2D> 
h(
nullptr);
 
 1657         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1660      if (!RDFInternal::HistoUtils<::TH2D>::HasAxisLimits(*
h)) {
 
 1661         throw std::runtime_error(
"2D histograms with no axes limits are not supported yet.");
 
 1663      const std::vector<std::string_view> columnViews = {v1Name, v2Name, wName};
 
 1667      return CreateAction<RDFInternal::ActionTags::Histo2D, V1, V2, W>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 1670   template <
typename V1, 
typename V2, 
typename W>
 
 1673      return Histo2D<V1, V2, W>(model, 
"", 
"", 
"");
 
 1706                              std::string_view v3Name = 
"")
 
 1708      std::shared_ptr<::TH3D> 
h(
nullptr);
 
 1710         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1713      if (!RDFInternal::HistoUtils<::TH3D>::HasAxisLimits(*
h)) {
 
 1714         throw std::runtime_error(
"3D histograms with no axes limits are not supported yet.");
 
 1716      const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name};
 
 1720      return CreateAction<RDFInternal::ActionTags::Histo3D, V1, V2, V3>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 1755                              std::string_view v3Name, std::string_view wName)
 
 1757      std::shared_ptr<::TH3D> 
h(
nullptr);
 
 1759         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1762      if (!RDFInternal::HistoUtils<::TH3D>::HasAxisLimits(*
h)) {
 
 1763         throw std::runtime_error(
"3D histograms with no axes limits are not supported yet.");
 
 1765      const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name, wName};
 
 1769      return CreateAction<RDFInternal::ActionTags::Histo3D, V1, V2, V3, W>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 1772   template <
typename V1, 
typename V2, 
typename V3, 
typename W>
 
 1775      return Histo3D<V1, V2, V3, W>(model, 
"", 
"", 
"", 
"");
 
 1800   template <
typename FirstColumn, 
typename... OtherColumns> 
 
 1803      std::shared_ptr<::THnD> 
h(
nullptr);
 
 1805         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1808         if (
int(columnList.size()) == (
h->GetNdimensions() + 1)) {
 
 1810         } 
else if (
int(columnList.size()) != 
h->GetNdimensions()) {
 
 1811            throw std::runtime_error(
"Wrong number of columns for the specified number of histogram axes.");
 
 1814      return CreateAction<RDFInternal::ActionTags::HistoND, FirstColumn, OtherColumns...>(columnList, 
h, 
h,
 
 1837      std::shared_ptr<::THnD> 
h(
nullptr);
 
 1839         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1842         if (
int(columnList.size()) == (
h->GetNdimensions() + 1)) {
 
 1844         } 
else if (
int(columnList.size()) != 
h->GetNdimensions()) {
 
 1845            throw std::runtime_error(
"Wrong number of columns for the specified number of histogram axes.");
 
 1848      return CreateAction<RDFInternal::ActionTags::HistoND, RDFDetail::RInferredType>(columnList, 
h, 
h, 
fProxiedPtr,
 
 1880   template <
typename X = RDFDetail::RInferredType, 
typename Y = RDFDetail::RInferredType>
 
 1883      auto graph = std::make_shared<::TGraph>();
 
 1884      const std::vector<std::string_view> columnViews = {
x, 
y};
 
 1892      const auto g_name = validatedColumns[0] + 
"_vs_" + validatedColumns[1];
 
 1893      const auto g_title = validatedColumns[0] + 
" vs " + validatedColumns[1];
 
 1894      graph->SetNameTitle(g_name.c_str(), g_title.c_str());
 
 1895      graph->GetXaxis()->SetTitle(validatedColumns[0].c_str());
 
 1896      graph->GetYaxis()->SetTitle(validatedColumns[1].c_str());
 
 1898      return CreateAction<RDFInternal::ActionTags::Graph, X, Y>(validatedColumns, 
graph, 
graph, 
fProxiedPtr);
 
 1935                    std::string_view exh = 
"", std::string_view eyl = 
"", std::string_view eyh = 
"")
 
 1937      auto graph = std::make_shared<::TGraphAsymmErrors>();
 
 1938      const std::vector<std::string_view> columnViews = {
x, 
y, exl, exh, eyl, eyh};
 
 1946      const auto g_name = validatedColumns[0] + 
"_vs_" + validatedColumns[1];
 
 1947      const auto g_title = validatedColumns[0] + 
" vs " + validatedColumns[1];
 
 1948      graph->SetNameTitle(g_name.c_str(), g_title.c_str());
 
 1949      graph->GetXaxis()->SetTitle(validatedColumns[0].c_str());
 
 1950      graph->GetYaxis()->SetTitle(validatedColumns[1].c_str());
 
 1952      return CreateAction<RDFInternal::ActionTags::GraphAsymmErrors, X, Y, EXL, EXH, EYL, EYH>(validatedColumns, 
graph,
 
 1979   template <
typename V1 = RDFDetail::RInferredType, 
typename V2 = RDFDetail::RInferredType>
 
 1983      std::shared_ptr<::TProfile> 
h(
nullptr);
 
 1985         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 1989      if (!RDFInternal::HistoUtils<::TProfile>::HasAxisLimits(*
h)) {
 
 1990         throw std::runtime_error(
"Profiles with no axes limits are not supported yet.");
 
 1992      const std::vector<std::string_view> columnViews = {v1Name, v2Name};
 
 1996      return CreateAction<RDFInternal::ActionTags::Profile1D, V1, V2>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 2028      std::shared_ptr<::TProfile> 
h(
nullptr);
 
 2030         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 2034      if (!RDFInternal::HistoUtils<::TProfile>::HasAxisLimits(*
h)) {
 
 2035         throw std::runtime_error(
"Profile histograms with no axes limits are not supported yet.");
 
 2037      const std::vector<std::string_view> columnViews = {v1Name, v2Name, wName};
 
 2041      return CreateAction<RDFInternal::ActionTags::Profile1D, V1, V2, W>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 2047   template <
typename V1, 
typename V2, 
typename W>
 
 2050      return Profile1D<V1, V2, W>(model, 
"", 
"", 
"");
 
 2083                                      std::string_view v2Name = 
"", std::string_view v3Name = 
"")
 
 2085      std::shared_ptr<::TProfile2D> 
h(
nullptr);
 
 2087         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 2091      if (!RDFInternal::HistoUtils<::TProfile2D>::HasAxisLimits(*
h)) {
 
 2092         throw std::runtime_error(
"2D profiles with no axes limits are not supported yet.");
 
 2094      const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name};
 
 2098      return CreateAction<RDFInternal::ActionTags::Profile2D, V1, V2, V3>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 2131                                      std::string_view v3Name, std::string_view wName)
 
 2133      std::shared_ptr<::TProfile2D> 
h(
nullptr);
 
 2135         ROOT::Internal::RDF::RIgnoreErrorLevelRAII iel(
kError);
 
 2139      if (!RDFInternal::HistoUtils<::TProfile2D>::HasAxisLimits(*
h)) {
 
 2140         throw std::runtime_error(
"2D profiles with no axes limits are not supported yet.");
 
 2142      const std::vector<std::string_view> columnViews = {v1Name, v2Name, v3Name, wName};
 
 2146      return CreateAction<RDFInternal::ActionTags::Profile2D, V1, V2, V3, W>(userColumns, 
h, 
h, 
fProxiedPtr);
 
 2151   template <
typename V1, 
typename V2, 
typename V3, 
typename W>
 
 2154      return Profile2D<V1, V2, V3, W>(model, 
"", 
"", 
"", 
"");
 
 2194      auto h = std::make_shared<std::decay_t<T>>(std::forward<T>(model));
 
 2195      if (!RDFInternal::HistoUtils<T>::HasAxisLimits(*
h)) {
 
 2196         throw std::runtime_error(
"The absence of axes limits is not supported yet.");
 
 2217   template <
typename V = RDFDetail::RInferredType>
 
 2221      if (!
value.empty()) {
 
 2222         columns.emplace_back(std::string(
value));
 
 2225      if (std::is_same<V, RDFDetail::RInferredType>::value) {
 
 2228         return Fill<V>(
TStatistic(), validColumnNames);
 
 2249   template <
typename V = RDFDetail::RInferredType, 
typename W = RDFDetail::RInferredType>
 
 2253      constexpr auto vIsInferred = std::is_same<V, RDFDetail::RInferredType>::value;
 
 2254      constexpr auto wIsInferred = std::is_same<W, RDFDetail::RInferredType>::value;
 
 2260      if (vIsInferred && wIsInferred) {
 
 2262      } 
else if (vIsInferred != wIsInferred) {
 
 2263         std::string error(
"The ");
 
 2264         error += vIsInferred ? 
"value " : 
"weight ";
 
 2265         error += 
"column type is explicit, while the ";
 
 2266         error += vIsInferred ? 
"weight " : 
"value ";
 
 2267         error += 
" is specified to be inferred. This case is not supported: please specify both types or none.";
 
 2268         throw std::runtime_error(error);
 
 2270         return Fill<V, W>(
TStatistic(), validColumnNames);
 
 2295   template <
typename T = RDFDetail::RInferredType>
 
 2299      using RetType_t = RDFDetail::MinReturnType_t<T>;
 
 2300      auto minV = std::make_shared<RetType_t>(std::numeric_limits<RetType_t>::max());
 
 2301      return CreateAction<RDFInternal::ActionTags::Min, T>(userColumns, minV, minV, 
fProxiedPtr);
 
 2325   template <
typename T = RDFDetail::RInferredType>
 
 2329      using RetType_t = RDFDetail::MaxReturnType_t<T>;
 
 2330      auto maxV = std::make_shared<RetType_t>(std::numeric_limits<RetType_t>::lowest());
 
 2331      return CreateAction<RDFInternal::ActionTags::Max, T>(userColumns, maxV, maxV, 
fProxiedPtr);
 
 2354   template <
typename T = RDFDetail::RInferredType>
 
 2358      auto meanV = std::make_shared<double>(0);
 
 2359      return CreateAction<RDFInternal::ActionTags::Mean, T>(userColumns, meanV, meanV, 
fProxiedPtr);
 
 2382   template <
typename T = RDFDetail::RInferredType>
 
 2386      auto stdDeviationV = std::make_shared<double>(0);
 
 2387      return CreateAction<RDFInternal::ActionTags::StdDev, T>(userColumns, stdDeviationV, stdDeviationV, 
fProxiedPtr);
 
 2413   template <
typename T = RDFDetail::RInferredType>
 
 2415   Sum(std::string_view columnName = 
"",
 
 2416       const RDFDetail::SumReturnType_t<T> &initValue = RDFDetail::SumReturnType_t<T>{})
 
 2419      auto sumV = std::make_shared<RDFDetail::SumReturnType_t<T>>(initValue);
 
 2420      return CreateAction<RDFInternal::ActionTags::Sum, T>(userColumns, sumV, sumV, 
fProxiedPtr);
 
 2450      bool returnEmptyReport = 
false;
 
 2457         returnEmptyReport = 
true;
 
 2459      auto rep = std::make_shared<RCutFlowReport>();
 
 2460      using Helper_t = RDFInternal::ReportHelper<Proxied>;
 
 2466      return MakeResultPtr(rep, *
fLoopManager, std::move(action));
 
 2530   template <typename AccFun, typename MergeFun, typename R = typename TTraits::CallableTraits<AccFun>::ret_type,
 
 2531             typename ArgTypes = 
typename TTraits::CallableTraits<AccFun>::arg_types,
 
 2532             typename ArgTypesNoDecay = 
typename TTraits::CallableTraits<AccFun>::arg_types_nodecay,
 
 2533             typename U = TTraits::TakeFirstParameter_t<ArgTypes>,
 
 2534             typename T = TTraits::TakeFirstParameter_t<TTraits::RemoveFirstParameter_t<ArgTypes>>>
 
 2537      RDFInternal::CheckAggregate<R, MergeFun>(ArgTypesNoDecay());
 
 2543      auto accObjPtr = std::make_shared<U>(aggIdentity);
 
 2544      using Helper_t = RDFInternal::AggregateHelper<AccFun, MergeFun, R, T, U>;
 
 2546      auto action = std::make_unique<Action_t>(
 
 2547         Helper_t(std::move(aggregator), std::move(merger), accObjPtr, 
fLoopManager->
GetNSlots()), validColumnNames,
 
 2549      return MakeResultPtr(accObjPtr, *
fLoopManager, std::move(action));
 
 2565   template <typename AccFun, typename MergeFun, typename R = typename TTraits::CallableTraits<AccFun>::ret_type,
 
 2566             typename ArgTypes = 
typename TTraits::CallableTraits<AccFun>::arg_types,
 
 2567             typename U = TTraits::TakeFirstParameter_t<ArgTypes>,
 
 2568             typename T = TTraits::TakeFirstParameter_t<TTraits::RemoveFirstParameter_t<ArgTypes>>>
 
 2572         std::is_default_constructible<U>::value,
 
 2573         "aggregated object cannot be default-constructed. Please provide an initialisation value (aggIdentity)");
 
 2574      return Aggregate(std::move(aggregator), std::move(merger), columnName, U());
 
 2628      using HelperT = std::decay_t<Helper>;
 
 2631      static_assert(std::is_base_of<AH, HelperT>::value && std::is_convertible<HelperT *, AH *>::value,
 
 2632                    "Action helper of type T must publicly inherit from ROOT::Detail::RDF::RActionImpl<T>");
 
 2634      auto hPtr = std::make_shared<HelperT>(std::forward<Helper>(helper));
 
 2635      auto resPtr = hPtr->GetResultPtr();
 
 2637      if (std::is_same<FirstColumn, RDFDetail::RInferredType>::value && columns.empty()) {
 
 2640         return CreateAction<RDFInternal::ActionTags::Book, FirstColumn, OtherColumns...>(columns, resPtr, hPtr,
 
 2670   template <
typename... ColumnTypes>
 
 2674      auto newCols = columnList;
 
 2675      newCols.insert(newCols.begin(), 
"rdfentry_"); 
 
 2676      auto displayer = std::make_shared<RDisplay>(newCols, 
GetColumnTypeNamesList(newCols), nMaxCollectionElements);
 
 2677      using displayHelperArgs_t = std::pair<size_t, std::shared_ptr<RDisplay>>;
 
 2680         std::move(newCols), displayer, std::make_shared<displayHelperArgs_t>(nRows, displayer), 
fProxiedPtr);
 
 2697      auto newCols = columnList;
 
 2698      newCols.insert(newCols.begin(), 
"rdfentry_"); 
 
 2699      auto displayer = std::make_shared<RDisplay>(newCols, 
GetColumnTypeNamesList(newCols), nMaxCollectionElements);
 
 2700      using displayHelperArgs_t = std::pair<size_t, std::shared_ptr<RDisplay>>;
 
 2701      return CreateAction<RDFInternal::ActionTags::Display, RDFDetail::RInferredType>(
 
 2702         std::move(newCols), displayer, std::make_shared<displayHelperArgs_t>(nRows, displayer), 
fProxiedPtr,
 
 2703         columnList.size() + 1);
 
 2717   Display(std::string_view columnNameRegexp = 
"", 
size_t nRows = 5, 
size_t nMaxCollectionElements = 10)
 
 2721      return Display(selectedColumns, nRows, nMaxCollectionElements);
 
 2733   Display(std::initializer_list<std::string> columnList, 
size_t nRows = 5, 
size_t nMaxCollectionElements = 10)
 
 2736      return Display(selectedColumns, nRows, nMaxCollectionElements);
 
 2740   template <typename F, typename DefineType, typename RetType = typename TTraits::CallableTraits<F>::ret_type>
 
 2744      if (where.compare(0, 8, 
"Redefine") != 0) { 
 
 2754      using ArgTypes_t = 
typename TTraits::CallableTraits<F>::arg_types;
 
 2756         std::is_same<DefineType, RDFDetail::ExtraArgsForDefine::Slot>::value, ArgTypes_t>
::type;
 
 2758         std::is_same<DefineType, RDFDetail::ExtraArgsForDefine::SlotAndEntry>::value, ColTypesTmp_t>
::type;
 
 2760      constexpr auto nColumns = ColTypes_t::list_size;
 
 2767      if (retTypeName.empty()) {
 
 2771         retTypeName = 
"CLING_UNKNOWN_TYPE_" + demangledType;
 
 2775      auto newColumn = std::make_shared<NewCol_t>(
name, retTypeName, std::forward<F>(expression), validColumnNames,
 
 2779      newCols.
AddDefine(std::move(newColumn));
 
 2783      return newInterface;
 
 2789   template <typename F, typename DefineType, typename RetType = typename TTraits::CallableTraits<F>::ret_type,
 
 2790             bool IsFStringConv = std::is_convertible<F, std::string>::value,
 
 2791             bool IsRetTypeDefConstr = std::is_default_constructible<RetType>::value>
 
 2792   std::enable_if_t<!IsFStringConv && !IsRetTypeDefConstr, RInterface<Proxied, DS_t>>
 
 2795      static_assert(std::is_default_constructible<typename TTraits::CallableTraits<F>::ret_type>
::value,
 
 2796                    "Error in `Define`: type returned by expression is not default-constructible");
 
 2800   template <
typename... ColumnTypes>
 
 2808      const auto validCols = 
GetValidatedColumnNames(columnListWithoutSizeColumns.size(), columnListWithoutSizeColumns);
 
 2813      const auto &treename = parsedTreePath.fTreeName;
 
 2814      const auto &dirname = parsedTreePath.fDirName;
 
 2816      auto snapHelperArgs = std::make_shared<RDFInternal::SnapshotHelperArgs>(RDFInternal::SnapshotHelperArgs{
 
 2817         std::string(
filename), std::string(dirname), std::string(treename), columnListWithoutSizeColumns, options});
 
 2821         std::make_shared<ROOT::RDataFrame>(fullTreeName, 
filename, columnListWithoutSizeColumns);
 
 2825      auto resPtr = 
CreateAction<RDFInternal::ActionTags::Snapshot, ColumnTypes...>(validCols, newRDF, snapHelperArgs,
 
 2835   template <
typename... ColTypes, std::size_t... S>
 
 2841      constexpr bool areCopyConstructible =
 
 2842         RDFInternal::TEvalAnd<std::is_copy_constructible<ColTypes>::value...>
::value;
 
 2843      static_assert(areCopyConstructible, 
"Columns of a type which is not copy constructible cannot be cached yet.");
 
 2847      auto colHolders = std::make_tuple(Take<ColTypes>(columnListWithoutSizeColumns[S])...);
 
 2848      auto ds = std::make_unique<
RLazyDS<ColTypes...>>(
 
 2849         std::make_pair(columnListWithoutSizeColumns[S], std::get<S>(colHolders))...);
 
 2856   template <
bool IsSingleColumn, 
typename F>
 
 2859            const std::vector<std::string> &variationTags, std::string_view variationName)
 
 2861      using F_t = std::decay_t<F>;
 
 2862      using ColTypes_t = 
typename TTraits::CallableTraits<F_t>::arg_types;
 
 2863      using RetType = 
typename TTraits::CallableTraits<F_t>::ret_type;
 
 2864      constexpr auto nColumns = ColTypes_t::list_size;
 
 2866      SanityChecksForVary<RetType>(colNames, variationTags, variationName);
 
 2872      if (retTypeName.empty()) {
 
 2876         retTypeName = 
"CLING_UNKNOWN_TYPE_" + demangledType;
 
 2879      auto variation = std::make_shared<RDFInternal::RVariation<F_t, IsSingleColumn>>(
 
 2884      newCols.AddVariation(std::move(variation));
 
 2888      return newInterface;
 
 2892                                            const std::vector<std::string> &variationTags,
 
 2893                                            std::string_view variationName, 
bool isSingleColumn)
 
 2895      R__ASSERT(variationTags.size() > 0 && 
"Must have at least one variation.");
 
 2896      R__ASSERT(colNames.size() > 0 && 
"Must have at least one varied column.");
 
 2897      R__ASSERT(!variationName.empty() && 
"Must provide a variation name.");
 
 2899      for (
auto &colName : colNames) {
 
 2907      if (colNames.size() > 1) {
 
 2908         std::set<std::string> uniqueCols(colNames.begin(), colNames.end());
 
 2909         if (uniqueCols.size() != colNames.size())
 
 2910            throw std::logic_error(
"A column name was passed to the same Vary invocation multiple times.");
 
 2914      auto jittedVariation =
 
 2919      newColRegister.
AddVariation(std::move(jittedVariation));
 
 2923      return newInterface;
 
 2926   template <
typename Helper, 
typename ActionResultType>
 
 2928                                              const std::shared_ptr<Helper> &hPtr,
 
 2932      return CreateAction<RDFInternal::ActionTags::Book>({}, resPtr, hPtr, 
fProxiedPtr, 0u);
 
 2935   template <
typename Helper, 
typename ActionResultType, 
typename... Others>
 
 2936   RResultPtr<ActionResultType>
 
 2938                                         const std::shared_ptr<Helper>& ,
 
 2941      throw std::logic_error(std::string(
"An action was booked with no input columns, but the action requires " 
 2942                                         "columns! The action helper type was ") +
 
 2943                             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.
 
const ColumnNames_t & GetBranchNames()
Return all valid TTree::Branch names (caching results for subsequent calls).
 
void ToJitExec(const std::string &) const
 
void Run(bool jit=true)
Start the event loop with a different mechanism depending on IMT/no IMT, data source/no data source.
 
unsigned int GetNSlots() const
 
void Jit()
Add RDF nodes that require just-in-time compilation to the 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.
 
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.
 
ColumnNames_t GetNames() const
Return the list of the names of the defined columns (Defines + Aliases).
 
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)
 
RDFDetail::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 an existing columns 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 an existing column.
 
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 one or more 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 an existing column.
 
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 one or more existing columns.
 
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)
Overload to avoid ambiguity between C++20 string, vector<string> construction from init list.
 
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 an existing column.
 
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 one or more existing columns.
 
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 a systematic variation that affects multiple columns simultaneously.
 
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)
Overload to avoid ambiguity between C++20 string, vector<string> construction from init list.
 
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)
Overload to avoid ambiguity between C++20 string, vector<string> construction from init list.
 
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).
 
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.
 
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 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 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.
 
void TriggerRun(ROOT::RDF::RNode &node)
Trigger the execution of an RDataFrame computation graph.
 
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.
 
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
 
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.