27#include <unordered_map>
38namespace GraphDrawing {
43 const std::vector<std::string> &prevNodeDefines);
55template <
typename FilterF,
typename PrevNodeRaw>
58 using TypeInd_t = std::make_index_sequence<ColumnTypes_t::list_size>;
62 using PrevNode_t = std::conditional_t<std::is_same<PrevNodeRaw, RJittedFilter>::value,
RFilterBase, PrevNodeRaw>;
66 std::vector<std::array<std::unique_ptr<RColumnReaderBase>, ColumnTypes_t::list_size>>
fValues;
73 const std::string &variationName =
"nominal")
74 :
RFilterBase(pd->GetLoopManagerUnchecked(),
name, pd->GetLoopManagerUnchecked()->GetNSlots(), colRegister,
75 columns, pd->GetVariations(), variationName),
76 fFilter(std::move(
f)), fValues(pd->GetLoopManagerUnchecked()->GetNSlots()), fPrevNodePtr(std::move(pd)),
77 fPrevNode(*fPrevNodePtr)
79 fLoopManager->Book(
this);
88 fLoopManager->Deregister(
this);
93 if (entry != fLastCheckedEntry[slot * RDFInternal::CacheLineStep<Long64_t>()]) {
94 if (!fPrevNode.CheckFilters(slot, entry)) {
96 fLastResult[slot * RDFInternal::CacheLineStep<int>()] =
false;
100 passed ? ++fAccepted[slot * RDFInternal::CacheLineStep<ULong64_t>()]
101 : ++fRejected[slot * RDFInternal::CacheLineStep<ULong64_t>()];
102 fLastResult[slot * RDFInternal::CacheLineStep<int>()] = passed;
104 fLastCheckedEntry[slot * RDFInternal::CacheLineStep<Long64_t>()] = entry;
106 return fLastResult[slot * RDFInternal::CacheLineStep<int>()];
109 template <
typename... ColTypes, std::size_t... S>
115 return fFilter(fValues[slot][S]->
template Get<ColTypes>(entry)...);
121 fLoopManager->GetDataSource()};
123 fLastCheckedEntry[slot * RDFInternal::CacheLineStep<Long64_t>()] = -1;
131 fPrevNode.PartialReport(rep);
138 if (fNStopsReceived == fNChildren)
139 fPrevNode.StopProcessing();
146 if (fNChildren == 1 && fName.empty())
147 fPrevNode.IncrChildrenCount();
152 assert(!fName.empty());
153 fPrevNode.IncrChildrenCount();
158 fPrevNode.AddFilterName(
filters);
159 auto name = (HasName() ? fName :
"Unnamed Filter");
166 for (
auto &
v : fValues[slot])
170 std::shared_ptr<RDFGraphDrawing::GraphNode>
GetGraph()
173 auto prevNode = fPrevNode.GetGraph();
174 auto prevColumns = prevNode->GetDefinedColumns();
181 if (!thisNode->GetIsNew()) {
185 auto upmostNode = AddDefinesToGraph(thisNode, fColRegister, prevColumns);
188 thisNode->AddDefinedColumns(fColRegister.GetNames());
190 upmostNode->SetPrevNode(prevNode);
199 assert(variationName !=
"nominal");
204 auto it = fVariedFilters.find(variationName);
205 if (it != fVariedFilters.end())
208 auto prevNode = fPrevNodePtr;
209 if (
static_cast<RNodeBase *
>(fPrevNodePtr.get()) !=
static_cast<RNodeBase *
>(fLoopManager) &&
211 prevNode = std::static_pointer_cast<PrevNode_t>(prevNode->GetVariedFilter(variationName));
215 auto variedFilter = std::unique_ptr<RFilterBase>(
216 new RFilter(fFilter, fColumnNames, std::move(prevNode), fColRegister, fName, variationName));
217 auto e = fVariedFilters.insert({variationName, std::move(variedFilter)});
218 return e.first->second;
typedef void(GLAPIENTRYP _GLUfuncptr)(void)
void InitSlot(TTreeReader *r, unsigned int slot) final
bool CheckFilterHelper(unsigned int slot, Long64_t entry, TypeList< ColTypes... >, std::index_sequence< S... >)
void Report(ROOT::RDF::RCutFlowReport &rep) const final
void AddFilterName(std::vector< std::string > &filters)
RFilter(FilterF f, const ROOT::RDF::ColumnNames_t &columns, std::shared_ptr< PrevNode_t > pd, const RDFInternal::RColumnRegister &colRegister, std::string_view name="", const std::string &variationName="nominal")
bool CheckFilters(unsigned int slot, Long64_t entry) final
RFilter & operator=(const RFilter &)=delete
void IncrChildrenCount() final
virtual void FinaliseSlot(unsigned int slot) final
Clean-up operations to be performed at the end of a task.
const std::shared_ptr< PrevNode_t > fPrevNodePtr
std::conditional_t< std::is_same< PrevNodeRaw, RJittedFilter >::value, RFilterBase, PrevNodeRaw > PrevNode_t
RFilter(const RFilter &)=delete
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
void StopProcessing() final
std::shared_ptr< RNodeBase > GetVariedFilter(const std::string &variationName) final
Return a clone of this Filter that works with values in the variationName "universe".
typename CallableTraits< FilterF >::arg_types ColumnTypes_t
void TriggerChildrenCount() final
std::vector< std::array< std::unique_ptr< RColumnReaderBase >, ColumnTypes_t::list_size > > fValues
Column readers per slot and per input column.
std::shared_ptr< RDFGraphDrawing::GraphNode > GetGraph()
void PartialReport(ROOT::RDF::RCutFlowReport &rep) const final
A wrapper around a concrete RFilter, which forwards all calls to it RJittedFilter is the type of the ...
Base class for non-leaf nodes of the computational graph.
A binder for user-defined columns and aliases.
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)
Add the Defines that have been added between this node and the previous to the graph.
std::shared_ptr< GraphNode > CreateFilterNode(const ROOT::Detail::RDF::RFilterBase *filterPtr)
bool IsStrInVec(const std::string &str, const std::vector< std::string > &vec)
std::array< std::unique_ptr< RDFDetail::RColumnReaderBase >, sizeof...(ColTypes)> MakeColumnReaders(unsigned int slot, TTreeReader *r, TypeList< ColTypes... >, const RColumnReadersInfo &colInfo, const std::string &variationName="nominal")
Create a group of column readers, one per type in the parameter pack.
std::vector< std::string > ColumnNames_t
ROOT type_traits extensions.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
Extract types from the signature of a callable object. See CallableTraits.
This type aggregates some of the arguments passed to MakeColumnReaders.
Lightweight storage for a collection of types.