11from lmfit import Model
2+ from lmfit import Parameter
23from lmfit .models import guess_from_peak , update_param_vals
3- from pearsonivamplitudeparametrizationhpw import PearsonIVAmplitudeParametrizationHPW
4- from voigtareaparametrizationnu import VoigtAreaParametrizationNu
4+ from ramanchada2 .fitting_functions .pearsonivamplitudeparametrizationhpw import (
5+ PearsonIVAmplitudeParametrizationHPW ,
6+ )
7+ from ramanchada2 .fitting_functions .voigtareaparametrizationnu import (
8+ VoigtAreaParametrizationNu ,
9+ )
510import numpy as np
611
712
@@ -11,25 +16,80 @@ class PearsonIVParametrizationHPWModel(Model):
1116 `sigma` (:math:`\sigma`), `expon` (:math:`m`) and `skew` (:math:`\nu`).
1217 """
1318
14- def __init__ (self , independent_vars = ['x' ], prefix = '' , nan_policy = 'raise' ,
15- ** kwargs ):
16- kwargs .update ({'prefix' : prefix , 'nan_policy' : nan_policy ,
17- 'independent_vars' : independent_vars })
19+ def __init__ (self , independent_vars = ["x" ], prefix = "" , nan_policy = "raise" , ** kwargs ):
20+ kwargs .update (
21+ {
22+ "prefix" : prefix ,
23+ "nan_policy" : nan_policy ,
24+ "independent_vars" : independent_vars ,
25+ }
26+ )
1827 super ().__init__ (PearsonIVAmplitudeParametrizationHPW .GetYOfOneTerm , ** kwargs )
1928 self ._set_paramhints_prefix ()
2029
2130 def _set_paramhints_prefix (self ):
22- self .set_param_hint (' expon' , value = 1.5 , min = 0.5 + 1 / 1024.0 , max = 1000 )
23- self .set_param_hint (' skew' , value = 0.0 , min = - 1000 , max = 1000 )
31+ self .set_param_hint (" expon" , value = 1.5 , min = 0.5 + 1 / 1024.0 , max = 1000 )
32+ self .set_param_hint (" skew" , value = 0.0 , min = - 1000 , max = 1000 )
2433
2534 def guess (self , data , x , negative = False , ** kwargs ):
2635 """Estimate initial model parameter values from data."""
2736 pars = guess_from_peak (self , data , x , negative )
28- pars [f'{ self .prefix } height' ].set (value = pars [f'{ self .prefix } amplitude' ] / pars [f'{ self .prefix } sigma' ])
29- pars [f'{ self .prefix } expon' ].set (value = 1 )
30- pars [f'{ self .prefix } skew' ].set (value = 0.0 )
3137 return update_param_vals (pars , self .prefix , ** kwargs )
3238
39+ def make_params (self , verbose = False , ** kwargs ):
40+ pars = super ().make_params (verbose = verbose , ** kwargs )
41+ pars [f"{ self .prefix } height" ].set (
42+ value = kwargs [f"{ self .prefix } amplitude" ] / kwargs [f"{ self .prefix } sigma" ]
43+ )
44+ pars [f"{ self .prefix } expon" ].set (value = 1.0 )
45+ pars [f"{ self .prefix } skew" ].set (value = 0.0 )
46+ return pars
47+
48+ def fit (
49+ self ,
50+ data ,
51+ params = None ,
52+ weights = None ,
53+ method = "leastsq" ,
54+ iter_cb = None ,
55+ scale_covar = True ,
56+ verbose = False ,
57+ fit_kws = None ,
58+ nan_policy = None ,
59+ calc_covar = True ,
60+ max_nfev = None ,
61+ ** kwargs ,
62+ ):
63+ """overwrite fit in order to amend area and fwhm to the parameters"""
64+ result = super ().fit (
65+ data ,
66+ params = params ,
67+ weights = weights ,
68+ method = method ,
69+ iter_cb = iter_cb ,
70+ scale_covar = scale_covar ,
71+ verbose = verbose ,
72+ fit_kws = fit_kws ,
73+ nan_policy = nan_policy ,
74+ calc_covar = calc_covar ,
75+ max_nfev = max_nfev ,
76+ ** kwargs ,
77+ )
78+ pahf = PearsonIVAmplitudeParametrizationHPW .GetPositionAreaHeightFWHMFromPeakParameters (
79+ result .params [f"{ self .prefix } height" ],
80+ result .params [f"{ self .prefix } center" ],
81+ result .params [f"{ self .prefix } sigma" ],
82+ result .params [f"{ self .prefix } expon" ],
83+ result .params [f"{ self .prefix } skew" ],
84+ result .covar
85+ )
86+ p1 = Parameter (f"{ self .prefix } amplitude" , value = pahf .Area )
87+ p1 .stderr = pahf .AreaStdDev
88+ p2 = Parameter (f"{ self .prefix } fwhm" , value = pahf .FWHM )
89+ p2 .stderr = pahf .FWHMStdDev
90+ result .params .add_many (p1 , p2 )
91+ return result
92+
3393
3494class VoigtAreaParametrizationNuModel (Model ):
3595 r"""A model based on a Voigt distribution function.
@@ -41,22 +101,26 @@ class VoigtAreaParametrizationNuModel(Model):
41101 For more information, see: https://en.wikipedia.org/wiki/Voigt_profile
42102 """
43103
44- def __init__ (self , independent_vars = ['x' ], prefix = '' , nan_policy = 'raise' ,
45- ** kwargs ):
46- kwargs .update ({'prefix' : prefix , 'nan_policy' : nan_policy ,
47- 'independent_vars' : independent_vars })
104+ def __init__ (self , independent_vars = ["x" ], prefix = "" , nan_policy = "raise" , ** kwargs ):
105+ kwargs .update (
106+ {
107+ "prefix" : prefix ,
108+ "nan_policy" : nan_policy ,
109+ "independent_vars" : independent_vars ,
110+ }
111+ )
48112 super ().__init__ (VoigtAreaParametrizationNu .GetYOfOneTerm , ** kwargs )
49113 self ._set_paramhints_prefix ()
50114
51115 def _set_paramhints_prefix (self ):
52- self .set_param_hint (' sigma' , min = np .tiny )
53- self .set_param_hint ('nu' , min = 0 , max = 1 )
116+ self .set_param_hint (" sigma" , min = np .tiny )
117+ self .set_param_hint ("nu" , min = 0 , max = 1 )
54118
55- fexpr = ( "2.0*{pre:s}sigma" )
56- self .set_param_hint (' fwhm' , expr = fexpr .format (pre = self .prefix ))
119+ fexpr = "2.0*{pre:s}sigma"
120+ self .set_param_hint (" fwhm" , expr = fexpr .format (pre = self .prefix ))
57121
58122 def guess (self , data , x , negative = False , ** kwargs ):
59123 """Estimate initial model parameter values from data."""
60124 pars = guess_from_peak (self , data , x , negative )
61- pars [f' { self .prefix } nu' ].set (value = 1.0 )
125+ pars [f" { self .prefix } nu" ].set (value = 1.0 )
62126 return update_param_vals (pars , self .prefix , ** kwargs )
0 commit comments