ブランチを作成したい(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型の変数を保存する場合はI、float型の場合はF、double型の場合は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は不要です。