35class RCustomColumnBase;
58 const std::string &fullTreeName,
59 const std::string &fileName,
62 std::unique_ptr<RDFInternal::RActionBase> actionPtr)
72 auto rlm_ptr = std::make_shared<RLoopManager>(
nullptr, validCols);
73 auto snapshotRDF = std::make_shared<RInterface<RLoopManager>>(rlm_ptr);
74 auto chain = std::make_shared<TChain>(fullTreeName.c_str());
75 chain->Add(std::string(fileName).c_str());
76 snapshotRDF->fProxiedPtr->SetTree(chain);
77 auto snapshotRDFResPtr =
MakeResultPtr(snapshotRDF, loopManager, std::move(actionPtr));
82 return snapshotRDFResPtr;
94 const auto theRegexSize = columnNameRegexp.size();
95 std::string theRegex(columnNameRegexp);
97 const auto isEmptyRegex = 0 == theRegexSize;
99 if (theRegexSize > 0 && theRegex[0] !=
'^')
100 theRegex =
"^" + theRegex;
101 if (theRegexSize > 0 && theRegex[theRegexSize - 1] !=
'$')
102 theRegex = theRegex +
"$";
105 selectedColumns.reserve(32);
130 for (
auto &dsColName : dsColNames) {
131 if ((isEmptyRegex || -1 != regexp.
Index(dsColName.c_str(), &
dummy)) &&
133 selectedColumns.emplace_back(dsColName);
138 if (selectedColumns.empty()) {
139 std::string
text(callerName);
140 if (columnNameRegexp.empty()) {
141 text =
": there is no column available to match.";
143 text =
": regex \"" + std::string(columnNameRegexp) +
"\" did not match any column.";
145 throw std::runtime_error(
text);
147 return selectedColumns;
151 std::set<TTree *> &analysedTrees)
154 if (!analysedTrees.insert(&t).second) {
161 auto name = branchObj->GetName();
162 if (bNamesReg.insert(
name).second) {
163 bNames.emplace_back(
name);
173 for (
auto friendTreeObj : *friendTrees) {
183 std::set<std::string> bNamesSet;
185 std::set<TTree *> analysedTrees;
194 const char firstChar = var[0];
197 auto isALetter = [](
char c) {
return (
c >=
'A' &&
c <=
'Z') || (
c >=
'a' &&
c <=
'z'); };
198 const bool isValidFirstChar = firstChar ==
'_' || isALetter(firstChar);
199 if (!isValidFirstChar)
203 auto isANumber = [](
char c) {
return c >=
'0' &&
c <=
'9'; };
204 auto isValidTok = [&isALetter, &isANumber](
char c) {
return c ==
'_' || isALetter(
c) || isANumber(
c); };
205 for (
const char c : var)
213 const std::map<std::string, std::string> &aliasMap,
const ColumnNames_t &dataSourceColumns)
215 const std::string definedColStr(definedCol);
218 const auto msg =
"Cannot define column \"" + definedColStr +
"\": not a valid C++ variable name.";
219 throw std::runtime_error(msg);
222 if (treePtr !=
nullptr) {
224 const auto branch = treePtr->
GetBranch(definedColStr.c_str());
225 if (branch !=
nullptr) {
226 const auto msg =
"branch \"" + definedColStr +
"\" already present in TTree";
227 throw std::runtime_error(msg);
231 if (std::find(customCols.begin(), customCols.end(), definedCol) != customCols.end()) {
232 const auto msg =
"Redefinition of column \"" + definedColStr +
"\"";
233 throw std::runtime_error(msg);
237 const auto aliasColNameIt = aliasMap.find(definedColStr);
238 if (aliasColNameIt != aliasMap.end()) {
239 const auto msg =
"An alias with name " + definedColStr +
" pointing to column " +
240 aliasColNameIt->second +
" is already existing.";
241 throw std::runtime_error(msg);
245 if (!dataSourceColumns.empty()) {
246 if (std::find(dataSourceColumns.begin(), dataSourceColumns.end(), definedCol) != dataSourceColumns.end()) {
247 const auto msg =
"Redefinition of column \"" + definedColStr +
"\" already present in the data-source";
248 throw std::runtime_error(msg);
255 if (nTemplateParams != nColumnNames) {
256 std::string err_msg =
"The number of template parameters specified is ";
257 err_msg += std::to_string(nTemplateParams);
258 err_msg +=
" while ";
259 err_msg += std::to_string(nColumnNames);
260 err_msg +=
" columns have been specified.";
261 throw std::runtime_error(err_msg);
271 if (defaultNames.size() < nRequiredNames)
272 throw std::runtime_error(
273 std::to_string(nRequiredNames) +
" column name" + (nRequiredNames == 1 ?
" is" :
"s are") +
274 " required but none were provided and the default list has size " + std::to_string(defaultNames.size()));
276 return ColumnNames_t(defaultNames.begin(), defaultNames.begin() + nRequiredNames);
279 if (names.size() != nRequiredNames) {
280 auto msg = std::to_string(nRequiredNames) +
" column name" + (nRequiredNames == 1 ?
" is" :
"s are") +
281 " required but " + std::to_string(names.size()) + (names.size() == 1 ?
" was" :
" were") +
283 for (
const auto &
name : names)
284 msg +=
" \"" +
name +
"\",";
286 throw std::runtime_error(msg);
296 for (
auto &column : requiredCols) {
297 const auto isBranch = std::find(datasetColumns.begin(), datasetColumns.end(), column) != datasetColumns.end();
300 const auto isCustomColumn = std::find(definedCols.begin(), definedCols.end(), column) != definedCols.end();
303 const auto isDataSourceColumn =
304 std::find(dataSourceColumns.begin(), dataSourceColumns.end(), column) != dataSourceColumns.end();
305 if (isDataSourceColumn)
307 unknownColumns.emplace_back(column);
309 return unknownColumns;
314 const auto str = colName.data();
315 const auto goodPrefix = colName.size() > 3 &&
316 (
'r' == str[0] ||
't' == str[0]) &&
317 0 == strncmp(
"df", str + 1, 2);
318 return goodPrefix &&
'_' == colName.back();
321std::vector<std::string>
GetFilterNames(
const std::shared_ptr<RLoopManager> &loopManager)
323 return loopManager->GetFiltersNames();
327unsigned int Replace(std::string &
s,
const std::string what,
const std::string withWhat)
330 auto numReplacements = 0U;
331 while ((idx =
s.find(what, idx)) != std::string::npos) {
332 s.replace(idx, what.size(), withWhat);
333 idx += withWhat.size();
336 return numReplacements;
343 const std::map<std::string, std::string> &aliasMap)
346 const std::string paddedExpr =
" " + std::string(expression) +
" ";
347 static const std::string regexBit(
"[^a-zA-Z0-9_]");
350 std::vector<std::string> usedBranches;
353 for (
auto &brName : customColumns) {
354 std::string bNameRegexContent = regexBit + brName + regexBit;
355 TRegexp bNameRegex(bNameRegexContent.c_str());
356 if (-1 != bNameRegex.
Index(paddedExpr.c_str(), &matchedLen)) {
357 usedBranches.emplace_back(brName);
364 auto escapedBrName = brName;
365 Replace(escapedBrName, std::string(
"."), std::string(
"\\."));
366 std::string bNameRegexContent = regexBit + escapedBrName + regexBit;
367 TRegexp bNameRegex(bNameRegexContent.c_str());
368 if (-1 != bNameRegex.
Index(paddedExpr.c_str(), &matchedLen)) {
369 usedBranches.emplace_back(brName);
374 for (
auto &col : dsColumns) {
375 std::string bNameRegexContent = regexBit + col + regexBit;
376 TRegexp bNameRegex(bNameRegexContent.c_str());
377 if (-1 != bNameRegex.
Index(paddedExpr.c_str(), &matchedLen)) {
379 if (std::find(usedBranches.begin(), usedBranches.end(), col) == usedBranches.end())
380 usedBranches.emplace_back(col);
385 for (
auto &alias_colName : aliasMap) {
386 auto &alias = alias_colName.first;
387 std::string bNameRegexContent = regexBit + alias + regexBit;
388 TRegexp bNameRegex(bNameRegexContent.c_str());
389 if (-1 != bNameRegex.
Index(paddedExpr.c_str(), &matchedLen)) {
391 if (std::find(usedBranches.begin(), usedBranches.end(), alias) == usedBranches.end())
392 usedBranches.emplace_back(alias);
402 std::vector<std::string> dotlessNames = colNames;
403 for (
auto &
c : dotlessNames) {
404 const bool hasDot =
c.find_first_of(
'.') != std::string::npos;
406 std::replace(
c.begin(),
c.end(),
'.',
'_');
407 c.insert(0u,
"__tdf_arg_");
415 const std::map<std::string, std::string> &aliasMap,
TTree *
tree,
416 RDataSource *ds, std::string &expr,
unsigned int namespaceID,
419 std::vector<std::string> colTypes;
420 colTypes.reserve(colNames.size());
421 const auto aliasMapEnd = aliasMap.end();
423 for (
auto c = colNames.begin(),
v = varNames.begin();
c != colNames.end();) {
424 const auto &colName = *
c;
426 if (colName.find(
'.') != std::string::npos) {
428 auto numRepl =
Replace(expr, colName, *
v);
433 c = colNames.erase(
c);
434 v = varNames.erase(
v);
440 const auto paddedExpr =
" " + expr +
" ";
441 static const std::string noWordChars(
"[^a-zA-Z0-9_]");
442 const auto colNameRxBody = noWordChars + colName + noWordChars;
443 TRegexp colNameRegex(colNameRxBody.c_str());
445 const auto colStillThere = colNameRegex.
Index(paddedExpr.c_str(), &matchedLen) != -1;
446 if (!colStillThere) {
447 c = colNames.erase(
c);
448 v = varNames.erase(
v);
455 const auto aliasMapIt = aliasMap.find(colName);
456 const auto &realColName = aliasMapEnd == aliasMapIt ? colName : aliasMapIt->second;
458 const auto isCustomCol = customCols.
HasName(realColName);
459 const auto customColID = isCustomCol ? customCols.
GetColumns()[realColName]->GetID() : 0;
460 const auto colTypeName =
462 colTypes.emplace_back(colTypeName);
472 const std::vector<std::string> &colTypes,
bool hasReturnStmt)
474 R__ASSERT(colNames.size() == colTypes.size());
476 static unsigned int iNs = 0U;
477 std::stringstream dummyDecl;
478 dummyDecl <<
"namespace __tdf_" << std::to_string(iNs++) <<
"{ auto tdf_f = []() {";
480 for (
auto col = colNames.begin(),
type = colTypes.begin(); col != colNames.end(); ++col, ++
type) {
481 dummyDecl << *
type <<
" " << *col <<
";\n";
487 dummyDecl << expression <<
"\n;};}";
489 dummyDecl <<
"return " << expression <<
"\n;};}";
494 "Cannot interpret the following expression:\n" + std::string(expression) +
"\n\nMake sure it is valid C++.";
495 throw std::runtime_error(msg);
502 R__ASSERT(vars.size() == varTypes.size());
504 std::stringstream ss;
506 for (
auto i = 0u; i < vars.size(); ++i) {
509 ss << varTypes[i] <<
"& " << vars[i] <<
", ";
512 ss.seekp(-2, ss.cur);
515 ss <<
"){\n" << expr <<
"\n}";
517 ss <<
"){return " << expr <<
"\n;}";
526 s << std::hex << std::showbase << reinterpret_cast<size_t>(addr);
534 std::string_view expression,
const std::map<std::string, std::string> &aliasMap,
543 auto dotlessExpr = std::string(expression);
544 const auto usedColTypes =
547 TRegexp re(
"[^a-zA-Z0-9_]return[^a-zA-Z0-9_]");
549 const bool hasReturnStmt = re.
Index(dotlessExpr, &matchedLen) != -1;
553 const auto filterLambda =
BuildLambdaString(dotlessExpr, varNames, usedColTypes, hasReturnStmt);
564 std::stringstream filterInvocation;
565 filterInvocation <<
"ROOT::Internal::RDF::JitFilterHelper(" << filterLambda <<
", {";
566 for (
const auto &brName : usedBranches) {
568 const auto aliasMapIt = aliasMap.find(brName);
569 auto &realBrName = aliasMapIt == aliasMap.end() ? brName : aliasMapIt->second;
570 filterInvocation <<
"\"" << realBrName <<
"\", ";
572 if (!usedBranches.empty())
573 filterInvocation.seekp(-2, filterInvocation.cur);
574 filterInvocation <<
"}, \"" <<
name <<
"\", "
575 <<
"reinterpret_cast<ROOT::Detail::RDF::RJittedFilter*>(" << jittedFilterAddr <<
"), "
576 <<
"reinterpret_cast<std::shared_ptr<ROOT::Detail::RDF::RNodeBase>*>(" << prevNodeAddr <<
"),"
577 <<
"reinterpret_cast<ROOT::Internal::RDF::RBookedCustomColumns*>(" << columnsOnHeapAddr <<
")"
585 const std::shared_ptr<RJittedCustomColumn> &jittedCustomColumn,
590 const auto namespaceID = lm.
GetID();
596 auto dotlessExpr = std::string(expression);
597 const auto usedColTypes =
600 TRegexp re(
"[^a-zA-Z0-9_]return[^a-zA-Z0-9_]");
602 const bool hasReturnStmt = re.
Index(dotlessExpr, &matchedLen) != -1;
606 const auto definelambda =
BuildLambdaString(dotlessExpr, varNames, usedColTypes, hasReturnStmt);
607 const auto customColID = std::to_string(jittedCustomColumn->GetID());
608 const auto lambdaName =
"eval_" + std::string(
name) + customColID;
609 const auto ns =
"__tdf" + std::to_string(namespaceID);
617 const auto defineDeclaration =
618 "namespace " +
ns +
" { auto " + lambdaName +
" = " + definelambda +
";\n" +
"using " + std::string(
name) +
619 customColID +
"_type = typename ROOT::TypeTraits::CallableTraits<decltype(" + lambdaName +
" )>::ret_type; }\n";
622 std::stringstream defineInvocation;
623 defineInvocation <<
"ROOT::Internal::RDF::JitDefineHelper(" << definelambda <<
", {";
624 for (
auto brName : usedBranches) {
626 auto aliasMapIt = aliasMap.find(brName);
627 auto &realBrName = aliasMapIt == aliasMap.end() ? brName : aliasMapIt->second;
628 defineInvocation <<
"\"" << realBrName <<
"\", ";
630 if (!usedBranches.empty())
631 defineInvocation.seekp(-2, defineInvocation.cur);
632 defineInvocation <<
"}, \"" <<
name <<
"\", reinterpret_cast<ROOT::Detail::RDF::RLoopManager*>("
633 <<
PrettyPrintAddr(&lm) <<
"), *reinterpret_cast<ROOT::Detail::RDF::RJittedCustomColumn*>("
635 <<
"reinterpret_cast<ROOT::Internal::RDF::RBookedCustomColumns*>(" << customColumnsAddr <<
")"
638 lm.
ToJit(defineInvocation.str());
644 void *rOnHeap,
TTree *
tree,
const unsigned int nSlots,
646 std::shared_ptr<RJittedAction> *jittedActionOnHeap,
unsigned int namespaceID)
648 auto nBranches = bl.size();
651 std::vector<std::string> columnTypeNames(nBranches);
652 for (
auto i = 0u; i < nBranches; ++i) {
653 const auto isCustomCol = customCols.
HasName(bl[i]);
654 const auto customColID = isCustomCol ? customCols.
GetColumns()[bl[i]]->GetID() : 0;
655 const auto columnTypeName =
657 if (columnTypeName.empty()) {
658 std::string exceptionText =
"The type of column ";
659 exceptionText += bl[i];
660 exceptionText +=
" could not be guessed. Please specify one.";
661 throw std::runtime_error(exceptionText.c_str());
663 columnTypeNames[i] = columnTypeName;
668 if (!actionResultTypeClass) {
669 std::string exceptionText =
"An error occurred while inferring the result type of an operation.";
670 throw std::runtime_error(exceptionText.c_str());
672 const auto actionResultTypeName = actionResultTypeClass->GetName();
676 if (!actionTypeClass) {
677 std::string exceptionText =
"An error occurred while inferring the action type of the operation.";
678 throw std::runtime_error(exceptionText.c_str());
680 const auto actionTypeName = actionTypeClass->GetName();
687 std::stringstream createAction_str;
688 createAction_str <<
"ROOT::Internal::RDF::CallBuildAction"
689 <<
"<" << actionTypeName;
690 for (
auto &colType : columnTypeNames)
691 createAction_str <<
", " << colType;
694 createAction_str <<
">(reinterpret_cast<std::shared_ptr<ROOT::Detail::RDF::RNodeBase>*>("
696 for (
auto i = 0u; i < bl.size(); ++i) {
698 createAction_str <<
", ";
699 createAction_str <<
'"' << bl[i] <<
'"';
701 createAction_str <<
"}, " << std::dec << std::noshowbase << nSlots <<
", reinterpret_cast<" << actionResultTypeName
703 <<
", reinterpret_cast<std::shared_ptr<ROOT::Internal::RDF::RJittedAction>*>("
705 <<
"reinterpret_cast<ROOT::Internal::RDF::RBookedCustomColumns*>(" << customColumnsAddr <<
")"
707 return createAction_str.str();
712 for (
const auto &
s : strings) {
719std::shared_ptr<RNodeBase>
UpcastNode(std::shared_ptr<RNodeBase> ptr)
732 auto selectedColumns =
SelectColumns(nColumns, columns, defaultColumns);
734 const auto unknownColumns =
FindUnknownColumns(selectedColumns, validBranchNames, validCustomColumns,
737 if (!unknownColumns.empty()) {
739 std::stringstream unknowns;
740 std::string delim = unknownColumns.size() > 1 ?
"s: " :
": ";
741 for (
auto &unknownColumn : unknownColumns) {
742 unknowns << delim << unknownColumn;
745 throw std::runtime_error(
"Unknown column" + unknowns.str());
750 auto aliasMapEnd = aliasMap.end();
752 for (
auto idx :
ROOT::TSeqU(selectedColumns.size())) {
753 const auto &colName = selectedColumns[idx];
754 const auto aliasColumnNameIt = aliasMap.find(colName);
755 if (aliasMapEnd != aliasColumnNameIt) {
756 selectedColumns[idx] = aliasColumnNameIt->second;
760 return selectedColumns;
768 const auto nColumns = requestedCols.size();
769 std::vector<bool> mustBeDefined(nColumns,
false);
770 for (
auto i = 0u; i < nColumns; ++i)
771 mustBeDefined[i] = std::find(definedCols.begin(), definedCols.end(), requestedCols[i]) == definedCols.end();
772 return mustBeDefined;
static RooMathCoreReg dummy
A wrapper around a concrete RFilter, which forwards all calls to it RJittedFilter is the type of the ...
The head node of a RDF computation graph.
const std::map< std::string, std::string > & GetAliasMap() const
void ToJit(const std::string &s)
const ColumnNames_t & GetBranchNames()
Return all valid TTree::Branch names (caching results for subsequent calls).
unsigned int GetID() const
const ColumnNames_t & GetDefaultColumnNames() const
Return the list of default columns – empty if none was provided when constructing the RDataFrame.
virtual RLoopManager * GetLoopManagerUnchecked()
Encapsulates the columns defined by the user.
bool HasName(std::string name) const
Check if the provided name is tracked in the names list.
ColumnNames_t GetNames() const
Returns the list of the names of the defined columns.
RCustomColumnBasePtrMap_t GetColumns() const
Returns the list of the pointers to the defined columns.
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
virtual const std::vector< std::string > & GetColumnNames() const =0
Returns a reference to the collection of the dataset's column names.
The public interface to the RDataFrame federation of classes.
RDataSource * fDataSource
Non-owning pointer to a data-source object. Null if no data-source. RLoopManager has ownership of the...
RDFInternal::RBookedCustomColumns fCustomColumns
Contains the custom columns defined up to this node.
RLoopManager * fLoopManager
A pseudo container class which is a generator of indices.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
A TFriendElement TF describes a TTree object TF in a file.
Regular expression class.
Ssiz_t Index(const TString &str, Ssiz_t *len, Ssiz_t start=0) const
Find the first occurrence of the regexp in string and return the position, or -1 if there is no match...
A TTree object has a header with a name and a title.
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
virtual TObjArray * GetListOfBranches()
virtual TList * GetListOfFriends() const
RResultPtr< T > MakeResultPtr(const std::shared_ptr< T > &r, RLoopManager &df, std::shared_ptr< ROOT::Internal::RDF::RActionBase > actionPtr)
Create a RResultPtr and set its pointer to the corresponding RAction This overload is invoked by non-...
const ColumnNames_t SelectColumns(unsigned int nRequiredNames, const ColumnNames_t &names, const ColumnNames_t &defaultNames)
Choose between local column names or default column names, throw in case of errors.
std::string BuildLambdaString(const std::string &expr, const ColumnNames_t &vars, const ColumnNames_t &varTypes, bool hasReturnStmt)
std::vector< std::string > ReplaceDots(const ColumnNames_t &colNames)
bool IsValidCppVarName(const std::string &var)
ColumnNames_t ConvertRegexToColumns(const ROOT::RDF::RNode &node, std::string_view columnNameRegexp, std::string_view callerName)
unsigned int Replace(std::string &s, const std::string what, const std::string withWhat)
std::shared_ptr< RNodeBase > UpcastNode(std::shared_ptr< RNodeBase > ptr)
std::vector< std::string > GetFilterNames(const std::shared_ptr< RLoopManager > &loopManager)
std::string PrettyPrintAddr(const void *const addr)
ColumnNames_t GetTopLevelBranchNames(TTree &t)
Get all the top-level branches names, including the ones of the friend trees.
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)
ColumnNames_t FindUnknownColumns(const ColumnNames_t &requiredCols, const ColumnNames_t &datasetColumns, const ColumnNames_t &definedCols, const ColumnNames_t &dataSourceColumns)
std::vector< std::string > FindUsedColumnNames(std::string_view expression, const ColumnNames_t &branches, const ColumnNames_t &customColumns, const ColumnNames_t &dsColumns, const std::map< std::string, std::string > &aliasMap)
std::string JitBuildAction(const ColumnNames_t &bl, void *prevNode, const std::type_info &art, const std::type_info &at, void *rOnHeap, TTree *tree, const unsigned int nSlots, const RDFInternal::RBookedCustomColumns &customCols, RDataSource *ds, std::shared_ptr< RJittedAction > *jittedActionOnHeap, unsigned int namespaceID)
HeadNode_t CreateSnaphotRDF(const ColumnNames_t &validCols, const std::string &fullTreeName, const std::string &fileName, bool isLazy, RLoopManager &loopManager, std::unique_ptr< RDFInternal::RActionBase > actionPtr)
bool IsInternalColumn(std::string_view colName)
ColumnNames_t GetValidatedColumnNames(RLoopManager &lm, const unsigned int nColumns, const ColumnNames_t &columns, const ColumnNames_t &validCustomColumns, RDataSource *ds)
Given the desired number of columns and the user-provided list of columns:
void GetTopLevelBranchNamesImpl(TTree &t, std::set< std::string > &bNamesReg, ColumnNames_t &bNames, std::set< TTree * > &analysedTrees)
std::vector< bool > FindUndefinedDSColumns(const ColumnNames_t &requestedCols, const ColumnNames_t &definedCols)
Return a bitset each element of which indicates whether the corresponding element in selectedColumns ...
void TryToJitExpression(const std::string &expression, const ColumnNames_t &colNames, const std::vector< std::string > &colTypes, bool hasReturnStmt)
std::string ColumnName2ColumnTypeName(const std::string &colName, unsigned int namespaceID, TTree *tree, RDataSource *ds, bool isCustomColumn, bool vector2tvec, unsigned int customColID)
Return a string containing the type of the given branch.
void BookDefineJit(std::string_view name, std::string_view expression, RLoopManager &lm, RDataSource *ds, const std::shared_ptr< RJittedCustomColumn > &jittedCustomColumn, const RDFInternal::RBookedCustomColumns &customCols, const ColumnNames_t &branches)
void BookFilterJit(RJittedFilter *jittedFilter, void *prevNodeOnHeap, std::string_view name, std::string_view expression, const std::map< std::string, std::string > &aliasMap, const ColumnNames_t &branches, const RDFInternal::RBookedCustomColumns &customCols, TTree *tree, RDataSource *ds, unsigned int namespaceID)
std::vector< std::string > ColumnTypesAsString(ColumnNames_t &colNames, ColumnNames_t &varNames, const std::map< std::string, std::string > &aliasMap, TTree *tree, RDataSource *ds, std::string &expr, unsigned int namespaceID, const RDFInternal::RBookedCustomColumns &customCols)
void CheckCustomColumn(std::string_view definedCol, TTree *treePtr, const ColumnNames_t &customCols, const std::map< std::string, std::string > &aliasMap, const ColumnNames_t &dataSourceColumns)
Namespace for new ROOT classes and functions.
ROOT::Detail::RDF::ColumnNames_t ColumnNames_t
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
static constexpr double s
static constexpr double ns
basic_string_view< char > string_view