def model(self): """Returns the sum of all peak models.""" model = ConstantModel(prefix="BASE_") model.set_param_hint("c", vary=False, value=0) self.params += model.make_params() for peak in self._peaks: model += peak.model return model
class CModel(Model): """docstring for CModel""" def __init__(self, nexp=0, moddef=" "): self.definition = moddef self.model = ConstantModel() self.nexp = 0 self.errors = None self.params = None self.res = None for _ in range(nexp): self.add_exp() def add_exp(self): self.nexp += 1 self.model += ExponentialModel(prefix=Prefixes[self.nexp]) def prep_params(self): amp = '{}amplitude' dec = '{}decay' cntrl_expr = 'c' self.model.set_param_hint('c', value=1.0, min=0) for i in range(1, self.nexp + 1): currA = amp.format(Prefixes[i]) currT = dec.format(Prefixes[i]) self.model.set_param_hint(currA, value=1.0, min=0) self.model.set_param_hint(currT, value=1.0, min=0) cntrl_expr += ' + ' + currA self.params = self.model.make_params() self.params.add('cntrl', value=1, min=1 - 1e-5, max=1 + 1e-5) self.params['cntrl'].vary = True self.params['cntrl'].expr = cntrl_expr def fit(self, *args, **kwargs): try: self.prep_params() self.res = self.model.fit(params=self.params, *args, **kwargs) except Exception as e: print("Undefined exception while fit: {} {}".format(type(e), e), file=sys.stderr) raise return self.res def has_covar(self): covar = self.res.covar if covar is None or np.isnan(np.sum(covar)): return False else: return True def report(self): return self.res.fit_report(), self.res.covar
def FitSpectrumInit(self, label): """ Fit the spectrum with the fit params of another spectrum (given by label) as initial values. Useful when you fit big number of similar spectra. """ borders = np.genfromtxt(label + '/spectrumborders_' + label + '.txt', unpack=True) np.savetxt(self.label + '/spectrumborders_' + self.label + '.txt', borders) self.y = self.y[(self.x > borders[0]) & (self.x < borders[-1])] self.x = self.x[(self.x > borders[0]) & (self.x < borders[-1])] FitData = np.load(label + '/fitparams_' + label + '.npz') baseline = FitData['c'] / self.maxyvalue ctr = FitData['x0'] sigma = FitData['sigma'] gamma = FitData['gamma'] ramanmodel = ConstantModel() ramanmodel.set_param_hint('c', value=baseline[0], min=0) for i in range(len(sigma)): prefix = 'p' + str(i + 1) tempvoigt = Model(func=voigt, prefix=prefix) tempvoigt.set_param_hint(prefix + 'x0', value=ctr[i], min=0) tempvoigt.set_param_hint(prefix + 'sigma', value=sigma[i], min=0) tempvoigt.set_param_hint(prefix + 'gamma', value=gamma[i], min=0) tempvoigt.set_param_hint(prefix + 'height', expr='wofz(((0) + 1j*' + prefix + 'gamma) / ' + prefix + 'sigma / sqrt(2)).real') tempvoigt.set_param_hint(prefix + 'fwhm', expr='0.5346 * 2 *' + prefix + 'gamma + sqrt(0.2166 * (2*' + prefix + 'gamma)**2 + (2 * ' + prefix + 'sigma * sqrt(2 * log(2) ) )**2 )') ramanmodel += tempvoigt pars = ramanmodel.make_params() fitresult = ramanmodel.fit(self.y, pars, x=self.x, scale_covar=True) plt.clf() comps = fitresult.eval_components() xplot = np.linspace(self.x[0], self.x[-1], 1000) plt.plot(self.x, self.y * self.maxyvalue, 'r-') plt.plot(self.x, fitresult.best_fit * self.maxyvalue) for i in range(0, len(sigma)): plt.plot( self.x, comps['p' + str(i + 1)] * self.maxyvalue + comps['constant'] * self.maxyvalue, 'k-') plt.savefig(self.label + '/rawplot_' + self.label + '.pdf') save_modelresult(fitresult, self.label + '/modelresult_' + self.label + '.sav') plt.clf()
def FitSpectrum(self): """ Fit Spectrum with initial values provided by SelectBaseline() and SelectPeaks() """ polyparams = self.Fitbaseline(self) base = polyparams[0].n ramanmodel = ConstantModel() ramanmodel.set_param_hint('c', value=base, min=0) globwidth = 1 xpeak, ypeak = np.genfromtxt(self.peakfile, unpack=True) if type(xpeak) == np.float64: xpeak = [xpeak] ypeak = [ypeak] for i in range(0, len(xpeak)): prefix = 'p' + str(i + 1) tempvoigt = Model(func=voigt, prefix=prefix) tempvoigt.set_param_hint(prefix + 'x0', value=xpeak[i], min=0) tempvoigt.set_param_hint(prefix + 'sigma', value=globwidth, min=0) tempvoigt.set_param_hint(prefix + 'gamma', value=globwidth, min=0) tempvoigt.set_param_hint(prefix + 'height', value=ypeak[i], expr='wofz(((0) + 1j*' + prefix + 'gamma) / ' + prefix + 'sigma / sqrt(2)).real') tempvoigt.set_param_hint(prefix + 'fwhm', expr='0.5346 * 2 *' + prefix + 'gamma + sqrt(0.2166 * (2*' + prefix + 'gamma)**2 + (2 * ' + prefix + 'sigma * sqrt(2 * log(2) ) )**2 )') ramanmodel += tempvoigt pars = ramanmodel.make_params() fitresult = ramanmodel.fit(self.y, pars, x=self.x, scale_covar=True) print(fitresult.fit_report(min_correl=0.5)) comps = fitresult.eval_components() xplot = np.linspace(self.x[0], self.x[-1], 1000) plt.plot(self.x, self.y * self.maxyvalue, 'rx') plt.plot(self.x, fitresult.best_fit * self.maxyvalue) for i in range(0, len(xpeak)): plt.plot( self.x, comps['p' + str(i + 1)] * self.maxyvalue + comps['constant'] * self.maxyvalue, 'k-') plt.show() plt.savefig(self.label + '/rawplot_' + self.label + '.pdf') save_modelresult(fitresult, self.label + '/modelresult_' + self.label + '.sav')
class CModel(Model): """docstring for CModel""" def __init__(self, nexp=0, sum_one=False): self.sum_one_flag = sum_one self.model = ConstantModel() self.nexp = 0 self.errors = None self.params = None self.res = None for _ in range(nexp): self.add_exp() def add_exp(self): self.nexp += 1 self.model += ExponentialModel(prefix=Prefixes[self.nexp]) def prep_params(self, tcf_type): if tcf_type == 'acf': self.prep_acfParams() elif tcf_type == 'ccf': self.prep_ccfParams() def prep_ccfParams(self): amp = '{}amplitude' dec = '{}decay' self.model.set_param_hint('c', value=1.0) for i in range(1, self.nexp + 1): currA = amp.format(Prefixes[i]) currT = dec.format(Prefixes[i]) self.model.set_param_hint(currA, value=1, min=-1.5, max=1.5) self.model.set_param_hint(currT, value=1, min=0) self.params = self.model.make_params() def prep_acfParams(self): amp = '{}amplitude' dec = '{}decay' cntrl_expr = ' ' if self.sum_one_flag: cntrl_expr = 'c' self.model.set_param_hint('c', value=1.0, min=0) for i in range(1, self.nexp + 1): currA = amp.format(Prefixes[i]) currT = dec.format(Prefixes[i]) self.model.set_param_hint(currA, value=1.0, min=0.0) self.model.set_param_hint(currT, value=1.0, min=0.0) if self.sum_one_flag: cntrl_expr += ' + ' + currA self.params = self.model.make_params() if self.sum_one_flag: self.params.add('cntrl', value= 1, max= 1+1e-5, min= 1-1e-5) self.params['cntrl'].vary = True self.params['cntrl'].expr = cntrl_expr def fit(self, tcf_type='acf', *args, **kwargs): try: self.prep_params(tcf_type) self.res = self.model.fit(params=self.params, *args, **kwargs) except Exception as e: print("Undefined exception while fit: {} {}".format(type(e), e), file=sys.stderr) raise return self.res def has_covar(self): covar = self.res.covar if covar is None or np.isnan(np.sum(covar)): return False else: return True def check_errors(self): for ivar, name in enumerate(self.res.var_names): par = self.res.params[name] if par.stderr / par.value > 1: return False return True def report(self): return self.res.fit_report(), self.res.covar