Skip to content

Commit

Permalink
Voigt model now functional, height and fwhm added
Browse files Browse the repository at this point in the history
  • Loading branch information
lellid committed Mar 10, 2023
1 parent 5fc3bdb commit 8305e2a
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 8 deletions.
52 changes: 46 additions & 6 deletions src/ramanchada2/fitting_functions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from ramanchada2.fitting_functions.voigtareaparametrizationnu import (
VoigtAreaParametrizationNu,
)
import numpy as np


class PearsonIVParametrizationHPWModel(Model):
Expand Down Expand Up @@ -113,14 +112,55 @@ def __init__(self, independent_vars=["x"], prefix="", nan_policy="raise", **kwar
self._set_paramhints_prefix()

def _set_paramhints_prefix(self):
self.set_param_hint("sigma", min=np.tiny)
self.set_param_hint("nu", min=0, max=1)

fexpr = "2.0*{pre:s}sigma"
self.set_param_hint("fwhm", expr=fexpr.format(pre=self.prefix))
self.set_param_hint("sigma", min=1E-100)
self.set_param_hint("nu", min=0.0, max=1.0)

def guess(self, data, x, negative=False, **kwargs):
"""Estimate initial model parameter values from data."""
pars = guess_from_peak(self, data, x, negative)
pars[f"{self.prefix}nu"].set(value=1.0)
return update_param_vals(pars, self.prefix, **kwargs)

def fit(
self,
data,
params=None,
weights=None,
method="leastsq",
iter_cb=None,
scale_covar=True,
verbose=False,
fit_kws=None,
nan_policy=None,
calc_covar=True,
max_nfev=None,
**kwargs,
):
"""overwrite fit in order to amend area and fwhm to the parameters"""
result = super().fit(
data,
params=params,
weights=weights,
method=method,
iter_cb=iter_cb,
scale_covar=scale_covar,
verbose=verbose,
fit_kws=fit_kws,
nan_policy=nan_policy,
calc_covar=calc_covar,
max_nfev=max_nfev,
**kwargs,
)
pahf = VoigtAreaParametrizationNu.GetPositionAreaHeightFWHMFromPeakParameters(
result.params[f"{self.prefix}amplitude"],
result.params[f"{self.prefix}center"],
result.params[f"{self.prefix}sigma"],
result.params[f"{self.prefix}nu"],
result.covar
)
p1 = Parameter(f"{self.prefix}height", value=pahf.Height)
p1.stderr = pahf.HeightStdDev
p2 = Parameter(f"{self.prefix}fwhm", value=pahf.FWHM)
p2.stderr = pahf.FWHMStdDev
result.params.add_many(p1, p2)
return result
22 changes: 20 additions & 2 deletions src/ramanchada2/fitting_functions/voigtareaparametrizationnu.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,32 @@ def GetPositionAreaHeightFWHMFromSinglePeakParameters(
pos = parameters[f"pos{indexOfPeak}"]
w = parameters[f"w{indexOfPeak}"]
nu = parameters[f"nu{indexOfPeak}"]
sigma = w * np.sqrt(nu) * OneBySqrtLog4
gamma = w * (1 - nu)

if cv is not None:
cv = cv[
indexOfPeak * 4: (indexOfPeak + 1) * 4,
indexOfPeak * 4: (indexOfPeak + 1) * 4,
]
return VoigtAreaParametrizationNu.GetPositionAreaHeightFWHMFromPeakParameters(area, pos, w, nu, cv)

def GetPositionAreaHeightFWHMFromPeakParameters(
area, pos, w, nu, cv=None
):
"""
Get position, area, height, and FWHM of one peak from the peak parameters.
If the covariance matrix is given, the corresponding errors are calculated.
Parameters
----------
parameters: Parameters
Existing instance of Parameters, which contains the result of the fit.
indexOfPeak: int
The index of the peak into consideration.
cv: np.array
Covariance matrix of the fit.
"""
sigma = w * np.sqrt(nu) * OneBySqrtLog4
gamma = w * (1 - nu)

if cv is not None:
areaStdDev = SafeSqrt(cv[0, 0])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -475,3 +475,5 @@ def test_fit_with_model_oneterm():
np.testing.assert_almost_equal(result.params["sigma"], w, 7)
np.testing.assert_almost_equal(result.params["expon"], m, 7)
np.testing.assert_almost_equal(result.params["skew"], v, 7)
np.testing.assert_almost_equal(result.params["amplitude"], 92.774482626349894596, 7)
np.testing.assert_almost_equal(result.params["fwhm"], 10.02952431724565395, 7)
21 changes: 21 additions & 0 deletions tests/fitting_functions/test_voigtareaparametrizationnu.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from ramanchada2.fitting_functions import voigtareaparametrizationnu
from ramanchada2.fitting_functions.models import VoigtAreaParametrizationNuModel
from ramanchada2.fitting_functions.voigtareaparametrizationnu import (
VoigtAreaParametrizationNu,
)
Expand Down Expand Up @@ -794,3 +795,23 @@ def test_parameter_boundaries():
c.add(d)
assert c["foo"] == 34
assert c["foo"].max == 77


def test_fit_with_model_oneterm():
x = np.linspace(0, 99, 100)
a = 7
pos = 50
w = 5
nu = 6 / 11.0
sigma = w * np.sqrt(nu) * voigtareaparametrizationnu.OneBySqrtLog4
gamma = w * (1 - nu)
data = a * voigt_profile(x - pos, sigma, gamma)
model = VoigtAreaParametrizationNuModel(x=x)
params = model.guess(data, x)
result = model.fit(data, x=x, params=params)
np.testing.assert_almost_equal(result.params["amplitude"], a, 3)
np.testing.assert_almost_equal(result.params["center"], pos, 3)
np.testing.assert_almost_equal(result.params["sigma"], w, 3)
np.testing.assert_almost_equal(result.params["nu"], nu, 3)
np.testing.assert_almost_equal(result.params["height"], 0.542599801404569082663570, 3)
np.testing.assert_almost_equal(result.params["fwhm"], 10.111072472153491175127, 3)

0 comments on commit 8305e2a

Please sign in to comment.