HEPtech     - TTreeを用いた基本的な解析方法 その1 -
トップページ | Tips | Topics
<TTreeを用いた基本的な解析方法 その1>

 ここでは高エネルギーでのデータ解析の基礎とも言える、TTreeを用いた基本的な解析手法 その1を紹介します。

 高エネルギーの研究においては、しばしば1イベントのさまざまな情報をTTreeの変数に、 TTreeの1つのエントリーに1イベントの情報を格納して処理を行います。 つまりTTreeを用いた解析は高エネルギーの研究の基本とも言えます。 以下ではTTreeの(参照する)変数が少ない場合について説明します。 特にTTreeの変数の数が多かったり、同じTTreeを含む複数のROOTファイルを処理したりという場合には、 次のTTreeを用いた基本的な解析方法 その2を参照してください。

 まずはデータのTTreeへの詰め方です。

#include "TFile.h"
#include "TTree.h"

TFile* f=new TFile("tree.root","RECREATE");
TTree* tr=new TTree("tree","");
int x;
float y[20];
tr->Branch("x",&x,"x/I");
tr->Branch("y",y,"y[20]/F");
...
for ( long l=0;l<nEvent;l++ ){
    ...
    x=...;
    y[]=...;
    tr->Fill();
}
f->Write();

TTree::Branch()でTTreeに詰める変数を指定します。 基本的には1つ目の引数が名前、2つ目にアドレス、3つ目に型(leaflist)を渡し、Iはinteger, Fはfloatなどのように指定します。 yについての2つ目の引数に&が付いていないのは、付け忘れなどのミスではなく、yが配列だからで、 配列そのものは先頭のアドレスを指しているから&は要らないのです。 これを聞いてピンと来ない人は少しC/C++を復習してください。 TTreeに詰める変数を指定したら、あとは各変数に適当な値を入れTTree::Fill()で詰めます。 あとはTFile::Write()とすることで、ROOTファイルに生成したTTreeが出力されます。

 次にTTreeからデータを読む方法について説明します。

#include <iostream>
#include "TFile.h"
#include "TTree.h"

TFile* f=new TFile("tree.root");
TTree* tr=(TTree*)f->Get("tree");

int x;
float y[20];
tr->SetBranchAddress("x",&x);
tr->SetBranchAddress("y",y);

long nEvent=tr->GetEntries();
for ( long l=0;l<nEvent;l++ ){
    tr->GetEntry(l);
    std::cout << x << ", " << y[0] << std::endl;
}

TTreeを含むROOTファイルを開き、TFile::Get()でROOTファイル内のTTreeを取得、 SetBranchAddressでTTreeの変数を、プログラム上の変数に割り当てます。 2つ目の引数が&x, yとなっているのは、先と同様です。 TTree::GetEntries()でTTreeに詰められているエントリー数を取得します。 このエントリー数でforループを回し、TTree::GetEntry(n)でn番目のエントリーを呼ぶと、 先ほどSetBranchAddressで指定したアドレスに、TTreeの各辺数値が代入されます。 こうすることでTTreeに詰めた変数値に自由にアクセスできるようになります。

2005-2017 HEPtech All rights reserved. Link/Unlink free.
inserted by FC2 system