Logo ROOT   6.14/05
Reference Guide
List of all members | Public Types | Public Member Functions | Private Attributes | List of all members
ROOT::VecOps::RVec< T > Class Template Reference

template<typename T>
class ROOT::VecOps::RVec< T >

A "std::vector"-like collection of values implementing handy operation to analyse them.

Template Parameters
TThe type of the contained objects

A RVec is a container designed to make analysis of values' collections fast and easy. Its storage is contiguous in memory and its interface is designed such to resemble to the one of the stl vector. In addition the interface features methods and external functions to ease the manipulation and analysis of the data in the RVec.

DOI

Table of Contents

Example

Suppose to have an event featuring a collection of muons with a certain pseudorapidity, momentum and charge, e.g.:

std::vector<short> mu_charge {1, 1, -1, -1, -1, 1, 1, -1};
std::vector<float> mu_pt {56, 45, 32, 24, 12, 8, 7, 6.2};
std::vector<float> mu_eta {3.1, -.2, -1.1, 1, 4.1, 1.6, 2.4, -.5};

Suppose you want to extract the transverse momenta of the muons satisfying certain criteria, for example consider only negatively charged muons with a pseudorapidity smaller or equal to 2 and with a transverse momentum greater than 10 GeV. Such a selection would require, among the other things, the management of an explicit loop, for example:

std::vector<float> goodMuons_pt;
const auto size = mu_charge.size();
for (size_t i=0; i < size; ++i) {
if (mu_pt[i] > 10 && abs(mu_eta[i]) <= 2. && mu_charge[i] == -1) {
goodMuons_pt.emplace_back(mu_pt[i]);
}
}

These operations become straightforward with RVec - we just need to write what we mean:

RVec<short> mu_charge {1, 1, -1, -1, -1, 1, 1, -1};
RVec<float> mu_pt {56, 45, 32, 24, 12, 8, 7, 6.2};
RVec<float> mu_eta {3.1, -.2, -1.1, 1, 4.1, 1.6, 2.4, -.5};
auto goodMuons_pt = mu_pt[ (mu_pt > 10.f && abs(mu_eta) <= 2.f && mu_charge == -1)

Now the clean collection of transverse momenta can be used within the rest of the data analysis, for example to fill a histogram.

Owning and adopting memory

RVec has contiguous memory associated to it. It can own it or simply adopt it. In the latter case, it can be constructed with the address of the memory associated to it and its lenght. For example:

std::vector<int> myStlVec {1,2,3};
RVec<int> myRVec(myStlVec.data(), myStlVec.size());

In this case, the memory associated to myStlVec and myRVec is the same, myRVec simply "adopted it". If any method which implies a re-allocation is called, e.g. emplace_back or resize, the adopted memory is released and new one is allocated. The previous content is copied in the new memory and preserved.

Usage in combination with TDataFrame

TDataFrame leverages internally RVecs. Suppose to have a dataset stored in a TTree which holds these columns (here we choose C arrays to represent the collections, they could be as well std::vector instances):

nPart "nPart/I" An integer representing the number of particles
px "px[nPart]/D" The C array of the particles' x component of the momentum
py "py[nPart]/D" The C array of the particles' y component of the momentum
E "E[nPart]/D" The C array of the particles' Energy

Suppose you'd like to plot in a histogram the transverse momenta of all particles for which the energy is greater than 200 MeV. The code required would just be:

TDataFrame d("mytree", "myfile.root");
using doubles = RVec<double>;
auto cutPt = [](doubles &pxs, doubles &pys, doubles &Es) {
auto all_pts = sqrt(pxs * pxs + pys * pys);
auto good_pts = all_pts[Es > 200.];
return good_pts;
};
auto hpt = d.Define("pt", cutPt, {"px", "py", "E"})
.Histo1D("pt");
hpt->Draw();

And if you'd like to express your selection as a string:

TDataFrame d("mytree", "myfile.root");
auto hpt = d.Define("pt", "sqrt(pxs * pxs + pys * pys)[E>200]")
.Histo1D("pt");
hpt->Draw();

Definition at line 146 of file RVec.hxx.

Public Types

using const_iterator = typename Impl_t::const_iterator
 
using const_pointer = typename Impl_t::const_pointer
 
using const_reference = typename Impl_t::const_reference
 
using const_reverse_iterator = typename Impl_t::const_reverse_iterator
 
using difference_type = typename Impl_t::difference_type
 
using Impl_t = typename std::vector< T, ::ROOT::Detail::VecOps::RAdoptAllocator< T > >
 
using iterator = typename Impl_t::iterator
 
using pointer = typename Impl_t::pointer
 
using reference = typename Impl_t::reference
 
using reverse_iterator = typename Impl_t::reverse_iterator
 
using size_type = typename Impl_t::size_type
 
using value_type = typename Impl_t::value_type
 

Public Member Functions

 RVec ()
 
 RVec (size_type count)
 
 RVec (size_type count, const T &value)
 
 RVec (const RVec< T > &v)
 
 RVec (RVec< T > &&v)
 
 RVec (const std::vector< T > &v)
 
 RVec (pointer p, size_type n)
 
template<class InputIt >
 RVec (InputIt first, InputIt last)
 
 RVec (std::initializer_list< T > init)
 
reference at (size_type pos)
 
const_reference at (size_type pos) const
 
reference back ()
 
const_reference back () const
 
iterator begin () noexcept
 
const_iterator begin () const noexcept
 
size_type capacity () const noexcept
 
const_iterator cbegin () const noexcept
 
const_iterator cend () const noexcept
 
void clear () noexcept
 
const_reverse_iterator crbegin () const noexcept
 
const_reverse_iterator crend () const noexcept
 
T * data () noexcept
 
const T * data () const noexcept
 
template<typename U = T, typename std::enable_if< std::is_arithmetic< U >::value, int > * = nullptr>
iterator emplace (const_iterator pos, U value)
 This method is intended only for arithmetic types unlike the std::vector corresponding one which is generic. More...
 
template<class... Args>
reference emplace_back (Args &&... args)
 
bool empty () const noexcept
 
iterator end () noexcept
 
const_iterator end () const noexcept
 
iterator erase (iterator pos)
 
iterator erase (iterator first, iterator last)
 
reference front ()
 
const_reference front () const
 
size_type max_size () const noexcept
 
template<typename U , typename = std::enable_if<std::is_convertible<T, U>::value>>
 operator RVec< U > () const
 
RVec< T > & operator= (const RVec< T > &v)
 
RVec< T > & operator= (RVec< T > &&v)
 
RVec< T > & operator= (std::initializer_list< T > ilist)
 
reference operator[] (size_type pos)
 
const_reference operator[] (size_type pos) const
 
template<typename V , typename = std::enable_if<std::is_convertible<V, bool>::value>>
RVec operator[] (const RVec< V > &conds) const
 
void pop_back ()
 
void push_back (T &&value)
 
reverse_iterator rbegin () noexcept
 
const_reverse_iterator rbegin () const noexcept
 
reverse_iterator rend () noexcept
 
const_reverse_iterator rend () const noexcept
 
void reserve (size_type new_cap)
 
void resize (size_type count)
 
void resize (size_type count, const value_type &value)
 
void shrink_to_fit ()
 
size_type size () const noexcept
 
void swap (RVec< T > &other)
 

Private Attributes

Impl_t fData
 

#include <ROOT/RVec.hxx>

Member Typedef Documentation

◆ const_iterator

template<typename T>
using ROOT::VecOps::RVec< T >::const_iterator = typename Impl_t::const_iterator

Definition at line 157 of file RVec.hxx.

◆ const_pointer

template<typename T>
using ROOT::VecOps::RVec< T >::const_pointer = typename Impl_t::const_pointer

Definition at line 155 of file RVec.hxx.

◆ const_reference

template<typename T>
using ROOT::VecOps::RVec< T >::const_reference = typename Impl_t::const_reference

Definition at line 153 of file RVec.hxx.

◆ const_reverse_iterator

template<typename T>
using ROOT::VecOps::RVec< T >::const_reverse_iterator = typename Impl_t::const_reverse_iterator

Definition at line 159 of file RVec.hxx.

◆ difference_type

template<typename T>
using ROOT::VecOps::RVec< T >::difference_type = typename Impl_t::difference_type

Definition at line 151 of file RVec.hxx.

◆ Impl_t

template<typename T>
using ROOT::VecOps::RVec< T >::Impl_t = typename std::vector<T, ::ROOT::Detail::VecOps::RAdoptAllocator<T> >

Definition at line 148 of file RVec.hxx.

◆ iterator

template<typename T>
using ROOT::VecOps::RVec< T >::iterator = typename Impl_t::iterator

Definition at line 156 of file RVec.hxx.

◆ pointer

template<typename T>
using ROOT::VecOps::RVec< T >::pointer = typename Impl_t::pointer

Definition at line 154 of file RVec.hxx.

◆ reference

template<typename T>
using ROOT::VecOps::RVec< T >::reference = typename Impl_t::reference

Definition at line 152 of file RVec.hxx.

◆ reverse_iterator

template<typename T>
using ROOT::VecOps::RVec< T >::reverse_iterator = typename Impl_t::reverse_iterator

Definition at line 158 of file RVec.hxx.

◆ size_type

template<typename T>
using ROOT::VecOps::RVec< T >::size_type = typename Impl_t::size_type

Definition at line 150 of file RVec.hxx.

◆ value_type

template<typename T>
using ROOT::VecOps::RVec< T >::value_type = typename Impl_t::value_type

Definition at line 149 of file RVec.hxx.

Constructor & Destructor Documentation

◆ RVec() [1/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( )
inline

Definition at line 166 of file RVec.hxx.

◆ RVec() [2/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( size_type  count)
inlineexplicit

Definition at line 168 of file RVec.hxx.

◆ RVec() [3/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( size_type  count,
const T &  value 
)
inline

Definition at line 170 of file RVec.hxx.

◆ RVec() [4/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( const RVec< T > &  v)
inline

Definition at line 172 of file RVec.hxx.

◆ RVec() [5/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( RVec< T > &&  v)
inline

Definition at line 174 of file RVec.hxx.

◆ RVec() [6/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( const std::vector< T > &  v)
inline

Definition at line 176 of file RVec.hxx.

◆ RVec() [7/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( pointer  p,
size_type  n 
)
inline

Definition at line 178 of file RVec.hxx.

◆ RVec() [8/9]

template<typename T>
template<class InputIt >
ROOT::VecOps::RVec< T >::RVec ( InputIt  first,
InputIt  last 
)
inline

Definition at line 181 of file RVec.hxx.

◆ RVec() [9/9]

template<typename T>
ROOT::VecOps::RVec< T >::RVec ( std::initializer_list< T >  init)
inline

Definition at line 183 of file RVec.hxx.

Member Function Documentation

◆ at() [1/2]

template<typename T>
reference ROOT::VecOps::RVec< T >::at ( size_type  pos)
inline

Definition at line 214 of file RVec.hxx.

◆ at() [2/2]

template<typename T>
const_reference ROOT::VecOps::RVec< T >::at ( size_type  pos) const
inline

Definition at line 215 of file RVec.hxx.

◆ back() [1/2]

template<typename T>
reference ROOT::VecOps::RVec< T >::back ( )
inline

Definition at line 237 of file RVec.hxx.

◆ back() [2/2]

template<typename T>
const_reference ROOT::VecOps::RVec< T >::back ( ) const
inline

Definition at line 238 of file RVec.hxx.

◆ begin() [1/2]

template<typename T>
iterator ROOT::VecOps::RVec< T >::begin ( )
inlinenoexcept

Definition at line 242 of file RVec.hxx.

◆ begin() [2/2]

template<typename T>
const_iterator ROOT::VecOps::RVec< T >::begin ( ) const
inlinenoexcept

Definition at line 243 of file RVec.hxx.

◆ capacity()

template<typename T>
size_type ROOT::VecOps::RVec< T >::capacity ( ) const
inlinenoexcept

Definition at line 259 of file RVec.hxx.

◆ cbegin()

template<typename T>
const_iterator ROOT::VecOps::RVec< T >::cbegin ( ) const
inlinenoexcept

Definition at line 244 of file RVec.hxx.

◆ cend()

template<typename T>
const_iterator ROOT::VecOps::RVec< T >::cend ( ) const
inlinenoexcept

Definition at line 247 of file RVec.hxx.

◆ clear()

template<typename T>
void ROOT::VecOps::RVec< T >::clear ( )
inlinenoexcept

Definition at line 262 of file RVec.hxx.

◆ crbegin()

template<typename T>
const_reverse_iterator ROOT::VecOps::RVec< T >::crbegin ( ) const
inlinenoexcept

Definition at line 250 of file RVec.hxx.

◆ crend()

template<typename T>
const_reverse_iterator ROOT::VecOps::RVec< T >::crend ( ) const
inlinenoexcept

Definition at line 253 of file RVec.hxx.

◆ data() [1/2]

template<typename T>
T* ROOT::VecOps::RVec< T >::data ( )
inlinenoexcept

Definition at line 239 of file RVec.hxx.

◆ data() [2/2]

template<typename T>
const T* ROOT::VecOps::RVec< T >::data ( ) const
inlinenoexcept

Definition at line 240 of file RVec.hxx.

◆ emplace()

template<typename T>
template<typename U = T, typename std::enable_if< std::is_arithmetic< U >::value, int > * = nullptr>
iterator ROOT::VecOps::RVec< T >::emplace ( const_iterator  pos,
value 
)
inline

This method is intended only for arithmetic types unlike the std::vector corresponding one which is generic.

Definition at line 275 of file RVec.hxx.

◆ emplace_back()

template<typename T>
template<class... Args>
reference ROOT::VecOps::RVec< T >::emplace_back ( Args &&...  args)
inline

Definition at line 267 of file RVec.hxx.

◆ empty()

template<typename T>
bool ROOT::VecOps::RVec< T >::empty ( ) const
inlinenoexcept

Definition at line 255 of file RVec.hxx.

◆ end() [1/2]

template<typename T>
iterator ROOT::VecOps::RVec< T >::end ( )
inlinenoexcept

Definition at line 245 of file RVec.hxx.

◆ end() [2/2]

template<typename T>
const_iterator ROOT::VecOps::RVec< T >::end ( ) const
inlinenoexcept

Definition at line 246 of file RVec.hxx.

◆ erase() [1/2]

template<typename T>
iterator ROOT::VecOps::RVec< T >::erase ( iterator  pos)
inline

Definition at line 263 of file RVec.hxx.

◆ erase() [2/2]

template<typename T>
iterator ROOT::VecOps::RVec< T >::erase ( iterator  first,
iterator  last 
)
inline

Definition at line 264 of file RVec.hxx.

◆ front() [1/2]

template<typename T>
reference ROOT::VecOps::RVec< T >::front ( )
inline

Definition at line 235 of file RVec.hxx.

◆ front() [2/2]

template<typename T>
const_reference ROOT::VecOps::RVec< T >::front ( ) const
inline

Definition at line 236 of file RVec.hxx.

◆ max_size()

template<typename T>
size_type ROOT::VecOps::RVec< T >::max_size ( ) const
inlinenoexcept

Definition at line 257 of file RVec.hxx.

◆ operator RVec< U >()

template<typename T>
template<typename U , typename = std::enable_if<std::is_convertible<T, U>::value>>
ROOT::VecOps::RVec< T >::operator RVec< U > ( ) const
inline

Definition at line 206 of file RVec.hxx.

◆ operator=() [1/3]

template<typename T>
RVec<T>& ROOT::VecOps::RVec< T >::operator= ( const RVec< T > &  v)
inline

Definition at line 186 of file RVec.hxx.

◆ operator=() [2/3]

template<typename T>
RVec<T>& ROOT::VecOps::RVec< T >::operator= ( RVec< T > &&  v)
inline

Definition at line 192 of file RVec.hxx.

◆ operator=() [3/3]

template<typename T>
RVec<T>& ROOT::VecOps::RVec< T >::operator= ( std::initializer_list< T >  ilist)
inline

Definition at line 198 of file RVec.hxx.

◆ operator[]() [1/3]

template<typename T>
reference ROOT::VecOps::RVec< T >::operator[] ( size_type  pos)
inline

Definition at line 216 of file RVec.hxx.

◆ operator[]() [2/3]

template<typename T>
const_reference ROOT::VecOps::RVec< T >::operator[] ( size_type  pos) const
inline

Definition at line 217 of file RVec.hxx.

◆ operator[]() [3/3]

template<typename T>
template<typename V , typename = std::enable_if<std::is_convertible<V, bool>::value>>
RVec ROOT::VecOps::RVec< T >::operator[] ( const RVec< V > &  conds) const
inline

Definition at line 220 of file RVec.hxx.

◆ pop_back()

template<typename T>
void ROOT::VecOps::RVec< T >::pop_back ( )
inline

Definition at line 279 of file RVec.hxx.

◆ push_back()

template<typename T>
void ROOT::VecOps::RVec< T >::push_back ( T &&  value)
inline

Definition at line 265 of file RVec.hxx.

◆ rbegin() [1/2]

template<typename T>
reverse_iterator ROOT::VecOps::RVec< T >::rbegin ( )
inlinenoexcept

Definition at line 248 of file RVec.hxx.

◆ rbegin() [2/2]

template<typename T>
const_reverse_iterator ROOT::VecOps::RVec< T >::rbegin ( ) const
inlinenoexcept

Definition at line 249 of file RVec.hxx.

◆ rend() [1/2]

template<typename T>
reverse_iterator ROOT::VecOps::RVec< T >::rend ( )
inlinenoexcept

Definition at line 251 of file RVec.hxx.

◆ rend() [2/2]

template<typename T>
const_reverse_iterator ROOT::VecOps::RVec< T >::rend ( ) const
inlinenoexcept

Definition at line 252 of file RVec.hxx.

◆ reserve()

template<typename T>
void ROOT::VecOps::RVec< T >::reserve ( size_type  new_cap)
inline

Definition at line 258 of file RVec.hxx.

◆ resize() [1/2]

template<typename T>
void ROOT::VecOps::RVec< T >::resize ( size_type  count)
inline

Definition at line 280 of file RVec.hxx.

◆ resize() [2/2]

template<typename T>
void ROOT::VecOps::RVec< T >::resize ( size_type  count,
const value_type value 
)
inline

Definition at line 281 of file RVec.hxx.

◆ shrink_to_fit()

template<typename T>
void ROOT::VecOps::RVec< T >::shrink_to_fit ( )
inline

Definition at line 260 of file RVec.hxx.

◆ size()

template<typename T>
size_type ROOT::VecOps::RVec< T >::size ( ) const
inlinenoexcept

Definition at line 256 of file RVec.hxx.

◆ swap()

template<typename T>
void ROOT::VecOps::RVec< T >::swap ( RVec< T > &  other)
inline

Definition at line 282 of file RVec.hxx.

Member Data Documentation

◆ fData

template<typename T>
Impl_t ROOT::VecOps::RVec< T >::fData
private

Definition at line 162 of file RVec.hxx.

Libraries for ROOT::VecOps::RVec< T >:
[legend]

The documentation for this class was generated from the following file: