diff options
Diffstat (limited to 'fit_sbp.py')
-rwxr-xr-x | fit_sbp.py | 140 |
1 files changed, 6 insertions, 134 deletions
@@ -3,9 +3,12 @@ # # Aaron LI # Created: 2016-03-13 -# Updated: 2016-05-06 +# Updated: 2016-07-04 # # Change logs: +# 2016-07-04: +# * Remove unused classes "FitModelSBetaNorm" and "FitModelDBetaNorm" +# * Fix minor typo # 2016-05-06: # * Get rid of the argument `config_model` of function `make_sbpfit()` # * Add property `long_name` to models @@ -332,137 +335,6 @@ class FitModelDBeta(FitModel): verticalalignment="top") -class FitModelSBetaNorm(FitModel): - """ - The single-beta model to be fitted. - Single-beta model, with a constant background. - Normalized the `s0' and `bkg' parameters by take the logarithm. - """ - params = lmfit.Parameters() - params.add_many( # (name, value, vary, min, max, expr) - ("log10_s0", -8.0, True, -12.0, -6.0, None), - ("rc", 30.0, True, 1.0, 1.0e4, None), - ("beta", 0.7, True, 0.3, 1.1, None), - ("log10_bkg", -9.0, True, -12.0, -7.0, None)) - - @staticmethod - def sbeta(r, params): - parvals = params.valuesdict() - s0 = 10 ** parvals["log10_s0"] - rc = parvals["rc"] - beta = parvals["beta"] - bkg = 10 ** parvals["log10_bkg"] - return s0 * np.power((1 + (r/rc)**2), (0.5 - 3*beta)) + bkg - - def __init__(self): - super().__init__(name="sbeta_norm", - long_name="Single-beta normalized", - func=self.sbeta, params=self.params) - - def plot(self, params, xdata, ax): - """ - Plot the fitted model, as well as the fitted parameters. - """ - super().plot(params, xdata, ax) - ydata = self.sbeta(xdata, params) - # fitted paramters - ax.vlines(x=params["rc"].value, ymin=min(ydata), ymax=max(ydata), - linestyles="dashed") - ax.hlines(y=(10 ** params["bkg"].value), xmin=min(xdata), - xmax=max(xdata), linestyles="dashed") - ax.text(x=params["rc"].value, y=min(ydata), - s="beta: %.2f\nrc: %.2f" % (params["beta"].value, - params["rc"].value)) - ax.text(x=min(xdata), y=min(ydata), - s="bkg: %.3e" % (10 ** params["bkg"].value), - verticalalignment="top") - - -class FitModelDBetaNorm(FitModel): - """ - The double-beta model to be fitted. - Double-beta model, with a constant background. - Normalized the `s01', `s02' and `bkg' parameters by take the logarithm. - - NOTE: - the first beta component (s01, rc1, beta1) describes the main and - outer SBP; while the second beta component (s02, rc2, beta2) accounts - for the central brightness excess. - """ - params = lmfit.Parameters() - params.add("log10_s01", value=-8.0, min=-12.0, max=-6.0) - params.add("rc1", value=50.0, min=10.0, max=1.0e4) - params.add("beta1", value=0.7, min=0.3, max=1.1) - # params.add("df_s0", value=1.0e-8, min=0.0, max=1.0e-6) - # params.add("s02", expr="s01 + df_s0") - params.add("log10_s02", value=-8.0, min=-12.0, max=-6.0) - # params.add("df_rc", value=30.0, min=0.0, max=1.0e4) - # params.add("rc2", expr="rc1 - df_rc") - params.add("rc2", value=20.0, min=1.0, max=5.0e2) - params.add("beta2", value=0.7, min=0.3, max=1.1) - params.add("log10_bkg", value=-9.0, min=-12.0, max=-7.0) - - @staticmethod - def beta1(r, params): - """ - This beta component describes the main/outer part of the SBP. - """ - parvals = params.valuesdict() - s01 = 10 ** parvals["log10_s01"] - rc1 = parvals["rc1"] - beta1 = parvals["beta1"] - bkg = 10 ** parvals["log10_bkg"] - return s01 * np.power((1 + (r/rc1)**2), (0.5 - 3*beta1)) + bkg - - @staticmethod - def beta2(r, params): - """ - This beta component describes the central/excess part of the SBP. - """ - parvals = params.valuesdict() - s02 = 10 ** parvals["log10_s02"] - rc2 = parvals["rc2"] - beta2 = parvals["beta2"] - return s02 * np.power((1 + (r/rc2)**2), (0.5 - 3*beta2)) - - @classmethod - def dbeta(self, r, params): - return self.beta1(r, params) + self.beta2(r, params) - - def __init__(self): - super().__init__(name="dbeta_norm", - long_name="Double-beta normalized", - func=self.dbeta, params=self.params) - - def plot(self, params, xdata, ax): - """ - Plot the fitted model, and each beta component, - as well as the fitted parameters. - """ - super().plot(params, xdata, ax) - beta1_ydata = self.beta1(xdata, params) - beta2_ydata = self.beta2(xdata, params) - ax.plot(xdata, beta1_ydata, 'b-.') - ax.plot(xdata, beta2_ydata, 'b-.') - # fitted paramters - ydata = beta1_ydata + beta2_ydata - ax.vlines(x=params["log10_rc1"].value, ymin=min(ydata), - ymax=max(ydata), linestyles="dashed") - ax.vlines(x=params["rc2"].value, ymin=min(ydata), ymax=max(ydata), - linestyles="dashed") - ax.hlines(y=(10 ** params["bkg"].value), xmin=min(xdata), - xmax=max(xdata), linestyles="dashed") - ax.text(x=params["rc1"].value, y=min(ydata), - s="beta1: %.2f\nrc1: %.2f" % (params["beta1"].value, - params["rc1"].value)) - ax.text(x=params["rc2"].value, y=min(ydata), - s="beta2: %.2f\nrc2: %.2f" % (params["beta2"].value, - params["rc2"].value)) - ax.text(x=min(xdata), y=min(ydata), - s="bkg: %.3e" % (10 ** params["bkg"].value), - verticalalignment="top") - - class SbpFit: """ Class to handle the SBP fitting with single-/double-beta model. @@ -703,8 +575,8 @@ class SbpFit: self.results.update([ ("nfev", fitted.nfev), ("ndata", fitted.ndata), - ("nvarys", fitted.nvarys), # number of varible paramters - ("nfree", fitted.nfree), # degree of freem + ("nvarys", fitted.nvarys), # number of variable parameters + ("nfree", fitted.nfree), # degree of freedom ("chisqr", fitted.chisqr), ("redchi", fitted.redchi), ("aic", fitted.aic), |