東京工業大学大学院理工学研究科基礎物理学専攻中村研究室メンバーTakayuki Sako

SOLVisualizer for ANAPAW Manual


ANAPAWで解析した位置情報を受け取って表示する3D Viewer
つまりはANAPAW用のEvent Display.
SOLVisualizerをANAPAW用に手直ししたもの。

開発環境

  • Ubuntu 9.10
  • gcc 4.4.1
  • 言語 : C++ (Visualizer本体)
  • 使用しているライブラリ : feeglut, glui, libpng, boost

仕様

開発中につき仕様は度々変更しているが、現状以下のような機能を持つ。
  • ANAPAWで解析した位置情報を表示する。
  • 結果として検出器、粒子のトラッキングを表示可能。
  • ANAPAWのゲートに完全対応。anaファイルに記述したゲートIDに対応したイベントのみを表示できる。
  • pngの出力。
  • オリジナルのSOLVisualizerと異なり動画機能を持たない。正直要らない。

ソース

ANAPAW本体用

ANAPAWユーザーソース用

SOLVisualizer本体を含む。
まだとりあえず動くというレベルのα版。

ディレクトリ構造

黄色が新たに追加/変更されるべきファイル。
はSOLVisualizerの実行(厳密に言うと改造したANAPAW)により自動的に生成されるファイル。

ANAPAW本体ソース

$ANAPAW_HOME/ tree
.
|-- Documents
|-- Macros
|   `-- ini_alias.kumac
|-- Setup
|-- lib
`-- src
    |-- Makefile
    |-- SVAsource.f
    |-- SVAsourceValiable.inc
    |-- ,,,
    |-- anafill.f
    |-- ,,,
    `-- vana

ANAPAWユーザーソース

$ANAPAW_WORK/ tree
.
|-- ana
|-- bin
|-- cut
|-- evs
|-- hbk
|-- kumac
|   `--  visualizer.kumac
|-- last.kumacold
|-- ntpl
|-- rdf 
|-- setlocal.bash
|-- src
|   |-- Makefile
|   |-- SVA
|   |   |-- SOLVisualizer
|   |   |   |-- Makefile
|   |   |   |-- SOLVisualizer
|   |   |   |-- SOLVisualizerANAPAW.cpp
|   |   |   |-- SOLVisualizerANAPAW.o
|   |   |   |-- Visualizer
|   |   |   |-- trackball.cpp
|   |   |   |-- trackball.h
|   |   |   |-- trackball.o
|   |   |-- SVAconfig.ini
|   |   |-- SVAsubroutine.f
|   |   |-- SVAvaliable.inc
|   |   `-- result
|   |       |-- SVACurrentStatus.txt
|   |       |-- rdf_xxx_rdf-ana_yyy_ana.det
|   |       |-- rdf_xxx_rdf-ana_yyy_ana.glt
|   |       `-- rdf_xxx_rdf-ana_yyy_ana.tra
|   |-- add_ntuple.f
|   |-- anapaw
|   |-- anapaw_d
|   |-- enc_sample.f
|   |-- sample.prm
|   `-- SVAPosition_prm.f
`-- txt

インストール

ANAPAW本体ソース

  • ソースからANAPAW本体用ソースを拾って展開ANAPAW_HOMEにファイルをコピー。
  • anafill.fは上書きする。オリジナルはv2_3_1なので他のバージョンの場合はSOLVisualizer用のanafill.fの中身を見てSVAという接頭辞の付いた行を追加していく。
  • Makefileを適宜書き換えて make lib
visualizer.kumac
ANAPAW_HOME/Macros/にvisualizer.kumacを入れておく。
ini_alias.kumac
ini_alias.kumacに以下の行を追加。
alias/create sol 'exec visualizer'
これでANAPAWからコマンド"sol"でSOLVisualizerを起動できる。

ANAPAWユーザーソース

  • ソースからANAPAWユーザーソース用のソースを拾って展開ANAPAW_WORK/srcにファイルをコピー。
  • enc_sample.fを参考にSVAの接頭辞がつくサブルーチンを追記していく。詳細は後述。
  • nebula_position.prmを参考に検出器のジオメトリを指定するパラメータファイルを記述する。
  • Makefileを適宜書き換えて makeana
コンパイルが通ればインストール終了。

動作の流れ

  • ANAPAW本体
    • ANAPAW本体ソースanafill.fでゲートの処理が行われている。 各ゲートIDに対してそのイベントがアクセプトされた数を足し上げる時に 自前のサブルーチン(SVAGetAccID)でゲートIDを取得。
    • 1イベント毎にゲートIDリストを生成(SVAOutputGate)。 解析開始からのイベント数をユーザーソースと共有し、 各イベントのトラッキングとゲートIDのリストをイベント数で紐付けする。
  • ANAPAW ユーザーソース
    • 位置情報をencで解析した後、ユーザーの任意のタイミングでサブルーチン(SVAParticleWrite)を挟んで位置情報を出力。
    • パラメーターファイルを読み込む為のサブルーチンをANAPAWの仕様に則った独自のサブルーチンに差し替えることにより 検出器の位置情報をランごとに取得する(SVAPosition_prm.f)。
    • 出力するファイル名をanaファイルとrdf(ridf)ファイルで自動生成(SVAEnviromentSet)し現在のファイル名を特定のファイル(SVACurrentStatus.txt)に出力しておく。
  • (ここまで全てFortran77。以降全てC++)
  • Visualizer本体
    • ANAPAWには予めマクロ(visualizer.kumac)を用意しておくことによりシェルを介してANAPAW起動時に現在のランに対して表示するように設定。
    • 以下の3つのファイルを読み込む。
      • filename.det : 検出器のジオメトリ
      • filename.tra : 粒子の位置情報
      • filename.glt : イベントごとのゲートIDリスト
    • OpenGLを使って可視化

注意事項

できるだけCOMMONブロックを使わずに書いたものの、一部COMMONブロックを使っている。 これはANAPAW本体とユーザーソースとの間でデータやり取りするため。
COMMON/SVACOMMON/というブロックである。これが他と重複しないよう注意。

設定

以下を仮定している。
  • 検出器は全て直方体
    • GLUTに用意されている図形ならば対応は容易だが、必要性がないので今のところ直方体にのみ対応。
    • ちなみにGLUTには直方体、球体、トーラス、20面体、8面体、4面体,12面体、円錐、ティーポットが用意されている。
  • 1イベントにつき、トラッキングされる粒子は1個のみ
    • 現状1イベントで1本の折れ線を描くようにしている。複数粒子に対応することは容易だが、その為にはenc内で放出粒子をラベリングしてファイルを出力する必要がある。今のところ必要ないので省略。
  • ビームライン = Z軸
    • ビームラインを任意の直線にすることも容易だが、今はZ軸で固定。
  • トラッキングは検出器ごとの位置を単なる直線で結ぶ
    • つまり、途中にマグネットが存在して曲線を描く場合を想定していない。粒子の角度を測定しているならば、この情報を取り込んで曲線で補完する必要がある。今は省略。
  • モニタの解像度はフルHD程度
    • もちろんもっと解像度が低くても動くが、解像度が小さすぎるとGUIが全て表示されない恐れがある。重要なものほど左かつ上に来るように設計しているので普通は問題ないはず。
他にも気付かないところで暗黙の仮定があるかもしれない。

ユーザーソース用のサブルーチン

encが読み込むSVAsubroutine.fの説明。
ユーザーがいじるべき(代入すべき)変数をで表示する。

SVAEnviromentSet

環境の設定。解析毎に1回だけ読み込む。特にいじる必要はない。

SVAStartLoop

1イベントに対して1回だけ読み込む。ループが回る直前に書く。直後では×。

SVADetectorSet

検出器のジオメトリを設定する。
SVADetectorSet (SVA_DetectorFile, SVA_DetectorID, SVA_DetectorCluster,
SVA_x_center, SVA_y_center, SVA_z_center, SVA_x_length, SVA_y_length, SVA_z_length )
  • SVA_DetectorFile,SVA_DetectorCluster : ユーザーがいじってはいけない。
  • SVA_DetectorID : 検出器のID。標準的な(?)encの書き方だとidと書く。
  • SVA_x_center, SVA_y_center, SVA_z_center : 検出器のx,y,zの中心の位置
  • SVA_x_length, SVA_y_length, SVA_z_length : 検出器のx,y,zそれぞれの長さ

SVAParticleWrite

粒子の位置情報を出力する。
SVAParticleWrite (SVA_TrackingFile, SVA_x, SVA_y, SVA_z, SVA_t)
  • SVA_TrackingFile : ユーザーがいじってはいけない。
  • SVA_x, SVA_y, SVA_z : 粒子のx,y,z
  • SVA_t : 粒子の時間情報。この時間の順にトラッキングがなされる(予定)

GUIの説明

(filename)

実行時のコマンドの第一引数。 現在表示しているファイルの名前を表示している。 ここでanaファイル名とrdf(ridf)ファイル名を確認できる。

Save as .png

キーボード・ショートカット : p
現在表示している画面をpngとして保存する。
ファイル名は filename_101.png
以降、このコマンドを実行する毎に102,103…と連番で出力される。
SOLVisualizerANAPAWの実行の度に番号は初期化されるので、同じファイルを読み込んでこのコマンドを実行するとpngが上書きされるので注意。 また、SOLVisualizerANAPAWのウィンドウ上に他のXウィンドウがあると正しく画面をキャプチャできないので注意。

Gate ID

anaファイルに記述したゲートIDを選択する。すると選択したゲートに対応したイベントのみトラッキングされる。 デフォルトは"0"(Ungate)。 ゲートの数が非常に多いときはうまく操作できなくなるという既知の問題がある。 対処法はあるが今のところ放置。

Initialize

キーボード・ショートカット : i
視点、位置をデフォルトに戻す。 変な方向を向いてしまったときに役立つ。

Exit

キーボード・ショートカット : ESC , q
SOLVisualizerを終了する。

About

バージョン情報などの出力。 ポップアップウィンドウの×印をクリックするとポップアップウィンドウが消えるのではなくSOLVisualizer全体が終了するので注意。 ポップアップウィンドウを消すときは必ずポップアップウィンドウの"Exit"をクリックする。

トランスレーションパネル XY,Z

キーボード・ショートカット : WASD、↑↓→←、PageUP、PageDown
マウスでドラッグすると位置が動く。 Shiftを押しながらだと速く動く。

(画面上をドラッグ)

視点の移動。
視点制御(本質的には物体の回転制御)にはクォータニオンを利用している。

クラスターパネル

display
表示する/しない
RGB
色をRGB0-255で調整できる。
Alpha
透明度を0-100で調整できる。
Z-buffetingがOFFの時のみ有効
Solid/Wire
  • Solid ポリゴン表示
  • Wire ワイヤーフレーム表示
Outline
黒い輪郭線を表示する/しない Solidのときのみ有効。

Particle パネル

Display
粒子を表示する/しない
デフォルトはOFF
Gated number
現在のゲートに対応したイベント数を表示する/しない
DisplayがONの時のみ有効
デフォルトはON
文字色はトラッキングの線と共通
Ungated
"0"ゲート(Ungated)の粒子数を増減する。
RGB
色をRGB0-255で調整できる。
Alpha
透明度を0-100で調整できる。
Z-buffetingがOFFの時のみ有効
Width
線の太さを調節する。

Background パネル

RGB
背景色をRGB0-255で調整できる。

Option

その他細かいオプション。
Z-buffeting
Zバッファを有効にする/しない
SOLVisualizerは負荷軽減のためZソートを行っていない。 そのため、デフォルトではZバッファを有効にしてデプスの情報を扱っている。 この場合はアルファブレンディングが無効になる(半透明で表示されなくなる)。
一方、Zバッファを無効にすれば半透明表示が可能になるが、 デプスの情報が正しくなくなる(奥にあるはずの物体が手前に表示される)。
Information
各種情報を画面上に表示する
fps : フレームレート。但し、正確ではない。
Debug Mode
デバッグモード。
ONにするとデバッグ用の情報が出力される。ターミナルが一気に流れるので注意。

余談

便宜上SOLVisualizer "for ANAPAW"としているが別にANAPAW専用とは限らない。 単にファイル形式さえ揃っていれば他の解析ソフトにも対応できる。 ROOTに対応させることも容易であろう。でも、そもそもそういうアプリケーションがROOT用なら世の中には転がっているはず。
一方でANAPAWにはそのような可視化の手段が(自分の知る限りでは)無かったので大学の停電期間中に息抜きで作ってみた。 ヒストグラムしか表示できず、検出器のジオメトリや粒子のトラッキングを直感的に確認する術が無いのはどうなの?と常々思っていたという理由もある。 その結果がSOLVisualizer for ANAPAW

参考文献

以下のサイトには大変お世話になりました。