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

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

 以下で紹介する方法は、TTreeの変数の数が多かったり、同じTTreeを含む複数のROOTファイルを処理したりと、 データ解析の規模が中程度以上の解析において大変有用です。 また規模が大きな実験では、いわゆる「標準」的な解析ツールがあるとは思いますが、 小さなデータサンプルを用いた、結果に至るまでのメインの『解析』や、 標準の解析ツールの出力から結果を得るまでなど、使える場面は少なくないと思われます。

 まずはじめに、同じ構成のTTreeを含む複数のROOTファイルをまとめて処理する方法を紹介します。 複数のTTreeをまとめて扱うには以下のようにしてTChainを用います。

#include <stdio.h>
#include <TChain.h>

TChain ch("treeName"); // treeNameという名のTTreeのchain
ch.Add("data/eventdata_0.root"); // treeNameなTTreeを含むROOTファイル

for ( int i=1;i<10;i++ ){ // 連番ファイルの連結の例
    ch.Add(Form("data/eventdata_%d.root",i));
}
ch.Draw("varexp");

TChainはコンストラクタで連結したいTTreeの名前を引数で渡します。 Addメソッドで先ほど指定した名前のTTreeを含むROOTファイルを追加します。 連番のROOTファイルを指定する時は例えば上記のようにすればよいでしょう。 TChainはTTreeを継承しているので、ch.Draw("varexp")などTTreeと同様に扱う事ができます。

 TTree::Draw("varexp","selection")のような形式での解析は、 TTreeの変数が配列やクラスである場合や、細かなカットを掛けたいとき等には不向きです。 TTree::SetBranchAddress(...)やTTree::GetEntry(eventID)などを用いてもう少し賢く処理する事も可能ですが、 TTreeの変数名が多い時は相当に煩雑で面倒です。 そこでTTreeの変数名をプログラム上で通常の変数であるように扱える解析コードの雛形を生成する方法を2通り紹介します。


 TTree::MakeSelector("className")を用いる方法
TTree::MakeSelector(...)を用いた解析コードのスケルトンの生成と実行の仕方の例は以下の通りです。

// 解析コードのスケルトン生成
TFile f("data/eventdata_0.root"); // treeNameなTTreeを含むROOTファイル
treeName->MakeSelector("skeleton"); // skeleton.C と skeleton.h の生成

// 解析コードの実行
TChain ch("treeName");
ch.Add("data/eventdata_0.root");
...
ch.Process("skeleton.C+O","option"); // treeName->Process(...)も可能

skeleton.h内でTTreeの各変数名が同名の変数にSetBranchAddress(...)で関連づけられているため、 skeleton.Cの中ではTTreeの変数名を通常の変数として扱う事が出来ます。 skeleton.C内のBool_t skeleton::Process(...)がメインの処理を行う場所になります。 カット条件を満たさないイベントでは "return kFALSE;" とすればイベントをスキップします。 上記最終行のch.Processでskeleton.C+Oとする事で、コンパイルしてからの実行して処理を高速化しています。 コンパイルによる処理の高速化は『ROOTの小技#マクロをROOTでコンパイルして実行する』を参照してください。


 TTree::MakeClass("className")を用いる方法
TTree::MakeClass(...)を用いた解析コードのスケルトンの生成と実行の仕方の例は以下の通りです。

// 解析コードのスケルトン生成
TFile f("data/eventdata_0.root"); // treeNameなTTreeを含むROOTファイル
treeName->MakeClass("skeleton"); // skeleton.C と skeleton.h の生成

// 解析コードの実行
TChain ch("treeName");
ch.Add("data/eventdata_0.root");
...
.L skeleton.C+O; // マクロ内ならgROOT->ProcessLine(".L skeleton.C+O");
skeleton ana(&ch); // skeleton ana(treeName)も可能
ana.Loop();

先ほどと同様、skeleton.h内の定義によってskeleton.Cの中ではTTreeの変数名を通常の変数として扱う事が出来ます。 MakeClass(...)を用いた場合、デフォルトの仕様ではskeleton.h内のInt_t skeleton::Cut()がメイン処理になります。 まぁskeleton::Loop()内で直接処理しても良いでしょうけど。 今回は解析コードをロードする際にファイル名に"+O"を付ける事でコンパイルして実行する事ができます。
2005-2017 HEPtech All rights reserved. Link/Unlink free.
inserted by FC2 system