11#ifndef ROOT_RVARIEDACTION 
   12#define ROOT_RVARIEDACTION 
   39template <
typename Helper, 
typename PrevNode, 
typename ColumnTypes_t>
 
   41   using TypeInd_t = std::make_index_sequence<ColumnTypes_t::list_size>;
 
   51   std::vector<std::vector<std::array<RColumnReaderBase *, ColumnTypes_t::list_size>>> 
fInputValues;
 
   54   std::array<bool, ColumnTypes_t::list_size> 
fIsDefine;
 
   61   std::vector<std::shared_ptr<PrevNodeType>> 
MakePrevFilters(std::shared_ptr<PrevNode> nominal)
 const 
   63      const auto &variations = GetVariations();
 
   64      std::vector<std::shared_ptr<PrevNodeType>> 
prevFilters;
 
   66      if (
static_cast<RNodeBase *
>(nominal.get()) == fLoopManager) {
 
   72         for (
const auto &
variation : variations) {
 
   74               prevFilters.emplace_back(std::static_pointer_cast<PrevNodeType>(nominal->GetVariedFilter(
variation)));
 
 
   90      fLoopManager->Register(
this);
 
   94         fIsDefine[i] = define != 
nullptr;
 
   96            define->MakeVariations(GetVariations());
 
 
  116        fPrevNodes(MakePrevFilters(prevNode)),
 
 
  129      std::for_each(fHelpers.begin(), fHelpers.end(), [](Helper &
h) { h.Initialize(); });
 
 
  137      for (
const auto &
variation : GetVariations())
 
  140      std::for_each(fHelpers.begin(), fHelpers.end(), [=](Helper &
h) { h.InitTask(r, slot); });
 
 
  143   template <
typename ColType>
 
  149      throw std::out_of_range{
"RDataFrame: Varied action (" + fHelpers[0].GetActionName() +
 
  150                              ") could not retrieve value for column '" + fColumnNames[
readerIdx] + 
"' for entry " +
 
  151                              std::to_string(
entry) +
 
  152                              ". You can use the DefaultValueFor operation to provide a default value, or " 
  153                              "FilterAvailable/FilterMissing to discard/keep entries with missing values instead."};
 
 
  158                 std::index_sequence<ReaderIdxs...>)
 
 
  174      std::for_each(fPrevNodes.begin(), fPrevNodes.end(), [](
auto &
f) { f->IncrChildrenCount(); });
 
 
  180      fInputValues[
slot].clear();
 
  181      std::for_each(fHelpers.begin(), fHelpers.end(), [=](Helper &
h) { h.CallFinalizeTask(slot); });
 
 
  188      std::for_each(fHelpers.begin(), fHelpers.end(), [](Helper &
h) { h.Finalize(); });
 
 
  198      if (fHelpers[0].GetSampleCallback()) {
 
  199         std::vector<ROOT::RDF::SampleCallback_t> callbacks;
 
  200         for (
auto &
h : fHelpers)
 
  201            callbacks.push_back(
h.GetSampleCallback());
 
 
  214   std::shared_ptr<RDFGraphDrawing::GraphNode>
 
  217      auto prevNode = fPrevNodes[0]->GetGraph(
visitedMap);
 
  218      const auto &
prevColumns = prevNode->GetDefinedColumns();
 
  221      const auto nodeType = HasRun() ? RDFGraphDrawing::ENodeType::kUsedAction : RDFGraphDrawing::ENodeType::kAction;
 
  222      auto thisNode = std::make_shared<RDFGraphDrawing::GraphNode>(
"Varied " + fHelpers[0].GetActionName(),
 
  228      thisNode->AddDefinedColumns(GetColRegister().GenerateColumnNames());
 
 
  239      std::vector<std::string> keys{GetVariations()};
 
  241      std::vector<std::unique_ptr<RDFDetail::RMergeableValueBase>> values;
 
  242      values.reserve(fHelpers.size());
 
  243      for (
auto &&
h : fHelpers)
 
  244         values.emplace_back(
h.GetMergeableValue());
 
  246      return std::make_unique<RDFDetail::RMergeableVariationsBase>(std::move(keys), std::move(values));
 
 
  251      throw std::logic_error(
"Cannot produce a varied action from a varied action.");
 
 
  258             "The number of results and the number of helpers are not the same!");
 
  262      for (std::size_t i = 0; i < fHelpers.size(); i++) {
 
  266      return std::unique_ptr<RVariedAction>(
 
 
  273   template <
typename H = Helper>
 
  276      return &fHelpers[0].PartialUpdate(
slot);
 
 
  280   void *
PartialUpdateImpl(...) { 
throw std::runtime_error(
"This action does not support callbacks!"); }
 
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Base class for non-leaf nodes of the computational graph.
A binder for user-defined columns, variations and aliases.
Just like an RAction, but it has N action helpers and N previous nodes (N is the number of variations...
void Finalize() final
Clean-up and finalize the action result (e.g.
auto GetValueChecked(unsigned int slot, unsigned int varIdx, std::size_t readerIdx, Long64_t entry) -> ColType &
void Run(unsigned int slot, Long64_t entry) final
std::vector< std::shared_ptr< PrevNodeType > > fPrevNodes
Owning pointers to upstream nodes for each systematic variation.
std::unique_ptr< RMergeableValueBase > GetMergeableValue() const final
Retrieve a container holding the names and values of the variations.
RVariedAction(std::vector< Helper > &&helpers, const ColumnNames_t &columns, std::shared_ptr< PrevNode > prevNode, const RColumnRegister &colRegister)
auto PartialUpdateImpl(unsigned int slot) -> decltype(std::declval< H >().PartialUpdate(slot),(void *)(nullptr))
std::unique_ptr< RActionBase > CloneAction(void *typeErasedResults) final
ROOT::RDF::SampleCallback_t GetSampleCallback() final
Return a callback that in turn runs the callbacks of each variation's helper.
void FinalizeSlot(unsigned int slot) final
Clean-up operations to be performed at the end of a task.
std::vector< std::shared_ptr< PrevNodeType > > MakePrevFilters(std::shared_ptr< PrevNode > nominal) const
Creates new filter nodes, one per variation, from the upstream nominal one.
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
std::vector< std::vector< std::array< RColumnReaderBase *, ColumnTypes_t::list_size > > > fInputValues
Column readers per slot (outer dimension), per variation and per input column (inner dimension,...
std::vector< Helper > fHelpers
Action helpers per variation.
void * PartialUpdateImpl(...)
RVariedAction & operator=(const RVariedAction &)=delete
void InitSlot(TTreeReader *r, unsigned int slot) final
std::conditional_t< std::is_same< PrevNode, RJittedFilter >::value, RFilterBase, PrevNode > PrevNodeType
std::shared_ptr< RDFGraphDrawing::GraphNode > GetGraph(std::unordered_map< void *, std::shared_ptr< RDFGraphDrawing::GraphNode > > &visitedMap) final
std::array< bool, ColumnTypes_t::list_size > fIsDefine
The nth flag signals whether the nth input column is a custom column or not.
void * PartialUpdate(unsigned int slot) final
Return the partially-updated value connected to the first variation.
std::unique_ptr< RActionBase > MakeVariedAction(std::vector< void * > &&) final
RVariedAction(const RVariedAction &)=delete
void CallExec(unsigned int slot, unsigned int varIdx, Long64_t entry, TypeList< ColTypes... >, std::index_sequence< ReaderIdxs... >)
RVariedAction(std::vector< Helper > &&helpers, const ColumnNames_t &columns, const std::vector< std::shared_ptr< PrevNodeType > > &prevNodes, const RColumnRegister &colRegister)
This constructor takes in input a vector of previous nodes, motivated by the CloneAction logic.
void TriggerChildrenCount() final
This type represents a sample identifier, to be used in conjunction with RDataFrame features such as ...
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
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.
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....
std::vector< std::string > ColumnNames_t
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
This type aggregates some of the arguments passed to GetColumnReaders.