Skip to content

Commit e19a909

Browse files
committed
Change parameter name from sigma to w
1 parent dfa52d5 commit e19a909

5 files changed

Lines changed: 44 additions & 11 deletions

File tree

src/ramanchada2/fitting_functions/models.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from lmfit import Model
22
from lmfit import Parameter
33
from lmfit.models import guess_from_peak, update_param_vals
4+
import numpy as np
45
from ramanchada2.fitting_functions.pearsonivamplitudeparametrizationhpw import (
56
PearsonIVAmplitudeParametrizationHPW,
67
)
@@ -12,7 +13,7 @@
1213
class 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

src/ramanchada2/fitting_functions/pearsonivamplitudeparametrizationhpw.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ def GetParameterNamesForPeak(self, indexOfPeak):
7171
f"v{indexOfPeak}",
7272
]
7373

74-
def GetYOfOneTerm(x, height=1.0, center=0.0, sigma=1.0, expon=1.0, skew=0.0):
74+
def GetYOfOneTerm(x, height=1.0, center=0.0, w=1.0, expon=1.0, skew=0.0):
7575
"""Returns the y-value of one peak in dependence on x and the peak parameters."""
7676
arg = (
7777
np.sqrt((np.power(2, 1 / expon) - 1) * (1 + skew * skew))
7878
* (x - center)
79-
/ sigma
79+
/ w
8080
- skew
8181
)
8282
return height * np.exp(

src/ramanchada2/fitting_functions/voigtareaparametrizationnu.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ def GetParameterNamesForPeak(self, indexOfPeak):
9595
f"nu{indexOfPeak}",
9696
]
9797

98-
def GetYOfOneTerm(x, amplitude=1.0, center=0.0, sigma=1.0, nu=1.0):
98+
def GetYOfOneTerm(x, amplitude=1.0, center=0.0, w=1.0, nu=1.0):
9999
"""Returns the y-value of one peak in dependence on x and the peak parameters."""
100100
return amplitude * voigt_profile(
101-
x - center, sigma * np.sqrt(nu) * OneBySqrtLog4, sigma * (1 - nu)
101+
x - center, w * np.sqrt(nu) * OneBySqrtLog4, w * (1 - nu)
102102
)
103103

104104
def func(self, pars, x, data=None):

tests/fitting_functions/test_pearsonivamplitudeparametrizationhpw.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def test_fit_with_model_oneterm():
472472
result = model.fit(data, x=x, params=params)
473473
np.testing.assert_almost_equal(result.params["height"], a, 7)
474474
np.testing.assert_almost_equal(result.params["center"], pos, 7)
475-
np.testing.assert_almost_equal(result.params["sigma"], w, 7)
475+
np.testing.assert_almost_equal(result.params["w"], w, 7)
476476
np.testing.assert_almost_equal(result.params["expon"], m, 7)
477477
np.testing.assert_almost_equal(result.params["skew"], v, 7)
478478
np.testing.assert_almost_equal(result.params["amplitude"], 92.774482626349894596, 7)

tests/fitting_functions/test_voigtareaparametrizationnu.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,9 @@ def test_fit_with_model_oneterm():
811811
result = model.fit(data, x=x, params=params)
812812
np.testing.assert_almost_equal(result.params["amplitude"], a, 3)
813813
np.testing.assert_almost_equal(result.params["center"], pos, 3)
814-
np.testing.assert_almost_equal(result.params["sigma"], w, 3)
814+
np.testing.assert_almost_equal(result.params["w"], w, 3)
815815
np.testing.assert_almost_equal(result.params["nu"], nu, 3)
816+
np.testing.assert_almost_equal(result.params["sigma"], sigma, 2)
817+
np.testing.assert_almost_equal(result.params["gamma"], gamma, 2)
816818
np.testing.assert_almost_equal(result.params["height"], 0.542599801404569082663570, 3)
817819
np.testing.assert_almost_equal(result.params["fwhm"], 10.111072472153491175127, 3)

0 commit comments

Comments
 (0)