11from lmfit import Model
22from lmfit import Parameter
33from lmfit .models import guess_from_peak , update_param_vals
4+ import numpy as np
45from ramanchada2 .fitting_functions .pearsonivamplitudeparametrizationhpw import (
56 PearsonIVAmplitudeParametrizationHPW ,
67)
1213class PearsonIVParametrizationHPWModel (Model ):
1314 r"""A model based on a Pearson IV distribution.
1415 The model has five parameters: `height` (:math:`a`), `position`,
15- `sigma ` (:math:`\sigma `), `expon` (:math:`m`) and `skew` (:math:`\nu`).
16+ `w ` (:math:`w `), `expon` (:math:`m`) and `skew` (:math:`\nu`).
1617 """
1718
1819 def __init__ (self , independent_vars = ["x" ], prefix = "" , nan_policy = "raise" , ** kwargs ):
@@ -33,15 +34,24 @@ def _set_paramhints_prefix(self):
3334 def guess (self , data , x , negative = False , ** kwargs ):
3435 """Estimate initial model parameter values from data."""
3536 pars = guess_from_peak (self , data , x , negative )
37+ del pars ['sigma' ] # sigma is no longer needed
3638 return update_param_vals (pars , self .prefix , ** kwargs )
3739
3840 def make_params (self , verbose = False , ** kwargs ):
3941 pars = super ().make_params (verbose = verbose , ** kwargs )
4042 pars [f"{ self .prefix } height" ].set (
4143 value = kwargs [f"{ self .prefix } amplitude" ] / kwargs [f"{ self .prefix } sigma" ]
4244 )
45+ pars [f"{ self .prefix } w" ].set (kwargs [f"{ self .prefix } sigma" ])
4346 pars [f"{ self .prefix } expon" ].set (value = 1.0 )
4447 pars [f"{ self .prefix } skew" ].set (value = 0.0 )
48+
49+ # Here a parameter sigma is added again, but this is merely
50+ # to not make guess_from_peak crashing
51+ # sigma is deleted from the dictionary after the call to 'guess_from_peak'
52+ par = Parameter (name = 'sigma' )
53+ pars .add (par )
54+
4555 return pars
4656
4757 def fit (
@@ -77,7 +87,7 @@ def fit(
7787 pahf = PearsonIVAmplitudeParametrizationHPW .GetPositionAreaHeightFWHMFromPeakParameters (
7888 result .params [f"{ self .prefix } height" ],
7989 result .params [f"{ self .prefix } center" ],
80- result .params [f"{ self .prefix } sigma " ],
90+ result .params [f"{ self .prefix } w " ],
8191 result .params [f"{ self .prefix } expon" ],
8292 result .params [f"{ self .prefix } skew" ],
8393 result .covar
@@ -112,16 +122,30 @@ def __init__(self, independent_vars=["x"], prefix="", nan_policy="raise", **kwar
112122 self ._set_paramhints_prefix ()
113123
114124 def _set_paramhints_prefix (self ):
115- self .set_param_hint ("sigma " , min = 1E-100 )
125+ self .set_param_hint ("w " , min = 1E-100 )
116126 self .set_param_hint ("nu" , min = 0.0 , max = 1.0 )
117127 self .set_param_hint ("gamma" , expr = 'sigma*(1-nu)' )
118128
119129 def guess (self , data , x , negative = False , ** kwargs ):
120130 """Estimate initial model parameter values from data."""
121131 pars = guess_from_peak (self , data , x , negative )
122132 pars [f"{ self .prefix } nu" ].set (value = 1.0 )
133+ del pars ['sigma' ] # sigma is no longer needed
123134 return update_param_vals (pars , self .prefix , ** kwargs )
124135
136+ def make_params (self , verbose = False , ** kwargs ):
137+ pars = super ().make_params (verbose = verbose , ** kwargs )
138+
139+ pars [f"{ self .prefix } w" ].set (kwargs [f"{ self .prefix } sigma" ])
140+
141+ # Here a parameter sigma is added again, but this is merely
142+ # to avoid crashing in the call to 'guess_from_peak'
143+ # sigma is deleted from the dictionary after the call to 'guess_from_peak'
144+ par = Parameter (name = 'sigma' )
145+ pars .add (par )
146+
147+ return pars
148+
125149 def fit (
126150 self ,
127151 data ,
@@ -155,13 +179,20 @@ def fit(
155179 pahf = VoigtAreaParametrizationNu .GetPositionAreaHeightFWHMFromPeakParameters (
156180 result .params [f"{ self .prefix } amplitude" ],
157181 result .params [f"{ self .prefix } center" ],
158- result .params [f"{ self .prefix } sigma " ],
182+ result .params [f"{ self .prefix } w " ],
159183 result .params [f"{ self .prefix } nu" ],
160184 result .covar
161185 )
162186 p1 = Parameter (f"{ self .prefix } height" , value = pahf .Height )
163187 p1 .stderr = pahf .HeightStdDev
164188 p2 = Parameter (f"{ self .prefix } fwhm" , value = pahf .FWHM )
165189 p2 .stderr = pahf .FWHMStdDev
166- result .params .add_many (p1 , p2 )
190+ p3 = Parameter (f"{ self .prefix } sigma" ,
191+ value = result .params [f"{ self .prefix } w" ] * np .sqrt (result .params [f"{ self .prefix } nu" ] / np .log (4 )))
192+ p3 .stderr = 0.0 # TBD
193+ p4 = Parameter (f"{ self .prefix } gamma" ,
194+ value = result .params [f"{ self .prefix } w" ] * (1 - result .params [f"{ self .prefix } nu" ]))
195+ p4 .stderr = 0.0 # TBD
196+
197+ result .params .add_many (p1 , p2 , p3 , p4 )
167198 return result
0 commit comments