パスワードを忘れた? アカウント作成
16486074 journal
日記

lazy_chainの日記: ROOTを使い始める 4

日記 by lazy_chain

おじさんなので、いろいろ面倒くさそうだから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 と同じ様にプロットできた。

今後もいろいろ嵌まりそう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

読み込み中...