データ解析のためのIgorPro活用術

複数の系統的なデータをシステマティックにフィッティングさせる

このIgorPro のProcedureはある関数でグラフ上にある複数のwaveを一度にフィッティングし、N回目に フィッティングを行ったパラメータを別のwaveのNポイント目に記録するというものです。

Programの内容

使用方法

  1. フィッティングしたいwavesをグラフ上に表示させ、そのグラフをActiveWindowにする。 なお、maketestwaves()を実行すると以下のようなグラフが表示されます。
  2. GraphのReorderTracesを実行し、フィッティングさせたい順序に並べ替える。
  3. pre_analysis()を実行し、フィティングパラメータ及び誤差を格納するwavesを作成する。
  4. 最後にsystematicanalysis()を実行する。すると、それぞれのフィッティングパラメータが Out_0, _1,... に出力されている

カスタマイズ、その他

  1. CurveFit のところで目的にあったコマンドに書き換えましょう。またそれに応じてOut_..やSigma_..の 数も変更しましょう。
  2. x軸に別のwaveを指定したい場合はpre_analysis()のAppendToGraphの箇所、及びsystematicanalysis()のCurveFitのところを修正しましょう。
    ※ここでは全てのy軸を表示させるwaveは同じx軸のwaveを用いているということを想定しています。
ここからProcedureです。
/////////////////////////////////////////////////
// This procedure is for systematical fitting 
// of all waves in the active graph
//    created by M. Nagai on May., 1997,
//    modified on March. 1, 2003 
/////////////////////////////////////////////////

Macro maketestwaves()   //make waves for demonstration
  String www="wave_"
  String www1
  iterate(10)
    www1=www+num2istr(i)
    Make/D/O $www1
    $www1=exp(-(x-5*i-40)^2/(10+i*10))
  loop
  Display wave_0,wave_1,wave_2,wave_3,wave_4,wave_5,wave_6,wave_7,wave_8,wave_9
EndMacro


Macro pre_analysis()  //procedure before systematical fitting
  String ywavename
  Variable Num=0, yNum=0, gotwave,gots, gotfit=0
  Silent 1
  PauseUpDate
  
  //  enumerate the waves on the top graph window
  do
    ywavename= WaveName("",Num,1)
    gotwave=cmpstr(ywavename, "")
    gots=strsearch(ywavename,"fit_wave",0)
    if(gotwave!=0)
       if(gots<0)
    	    yNum+=1
    	 else 
    	    gotfit=1
    	 endif
    endif
    Num+=1
  while (gotwave)
  
  //make destination wave of coefficients and sigma
    Make/N=(yNum)/D/O Out_0, Out_1, Out_2, Out_3
    Make/N=(yNum)/D/O Sigma_0, Sigma_1, Sigma_2, Sigma_3

  //if there is no destination wave of fitting("fit_wave") on the top graph window, 
  //    make wave and add it into the top graph window
  if (gotfit==0)
  ywavename= WaveName("",0,1)
    Duplicate/O $ywavename fit_wave
    AppendToGraph fit_wave
    ModifyGraph rgb(fit_wave)=(0,0,52224)
  endif

EndMacro



Macro systematicanalysis()  //main procedure
  String ywavename,message
  Variable gotwave,gots, Num=0
  Silent 1
  DoUpDate

  do
    ywavename= WaveName("",Num,1)
    gotwave=cmpstr(ywavename, "")
    gots=strsearch(ywavename,"fit_wave",0)
    
    if(gotwave!=0)
       if(gots<0)
         ModifyGraph rgb=(65535,65535,65535)
         ModifyGraph rgb($ywavename)=(65535,0,0)
         ModifyGraph rgb(fit_wave)=(0,0,65535)

         CurveFit/Q gauss $ywavename /D=fit_wave
         
         message=ywavename+",  Coef=("+num2str(W_coef[0])+",  "
         message+=num2str(W_coef[1])+",  "+num2str(W_coef[2])+",  "+num2str(W_coef[3])+") "
         print message
       endif
    endif
    
    //write coefficients and sigmas in destination waves
    Out_0[Num]=W_coef[0]
    Out_1[Num]=W_coef[1]
    Out_2[Num]=W_coef[2]
    Out_3[Num]=W_coef[3]
    Sigma_0[Num]=W_sigma[0]
    Sigma_1[Num]=W_sigma[1]
    Sigma_2[Num]=W_sigma[2]
    Sigma_3[Num]=W_sigma[3]
    Num+=1
  while (gotwave)
  
  ModifyGraph rgb=(65535,0,0)
EndMacro


ここまで
最終更新日: 2003.3.1
一つ上の項目に戻る