43constexpr char const *kNTupleFileName =
"ntpl007_mtFill.root";
46constexpr int kNWriterThreads = 4;
49constexpr int kNEventsPerThread = 25000;
52void FillData(std::unique_ptr<REntry> entry, RNTupleWriter *
writer) {
54 static std::mutex gLock;
56 static std::atomic<std::uint32_t> gThreadId;
57 const auto threadId = ++gThreadId;
59 auto prng = std::make_unique<TRandom3>();
62 auto id = entry->GetPtr<std::uint32_t>(
"id");
64 auto vpx = entry->GetPtr<std::vector<float>>(
"vpx");
65 auto vpy = entry->GetPtr<std::vector<float>>(
"vpy");
66 auto vpz = entry->GetPtr<std::vector<float>>(
"vpz");
68 for (
int i = 0; i < kNEventsPerThread; i++) {
73 int npx =
static_cast<int>(prng->Rndm(1) * 15);
75 for (
int j = 0; j < npx; ++j) {
80 vpx->emplace_back(px);
81 vpy->emplace_back(py);
82 vpz->emplace_back(pz);
85 std::lock_guard<std::mutex> guard(gLock);
94 auto model = RNTupleModel::Create();
95 model->MakeField<std::uint32_t>(
"id");
96 model->MakeField<std::vector<float>>(
"vpx");
97 model->MakeField<std::vector<float>>(
"vpy");
98 model->MakeField<std::vector<float>>(
"vpz");
101 auto writer = RNTupleWriter::Recreate(std::move(model),
"NTuple", kNTupleFileName);
103 std::vector<std::unique_ptr<REntry>> entries;
104 std::vector<std::thread> threads;
105 for (
int i = 0; i < kNWriterThreads; ++i)
106 entries.emplace_back(
writer->CreateEntry());
107 for (
int i = 0; i < kNWriterThreads; ++i)
108 threads.emplace_back(FillData, std::move(entries[i]),
writer.get());
109 for (
int i = 0; i < kNWriterThreads; ++i)
120 auto reader = RNTupleReader::Open(
"NTuple", kNTupleFileName);
121 auto viewVpx = reader->GetView<
float>(
"vpx._0");
125 TCanvas *
c1 =
new TCanvas(
"c2",
"Multi-Threaded Filling Example", 200, 10, 1500, 500);
129 TH1F h(
"h",
"This is the px distribution", 100, -4, 4);
132 for (
auto i : viewVpx.GetFieldRange())
138 auto nEvents = reader->GetNEntries();
139 auto viewId = reader->GetView<std::uint32_t>(
"id");
140 TH2F hFillSequence(
"",
"Entry Id vs Thread Id;Entry Sequence Number;Filling Thread", 100, 0, nEvents, 100, 0,
141 kNWriterThreads + 1);
142 for (
auto i : reader->GetEntryRange())
143 hFillSequence.Fill(i, viewId(i));
144 hFillSequence.DrawCopy();
R__EXTERN TStyle * gStyle
The REntry is a collection of values in an ntuple corresponding to a complete row in the data set.
The RNTupleModel encapulates the schema of an ntuple.
An RNTuple that is used to read data from storage.
An RNTuple that gets filled with entries (data) and writes them to storage.
1-D histogram with a float per channel (see TH1 documentation)
2-D histogram with a float per channel (see TH1 documentation)
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
void FillData(BinData &dv, const TH1 *hist, TF1 *func=nullptr)
fill the data vector from a TH1.