編集メニュー > 新規作成 編集 コピー 名前の変更 凍結 アップロード 添付ファイル一覧 バックアップ

AnapawMode?

→ aprootに改名・移動しました。 こちら

  • fileAnapawMode-1.0.tar.gz
    2011/08/08 TRintをもとにしてroot_anapawという実行形式を作ることに。これでマウスが効かない問題点を解決!これでgROOT->ProcessLine?("command")としなくてもよくなり、C++で作ったModuleを完全に取り込む事ができますよ。ただしその場合stringからintなどの変換が必要だけどね。 名前がいまいちな感じがするのでそのうち変えるかもです。

以下は各部分についての記述。


AnapawMode?への道

rootを使い始めてみました。が、慣れていないせいもあって使いづらい。個人的にはPAW/ANAPAWの様な

command HID option

のような入力でカタカタ解析したい。IさんがANAROOTなるものを開発していますが、おそらく自分の希望している様にはなっていない。以下はANAROOTをまるでANAPAWを操作するようにするための道標。(志半ばにならないように頑張ります)

コマンドプロンプト

ルートのコマンドはいちいち()をつけたりとか、””をつけたりとかで、キーボード派な人には使いづらい感じがしてしまう。anapawのように使うならコマンドプロンプトを走らせてそこからマクロを走らせれ同じ様な使い勝手になる?

コマンドプロンプトは以下の様にするとできる。

#include <iostream>
#include <readline/readline.h>
#include <readline/history.h>

using namespace std;

int compro()
{
  char *line;

  while(1){
    line = readline( "ANA> ");
    if ( (string)line == "exit" )
      break;

    // execute command 
    cout << line << endl;
    free(line);
  }
  return 0;
}

mallocでメモリ領域を確保しているので必ずfreeで解放する必要があるとのこと。freeしないとどれだけまずいのかはよくわかりませんがとりあえず。 こんなに簡単に作れるのですね。。。コンパイルするときには

g++ -o compro compro.cc -L/usr/include/readline -lreadline

と打って上げないといけない。ROOTでやるにはどうするの?

ROOTでの走らせ方

root [1] .L /usr/lib/libreadlibe.so
root [2] .L test/compro.cc+
root [3] compro()

で行けました。まだ↑とか効いていない。history?

(ANA)PAWと(ANA)ROOTの比較

それぞれ良い点と悪い点があるかと思います。

(ANA)PAW(ANA)ROOT
コマンドは全部打たなくてもOKコマンドは全部入力する必要あり。TABが効く
aliasが使えるaliasない?()が必ずつく
ヒストグラムのIDは番号。hn/hbは便利ヒストグラムは名前でID。わかりやすい?
anaファイルは数字の羅列それだけではあっているかどうかは分かりづらい。ただしファイルのフォーマットはかなり整う。ヒストグラムの定義はどうするの?
古い。いつまでつかえる?新しい
rootファイルのTreeは単位が分からない?結局単位を示すヘッダのようなものがいるのか?

コマンドプロンプト その2

以下でヒストリーが使用可能になりました。

#include <iostream>
#include <readline/readline.h>
#include <readline/history.h>

#define MAX_HISTORY 3

using namespace std;

int compro()
{
  char *line;
  int history_no=0;
  HIST_ENTRY *history = NULL;

  while(1){
    line = readline( "ANA> ");
    if ( (string)line == "exit" )
      break;

    // execute command
    cout << line << endl;

    add_history(line);
    if (++history_no > MAX_HISTORY){
      history = remove_history(0);
      free(history);
    }

    free(line);

  }

  return 0;

}

MAX_HISTORYで履歴数を定義している。 これで使い勝手の良いコマンドプロンプトが作れますな!lineを解析して、たとえば

ht 101

とかだとプロットするマクロを走らせる。登録されていないコマンドの場合にはROOTのコマンドだと思って走らせる。これでANAPAW寄りなコマンドプロンプトができるはず。ただ、ROOTのコマンドを打つ時に便利なTABは使えなくなる。

 anamode(仮称)への課題

  1.  コマンドラインの解析 --> 単にスペースで単語分けるだけ?
  2.  コマンド一覧から検索?
  3.  各マクロの作成
  4.  ROOTを起動したら
    anapawmode()
    と打つだけでコマンドプロンプトが切り替わってほしい。-->起動時にライブラリを読ませる?anapawmode.Cというマクロにべた書き?
  5.  ヒストグラムのIdentifierは文字列のまま?それとも番号を与える? --> だとするとヒストグラムの一覧をゲットして番号を振る。さらに「i」コマンドで番号付きの一覧を表示させる。
    •  もしくはそもそもヒストグラムの定義の時に番号にする? --> ROOTに慣れている人は面倒臭い。
    •  そもそもANAROOTはTREEを吐くの?Histogramを吐くの?ONLINE解析ではどちらのほうがよいのかな?

クラス

コマンドラインの部分は以下のように分けるかな?

  1. 上のreadlineを呼ぶところ
  2. 入力を解析してマクロに投げる部分

単純に作るとglobaになるが、クラスを作って後者はprivateでもよい。まあglobalでもよいけどC++っぽくするなら余計な関数を見えないようにするんかな。クラスを作ってコンパイルして、root

root [1] .L Anapawmode()

としてもAnapawmodeのメンバは見えない。 どうやらClassDef?ClassImp?が必要らしい。 ここを参照。

 一筋縄ではいかない!

以上のような感じでAnapawMode?クラスを作成した。readlineのインプットを解析した後に構文解析をし、以下のように実行することにしてみた。

gROOT->ProcessLine(commandline);

たとえばcommandlineには"histo->Draw()"のような文字列が入る。 でもだめ。AnapawMode?をexitで抜けた後にプロットされる。うーむ。。。

gSytem->ProcessEvents?()

  gROOT->ProcessLine?(commandline);

    gSystem->ProcessEvents();

とするとプロットしてくれる!...んだけど2個目はプロットされずにexitで抜けた後にプロットされる。うーむ。。。

 とりあえず。。。

とりあえずは以下で解決できる。

   gROOT->ProcessLine(commandline);
   gSystem->ProcessEvents();
   gROOT->ProcessLine("c1->Update();");

Drawするとc1というCanvasが作られる。そいつをUpdateするととりあえず描画される。超付け焼刃... c1->でなくてgPad->のほうがまだましかな?でもCanvasをマウスでクリックしても変化ない。まだ何か足りていない...

Rint?

上の問題は結局readlineで入力待ちしているとROOTのEventLoop?が回っていない?ためかと思われる。両方を両立するにはもっと根っこからいじる必要があるかも?

RintはROOTのInteractive Interface。この中でコマンドプロンプトとか書いてある。これを継承してちょっと付け足せば目的は達成できる?ただしおそらく

#include "TRint_Anapaw.h"
      int main(int argc, char **argv)
      {
         TRint_Anapaw *theApp
              = new TRint_Anapaw("ROOT (ANAPAW)", &argc, argv);
         // Init Intrinsics, build all windows, and enter event loop
         theApp->Run();
         return(0);
      }

こんな感じで書いて別のプログラムを作成することになると思う。

必要なコマンド一覧

以下はANAPAWで使っていたコマンドの一覧(すべてではないかも?)。こいつらをANAPAWMODEで使えるようにしたい!

コマンド名備考
fetch FILE簡単にできる
hstore FILEファイル名を指定してヒストグラム/Treeを保存する方法がわからない...
hcut [HID HCUTNAME OPT]treeだったらすぐにできる?
cdrawhcutとコンビで必須
cpro [HID OPT]treeならすぐ。ヒストグラムからでもまあできる。pawのマクロはある。
clear [OPT]どうするのかな?
hnt,hbt [OPT]
blow [XMIN XMAX YMIN YMAX], xblow, xyblowあんまり使っていなかった...、個人的にはpawのhi/pl HID(x1:x2)のようなほうが好き
prx, pryすぐできる
bnx, bnyすぐできる
slx, sly NSLIすぐできる?
mami [MIN] [MAX]あまり使っていなかった。すぐできる?
xstatus
hstatus
xfitgxfitg [XMIN XMAX]とかでフィットの範囲をキーボード入力にも対応させたい
figa
xval,xyvalT君が開発済み?
avy [HID OPT]すぐできる?
chbin BFどこかに転がっている
status解析しているanaファイルやrawデータファイルを表示してくれる
lnx,lgx,...必須
pson/psoff
listgateゲートに入った数を表示。あまり使っていなかった。

とりあえずこんなもん?結構ありますね。 以下はanapawにはないけど、自分でマクロとか書いていて便利だったもの。追加したいね。

コマンド名備考
plots HID1 HID2 [OPT]HID1-HID2をプロット。
datplot FILE OPT [HID]テキストをプロットさせる。
td HID FILE OPTヒストグラムのcontentsをテキストファイルに書き込む。別に名前はtdでなくてよいけど。

コマンド補完(検索)

TAB補完かPAWのような部分的なコマンド文字列入力か、2通りがあるかな?前者は入力時にTABキーを押すという手間が余計にかかる。なのでキーボード入力最速のためには後者のほうが良い。

以下のプログラムでは、部分的に文字列を入力するとあらかじめあるコマンドのリストから検索して補完することができる。

#include <iostream>
#include <string> 

using namespace std;

string Complement_Command(string line){
  const int MAX_LIST=40;
  string list[MAX_LIST]
    = {"hnt","hbt","lnx","lgx","lny","lgy","lnz","lgz","cpro","hcut",
       "avy","cdraw","listgate","prx","pry","bnx","bny","slx","sly",
       "xstatus","hstatus","xfitg","figa","mami","blow","xblow","xyblow",
       "fetch","hstore","clear","xval","xyval","chbin","status","pson",
       "psoff"};
  int i_matched[MAX_LIST];
  string word;

  int n_matched=0;
  int i=0;
  while (i<MAX_LIST && !(list[i].empty())  ) {

    //search matched commands
    word = list[i].substr(0,line.size());
    if ( word == line ){
      i_matched[n_matched]=i;
      n_matched++;
    }
    i++;
  }// while 

  if (n_matched<1){
    cout<<"*** AnapawMode: No such a command"<<endl;
    return "";
  }else if(n_matched==1){
    return list[i_matched[0]];
  }else {
    cout<<"*** AnapawMode: Ambigous command "<<line
        <<". Possible "<<n_matched<<" commands are:"<<endl;
    for (i=0;i<n_matched;i++){
      cout<<list[i_matched[i]]<<endl;
    }
    return "";
  }// if nmatched

}

int main(int argc,char* argv[]){ 
  string str[100];
  int i;

  for (i=0;i<argc;i++)
    str[i] = argv[i];

  if (argc>1)
    str[1]  = Complement_Command(str[1]);

  return 0;
}