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


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();

でコードが走る。

これらの tuple をまとめるためには

ch.Merge("filename.root")

とするとまとまったtuple ができる

総エントリー数の表示

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 にアクセスすることができる。 あとは普段と同じようにして描画する。

実は上の TChain で異なる名前を指定すると簡単にできる

レジェンドのつけ方

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

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

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

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

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

l->Draw();

この際に "same" オプションは必要ない。 背景は灰色になってしまうので、

l->SetFillColor(0);

で白にするとすっきりする。 枠線が必要なければ

l->SetBorderSize(0);

で枠線を設定できる。

TH2Fのカラースケールを変更する

デフォルトではカラースケールは 20 になっている。 例えば 30 に変更するためには

 gStyle->SetNumberContours(30);

とする。 また、以下のを使用すると濃い青->濃い赤のグラデーションになる

void
set_plot_style()
{
    const Int_t NRGBs = 5;
    const Int_t NCont = 255;

    Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
    Double_t red[NRGBs]   = { 0.00, 0.00, 0.87, 1.00, 0.51 };
    Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
    Double_t blue[NRGBs]  = { 0.51, 1.00, 0.12, 0.00, 0.00 };
    TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
    gStyle->SetNumberContours(NCont);
}

簡単な解説

const Int_t NRGBs = 5;
const Int_t NCont = 255;

色の区切りとグラデーションの数を指定する。

Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
Double_t red[NRGBs]   = { 0.00, 0.00, 0.87, 1.00, 0.51 };
Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
Double_t blue[NRGBs]  = { 0.51, 1.00, 0.12, 0.00, 0.00 };

グラデーションの色を配列で指定する。 一行目はかカラーバーの位置を比率で表したもの。 2-4行目はそれぞれの彩度 R=1, G=1, B=1 で白になる。

TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);

上で作った色を指定して色を作る。

TProfile で付けるエラーバーかえる

エラーバーは mean の Error、RMS、Statistics Error の3つが指定できる。 それぞれの詳細は以下

    ' '  (Default) Errors are Spread/SQRT(N) for Spread.ne.0. ,
                     "     "  SQRT(Y)/SQRT(N) for Spread.eq.0,N.gt.0 ,
                     "     "  0.  for N.eq.0
    's'            Errors are Spread  for Spread.ne.0. ,
                     "     "  SQRT(Y)  for Spread.eq.0,N.gt.0 ,
                     "     "  0.  for N.eq.0
    'i'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
                     "     "  1./SQRT(12.*N) for Spread.eq.0,N.gt.0 ,
                     "     "  0.  for N.eq.0

書式は以下のようにする。

TProfile* h_pfx = h->ProfileX("name",firstbin,lastbin,"option");

この時に firstbin=1 lastbin=-1 を指定するとすべtの bin を指定できる。

ソフトウェア関係