ROOTの使い方メモ
◼︎ヒストグラム
ROOTのヒストグラム用のクラスは、すべてTH1というクラスを継承している。
基本の使い方:
TH1F* hist = new TH1F("obj_name", "title", binの数, 下限, 上限); // オブジェクト生成
hist->Fill(n); // ヒストグラムに詰めていく
hist->Draw(); // キャンバスに描く
クラスはTH1Fの他、TH1I, TH1D, TH2F, TH2D 等がある。
この 1, 2 というのは次元のことで、それぞれ 1次元, 2次元のヒストグラムであることを示す。
また、I, F, Dというのは各binの持っている値の型を示していて、それぞれ Int_t, Float_t, Double_t に対応する。
Drawのオプション例:
"OPTION"(更に加えられるオプション): 説明 [使える次元] ex.) hist->Draw("OPTION");
"SAME" :同じパッドに重ね書きする[all]
"LEGO"(~2):レゴプロットを描画[all]
"SURF"(~5):サーフェスプロットを描画[all]
"C" :ヒストグラムのビンを通る滑らかな曲線を描く[1D]
"E"(0~4) :エラーバーを描画する[1D]
"P"(0) :ヒストグラムの現在のマーカースタイルで各ビンに(複数の)マーカーを描画する[1D]
"SCAT" :散布図を描画する[2D]
"ZCOL" :データによって変化するカラースケールで各セルのボックスを描画する[2D]
"CONT"(0~4):等高線図を描画する[2D]
※ 殆どのオプションはスペースやカンマを使わずに並べられる。オプションは大文字小文字を区別しない。
◼︎グラフ
基本の使い方:
const Int_t n = 10; // 配列の要素数
Double_t x[n], y[n];
Double_t dx = 0.1;
for (int i=0; i<n; ++i) {
x[i] = i*dx;
y[i] = sin(x[i]);
}
TGraph* gr = new TGraph(n, x, y);
gr->Draw("AP");
Drawのオプション例:
ex.) gr->Draw("SAME");
"SAME" :同じパッドに重ね書きする
"C" :滑らかな曲線で結ぶ
"L" : すべての点を単純に折れ線で結ぶ
"P" :プロット点を描画する
"A" :フレーム(軸)を表示
error barをつけたい場合は、TGraphErrorsを使う。
体裁を整える:
Style : gr->SetMarkerStyle(20); // 塗りつぶし丸点(20番は河野先生の好みらしい)
Size : gr->SetMarkerSize(0.5); // セットしたstyleのデフォルトから0.5倍する
Color : gr->SetMarkerColor(2); // 赤色
Log表示 : c->SetLogx(1); c->SetLogy(1); // 引数は 0 or 1 で、0→off, 1→on の意味。
Grid表示 : c->SetGrid(1); // 両方 or c->SetGridx(1); c->SetGridy(1);
datファイルを読み込んでグラフ作成:
datファイルを読み込んでグラフを作りたい
■グラフィック関係
・TCanvasはrootの様々なオブジェクトを描く(ディスプレイに出力する)ためのクラスである。
・TCanvasはTPadを継承している。
・TCanvasの中には複数のTPadをもつことができる。
基本の使い方:
ex.1) TCanvas* c = new TCanvas("obj_name", "title", topx, topy, width, height);
ex.2) TCanvas* c = new TCanvas("obj_name", "title", form);
ex.3) TCanvas* c = new TCanvas("obj_name", "title", width, height);
ex_obj->Draw();
(topx, topy)は左上原点。form は1~5までの整数を入力すると、既定のCanvasが開く(便利といえば便利)。
■TTree関係
treeの中身の確認
解析を行う際、treeに入っている変数を確認したい場合がある。そういう時は単純に
root -l hoge.root // root fileを開く root [0] Attaching file hoge.root as _file0... root [1].ls // 入っているtreeの名前を確認 TFile** hoge.root TFile* hoge.root KEY: TTree CollectionTree;1 CollectionTree root [2] CollectionTree->Print() // 調べたいtreeの中身を確認 ****************************************************************************** *Tree :CollectionTree: CollectionTree * *Entries : 1 : Total = 1168904 bytes File Size = 431965 * * : : Tree compression factor = 1.91 * ****************************************************************************** *Br 0 :ByteStreamEventInfo : EventInfo_p4 * *Entries : 1 : Total Size= 1369 bytes File Size = 377 * *Baskets : 1 : Basket Size= 32000 bytes Compression= 2.21 * *............................................................................* *Br 1 :BCM_RDOs : BCM_RDO_Container_p0 * *Entries : 1 : Total Size= 1383 bytes File Size = 398 * *Baskets : 1 : Basket Size= 32000 bytes Compression= 2.24 * *............................................................................* ....... .......
で確認可能。<br>
解析用コードの生成
SetBranchAddressしてGetEntryしてLoopをまわして解析を行うような手続きは一般的なので,TTreeにはこれを行うスケルトン関数やクラスを自動的に生成するメソッドが存在する.
MakeClass MakeClassで解析を行うためには事前にコードを生成する必要がある.
% root rootfile.root root[0] HitTree->MakeClass("HitEvent"); //HitEventである必要はない.好きな名前で.
これで,HitEvent.C,HitEvent.hが生成される.
使い方としては,下のようにクラスのメンバー関数を使用する
root[0] .L HitEvent.C root[1] HitEvent* t = new HitEvent(); root[2] t->Loop();
で,Loop関数で実際の解析が行われる.Loop関数に書き加えて,ヒストグラムを生成するサンプルコードは以下.
void HitEvent::Loop() { if (fChain == 0) return; Long64_t nentries = fChain->GetEntriesFast(); Long64_t nbytes = 0, nb = 0; TH2F* digi_ocu = new TH2F("digi_ocu", "Occupancy Map; col; row", 400, 0, 400, 192, 0, 192); // std::cout << "nentries = " << nentries << std::endl; for (Long64_t jentry=0; jentry<nentries;jentry++) { Long64_t ientry = LoadTree(jentry); if (ientry < 0) break; nb = fChain->GetEntry(jentry); nbytes += nb; for (int i=0; i<nhits; i++) { digi_ocu->Fill(hit_col[i], hit_row[i]); } // if (Cut(ientry) < 0) continue; } TCanvas* can = new TCanvas("c", "Occupancy_digi", 800, 800); digi_ocu->Draw("colz"); can->SaveAs("./plots/Occupancy_digi.png"); }