peak_shapes
Peak shapes
Some various peak shapes that I've found useful in doing things like crystallite size distributions, solid solutions and the like.
Peak shape is defined by a FWHM, not a standard deviation. The lognormal peak is defined by a peak position (being the point of maximum intensity) and a FWHM, which is naturally asymmetric. All peak areas are normalised to 1 and allow for scaling. They will work with >=v5.
If you want to use fit_objs, then look at the end of this page.
Gaussian
macro & Gau(& A, & p, & w, & x) { A (2 Sqrt(Ln(2)/Pi)/w) Exp(-4 Ln(2) ((x-p)/w)^2) }
Lorenztian
macro & Lor(& A, & p, & w, & x) { 2 A w / (Pi (w^2 + 4 (x-p)^2)) }
Pearson VII
macro & PeaVII(& A, & p, & w, & m, & x) { A (2 Sqrt((2^(1/m)-1)/(w^2)) Gamma_Approx(m)/(Sqrt(Pi) Gamma_Approx(m-1/2))) ((w/2)^(2 m)/((w/2)^2 + (2^(1/m) - 1)*(x-p)^2)^m) }
Lognormal
macro & lognormal(& int, & posn, & fwhm, & x) { int/(Sqrt(2 Pi) LN_sigma(posn,fwhm) x) Exp(-((Ln(x)-LN_mu(posn,fwhm))/(Sqrt(2) LN_sigma(posn,fwhm)))^2) } macro & LN_r(& p, & w) { (w + Sqrt(4 p^2 + w^2)) / (2 p) } macro & LN_mu(& p, & w) { LN_r(p,w)^2/(2 Ln(2)) + Ln(p) } macro & LN_sigma(& p, & w) { LN_r(p,w)/Sqrt(2 Ln(2)) }
pseudo-Voigt
macro & pV(& A, & p, & w, & n, & x) { n Lor(A,p,w,x) + (1-n) Gau(A,p,w,x) }
Split functions
'all are normalised to unit area' macro & split_Gaussian(& int,& posn,& hwL,& hwR,& x) { If(x < posn, (Gau(int,posn, 2*hwL,x)/Gau(1,posn, 2*hwL,0))/((hwL + hwR) Sqrt(Pi / Ln(2))/2) , (Gau(int,posn, 2*hwR,x)/Gau(1,posn, 2*hwR,0))/((hwL + hwR) Sqrt(Pi / Ln(2))/2) ) } macro & split_Lorentzian(& int,& posn,& hwL,& hwR,& x) { If(x < posn, (Lor(int,posn, 2*hwL,x)/Lor(1,posn, 2*hwL,0))/(Pi (hwL + hwR) / 2) , (Lor(int,posn, 2*hwR,x)/Lor(1,posn, 2*hwR,0))/(Pi (hwL + hwR) / 2) ) } macro & split_PV(& int,& posn,& hwL,& hwR, & nL, & nR, & x) { If(x < posn, (pV(int,posn, 2*hwL, nL, x)/pV(1,posn, 2*hwL, nL, 0))/((Pi (Sqrt(Pi Ln(2)) (hwL+hwR) - (Sqrt(Pi Ln(2)) - 1) ( hwR nL + hwL nR))) / (2 ( nL (Sqrt(Pi Ln(2)) - 1) - Sqrt(Pi Ln(2))) ( nR (Sqrt(Pi Ln(2)) - 1) - Sqrt(Pi Ln(2))))) , (pV(int,posn, 2*hwR, nR, x)/pV(1,posn, 2*hwR, nR, 0))/((Pi (Sqrt(Pi Ln(2)) (hwL+hwR) - (Sqrt(Pi Ln(2)) - 1) ( hwR nL + hwL nR))) / (2 ( nL (Sqrt(Pi Ln(2)) - 1) - Sqrt(Pi Ln(2))) ( nR (Sqrt(Pi Ln(2)) - 1) - Sqrt(Pi Ln(2))))) ) } macro & split_PeaVII(& int,& posn,& hwL,& hwR, & mL, & mR, & x) { If(x < posn, (PeaVII(int,posn, 2*hwL, mL, x)/PeaVII(1,posn, 2*hwL, mL, 0))/(Sqrt(Pi) (((hwR Gamma_Approx(mL) Gamma_Approx(mR - (1/2))) / Sqrt(2^(1/mR)-1)) + ((hwL Gamma_Approx(mR) Gamma_Approx(mL - (1/2))) / Sqrt(2^(1/mL)-1))) / (2 Gamma_Approx(mL) Gamma_Approx(mR))) , (PeaVII(int,posn, 2*hwR, mR, x)/PeaVII(1,posn, 2*hwR, mR, 0))/(Sqrt(Pi) (((hwR Gamma_Approx(mL) Gamma_Approx(mR - (1/2))) / Sqrt(2^(1/mR)-1)) + ((hwL Gamma_Approx(mR) Gamma_Approx(mL - (1/2))) / Sqrt(2^(1/mL)-1))) / (2 Gamma_Approx(mL) Gamma_Approx(mR))) ) } macro & split_Lognormal(& int,& posn,& hwL,& hwR,& x) { If(x < posn, 2 lognormal(int,posn,2 hwL,x) / (1 + (lognormal(int,posn,2 hwL,posn)/lognormal(int,posn,2 hwR,posn))), 2 lognormal(int,posn,2 hwR,x) (lognormal(int,posn,2 hwL,posn)/lognormal(int,posn,2 hwR,posn)) / (1 + (lognormal(int,posn,2 hwL,posn)/lognormal(int,posn,2 hwR,posn))) ) }
Macros set up to insert fit objects:
macro Gau_fo(int, int_v, posn, posn_v, fwhm, fwhm_v) { #m_argu int #m_argu posn #m_argu fwhm If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(fwhm, fwhm_v, min 0.0001 max 10) fit_obj = Gau(CeV(int, int_v), CeV(posn, posn_v), CeV(fwhm, fwhm_v), X); } macro sGau_fo(int, int_v, posn, posn_v, hwL, hwL_v, hwR, hwR_v) { #m_argu int #m_argu posn #m_argu hwL #m_argu hwR If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(hwL, hwL_v, min 0.0001 max 3) If_Local_Eqn_Rpt(hwR, hwR_v, min 0.0001 max 3) fit_obj = sGau(CeV(int, int_v), CeV(posn, posn_v), CeV(hwL, hwL_v), CeV(hwR, hwR_v), X); } macro Lor_fo(int, int_v, posn, posn_v, fwhm, fwhm_v) { #m_argu int #m_argu posn #m_argu fwhm If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(fwhm, fwhm_v, min 0.0001 max 10) fit_obj = Lor(CeV(int, int_v), CeV(posn, posn_v), CeV(fwhm, fwhm_v), X); } macro sLor_fo(int, int_v, posn, posn_v, hwL, hwL_v, hwR, hwR_v) { #m_argu int #m_argu posn #m_argu hwL #m_argu hwR If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(hwL, hwL_v, min 0.0001 max 3) If_Local_Eqn_Rpt(hwR, hwR_v, min 0.0001 max 3) fit_obj = sLor(CeV(int, int_v), CeV(posn, posn_v), CeV(hwL, hwL_v), CeV(hwR, hwR_v), X); } macro pV_fo(int, int_v, posn, posn_v, fwhm, fwhm_v, mix, mix_v) { #m_argu int #m_argu posn #m_argu fwhm #m_argu mix If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(fwhm, fwhm_v, min 0.0001 max 10) If_Local_Eqn_Rpt(mix, mix_v, min 0 max 1) fit_obj = pV(CeV(int, int_v), CeV(posn, posn_v), CeV(fwhm, fwhm_v), CeV(mix, mix_v), X); } macro spV_fo(int, int_v, posn, posn_v, hwL, hwL_v, hwR, hwR_v, nL, nL_v, nR, nR_v) { #m_argu int #m_argu posn #m_argu hwL #m_argu hwR #m_argu nL #m_argu nR If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(hwL, hwL_v, min 0.0001 max 3) If_Local_Eqn_Rpt(hwR, hwR_v, min 0.0001 max 3) If_Local_Eqn_Rpt(nL, nL_v, min 0 max 1) If_Local_Eqn_Rpt(nR, nR_v, min 0 max 1) fit_obj = spV(CeV(int, int_v), CeV(posn, posn_v), CeV(hwL, hwL_v), CeV(hwR, hwR_v), CeV(nL, nL_v), CeV(nR, nR_v), X); } macro Pea7_fo(int, int_v, posn, posn_v, fwhm, fwhm_v, m, m_v) { #m_argu int #m_argu posn #m_argu fwhm #m_argu m If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(fwhm, fwhm_v, min 0.0001 max 10) If_Local_Eqn_Rpt(m, m_v, min 0.50001 max 20) fit_obj = Pea7(CeV(int, int_v), CeV(posn, posn_v), CeV(fwhm, fwhm_v), CeV(m, m_v), X); } macro sPea7_fo(int, int_v, posn, posn_v, hwL, hwL_v, hwR, hwR_v, mL,mL_v, mR, mR_v) { #m_argu int #m_argu posn #m_argu hwL #m_argu hwR #m_argu mL #m_argu mR If_Local_Eqn_Rpt(int, int_v, min 0) If_Local_Eqn_Rpt(posn, posn_v,) If_Local_Eqn_Rpt(hwL, hwL_v, min 0.0001 max 3) If_Local_Eqn_Rpt(hwR, hwR_v, min 0.0001 max 3) If_Local_Eqn_Rpt(mL, mL_v, min 0.50001 max 20) If_Local_Eqn_Rpt(mR, mR_v, min 0.50001 max 20) fit_obj = sPea7(CeV(int, int_v), CeV(posn, posn_v), CeV(hwL, hwL_v), CeV(hwR, hwR_v), CeV(mL, mL_v), CeV(mR, mR_v), X); }
peak_shapes.txt · Last modified: 2022/11/03 15:08 by 127.0.0.1