RNTupleしたい
1void macro() {
2 // Define schema
3 auto model = ROOT::RNTupleModel::Create();
4 // Define fields (= alternatives for TBranch)
5 auto event_id = model->MakeField<int>("event_id");
6 auto energy = model->MakeField<float>("energy");
7
8 // Create RNTupleWriter
9 auto writer = ROOT::RNTupleWriter::Recreate(
10 std::move(model),
11 "events",
12 "output.root"
13 );
14
15 // Fill data
16 for (int i = 0; i < 100; i++) {
17 *event_id = i;
18 *energy = 100.0f + i;
19 writer->Fill();
20 }
21
22 // Commit and Close will be called automatically when writer goes out of scope
23}
RNTupleは、ROOTのイベントデータI/Oシステムです。
25年以上の運用経験があるTTreeの後継となるクラスです。
2018年ころから実験的な機能(ROOT::Experimental)として開発がはじまり、
ROOT 6.36で安定版としてリリースされました。
TTreeが読み書き兼用の単一クラスであるのに対し、
RNTupleでは、書き込み専用のRNTupleWriterと読み込み専用のRNTupleReaderに分かれています。
これにより責務が明確となり、現代のストレージ技術に最適化できるようになっています。
注釈
C++のstd::tupleやPythonのtuple(タプル)のように、tupleは「1組のデータ」を表す概念です。
そして、Ntupleは任意のtupleを格納できるデータ構造です。
素粒子実験の場合、
tupleは「1イベントのデータ」、
Ntupleは「ランの中のすべてのイベントのデータ」を
イメージするとわかりやすいと思います。
実は、このデータ構造の概念、PAWの時代から変わっていません。
PAWのHBOOK NTuple、ROOTのTTreeと新しいRNTupleのどれも、
それぞれの世代の計算機環境に合わせて最適化されたNtupleの実装です。