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