Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RLoopManager.hxx
Go to the documentation of this file.
1// Author: Enrico Guiraud, Danilo Piparo CERN 03/2017
2
3/*************************************************************************
4 * Copyright (C) 1995-2022, Rene Brun and Fons Rademakers. *
5 * All rights reserved. *
6 * *
7 * For the licensing terms see $ROOTSYS/LICENSE. *
8 * For the list of contributors see $ROOTSYS/README/CREDITS. *
9 *************************************************************************/
10
11#ifndef ROOT_RLOOPMANAGER
12#define ROOT_RLOOPMANAGER
13
14#include "ROOT/RDataSource.hxx"
20#include "ROOT/RDF/Utils.hxx"
21
22#include <functional>
23#include <limits>
24#include <map>
25#include <memory>
26#include <set>
27#include <string>
28#include <string_view>
29#include <unordered_map>
30#include <unordered_set>
31#include <vector>
32#include <any>
33
34// forward declarations
35class TTree;
36class TTreeReader;
37class TDirectory;
38
39namespace ROOT {
40namespace RDF {
41class RCutFlowReport;
42class RDataSource;
43} // ns RDF
44
45namespace Internal {
46class RSlotStack;
47namespace RDF {
48class GraphNode;
49class RActionBase;
50class RVariationBase;
51class RDefinesWithReaders;
52class RVariationsWithReaders;
53
54namespace GraphDrawing {
56} // ns GraphDrawing
57
58using Callback_t = std::function<void(unsigned int)>;
59
60class RCallback {
63 std::vector<ULong64_t> fCounters;
64
65public:
67 : fFun(std::move(f)), fEveryN(everyN), fCounters(nSlots, 0ull)
68 {
69 }
70
71 void operator()(unsigned int slot)
72 {
73 auto &c = fCounters[slot];
74 ++c;
75 if (c == fEveryN) {
76 c = 0ull;
77 fFun(slot);
78 }
79 }
80};
81
84 std::vector<int> fHasBeenCalled; // std::vector<bool> is thread-unsafe for our purposes (and generally evil)
85
86public:
88
89 void operator()(unsigned int slot)
90 {
91 if (fHasBeenCalled[slot] == 1)
92 return;
93 fFun(slot);
95 }
96};
97
98struct RDSRangeRAII;
99
100} // namespace RDF
101} // namespace Internal
102} // namespace ROOT
103
104namespace ROOT {
105namespace Detail {
106namespace RDF {
108
109class RFilterBase;
110class RRangeBase;
111class RDefineBase;
113
114/// The head node of a RDF computation graph.
115/// This class is responsible of running the event loop.
116class RLoopManager : public RNodeBase {
117 using ColumnNames_t = std::vector<std::string>;
118 enum class ELoopType {
119 kInvalid,
120 kNoFiles,
124 };
125
126 friend struct RCallCleanUpTask;
128
129 /*
130 A wrapped reference to a TTree dataset that can be shared by many computation graphs. Ensures lifetime management.
131 It needs to be destroyed *after* the fDataSource data member, in case it is holding the only Python reference to the
132 input dataset and the data source needs to access it before it is destroyed.
133 */
134 std::any fTTreeLifeline{};
135
136 std::vector<RDFInternal::RActionBase *> fBookedActions; ///< Non-owning pointers to actions to be run
137 std::vector<RDFInternal::RActionBase *> fRunActions; ///< Non-owning pointers to actions already run
138 std::vector<RFilterBase *> fBookedFilters;
139 std::vector<RFilterBase *> fBookedNamedFilters; ///< Contains a subset of fBookedFilters, i.e. only the named filters
140 std::vector<RRangeBase *> fBookedRanges;
141 std::vector<RDefineBase *> fBookedDefines;
142 std::vector<RDFInternal::RVariationBase *> fBookedVariations;
143
145 Long64_t fEndEntry{std::numeric_limits<Long64_t>::max()};
146
147 /// Keys are `fname + "/" + treename` as RSampleInfo::fID; Values are pointers to the corresponding sample
148 std::unordered_map<std::string, ROOT::RDF::Experimental::RSample *> fSampleMap;
149 /// Samples need to survive throughout the whole event loop, hence stored as an attribute
150 std::vector<ROOT::RDF::Experimental::RSample> fSamples;
151
153 /// Range of entries created when no data source is specified.
154 std::pair<ULong64_t, ULong64_t> fEmptyEntryRange{};
155 unsigned int fNSlots{1};
157 /// The kind of event loop that is going to be run (e.g. on ROOT files, on no files)
159 std::unique_ptr<RDataSource> fDataSource{}; ///< Owning pointer to a data-source object. Null if no data-source
160 /// Registered callbacks to be executed every N events.
161 /// The registration happens via the RegisterCallback method.
162 std::vector<RDFInternal::RCallback> fCallbacksEveryNEvents;
163 /// Registered callbacks to invoke just once before running the loop.
164 /// The registration happens via the RegisterCallback method.
165 std::vector<RDFInternal::ROneTimeCallback> fCallbacksOnce;
166 /// Registered callbacks to call at the beginning of each "data block".
167 /// The key is the pointer of the corresponding node in the computation graph (a RDefinePerSample or a RAction).
168 std::unordered_map<void *, ROOT::RDF::SampleCallback_t> fSampleCallbacks;
170 std::vector<ROOT::RDF::RSampleInfo> fSampleInfos;
171 unsigned int fNRuns{0}; ///< Number of event loops run
172
173 /// Readers for TTree/RDataSource columns (one per slot), shared by all nodes in the computation graph.
174 std::vector<std::unordered_map<std::string, std::unique_ptr<RColumnReaderBase>>> fDatasetColumnReaders;
175
176 /// Pointer to a shared slot stack in case this instance runs concurrently with others:
177 std::weak_ptr<ROOT::Internal::RSlotStack> fSlotStack;
178
179 void RunEmptySourceMT();
180 void RunEmptySource();
181 void RunDataSourceMT();
182 void RunDataSource();
183 void RunAndCheckFilters(unsigned int slot, Long64_t entry);
184 void InitNodeSlots(TTreeReader *r, unsigned int slot);
185 void InitNodes();
186 void CleanUpNodes();
187 void CleanUpTask(TTreeReader *r, unsigned int slot);
188 void EvalChildrenCounts();
189 void SetupSampleCallbacks(TTreeReader *r, unsigned int slot);
190 void UpdateSampleInfo(unsigned int slot, const std::pair<ULong64_t, ULong64_t> &range);
191 void UpdateSampleInfo(unsigned int slot, TTreeReader &r);
192 std::shared_ptr<ROOT::Internal::RSlotStack> SlotStack() const;
193
194 // List of branches for which we want to suppress the printed error about
195 // missing branch when switching to a new tree. This is modified by readers,
196 // so must be declared before them in this class.
197 std::set<std::string> fSuppressErrorsForMissingBranches{};
199 std::set<std::pair<std::string_view, std::unique_ptr<ROOT::Internal::RDF::RDefinesWithReaders>>>
201 std::set<std::pair<std::string_view, std::unique_ptr<ROOT::Internal::RDF::RVariationsWithReaders>>>
203
204public:
206 RLoopManager(TTree *tree, const ColumnNames_t &defaultBranches);
208 RLoopManager(std::unique_ptr<RDataSource> ds, const ColumnNames_t &defaultBranches);
210
211 // Rule of five
212
213 RLoopManager(const RLoopManager &) = delete;
217 ~RLoopManager() override;
218
219 void Jit();
221 void Run(bool jit = true);
222 const ColumnNames_t &GetDefaultColumnNames() const;
224 RDataSource *GetDataSource() const { return fDataSource.get(); }
235 bool CheckFilters(unsigned int, Long64_t) final;
236 unsigned int GetNSlots() const { return fNSlots; }
237 void Report(ROOT::RDF::RCutFlowReport &rep) const final;
238 /// End of recursive chain of calls, does nothing
242 void ToJitExec(const std::string &) const;
243 void RegisterCallback(ULong64_t everyNEvents, std::function<void(unsigned int)> &&f);
244 unsigned int GetNRuns() const { return fNRuns; }
245 bool HasDataSourceColumnReaders(std::string_view col, const std::type_info &ti) const;
246 void AddDataSourceColumnReaders(std::string_view col, std::vector<std::unique_ptr<RColumnReaderBase>> &&readers,
247 const std::type_info &ti);
248 RColumnReaderBase *AddTreeColumnReader(unsigned int slot, std::string_view col,
249 std::unique_ptr<RColumnReaderBase> &&reader, const std::type_info &ti);
250 RColumnReaderBase *GetDatasetColumnReader(unsigned int slot, std::string_view col, const std::type_info &ti) const;
251 RColumnReaderBase *AddDataSourceColumnReader(unsigned int slot, std::string_view col, const std::type_info &ti,
253
254 /// End of recursive chain of calls, does nothing
255 void AddFilterName(std::vector<std::string> &) final {}
256 /// For each booked filter, returns either the name or "Unnamed Filter"
257 std::vector<std::string> GetFiltersNames();
258
259 /// Return all graph edges known to RLoopManager
260 /// This includes Filters and Ranges but not Defines.
261 std::vector<RNodeBase *> GetGraphEdges() const;
262
263 /// Return all actions, either booked or already run
264 std::vector<RDFInternal::RActionBase *> GetAllActions() const;
265
266 std::shared_ptr<ROOT::Internal::RDF::GraphDrawing::GraphNode>
267 GetGraph(std::unordered_map<void *, std::shared_ptr<ROOT::Internal::RDF::GraphDrawing::GraphNode>> &visitedMap) final;
268
270
271 void SetEmptyEntryRange(std::pair<ULong64_t, ULong64_t> &&newRange);
274
276 std::set<std::pair<std::string_view, std::unique_ptr<ROOT::Internal::RDF::RDefinesWithReaders>>> &
281 std::set<std::pair<std::string_view, std::unique_ptr<ROOT::Internal::RDF::RVariationsWithReaders>>> &
286
287 void SetTTreeLifeline(std::any lifeline);
288 /// Register a slot stack to be used by this RLoopManager. This allows for sharing RDataFrame helpers safely in the
289 /// context of RunGraphs(). Note that the loop manager only stores a weak_ptr, in between runs.
290 void SetSlotStack(const std::shared_ptr<ROOT::Internal::RSlotStack> &slotStack) { fSlotStack = slotStack; }
291
292 void SetDataSource(std::unique_ptr<ROOT::RDF::RDataSource> dataSource);
293
302 const std::set<std::string> &GetSuppressErrorsForMissingBranches() const
303 {
305 }
306
307 /// The task run by every thread on the input entry range, for the generic RDataSource.
308 void DataSourceThreadTask(const std::pair<ULong64_t, ULong64_t> &entryRange, ROOT::Internal::RSlotStack &slotStack,
309 std::atomic<ULong64_t> &entryCount);
310 /// The task run by every thread on an entry range (known by the input TTreeReader), for the TTree data source.
311 void
313};
314
315/// \brief Create an RLoopManager that reads a TChain.
316/// \param[in] datasetName Name of the TChain
317/// \param[in] fileNameGlob File name (or glob) in which the TChain is stored.
318/// \param[in] defaultColumns List of default columns, see
319/// \param[in] checkFile file validator boolean
320/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
321/// \return the RLoopManager instance.
322std::shared_ptr<ROOT::Detail::RDF::RLoopManager>
323CreateLMFromTTree(std::string_view datasetName, std::string_view fileNameGlob,
324 const std::vector<std::string> &defaultColumns, bool checkFile = true);
325
326/// \brief Create an RLoopManager that reads a TChain.
327/// \param[in] datasetName Name of the TChain
328/// \param[in] fileNameGlobs List of file names (potentially globs).
329/// \param[in] defaultColumns List of default columns, see
330/// \param[in] checkFile file validator boolean
331/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
332/// \return the RLoopManager instance.
333std::shared_ptr<ROOT::Detail::RDF::RLoopManager>
334CreateLMFromTTree(std::string_view datasetName, const std::vector<std::string> &fileNameGlobs,
335 const std::vector<std::string> &defaultColumns, bool checkFile = true);
336
337/// \brief Create an RLoopManager that reads an RNTuple.
338/// \param[in] datasetName Name of the RNTuple
339/// \param[in] fileNameGlob File name (or glob) in which the RNTuple is stored.
340/// \param[in] defaultColumns List of default columns, see
341/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
342/// \return the RLoopManager instance.
343std::shared_ptr<ROOT::Detail::RDF::RLoopManager> CreateLMFromRNTuple(std::string_view datasetName,
344 std::string_view fileNameGlob,
345 const std::vector<std::string> &defaultColumns);
346
347/// \brief Create an RLoopManager that reads multiple RNTuples chained vertically.
348/// \param[in] datasetName Name of the RNTuple
349/// \param[in] fileNameGlobs List of file names (potentially globs).
350/// \param[in] defaultColumns List of default columns, see
351/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
352/// \return the RLoopManager instance.
353std::shared_ptr<ROOT::Detail::RDF::RLoopManager> CreateLMFromRNTuple(std::string_view datasetName,
354 const std::vector<std::string> &fileNameGlobs,
355 const std::vector<std::string> &defaultColumns);
356
357/// \brief Create an RLoopManager opening a file and checking the data format of the dataset.
358/// \param[in] datasetName Name of the dataset in the file.
359/// \param[in] fileNameGlob File name (or glob) in which the dataset is stored.
360/// \param[in] defaultColumns List of default columns, see
361/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
362/// \throws std::invalid_argument if the file could not be opened.
363/// \return an RLoopManager of the appropriate data source.
364std::shared_ptr<ROOT::Detail::RDF::RLoopManager> CreateLMFromFile(std::string_view datasetName,
365 std::string_view fileNameGlob,
366 const std::vector<std::string> &defaultColumns);
367
368/// \brief Create an RLoopManager that reads many files. The first is opened to infer the data source type.
369/// \param[in] datasetName Name of the dataset.
370/// \param[in] fileNameGlobs List of file names (potentially globs).
371/// \param[in] defaultColumns List of default columns, see
372/// \ref https://root.cern/doc/master/classROOT_1_1RDataFrame.html#default-branches "Default column lists"
373/// \throws std::invalid_argument if the file could not be opened.
374/// \return an RLoopManager of the appropriate data source.
375std::shared_ptr<ROOT::Detail::RDF::RLoopManager> CreateLMFromFile(std::string_view datasetName,
376 const std::vector<std::string> &fileNameGlobs,
377 const std::vector<std::string> &defaultColumns);
378
379} // namespace RDF
380} // namespace Detail
381} // namespace ROOT
382
383#endif
#define f(i)
Definition RSha256.hxx:104
#define c(i)
Definition RSha256.hxx:101
long long Long64_t
Portable signed long integer 8 bytes.
Definition RtypesCore.h:83
unsigned long long ULong64_t
Portable unsigned long integer 8 bytes.
Definition RtypesCore.h:84
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
The head node of a RDF computation graph.
RColumnReaderBase * AddDataSourceColumnReader(unsigned int slot, std::string_view col, const std::type_info &ti, TTreeReader *treeReader)
void UpdateSampleInfo(unsigned int slot, const std::pair< ULong64_t, ULong64_t > &range)
unsigned int fNRuns
Number of event loops run.
bool CheckFilters(unsigned int, Long64_t) final
void EvalChildrenCounts()
Trigger counting of number of children nodes for each node of the functional graph.
void CleanUpNodes()
Perform clean-up operations. To be called at the end of each event loop.
void RunEmptySource()
Run event loop with no source files, in sequence.
const std::set< std::string > & GetSuppressErrorsForMissingBranches() const
void SetEmptyEntryRange(std::pair< ULong64_t, ULong64_t > &&newRange)
void Report(ROOT::RDF::RCutFlowReport &rep) const final
Call FillReport on all booked filters.
void AddSampleCallback(void *nodePtr, ROOT::RDF::SampleCallback_t &&callback)
std::vector< RFilterBase * > fBookedNamedFilters
Contains a subset of fBookedFilters, i.e. only the named filters.
void RunEmptySourceMT()
Run event loop with no source files, in parallel.
RLoopManager & operator=(RLoopManager &&)=delete
std::unordered_map< std::string, ROOT::RDF::Experimental::RSample * > fSampleMap
Keys are fname + "/" + treename as RSampleInfo::fID; Values are pointers to the corresponding sample.
void AddDataSourceColumnReaders(std::string_view col, std::vector< std::unique_ptr< RColumnReaderBase > > &&readers, const std::type_info &ti)
std::shared_ptr< ROOT::Internal::RDF::GraphDrawing::GraphNode > GetGraph(std::unordered_map< void *, std::shared_ptr< ROOT::Internal::RDF::GraphDrawing::GraphNode > > &visitedMap) final
RLoopManager & operator=(const RLoopManager &)=delete
void ToJitExec(const std::string &) const
std::vector< RDFInternal::RActionBase * > GetAllActions() const
Return all actions, either booked or already run.
std::vector< ROOT::RDF::RSampleInfo > fSampleInfos
std::set< std::string > fSuppressErrorsForMissingBranches
void ChangeSpec(ROOT::RDF::Experimental::RDatasetSpec &&spec)
Changes the internal TTree held by the RLoopManager.
std::weak_ptr< ROOT::Internal::RSlotStack > fSlotStack
Pointer to a shared slot stack in case this instance runs concurrently with others:
std::set< std::pair< std::string_view, std::unique_ptr< ROOT::Internal::RDF::RVariationsWithReaders > > > & GetUniqueVariationsWithReaders()
std::vector< RDefineBase * > fBookedDefines
void TTreeThreadTask(TTreeReader &treeReader, ROOT::Internal::RSlotStack &slotStack, std::atomic< ULong64_t > &entryCount)
The task run by every thread on an entry range (known by the input TTreeReader), for the TTree data s...
void InsertSuppressErrorsForMissingBranch(const std::string &branchName)
RColumnReaderBase * AddTreeColumnReader(unsigned int slot, std::string_view col, std::unique_ptr< RColumnReaderBase > &&reader, const std::type_info &ti)
Register a new RTreeColumnReader with this RLoopManager.
std::vector< RDFInternal::RActionBase * > fRunActions
Non-owning pointers to actions already run.
RLoopManager(const ColumnNames_t &defaultColumns={})
void AddFilterName(std::vector< std::string > &) final
End of recursive chain of calls, does nothing.
std::vector< RRangeBase * > fBookedRanges
std::vector< ROOT::RDF::Experimental::RSample > fSamples
Samples need to survive throughout the whole event loop, hence stored as an attribute.
std::vector< std::string > ColumnNames_t
void RunAndCheckFilters(unsigned int slot, Long64_t entry)
Execute actions and make sure named filters are called for each event.
void ChangeBeginAndEndEntries(Long64_t begin, Long64_t end)
std::vector< RFilterBase * > fBookedFilters
void Run(bool jit=true)
Start the event loop with a different mechanism depending on IMT/no IMT, data source/no data source.
std::set< std::pair< std::string_view, std::unique_ptr< ROOT::Internal::RDF::RVariationsWithReaders > > > fUniqueVariationsWithReaders
std::unordered_map< void *, ROOT::RDF::SampleCallback_t > fSampleCallbacks
Registered callbacks to call at the beginning of each "data block".
std::vector< RDFInternal::RActionBase * > fBookedActions
Non-owning pointers to actions to be run.
RLoopManager(RLoopManager &&)=delete
void SetupSampleCallbacks(TTreeReader *r, unsigned int slot)
void CleanUpTask(TTreeReader *r, unsigned int slot)
Perform clean-up operations. To be called at the end of each task execution.
std::vector< RDFInternal::RCallback > fCallbacksEveryNEvents
Registered callbacks to be executed every N events.
std::vector< std::unordered_map< std::string, std::unique_ptr< RColumnReaderBase > > > fDatasetColumnReaders
Readers for TTree/RDataSource columns (one per slot), shared by all nodes in the computation graph.
void Register(RDFInternal::RActionBase *actionPtr)
const ColumnNames_t & GetDefaultColumnNames() const
Return the list of default columns – empty if none was provided when constructing the RDataFrame.
std::vector< RDFInternal::RVariationBase * > fBookedVariations
std::vector< RNodeBase * > GetGraphEdges() const
Return all graph edges known to RLoopManager This includes Filters and Ranges but not Defines.
std::set< std::pair< std::string_view, std::unique_ptr< ROOT::Internal::RDF::RDefinesWithReaders > > > & GetUniqueDefinesWithReaders()
void EraseSuppressErrorsForMissingBranch(const std::string &branchName)
RDataSource * GetDataSource() const
void RunDataSourceMT()
Run event loop over data accessed through a DataSource, in parallel.
void PartialReport(ROOT::RDF::RCutFlowReport &) const final
End of recursive chain of calls, does nothing.
void SetSlotStack(const std::shared_ptr< ROOT::Internal::RSlotStack > &slotStack)
Register a slot stack to be used by this RLoopManager.
std::vector< std::string > GetFiltersNames()
For each booked filter, returns either the name or "Unnamed Filter".
RLoopManager(const RLoopManager &)=delete
RDFInternal::RNewSampleNotifier fNewSampleNotifier
std::pair< ULong64_t, ULong64_t > fEmptyEntryRange
Range of entries created when no data source is specified.
std::set< std::pair< std::string_view, std::unique_ptr< ROOT::Internal::RDF::RDefinesWithReaders > > > fUniqueDefinesWithReaders
ROOT::Internal::RDF::RStringCache fCachedColNames
ROOT::Internal::RDF::RStringCache & GetColumnNamesCache()
std::unique_ptr< RDataSource > fDataSource
Owning pointer to a data-source object.
void DataSourceThreadTask(const std::pair< ULong64_t, ULong64_t > &entryRange, ROOT::Internal::RSlotStack &slotStack, std::atomic< ULong64_t > &entryCount)
The task run by every thread on the input entry range, for the generic RDataSource.
void InitNodeSlots(TTreeReader *r, unsigned int slot)
Build TTreeReaderValues for all nodes This method loops over all filters, actions and other booked ob...
std::vector< RDFInternal::ROneTimeCallback > fCallbacksOnce
Registered callbacks to invoke just once before running the loop.
void SetDataSource(std::unique_ptr< ROOT::RDF::RDataSource > dataSource)
void RegisterCallback(ULong64_t everyNEvents, std::function< void(unsigned int)> &&f)
void SetTTreeLifeline(std::any lifeline)
void RunDataSource()
Run event loop over data accessed through a DataSource, in sequence.
void Jit()
Add RDF nodes that require just-in-time compilation to the computation graph.
RColumnReaderBase * GetDatasetColumnReader(unsigned int slot, std::string_view col, const std::type_info &ti) const
std::shared_ptr< ROOT::Internal::RSlotStack > SlotStack() const
Create a slot stack with the desired number of slots or reuse a shared instance.
void Deregister(RDFInternal::RActionBase *actionPtr)
ELoopType fLoopType
The kind of event loop that is going to be run (e.g. on ROOT files, on no files)
void InitNodes()
Initialize all nodes of the functional graph before running the event loop.
bool HasDataSourceColumnReaders(std::string_view col, const std::type_info &ti) const
Return true if AddDataSourceColumnReaders was called for column name col.
RLoopManager * GetLoopManagerUnchecked() final
Base class for non-leaf nodes of the computational graph.
Definition RNodeBase.hxx:43
unsigned int fNStopsReceived
Number of times that a children node signaled to stop processing entries.
Definition RNodeBase.hxx:47
unsigned int fNChildren
Number of nodes of the functional graph hanging from this object.
Definition RNodeBase.hxx:46
Helper class that provides the operation graph nodes.
RCallback(ULong64_t everyN, Callback_t &&f, unsigned int nSlots)
std::vector< ULong64_t > fCounters
void operator()(unsigned int slot)
ROneTimeCallback(Callback_t &&f, unsigned int nSlots)
A Thread-safe cache for strings.
Definition Utils.hxx:287
This type includes all parts of RVariation that do not depend on the callable signature.
A thread-safe list of N indexes (0 to size - 1).
The dataset specification for RDataFrame.
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
Describe directory structure in memory.
Definition TDirectory.h:45
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
Definition TTreeReader.h:46
A TTree represents a columnar dataset.
Definition TTree.h:89
std::shared_ptr< ROOT::Detail::RDF::RLoopManager > CreateLMFromTTree(std::string_view datasetName, std::string_view fileNameGlob, const std::vector< std::string > &defaultColumns, bool checkFile=true)
Create an RLoopManager that reads a TChain.
std::shared_ptr< ROOT::Detail::RDF::RLoopManager > CreateLMFromFile(std::string_view datasetName, std::string_view fileNameGlob, const std::vector< std::string > &defaultColumns)
Create an RLoopManager opening a file and checking the data format of the dataset.
std::shared_ptr< ROOT::Detail::RDF::RLoopManager > CreateLMFromRNTuple(std::string_view datasetName, std::string_view fileNameGlob, const std::vector< std::string > &defaultColumns)
Create an RLoopManager that reads an RNTuple.
std::function< void(unsigned int)> Callback_t
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....
Namespace for new ROOT classes and functions.
A RAII object that calls RLoopManager::CleanUpTask at destruction.