1 #pragma TextEncoding = "UTF-8"
2 #pragma rtGlobals=3 // Use modern global access method and strict wave access.
3 #pragma IgorVersion = 6.2
4 #pragma ModuleName = PearlFitFuncs
6 #include "mm-physconst"
49 variable np = numpnts(w)
52 variable v = w[0] + x * w[1]
53 for (ip = 2; ip < np; ip += 3)
54 v += w[ip] * exp( -( (x - w[ip+1]) / w[ip+2] )^2 )
85 variable np = numpnts(pw)
88 yw = pw[0] + xw[p] * pw[1]
89 for (ip = 2; ip < np; ip += 3)
90 yw += pw[ip] * exp( -( (xw[p] - pw[ip+1]) / pw[ip+2] )^2 )
123 yw = pw[0] + xw[p] * pw[1]
124 yw += pw[2] * exp( -( (xw[p] - pw[4] - pw[5] /2) / pw[6] )^2 )
125 yw += pw[2] * pw[3] * exp( -( (xw[p] - pw[4] + pw[5] /2) / pw[6] / pw[7] )^2 )
162 yw = pw[0] + xw[p] * pw[1]
164 yw += pw[2] * exp( -( (xw[p] - pw[6]) / pw[9] )^2 )
166 yw += pw[3] * exp( -( (xw[p] - pw[6] - pw[8]) / pw[10] )^2 )
168 yw += pw[2] * pw[4] * exp( -( (xw[p] - pw[6] - pw[7]) / pw[9] )^2 )
170 yw += pw[3] * pw[5] * exp( -( (xw[p] - pw[6] - pw[7] - pw[8]) / pw[10] )^2 )
194 variable np = numpnts(w)
197 variable v = w[0] + x * w[1]
198 for (ip = 2; ip < np; ip += 4)
199 v += w[ip] * VoigtFunc((x - w[ip+1]) / w[ip+2], w[ip+3])
229 variable np = numpnts(pw)
232 yw = pw[0] + xw[p] * pw[1]
233 for (ip = 2; ip < np; ip += 4)
234 yw += pw[ip] * VoigtFunc((xw[p] - pw[ip+1]) / pw[ip+2], pw[ip+3])
261 nom = cos(pi * sing / 2 + (1 - sing) * atan((x - pos) / fwhm * 2))
262 denom = ((x - pos)^2 + fwhm^2 / 4)^((1 - sing) / 2)
264 return amp * nom / denom * fwhm / 2
284 variable np = numpnts(w)
287 variable v = w[0] + x * w[1]
288 for (ip = 2; ip < np; ip += 4)
296 threadsafe function
ds1_bg(w, x): FitFunc
319 threadsafe function
ds2_bg(w,x) : FitFunc
344 return w[0] + ds1 + ds2
376 Variable ds1, ds2, ds3, ds4
377 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))
378 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))
379 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))
380 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))
383 return w[0]+ds1+ds2+ds3+ds4
437 Variable ds1, ds2, ds3, ds4, ds5, ds6
438 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))
439 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))
440 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))
441 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))
442 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))
443 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))
445 return w[0]+ds1+ds2+ds3+ds4+ds5+ds6
459 variable oversampling
501 variable precision = s.precision
502 variable oversampling = s.oversampling
504 if (WaveExists(s.xdw))
507 wave broadening = s.broadening
508 wave convolution = s.convolution
510 make /n=0 /free xdw, model, broadening, convolution
511 redimension /d xdw, model, broadening, convolution
513 wave fs.model = model
514 wave fs.broadening = broadening
515 wave fs.convolution = convolution
519 differentiate /p xw /d=xdw
521 variable xd = wavemin(xdw) / oversampling
524 variable x0b = pw[6] * precision
525 variable nb = 2 * floor(x0b / xd) + 1
528 variable x0m = max(abs(wavemax(xw) - pw[1]), abs(wavemin(xw) - pw[1])) + x0b
529 variable nm = 2 * floor(x0m / xd) + 1
530 nb = min(nb, nm * 10)
533 redimension /n=(nb) broadening
534 redimension /n=(nm) model
535 setscale/i x -x0b, x0b, "", broadening
536 setscale/i x -x0m, x0m, "", model
538 broadening = exp( - (x / pw[6])^2 * 4 * ln(2))
539 variable nrm = area(broadening)
545 Convolve /a broadening, model
546 variable scale = pw[0] / wavemax(model)
551 x0m = xd * (nm - 1) / 2
552 setscale/i x -x0m, x0m, "", model
554 yw = model(xw[p] - pw[1]) + pw[7] + pw[8] * xw[p]
555 yw = numtype(yw) ? 0 : yw
591 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
592 if (DataFolderRefStatus(df) == 0)
593 newdatafolder root:packages:pearl_fitfuncs:doniach_sunjic
594 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
597 wave /z /sdfr=df fs.xdw = xdw
598 wave /z /sdfr=df fs.model = model
599 wave /z /sdfr=df fs.broadening = broadening
600 wave /z /sdfr=df fs.convolution = convolution
602 if (WaveExists(fs.xdw) == 0)
603 dfref savedf = GetDataFolderDFR()
605 make /n=0 /d xdw, model, broadening, convolution
607 wave fs.model = model
608 wave fs.broadening = broadening
609 wave fs.convolution = convolution
630 duplicate /free pw, fs.pw
631 duplicate /free yw, fs.xw
633 duplicate /free yw, fs.yw
655 duplicate /free pw, fs.pw
657 duplicate /free xw, fs.xw
659 duplicate /free yw, fs.xw
662 duplicate /free yw, fs.yw
664 variable v_chisq = nan
665 variable V_FitMaxIters = 100
666 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"}
668 FuncFit /NTHR=1
DoniachSunjicBroadS, pw, yw /X=xw /D /STRC=fs /C=constraints /NWOK /I=1 /W=ww
697 variable np = numpnts(w)
709 variable vc1, vc2, vc3, vc4
710 vc2 = 2 * sqrt(ln(2)) / w[ip0-1]
711 for (ip = ip0; ip < np; ip += 3)
712 vc1 = w[ip] / sqrt(pi) * vc2
714 vc4 = vc2 * w[ip+2] / 2
715 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
739 variable bg = w[0] + w[1] * x
746 vc2 = 2 * sqrt(ln(2)) / w[2]
749 vc1 = w[3] / sqrt(pi) * vc2
752 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
755 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
758 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
761 vc1 = w[6] / sqrt(pi) * vc2
764 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
767 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
770 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
780 duplicate /free coef_wave, coef1, coef2
782 coef2[3] *= coef_wave[9]
783 coef2[4] += coef_wave[10]
784 coef2[6] *= coef_wave[9]
785 coef2[7] += coef_wave[10]
788 string s_fit_wave = NameOfWave(fit_wave)
789 string s_fit_p1 = s_fit_wave +
"_p1"
790 string s_fit_p2 = s_fit_wave +
"_p2"
791 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
792 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
797 string traces = TraceNameList(
"",
";", 1)
798 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
799 appendtograph fit_p1, fit_p2
800 ModifyGraph lstyle($s_fit_p1)=2
801 ModifyGraph lstyle($s_fit_p2)=2
802 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
803 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
826 variable bg = w[0] + w[1] * x
833 vc2 = 2 * sqrt(ln(2)) / w[2]
836 vc1 = w[3] / sqrt(pi) * vc2
839 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
842 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
845 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
848 vc1 = w[3] / sqrt(pi) * vc2 * w[11]
851 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
854 vc1 = w[6] / sqrt(pi) * vc2
857 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
860 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
863 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
866 vc1 = w[6] / sqrt(pi) * vc2 * w[11]
869 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
879 duplicate /free coef_wave, coef1, coef2, coef3
883 coef2[3] *= coef_wave[9]
884 coef2[4] += coef_wave[10]
885 coef2[6] *= coef_wave[9]
886 coef2[7] += coef_wave[10]
890 coef3[3] *= coef_wave[11]
891 coef3[4] += coef_wave[12]
892 coef3[6] *= coef_wave[11]
893 coef3[7] += coef_wave[12]
897 string s_fit_wave = NameOfWave(fit_wave)
898 string s_fit_p1 = s_fit_wave +
"_p1"
899 string s_fit_p2 = s_fit_wave +
"_p2"
900 string s_fit_p3 = s_fit_wave +
"_p3"
901 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
902 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
903 duplicate /o fit_wave, $(s_fit_p3) /wave=fit_p3
909 string traces = TraceNameList(
"",
";", 1)
910 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
911 appendtograph fit_p1, fit_p2, fit_p3
912 ModifyGraph lstyle($s_fit_p1)=2
913 ModifyGraph lstyle($s_fit_p2)=2
914 ModifyGraph lstyle($s_fit_p3)=2
915 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
916 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
917 ModifyGraph rgb($s_fit_p3)=(0,0,65280)
934 variable precision_g = 5
935 variable oversampling = 4
938 duplicate /free xw, xdw
939 differentiate /p xw /d=xdw
941 variable xd = wavemin(xdw) / oversampling
944 variable x0g = abs(pw[5]) * precision_g
945 variable ng = 2 * floor(x0g / xd) + 1
948 variable emax = wavemax(xw)
949 variable emin = wavemin(xw)
950 variable x0f = max(abs(emax - pw[3]), abs(emin - pw[3])) + x0g
951 variable ne = 2 * floor(x0f / xd) + 1
954 make /d /n=(ng) /free gausswave
955 make /d /n=(ne) /free fermiwave
956 setscale/i x -x0g, x0g,
"", gausswave
957 setscale/i x -x0f, x0f,
"", fermiwave
959 gausswave = exp( - (x / pw[5] )^2 )
960 fermiwave = 1 / (exp( x / (kBoltzmann * pw[4])) + 1.0 )
963 duplicate /free fermiwave, resultwave
964 Convolve /a gausswave, resultwave
965 variable rmax = wavemax(resultwave)
969 ng = numpnts(resultwave)
970 x0g = xd * (ng - 1) / 2
971 setscale/i x -x0g, x0g,
"", resultwave
973 yw = pw[2] * resultwave(xw[p] - pw[3]) + pw[0] + pw[1] * xw[p]
986 integrate /meth=1 w /d=bg
988 variable bg1 = bg[p1]
989 variable bg2 = bg[p2]