Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RDFColumnRegister.cxx
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
3 * All rights reserved. *
4 * *
5 * For the licensing terms see $ROOTSYS/LICENSE. *
6 * For the list of contributors see $ROOTSYS/README/CREDITS. *
7 *************************************************************************/
8
12#include "ROOT/RDF/Utils.hxx" // IsStrInVec
13
14#include <cassert>
15#include <set>
16
17namespace ROOT {
18namespace Internal {
19namespace RDF {
20
21bool RColumnRegister::HasName(std::string_view name) const
22{
23 const auto ccolnamesEnd = fColumnNames->end();
24 return ccolnamesEnd != std::find(fColumnNames->begin(), ccolnamesEnd, name);
25}
26
27void RColumnRegister::AddColumn(const std::shared_ptr<RDFDetail::RDefineBase> &column)
28{
29 auto newDefines = std::make_shared<DefinesMap_t>(*fDefines);
30 const std::string &colName = column->GetName();
31 (*newDefines)[colName] = column;
32 fDefines = std::move(newDefines);
33 AddName(colName);
34}
35
36void RColumnRegister::AddVariation(const std::shared_ptr<RVariationBase> &variation)
37{
38 auto newVariations = std::make_shared<VariationsMap_t>(*fVariations);
39 const std::vector<std::string> &colNames = variation->GetColumnNames();
40 for (auto &colName : colNames)
41 newVariations->insert({colName, variation});
42 fVariations = std::move(newVariations);
43}
44
45std::vector<std::string> RColumnRegister::GetVariationsFor(const std::string &column) const
46{
47 std::vector<std::string> variations;
48 auto range = fVariations->equal_range(column);
49 for (auto it = range.first; it != range.second; ++it)
50 for (const auto &variationName : it->second->GetVariationNames())
51 variations.emplace_back(variationName);
52
53 return variations;
54}
55
56std::vector<std::string> RColumnRegister::GetVariationDeps(const std::string &column) const
57{
58 return GetVariationDeps(std::vector<std::string>{column});
59}
60
61std::vector<std::string> RColumnRegister::GetVariationDeps(const ColumnNames_t &columns) const
62{
63 // here we assume that columns do not contain aliases, they must have already been resolved
64 std::set<std::string> variationNames;
65
66 for (const auto &col : columns) {
67 const auto &variations = GetVariationsFor(col);
68 for (const auto &var : variations)
69 variationNames.insert(var);
70
71 // For Define'd columns, add the systematic variations they depend on to the set
72 auto defineIt = fDefines->find(col);
73 if (defineIt != fDefines->end()) {
74 for (const auto &v : defineIt->second->GetVariations())
75 variationNames.insert(v);
76 }
77 }
78
79 return {variationNames.begin(), variationNames.end()};
80}
81
82/// \brief Return the RVariation object that handles the specified variation of the specified column.
83RVariationBase &RColumnRegister::FindVariation(const std::string &colName, const std::string &variationName) const
84{
85 auto range = fVariations->equal_range(colName);
86 assert(range.first != fVariations->end() && "Could not find the variation you asked for. This should never happen.");
87 auto it = range.first;
88 while (it != fVariations->end() && !IsStrInVec(variationName, it->second->GetVariationNames()))
89 ++it;
90 assert(it != fVariations->end() && "Could not find the variation you asked for. This should never happen.");
91 return *it->second;
92}
93
94void RColumnRegister::AddName(std::string_view name)
95{
96 const auto &names = *fColumnNames;
97 if (std::find(names.begin(), names.end(), name) != names.end())
98 return; // must be a Redefine of an existing column. Nothing to do.
99
100 auto newColsNames = std::make_shared<ColumnNames_t>(names);
101 newColsNames->emplace_back(std::string(name));
102 fColumnNames = newColsNames;
103}
104
105void RColumnRegister::AddAlias(std::string_view alias, std::string_view colName)
106{
107 // at this point validation of alias and colName has already happened, we trust that
108 // this is a new, valid alias.
109 auto newAliases = std::make_shared<std::unordered_map<std::string, std::string>>(*fAliases);
110 (*newAliases)[std::string(alias)] = ResolveAlias(colName);
111 fAliases = std::move(newAliases);
112 AddName(alias);
113}
114
115bool RColumnRegister::IsAlias(const std::string &name) const
116{
117 return fAliases->find(name) != fAliases->end();
118}
119
120std::string RColumnRegister::ResolveAlias(std::string_view alias) const
121{
122 std::string aliasStr{alias};
123
124 // #var is an alias for R_rdf_sizeof_var
125 if (aliasStr.size() > 1 && aliasStr[0] == '#')
126 return "R_rdf_sizeof_" + aliasStr.substr(1);
127
128 auto it = fAliases->find(aliasStr);
129 if (it != fAliases->end())
130 return it->second;
131
132 return aliasStr; // not an alias, i.e. already resolved
133}
134
135void RColumnRegister::Clear()
136{
137 fAliases.reset();
138 fDefines.reset();
139 fVariations.reset();
140 fColumnNames.reset();
141}
142
143} // namespace RDF
144} // namespace Internal
145} // namespace ROOT
char name[80]
Definition TGX11.cxx:110
void AddVariation(const std::shared_ptr< RVariationBase > &variation)
Register a new systematic variation.
std::shared_ptr< const VariationsMap_t > fVariations
Immutable multimap of Variations, can be shared among several nodes.
std::shared_ptr< const DefinesMap_t > fDefines
Immutable map of Defines, can be shared among several nodes.
bool HasName(std::string_view name) const
Check if the provided name is tracked in the names list.
std::shared_ptr< const ColumnNames_t > fColumnNames
Names of Defines and Aliases registered so far.
void AddColumn(const std::shared_ptr< RDFDetail::RDefineBase > &column)
Add a new booked column.
std::vector< std::string > ColumnNames_t
void AddName(std::string_view name)
Add a new name to the list returned by GetNames without booking a new column.
This type includes all parts of RVariation that do not depend on the callable signature.
bool IsStrInVec(const std::string &str, const std::vector< std::string > &vec)
Definition RDFUtils.cxx:419
std::string ResolveAlias(const std::string &col, const std::map< std::string, std::string > &aliasMap)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...