ブランチを作成したい(TTree::Branch

 1#include <TTree.h>
 2
 3TTree *tree = new TTree("tree", "Event data");
 4Int_t run = 0;
 5tree->Branch(
 6    "run",    // name
 7    &run,     // address
 8    "run/I"   // leaflist
 9);
10
11run = 2025;
12tree->Fill();

TTree::BranchメソッドでTTreeにブランチを作成できます。 ブランチは変数を格納するための構造で、イベントごとに異なる値を保存できます。

nameはブランチの名前を指定します。 addressは変数のアドレスを指定します。 配列の場合は先頭アドレスでOKです。

ヒント

変数が実体の場合は&が必要です。 配列の場合は、変数が先頭アドレスを指すため&は不要です。

leaflistは変数の型を指定する文字列で、変数/型の形式で記述します。 たとえば、int型の変数を保存する場合はIfloat型の場合はFdouble型の場合はDを使用します。 ブランチを作成した後、変数に値を設定してFillメソッドを呼び出すことで、イベントデータを保存できます。

1import ROOT
2
3tree = ROOT.TTree("tree", "Event data")
4run = ROOT.ctypes.c_int()
5tree.Branch("run", run, "run/I")
6
7run.value = 2025
8tree.Fill()

複数ブランチしたい(TTree::Branch

 1#include <TTree.h>
 2
 3TTree *tree = new TTree("tree", "Event data");
 4
 5Int_t run = 0;
 6Float_t energy = 0.0;
 7Int_t fadc[100];
 8
 9tree->Branch("run", &run, "run/I");
10tree->Branch("energy", &energy, "energy/F");
11tree->Branch("fadc", fadc, "fadc[100]/I");

TTree::Branchを複数回呼び出すことで、複数のブランチを作成できます。 イベントごとに異なる値を保存するため、各ブランチに対応する変数が必要です。

固定長配列をブランチに追加する場合、leaflistに配列の長さを明示的に指定します。 第2引数は配列のアドレスのため、配列名をそのまま指定できます。

可変長配列したい(TTree::Branch

 1#include <TTree.h>
 2#include <vector>
 3
 4// 可変長配列を保存するためのブランチ
 5std::vector<Double_t> vec;
 6TTree *tree = new TTree("tree", "vector branch");
 7tree->Branch("vec", &vec);
 8
 9for (int evt = 0; evt < 100; evt++) {
10    vec.clear();
11    for (int i = 0; i < 10; i++) {
12        vec.push_back(i * 0.1);
13    }
14    tree->Fill();
15}

イベントごとに異なるサイズの配列を保存したい場合、可変長配列を使用します。 TTree::Branchの使い方は固定長配列と同様です。 C++標準のstd::vectorを使用すると、 ROOTが自動的にサイズと型を判定してくれるためleaflistは不要です。

参考リンク