Warning: Trying to access array offset on value of type null in /home/site/wwwroot/lib/plugins/move/action/rename.php on line 42

Warning: Cannot modify header information - headers already sent by (output started at /home/site/wwwroot/lib/plugins/move/action/rename.php:42) in /home/site/wwwroot/inc/actions.php on line 38
peak_shapes [topas wiki]

User Tools

Site Tools


peak_shapes

Differences

This shows you the differences between two versions of the page.


Previous revision
peak_shapes [2022/11/03 15:08] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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
 +<code topas>macro & Gau(& A, & p, & w, & x) {
 + A (2 Sqrt(Ln(2)/Pi)/w) Exp(-4 Ln(2) ((x-p)/w)^2)
 +}</code>
 +
 +Lorenztian
 +<code topas>macro & Lor(& A, & p, & w, & x) {
 + 2 A w / (Pi (w^2 + 4 (x-p)^2))
 +}</code>
 +
 +Pearson VII
 +<code topas>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)
 +}</code>
 +
 +Lognormal
 +<code topas>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))
 +}
 +</code>
 +
 +pseudo-Voigt
 +<code topas>macro & pV(& A, & p, & w, & n, & x) {
 + n Lor(A,p,w,x) + (1-n) Gau(A,p,w,x)
 +}</code>
 +
 +
 +Split functions
 +<code topas>
 +'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)))
 +   )
 +}
 +</code>
 +
 +
 +Macros set up to insert fit objects:
 +<code topas>
 +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);
 +}
 +</code>
 +