
lazy_chainの日記: ROOTを使い始める 4
おじさんなので、いろいろ面倒くさそうだからROOTを使うのを避けてきたが、世間から20年以上遅れたPAWではそろそろ限界なので諦めてさわり始めた。
簡単なマクロを作って使い方を勉強中だが、簡単に出来たことがいろいろ面倒。
最初にはまったのが wait 機能。
複数のヒストグラムやプロットを canvas->Divide(n,m) でn x m に分割したキャンバスで見ていきたいときに問題。
プロットが n x m 個に達した時点で一度 wait をかけて、エンター押したらキャンバスをクリアして続きの描画を表示したいが、単純にマクロの中で getchar() や char s[1]; gets(s); を実行すると画面のフォーカスがキャンバスのウィンドウに移ってしまって、いちいちターミナルをクリックしてからエンターを押す必要があり、非常に面倒。
PAWで使えた機能くらい実装してもらいたかった。
仕方ないのでフォーカスをターミナル(CINT)に戻す方法で対処。
1)ターミナルの識別用にROOT起動時にターミナルのタイトルを変更するスクリプト
set_term_title.sh をパスが通ったところに置く
#!/bin/bash
pid=`ps | grep "root" | grep -v "root.exe" | awk '{printf("%s",$1)}'`
if [ -n "$pid" ]; then
echo -ne "\033]2;ROOT($pid)\007"
else
echo -ne "\033]2;terminal\007"
fi
2)ROOT起動時に実行するように ~/.rootlogon.C に
#include
{
gSystem->Exec("set_term_title.sh");
}
3)フォーカスをターミナルに戻すスクリプト focus_cint_term.sh を用意
#!/bin/bash
pid=`ps | grep "root" | grep -v "root.exe" | awk '{printf("%s",$1)}'`
termname="ROOT($pid)"
wmctrl -a $termname
あとはマクロ中で
gSystem->Exec("focus_cint_term.sh");
printf("Type to continue or Q to quit ");
char s[1]; gets(s);
if (s[0] == 'q'){
return 0;
}
の様にすれば PAW の wait と同じ様な働き。
Divide()のお作法もいまいち良く分からん。
TCanvas *c1 = new TCanvas("c1"," ",600,600);
c1->SetWindowPosition(0,1);
// これを入れないとウィンドウの位置がいろいろ吹っ飛ぶ。
// 座標を 0,0 にすると吹っ飛ぶ仕様も謎。
int nx = 2, ny=3;
c1->Divide(nx,ny);
npl = 1;
for (int i = 1; i <= 20; i++){
c1->cd(npl); //面倒その2-1
プロット処理
if (npl == nx*ny + 1){
c1->Update(); //面倒その2-2
gSystem->Exec("focus_cint_term.sh");
printf("Type to continue or Q to quit ");
char s[1]; gets(s);
if (s[0] == 'q'){
return 0;
}
c1->Clear(); //面倒その2-3
c1->Divide(nx,ny); //面倒その2-4
npl = 1;
}
npl += 1;
}
もっと簡単に出来るのかもしれないが、とりあえずこれで paw の zone と同じ様にプロットできた。
今後もいろいろ嵌まりそう。
気になったのでRTFMした結果 (スコア:0)
「Create a new canvas at a random position.」なので、吹っ飛ぶのは仕様 [root.cern.ch]
new TCanvas("c1"," ",0,0,600,600); [root.cern.ch]なら飛んでいかないだろう。
Re:気になったのでRTFMした結果 (スコア:1)
ありがとうございます。確かに。
とりあえずサンプル見ながら動かすこと優先で関数の仕様まで確認してませんでした。
心配性な私にしてみると、 (スコア:0)
pid=`...` は、ユーザ root が実行するとドツボにはまるんじゃないか、と思うので、
ぐらいで良いんじゃないのかな。
Re:心配性な私にしてみると、 (スコア:1)
そっちの方がすっきりしているし、良いですね。
root で ROOT を実行することは無いと思いますが。
ROOT という名前が検索の S/N 悪くするので困りもの。