[return]

Cern ROOT quick reference for paw users

paw使いでC++をかじった人のためのROOT覚え書き(つまり自分専用)。

コマンドパーサ (.で始まる人達 --- .の前に暗黙の親クラスがあると思えばよい)

.h --- ヘルプ
.q --- rootの終了
.L hoge.C
ファイル"hoge.C"をロードする
.x hoge.C
マクロファイル"hoge.C"を実行する
.! <command> --- シェルで<command>を実行

逆引きROOT関数

一般的な操作
リセット
gROOT->Reset();
 
file open
h/file
TFile *f1 = new TFile("foobar.root");
 
ntuples
nt/cre
TNtuple(char* [name], char* [title], char* [varlist]);
nt/pl
[*TNtuple]->Draw("変数名");
[*TNtuple]->Draw("変数名:変数名"); →2次元 scatter plot
nt/pl idh=...
[*TNtuple]->Draw("変数名>>[*TH1D]");
nt/pl [条件]
TCut cutname = "条件式"
[*TNtuple]->Draw("変数名", cutname);
nt/pri
[*TTree]->Print();
nt/uwfunc
[*TNtuple]->MakeClass();
 
histograms
h/cre/1dh
TH1D(char* [name], char* [title], int [Nbin], double [lower], double [upper]);
h/cre/2dh
TH2D(char* [name], char* [title], ...);
h/del
[* TH1D]->Delete();
h/fit
[* TH1D]->Fit("関数名")
defaultで用意される関数 : gaus, landau, expo, pol1, pol2, ...
任意の関数でフィットする場合 : TF1クラスオブジェクトの名前
(fitした結果のパラメータを取得)
TF1 * f1 = new TF1();
f1 = h1->GetFunction("関数名");
f1->GetParameter(int);
または f1->GetParameters(配列);
h/lis
gDirectory->ls();
h/pl
[* TH1D]->Draw();
[* TH1D]->Draw("same");で上書き (pawでいう chopt=s)
[* TH2D]->Draw()のオプション
"box", "colz", "lego", "surf1", "text", etc.
(範囲指定)
[* TH1D]->GetXaxis()->SetRange(int [下限のbin],int [上限のbin])
例) : ヒストグラムのx軸250から350まで
h1->GetXaxis()->SetRange( h1->GetXaxis()->FindBin(250), h1->GetXaxis()->FindBin(350) );
[* TH1D]->SetMinimum(double min); : 縦軸の範囲指定(下限)
[* TH1D]->SetMaximum(double max); : 縦軸の範囲指定(上限)
$HINFOなど (histogramの情報を得る)
[* TH1D]->GetEntries(); : entry数
[* TH1D]->GetMean(); : mean value
[* TH1D]->GetRMS(); : RMS
[* TH1D]->GetBinContent(int [bin番号]); : [bin番号]のbinに入っている値
(bin番号←→x軸の値)
(bin番号→x軸)
[* TH1D]->GetXaxis()->GetBinCenter(Int_t [bin番号])
(x軸→bin番号)
[* TH1D]->GetXaxis()->FindBin(Double_t [x軸の値])
 
vector?
vec/pl
TGraph* gr = new TGraph*(int [nevent], int* x, int* y)
TGraphErros* gr = new TGraphErrors*(int [nevent], int* x, int* y, int* x_er, int* y_err)
gr->Draw("APL")
set & opt etc.
opt fit / opt nfit
gStyle->SetOptFit(mode)
mode : 4bitの2進数, {dis45 p22}参照。defaultは0111
opt logy / opt liny
[* TCanvas / * TPad]->SetLogy(1) : opt logy
[* TCanvas / * TPad]->SetLogy(0) : opt liny
pic/pri
[* TCanvas]->Print("foobar.gif");
(拡張子で自動判別)
複数ページのpsファイルは
[* TCanvas]->Print("foobar.ps("); // psファイルのオープン
[* TCanvas]->Print("foobar.ps"); // psファイルに追加
[* TCanvas]->Print("foobar.ps)"); // psファイルに追加してクローズ
title, atitle
[色々]->SetTitle("タイトル");
[色々]->GetXaxis()->SetTitle("x軸");
shell
gSystem->Exec("シェルコマンド");
wait
char s[1]; gets(s); (でいいのだろうか? C言語でよく使った手だが。)

ファイル入出力

データファイルの読み込み
データファイルの書き出し
ヒストグラムの保存

Misc & Tips

General
実体とポインタの区別は?
対話モードでは(どうやら)区別無し
マクロ内では区別される (間違うとエラーになる)
# 仕様としては論外だと思う。(当然区別すべき)
Int_t, Double_t?
機種依存を無くすための整数(倍精度浮動小数)型。
マクロ内でROOTのコマンド
gROOT->ProcessLine("command");
時刻 (TTime型)
gSystem->Now();
知らない(けどありそうな)関数を探す
(例えばヒストグラムなら) TH1D hoge; 等で仮のオブジェクトを作成
hoge.までタイプして[TAB]で補完を試みると関数のリストが出る
クラスオブジェクトの情報を得たい時はたいていhoge.Get[なんとか]
クラスオブジェクトの属性を指定したい時はたいていhoge.Set[なんとか]

Tree
TTreeの変数の中身を取得する
(TTree* tr;とする)
tr->GetEntry(i); // i番目のeventをロードする
Int_t i = tr->GetLeaf("変数名")->GetValue(); // "変数名"の値をiへ代入
Int_t i = tr->GetLeaf("変数名")->GetValue(3); // "変数名"が配列の場合 : 3番目の要素の値を入手
Histogram
ヒストグラムの装飾
[* TH1D]->SetLineColor([色番号])
[* TH1D]->SetLineStyle([線種番号])
[* TH1D]->SetFillColor([色番号])
[* TH1D]->SetFillStyle([パターン番号])
・LineStyleの詳細は TAttLine(cern.ch) を参照
・FillStyleの詳細は TAttFill(cern.ch) を参照
ヒストグラムのコピー
TH1D* h2 = (TH1D*)h1->Clone("h2"); (ヒストグラムh1をh2にコピー)
histogramのピーク(複数可)を探す
TSpectrumクラスを利用
2D histogram (TH2D, etc.)の修飾
h2->Draw("colz, list");など
http://root.cern.ch/root/html/tutorials/hist/index.htmlなど参照
Macro
マクロに引数を渡す (コマンドラインから)
マクロの例
    void foobar(int i, string str){
        std::cout << "number : " << i << " / string : "<< str  << std::endl;
    }
    
実行例
$ root 'foobar.C(3, "abc")'
シェルスクリプトの例 (シェル変数を渡す場合)
$ root -b 'foobar.C(3, "'$arg1'")'

Misc
乱数生成
(例 : -1.0から1.0までの一様乱数の生成)
TF1* f1 = new TF1("f1","1.0",-1.0, 1.0); (y=1.0で-1.0から1.0までの関数)
double r = f1->GetRandom(); (f1の関数の分布に従って乱数生成)
横軸を数字ではなく文字にする
TH1D* h->GetXaxis()->SetBinLabel([binID], [記述]);

Error/Warning Messages

Warning in <TH1::Build>: Replacing exsiting histogram
(例)
      TH1D* h_adc[10];
      for (Int_t i=0; i<10; i++){
        h_adc[i] = new TH1D("h_adc","h_adc", 100, 0.0, 100.0);
      }
    
(解決法)
各histogramに違う名前を付ける
      TH1D* h_adc[10];
      Char_t hname[100];
      for (Int_t i=0; i<10; i++){
        sprintf(hname,"h_adc_%d", i);
        h_adc[i] = new TH1D(hname, hname,  100, 0.0, 100.0);
      }
    

分からない事

TCanvasが複数ある時に、描画するcanvasを選択する方法
Canvasの中に小さな図を張り付けられるか?

Link

Official Site
ROOT
http://root.cern.ch/
クラス一覧
http://root.cern.ch/root/Categories.html
Useful Sites
猿ROOT (originalの場所が分からないので長谷川さんのページで)
http://www-he.scphys.kyoto-u.ac.jp/member/masaya/saru.html
Dis45ユーザーのためのROOT入門
http://www-jlc.kek.jp/subg/offl/lib/docs/rootstarter/main.html


[return]


Valid HTML 4.01! MORII Hideki
mail : moriih@scphys.kyoto-u.ac.jp