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. |