Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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')
Ejemplo n.º 5
0
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