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の実装です。

リファレンス