33 using namespace ROOT::Detail::RDF;
36 namespace GraphDrawing {
37 std::shared_ptr<GraphNode> CreateFilterNode(
const RFilterBase *filterPtr);
39 bool CheckIfDefaultOrDSColumn(
const std::string &name,
const std::shared_ptr<RCustomColumnBase> &column);
41 std::shared_ptr<GraphNode>
42 CreateDefineNode(
const std::string &columnName,
const RDFDetail::RCustomColumnBase *columnPtr);
50 using namespace ROOT::TypeTraits;
51 namespace RDFGraphDrawing = ROOT::Internal::RDF::GraphDrawing;
53 template <
typename FilterF,
typename PrevDataFrame>
54 class RFilter final :
public RFilterBase {
55 using ColumnTypes_t =
typename CallableTraits<FilterF>::arg_types;
56 using TypeInd_t = std::make_index_sequence<ColumnTypes_t::list_size>;
59 const ColumnNames_t fColumnNames;
60 const std::shared_ptr<PrevDataFrame> fPrevDataPtr;
61 PrevDataFrame &fPrevData;
62 std::vector<RDFInternal::RDFValueTuple_t<ColumnTypes_t>> fValues;
64 std::array<bool, ColumnTypes_t::list_size> fIsCustomColumn;
67 RFilter(FilterF &&f,
const ColumnNames_t &columns, std::shared_ptr<PrevDataFrame> pd,
68 const RDFInternal::RBookedCustomColumns &customColumns, std::string_view name =
"")
69 : RFilterBase(pd->GetLoopManagerUnchecked(), name, pd->GetLoopManagerUnchecked()->GetNSlots(), customColumns),
70 fFilter(std::forward<FilterF>(f)), fColumnNames(columns), fPrevDataPtr(std::move(pd)), fPrevData(*fPrevDataPtr),
71 fValues(fNSlots), fIsCustomColumn()
73 const auto nColumns = fColumnNames.size();
74 for (
auto i = 0u; i < nColumns; ++i)
75 fIsCustomColumn[i] = fCustomColumns.HasName(fColumnNames[i]);
78 RFilter(
const RFilter &) =
delete;
79 RFilter &operator=(
const RFilter &) =
delete;
82 ~RFilter() { fLoopManager->Deregister(
this); }
84 bool CheckFilters(
unsigned int slot, Long64_t entry)
final
86 if (entry != fLastCheckedEntry[slot]) {
87 if (!fPrevData.CheckFilters(slot, entry)) {
89 fLastResult[slot] =
false;
92 auto passed = CheckFilterHelper(slot, entry, TypeInd_t());
93 passed ? ++fAccepted[slot] : ++fRejected[slot];
94 fLastResult[slot] = passed;
96 fLastCheckedEntry[slot] = entry;
98 return fLastResult[slot];
101 template <std::size_t... S>
102 bool CheckFilterHelper(
unsigned int slot, Long64_t entry, std::index_sequence<S...>)
107 return fFilter(std::get<S>(fValues[slot]).Get(entry)...);
110 void InitSlot(TTreeReader *r,
unsigned int slot)
final
112 for (
auto &bookedBranch : fCustomColumns.GetColumns())
113 bookedBranch.second->InitSlot(r, slot);
114 RDFInternal::InitRDFValues(slot, fValues[slot], r, fColumnNames, fCustomColumns, TypeInd_t(), fIsCustomColumn);
118 void Report(ROOT::RDF::RCutFlowReport &rep)
const final { PartialReport(rep); }
120 void PartialReport(ROOT::RDF::RCutFlowReport &rep)
const final
122 fPrevData.PartialReport(rep);
126 void StopProcessing() final
129 if (fNStopsReceived == fNChildren)
130 fPrevData.StopProcessing();
133 void IncrChildrenCount() final
137 if (fNChildren == 1 && fName.empty())
138 fPrevData.IncrChildrenCount();
141 void TriggerChildrenCount() final
143 R__ASSERT(!fName.empty());
144 fPrevData.IncrChildrenCount();
147 virtual void ClearValueReaders(
unsigned int slot)
final
149 RDFInternal::ResetRDFValueTuple(fValues[slot], TypeInd_t());
152 void AddFilterName(std::vector<std::string> &filters)
154 fPrevData.AddFilterName(filters);
155 auto name = (HasName() ? fName :
"Unnamed Filter");
156 filters.push_back(name);
159 virtual void ClearTask(
unsigned int slot)
final
161 for (
auto &column : fCustomColumns.GetColumns()) {
162 column.second->ClearValueReaders(slot);
165 ClearValueReaders(slot);
168 std::shared_ptr<RDFGraphDrawing::GraphNode> GetGraph()
171 auto prevNode = fPrevData.GetGraph();
172 auto prevColumns = prevNode->GetDefinedColumns();
174 auto thisNode = RDFGraphDrawing::CreateFilterNode(
this);
179 if (!thisNode->GetIsNew()) {
183 auto evaluatedNode = thisNode;
187 for (
auto &column : fCustomColumns.GetColumns()) {
189 if (RDFGraphDrawing::CheckIfDefaultOrDSColumn(column.first, column.second))
191 if (std::find(prevColumns.begin(), prevColumns.end(), column.first) == prevColumns.end()) {
192 auto defineNode = RDFGraphDrawing::CreateDefineNode(column.first, column.second.get());
193 evaluatedNode->SetPrevNode(defineNode);
194 evaluatedNode = defineNode;
199 thisNode->AddDefinedColumns(fCustomColumns.GetNames());
201 evaluatedNode->SetPrevNode(prevNode);
210 #endif // ROOT_RFILTER