11 #ifndef ROOT_RLOOPMANAGER
12 #define ROOT_RLOOPMANAGER
34 ColumnNames_t GetBranchNames(TTree &t,
bool allowDuplicates =
true);
39 namespace GraphDrawing {
40 class GraphCreatorHelper;
47 using namespace ROOT::TypeTraits;
48 namespace RDFInternal = ROOT::Internal::RDF;
50 class RCustomColumnBase;
56 class RLoopManager :
public RNodeBase {
57 using RDataSource = ROOT::RDF::RDataSource;
58 enum class ELoopType { kROOTFiles, kROOTFilesMT, kNoFiles, kNoFilesMT, kDataSource, kDataSourceMT };
59 using Callback_t = std::function<void(unsigned int)>;
61 const Callback_t fFun;
62 const ULong64_t fEveryN;
63 std::vector<ULong64_t> fCounters;
66 TCallback(ULong64_t everyN, Callback_t &&f,
unsigned int nSlots)
67 : fFun(std::move(f)), fEveryN(everyN), fCounters(nSlots, 0ull)
71 void operator()(
unsigned int slot)
73 auto &c = fCounters[slot];
82 class TOneTimeCallback {
83 const Callback_t fFun;
84 std::vector<int> fHasBeenCalled;
87 TOneTimeCallback(Callback_t &&f,
unsigned int nSlots) : fFun(std::move(f)), fHasBeenCalled(nSlots, 0) {}
89 void operator()(
unsigned int slot)
91 if (fHasBeenCalled[slot] == 1)
94 fHasBeenCalled[slot] = 1;
98 std::vector<RDFInternal::RActionBase *> fBookedActions;
99 std::vector<RDFInternal::RActionBase *> fRunActions;
100 std::vector<RFilterBase *> fBookedFilters;
101 std::vector<RFilterBase *> fBookedNamedFilters;
102 std::vector<RRangeBase *> fBookedRanges;
106 std::shared_ptr<TTree> fTree{
nullptr};
107 const ColumnNames_t fDefaultColumns;
108 const ULong64_t fNEmptyEntries{0};
109 const unsigned int fNSlots{1};
110 bool fMustRunNamedFilters{
true};
111 const ELoopType fLoopType;
112 std::string fToJitDeclare;
113 std::string fToJitExec;
114 const std::unique_ptr<RDataSource> fDataSource;
115 std::map<std::string, std::string> fAliasColumnNameMap;
116 std::vector<TCallback> fCallbacks;
117 std::vector<TOneTimeCallback> fCallbacksOnce;
120 const unsigned int fID = GetNextID();
122 std::vector<RCustomColumnBase *> fCustomColumns;
124 ColumnNames_t fValidBranchNames;
126 void CheckIndexedFriends();
127 void RunEmptySourceMT();
128 void RunEmptySource();
129 void RunTreeProcessorMT();
130 void RunTreeReader();
131 void RunDataSourceMT();
132 void RunDataSource();
133 void RunAndCheckFilters(
unsigned int slot, Long64_t entry);
134 void InitNodeSlots(TTreeReader *r,
unsigned int slot);
137 void CleanUpTask(
unsigned int slot);
138 void EvalChildrenCounts();
139 static unsigned int GetNextID();
142 RLoopManager(TTree *tree,
const ColumnNames_t &defaultBranches);
143 RLoopManager(ULong64_t nEmptyEntries);
144 RLoopManager(std::unique_ptr<RDataSource> ds,
const ColumnNames_t &defaultBranches);
145 RLoopManager(
const RLoopManager &) =
delete;
146 RLoopManager &operator=(
const RLoopManager &) =
delete;
148 void JitDeclarations();
150 RLoopManager *GetLoopManagerUnchecked() final {
return this; }
152 const ColumnNames_t &GetDefaultColumnNames()
const;
153 TTree *GetTree()
const;
154 ::TDirectory *GetDirectory()
const;
155 ULong64_t GetNEmptyEntries()
const {
return fNEmptyEntries; }
156 RDataSource *GetDataSource()
const {
return fDataSource.get(); }
157 void Book(RDFInternal::RActionBase *actionPtr);
158 void Deregister(RDFInternal::RActionBase *actionPtr);
159 void Book(RFilterBase *filterPtr);
160 void Deregister(RFilterBase *filterPtr);
161 void Book(RRangeBase *rangePtr);
162 void Deregister(RRangeBase *rangePtr);
163 bool CheckFilters(
unsigned int, Long64_t) final;
164 unsigned int GetNSlots()
const {
return fNSlots; }
165 void Report(ROOT::RDF::RCutFlowReport &rep)
const final;
167 void PartialReport(ROOT::RDF::RCutFlowReport &) const final {}
168 void SetTree(
const std::shared_ptr<TTree> &tree) { fTree = tree; }
169 void IncrChildrenCount() final { ++fNChildren; }
170 void StopProcessing() final { ++fNStopsReceived; }
171 void ToJitDeclare(
const std::string &s) { fToJitDeclare.append(s); }
172 void ToJitExec(
const std::string &s) { fToJitExec.append(s); }
173 void AddColumnAlias(
const std::string &alias,
const std::string &colName) { fAliasColumnNameMap[alias] = colName; }
174 const std::map<std::string, std::string> &GetAliasMap()
const {
return fAliasColumnNameMap; }
175 void RegisterCallback(ULong64_t everyNEvents, std::function<
void(
unsigned int)> &&f);
176 unsigned int GetID()
const {
return fID; }
179 void AddFilterName(std::vector<std::string> &) {}
181 std::vector<std::string> GetFiltersNames();
184 std::vector<RDFInternal::RActionBase *> GetAllActions();
186 void RegisterCustomColumn(RCustomColumnBase *column) { fCustomColumns.push_back(column); }
188 void DeRegisterCustomColumn(RCustomColumnBase *column)
190 fCustomColumns.erase(std::remove(fCustomColumns.begin(), fCustomColumns.end(), column), fCustomColumns.end());
193 std::vector<RDFInternal::RActionBase *> GetBookedActions() {
return fBookedActions; }
194 std::shared_ptr<ROOT::Internal::RDF::GraphDrawing::GraphNode> GetGraph();
196 const ColumnNames_t &GetBranchNames();