51 TTHREAD_TLS(
unsigned int) count = 0U;
56 TTHREAD_TLS(
unsigned int) index = UINT_MAX;
60 std::vector<unsigned int>
fBuf;
65 TSlotStack(
unsigned int size) : fCursor(size), fBuf(size) { std::iota(fBuf.begin(), fBuf.end(), 0U); }
91 enum class ELoopType { kROOTFiles, kROOTFilesMT, kNoFiles, kNoFilesMT, kDataSource, kDataSourceMT };
101 : fFun(
std::move(
f)), fEveryN(everyN), fCounters(nSlots, 0ull)
107 auto &
c = fCounters[slot];
125 if (fHasBeenCalled[slot] == 1)
128 fHasBeenCalled[slot] = 1;
140 std::shared_ptr<TTree> fTree{
nullptr};
145 const unsigned int fNSlots{1};
146 bool fMustRunNamedFilters{
true};
147 unsigned int fNChildren{0};
148 unsigned int fNStopsReceived{0};
158 const unsigned int fID = GetNextID();
160 void RunEmptySourceMT();
161 void RunEmptySource();
162 void RunTreeProcessorMT();
163 void RunTreeReader();
164 void RunDataSourceMT();
165 void RunDataSource();
166 void RunAndCheckFilters(
unsigned int slot,
Long64_t entry);
170 void CleanUpTask(
unsigned int slot);
172 void EvalChildrenCounts();
173 unsigned int GetNextID()
const;
178 RLoopManager(std::unique_ptr<RDataSource> ds,
const ColumnNames_t &defaultBranches);
184 const ColumnNames_t &GetDefaultColumnNames()
const;
186 TTree *GetTree()
const;
187 const std::map<std::string, RCustomColumnBasePtr_t> &
GetBookedColumns()
const {
return fBookedCustomColumns; }
194 void Book(
const std::shared_ptr<bool> &branchPtr);
196 bool CheckFilters(
int,
unsigned int);
205 void ToJit(
const std::string &
s) { fToJit.append(s); }
208 void AddColumnAlias(
const std::string &alias,
const std::string &colName) { fAliasColumnNameMap[alias] = colName; }
210 const std::map<std::string, std::string> &
GetAliasMap()
const {
return fAliasColumnNameMap; }
212 unsigned int GetID()
const {
return fID; }
242 template <typename T, bool MustUseRVec = IsRVec_t<T>::value>
255 unsigned int fSlot = std::numeric_limits<unsigned int>::max();
276 bool fCopyWarningPrinted =
false;
279 static constexpr
bool fgMustUseRVec = MustUseRVec;
287 fColumnKind = EColumnKind::kTree;
288 fTreeReaders.emplace_back(
new TreeReader_t(*r, bn.c_str()));
292 template <typename U = T, typename std::enable_if<!TColumnValue<U>::fgMustUseRVec,
int>::type = 0>
297 template <typename U = T, typename std::enable_if<TColumnValue<U>::fgMustUseRVec,
int>::type = 0>
302 switch (fColumnKind) {
303 case EColumnKind::kTree: fTreeReaders.pop_back();
break;
304 case EColumnKind::kCustomColumn:
305 fCustomColumns.pop_back();
306 fCustomValuePtrs.pop_back();
308 case EColumnKind::kDataSource:
309 fCustomColumns.pop_back();
310 fDSValuePtrs.pop_back();
317 template <
typename T>
321 template <
typename... BranchTypes>
323 using type = std::tuple<TColumnValue<BranchTypes>...>;
326 template <
typename BranchType>
330 template <
typename ValueTuple, std::size_t...
S>
334 std::initializer_list<int> expander{(std::get<S>(values).
Reset(), 0)...};
351 virtual void Run(
unsigned int slot,
Long64_t entry) = 0;
353 virtual void InitSlot(
TTreeReader *
r,
unsigned int slot) = 0;
354 virtual void TriggerChildrenCount() = 0;
355 virtual void FinalizeSlot(
unsigned int) = 0;
358 virtual void *PartialUpdate(
unsigned int slot) = 0;
361 template <
typename Helper,
typename PrevDataFrame,
typename ColumnTypes_t =
typename Helper::ColumnTypes_t>
368 std::vector<RDFValueTuple_t<ColumnTypes_t>>
fValues;
371 RAction(Helper &&
h,
const ColumnNames_t &bl, PrevDataFrame &pd)
373 fBranches(bl), fPrevData(pd), fValues(fNSlots)
385 InitRDFValues(slot, fValues[slot],
r, fBranches, fLoopManager->GetCustomColumnNames(),
386 fLoopManager->GetBookedColumns(),
TypeInd_t());
387 fHelper.InitTask(
r, slot);
393 if (fPrevData.CheckFilters(slot, entry))
397 template <std::size_t...
S>
401 fHelper.Exec(slot, std::get<S>(fValues[slot]).Get(entry)...);
408 ClearValueReaders(slot);
409 fHelper.CallFinalizeTask(slot);
417 void *
PartialUpdate(
unsigned int slot)
final {
return PartialUpdateImpl(slot); }
422 template <
typename H = Helper>
423 auto PartialUpdateImpl(
unsigned int slot) -> decltype(std::declval<H>().PartialUpdate(slot), (
void *)(
nullptr))
425 return &fHelper.PartialUpdate(slot);
428 void *
PartialUpdateImpl(...) {
throw std::runtime_error(
"This action does not support callbacks yet!"); }
442 unsigned int fNChildren{0};
443 unsigned int fNStopsReceived{0};
452 virtual void InitSlot(
TTreeReader *
r,
unsigned int slot) = 0;
453 virtual void *GetValuePtr(
unsigned int slot) = 0;
454 virtual const std::type_info &GetTypeId()
const = 0;
457 virtual void Update(
unsigned int slot,
Long64_t entry) = 0;
458 virtual void ClearValueReaders(
unsigned int slot) = 0;
464 namespace TCCHelperTypes {
467 struct TSlotAndEntry;
471 template <
typename F,
typename UPDATE_HELPER_TYPE = TCCHelperTypes::TNothing>
475 using TSlot = TCCHelperTypes::TSlot;
482 using ColumnTypes_t =
typename RDFInternal::RemoveFirstTwoParametersIf<std::is_same<TSlotAndEntry, UHT_t>::value,
485 using ret_type =
typename CallableTraits<F>::ret_type;
488 typename std::conditional<std::is_same<ret_type, bool>::value, std::deque<ret_type>, std::vector<ret_type>>
::type;
494 std::vector<RDFInternal::RDFValueTuple_t<ColumnTypes_t>>
fValues;
498 bool isDSColumn =
false)
500 fLastResults(fNSlots), fValues(fNSlots)
510 fLoopManager->GetBookedColumns(),
TypeInd_t());
513 void *
GetValuePtr(
unsigned int slot)
final {
return static_cast<void *
>(&fLastResults[slot]); }
517 if (entry != fLastCheckedEntry[slot]) {
520 fLastCheckedEntry[slot] = entry;
529 template <std::size_t...
S,
typename... BranchTypes>
531 TCCHelperTypes::TNothing *)
533 fLastResults[slot] = fExpression(std::get<S>(fValues[slot]).Get(entry)...);
539 template <std::size_t...
S,
typename... BranchTypes>
541 TCCHelperTypes::TSlot *)
543 fLastResults[slot] = fExpression(slot, std::get<S>(fValues[slot]).Get(entry)...);
549 template <std::size_t...
S,
typename... BranchTypes>
551 TCCHelperTypes::TSlotAndEntry *)
553 fLastResults[slot] = fExpression(slot, entry, std::get<S>(fValues[slot]).Get(entry)...);
567 std::vector<int> fLastResult = {
true};
568 std::vector<ULong64_t> fAccepted = {0};
569 std::vector<ULong64_t> fRejected = {0};
571 unsigned int fNChildren{0};
572 unsigned int fNStopsReceived{0};
580 virtual void InitSlot(
TTreeReader *
r,
unsigned int slot) = 0;
581 virtual bool CheckFilters(
unsigned int slot,
Long64_t entry) = 0;
585 bool HasName()
const;
587 virtual void IncrChildrenCount() = 0;
588 virtual void StopProcessing() = 0;
594 virtual void TriggerChildrenCount() = 0;
597 assert(!fName.empty());
599 std::fill(fAccepted.begin(), fAccepted.end(), 0);
600 std::fill(fRejected.begin(), fRejected.end(), 0);
602 virtual void ClearValueReaders(
unsigned int slot) = 0;
603 virtual void InitNode();
612 std::unique_ptr<RFilterBase> fConcreteFilter =
nullptr;
617 void SetFilter(std::unique_ptr<RFilterBase>
f);
619 void InitSlot(
TTreeReader *
r,
unsigned int slot)
override final;
620 bool CheckFilters(
unsigned int slot,
Long64_t entry)
override final;
624 void IncrChildrenCount()
override final;
625 void StopProcessing()
override final;
626 void ResetChildrenCount()
override final;
627 void TriggerChildrenCount()
override final;
628 void ResetReportCount()
override final;
629 void ClearValueReaders(
unsigned int slot)
override final;
630 void InitNode()
override final;
633 template <
typename FilterF,
typename PrevDataFrame>
641 std::vector<RDFInternal::RDFValueTuple_t<ColumnTypes_t>>
fValues;
646 fFilter(
std::move(
f)), fBranches(bl), fPrevData(pd), fValues(fNSlots)
655 if (entry != fLastCheckedEntry[slot]) {
656 if (!fPrevData.CheckFilters(slot, entry)) {
658 fLastResult[slot] =
false;
661 auto passed = CheckFilterHelper(slot, entry,
TypeInd_t());
662 passed ? ++fAccepted[slot] : ++fRejected[slot];
663 fLastResult[slot] = passed;
665 fLastCheckedEntry[slot] = entry;
667 return fLastResult[slot];
670 template <std::size_t...
S>
673 return fFilter(std::get<S>(fValues[slot]).Get(entry)...);
682 fLoopManager->GetBookedColumns(),
TypeInd_t());
690 fPrevData.PartialReport(rep);
697 if (fNStopsReceived == fNChildren)
698 fPrevData.StopProcessing();
705 if (fNChildren == 1 && fName.empty())
706 fPrevData.IncrChildrenCount();
711 assert(!fName.empty());
712 fPrevData.IncrChildrenCount();
729 bool fLastResult{
true};
731 unsigned int fNChildren{0};
732 unsigned int fNStopsReceived{0};
733 bool fHasStopped{
false};
736 void ResetCounters();
740 const unsigned int nSlots);
745 virtual bool CheckFilters(
unsigned int slot,
Long64_t entry) = 0;
748 virtual void IncrChildrenCount() = 0;
749 virtual void StopProcessing() = 0;
758 template <
typename PrevData>
763 RRange(
unsigned int start,
unsigned int stop,
unsigned int stride, PrevData &pd)
764 :
RRangeBase(pd.GetLoopManagerUnchecked(), start, stop, stride, pd.GetLoopManagerUnchecked()->
GetNSlots()),
775 if (entry != fLastCheckedEntry) {
778 if (!fPrevData.CheckFilters(slot, entry)) {
783 ++fNProcessedEntries;
784 if (fNProcessedEntries <= fStart || (fStop > 0 && fNProcessedEntries > fStop) ||
785 (fStride != 1 && fNProcessedEntries % fStride != 0))
789 if (fNProcessedEntries == fStop) {
791 fPrevData.StopProcessing();
794 fLastCheckedEntry = entry;
808 if (fNStopsReceived == fNChildren && !fHasStopped)
809 fPrevData.StopProcessing();
817 fPrevData.IncrChildrenCount();
828 template <
typename T,
bool B>
831 fCustomColumns.emplace_back(customColumn);
833 throw std::runtime_error(
834 std::string(
"TColumnValue: type specified for column \"" + customColumn->
GetName() +
"\" is ") +
838 fColumnKind = EColumnKind::kDataSource;
839 fDSValuePtrs.emplace_back(static_cast<T **>(customColumn->
GetValuePtr(slot)));
841 fColumnKind = EColumnKind::kCustomColumn;
842 fCustomValuePtrs.emplace_back(static_cast<T *>(customColumn->
GetValuePtr(slot)));
850 template <
typename T,
bool B>
851 template <typename U, typename std::enable_if<!TColumnValue<U>::fgMustUseRVec,
int>
::type>
854 if (fColumnKind == EColumnKind::kTree) {
855 return *(fTreeReaders.back()->Get());
857 fCustomColumns.back()->Update(fSlot, entry);
858 return fColumnKind == EColumnKind::kCustomColumn ? *fCustomValuePtrs.back() : **fDSValuePtrs.back();
863 template <
typename T,
bool B>
864 template <typename U, typename std::enable_if<TColumnValue<U>::fgMustUseRVec,
int>
::type>
867 if (fColumnKind == EColumnKind::kTree) {
868 auto &readerArray = *fTreeReaders.back();
877 fStorageType = (1 == (&readerArray[1] - &readerArray[0])) ? EStorageType::kContiguous : EStorageType::kSparse;
880 const auto readerArraySize = readerArray.GetSize();
881 if (EStorageType::kContiguous == fStorageType ||
883 if (readerArraySize > 0) {
887 auto readerArrayAddr = &readerArray.At(0);
888 T tvec(readerArrayAddr, readerArraySize);
892 swap(fRVec, emptyVec);
897 if (!fCopyWarningPrinted) {
898 Warning(
"TColumnValue::Get",
"Branch %s hangs from a non-split branch. A copy is being performed in order " 899 "to properly read the content.",
900 readerArray.GetBranchName());
901 fCopyWarningPrinted =
true;
904 (
void)fCopyWarningPrinted;
906 if (readerArraySize > 0) {
907 (
void)readerArray.At(0);
908 T tvec(readerArray.begin(), readerArray.end());
912 swap(fRVec, emptyVec);
918 fCustomColumns.back()->Update(fSlot, entry);
919 return fColumnKind == EColumnKind::kCustomColumn ? *fCustomValuePtrs.back() : **fDSValuePtrs.back();
926 #endif // ROOT_RDFNODES typename std::conditional< MustUseRVec, TTreeReaderArray< ColumnValue_t >, TTreeReaderValue< ColumnValue_t > >::type TreeReader_t
std::vector< RDFInternal::RDFValueTuple_t< ColumnTypes_t > > fValues
void operator()(unsigned int slot)
std::string GetName(const std::string &scope_name)
const unsigned int fNSlots
Number of thread slots used by this node.
TSlotStack(unsigned int size)
void AddCustomColumnName(std::string_view name)
void Run(unsigned int slot, Long64_t entry) final
TTreeReader is a simple, robust and fast interface to read values from a TTree, TChain or TNtuple...
std::string GetName() const
Namespace for new ROOT classes and functions.
std::shared_ptr< RFilterBase > FilterBasePtr_t
virtual void * GetValuePtr(unsigned int slot)=0
std::shared_ptr< RDFInternal::RActionBase > ActionBasePtr_t
RFilter(FilterF &&f, const ColumnNames_t &bl, PrevDataFrame &pd, std::string_view name="")
std::vector< FilterBasePtr_t > FilterBaseVec_t
typename TRDFValueTuple< BranchType >::type RDFValueTuple_t
PrevDataFrame & fPrevData
void swap(TDirectoryEntry &e1, TDirectoryEntry &e2) noexcept
bool CheckFilters(unsigned int slot, Long64_t entry) final
Ranges act as filters when it comes to selecting entries that downstream nodes should process...
std::vector< int > fHasBeenCalled
unsigned int & GetCount()
std::map< std::string, std::string > fAliasColumnNameMap
ColumnNameAlias-columnName pairs.
std::vector< ActionBasePtr_t > ActionBaseVec_t
void PartialReport(ROOT::RDF::RCutFlowReport &rep) const final
RLoopManager * fLoopManager
A raw pointer to the RLoopManager at the root of this functional graph.
FilterBaseVec_t fBookedNamedFilters
Contains a subset of fBookedFilters, i.e. only the named filters.
ActionBaseVec_t fBookedActions
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, TypeList< BranchTypes... >, TCCHelperTypes::TSlotAndEntry *)
void SetTmpColumn(unsigned int slot, RCustomColumnBase *tmpColumn)
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, TypeList< BranchTypes... >, TCCHelperTypes::TSlot *)
const ColumnNames_t fDefaultColumns
std::vector< T * > fCustomValuePtrs
Non-owning ptrs to the value of a custom column.
typename RDFInternal::RemoveFirstTwoParametersIf< std::is_same< TSlotAndEntry, UHT_t >::value, BranchTypesTmp_t >::type ColumnTypes_t
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
void ClearValueReaders(unsigned int slot)
void * PartialUpdate(unsigned int slot) final
This method is invoked to update a partial result during the event loop, right before passing the res...
RangeBaseVec_t fBookedRanges
A spin mutex class which respects the STL interface for mutexes.
std::string TypeID2TypeName(const std::type_info &id)
Returns the name of a type starting from its type_info An empty string is returned in case of failure...
TCallback(ULong64_t everyN, Callback_t &&f, unsigned int nSlots)
ValuesPerSlot_t fLastResults
const ELoopType fLoopType
The kind of event loop that is going to be run (e.g. on ROOT files, on no files)
typename CallableTraits< FilterF >::arg_types ColumnTypes_t
std::map< std::string, RCustomColumnBasePtr_t > fBookedCustomColumns
RLoopManager * fLoopManager
A raw pointer to the RLoopManager at the root of this functional graph.
RAction(Helper &&h, const ColumnNames_t &bl, PrevDataFrame &pd)
std::vector< RDFValueTuple_t< ColumnTypes_t > > fValues
typename CallableTraits< F >::ret_type ret_type
void IncrChildrenCount() final
void * GetValuePtr(unsigned int slot) final
void MakeProxy(TTreeReader *r, const std::string &bn)
void AddDataSourceColumn(std::string_view name)
void ReturnSlot(unsigned int slotNumber)
const ColumnNames_t fBranches
unsigned int GetNSlots() const
ULong64_t GetNEmptyEntries() const
bool MustRunNamedFilters() const
void TriggerChildrenCount() final
RLoopManager * fLoopManager
A raw pointer to the RLoopManager at the root of this functional graph.
std::vector< RDFInternal::RDFValueTuple_t< ColumnTypes_t > > fValues
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
A wrapper around a concrete RFilter, which forwards all calls to it RJittedFilter is the type of the ...
std::vector< unsigned int > fBuf
const ColumnNames_t fBranches
T & Get(Long64_t entry)
This overload is used to return scalar quantities (i.e. types that are not read into a RVec) ...
virtual void ResetReportCount()
Extracts data from a TTree.
EColumnKind
TColumnValue has a slightly different behaviour whether the column comes from a TTreeReader, a RDataFrame Define or a RDataSource.
std::vector< ULong64_t > fCounters
unsigned int GetID() const
void FinalizeSlot(unsigned int slot) final
TOneTimeCallback(Callback_t &&f, unsigned int nSlots)
TCCHelperTypes::TSlot TSlot
RooArgSet S(const RooAbsArg &v1)
void operator()(unsigned int slot)
const std::type_info & GetTypeId() const
const ColumnNames_t & GetCustomColumnNames() const
RJittedFilter(RLoopManager *lm, std::string_view name)
void Initialize(Bool_t useTMVAStyle=kTRUE)
Helper class that updates and returns TTree branches as well as RDataFrame temporary columns...
std::vector< TCallback > fCallbacks
Registered callbacks.
std::shared_ptr< RCustomColumnBase > RCustomColumnBasePtr_t
virtual const std::type_info & GetTypeId() const =0
RCustomColumn(std::string_view name, F &&expression, const ColumnNames_t &bl, RLoopManager *lm, bool isDSColumn=false)
bool CheckFilters(unsigned int slot, Long64_t entry) final
void Update(unsigned int slot, Long64_t entry) final
auto PartialUpdateImpl(unsigned int slot) -> decltype(std::declval< H >().PartialUpdate(slot),(void *)(nullptr))
void Report(ROOT::RDF::RCutFlowReport &rep) const final
bool IsDataSourceColumn() const
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
std::vector< std::shared_ptr< bool > > fResProxyReadiness
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, TypeList< BranchTypes... >, TCCHelperTypes::TNothing *)
std::string fToJit
string containing all BuildAndBook actions that should be jitted before running
std::vector< Long64_t > fLastCheckedEntry
void InitSlot(TTreeReader *r, unsigned int slot) final
virtual void ResetChildrenCount()
void StopProcessing() final
std::tuple< TColumnValue< BranchTypes >... > type
void Reset(Detail::TBranchProxy *x)
void Warning(const char *location, const char *msgfmt,...)
void AddColumnAlias(const std::string &alias, const std::string &colName)
Lightweight storage for a collection of types.
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
typename CallableTraits< F >::arg_types FunParamTypes_t
bool CheckFilterHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >)
PrevDataFrame & fPrevData
const std::map< std::string, RCustomColumnBasePtr_t > & GetBookedColumns() const
unsigned int & GetIndex()
std::vector< RCustomColumnBase * > fCustomColumns
Non-owning ptrs to the node responsible for the custom column. Needed when querying custom values...
Describe directory structure in memory.
unsigned long long ULong64_t
basic_string_view< char > string_view
ROOT type_traits extensions.
std::shared_ptr< RRangeBase > RangeBasePtr_t
static constexpr double s
void Exec(unsigned int slot, Long64_t entry, std::index_sequence< S... >)
virtual void ClearValueReaders(unsigned int slot) final
const ColumnNames_t fBranches
void Report(ROOT::RDF::RCutFlowReport &rep) const final
void ClearValueReaders(unsigned int slot) final
Binding & operator=(OUT(*fun)(void))
ColumnNames_t fDefinedDataSourceColumns
List of data-source columns that have been Defined so far.
const std::unique_ptr< RDataSource > fDataSource
Owning pointer to a data-source object. Null if no data-source.
typename RDFInternal::RemoveFirstParameterIf< std::is_same< TSlot, UHT_t >::value, FunParamTypes_t >::type BranchTypesTmp_t
typename std::conditional< std::is_same< ret_type, bool >::value, std::deque< ret_type >, std::vector< ret_type > >::type ValuesPerSlot_t
typedef void((*Func_t)())
std::vector< Long64_t > fLastCheckedEntry
void SetTree(const std::shared_ptr< TTree > &tree)
void ToJit(const std::string &s)
RDataSource * GetDataSource() const
void InitRDFValues(unsigned int slot, RDFValueTuple &valueTuple, TTreeReader *r, const ColumnNames_t &bn, const ColumnNames_t &tmpbn, const std::map< std::string, std::shared_ptr< RCustomColumnBase >> &customCols, std::index_sequence< S... >)
Initialize a tuple of TColumnValues.
void IncrChildrenCount() final
const unsigned int fNSlots
number of thread slots used by this node, inherited from parent node.
EStorageType
Enumerator for the different properties of the branch storage in memory.
void PartialReport(ROOT::RDF::RCutFlowReport &) const
End of recursive chain of calls, does nothing.
void ResetChildrenCount()
RRange(unsigned int start, unsigned int stop, unsigned int stride, PrevData &pd)
const unsigned int fNSlots
Number of thread slots used by this node, inherited from parent node.
const bool fIsDataSourceColumn
does the custom column refer to a data-source column? (or a user-define column?)
RVec< ColumnValue_t > fRVec
If MustUseRVec, i.e. we are reading an array, we return a reference to this RVec to clients...
const std::map< std::string, std::string > & GetAliasMap() const
RLoopManager * fLoopManager
A raw pointer to the RLoopManager at the root of this functional graph.
FilterBaseVec_t fBookedFilters
void InitSlot(TTreeReader *r, unsigned int slot) final
void StopProcessing() final
RDataSource defines an API that RDataFrame can use to read arbitrary data formats.
void ResetRDFValueTuple(ValueTuple &values, std::index_sequence< S... >)
Clear the proxies of a tuple of TColumnValues.
void * PartialUpdateImpl(...)
std::function< void(unsigned int)> Callback_t
const unsigned int fNSlots
Number of thread slots used by this node, inherited from parent node.
const ColumnNames_t & GetDefinedDataSourceColumns() const
TCCHelperTypes::TSlotAndEntry TSlotAndEntry
void InitSlot(TTreeReader *r, unsigned int slot) final
make_integer_sequence< size_t, _Np > make_index_sequence
std::vector< std::unique_ptr< TreeReader_t > > fTreeReaders
Owning ptrs to a TTreeReaderValue or TTreeReaderArray. Only used for Tree columns.
void TriggerChildrenCount() final
void PartialReport(ROOT::RDF::RCutFlowReport &rep) const final
std::vector< T ** > fDSValuePtrs
Non-owning ptrs to the value of a data-source column.
TCCHelperTypes::TNothing TNothing
std::vector< RangeBasePtr_t > RangeBaseVec_t
typename std::conditional< MustUseRVec, TakeFirstParameter_t< T >, T >::type ColumnValue_t
std::vector< TOneTimeCallback > fCallbacksOnce
Registered callbacks to invoke just once before running the loop.
ColumnNames_t fCustomColumnNames
Contains names of all custom columns defined in the functional graph.