Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TTreeReaderArray.h
Go to the documentation of this file.
1// @(#)root/tree:$Id$
2// Author: Axel Naumann, 2010-08-02
3// Author: Vincenzo Eduardo Padulano CERN 02/2025
4
5/*************************************************************************
6 * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13#ifndef ROOT_TTreeReaderArray
14#define ROOT_TTreeReaderArray
15
16#include "TTreeReaderValue.h"
17#include "TTreeReaderUtils.h"
18#include <type_traits>
19#include <cstddef>
20
21namespace ROOT {
22namespace Internal {
23
24/** \class TTreeReaderArrayBase
25Base class of TTreeReaderArray.
26*/
27
29public:
34
35 std::size_t GetSize() const { return fImpl ? fImpl->GetSize(GetProxy()) : 0; }
36 bool IsEmpty() const { return !GetSize(); }
37
38 EReadStatus GetReadStatus() const override { return fImpl ? fImpl->fReadStatus : kReadError; }
39
40 bool IsContiguous() const { return fImpl->IsContiguous(GetProxy()); }
41
42 /// Returns the `sizeof` of the collection value type. Returns 0 in case the value size could not be retrieved.
43 std::size_t GetValueSize() const { return fImpl ? fImpl->GetValueSize(GetProxy()) : 0; }
44
45protected:
46 void *UntypedAt(std::size_t idx) const { return fImpl->At(GetProxy(), idx); }
47 void CreateProxy() override;
52
53 std::unique_ptr<TVirtualCollectionReader> fImpl; // Common interface to collections
54
55 // FIXME: re-introduce once we have ClassDefInline!
56 // ClassDefOverride(TTreeReaderArrayBase, 0);//Accessor to member of an object stored in a collection
57};
58
61
62public:
63 TTreeReaderUntypedArray(TTreeReader &tr, std::string_view branchName, std::string_view innerTypeName)
65 fArrayElementTypeName(innerTypeName)
66 {
67 }
68
69 std::byte *At(std::size_t idx) const { return reinterpret_cast<std::byte *>(UntypedAt(idx)); }
70
71protected:
72 const char *GetDerivedTypeName() const final { return fArrayElementTypeName.c_str(); }
73};
74
75} // namespace Internal
76} // namespace ROOT
77
78// clang-format off
79/**
80 * \class TTreeReaderArray
81 * \ingroup treeplayer
82 * \brief An interface for reading collections stored in ROOT columnar datasets
83 *
84 * The TTreeReaderArray is a type-safe tool to be used in association with a TTreeReader
85 * to access the collections stored in TTree, TNtuple and TChain datasets.
86 * In order to access values which are not collections, the TTreeReaderValue class can
87 * be used.
88 *
89 * See the documentation of TTreeReader for more details and examples.
90*/
91// clang-format on
92
93template <typename T>
95 // R__CLING_PTRCHECK is disabled because pointer / types are checked by CreateProxy().
96
97public:
98 /// Random access iterator to the elements of a TTreeReaderArray.
99 // The template parameter is there to allow distinguishing between the `const` and `non-const` cases.
100 template <typename ReaderArrayType>
102 public:
103 // iterators must define the following types
104 using iterator_category = std::random_access_iterator_tag;
105 using value_type = T;
106 using difference_type = std::ptrdiff_t;
107 using pointer = std::conditional_t<std::is_const<ReaderArrayType>::value, const T *, T *>;
108 using reference = std::conditional_t<std::is_const<ReaderArrayType>::value, const T &, T &>;
109
110 private:
111 TTreeReaderArray *fArray; ///< The array iterated over; nullptr if invalid/past-the-end.
112 std::size_t fIndex; ///< Current index in the array.
113 std::size_t fSize; ///< Size of the TTreeReaderArray
114 public:
115 /// Default ctor: constructs a past-the-end iterator
116 Iterator_t() : fArray(nullptr), fIndex(0u), fSize(0u) {}
117
118 /// Construct iterator
119 Iterator_t(std::size_t index, TTreeReaderArray *array)
120 : fArray(array), fIndex(index), fSize(fArray ? fArray->GetSize() : 0u)
121 {
122 if (fIndex >= fSize)
123 fArray = nullptr; // invalidate iterator
124 }
125
126 /// Construct iterator from a const TTreeReaderArray
127 Iterator_t(std::size_t index, const TTreeReaderArray *array)
129 {
130 }
131
132 Iterator_t(Iterator_t &&) = default;
133 Iterator_t(const Iterator_t &) = default;
135 Iterator_t &operator=(const Iterator_t &) = default;
136
138 {
139 R__ASSERT(fArray && "invalid iterator!");
140 return fArray->At(fIndex);
141 }
142
143 pointer operator->() const { return IsValid() ? &fArray->At(fIndex) : nullptr; }
144
145 bool operator==(const Iterator_t &other) const
146 {
147 // Follow C++14 requiring two past-the-end iterators to be equal.
148 if (!IsValid() && !other.IsValid())
149 return true;
150 return fArray == other.fArray && fIndex == other.fIndex;
151 }
152
153 bool operator!=(const Iterator_t &other) const { return !(*this == other); }
154
155 /// Pre-increment operator
157 {
158 if (IsValid())
159 ++fIndex;
160 if (fIndex >= fSize)
161 fArray = nullptr; // invalidate iterator
162 return *this;
163 }
164
165 /// Post-increment operator
167 {
168 auto ret = *this;
169 this->operator++();
170 return ret;
171 }
172
173 /// Pre-decrement operator
175 {
176 if (fIndex == 0u)
177 fArray = nullptr; // invalidate iterator
178 else
179 --fIndex;
180 return *this;
181 }
182
183 /// Post-decrement operator
185 {
186 auto ret = *this;
187 this->operator--();
188 return ret;
189 }
190
191 Iterator_t operator+(std::ptrdiff_t n) const { return Iterator_t(fIndex + n, fArray); }
192 friend auto operator+(std::ptrdiff_t n, const Iterator_t &it) -> decltype(it + n) { return it + n; }
193
194 Iterator_t operator-(std::ptrdiff_t n) const
195 {
196 const auto index = std::ptrdiff_t(fIndex);
197 const auto newIndex = index >= n ? index - n : std::numeric_limits<decltype(fIndex)>::max();
198 return Iterator_t(newIndex, fArray);
199 }
200
201 std::ptrdiff_t operator-(const Iterator_t &other) const { return fIndex - other.fIndex; }
202
203 Iterator_t &operator+=(std::ptrdiff_t n) { return (*this = *this + n); }
204
205 Iterator_t &operator-=(std::ptrdiff_t n) { return (*this = *this - n); }
206
207 bool operator<(const Iterator_t &other) const { return fIndex < other.fIndex; }
208 bool operator>(const Iterator_t &other) const { return fIndex > other.fIndex; }
209 bool operator<=(const Iterator_t &other) const { return !(*this > other); }
210 bool operator>=(const Iterator_t &other) const { return !(*this < other); }
211
212 reference operator[](std::size_t index) const { return *(*this + index); }
213
214 operator pointer() { return &fArray->At(fIndex); }
215
216 bool IsValid() const { return fArray != nullptr; }
217 };
218
221
222 /// Create an array reader of branch "branchname" for TTreeReader "tr".
224 : TTreeReaderArrayBase(&tr, branchname, TDictionary::GetDictionary(typeid(T)))
225 {
226 }
227
228 T &At(std::size_t idx) { return *static_cast<T *>(UntypedAt(idx)); }
229 const T &At(std::size_t idx) const { return *static_cast<T *>(UntypedAt(idx)); }
230 T &operator[](std::size_t idx) { return At(idx); }
231 const T &operator[](std::size_t idx) const { return At(idx); }
232
233 iterator begin() { return iterator(0u, this); }
234 iterator end() { return iterator(GetSize(), this); }
235 const_iterator begin() const { return cbegin(); }
236 const_iterator end() const { return cend(); }
237 const_iterator cbegin() const { return const_iterator(0u, this); }
238 const_iterator cend() const { return const_iterator(GetSize(), this); }
239
240protected:
241#define R__TTreeReaderArray_TypeString(T) #T
242 const char *GetDerivedTypeName() const override { return R__TTreeReaderArray_TypeString(T); }
243#undef R__TTreeReaderArray_TypeString
244 // FIXME: re-introduce once we have ClassDefTInline!
245 // ClassDefT(TTreeReaderArray, 0);//Accessor to member of an object stored in a collection
246};
247
248namespace cling {
249template <typename T>
250std::string printValue(TTreeReaderArray<T> *val)
251{
252 return printValue(static_cast<ROOT::Internal::TTreeReaderValueBase *>(val));
253}
254} // namespace cling
255
256#endif // ROOT_TTreeReaderArray
dim_t fSize
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Definition TError.h:125
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
#define R__TTreeReaderArray_TypeString(T)
Base class of TTreeReaderArray.
void CreateProxy() override
Create the proxy object for our branch.
std::unique_ptr< TVirtualCollectionReader > fImpl
bool GetBranchAndLeaf(TBranch *&branch, TLeaf *&myLeaf, TDictionary *&branchActualType, bool suppressErrorsForMissingBranch=false)
Determine the branch / leaf and its type; reset fProxy / fSetupStatus on error.
TTreeReaderArrayBase(TTreeReader *reader, const char *branchname, TDictionary *dict)
void * UntypedAt(std::size_t idx) const
EReadStatus GetReadStatus() const override
std::size_t GetValueSize() const
Returns the sizeof of the collection value type. Returns 0 in case the value size could not be retrie...
void SetImpl(TBranch *branch, TLeaf *myLeaf)
Create the TVirtualCollectionReader object for our branch.
const char * GetBranchContentDataType(TBranch *branch, TString &contentTypeName, TDictionary *&dict)
Access a branch's collection content (not the collection itself) through a proxy.
std::byte * At(std::size_t idx) const
TTreeReaderUntypedArray(TTreeReader &tr, std::string_view branchName, std::string_view innerTypeName)
const char * GetDerivedTypeName() const final
Base class of TTreeReaderValue.
Detail::TBranchProxy * GetProxy() const
A TTree is a list of TBranches.
Definition TBranch.h:93
This class defines an abstract interface that must be implemented by all classes that contain diction...
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Definition TLeaf.h:57
Basic string class.
Definition TString.h:139
Random access iterator to the elements of a TTreeReaderArray.
Iterator_t()
Default ctor: constructs a past-the-end iterator.
std::size_t fIndex
Current index in the array.
bool operator>(const Iterator_t &other) const
reference operator[](std::size_t index) const
Iterator_t & operator--()
Pre-decrement operator.
bool operator!=(const Iterator_t &other) const
Iterator_t operator++(int)
Post-increment operator.
bool operator>=(const Iterator_t &other) const
Iterator_t(const Iterator_t &)=default
Iterator_t & operator++()
Pre-increment operator.
Iterator_t operator--(int)
Post-decrement operator.
std::size_t fSize
Size of the TTreeReaderArray.
Iterator_t & operator-=(std::ptrdiff_t n)
Iterator_t & operator=(Iterator_t &&)=default
std::conditional_t< std::is_const< ReaderArrayType >::value, const T *, T * > pointer
bool operator<(const Iterator_t &other) const
std::ptrdiff_t operator-(const Iterator_t &other) const
TTreeReaderArray * fArray
The array iterated over; nullptr if invalid/past-the-end.
Iterator_t & operator=(const Iterator_t &)=default
std::conditional_t< std::is_const< ReaderArrayType >::value, const T &, T & > reference
Iterator_t & operator+=(std::ptrdiff_t n)
Iterator_t(Iterator_t &&)=default
bool operator<=(const Iterator_t &other) const
Iterator_t operator-(std::ptrdiff_t n) const
bool operator==(const Iterator_t &other) const
friend auto operator+(std::ptrdiff_t n, const Iterator_t &it) -> decltype(it+n)
Iterator_t operator+(std::ptrdiff_t n) const
std::random_access_iterator_tag iterator_category
Iterator_t(std::size_t index, TTreeReaderArray *array)
Construct iterator.
Iterator_t(std::size_t index, const TTreeReaderArray *array)
Construct iterator from a const TTreeReaderArray.
An interface for reading collections stored in ROOT columnar datasets.
const char * GetDerivedTypeName() const override
T & At(std::size_t idx)
TTreeReaderArray(TTreeReader &tr, const char *branchname)
Create an array reader of branch "branchname" for TTreeReader "tr".
const_iterator cend() const
const_iterator cbegin() const
const T & At(std::size_t idx) const
const_iterator begin() const
const T & operator[](std::size_t idx) const
T & operator[](std::size_t idx)
const_iterator end() const
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
Definition TTreeReader.h:46
const Int_t n
Definition legend1.C:16
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...