ソフトウェア/Igor/システムの基本 のバックアップ(No.2)

更新


ソフトウェア/Igor

もっともお手軽な定型処理の仕方 - コマンドラインへの貼り付け

複数のグラフの見た目を揃えたい場合など、 ある動作を繰り返し行いたい場合に使える最もお手軽な方法は、 コマンドウィンドウに(複数の)コマンドをクリップボードから貼り付けて実行するやりかたです。

コマンドウィンドウとは

コマンドウィンドウというのは、
[ウィンドウ]-[コマンドウィンドウ]
をせんたくするか、もっと普通には
Ctrl+J
を押すと現れる、

IgorCommandWindow.PNG

このウィンドウです。

このウィンドウは通常「操作のログが残るウィンドウ」として認識されているかもしれませんが、 ここに Igor のコマンドを手で打ち込むことで、任意のコマンドを実行することができます。

Hello world!

例えばここに、

LANG:Igor
DoAlert 0, "Hello world!"

と打ち込んで、最後に ENTER を押すと、

CommandWindowHelloWorld.PNG

のようにアラートを表示できます。

複数行のコマンドを貼り付け

このコマンドウィンドウには複数行のコマンドを一度に貼り付けられます。

次のテキストをコピーしてコマンドウィンドウに貼り付け、 最後に ENTER を押すと、

LANG:Igor
Make/N=100 wave0 = sin(2*pi*x/99*2)
Make/N=100 wave1 = cos(2*pi*x/99*3)
Display wave1 vs wave0
ModifyGraph width={Plan,1,bottom,left}
ModifyGraph mode=3,marker=60

CommandWindowDemo.PNG

このように一連の処理を一度に実行できます。

いくつもあるグラフの見た目を揃える

雑多なグラフが並んでいる状態から、

LANG:Igor
make wave0=gnoise(1), wave1=gnoise(1), wave2=gnoise(1), wave3=gnoise(1)
display wave0
display wave1
display wave2
display wave3

次の手順で1つのグラフ (Graph3:wave3) の見た目を整えました。

  • 青線でマーカーを付ける
  • グラフの大きさを 3cm x 6cm にする
  • フォントを Times New Roman 14pt にする
  • 縦横軸にラベルを付ける

コマンドウィンドウには一連の操作のログが残っていることを確認できます (黒く選択されている領域)。

CommandWindowDemo2.PNG

このように操作ログをマウスカーソルで選択して Ctrl+C でコピーすると、 操作ログをクリップボードに入れられます。今の場合、その内容は

LANG:Igor
*ModifyGraph mode=4,marker=19,msize=1,rgb=(0,0,65280)
*ModifyGraph msize=3
*ModifyGraph width=170.079,height=85.0394,gFont="Times New Roman",gfSize=12
*Label left "Value [a.u.]";DelayUpdate
*Label bottom "Time [s]"

のようになります。
(始め、マーカーサイズを1にしましたが、小さすぎたので3に直した様子も残っていますね)

この内容はコマンドのログのようでもありますが、 実際には同じ動作を行うためのコマンドのリストになっていて、 先頭の * さえ取り除けばそのまま Igor のコマンドとして解釈可能です。

ここで、Graph0:wave0 のグラフを選択し、前面に持ってきてから
Ctrl+J でコマンドウィンドウを出し、
Ctrl+V で先ほどコピーしたコマンドリストを貼り付けます。
(各行の先頭に * が付いていますが気にしなくて大丈夫です)

CommandWindowDemo3.PNG

このように貼り付け後は最終行しか見えませんが、 実際にはちゃんとすべての行が貼り付けられています。

ここで ENTER を押すと、先ほどのコマンドがすべて実行され、 Graph0:wave0 の見た目が Graph3:wave3 と一致します。

CommandWindowDemo4.PNG

この操作を Graph1:wave1, Graph2:wave2 についても行うことで、 すべてのグラフの見た目を統一することができました。

CommandWindowDemo5.png

Igor で一連の動作を繰り返すにはこのように、

  1. まずは一回メニューなどから必要な操作をやってみて、
  2. コマンドウィンドウのログから必要部分を取りだして、
  3. 必要に応じてテキストエディタなどで編集して、
    • コマンドウィンドウに貼り付けて実行する
      または
    • Ctrl+M で出るプロシージャウィンドウに貼り付けて関数とする

というのが一般的な手順になります。

始めからコマンドをすべて覚えていなくても メニューから選んだコマンドの名前をコマンドウィンドウのログから 知ることができるのが良いところですね。

Igor のマルチスレッド対応

Igor Pro 6.1 から、マルチスレッド対応が強化されたそうです。

LANG:Igor
wave0 = any_expression(x)

のような代入文で時間がかかっている場合、

LANG:Igor
MultiThread wave0 = any_expression(x)

とするだけで、個々の座標値に対する計算を異なるスレッドで行ってくれます。

当然、wave の個々の座標の値の間に依存関係がある場合にはうまくいきませんが、 独立に計算できる場合にはこれだけでかなり速度が上がります。

より高度なマルチスレッド

もっと複雑なことをしたい場合には、 ThreadGroupCreate / ThreadStart / ThreadGroupPutDF / ThreadGroupGetDF / ThreadGroupWait / ThreadGroupRelease といった関数を使うことで、きめ細やかなマルチスレッド制御を行えます。

実際やってみると、メモリ確保などに時間がかかっていることも多いようで、 単純にスレッド数倍もの速度向上は望めませんが、シングルスレッド比で 2倍くらいの速度は簡単に出せるようでした。

例えば、Intel Core i7-3520M @ 2.9GHz + Windows 7 (64bit) で 1024 本のスペクトルに対して解析を行った結果、

  • シングルスレッド = 11.0 秒
  • マルチスレッド = 4.3秒

という結果が得られました。

注意点

このようにマルチスレッドで使う関数、例えば SomeMutiThreadableFunction(x) には ThreadSafe というキーワードを付けて定義する必要があります。

LANG:Igor
ThreadSafe function SomeMutiThreadableFunction(x)

    // マルチスレッド対応コード

end

このような ThreadSafe な関数からは、同じく ThreadSafe とマークされた関数以外を呼び出せません。

やってみるとすぐ分かるのですが、現在のところ ThreadSafe とマークした関数には デバッガ機能が働かず、ブレークやステップ実行ができません。

シングルスレッドで十分にテストしてからマルチスレッドに移行しないと、 うまく動かないときに面倒なことになります。

デバッグ環境設定のようなところで「Multithread 機能をオフにして、 すべてをシングルスレッド(ノンプリエンプティブマルチスレッド)で動作させる」 なんていうのを選べると、デバッグが楽になって良いんですけどね・・・

幸い、print や printf は ThreadSafe 関数からも呼べるので、 デバッグにはこれらを使って頑張るしか今のところ手はないようです?

質問・コメント





Counter: 21148 (from 2010/06/03), today: 9, yesterday: 0