Igor Pro上でのプログラミング入門(一体どこから始めれば良いのか?)

Igor Proは単純なデータ処理、グラフ描画だけではなく、自分でスクリプトを書く事によってデータの入出力、様々な加工・統計処理、グラフ処理までを自動で行うことが可能である(実際Igor Proのメニューのコマンドもスクリプトで行われている)。

また、スクリプトを駆使すれば測定装置(USB, GP-IBを用いて)を制御可能で、Igor Proで測定装置の構築が可能となる。このことから、Igorに精通していれば、研究開発においてかなりデータ処理が楽になる事は間違いは無い。

一方、Igor ProはExcelなどのグラフ描画アプリと比べると敷居が高いことは事実で*、Igor Proの使用経験が無い学生が最初戸惑う事も多い。ということで、うちの研究室で用いているIgor Proの基本操作、簡単なスクリプト作成までを短時間でマスターするためのマニュアルを以下に公開しておく。
ーーー

基本操作

Igor Proのgetting startedに書かれている事柄を全て行う。(冊子でも良いし、Helpメニューから辿っても良い)
これで、waveの概念の理解、データの入力、グラフ作成、データ処理、fittingなど基本的作業をマスター出来る。

特にExcelなどとは異なり、グラフの細部までカスタマイズ可能で、仕上がりが美しくなることを実感して欲しい。
また、コマンドウィンドウ(Ctrl +J, command + Jで現れる)に現れるをチェック。例えばグラフのデザインに関しては個々に現れたコマンドをスクリプトに貼り付ければ、そのデザインを再現できる。

プログラミングの基礎

どのプログラミング言語(あるいは技術)でも当てはまると思うのだが、初心者が新しい言語を学ぶときは
1. “入手しうる最も簡単な入門書”に基づいて基本的な操作を理解
2. インターネットなどで”最も自分の目的に近い”ソースコードを入手し、動作確認の後、各コマンドの意味の理解
3. 1.2を繰り返す
4. その他のソースを当たる(2のソースコードで足りない部分を探すため)
5. 4のソースの解析
と繰り返していくといつの間にかある程度のことは出来るようになっている。

肝心の”最も簡単な入門書なのであるが、私の研究室では以下を最初に奨めている。
HelpにあるChapter IVのprogrammingを読めば良いのであるが、結構な分量があるので、以下を参照されたし。
これに沿って、作業していくことでwave間のデータの受け渡しなどの基本的なルールを習得できる。

また、コマンドの用法などは
で随時チェックしながら進めると、スムーズだろう。

さらに、 親切にもIgor Proのマクロ、functionについて書いてくれた個人ページが多数存在するので以下に紹介する。
http://www.nips.ac.jp/huinfo/documents/IGOR/igor01.html
また、私はGP-IB接続の測定機器をIgor Proで制御する際(Asylum AFMはその典型だが)、以下のsiteを参考にさせてもらった。

*ちなみにこんな事を書いているが、私はExcelでグラフを描いたことは人生で数回しかない。

スペクトル描画スクリプト

先程のスクリプトにグラフの描画機能を加えたもの

スペース、tab, commaなどで区切られた2つのデータファイルを基にスペクトル、差スペクトルの描画を行います。

 

#pragma rtGlobals=1		// Use modern global access method.
// simple macros for unit conversion 1st Aug 2011 by T.Hayashi
// A Macro for Data analysis implemented on 1st Aug 2011 by T. Hayashi

Menu  "Raman"
	Submenu "Calc"
			"WL2WN"
			"WN2WL"
	end
	Submenu "Analysis"
			"Draw"
			"Add"
			"Dif"
			"BGsub"
	end
End

function  WL2WN()
	variable laser=488,wl=500
	Prompt laser, "Laser(nm)"
	Prompt wl, "wavelength(nm)"
	DoPrompt "Wave length to Wave number",laser ,wl
	Print  wl, "nm  corresponds to Raman shift of",(1e7/laser)-(1e7/wl)," cm-1","(LASER:", laser,"nm)"
End

function  WN2WL()
	variable laser=488,wn=1400
	Prompt laser, "Laser(nm)"
	Prompt wn, "wavenumber(cm-1)"
	DoPrompt "Wave length to  Wave number",laser ,wn
	Print " Raman shift of",wn,"cm-1 appears at",1/((1e7/laser)-wn)*1e7," nm","(LASER:", laser,"nm)"
End

Function Draw()
	LoadWave/g/n/a=data
	spec1()
// Use "spec1" as a test script
end

Function Add()
	LoadWave/g/n/a=data
	spec2()
// Use "spec2" as a test script to append new data to the existing grapha
end

Function Dif()
	LoadWave/g/n/a=data, "signal + BG"
	LoadWave/g/n/a=bg, "BG"
	spec3()
End

Function BGsub()
	LoadWave/g/n/a=data, "signal + BG"
	LoadWave/g/n/a=bg, "BG"
	spec4()
End

//
// spec1 draws an initial graph
Function spec1()
	string  name
	variable laser=488
	Prompt name, "Data name"
	Prompt laser, "Excitation Laser"
	DoPrompt "Enter the data name",name,laser
//
	string int="_int",cm="_cm"
	Duplicate data0,wn_temp; duplicate data1,int_temp
	wn_temp=(1e7/laser)-(1e7/wn_temp)
	Duplicate wn_temp,$(name+cm); duplicate int_temp,$(name+int)
	killwaves data0,data1,wn_temp,int_temp
	AppendToTable  $(name+int),$(name+cm)
//Draw Graph
	display $(name+int) vs $(name+cm)
	Label bottom "Wavenumber (cm-1)"
	Label left "Intensity (total counts)"
	Legend/C/N=text0/F=0/A=MC
	ModifyGraph width=400,height=300
End

Function spec2()
//
	string  name
	variable laser=488
	Prompt name, "Data name"
	Prompt laser, "Excitation Laser"
	DoPrompt "Enter the data name",name,laser
//
	string int="_int",cm="_cm"
	Duplicate data0,wn_temp; duplicate data1,int_temp
	wn_temp=(1e7/laser)-(1e7/wn_temp)
	Duplicate wn_temp,$(name+cm); duplicate int_temp,$(name+int)
	killwaves data0,data1,wn_temp,int_temp
	AppendToTable  $(name+int),$(name+cm)
	AppendToGraph $(name+int) vs $(name+cm)
	Legend/C/N=text0/F=0/A=MC
End

Function spec3()
//
	string  name
	variable laser=488
	Prompt name, "Data name"
	Prompt laser, "Excitation Laser"
	DoPrompt "Enter the data name",name,laser
//
	string int="_int",cm="_cm"
	Duplicate data0,wn_temp; duplicate data1,int_temp
	Duplicate bg0,wnbg_temp; duplicate bg1,intbg_temp
	wn_temp=(1e7/laser)-(1e7/wn_temp)
	wnbg_temp=(1e7/laser)-(1e7/wnbg_temp)
	int_temp=int_temp-intbg_temp
	Duplicate wn_temp,$(name+cm); duplicate int_temp,$(name+int)
	killwaves data0,data1,bg0,bg1,wn_temp,int_temp,wnbg_temp,intbg_temp
//
	display $(name+int) vs $(name+cm)
	Label bottom "Wavenumber (cm-1)"
	Label left "difference in spectra (counts)]"
	Legend/C/N=text0/F=0/A=MC
	ModifyGraph width=400,height=300
End

Function spec4()
//
	string  name
	variable laser=488
	Prompt name, "Data name"
	Prompt laser, "Excitation Laser"
	DoPrompt "Enter the data name",name,laser
//
	string int="_int",cm="_cm"
	Duplicate data0,wn_temp; duplicate data1,int_temp
	Duplicate bg0,wnbg_temp; duplicate bg1,intbg_temp
	wn_temp=(1e7/laser)-(1e7/wn_temp)
	wnbg_temp=(1e7/laser)-(1e7/wnbg_temp)
	int_temp=int_temp-intbg_temp
	Duplicate wn_temp,$(name+cm); duplicate int_temp,$(name+int)
	killwaves data0,data1,bg0,bg1,wn_temp,int_temp,wnbg_temp,intbg_temp
//
	display $(name+int) vs $(name+cm)
	Label bottom "Wavenumber (cm-1)"
	Label left "Intensity (BG subtracted ) counts"
	Legend/C/N=text0/F=0/A=MC
	ModifyGraph width=400,height=300
End

wave numberをwave lengthに変換するプログラム

Igor Proで動作する波長(wave length)と波数を相互に変換する単純なマクロです。

Raman shiftをnm(またはその逆)に変換するために作りました。

プロシージャファイルにコピーしてコンパイルして使ってください。

#pragma rtGlobals=1		// Use modern global access method.
// simple macros for unit conversion 1st Aug 2011 by T.Hayashi

Menu  "Raman"
             Submenu "Calc"
                                     "WL2WN"
                                     "WN2WL"
             end
End

function  WL2WN()
	variable laser=488,wl=500
	Prompt laser, "Laser(nm)"
	Prompt wl, "wavelength(nm)"
	DoPrompt "Wave length to Wave number",laser ,wl
	Print  wl, "nm  corresponds to Raman shift of",(1e7/laser)-(1e7/wl)," cm-1","(LASER:", laser,"nm)"
End

function  WN2WL()
	variable laser=488,wn=1400
	Prompt laser, "Laser(nm)"
	Prompt wn, "wavenumber(cm-1)"
	DoPrompt "Wave length to  Wave number",laser ,wn
	Print " Raman shift of",wn,"cm-1 appears at",1/((1e7/laser)-wn)*1e7," nm","(LASER:", laser,"nm)"
End