パーソナルツール
現在位置: 研究関連 / その他の話題 / スペクトルフィット

スペクトルフィット

奥村先生のスペクトルのフィットを見ていたら、普段使っている道具でやってみたくなったのでやってみた。

普段使っているのがIgor Proなので、今回もそれで。データは、mikageさんの放射線スペクトル表示ツールの、FN-401の牛乳のスペクトル測定より。

 

奥村先生が、バックグラウンドを2次関数で、ピーク3つはそれぞれガウス型でやっておられるので、同じもので試してみる。データのチャンネル250から450のデータを切り出したものを作った。ch1が横軸、data3が縦軸。

表示の時に、成分ごとに分けられるように、プロシージャを定義。

// Fitting function
Function testfit(pw, x)
	wave pw
	Variable x

	Variable bg, g1, g2, g3
	bg = background(x, pw[0], pw[1], pw[2])
	g1 = gaussian(x, pw[3], pw[4], pw[5])		// intensity, position, width
	g2 = gaussian(x, pw[6], pw[7], pw[8])
	g3 = gaussian(x, pw[9], pw[10], pw[11])
	return bg + g1 + g2 + g3
End

// Gaussian
Function/D gaussian(x, a, w, s)
	Variable/D x, a, w, s

	return a*exp(-(x - w)^2/(2*s^2))
End

// background
Function/D background(x, a, b, c)
	Variable x, a, b, c
	
	return a*(x-b)^2 + c

End

バックグラウンドとガウス3つ合わせて合計12個のパラメータが必要なので、pwという名前で要素数12のwave(Igorの1次元データの呼び名)を作る。

 パラメータを変えたら、フィッティングの各成分も再計算されて表示されるように、依存関係を以下のように定義。

totalにフィッティング結果が、bgがバックグラウンド、g1〜g3がガウス関数。これらもデータのグラフに重ねて表示。

 

Make/N=203/D total,bg,g1,g2,g3
Make/N=12/D pw
total := testfit(pw, ch1)
bg := background(ch1, pw[0], pw[1], pw[2])
g1 := gaussian(ch1, pw[3], pw[4], pw[5])
g2 := gaussian(ch1, pw[6], pw[7], pw[8])
g3 := gaussian(ch1, pw[9], pw[10], pw[11])

pwを表示させ、適当に初期値を入れて、スペクトルと似た感じにする。そのあと、Igorの自動フィットに突っ込みます。 

・FuncFit/NTHR=0 testfit pw  data3 /X=ch1 /D=total 
  Fit converged properly
  total= testfit(pw,ch1[p])
  pw={0.00085548,454.34,14.485,17.496,299.87,7.01,18.037,328.67,8.1666,16.425,392.8,8.6145}
  V_chisq= 5822.14;V_npnts= 203;V_numNaNs= 0;V_numINFs= 0;
  V_startRow= 0;V_endRow= 202;
  W_sigma={0.000174,21.7,1.33,2.09,0.966,1.06,2.02,1.01,1.19,1.86,1.07,1.23}
  Coefficient values ア one standard deviation
  	pw_0 	=0.00085548 ア 0.000174
  	pw_1 	=454.34 ア 21.7
  	pw_2 	=14.485 ア 1.33
  	pw_3 	=17.496 ア 2.09     ←ガウス1のピークの高さ
  	pw_4 	=299.87 ア 0.966    ←ガウス1の位置
  	pw_5 	=7.01 ア 1.06       ←ガウス1の幅
  	pw_6 	=18.037 ア 2.02     ←ガウス2のピークの高さ
  	pw_7 	=328.67 ア 1.01     ←ガウス2の位置
  	pw_8 	=8.1666 ア 1.19     ←ガウス2の幅
  	pw_9 	=16.425 ア 1.86     ←ガウス3のピークの高さ
  	pw_10	=392.8 ア 1.07      ←ガウス3の位置
  	pw_11	=8.6145 ア 1.23     ←ガウス3の幅

 結果で文字化けしてるのは±の記号です。Macのソフトなので、フォントが違うとこういうことに……昔からコレです(汗)。

フィッティング結果はこんな感じ。

フィッティング結果

 赤がデータに対するベストフィット、黒がバックグラウンド。ガウス型と仮定した成分は、緑、オレンジ、紫で、一緒に表示させています。

 

 Igorは、非線形最小自乗法のアルゴリズムとして、Levenberg-Marquardt algorithmを用いていますが、この程度には分離できます。

 面積を出して、パラメータの誤差から面積の誤差まで求めないといけないのですが、ちょっと時間が無いので今日はここまで。