12#ifndef o2_framework_RootTableBuilderHelpers_H_INCLUDED
13#define o2_framework_RootTableBuilderHelpers_H_INCLUDED
20#include <arrow/type_traits.h>
21#include <arrow/table.h>
22#include <arrow/builder.h>
24#include <TTreeReader.h>
25#include <TTreeReaderValue.h>
26#include <TTreeReaderArray.h>
28#include <TBufferFile.h>
46 using Type =
typename TTreeReaderValue<T>::NonConstT_t;
48 using BuilderType =
typename arrow::TypeTraits<ArrowType>::BuilderType;
51template <
typename VALUE>
53 using Iterator =
typename TTreeReaderArray<VALUE>::iterator;
54 using Type = std::pair<Iterator, Iterator>;
58static constexpr int PREBUFFER_SIZE = 32 * 1024;
117template <
typename T,
int N>
142 template <
typename T>
147 if (holder.
pos == maxSize) {
151 if ((holder.
pos % PREBUFFER_SIZE) != 0) {
157 template <
typename T,
int N>
160 memcpy(&holder.buffer[(holder.pos % PREBUFFER_SIZE) * N], &((*holder.reader)[0]), N *
sizeof(T));
162 if (holder.pos == maxSize) {
166 if ((holder.pos % PREBUFFER_SIZE) != 0) {
175 static auto make(TTreeReader& reader,
char const* branchName)
177 using Reader = TTreeReaderValue<T>;
178 return ReaderHolder<T>{reader.GetTree()->GetBranch(branchName), std::move(std::make_unique<Reader>(reader, branchName))};
182template <
typename T,
int N>
184 static auto make(TTreeReader& reader,
char const* branchName)
186 using Reader = TTreeReaderArray<T>;
187 return ReaderHolder<T[N]>{reader.GetTree()->GetBranch(branchName), std::move(std::make_unique<Reader>(reader, branchName))};
201 template <
typename... T>
206 std::array<
char const*,
sizeof...(T)> branchNames = {holders.
reader->GetBranchName()...};
207 TTree*
tree = reader.GetTree();
208 size_t maxExtries = reader.GetEntries(
true);
209 tree->SetCacheSize(maxExtries * (holders.
itemSize + ...));
210 (
tree->AddBranchToCache(
tree->GetBranch(holders.
reader->GetBranchName()),
true), ...);
211 tree->StopCacheLearningPhase();
214 while (reader.Next()) {
219 template <
typename... C>
225 template <
typename T>
auto bulkPersistChunked(std::array< char const *, NCOLUMNS > const &columnNames, size_t nRows)
Defining PrimaryVertex explicitly as messageable.
typename Remap64Bit< T >::type Remap64Bit_t
Defining DataPointCompositeObject explicitly as copiable.
static auto createReader(TTreeReader &reader)
static auto make(TTreeReader &reader, char const *branchName)
static auto make(TTreeReader &reader, char const *branchName)
std::unique_ptr< Reader > reader
ReaderHolder(TBranch *branch, std::unique_ptr< Reader > reader_)
TTreeReaderArray< T > Reader
ReaderHolder(ReaderHolder &&other)
ReaderHolder & operator=(ReaderHolder &&other)=delete
TTreeReaderValue< T > Reader
ReaderHolder(ReaderHolder &&other)
Remap64Bit_t< T > buffer[PREBUFFER_SIZE]
ReaderHolder(TBranch *branch, std::unique_ptr< Reader > reader_)
ReaderHolder & operator=(ReaderHolder &&other)=delete
std::unique_ptr< Reader > reader
static void convertASoAColumns(TableBuilder &builder, TTreeReader &reader, pack< C... >)
static void convertTTree(TableBuilder &builder, TTreeReader &reader, ReaderHolder< T >... holders)
Use bulk insertion when TTreeReaderValue everywhere.
static void convertASoA(TableBuilder &builder, TTreeReader &reader)
arrow::ListType ArrowType
typename TTreeReaderArray< VALUE >::iterator Iterator
std::pair< Iterator, Iterator > Type
typename arrow::TypeTraits< ArrowType >::BuilderType BuilderType
typename o2::framework::detail::ConversionTraits< Type >::ArrowType ArrowType
typename TTreeReaderValue< T >::NonConstT_t Type
FIXME: adapt type conversion to new arrow.
VectorOfTObjectPtrs other
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))