Logo ROOT  
Reference Guide
RCustomColumn.hxx
Go to the documentation of this file.
1// Author: Enrico Guiraud, Danilo Piparo CERN 09/2018
2
3/*************************************************************************
4 * Copyright (C) 1995-2018, 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_RCUSTOMCOLUMN
12#define ROOT_RCUSTOMCOLUMN
13
17#include "ROOT/RDF/Utils.hxx"
19#include "ROOT/RStringView.hxx"
20#include "ROOT/TypeTraits.hxx"
21#include "RtypesCore.h"
22
23#include <deque>
24#include <type_traits>
25#include <vector>
26
27class TTreeReader;
28
29namespace ROOT {
30namespace Detail {
31namespace RDF {
32
33using namespace ROOT::TypeTraits;
34
35// clang-format off
36namespace CustomColExtraArgs {
37struct None{};
38struct Slot{};
39struct SlotAndEntry{};
40}
41// clang-format on
42
43template <typename F, typename ExtraArgsTag = CustomColExtraArgs::None>
44class RCustomColumn final : public RCustomColumnBase {
45 // shortcuts
49 // other types
50 using FunParamTypes_t = typename CallableTraits<F>::arg_types;
52 RDFInternal::RemoveFirstParameterIf_t<std::is_same<ExtraArgsTag, SlotTag>::value, FunParamTypes_t>;
54 RDFInternal::RemoveFirstTwoParametersIf_t<std::is_same<ExtraArgsTag, SlotAndEntryTag>::value, ColumnTypesTmp_t>;
55 using TypeInd_t = std::make_index_sequence<ColumnTypes_t::list_size>;
56 using ret_type = typename CallableTraits<F>::ret_type;
57 // Avoid instantiating vector<bool> as `operator[]` returns temporaries in that case. Use std::deque instead.
59 typename std::conditional<std::is_same<ret_type, bool>::value, std::deque<ret_type>, std::vector<ret_type>>::type;
60
62 const ColumnNames_t fColumnNames;
64
65 std::vector<RDFInternal::RDFValueTuple_t<ColumnTypes_t>> fValues;
66
67 /// The nth flag signals whether the nth input column is a custom column or not.
68 std::array<bool, ColumnTypes_t::list_size> fIsCustomColumn;
69
70 template <std::size_t... S>
71 void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence<S...>, NoneTag)
72 {
73 fLastResults[slot] = fExpression(std::get<S>(fValues[slot]).Get(entry)...);
74 // silence "unused parameter" warnings in gcc
75 (void)slot;
76 (void)entry;
77 }
78
79 template <std::size_t... S>
80 void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence<S...>, SlotTag)
81 {
82 fLastResults[slot] = fExpression(slot, std::get<S>(fValues[slot]).Get(entry)...);
83 // silence "unused parameter" warnings in gcc
84 (void)slot;
85 (void)entry;
86 }
87
88 template <std::size_t... S>
89 void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence<S...>, SlotAndEntryTag)
90 {
91 fLastResults[slot] = fExpression(slot, entry, std::get<S>(fValues[slot]).Get(entry)...);
92 // silence "unused parameter" warnings in gcc
93 (void)slot;
94 (void)entry;
95 }
96
97public:
98 RCustomColumn(std::string_view name, std::string_view type, F expression, const ColumnNames_t &columns,
99 unsigned int nSlots, const RDFInternal::RBookedCustomColumns &customColumns, bool isDSColumn = false)
100 : RCustomColumnBase(name, type, nSlots, isDSColumn, customColumns), fExpression(std::move(expression)),
102 {
103 const auto nColumns = fColumnNames.size();
104 for (auto i = 0u; i < nColumns; ++i)
106 }
107
108 RCustomColumn(const RCustomColumn &) = delete;
110
111 void InitSlot(TTreeReader *r, unsigned int slot) final
112 {
113 if (!fIsInitialized[slot]) {
114 fIsInitialized[slot] = true;
116 fLastCheckedEntry[slot] = -1;
117 }
118 }
119
120 void *GetValuePtr(unsigned int slot) final { return static_cast<void *>(&fLastResults[slot]); }
121
122 void Update(unsigned int slot, Long64_t entry) final
123 {
124 if (entry != fLastCheckedEntry[slot]) {
125 // evaluate this filter, cache the result
126 UpdateHelper(slot, entry, TypeInd_t(), ExtraArgsTag{});
127 fLastCheckedEntry[slot] = entry;
128 }
129 }
130
131 const std::type_info &GetTypeId() const
132 {
133 return fIsDataSourceColumn ? typeid(typename std::remove_pointer<ret_type>::type) : typeid(ret_type);
134 }
135
136 void ClearValueReaders(unsigned int slot) final
137 {
138 if (fIsInitialized[slot]) {
140 fIsInitialized[slot] = false;
141 }
142 }
143};
144
145} // ns RDF
146} // ns Detail
147} // ns ROOT
148
149#endif // ROOT_RCUSTOMCOLUMN
ROOT::R::TRInterface & r
Definition: Object.C:4
long long Long64_t
Definition: RtypesCore.h:71
char name[80]
Definition: TGX11.cxx:109
int type
Definition: TGX11.cxx:120
typedef void((*Func_t)())
const bool fIsDataSourceColumn
does the custom column refer to a data-source column? (or a user-define column?)
std::vector< Long64_t > fLastCheckedEntry
RDFInternal::RBookedCustomColumns fCustomColumns
const unsigned int fNSlots
number of thread slots used by this node, inherited from parent node.
std::array< bool, ColumnTypes_t::list_size > fIsCustomColumn
The nth flag signals whether the nth input column is a custom column or not.
std::make_index_sequence< ColumnTypes_t::list_size > TypeInd_t
std::vector< RDFInternal::RDFValueTuple_t< ColumnTypes_t > > fValues
typename std::conditional< std::is_same< ret_type, bool >::value, std::deque< ret_type >, std::vector< ret_type > >::type ValuesPerSlot_t
typename CallableTraits< F >::ret_type ret_type
RCustomColumn & operator=(const RCustomColumn &)=delete
const ColumnNames_t fColumnNames
RCustomColumn(const RCustomColumn &)=delete
const std::type_info & GetTypeId() const
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, SlotAndEntryTag)
void ClearValueReaders(unsigned int slot) final
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, NoneTag)
void UpdateHelper(unsigned int slot, Long64_t entry, std::index_sequence< S... >, SlotTag)
RDFInternal::RemoveFirstParameterIf_t< std::is_same< ExtraArgsTag, SlotTag >::value, FunParamTypes_t > ColumnTypesTmp_t
RDFInternal::RemoveFirstTwoParametersIf_t< std::is_same< ExtraArgsTag, SlotAndEntryTag >::value, ColumnTypesTmp_t > ColumnTypes_t
typename CallableTraits< F >::arg_types FunParamTypes_t
void InitSlot(TTreeReader *r, unsigned int slot) final
void * GetValuePtr(unsigned int slot) final
RCustomColumn(std::string_view name, std::string_view type, F expression, const ColumnNames_t &columns, unsigned int nSlots, const RDFInternal::RBookedCustomColumns &customColumns, bool isDSColumn=false)
void Update(unsigned int slot, Long64_t entry) final
Encapsulates the columns defined by the user.
bool HasName(std::string_view name) const
Check if the provided name is tracked in the names list.
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
Definition: TTreeReader.h:43
basic_string_view< char > string_view
#define F(x, y, z)
void InitRDFValues(unsigned int slot, RDFValueTuple &valueTuple, TTreeReader *r, const ColumnNames_t &bn, const RBookedCustomColumns &customCols, std::index_sequence< S... >, const std::array< bool, sizeof...(S)> &isCustomColumn)
Initialize a tuple of RColumnValues.
Definition: NodesUtils.hxx:54
void ResetRDFValueTuple(std::vector< RTypeErasedColumnValue > &values, std::index_sequence< S... >, ROOT::TypeTraits::TypeList< ColTypes... >)
This overload is specialized to act on RTypeErasedColumnValues instead of RColumnValues.
Definition: RAction.hxx:88
ROOT type_traits extensions.
Definition: TypeTraits.hxx:21
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
Definition: StringConv.hxx:21
RooArgSet S(const RooAbsArg &v1)