IGOR pro プログラミング備忘録:複数のデータを一括処理

通し番号がついたデータを一気に扱いたい

IGORに限らず色々な言語を使っていて需要が多くあるのが、

  • xxx_00
  • xxx_01
  • xxx_02

という風に「共通の名前 + 通し番号」という名前のデータに対する一括処理ではないでしょうか。
特にIGORはデータ解析に用いられるソフトですので、大量に実験したデータを同じ方法でまとめて処理したい……なんてことは良くある話ですね。
例えば、

  • 全ての実験データ(wave)に共通して100のバックグラウンドがあるからまとめて引き算したい
  • 全ての実験データ(wave)の平均値を求めたい

なんていう場合に、自動でwave名を取得する必要があります。
というわけで、今回は「共通名称 + 通し番号」のデータを一気に扱うためのプログラム例をご紹介します。
プログラミング的には基礎の基礎ともいえる内容ですが、例えば大学4年生で研究室に入っていきなりIGOR proを触る必要が出てきた、というような方には役に立つと思います。
とりあえず今回は解説を載せませんので、コピーして便利に利用して下さい。

なんらかの一括処理をする一般的な形

function Ikkatsu_shori_1(head, from, to)//headは共通部分、fromとtoは通し番号の始まりと終わり
	string head
	variable from, to
	variable i
	string current_name
	for(i=from;i<=to;i+=1)
		sprintf current_name,"%s_%d", head, i
		//↑ もし、通し番号が一桁の場合でも"xxx_1"ではなく"xxx_01"のように二ケタになっている場合、%dのところを%02dや%03dとする
		WAVE current_wave = :$current_name
		
		/////////////////////////////////////
		//
		//          ここに処理を書く
		//
		/////////////////////////////////////		
	endfor
end
なお、行番号は後々の解説用に便宜上表示させているだけです。

応用例: 通し番号がついたwaveを平均する

function Ikkatsu_shori_Average(head, from, to)//headは共通部分、fromとtoは通し番号の始まりと終わり
	string head
	variable from, to
	variable i
	string current_name
	
	string savename
	sprintf savename,"average_%s",head//平均値を保存するwave名の準備
	
	for(i=from;i<=to;i+=1)
		sprintf current_name,"%s_%d", head, i
		//もし、通し番号が一桁の場合でも"xxx_1"ではなく"xxx_01"のように二ケタになっている場合、%dのところを%02dや%03dとする
		WAVE current_wave = :$current_name
		
		if(i==from)//平均値を保存するwaveそのものの準備
			duplicate/O $current_name $savename
			WAVE savewave = :$savename
			savewave = 0
		endif
		
		savewave += current_wave //左辺に右辺を足す、という意味の式
		
	endfor
	savewave /= (to - from + 1)
end

使用上の注意

今回紹介したプログラムはできるだけシンプルに書くため、例えば通し番号の大小や入力されたwaveが存在しない場合など、実際の利用において考えられる様々な例外に対する処理を一切行っていません。

プログラムの解説

このプログラムを理解し、自力で組めるようになるための解説記事は、現在連載中です。IGORプログラミングの初歩の初歩から解説していきますので、お楽しみに!

Follow me!

IGOR pro プログラミング備忘録:複数のデータを一括処理” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。