ブランチを作成したい(TTree::Branch)
1#include <TTree.h>
2
3TTree *tree = new TTree("tree", "Event data");
4Int_t run = 0;
5tree->Branch("run", &run, "run/I");
6
7run = 2025;
8tree->Fill();
TTree::Branchメソッドでツリーにブランチを作成し、変数をツリーに関連付けることで、複雑なデータ構造を設定できます。
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()
メソッドのシグネチャ
1TBranch* Branch(const char* name,
2 Long_t address,
3 const char* leaflist,
4 Int_t bufsize = 32000)
引数と戻り値
引数:
name - ブランチ名を指定します。変数名とのひも付けは
addressで行いますaddress - 変数のアドレスを指定します。変数が実体の場合は
&が先頭に必要です。配列の場合はそのまま指定しますleaflist - 変数の型を指定します。
変数/型形式で記述(intはI、floatはF、doubleはDなど)bufsize - バッファサイズ(デフォルト値は32000)
戻り値:
作成されたTBranchオブジェクトへのポインター
単一の値をブランチに追加したい(Branch)
1#include <TTree.h>
2
3TTree *tree = new TTree("tree", "Event data");
4Int_t run = 0;
5Float_t energy = 0.0;
6tree->Branch("run", &run, "run/I");
7tree->Branch("energy", &energy, "energy/F");
8
9for (int evt = 0; evt < 100; evt++) {
10 run = 2025;
11 energy = 100.5 + evt * 0.1;
12 tree->Fill();
13}
単一の変数をブランチとして追加する場合、変数の型を指定してBranch()を呼び出します。
複数のブランチを定義する場合、各変数ごとにBranch()を呼び出します。
配列をブランチに追加したい(Branch)
1#include <TTree.h>
2
3Int_t val[100];
4TTree *tree = new TTree("tree", "array branch");
5tree->Branch("val", val, "val[100]/I");
6
7for (int i = 0; i < 100; i++) {
8 val[i] = i;
9 tree->Fill();
10}
固定長配列をブランチに追加する場合、leaflistに配列の長さを明示的に指定します。
第2引数は配列のアドレスのため、配列名をそのまま指定できます。
可変長配列をブランチに追加したい(Branch)
1#include <TTree.h>
2
3Int_t fN = 0;
4Int_t val[100];
5TTree *tree = new TTree("tree", "variable-length array");
6tree->Branch("nch", &fN, "nch/I");
7tree->Branch("val", val, "val[nch]/I");
8
9for (int evt = 0; evt < 100; evt++) {
10 fN = 10 + evt % 20;
11 for (int i = 0; i < fN; i++) {
12 val[i] = i;
13 }
14 tree->Fill();
15}
可変長配列を使う場合、配列のサイズを保存するブランチと配列データ用ブランチの両方が必要です。
重要なのは、leaflistに配列名ではなく、サイズを格納するブランチ名(ここではnch)を指定することです。
可変長文字列をブランチに追加したい(Branch)
1#include <TTree.h>
2#include <cstring>
3
4const Int_t NMAX_MOJI = 100;
5char moji[NMAX_MOJI];
6Int_t nmoji = 0;
7TTree *tree = new TTree("tree", "variable-length string");
8tree->Branch("nmoji", &nmoji, "nmoji/I");
9tree->Branch("moji", moji, "moji[nmoji]/C");
10
11strcpy(moji, "Hello ROOT");
12nmoji = strlen(moji);
13tree->Fill();
文字列をブランチに追加する場合、文字数を管理するブランチと、文字配列用ブランチの両方が必要です。
leaflistの型指定にCを使用します。
std::vectorをブランチに追加したい(Branch)
1#include <TTree.h>
2#include <vector>
3
4std::vector<Double_t> vec;
5TTree *tree = new TTree("tree", "vector branch");
6tree->Branch("vec", &vec);
7
8for (int evt = 0; evt < 100; evt++) {
9 vec.clear();
10 for (int i = 0; i < 10; i++) {
11 vec.push_back(i * 0.1);
12 }
13 tree->Fill();
14}
std::vectorをブランチに追加する場合、第2引数にベクトルのアドレスを指定し、第3引数は省略します。
ROOTが自動的にベクトルのサイズと型を判定します。ベクトルは通常、ブランチの最後に配置することが推奨されます。