ROOT のバックアップ(No.6)


MakeClass

解析をするときにはMakeClassをする。 Ntupleに詰められている変数などを自動的に読んでくれてヘッダファイルを作成してくれる。

tree->MakeClass("name");

でname.C name.h ができる。 ヘッダファイルの行列要素は読み込んだNtupleによるので適に変更する。 segmentation violation の場合はここが問題のことが多い。

TChain

Ntupleをいくつもまとめて解析したいときに使う。

TChain ch("tree");
ch.Add("filename");

でつなげられる。 MakeClassで作ったコードを使うときには

.L name.C+g;
name a(&ch);
a.Loop();

でコードが走る。

総エントリー数の表示

Long64_t nentries = fChain->GetEntries();

の様に Fast を抜く

プログレスバーの表示

杉本さんに教えていただいた。

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void MyRootAna::progress(Long64_t num){

 num++;
 if(num % 100000 == 0){
   std::cerr << " --> " << num << " events analized (" << now() << ")." << std::endl;
   INFO("  run:" << m_run << " event:" << m_event << " lumi:" << m_lumiblock << " globalBC:" << m_globalBcid);
 }else if(num % 10000 == 0){
   std::cerr << "*";
 }
}

ミソは cout ではなく cerr を使うこと。 これによってスムースに表示される

統計情報を重ねる

ヒストグラムの統計情報を重ねて表示するには

h1->Draw("sames");

と s を付ける。 統計情報 BOX の調整は

gPad->SetStatX();
gPad->SetStatY();

などを利用してずらす。

Ntupleに詰める

自分の好きなようにカットをしたあとにNtupleに詰めると解析がはかどる。

TTree *tree = new TTree("tree","tree");
int integer = 0;
float float = 0.;
vector<int>vector; 

tree->Branch("Integer",&integer,"Integer/I");
tree->Branch("Float",&float,"Float/F");
tree->Branch("vector",&vector);

と定義する。 ベクターはクリアしなければならないので、

vector.clear();

とする。 int float はいつも通りで良いが、ベクターは

vector.push_back(argment);

のようにして詰める。 最後に

tree->Fill();

で詰め終わり。

複数のNtupleを読み込み描画

まず、ファイルを読み込む。

TFile f("filename.root");

名前を変えてそれぞれ読み込む。 次にそれぞれの Tree に名前をつける。

TTree *tr = f->Get("tree");

これで tr で tree にアクセスすることができる。 あとは普段と同じようにして描画する。

レジェンドのつけ方

複数のデータを重ねるときにあると便利な方法。 まず、レジェンドのポインタを作る

TLegend *l = new TLegend(x,y,X',Y');

位置は右上と左下の点を指定する。 次に表に内容の設定をする。

l->AddEntry(histo,"display name","lp");

3つ目の表示オプションは TGraph と同じようになる。 最後にこれを表示させる。

l->Draw();

この際に "same" オプションは必要ない。

ソフトウェア関係