11#ifndef ROOT_RDF_RINTERFACEBASE
12#define ROOT_RDF_RINTERFACEBASE
65 template <
typename RetType>
66 void SanityChecksForVary(
const std::vector<std::string> &colNames,
const std::vector<std::string> &variationTags,
67 std::string_view variationName)
69 R__ASSERT(!variationTags.empty() &&
"Must have at least one variation.");
70 R__ASSERT(!colNames.empty() &&
"Must have at least one varied column.");
71 R__ASSERT(!variationName.empty() &&
"Must provide a variation name.");
73 for (
auto &colName : colNames) {
81 if (colNames.size() > 1) {
84 throw std::runtime_error(
"This Vary call is varying multiple columns simultaneously but the expression "
85 "does not return an RVec of RVecs.");
91 auto &&nColTypes = colTypes.size();
93 std::vector<const std::type_info *> colTypeIDs(nColTypes);
94 const auto &innerTypeID =
typeid(RDFInternal::InnerValueType_t<RetType>);
95 for (
decltype(nColTypes) i{}; i < nColTypes; ++i) {
100 const auto *define =
fColRegister.GetDefine(colNames[i]);
103 if (*colTypeIDs[i] != *colTypeIDs[0]) {
104 throw std::runtime_error(
"Cannot simultaneously vary multiple columns of different types.");
107 if (innerTypeID != *colTypeIDs[i])
108 throw std::runtime_error(
"Varied values for column \"" + colNames[i] +
"\" have a different type (" +
114 const auto &retTypeID =
typeid(
typename RetType::value_type);
115 const auto &colName = colNames[0];
117 const auto *expectedTypeID =
119 if (retTypeID != *expectedTypeID)
120 throw std::runtime_error(
"Varied values for column \"" + colName +
"\" have a different type (" +
126 if (colNames.size() > 1) {
127 std::set<std::string> uniqueCols(colNames.begin(), colNames.end());
128 if (uniqueCols.size() != colNames.size())
129 throw std::logic_error(
"A column name was passed to the same Vary invocation multiple times.");
141 template <
typename... ColumnTypes>
149 const std::vector<const std::type_info *> &colTypeIDs)
160 template <
typename ActionTag,
typename... ColTypes,
typename ActionResultType,
typename RDFNode,
161 typename HelperArgType = ActionResultType,
162 std::enable_if_t<!RDFInternal::RNeedJitting<ColTypes...>::value,
int> = 0>
164 const std::shared_ptr<HelperArgType> &helperArg,
165 const std::shared_ptr<RDFNode> &proxiedPtr,
const int = -1)
167 constexpr auto nColumns =
sizeof...(ColTypes);
174 auto action = RDFInternal::BuildAction<ColTypes...>(validColumnNames, helperArg, nSlots, proxiedPtr, ActionTag{},
183 template <
typename ActionTag,
typename... ColTypes,
typename ActionResultType,
typename RDFNode,
184 typename HelperArgType = ActionResultType,
185 std::enable_if_t<RDFInternal::RNeedJitting<ColTypes...>::value,
int> = 0>
188 const std::shared_ptr<HelperArgType> &helperArg,
const std::shared_ptr<RDFNode> &proxiedPtr,
189 const int nColumns = -1,
const bool vector2RVec =
true)
191 auto realNColumns = (nColumns > -1 ? nColumns :
sizeof...(ColTypes));
196 const auto jittedAction = std::make_shared<RDFInternal::RJittedAction>(
202 std::make_unique<ROOT::Internal::RDF::RColumnRegister>(
fColRegister),
203 validColumnNames, jittedAction, helperArg);
204 return MakeResultPtr(
r, *
fLoopManager, std::move(jittedAction));
219 bool HasColumn(std::string_view columnName);
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
A binder for user-defined columns, variations and aliases.
A DFDescription contains useful information about a given RDataFrame computation graph.
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
RVariationsDescription GetVariations() const
Return a descriptor for the systematic variations registered in this branch of the computation graph.
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 nColumns=-1, const bool vector2RVec=true)
Create RAction object, return RResultPtr for the action Overload for the case in which one or more co...
std::string GetColumnType(std::string_view column)
Return the type of a given column as a string.
ColumnNames_t GetValidatedColumnNames(const unsigned int nColumns, const ColumnNames_t &columns)
RDFDescription Describe()
Return information about the dataframe.
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...
unsigned int GetNRuns() const
Gets the number of event loops run.
ColumnNames_t GetDatasetTopLevelFieldNames()
Retrieve the names of top-level field names.
void SanityChecksForVary(const std::vector< std::string > &colNames, const std::vector< std::string > &variationTags, std::string_view variationName)
RDataSource * GetDataSource() const
void CheckAndFillDSColumns(ColumnNames_t validCols, TTraits::TypeList< ColumnTypes... > typeList)
ColumnNames_t GetDefinedColumnNames()
Returns the names of the defined columns.
void CheckIMTDisabled(std::string_view callerName)
unsigned int GetNSlots() const
Gets the number of data processing slots.
RInterfaceBase(std::shared_ptr< RDFDetail::RLoopManager > lm)
bool HasColumn(std::string_view columnName)
Checks if a column is present in the dataset.
void CheckAndFillDSColumns(const std::vector< std::string > &colNames, const std::vector< const std::type_info * > &colTypeIDs)
std::string DescribeDataset() const
ColumnNames_t GetColumnNames()
Returns the names of the available columns.
RDFDetail::RLoopManager * GetLoopManager() const
RDFInternal::RColumnRegister fColRegister
Contains the columns defined up to this node.
Smart pointer for the return type of actions.
A descriptor for the systematic variations known to a given RDataFrame node.
const std::type_info & TypeName2TypeID(const std::string &name)
Return the type_info associated to a name.
void CheckValidCppVarName(std::string_view var, const std::string &where)
ColumnNames_t GetValidatedColumnNames(RLoopManager &lm, const unsigned int nColumns, const ColumnNames_t &columns, const RColumnRegister &colRegister, RDataSource *ds)
Given the desired number of columns and the user-provided list of columns:
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...
void CheckForDefinition(const std::string &where, std::string_view definedColView, const RColumnRegister &colRegister, const ColumnNames_t &dataSourceColumns)
Throw if column definedColView is not already there.
std::string JitBuildAction(const ColumnNames_t &cols, const std::type_info &helperArgType, const std::type_info &at, TTree *tree, const unsigned int nSlots, const RColumnRegister &colRegister, RDataSource *ds, const bool vector2RVec)
std::vector< std::string > ColumnNames_t
Lightweight storage for a collection of types.