2008年2月11日月曜日

ROOT canvasの操作

ROOTでは、ヒストグラムやグラフなどを描画すると、canvasという物に描かれる。
この項ではcanvasを取り扱うTCanvasについて主に説明する。

まず始めに、TCanvasを作ってみよう。
TCanvas *cvs=new TCanvas("cvs","test cvs",600,400);
// 600×400のcanvasの作成
"test cvs"という名前のwindowが作成される。これがcanvasだ。

TH1D *hist1=new TH1D("hist1","test histgram",100,0,1);
//histgramの作成
hist1->Draw();
//histgramが"test cvs"というタイトルの付いたwindowに描かれる。

もし、cvsを作成していなかったらどうなるか。
hist1->Draw();
<TCanvas::MakeDefCanvas>: created default TCanvas with name c1
この場合は、デフォルトのcanvasが作成され、そこにヒストグラムが描かれる。

ここでもう一つのヒストグラムを見たいと思い、描画を行うと
TH1D *hist2=new TH1D("hist2","test histgram",100,0,1);
hist2->Draw();//もう一つも描画。
先ほど描いたhist1のヒストグラムは消され、新たにhist2が描かれる。


これでは困る、同時に見比べたいという時の対処法は、3つある。
1:ヒストグラムを重ねて描く
2:もう一つcanvasを作る
3:今のcanvasを分割して使用

1:に関してはこの項では扱わない。
2:に関しては
TCanvas *cvs2=new TCanvas("cvs2","another canvas",600,400);
とやって新しいcanvasを作成してから描画するcanvasを選択する。
選択されているcanvasは黄色の枠で囲まれている。変更する時はマウスでミドルクリック(中ボタンを押す)するか、
cvs2->cd();
とする。

この後で、
hist2->Draw();
と描くと、"another canvas"という名前がついたwindowにhist2が描かれる。

3:に関しては、
cvs->Divide(1,2);//x軸方向1分割、y軸方向2分割
上段を選択して
hist1->Draw();//上段に描画
下段を選択して
hist2->Draw();//下段に描画
という感じで描画を行う。

画面の選択をマウスを使わずに行う時は、
cvs->cd(1);
のように、canvasを番号で指定して選択する。番号の割り振りは左上から右下に向かって順番に行われる。
例えば、
cvs->Divide(2,2);
なら
1,2
3,4
という番号が割り振られている。

分割に関して、特定のcvsだけ更に細かく分割を行いたい時は
cvs->Divide(1,2);
TCanvas *cvs1=cvs->cd(1);
cvs1->Divide(2,1);
とやると、上段2列、下段1列のcanvasが作成できる。

canvasの描画や分割を消去したい時は、
cvs->Clear();
を行う。このとき、分割してできたcvs1が指し示す先は存在しなくなる。これを避けるには、"D"オプションをつけて、
cvs->Clear("D");
とする。こうすると、直接操作でつくった(cvs->Divide()で作成した)画面分割は保存される。
また、Close()を呼び出すとcanvasを閉じる、
Flush()を呼び出すと描画をflush(強制描画)する、Update()を呼び出すとupdate(強制描画+α)する、などがある。

0 件のコメント: