11#ifndef ROOT_RDF_RVARIATION
12#define ROOT_RDF_RVARIATION
42using namespace ROOT::TypeTraits;
47bool ResultsSizeEq(
const T &results, std::size_t expected, std::size_t nColumns, std::true_type )
49 assert(nColumns == 1);
52 return results.size() == expected;
58 return results.
size();
64 results.
resize(nVariations);
73 const auto nVariations = resStorage.
size();
75 for (
auto i = 0u; i < nVariations; ++i)
76 resStorage[i] = std::move(tmpResults[i]);
82 return static_cast<void *
>(&
v[varIdx]);
89bool ResultsSizeEq(
const T &results, std::size_t expected, std::size_t , std::false_type )
91 return std::all_of(results.begin(), results.end(),
92 [expected](
const auto &inner) { return inner.size() == expected; });
98 assert(!results.empty());
99 return results[0].size();
105 results.resize(nCols);
106 for (
auto &rvecOverVariations : results)
107 rvecOverVariations.resize(nVariations);
114 const auto nCols = resStorage.size();
115 const auto nVariations = resStorage[0].size();
116 for (
auto colIdx = 0u; colIdx < nCols; ++colIdx)
117 for (
auto varIdx = 0u; varIdx < nVariations; ++varIdx)
118 resStorage[colIdx][varIdx] = std::move(tmpResults[colIdx][varIdx]);
124 return static_cast<void *
>(&
v[colIdx][varIdx]);
128template <
typename VaryExpressionRet_t,
bool IsSingleColumn>
144template <
bool IsSingleColumn,
typename Ret_t>
147template <
typename F,
bool IsSingleColumn>
150 using TypeInd_t = std::make_index_sequence<ColumnTypes_t::list_size>;
153 using Result_t = std::conditional_t<IsSingleColumn, ROOT::RVec<VariedCol_t>, std::vector<ROOT::RVec<VariedCol_t>>>;
160 std::vector<std::array<RColumnReaderBase *, ColumnTypes_t::list_size>>
fValues;
162 template <
typename ColType>
165 if (
auto *val =
fValues[slot][readerIdx]->
template TryGet<ColType>(entry))
168 throw std::out_of_range{
"RDataFrame: Could not retrieve value for variation '" +
fColNames[readerIdx] +
169 "' for entry " + std::to_string(entry) +
170 ". You can use the DefaultValueFor operation to provide a default value, or "
171 "FilterAvailable/FilterMissing to discard/keep entries with missing values instead."};
174 template <
typename... ColTypes, std::size_t... S>
182 std::integral_constant<bool, IsSingleColumn>{})) {
184 throw std::runtime_error(
"The evaluation of the expression for variation \"" + variationName +
185 "\" resulted in " + std::to_string(
GetNVariations(results)) +
" values, but " +
193 RVariation(
const std::vector<std::string> &colNames, std::string_view variationName,
F expression,
194 const std::vector<std::string> &variationTags, std::string_view
type,
const RColumnRegister &defines,
196 :
RVariationBase(colNames, variationName, variationTags,
type, defines, lm, inputColNames),
203 for (
auto i = 0u; i < lm.
GetNSlots(); ++i)
219 void *
GetValuePtr(
unsigned int slot,
const std::string &column,
const std::string &variation)
final
223 const auto colIdx = std::distance(
fColNames.begin(), colIt);
long long Long64_t
Portable signed long integer 8 bytes.
The head node of a RDF computation graph.
unsigned int GetNSlots() const
A binder for user-defined columns, variations and aliases.
std::vector< std::string > fColNames
The names of the varied columns.
RLoopManager * fLoopManager
RVariationBase(const std::vector< std::string > &colNames, std::string_view variationName, const std::vector< std::string > &variationTags, std::string_view type, const RColumnRegister &colRegister, RLoopManager &lm, const ColumnNames_t &inputColNames)
ROOT::RVecB fIsDefine
The nth flag signals whether the nth input column is a custom column or not.
std::vector< std::string > fVariationNames
The tags of the systematic variation.
ColumnNames_t fInputColumns
std::vector< Long64_t > fLastCheckedEntry
RColumnRegister fColumnRegister
void Update(unsigned int slot, Long64_t entry) final
Update the value at the address returned by GetValuePtr with the content corresponding to the given e...
const std::type_info & GetTypeId() const final
void FinalizeSlot(unsigned int slot) final
Clean-up operations to be performed at the end of a task.
void * GetValuePtr(unsigned int slot, const std::string &column, const std::string &variation) final
Return the (type-erased) address of the value for the given processing slot.
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
auto GetValueChecked(unsigned int slot, std::size_t readerIdx, Long64_t entry) -> ColType &
ColumnType_t< IsSingleColumn, Ret_t > VariedCol_t
RVariation(const std::vector< std::string > &colNames, std::string_view variationName, F expression, const std::vector< std::string > &variationTags, std::string_view type, const RColumnRegister &defines, RLoopManager &lm, const ColumnNames_t &inputColNames)
void InitSlot(TTreeReader *r, unsigned int slot) final
RVariation & operator=(const RVariation &)=delete
typename CallableTraits< F >::ret_type Ret_t
std::vector< std::array< RColumnReaderBase *, ColumnTypes_t::list_size > > fValues
Column readers per slot and per input column.
void UpdateHelper(unsigned int slot, Long64_t entry, TypeList< ColTypes... >, std::index_sequence< S... >)
typename CallableTraits< F >::arg_types ColumnTypes_t
std::vector< Result_t > fLastResults
Per-slot storage for varied column values (for one or multiple columns depending on IsSingleColumn).
RVariation(const RVariation &)=delete
std::conditional_t< IsSingleColumn, ROOT::RVec< VariedCol_t >, std::vector< ROOT::RVec< VariedCol_t > > > Result_t
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
ROOT::Detail::CallableTraitsImpl< F > CallableTraits
Extract types from the signature of a callable object.
A "std::vector"-like collection of values implementing handy operation to analyse them.
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
std::size_t GetNVariations(const RVec< T > &results)
void ResizeResults(ROOT::RVec< T > &results, std::size_t, std::size_t nVariations)
void * GetValuePtrHelper(ROOT::RVec< T > &v, std::size_t, std::size_t varIdx)
constexpr std::size_t CacheLineStep()
Stepping through CacheLineStep<T> values in a vector<T> brings you to a new cache line.
void AssignResults(ROOT::RVec< T > &resStorage, ROOT::RVec< T > &&tmpResults)
Assign into fLastResults[slot] without changing the addresses of its elements (we gave those addresse...
typename ColumnType< Ret_t, IsSingleColumn >::type ColumnType_t
When varying a single column, Ret_t is RVec<T> and ColumnType_t is T.
std::array< RDFDetail::RColumnReaderBase *, sizeof...(ColTypes)> GetColumnReaders(unsigned int slot, TTreeReader *treeReader, TypeList< ColTypes... >, const RColumnReadersInfo &colInfo, const std::string &variationName="nominal")
Create a group of column readers, one per type in the parameter pack.
bool ResultsSizeEq(const T &results, std::size_t expected, std::size_t nColumns, std::true_type)
std::vector< std::string > ColumnNames_t
This type aggregates some of the arguments passed to GetColumnReaders.
Lightweight storage for a collection of types.