Igor Proは大変高機能なグラフ作成及びデータ解析のためのソフトであり、[[WaveMetrics:http://www.wavemetrics.com/]]社の製品です。日本語版もあり、[[ヒューリンクス:http://www.hulinks.co.jp/]]社が取り扱っています。このヒューリンクス社が代理店なのか開発にも携わっているかは知りません。
 
 このソフトはグラフ作成のための機能を殆ど揃えている一方、非常にC言語と似たインターフェースを持つ独自の開発言語を持つので、プログラミング経験のある人間ならば決まり切った作業をプログラムに書き下ろして自動化させることは容易だと思います。(僕は逆にこれでプログラミングを学びました)他に、GPIBボードなどと通信して、計測結果を直接取り込むなどと言う機能があるようです。
 機能的に全く不満はないのですが、Linux版が出ていないことが大変残念です。是非リリースしてほしいと思います。
 
 *オートメーション [#wdbd8aa8]
 COMコンポーネントを備えているので、VBScriptなんかからもIgorを操作できる。データロガーなど役に立ちそう。
 
  Dim igor
  Set igor = GetObject(, "IgorPro.Application")
  igor.SendToHistory 0, "this is VBScript" & vbCr
  igor.Execute("print ""commands are acceptable""")
  igor.Execute("make/n=4 testwv")
  Dim df, wv
  Set wv = igor.DataFolder(":").Wave("testwv")
  wv.Name = "newwv"
  ' Methods that use Array don't work well
  wv.SetNumericWavePointValue 0, 1.5
  wv.SetNumericWavePointValue 1, 11.5
  igor.Execute("newwv[2] = -2.1")
  igor.Execute("newwv[3] = -32.1")
  igor.Execute("Display newwv")
  igor.SendToHistory 0, "bye !" & vbCr
 
 *書き散らしメモ [#n9e291a4]
 -CompareWaveはequalWavesになったそうだ
 
 *ツボにはまった事柄のメモ [#saccbeb3]
 
 **procedure [#s6a4cf9b]
 Igorでは自分の用途に応じてプログラムを組むことができますが、これをprocedureなどと呼びます(これと別にmacroがあるが、ほぼ同じ)。experiment固有のものだと話は単純ですが、ある程度汎用的なprocedureを作成し適用する場合、若干の注意が必要となります。
 
 あるexperimentでFileメニューのOpen Fileや、"Igor Procedure"ディレクトリからprocedureを読み込み保存した場合、experimentにはそのprocedureの実体が保存されず、そこへのreferenceが保存されます。実体を取り込むには、FileメニューからAdopt Procedureとします。Adoptを一斉にやる又はfunctionから実行する方法は今のところ無いようです。当該procedureが実体か、reference先のものかはprocedureウィンドウの左下の紙のアイコンをクリックすればわかります。
 
 referenceで保存した場合、ソースのリファクタリング等によるパフォーマンスの向上といったことの恩恵は受けますが、関数名の変更や古い関数の廃止などを行うと、それに依存する古いexperimentの読み込みに支障が生じ得ます。これを防止するには、必要なprocedureに対し上述のAdoptを行う必要があります。Adoptはinclude先のprocedureも一緒にAdoptするようなことはしてくれませんので、複数のprocedureがある場合には手作業でAdoptを行うこととなります。
 
 ですが、読み込みに支障が出るとは、もう完全にデータが破壊されてどうしようもない、といった様な悲惨な状況を意味するわけではないようです。experimentは、まず諸オブジェクトとウィンドウを作成し、後に固有のprocedureを読み込むようなので、例えばreferenceを保持する古いexperimentを開き現状のprocedureと矛盾が発生してコンパイルエラーが出たとしても、それは諸データを読み込んだ後の出来事なのでグラフ自体に変なことは起きていないようです。単に固有のprocedureのコンパイルエラーが起きただけで、それを用いて作成したデータがぐちゃぐちゃになるわけではないようです。
 
 でもやっぱりこれは気持ち悪いし、他の環境にデータを移すことを考えれば、マメにAdoptしてexperiment自体で完全に話が完結するようにした方がいいのではないか、と僕は思います。
 
 **WM Procedures [#ha75dca9]
 汎用性がありそうなものはWM Proceduresとして既に製造元が作成してくれています。Igor Help Filesなるディレクトリの"WM Procedures Index"なるヘルプファイルに使用方法が説明されています。まだ全ては試していないのですが、ざっと見て便利そうなものをメモします。
 
 -数式をプロットしてくれる"function grapher"なるものはそのままでは実行できませんでした。windows2000では、何やら勝手にincludeステートメントを挿入し「そんなファイルは無い」と勝手に怒られるので、同名の空ファイルを作成してみたところうまくいきました。
 -グラフ上のデータをいじくる"wave arithmetic panel"なるものは日本語windows2000上で軽く文字化けを起こします。
 -Delete Marquee Pointはグラフ上の不要データを消せます。矩形選択して右クリック
 -MatrixFromTable、MatrixToMatrix
 -Load Row DataはDektakなどに
 -GraphMagnifier
 -ExecuteCmdOnList
 
 **sprintf [#kc2517be]
  sprintf 文字列変数, "文字列" , 変数
 C言語でいうところのsprintfが使えます。連番のwaveやグラフをまとめて処理するときによく使います。
 
 **Modifysurfer [#g4ee1099]
 Igorでは三次元のグラフを描く際にSurface Plotと呼ばれる機能を使いますが、このグラフの体裁を整えるコマンドのModifysurferはprocedureから直接呼ぶことができません。だからexecuteコマンドを使って誤魔化して使えとマニュアルにはありましたが、forループで呼出す際にどうもうまくいきませんでした。frontWindowがうまく動いてない様な感じなのですが、単純に僕の書いたprocedureがタコなだけかもしれません。でもprintでコマンドを打ち出して範囲指定して実行したらうまくいったのでよしとします。
 
 **preferences [#qf9ebc30]
  preferences 1
 という一行をprocedureに添えてやると、newLayoutなどでウィンドウを新しく開いた時に自分のpreferenceが自動的に適用されます。
 細かい体裁はコマンドでなくマウスで視覚的に決めたい時には、前もって設定しておいてpreferenceに記憶させておけば、好みのウィンドウが次々とできるので楽です。
 
 **Aspect [#t749aed4]
 
 等高線プロットなどではプロット領域の縦横比を一定値に定めたいことがよくありますが、そんな時はAspectで指定すればうまくいきます。Aspectで比を決められたプロット領域にマージンを加えたものがウィンドウの大きさです。ですが、僕の環境では、折角Aspectを指定したのにいざLayoutをAdobe Distiller で印刷しようとするとDistillerが勝手にプロット領域の大きさを変えて体裁がグチャグチャになってしまうという現象が起きました。対策として、FILEというポートにAppleのColor Laser Writer 12/600Jなるプリンタをインストールしました。これ経由で印刷(実際にはポストスクリプトファイルでの出力)すると元のグラフに忠実なポストスクリプトファイルが吐かれるので、あとはDistillerで変換してやれば正しいpdfが無事できあがりました。(しかし、後にIllustrator等で編集する目的でpsやepsを吐かせる場合は、このように印刷からでなく"Save Graphic"を使って変換した方が良いようです)
 
 できたポストスクリプトファイルを処理する時に、複数のポストスクリプトファイルをひとつにまとめるたいと思うことがしばしばあります。こんな時は、
  gs -q -dNOPOSE -dBATCH -sDEVICE=pswrite -sOutputFile=出力ファイル名 -c save pop -f 入力ファイル名1 入力ファイル名2 ,,,,,,,,,,
 
 とすれば合体したポストスクリプトファイルができあがります。他にも[[psjoin:http://member.nifty.ne.jp/tsato/tools/psjoin.html]]というスクリプトがあり、これを用いればもっとお手軽に合体が実現します。
 
 **等高線プロット [#sc22639d]
 "Matrix of Z values"を選択し、xy軸として"_calculated_"を選択すると、x軸としてはMatrixのRow(行列の「行」)、y軸としてはMatrixのColumn(行列の「列」)が採用され、行列の見え方とは逆になるので注意が必要です
 
 **Layout [#r78cc32a]
 上記の様に、プロット領域の比率等を指定すると、印刷等の際のレイアウトにもシビアな設定が必要なことがあります。Igor の Layout はグラフの大きさ等を指定することができ、Layout上でグラフ等をダブルクリックすると設定画面に移ります。ここのLeftとかTopとかは、紙の端から測った長さのことで、Layout自身の余白とは関係ありません。一方で、widthとかheightとかはグラフ自身の余白も含めた大きさなので、プロット領域の正確な大きさを知るためにはこれらの値からグラフのマージンを差し引く必要があります。
 
 **Table [#bc7b045b]
 見てくれは普通の表なのですが、Igorは1次元データであるwaveを基本としているため、excelなどとは若干使い勝手が異なります。
 あるデータ列を別の列に移したい場合はコピー&ペーストではダメで、Altキーを押しながらドラッグする必要があります。
 
 **レイアウトとグラフのサイズ [#i67727d0]
 グラフ中の注釈等の配置や文字のサイズは、グラフの大きさによって自動的に調整される。しかし、煩雑なグラフとなると勝手に位置関係を変えられると困ることがある。結局のところグラフはA4サイズの用紙単位で管理することが多いため、グラフのサイズはA4用紙に丁度2つ収まるように予め決めてしまう(そして印刷はレイアウトから行う)のが私のお気に入り。そのためには以下のようにする。
 -レイアウトのページ設定で、用紙をA4(縦)、上下左右の余白を1cmとする。
 -グラフのマージン・サイズ設定のダイアログで、左と下のマージンを1.5cm、右と上のマージンを0.5cmとし、グラフの幅と高さは共にAbsoluteとしてそれぞれ16.9cm、11.8cmとする。
 
 こうすると、ひとつのレイアウトに2つのグラフが漢字の「日」のように2つピッタリと配置できる。ひとつだけでいいなら高さを25.6cmにする。
 
 
 *ショートカット [#v4cf65e5]
 覚ておくと重宝するもの
 
 | Ctrl+E | 最前面のウィンドウを最背面に |
 | Shift+Ctrl+E | 最背面のウィンドウを最前面に |
 | Ctrl+J | コマンドウィンドウ |
 | Ctrl+M | プロシージャウィンドウ |
 | Alt+最大化ボタンクリック | preference通りのウィンドウサイズにする |
 
 
 *自作のprocedure [#v0d6d111]
 備忘録及び保管のため、自作のprocedureを晒してみることにしました。もし万が一これを見た誰かの役に立てるなら嬉しいですが、
 所詮は僕の作ったものなのでバグなどあるかも知れません。お約束の自己責任と言うことで・・・
 
 **詰め合わせ [#i07bf02a]
 -[[hi_igorprocedures:http://aki.issp.u-tokyo.ac.jp/itoh/data/hi_igorprocedures.zip]]
 
 私が普段使っているものをまとめたものです。下のrainbowを含みます。
 
 **rainbow [#k640e6f1]
 
 -[[rainbow.zip:http://aki.issp.u-tokyo.ac.jp/itoh/data/rainbow.zip]] [[マニュアル:http://aki.issp.u-tokyo.ac.jp/itoh/data/rainbow_readme.html]]
 
 平面上の一点ごとの値の大きさを色の違いで表すことをイメージプロットと呼んでいるようです。用いる色には様々なものが考えられますが、値の相違を強調する場合、単純な濃淡よりも虹色の方が見易いものとなります。Igorに標準で備わっている虹色(Rainbowという名のcolor table)は、値が高い/低いの両端が紫と赤となっていますが、これでは多少の不都合があったので、両端を白と黒に変えて虹色の順番もいじくってみました。このprocedureは、この新しい虹色でイメージプロットするためのものです。