Research Notes

T. Matsumura

  • ピークプロファイルのフィッティングに使ういろいろなIgorPro関数 LinkIcon
  • データ処理のためのIgorPro関数 LinkIcon

ピークプロファイルのフィッティングに使ういろいろなIgorPro関数

IgorPro functions used for peak-profile fitting

Lorentzian

Function Lorfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += w[1]*w[3]*(1/((x-w[2])^2+w[3]^2))/pi
return r
End

<< Parameters >>
w[0] : Bakcground,w[1] : Integral,w[2] : Center,w[3] : Width
この形のLorentzianを使うと,
PeakTop=w[1]/pi/w[3].Integral=w[1],FWHM=2*w[3]
の関係になる.積分値を扱いたいときにはわかりやすい.
Multi-Lorentzian peaksのときは次のようにピーク数を増やす.
Function Lorfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += w[1]*w[3]*(1/((x-w[2])^2+w[3]^2))/pi
r += w[4]*w[6]*(1/((x-w[5])^2+w[6]^2))/pi
return r
End
ちなみに,IgorPro組み込みのLorentzianは
w[0]+w[1]/((x-w[2])^2+w[3])
の形をしていて,
PeakTop=w[1],Integral=w[1]/sqrt(w[3])*pi,FWHM=2*sqrt(w[3])
である.ピーク値を扱いたいときはわかりやすい.

Gaussian

Function Gausfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += w[1]*(exp(-(x-w[2])^2/2/w[3]^2))/w[3]/sqrt(2*pi)
return r
End
<< Parameters >>
w[0] : Bakcground,w[1] : Integral,w[2] : Center,w[3] : Width
この形のGaussianを使うと,
PeakTop=w[1]/w[3]/sqrt(2*pi).Integral=w[1],FWHM=2*w[3]*sqrt(2*ln(2))=2.3548*w[3]
である.積分値を扱いたいときにはわかりやすい.
Multi-Gaussianのときは次のようにピーク数を増やす.
Function Gausfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += w[1]*(exp(-(x-w[2])^2/2/w[3]^2))/w[3]/sqrt(2*pi)
r += w[4]*(exp(-(x-w[5])^2/2/w[6]^2))/w[6]/sqrt(2*pi)
return r
End
ちなみに,IgorPro組み込みのGaussianは
w[0]+w[1]*exp(-((x-w[2])/w[3])^2)
の形をしていて,
PeakTop=w[1],Integral=w[1]*w[3]*sqrt(pi),FWHM=2*w[3]*sqrt(ln(2))=1.665*w[3]
である. ピーク値を扱いたいときはわかりやすい.

Squared-Lorentzian

Function SQLorfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += 2*w[1]*w[3]^3*(1/((x-w[2])^2+w[3]^2))^2/pi
return r
End

<< Parameters >>
w[0] : Bakcground,w[1] : Integral,w[2] : Center,w[3] : Width
この形のSquared-Lorentzianを使うと,
PeakTop=2*w[1]/w[3]/pi.Integral=w[1],FWHM=2*sqrt(sqrt(2)-1)*w[3]=1.2872*w[3]
である.積分値を扱いたいときにはわかりやすい.
Multi-squared-Lorentzianのときは次のようにピーク数を増やす.
Function SQLorfit(w,x)
Wave w; Variable x
Variable r=w[0]
r += 2*w[1]*w[3]^3*(1/((x-w[2])^2+w[3]^2))^2/pi
r += 2*w[4]*w[6]^3*(1/((x-w[5])^2+w[6]^2))^2/pi
return r
End


Asymmetric Squared-Lorentzian

Function ASQLorfit(w,x)
Wave w; Variable x
Variable r=w[0]
Variable npts= numpnts(w)
if(x<w[2])
r += 2*w[1]/w[3]*((1-w[4])*w[3])^4*(1/((x-w[2])^2+((1-w[4])*w[3])^2))^2/pi
elseif(x>=w[2])
r += 2*w[1]/w[3]*((1+w[4])*w[3])^4*(1/((x-w[2])^2+((1+w[4])*w[3])^2))^2/pi
endif
return r
End

<< Parameters >>
w[0] : Bakcground,w[1] : Integral,w[2] : Center,w[3] : Width,w[4] : asymmetry (-1 < w[4] < 1)
Multi-squared-Lorentzianのときは次のようにピーク数を増やす.

Function SQLorfit(w,x)
Wave w; Variable x
Variable r=w[0]
Variable npts= numpnts(w)
if(x<w[2])
r += 2*w[1]/w[3]*((1-w[4])*w[3])^4*(1/((x-w[2])^2+((1-w[4])*w[3])^2))^2/pi
elseif(x>=w[2])
r += 2*w[1]/w[3]*((1+w[4])*w[3])^4*(1/((x-w[2])^2+((1+w[4])*w[3])^2))^2/pi
endif
if(x<w[6])
r += 2*w[5]/w[7]*((1-w[4])*w[7])^4*(1/((x-w[6])^2+((1-w[4])*w[7])^2))^2/pi
elseif(x>=w[6])
r += 2*w[5]/w[7]*((1+w[4])*w[7])^4*(1/((x-w[6])^2+((1+w[4])*w[7])^2))^2/pi
endif
return r
End

pseudo-Voigt (Lorentzian + Gaussian)

Function pseudVoigt(w,x)
Wave w
Variable x
Variable r=w[0]
Variable i=1
// w[1]:intensity, w[2]:center, w[3]:Gamma(FWHM), w[4]:eta(G-L)
r+=w[1]*(2*w[4]/w[3]/pi/(1+4*((x-w[2])/w[3])^2)+2*(1-w[4])/w[3]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[2])/w[3])^2))
return r
End

<< Parameters >>
w[0] : Bakcground,w[1] : Integral, w[2] : Center, w[3] : FWHM(GaussianとLorentzianの半値全幅を共通にとる),w[4] : η-parameter(η=0のときGaussian,η=1のときLorentzian).
GaussianとLorentzianの重ね合わせ.それぞれの単独での積分値は規格化されているので,ηで重みが変わる.
Multi-squared-Lorentzianのときはi=5〜8のパラメータも使う.

Asymmetric pseudo-Voigt (Lorentzian + Gaussian)

Function Asym_pseudVoigt(w,x)
Wave w
Variable x
Variable r=w[0]
Variable i=1
// w[1]:intensity, w[2]:cen, w[3]:Gamma(FWHM), w[4]:eta(G-L), w[5]:asymmetry (-1 < w[5] < 1)
if(x<w[2])
r+=w[1]*(2*w[4]/w[3]/pi/(1+4*((x-w[2])/(1-w[5])/w[3])^2)+2*(1-w[4])/w[3]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[2])/(1-w[5])/w[3])^2))
elseif(x>=w[2])
r+=w[1]*(2*w[4]/w[3]/pi/(1+4*((x-w[2])/(1+w[5])/w[3])^2)+2*(1-w[4])/w[3]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[2])/(1+w[5])/w[3])^2))
endif
return r
End


Asymmetric pseudo-Voigt (Squared-Lorentzian and Gaussian)

Function Asym_psdVoigtSQLG(w,x)
Wave w
Variable x
Variable r=w[0]
Variable i=1, f=1/2/sqrt(sqrt(2) - 1)
// w[1]:intensity, w[2]:cen, w[3]:FWHM, w[4]:eta(G-SQL), w[5]:asymmetry
if(x<w[2])
r+=w[1]*(2*w[4]/f/w[3]/pi*((1-w[5])*f*w[3])^4*(1/((x-w[2])^2+((1-w[5])*f*w[3])^2))^2+2*(1-w[4])/w[3]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[2])/(1-w[5])/w[3])^2))
elseif(x>=w[2])
r+=w[1]*(2*w[4]/f/w[3]/pi*((1+w[5])*f*w[3])^4*(1/((x-w[2])^2+((1+w[5])*f*w[3])^2))^2+2*(1-w[4])/w[3]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[2])/(1+w[5])/w[3])^2))
endif
// w[6]:intensity, w[7]:cen, w[8]:FWHM, W[9]:eta(G-SQL), W[10]:asymmetry
if(x<w[7])
r+=w[6]*(2*w[9]/f/w[8]/pi*((1-w[10])*f*w[8])^4*(1/((x-w[7])^2+((1-w[10])*f*w[8])^2))^2+2*(1-W[9])/w[8]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[7])/(1-W[10])/w[8])^2))
elseif(x>=w[7])
r+=w[6]*(2*w[9]/f/w[8]/pi*((1+w[10])*f*w[8])^4*(1/((x-w[7])^2+((1+w[10])*f*w[8])^2))^2+2*(1-W[9])/w[8]*SQRT(ln(2)/pi)*exp(-4*ln(2)*((x-w[7])/(1+W[10])/w[8])^2))
endif
// r+=w[11]*(exp(-(x-w[12])^2/2/w[13]^2))/w[13]/sqrt(2*pi)

return r
End

台形型関数

Function hill(w,x)
Wave w; Variable x
Variable r=w[1]
r += (w[0]-w[1])/(1+(w[3]/(x-w[2]))^w[4])
return r
End

<< Parameters >>
w[0] : 両サイドのy値, w[1] : 中心部分のy値, w[2] : 中心のx値, w[3] : 幅, w[4] : 壁の鋭さ.偶数で固定.大きいほど急峻.

データ処理で使えるその他のIgorPro関数

データ点の間引き

Function decimate(xWave,yWave)
Wave xWave,yWave
Variable pinit,pfinish,int=1

silent 1
if (numpnts(xWave)==numpnts(ywave))
if (pcsr(A)<pcsr(B))
Duplicate/O xWave xdummy
Duplicate/O yWave ydummy
pinit=pcsr(A)
pfinish=pcsr(B)
Variable pdel
pdel=pinit+1
do
deletepoints pdel,1,xdummy,ydummy
pfinish=pfinish-1
pdel=pdel+int
while (pdel<=pfinish)
duplicate/O xdummy xWave
duplicate/O ydummy yWave
killwaves xdummy,ydummy
else
print "pcsr(A) must be lower than pcsr(B)"
endif
else
print "your wave selection is wrong!!"
endif
EndMacro

データ点の平均化と結合

Function bindata(xwave,ywave,errwave,nbin)
wave xwave,ywave,errwave
variable nbin
duplicate/O xwave xx
duplicate/O ywave yy
duplicate/O errwave err
duplicate/O err err2; err2=err^2
Make/O/N=(numpnts(xx)/nbin)/D xbin,ybin,errbin
variable ii=0
do
xbin[ii]=sum(xx,ii*nbin,(ii+1)*nbin-1)/nbin
ybin[ii]=sum(yy,ii*nbin,(ii+1)*nbin-1)/nbin
errbin[ii]=sqrt(sum(err2,ii*nbin,(ii+1)*nbin-1))/nbin
ii+=1
while(ii*nbin<=numpnts(xx)-nbin)
duplicate/O xbin xx
duplicate/O ybin yy
duplicate/O errbin err
End