1 #pragma rtGlobals=3 // Use modern global access method and strict wave access. 2 #pragma IgorVersion = 6.2 3 #pragma ModuleName = PearlFitFuncs 5 #include "mm-physconst" 48 variable np = numpnts(w)
51 variable v = w[0] + x * w[1]
52 for (ip = 2; ip < np; ip += 3)
53 v += w[ip] * exp( -( (x - w[ip+1]) / w[ip+2] )^2 )
84 variable np = numpnts(pw)
87 yw = pw[0] + xw[p] * pw[1]
88 for (ip = 2; ip < np; ip += 3)
89 yw += pw[ip] * exp( -( (xw[p] - pw[ip+1]) / pw[ip+2] )^2 )
122 yw = pw[0] + xw[p] * pw[1]
123 yw += pw[2] * exp( -( (xw[p] - pw[4] - pw[5] /2) / pw[6] )^2 )
124 yw += pw[2] * pw[3] * exp( -( (xw[p] - pw[4] + pw[5] /2) / pw[6] / pw[7] )^2 )
148 variable np = numpnts(w)
151 variable v = w[0] + x * w[1]
152 for (ip = 2; ip < np; ip += 4)
153 v += w[ip] * VoigtFunc((x - w[ip+1]) / w[ip+2], w[ip+3])
182 nom = cos(pi * sing / 2 + (1 - sing) * atan((x - pos) / fwhm * 2))
183 denom = ((x - pos)^2 + fwhm^2 / 4)^((1 - sing) / 2)
185 return amp * nom / denom * fwhm / 2
205 variable np = numpnts(w)
208 variable v = w[0] + x * w[1]
209 for (ip = 2; ip < np; ip += 4)
217 threadsafe function
ds1_bg(w, x): FitFunc
240 threadsafe function
ds2_bg(w,x) : FitFunc
265 return w[0] + ds1 + ds2
297 Variable ds1, ds2, ds3, ds4
298 ds1=( w[1]*cos(pi*w[3]/2+(1-w[3])*atan((x-w[2])/w[4])))/(((x-w[2])^2+w[4]^2)^((1-w[3])/2))
299 ds2=( w[5]*cos(pi*w[7]/2+(1-w[7])*atan((x-w[6])/w[8])))/(((x-w[6])^2+w[8]^2)^((1-w[7])/2))
300 ds3=( w[9]*cos(pi*w[11]/2+(1-w[11])*atan((x-w[10])/w[12])))/(((x-w[10])^2+w[12]^2)^((1-w[11])/2))
301 ds4=( w[13]*cos(pi*w[15]/2+(1-w[15])*atan((x-w[14])/w[16])))/(((x-w[14])^2+w[16]^2)^((1-w[15])/2))
304 return w[0]+ds1+ds2+ds3+ds4
358 Variable ds1, ds2, ds3, ds4, ds5, ds6
359 ds1=( w[1]*cos(pi*w[3]/2+(1-w[3])*atan((x-w[2])/w[4])))/(((x-w[2])^2+w[4]^2)^((1-w[3])/2))
360 ds2=( w[5]*cos(pi*w[7]/2+(1-w[7])*atan((x-w[6])/w[8])))/(((x-w[6])^2+w[8]^2)^((1-w[7])/2))
361 ds3=( w[9]*cos(pi*w[11]/2+(1-w[11])*atan((x-w[10])/w[12])))/(((x-w[10])^2+w[12]^2)^((1-w[11])/2))
362 ds4=( w[13]*cos(pi*w[15]/2+(1-w[15])*atan((x-w[14])/w[16])))/(((x-w[14])^2+w[16]^2)^((1-w[15])/2))
363 ds5=( w[17]*cos(pi*w[19]/2+(1-w[19])*atan((x-w[18])/w[20])))/(((x-w[18])^2+w[20]^2)^((1-w[19])/2))
364 ds6=( w[21]*cos(pi*w[23]/2+(1-w[23])*atan((x-w[22])/w[24])))/(((x-w[22])^2+w[24]^2)^((1-w[23])/2))
366 return w[0]+ds1+ds2+ds3+ds4+ds5+ds6
380 variable oversampling
422 variable precision = s.precision
423 variable oversampling = s.oversampling
425 if (WaveExists(s.xdw))
428 wave broadening = s.broadening
429 wave convolution = s.convolution
431 make /n=0 /free xdw, model, broadening, convolution
432 redimension /d xdw, model, broadening, convolution
434 wave fs.model = model
435 wave fs.broadening = broadening
436 wave fs.convolution = convolution
440 differentiate /p xw /d=xdw
442 variable xd = wavemin(xdw) / oversampling
445 variable x0b = pw[6] * precision
446 variable nb = 2 * floor(x0b / xd) + 1
449 variable x0m = max(abs(wavemax(xw) - pw[1]), abs(wavemin(xw) - pw[1])) + x0b
450 variable nm = 2 * floor(x0m / xd) + 1
451 nb = min(nb, nm * 10)
454 redimension /n=(nb) broadening
455 redimension /n=(nm) model
456 setscale/i x -x0b, x0b, "", broadening
457 setscale/i x -x0m, x0m, "", model
459 broadening = exp( - (x / pw[6])^2 * 4 * ln(2))
460 variable nrm = area(broadening)
466 Convolve /a broadening, model
467 variable scale = pw[0] / wavemax(model)
472 x0m = xd * (nm - 1) / 2
473 setscale/i x -x0m, x0m, "", model
475 yw = model(xw[p] - pw[1]) + pw[7] + pw[8] * xw[p]
476 yw = numtype(yw) ? 0 : yw
512 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
513 if (DataFolderRefStatus(df) == 0)
514 newdatafolder root:packages:pearl_fitfuncs:doniach_sunjic
515 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
518 wave /z /sdfr=df fs.xdw = xdw
519 wave /z /sdfr=df fs.model = model
520 wave /z /sdfr=df fs.broadening = broadening
521 wave /z /sdfr=df fs.convolution = convolution
523 if (WaveExists(fs.xdw) == 0)
524 dfref savedf = GetDataFolderDFR()
526 make /n=0 /d xdw, model, broadening, convolution
528 wave fs.model = model
529 wave fs.broadening = broadening
530 wave fs.convolution = convolution
551 duplicate /free pw, fs.pw
552 duplicate /free yw, fs.xw
554 duplicate /free yw, fs.yw
576 duplicate /free pw, fs.pw
578 duplicate /free xw, fs.xw
580 duplicate /free yw, fs.xw
583 duplicate /free yw, fs.yw
585 variable v_chisq = nan
586 variable V_FitMaxIters = 100
587 make /n=1 /t /free constraints = {
"K0 >= 0",
"K2 > 0",
"K2 < 10",
"K3 >= 0",
"K3 < 1",
"K4 >= -10",
"K4 <= 10",
"K5 >= 0",
"K5 <= 1",
"K6 >= 0",
"K6 < 10"}
589 FuncFit /NTHR=1
DoniachSunjicBroadS, pw, yw /X=xw /D /STRC=fs /C=constraints /NWOK /I=1 /W=ww
618 variable np = numpnts(w)
630 variable vc1, vc2, vc3, vc4
631 vc2 = 2 * sqrt(ln(2)) / w[ip0-1]
632 for (ip = ip0; ip < np; ip += 3)
633 vc1 = w[ip] / sqrt(pi) * vc2
635 vc4 = vc2 * w[ip+2] / 2
636 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
660 variable bg = w[0] + w[1] * x
667 vc2 = 2 * sqrt(ln(2)) / w[2]
670 vc1 = w[3] / sqrt(pi) * vc2
673 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
676 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
679 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
682 vc1 = w[6] / sqrt(pi) * vc2
685 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
688 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
691 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
701 duplicate /free coef_wave, coef1, coef2
703 coef2[3] *= coef_wave[9]
704 coef2[4] += coef_wave[10]
705 coef2[6] *= coef_wave[9]
706 coef2[7] += coef_wave[10]
709 string s_fit_wave = NameOfWave(fit_wave)
710 string s_fit_p1 = s_fit_wave +
"_p1" 711 string s_fit_p2 = s_fit_wave +
"_p2" 712 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
713 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
718 string traces = TraceNameList(
"",
";", 1)
719 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
720 appendtograph fit_p1, fit_p2
721 ModifyGraph lstyle($s_fit_p1)=2
722 ModifyGraph lstyle($s_fit_p2)=2
723 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
724 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
747 variable bg = w[0] + w[1] * x
754 vc2 = 2 * sqrt(ln(2)) / w[2]
757 vc1 = w[3] / sqrt(pi) * vc2
760 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
763 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
766 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
769 vc1 = w[3] / sqrt(pi) * vc2 * w[11]
772 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
775 vc1 = w[6] / sqrt(pi) * vc2
778 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
781 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
784 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
787 vc1 = w[6] / sqrt(pi) * vc2 * w[11]
790 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
800 duplicate /free coef_wave, coef1, coef2, coef3
804 coef2[3] *= coef_wave[9]
805 coef2[4] += coef_wave[10]
806 coef2[6] *= coef_wave[9]
807 coef2[7] += coef_wave[10]
811 coef3[3] *= coef_wave[11]
812 coef3[4] += coef_wave[12]
813 coef3[6] *= coef_wave[11]
814 coef3[7] += coef_wave[12]
818 string s_fit_wave = NameOfWave(fit_wave)
819 string s_fit_p1 = s_fit_wave +
"_p1" 820 string s_fit_p2 = s_fit_wave +
"_p2" 821 string s_fit_p3 = s_fit_wave +
"_p3" 822 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
823 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
824 duplicate /o fit_wave, $(s_fit_p3) /wave=fit_p3
830 string traces = TraceNameList(
"",
";", 1)
831 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
832 appendtograph fit_p1, fit_p2, fit_p3
833 ModifyGraph lstyle($s_fit_p1)=2
834 ModifyGraph lstyle($s_fit_p2)=2
835 ModifyGraph lstyle($s_fit_p3)=2
836 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
837 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
838 ModifyGraph rgb($s_fit_p3)=(0,0,65280)
855 variable precision_g = 5
856 variable oversampling = 4
859 duplicate /free xw, xdw
860 differentiate /p xw /d=xdw
862 variable xd = wavemin(xdw) / oversampling
865 variable x0g = abs(pw[5]) * precision_g
866 variable ng = 2 * floor(x0g / xd) + 1
869 variable emax = wavemax(xw)
870 variable emin = wavemin(xw)
871 variable x0f = max(abs(emax - pw[3]), abs(emin - pw[3])) + x0g
872 variable ne = 2 * floor(x0f / xd) + 1
875 make /d /n=(ng) /free gausswave
876 make /d /n=(ne) /free fermiwave
877 setscale/i x -x0g, x0g,
"", gausswave
878 setscale/i x -x0f, x0f,
"", fermiwave
880 gausswave = exp( - (x / pw[5] )^2 )
881 fermiwave = 1 / (exp( x / (kBoltzmann * pw[4])) + 1.0 )
884 duplicate /free fermiwave, resultwave
885 Convolve /a gausswave, resultwave
886 variable rmax = wavemax(resultwave)
890 ng = numpnts(resultwave)
891 x0g = xd * (ng - 1) / 2
892 setscale/i x -x0g, x0g,
"", resultwave
894 yw = pw[2] * resultwave(xw[p] - pw[3]) + pw[0] + pw[1] * xw[p]
threadsafe variable MultiGaussLinBG(wave w, variable x)
multiple gaussian peaks on a linear background fit function.
threadsafe variable DoubletGaussLinBG_AO(wave pw, wave yw, wave xw)
doublet gaussian peaks on a linear background fit function (all at once).
variable DoniachSunjicBroad(wave pw, wave yw, wave xw)
threadsafe variable MultiGaussLinBG_AO(wave pw, wave yw, wave xw)
multiple gaussian peaks on a linear background fit function (all at once).
variable ds4_bg(wave w, variable x)
variable FermiGaussConv(wave pw, wave yw, wave xw)
convolution of Fermi-Dirac distribution and a Gaussian.
threadsafe variable DoniachSunjicBroadS(DoniachSunjicStruct *s)
threadsafe variable DoniachSunjic(variable x, variable amp, variable pos, variable sing, variable fwhm)
Doniach-Sunjic line shape.
variable Au4f(wave w, variable x)
variable Au4f_2p3(wave w, variable x)
variable Au4f_2p2(wave w, variable x)
variable ShowComponents_Au4f_2p2(wave coef_wave, wave fit_wave)
variable Calc_DoniachSunjicBroad(wave pw, wave yw)
variable ShowComponents_Au4f_2p3(wave coef_wave, wave fit_wave)
variable Fit_DoniachSunjicBroad(wave pw, wave yw, wave xw, wave ww)
threadsafe variable ds2_bg(wave w, variable x)
variable ds6_bg(wave w, variable x)
variable MultiDoniachSunjicLinBG(wave w, variable x)
multiple doniach-sunjic peaks on a linear background fit function.
threadsafe variable ds1_bg(wave w, variable x)
variable MultiVoigtLinBG(wave w, variable x)
multiple voigt peaks on a linear background fit function.