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",
version >= 1.05
22 threadsafe variable DoniachSunjic(variable x, variable amp, variable pos, variable sing, variable fwhm){
32 nom = cos(pi * sing / 2 + (1 - sing) * atan((x - pos) / fwhm * 2))
33 denom = ((x - pos)^2 + fwhm^2 / 4)^((1 - sing) / 2)
35 return amp * nom / denom * fwhm / 2
38 threadsafe variable
ds1_bg(wave w, variable x){
58 return DoniachSunjic(x, w[1], w[2], w[3], w[4]) + w[0]
61 threadsafe variable
ds2_bg(wave w, variable x){
83 variable ds1 = DoniachSunjic(x, w[1], w[2], w[3], w[4])
84 variable ds2 = DoniachSunjic(x, w[5], w[6], w[7], w[8])
86 return w[0] + ds1 + ds2
118 Variable ds1, ds2, ds3, ds4
119 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))
120 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))
121 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))
122 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))
125 return w[0]+ds1+ds2+ds3+ds4
179 Variable ds1, ds2, ds3, ds4, ds5, ds6
180 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))
181 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))
182 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))
183 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))
184 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))
185 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))
187 return w[0]+ds1+ds2+ds3+ds4+ds5+ds6
246 if (WaveExists(s.
xdw))
255 wave fs.model = model
256 wave fs.broadening = broadening
257 wave fs.convolution = convolution
261 differentiate /p xw /d=xdw
263 variable xd = wavemin(xdw) / oversampling
266 variable x0b = pw[6] * precision
267 variable nb = 2 * floor(x0b / xd) + 1
270 variable x0m = max(abs(wavemax(xw) - pw[1]), abs(wavemin(xw) - pw[1])) + x0b
271 variable nm = 2 * floor(x0m / xd) + 1
272 nb = min(nb, nm * 10)
275 redimension /n=(nb) broadening
276 redimension /n=(nm) model
277 setscale/i x -x0b, x0b,
"", broadening
278 setscale/i x -x0m, x0m,
"", model
280 broadening = exp( - (x / pw[6])^2 * 4 * ln(2))
281 variable nrm = area(broadening)
283 model = DoniachSunjic(x, 1, 0, pw[3], pw[2])
284 model += DoniachSunjic(x, pw[5], pw[4], pw[3], pw[2])
288 variable scale = pw[0] / wavemax(model)
293 x0m = xd * (nm - 1) / 2
294 setscale/i x -x0m, x0m,
"", model
296 yw =
model(xw[p] - pw[1]) + pw[7] + pw[8] * xw[p]
297 yw = numtype(yw) ? 0 : yw
333 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
334 if (DataFolderRefStatus(df) == 0)
335 newdatafolder root:packages:pearl_fitfuncs:doniach_sunjic
336 dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
339 wave /z /sdfr=df fs.
xdw =
xdw 344 if (WaveExists(fs.
xdw) == 0)
345 dfref savedf = GetDataFolderDFR()
349 wave fs.
model = model
372 duplicate /free
pw, fs.
pw 373 duplicate /free
yw, fs.
xw 375 duplicate /free
yw, fs.
yw 397 duplicate /free
pw, fs.
pw 399 duplicate /free
xw, fs.
xw 401 duplicate /free
yw, fs.
xw 404 duplicate /free
yw, fs.
yw 406 variable v_chisq = nan
407 variable V_FitMaxIters = 100
408 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"}
419 variable
Au4f(wave w, variable x){
451 variable vc1, vc2, vc3, vc4
452 vc2 = 2 * sqrt(ln(2)) / w[ip0-1]
453 for (ip = ip0; ip < np; ip += 3)
454 vc1 = w[ip] / sqrt(pi) * vc2
456 vc4 = vc2 * w[ip+2] / 2
457 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
481 variable bg = w[0] + w[1] * x
488 vc2 = 2 * sqrt(ln(2)) / w[2]
491 vc1 = w[3] / sqrt(pi) * vc2
494 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
497 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
500 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
503 vc1 = w[6] / sqrt(pi) * vc2
506 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
509 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
512 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
522 duplicate /free coef_wave, coef1, coef2
524 coef2[3] *= coef_wave[9]
525 coef2[4] += coef_wave[10]
526 coef2[6] *= coef_wave[9]
527 coef2[7] += coef_wave[10]
530 string s_fit_wave = NameOfWave(fit_wave)
531 string s_fit_p1 = s_fit_wave +
"_p1" 532 string s_fit_p2 = s_fit_wave +
"_p2" 533 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
534 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
539 string traces = TraceNameList(
"",
";", 1)
540 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
541 appendtograph fit_p1, fit_p2
542 ModifyGraph lstyle($s_fit_p1)=2
543 ModifyGraph lstyle($s_fit_p2)=2
544 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
545 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
568 variable bg = w[0] + w[1] * x
575 vc2 = 2 * sqrt(ln(2)) / w[2]
578 vc1 = w[3] / sqrt(pi) * vc2
581 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
584 vc1 = w[3] / sqrt(pi) * vc2 * w[9]
587 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
590 vc1 = w[3] / sqrt(pi) * vc2 * w[11]
593 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
596 vc1 = w[6] / sqrt(pi) * vc2
599 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
602 vc1 = w[6] / sqrt(pi) * vc2 * w[9]
605 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
608 vc1 = w[6] / sqrt(pi) * vc2 * w[11]
611 v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
621 duplicate /free coef_wave, coef1, coef2, coef3
625 coef2[3] *= coef_wave[9]
626 coef2[4] += coef_wave[10]
627 coef2[6] *= coef_wave[9]
628 coef2[7] += coef_wave[10]
632 coef3[3] *= coef_wave[11]
633 coef3[4] += coef_wave[12]
634 coef3[6] *= coef_wave[11]
635 coef3[7] += coef_wave[12]
639 string s_fit_wave = NameOfWave(fit_wave)
640 string s_fit_p1 = s_fit_wave +
"_p1" 641 string s_fit_p2 = s_fit_wave +
"_p2" 642 string s_fit_p3 = s_fit_wave +
"_p3" 643 duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
644 duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
645 duplicate /o fit_wave, $(s_fit_p3) /wave=fit_p3
651 string traces = TraceNameList(
"",
";", 1)
652 if ((WhichListItem(s_fit_wave, traces,
";") >= 0) && (WhichListItem(s_fit_p1, traces,
";") < 0))
653 appendtograph fit_p1, fit_p2, fit_p3
654 ModifyGraph lstyle($s_fit_p1)=2
655 ModifyGraph lstyle($s_fit_p2)=2
656 ModifyGraph lstyle($s_fit_p3)=2
657 ModifyGraph rgb($s_fit_p1)=(0,0,65280)
658 ModifyGraph rgb($s_fit_p2)=(0,0,65280)
659 ModifyGraph rgb($s_fit_p3)=(0,0,65280)
676 variable precision_g = 5
680 duplicate /free
xw,
xdw 681 differentiate /p xw /d=
xdw 683 variable xd = wavemin(xdw) / oversampling
686 variable x0g = abs(pw[5]) * precision_g
687 variable ng = 2 * floor(x0g / xd) + 1
690 variable emax = wavemax(xw)
691 variable emin = wavemin(xw)
692 variable x0f = max(abs(emax - pw[3]), abs(emin - pw[3])) + x0g
693 variable ne = 2 * floor(x0f / xd) + 1
696 make /d /n=(ng) /free gausswave
697 make /d /n=(ne) /free fermiwave
698 setscale/i x -x0g, x0g,
"", gausswave
699 setscale/i x -x0f, x0f,
"", fermiwave
701 gausswave = exp( - (x / pw[5] )^2 )
702 fermiwave = 1 / (exp( x / (kBoltzmann * pw[4])) + 1.0 )
705 duplicate /free fermiwave, resultwave
706 Convolve /a gausswave, resultwave
707 variable rmax = wavemax(resultwave)
711 ng = numpnts(resultwave)
712 x0g = xd * (ng - 1) / 2
713 setscale/i x -x0g, x0g,
"", resultwave
715 yw = pw[2] * resultwave(xw[p] - pw[3]) + pw[0] + pw[1] * xw[p]
variable DoniachSunjicBroad(wave pw, wave yw, wave xw)
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)
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)
threadsafe variable ds1_bg(wave w, variable x)