11#ifndef ROOT_RACTIONSNAPSHOT
12#define ROOT_RACTIONSNAPSHOT
29std::shared_ptr<GraphNode>
AddDefinesToGraph(std::shared_ptr<GraphNode> node,
const RColumnRegister &colRegister,
30 const std::vector<std::string> &prevNodeDefines,
31 std::unordered_map<
void *, std::shared_ptr<GraphNode>> &visitedMap);
36template <
typename Helper,
typename PrevNode>
44 using PrevNodeCommon_t = std::conditional_t<std::is_same_v<PrevNode, ROOT::Detail::RDF::RJittedFilter>,
47 std::vector<std::shared_ptr<PrevNodeCommon_t>>
fPrevNodes;
50 std::vector<std::vector<RColumnReaderBase *>>
fValues;
69 fPrevNodes.resize(1 + currentVariations.size(), nominalPrevNode);
74 const auto &prevVariations = nominalPrevNode->GetVariations();
75 fPrevNodes.reserve(1 + currentVariations.size());
77 for (
const auto &variation : currentVariations) {
80 std::static_pointer_cast<PrevNodeCommon_t>(nominalPrevNode->GetVariedFilter(variation)));
89 const std::vector<const std::type_info *> &colTypeIDs, std::shared_ptr<PrevNode> pd,
99 const auto nColumns = columns.size();
101 for (
auto i = 0u; i < nColumns; ++i)
104 if constexpr (std::is_same_v<Helper, SnapshotHelperWithVariations>) {
112 for (
auto i = 0u; i < nColumns; ++i) {
114 auto define = colRegister.
GetDefine(columns[i]);
134 return fHelper.GetMergeableValue();
144 if constexpr (std::is_same_v<Helper, SnapshotHelperWithVariations>) {
148 for (
unsigned int variationIndex = 0; variationIndex < variations.size(); ++variationIndex) {
149 auto const &readers =
152 for (
unsigned int i = 0; i < readers.size(); ++i) {
153 if (
fValues[slot][i] != readers[i]) {
155 fValues[slot].push_back(readers[i]);
157 fHelper.RegisterVariedColumn(slot, i, i, 0,
160 variations[variationIndex]);
173 if (
auto *val =
fValues[slot][readerIdx]->
template TryGet<void>(entry))
176 throw std::out_of_range{
"RDataFrame: Action (" +
fHelper.GetActionName() +
177 ") could not retrieve value for column '" +
fColumnNames[readerIdx] +
"' for entry " +
178 std::to_string(entry) +
179 ". You can use the DefaultValueFor operation to provide a default value, or "
180 "FilterAvailable/FilterMissing to discard/keep entries with missing values instead."};
185 std::vector<void *> untypedValues;
186 auto nReaders =
fValues[slot].size();
187 untypedValues.reserve(nReaders);
188 for (
decltype(nReaders) readerIdx{}; readerIdx < nReaders; readerIdx++)
189 untypedValues.push_back(
GetValue(slot, readerIdx, entry));
191 fHelper.Exec(slot, untypedValues);
196 if constexpr (std::is_same_v<Helper, SnapshotHelperWithVariations>) {
198 std::vector<bool> filterPassed(
fPrevNodes.size(),
false);
199 for (
unsigned int variation = 0; variation <
fPrevNodes.size(); ++variation) {
200 filterPassed[variation] =
fPrevNodes[variation]->CheckFilters(slot, entry);
205 if (std::any_of(filterPassed.begin(), filterPassed.end(), [](
bool val) { return val; })) {
207 std::vector<void *> untypedValues;
208 auto nReaders =
fValues[slot].size();
209 untypedValues.reserve(nReaders);
210 for (
decltype(nReaders) readerIdx{}; readerIdx < nReaders; readerIdx++)
211 untypedValues.push_back(
GetValue(slot, readerIdx, entry));
213 fHelper.Exec(slot, untypedValues, filterPassed);
216 if (
fPrevNodes.front()->CheckFilters(slot, entry))
224 node->IncrChildrenCount();
231 fHelper.CallFinalizeTask(slot);
242 std::shared_ptr<GraphDrawing::GraphNode>
243 GetGraph(std::unordered_map<
void *, std::shared_ptr<GraphDrawing::GraphNode>> &visitedMap)
final
247 auto thisNode = std::make_shared<GraphDrawing::GraphNode>(
fHelper.GetActionName(), visitedMap.size(), nodeType);
248 visitedMap[(
void *)
this] = thisNode;
251 auto prevNode = node->GetGraph(visitedMap);
252 const auto &prevColumns = prevNode->GetDefinedColumns();
253 auto upmostNode = AddDefinesToGraph(thisNode,
GetColRegister(), prevColumns, visitedMap);
255 thisNode->AddDefinedColumns(
GetColRegister().GenerateColumnNames());
256 upmostNode->SetPrevNode(prevNode);
265 [[maybe_unused]] std::unique_ptr<RActionBase>
MakeVariedAction(std::vector<void *> && ) final
267 throw std::logic_error(
"RDataFrame::Snapshot: The snapshot action cannot be varied. Instead, switch on "
268 "variations in RSnapshotOptions.");
280 std::static_pointer_cast<PrevNode>(
fPrevNodes.front()),
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
long long Long64_t
Portable signed long integer 8 bytes.
Base class for non-leaf nodes of the computational graph.
const ColumnNames_t fColumnNames
RActionBase(RLoopManager *lm, const ColumnNames_t &colNames, const RColumnRegister &colRegister, const std::vector< std::string > &prevVariations)
unsigned int GetNSlots() const
const std::vector< std::string > & GetVariations() const
const ColumnNames_t & GetColumnNames() const
virtual bool HasRun() const
RLoopManager * fLoopManager
A raw pointer to the RLoopManager at the root of this functional graph.
RColumnRegister & GetColRegister()
RActionSnapshot & operator=(const RActionSnapshot &)=delete
void CallExec(unsigned int slot, Long64_t entry)
ROOT::RDF::SampleCallback_t GetSampleCallback() final
void TriggerChildrenCount() final
std::unique_ptr< RActionBase > MakeVariedAction(std::vector< void * > &&) final
Will throw, since varied actions are unsupported. Instead, set a flag in RSnapshotOptions.
std::vector< bool > fIsDefine
The nth flag signals whether the nth input column is a custom column or not.
std::vector< std::vector< RColumnReaderBase * > > fValues
Column readers per slot and per input column.
void InitSlot(TTreeReader *r, unsigned int slot) final
void * PartialUpdate(unsigned int slot) final
Forwards to the action helpers; will throw since PartialUpdate not supported for most snapshot helper...
void FinalizeSlot(unsigned int slot) final
Clean-up operations to be performed at the end of a task.
std::unique_ptr< RActionBase > CloneAction(void *newResult) final
Returns a new action with a cloned helper.
RActionSnapshot(Helper &&h, const std::vector< std::string > &columns, const std::vector< const std::type_info * > &colTypeIDs, std::shared_ptr< PrevNode > pd, const RColumnRegister &colRegister)
std::conditional_t< std::is_same_v< PrevNode, ROOT::Detail::RDF::RJittedFilter >, ROOT::Detail::RDF::RFilterBase, PrevNode > PrevNodeCommon_t
std::vector< std::shared_ptr< PrevNodeCommon_t > > fPrevNodes
Previous nodes in the computation graph. First element is nominal, others are varied.
void * GetValue(unsigned int slot, std::size_t readerIdx, Long64_t entry)
RActionSnapshot(RActionSnapshot &&)=delete
std::vector< const std::type_info * > fColTypeIDs
Types of the columns to Snapshot.
void Finalize() final
Clean-up and finalize the action result (e.g.
std::unique_ptr< ROOT::Detail::RDF::RMergeableValueBase > GetMergeableValue() const final
Retrieve a wrapper to the result of the action that knows how to merge with others of the same type.
std::shared_ptr< GraphDrawing::GraphNode > GetGraph(std::unordered_map< void *, std::shared_ptr< GraphDrawing::GraphNode > > &visitedMap) final
void AppendVariedPrevNodes()
RActionSnapshot(const RActionSnapshot &)=delete
RActionSnapshot & operator=(RActionSnapshot &&)=delete
void Run(unsigned int slot, Long64_t entry) final
A binder for user-defined columns, variations and aliases.
bool IsDefineOrAlias(std::string_view name) const
Check if the provided name is tracked in the names list.
RDFDetail::RDefineBase * GetDefine(std::string_view colName) const
Return the RDefine for the requested column name, or nullptr.
TTree snapshot helper with systematic variations.
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
std::shared_ptr< GraphNode > AddDefinesToGraph(std::shared_ptr< GraphNode > node, const RColumnRegister &colRegister, const std::vector< std::string > &prevNodeDefines, std::unordered_map< void *, std::shared_ptr< GraphNode > > &visitedMap)
bool IsStrInVec(const std::string &str, const std::vector< std::string > &vec)
std::vector< RDFDetail::RColumnReaderBase * > GetUntypedColumnReaders(unsigned int slot, TTreeReader *treeReader, ROOT::Internal::RDF::RColumnRegister &colRegister, ROOT::Detail::RDF::RLoopManager &lm, const std::vector< std::string > &colNames, const std::vector< const std::type_info * > &colTypeIDs, const std::string &variationName="nominal")
std::function< void(unsigned int, const ROOT::RDF::RSampleInfo &)> SampleCallback_t
The type of a data-block callback, registered with an RDataFrame computation graph via e....