31 class RCustomColumnBase;
53 std::string &friendName)
55 if (!friendName.empty()) {
57 auto friendBName = friendName +
"." +
branchName;
58 if (bNamesReg.insert(friendBName).second)
59 bNames.push_back(friendBName);
62 if (bNamesReg.insert(branchName).second)
63 bNames.push_back(branchName);
67 std::string &friendName)
71 auto subBranchName = std::string(subBranch->
GetName());
72 auto fullName = prefix + subBranchName;
74 std::string newPrefix;
76 newPrefix = fullName +
".";
78 ExploreBranch(t, bNamesReg, bNames, subBranch, newPrefix, friendName);
81 UpdateList(bNamesReg, bNames, fullName, friendName);
82 else if (t.
GetBranch(subBranchName.c_str()))
83 UpdateList(bNamesReg, bNames, subBranchName, friendName);
88 std::set<TTree *> &analysedTrees, std::string &friendName)
91 if (!analysedTrees.insert(&t).second) {
97 std::string prefix =
"";
105 if (listOfLeaves->GetEntries() == 1) {
106 auto leafName = std::string(listOfLeaves->At(0)->GetName());
111 for (
auto leaf : *listOfLeaves) {
112 auto leafName = std::string(leaf->GetName());
114 UpdateList(bNamesReg, bNames, fullName, friendName);
120 bool dotIsImplied =
false;
123 throw std::runtime_error(
"GetBranchNames: unsupported branch type");
125 if (be->GetType() == 3 || be->GetType() == 4)
143 for (
auto friendTreeObj : *friendTrees) {
148 if (alias !=
nullptr)
149 frName = std::string(alias);
151 frName = std::string(friendTree->GetName());
161 std::set<std::string> bNamesSet;
162 ColumnNames_t bNames;
163 std::set<TTree *> analysedTrees;
164 std::string emptyFrName =
"";
170 std::set<TTree *> &analysedTrees)
173 if (!analysedTrees.insert(&t).second) {
180 auto name = branchObj->GetName();
181 if (bNamesReg.insert(
name).second) {
182 bNames.emplace_back(
name);
192 for (
auto friendTreeObj : *friendTrees) {
202 std::set<std::string> bNamesSet;
203 ColumnNames_t bNames;
204 std::set<TTree *> analysedTrees;
213 const char firstChar = var[0];
216 auto isALetter = [](
char c) {
return (
c >=
'A' &&
c <=
'Z') || (
c >=
'a' &&
c <=
'z'); };
217 const bool isValidFirstChar = firstChar ==
'_' || isALetter(firstChar);
218 if (!isValidFirstChar)
222 auto isANumber = [](
char c) {
return c >=
'0' &&
c <=
'9'; };
223 auto isValidTok = [&isALetter, &isANumber](
char c) {
return c ==
'_' || isALetter(
c) || isANumber(
c); };
224 for (
const char c : var)
232 const ColumnNames_t &dataSourceColumns)
234 const std::string definedColStr(definedCol);
237 const auto msg =
"Cannot define column \"" + definedColStr +
"\": not a valid C++ variable name.";
238 throw std::runtime_error(msg);
241 if (treePtr !=
nullptr) {
243 const auto branch = treePtr->
GetBranch(definedColStr.c_str());
244 if (branch !=
nullptr) {
245 const auto msg =
"branch \"" + definedColStr +
"\" already present in TTree";
246 throw std::runtime_error(msg);
250 if (std::find(customCols.begin(), customCols.end(), definedCol) != customCols.end()) {
251 const auto msg =
"Redefinition of column \"" + definedColStr +
"\"";
252 throw std::runtime_error(msg);
255 if (!dataSourceColumns.empty()) {
256 if (std::find(dataSourceColumns.begin(), dataSourceColumns.end(), definedCol) != dataSourceColumns.end()) {
257 const auto msg =
"Redefinition of column \"" + definedColStr +
"\" already present in the data-source";
258 throw std::runtime_error(msg);
265 if (nTemplateParams != nColumnNames) {
266 std::string err_msg =
"The number of template parameters specified is ";
267 err_msg += std::to_string(nTemplateParams);
268 err_msg +=
" while ";
269 err_msg += std::to_string(nColumnNames);
270 err_msg +=
" columns have been specified.";
271 throw std::runtime_error(err_msg);
277 SelectColumns(
unsigned int nRequiredNames,
const ColumnNames_t &names,
const ColumnNames_t &defaultNames)
281 if (defaultNames.size() < nRequiredNames)
282 throw std::runtime_error(
283 std::to_string(nRequiredNames) +
" column name" + (nRequiredNames == 1 ?
" is" :
"s are") +
284 " required but none were provided and the default list has size " + std::to_string(defaultNames.size()));
286 return ColumnNames_t(defaultNames.begin(), defaultNames.begin() + nRequiredNames);
289 if (names.size() != nRequiredNames) {
290 auto msg = std::to_string(nRequiredNames) +
" column name" + (nRequiredNames == 1 ?
" is" :
"s are") +
291 " required but " + std::to_string(names.size()) + (names.size() == 1 ?
" was" :
" were") +
293 for (
const auto &
name : names)
294 msg +=
" \"" +
name +
"\",";
296 throw std::runtime_error(msg);
302 ColumnNames_t
FindUnknownColumns(
const ColumnNames_t &requiredCols,
const ColumnNames_t &datasetColumns,
303 const ColumnNames_t &definedCols,
const ColumnNames_t &dataSourceColumns)
305 ColumnNames_t unknownColumns;
306 for (
auto &column : requiredCols) {
307 const auto isBranch = std::find(datasetColumns.begin(), datasetColumns.end(), column) != datasetColumns.end();
310 const auto isCustomColumn = std::find(definedCols.begin(), definedCols.end(), column) != definedCols.end();
313 const auto isDataSourceColumn =
314 std::find(dataSourceColumns.begin(), dataSourceColumns.end(), column) != dataSourceColumns.end();
315 if (isDataSourceColumn)
317 unknownColumns.emplace_back(column);
319 return unknownColumns;
324 return 0 == colName.find(
"tdf") &&
'_' == colName.back();
328 unsigned int Replace(std::string &
s,
const std::string what,
const std::string withWhat)
331 auto numReplacements = 0U;
332 while ((idx = s.find(what, idx)) != std::string::npos) {
333 s.replace(idx, what.size(), withWhat);
334 idx += withWhat.size();
337 return numReplacements;
343 const ColumnNames_t &customColumns,
const ColumnNames_t &dsColumns,
344 const std::map<std::string, std::string> &aliasMap)
347 const std::string paddedExpr =
" " + std::string(expression) +
" ";
348 static const std::string regexBit(
"[^a-zA-Z0-9_]");
351 std::vector<std::string> usedBranches;
354 for (
auto &brName : customColumns) {
355 std::string bNameRegexContent = regexBit + brName + regexBit;
356 TRegexp bNameRegex(bNameRegexContent.c_str());
357 if (-1 != bNameRegex.Index(paddedExpr.c_str(), &matchedLen)) {
358 usedBranches.emplace_back(brName);
363 for (
auto &brName : branches) {
365 auto escapedBrName = brName;
366 Replace(escapedBrName, std::string(
"."), std::string(
"\\."));
367 std::string bNameRegexContent = regexBit + escapedBrName + regexBit;
368 TRegexp bNameRegex(bNameRegexContent.c_str());
369 if (-1 != bNameRegex.Index(paddedExpr.c_str(), &matchedLen)) {
370 usedBranches.emplace_back(brName);
375 for (
auto &col : dsColumns) {
376 std::string bNameRegexContent = regexBit + col + regexBit;
377 TRegexp bNameRegex(bNameRegexContent.c_str());
378 if (-1 != bNameRegex.Index(paddedExpr.c_str(), &matchedLen)) {
380 if (std::find(usedBranches.begin(), usedBranches.end(), col) == usedBranches.end())
381 usedBranches.emplace_back(col);
386 for (
auto &alias_colName : aliasMap) {
387 auto &alias = alias_colName.first;
388 std::string bNameRegexContent = regexBit + alias + regexBit;
389 TRegexp bNameRegex(bNameRegexContent.c_str());
390 if (-1 != bNameRegex.Index(paddedExpr.c_str(), &matchedLen)) {
392 if (std::find(usedBranches.begin(), usedBranches.end(), alias) == usedBranches.end())
393 usedBranches.emplace_back(alias);
401 std::vector<std::string>
ReplaceDots(
const ColumnNames_t &colNames)
403 std::vector<std::string> dotlessNames = colNames;
404 for (
auto &
c : dotlessNames) {
405 const bool hasDot =
c.find_first_of(
'.') != std::string::npos;
407 std::replace(
c.begin(),
c.end(),
'.',
'_');
408 c.insert(0u,
"__tdf_arg_");
416 const std::map<std::string, std::string> &aliasMap,
418 std::string &expr,
unsigned int namespaceID)
420 std::vector<std::string> colTypes;
421 colTypes.reserve(colNames.size());
422 const auto aliasMapEnd = aliasMap.end();
424 for (
auto c = colNames.begin(),
v = varNames.begin();
c != colNames.end();) {
425 const auto &colName = *
c;
427 if (colName.find(
'.') != std::string::npos) {
429 auto numRepl =
Replace(expr, colName, *
v);
434 c = colNames.erase(
c);
435 v = varNames.erase(
v);
441 const auto paddedExpr =
" " + expr +
" ";
442 static const std::string noWordChars(
"[^a-zA-Z0-9_]");
443 const auto colNameRxBody = noWordChars + colName + noWordChars;
444 TRegexp colNameRegex(colNameRxBody.c_str());
446 const auto colStillThere = colNameRegex.
Index(paddedExpr.c_str(), &matchedLen) != -1;
447 if (!colStillThere) {
448 c = colNames.erase(
c);
449 v = varNames.erase(
v);
456 const auto aliasMapIt = aliasMap.find(colName);
457 const auto &realColName = aliasMapEnd == aliasMapIt ? colName : aliasMapIt->second;
459 const auto isCustomCol =
460 std::find(customColNames.begin(), customColNames.end(), realColName) != customColNames.end();
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);
500 BuildLambdaString(
const std::string &expr,
const ColumnNames_t &vars,
const ColumnNames_t &varTypes,
bool hasReturnStmt)
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 const std::map<std::string, std::string> &aliasMap,
const ColumnNames_t &
branches,
537 const auto &dsColumns = ds ? ds->
GetColumnNames() : ColumnNames_t{};
540 auto usedBranches =
FindUsedColumnNames(expression, branches, customCols, dsColumns, aliasMap);
542 auto dotlessExpr = std::string(expression);
543 const auto usedColTypes =
544 ColumnTypesAsString(usedBranches, varNames, aliasMap, customCols, tree, ds, dotlessExpr, namespaceID);
546 TRegexp re(
"[^a-zA-Z0-9_]return[^a-zA-Z0-9_]");
548 const bool hasReturnStmt = re.
Index(dotlessExpr, &matchedLen) != -1;
552 const auto filterLambda =
BuildLambdaString(dotlessExpr, varNames, usedColTypes, hasReturnStmt);
559 std::stringstream filterInvocation;
560 filterInvocation <<
"ROOT::Internal::RDF::JitFilterHelper(" << filterLambda <<
", {";
561 for (
const auto &brName : usedBranches) {
563 const auto aliasMapIt = aliasMap.find(brName);
564 auto &realBrName = aliasMapIt == aliasMap.end() ? brName : aliasMapIt->second;
565 filterInvocation <<
"\"" << realBrName <<
"\", ";
567 if (!usedBranches.empty())
568 filterInvocation.seekp(-2, filterInvocation.cur);
569 filterInvocation <<
"}, \"" << name <<
"\", " 570 <<
"reinterpret_cast<ROOT::Detail::RDF::RJittedFilter*>(" << jittedFilterAddr <<
"), " 571 <<
"reinterpret_cast<" << prevNodeTypeName <<
"*>(" << prevNodeAddr <<
"));";
583 const auto namespaceID = lm.
GetID();
584 const auto &dsColumns = ds ? ds->
GetColumnNames() : ColumnNames_t{};
589 auto dotlessExpr = std::string(expression);
590 const auto usedColTypes =
593 TRegexp re(
"[^a-zA-Z0-9_]return[^a-zA-Z0-9_]");
595 const bool hasReturnStmt = re.
Index(dotlessExpr, &matchedLen) != -1;
599 const auto definelambda =
BuildLambdaString(dotlessExpr, varNames, usedColTypes, hasReturnStmt);
600 const auto lambdaName =
"eval_" + std::string(name);
601 const auto ns =
"__tdf" + std::to_string(namespaceID);
606 const auto defineDeclaration =
607 "namespace " +
ns +
" { auto " + lambdaName +
" = " + definelambda +
";\n" +
"using " + std::string(name) +
608 "_type = typename ROOT::TypeTraits::CallableTraits<decltype(" + lambdaName +
" )>::ret_type; }\n";
611 std::stringstream defineInvocation;
612 defineInvocation <<
"ROOT::Internal::RDF::JitDefineHelper(" << definelambda <<
", {";
613 for (
auto brName : usedBranches) {
615 auto aliasMapIt = aliasMap.find(brName);
616 auto &realBrName = aliasMapIt == aliasMap.end() ? brName : aliasMapIt->second;
617 defineInvocation <<
"\"" << realBrName <<
"\", ";
619 if (!usedBranches.empty())
620 defineInvocation.seekp(-2, defineInvocation.cur);
621 defineInvocation <<
"}, \"" << name <<
"\", reinterpret_cast<ROOT::Detail::RDF::RLoopManager*>(" 625 lm.
ToJit(defineInvocation.str());
630 std::string
JitBuildAndBook(
const ColumnNames_t &bl,
const std::string &prevNodeTypename,
void *prevNode,
631 const std::type_info &art,
const std::type_info &at,
const void *rOnHeap,
TTree *
tree,
632 const unsigned int nSlots,
const ColumnNames_t &customColumns,
RDataSource *ds,
633 const std::shared_ptr<RActionBase *> *
const actionPtrPtr,
unsigned int namespaceID)
635 auto nBranches = bl.size();
638 std::vector<std::string> columnTypeNames(nBranches);
639 for (
auto i = 0u; i < nBranches; ++i) {
640 const auto isCustomCol = std::find(customColumns.begin(), customColumns.end(), bl[i]) != customColumns.end();
642 if (columnTypeName.empty()) {
643 std::string exceptionText =
"The type of column ";
644 exceptionText += bl[i];
645 exceptionText +=
" could not be guessed. Please specify one.";
646 throw std::runtime_error(exceptionText.c_str());
648 columnTypeNames[i] = columnTypeName;
653 if (!actionResultTypeClass) {
654 std::string exceptionText =
"An error occurred while inferring the result type of an operation.";
655 throw std::runtime_error(exceptionText.c_str());
657 const auto actionResultTypeName = actionResultTypeClass->GetName();
661 if (!actionTypeClass) {
662 std::string exceptionText =
"An error occurred while inferring the action type of the operation.";
663 throw std::runtime_error(exceptionText.c_str());
665 const auto actionTypeName = actionTypeClass->GetName();
671 std::stringstream createAction_str;
672 createAction_str <<
"ROOT::Internal::RDF::CallBuildAndBook" 673 <<
"<" << actionTypeName;
674 for (
auto &colType : columnTypeNames)
675 createAction_str <<
", " << colType;
678 createAction_str <<
">(*reinterpret_cast<" << prevNodeTypename <<
"*>(" << std::hex << std::showbase
679 << (size_t)prevNode <<
"), {";
680 for (
auto i = 0u; i < bl.size(); ++i) {
682 createAction_str <<
", ";
683 createAction_str <<
'"' << bl[i] <<
'"';
685 createAction_str <<
"}, " << std::dec << std::noshowbase << nSlots <<
", reinterpret_cast<" << actionResultTypeName
686 <<
"*>(" << std::hex << std::showbase << (size_t)rOnHeap <<
")" 687 <<
", reinterpret_cast<const std::shared_ptr<ROOT::Internal::RDF::RActionBase*>*>(" << std::hex
688 << std::showbase << (
size_t)actionPtrPtr <<
"));";
689 return createAction_str.str();
694 for (
const auto &
s : strings) {
702 std::shared_ptr<RFilterBase>
UpcastNode(
const std::shared_ptr<RFilterBase> ptr)
707 std::shared_ptr<RCustomColumnBase>
UpcastNode(
const std::shared_ptr<RCustomColumnBase> ptr)
712 std::shared_ptr<RRangeBase>
UpcastNode(
const std::shared_ptr<RRangeBase> ptr)
717 std::shared_ptr<RLoopManager>
UpcastNode(
const std::shared_ptr<RLoopManager> ptr)
722 std::shared_ptr<RJittedFilter>
UpcastNode(
const std::shared_ptr<RJittedFilter> ptr)
733 const ColumnNames_t &datasetColumns,
const ColumnNames_t &validCustomColumns,
737 auto selectedColumns =
SelectColumns(nColumns, columns, defaultColumns);
738 const auto unknownColumns =
FindUnknownColumns(selectedColumns, datasetColumns, validCustomColumns,
741 if (!unknownColumns.empty()) {
743 std::stringstream unknowns;
744 std::string delim = unknownColumns.size() > 1 ?
"s: " :
": ";
745 for (
auto &unknownColumn : unknownColumns) {
746 unknowns << delim << unknownColumn;
749 throw std::runtime_error(
"Unknown column" + unknowns.str());
754 auto aliasMapEnd = aliasMap.end();
756 for (
auto idx :
ROOT::TSeqU(selectedColumns.size())) {
757 const auto &colName = selectedColumns[idx];
758 const auto aliasColumnNameIt = aliasMap.find(colName);
759 if (aliasMapEnd != aliasColumnNameIt) {
760 selectedColumns[idx] = aliasColumnNameIt->second;
764 return selectedColumns;
772 const auto nColumns = requestedCols.size();
773 std::vector<bool> mustBeDefined(nColumns,
false);
774 for (
auto i = 0u; i < nColumns; ++i)
775 mustBeDefined[i] = std::find(definedCols.begin(), definedCols.end(), requestedCols[i]) == definedCols.end();
776 return mustBeDefined;
std::string JitBuildAndBook(const ColumnNames_t &bl, const std::string &prevNodeTypename, void *prevNode, const std::type_info &art, const std::type_info &at, const void *rOnHeap, TTree *tree, const unsigned int nSlots, const ColumnNames_t &customColumns, RDataSource *ds, const std::shared_ptr< RActionBase *> *const actionPtrPtr, unsigned int namespaceID)
void GetTopLevelBranchNamesImpl(TTree &t, std::set< std::string > &bNamesReg, ColumnNames_t &bNames, std::set< TTree *> &analysedTrees)
virtual const char * GetName() const
Returns name of object.
void BookDefineJit(std::string_view name, std::string_view expression, RLoopManager &lm, RDataSource *ds)
void AddCustomColumnName(std::string_view name)
ColumnNames_t GetTopLevelBranchNames(TTree &t)
Get all the top-level branches names, including the ones of the friend trees.
std::vector< std::string > ReplaceDots(const ColumnNames_t &colNames)
bool AtLeastOneEmptyString(const std::vector< std::string_view > strings)
Namespace for new ROOT classes and functions.
std::string PrettyPrintAddr(void *addr)
virtual const std::vector< std::string > & GetColumnNames() const =0
Returns a reference to the collection of the dataset's column names.
bool IsInternalColumn(std::string_view colName)
std::string BuildLambdaString(const std::string &expr, const ColumnNames_t &vars, const ColumnNames_t &varTypes, bool hasReturnStmt)
unsigned int Replace(std::string &s, const std::string what, const std::string withWhat)
virtual TList * GetListOfFriends() const
Regular expression class.
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.
virtual TObjArray * GetListOfBranches()
void ExploreBranch(TTree &t, std::set< std::string > &bNamesReg, ColumnNames_t &bNames, TBranch *b, std::string prefix, std::string &friendName)
const ColumnNames_t & GetDefaultColumnNames() const
Return the list of default columns – empty if none was provided when constructing the RDataFrame...
bool IsValidCppVarName(const std::string &var)
std::shared_ptr< RJittedFilter > UpcastNode(const std::shared_ptr< RJittedFilter > ptr)
A wrapper around a concrete RFilter, which forwards all calls to it RJittedFilter is the type of the ...
TObjArray * GetListOfBranches()
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)
ColumnNames_t FindUnknownColumns(const ColumnNames_t &requiredCols, const ColumnNames_t &datasetColumns, const ColumnNames_t &definedCols, const ColumnNames_t &dataSourceColumns)
unsigned int GetID() const
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
RLoopManager * GetLoopManagerUnchecked() const
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 ...
const ColumnNames_t & GetCustomColumnNames() const
void TryToJitExpression(const std::string &expression, const ColumnNames_t &colNames, const std::vector< std::string > &colTypes, bool hasReturnStmt)
void BookFilterJit(RJittedFilter *jittedFilter, void *prevNode, std::string_view prevNodeTypeName, std::string_view name, std::string_view expression, const std::map< std::string, std::string > &aliasMap, const ColumnNames_t &branches, const ColumnNames_t &customCols, TTree *tree, RDataSource *ds, unsigned int namespaceID)
void GetBranchNamesImpl(TTree &t, std::set< std::string > &bNamesReg, ColumnNames_t &bNames, std::set< TTree *> &analysedTrees, std::string &friendName)
ColumnNames_t GetValidatedColumnNames(RLoopManager &lm, const unsigned int nColumns, const ColumnNames_t &columns, const ColumnNames_t &datasetColumns, const ColumnNames_t &validCustomColumns, RDataSource *ds)
Given the desired number of columns and the user-provided list of columns:
A Branch for the case of an object.
std::string ColumnName2ColumnTypeName(const std::string &colName, unsigned int namespaceID, TTree *tree, RDataSource *ds, bool isCustomColumn, bool vector2tvec)
Return a string containing the type of the given branch.
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 pseudo container class which is a generator of indices.
basic_string_view< char > string_view
static constexpr double s
std::vector< std::string > ColumnTypesAsString(ColumnNames_t &colNames, ColumnNames_t &varNames, const std::map< std::string, std::string > &aliasMap, const ColumnNames_t &customColNames, TTree *tree, RDataSource *ds, std::string &expr, unsigned int namespaceID)
TObjArray * GetListOfLeaves()
void CheckCustomColumn(std::string_view definedCol, TTree *treePtr, const ColumnNames_t &customCols, const ColumnNames_t &dataSourceColumns)
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.
void UpdateList(std::set< std::string > &bNamesReg, ColumnNames_t &bNames, std::string &branchName, std::string &friendName)
void ToJit(const std::string &s)
void CheckTypesAndPars(unsigned int nTemplateParams, unsigned int nColumnNames)
A TFriendElement TF describes a TTree object TF in a file.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
A TTree object has a header with a name and a title.
const std::map< std::string, std::string > & GetAliasMap() const
A TTree is a list of TBranches.
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
static constexpr double ns
ColumnNames_t GetBranchNames(TTree &t)
Get all the branches names, including the ones of the friend trees.
virtual const char * GetFriendAlias(TTree *) const
If the 'tree' is a friend, this method returns its alias name.