ブランチを作成したい(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 - 変数の型を指定します。変数/型形式で記述(intIfloatFdoubleDなど)

  • 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が自動的にベクトルのサイズと型を判定します。ベクトルは通常、ブランチの最後に配置することが推奨されます。

関連メソッド

  • Fill - イベントを追加

  • Write - ツリーをファイルに保存

  • GetBranch - ブランチを取得

参考リンク