Esempio n. 1
0
    def __init__(self,
                 spectrum,
                 auto_background=True,
                 auto_add_edges=True,
                 ll=None,
                 GOS=None,
                 dictionary=None):
        Model1D.__init__(self, spectrum)
        self._suspend_auto_fine_structure_width = False
        self.convolved = False
        self.low_loss = ll
        self.GOS = GOS
        self.edges = []
        self._background_components = []
        if dictionary is not None:
            auto_background = False
            auto_add_edges = False
            self._load_dictionary(dictionary)

        if auto_background is True:
            background = PowerLaw()
            self.append(background)

        if self.spectrum.subshells and auto_add_edges is True:
            self._add_edges_from_subshells_names()
Esempio n. 2
0
 def __init__(self, spectrum,
              auto_background=True,
              auto_add_lines=True,
              *args, **kwargs):
     Model1D.__init__(self, spectrum, *args, **kwargs)
     self.xray_lines = list()
     end_energy = self.axes_manager.signal_axes[0].high_value
     self.end_energy = min(end_energy, self.spectrum._get_beam_energy())
     self.start_energy = self.axes_manager.signal_axes[0].low_value
     self.background_components = list()
     if auto_background is True:
         self.add_polynomial_background()
     if auto_add_lines is True:
         self.add_family_lines()
Esempio n. 3
0
 def __init__(self,
              spectrum,
              auto_background=True,
              auto_add_lines=True,
              *args,
              **kwargs):
     Model1D.__init__(self, spectrum, *args, **kwargs)
     self.xray_lines = list()
     end_energy = self.axes_manager.signal_axes[0].high_value
     self.end_energy = min(end_energy, self.spectrum._get_beam_energy())
     self.start_energy = self.axes_manager.signal_axes[0].low_value
     self.background_components = list()
     if auto_background is True:
         self.add_polynomial_background()
     if auto_add_lines is True:
         self.add_family_lines()
Esempio n. 4
0
def _estimate_gain(ns, cs,
                   weighted=False,
                   higher_than=None,
                   plot_results=False,
                   binning=0,
                   pol_order=1):
    if binning > 0:
        factor = 2 ** binning
        remainder = np.mod(ns.shape[1], factor)
        if remainder != 0:
            ns = ns[:, remainder:]
            cs = cs[:, remainder:]
        new_shape = (ns.shape[0], ns.shape[1] / factor)
        ns = rebin(ns, new_shape)
        cs = rebin(cs, new_shape)

    noise = ns - cs
    variance = np.var(noise, 0)
    average = np.mean(cs, 0).squeeze()

    # Select only the values higher_than for the calculation
    if higher_than is not None:
        sorting_index_array = np.argsort(average)
        average_sorted = average[sorting_index_array]
        average_higher_than = average_sorted > higher_than
        variance_sorted = variance.squeeze()[sorting_index_array]
        variance2fit = variance_sorted[average_higher_than]
        average2fit = average_sorted[average_higher_than]
    else:
        variance2fit = variance
        average2fit = average

    fit = np.polyfit(average2fit, variance2fit, pol_order)
    if weighted is True:
        from hyperspy._signals.spectrum import Spectrum
        from hyperspy.models.model1D import Model1D
        from hyperspy.components import Line
        s = Spectrum(variance2fit)
        s.axes_manager.signal_axes[0].axis = average2fit
        m = Model1D(s)
        l = Line()
        l.a.value = fit[1]
        l.b.value = fit[0]
        m.append(l)
        m.fit(weights=True)
        fit[0] = l.b.value
        fit[1] = l.a.value

    if plot_results is True:
        plt.figure()
        plt.scatter(average.squeeze(), variance.squeeze())
        plt.xlabel('Counts')
        plt.ylabel('Variance')
        plt.plot(average2fit, np.polyval(fit, average2fit), color='red')
    results = {'fit': fit, 'variance': variance.squeeze(),
               'counts': average.squeeze()}

    return results
Esempio n. 5
0
 def test_3d_signal(self):
     # This code should run smoothly, any exceptions should trigger failure
     s = self.m_3d.as_signal(show_progressbar=None)
     model = Model1D(s)
     p = hs.model.components.Polynomial(order=2)
     model.append(p)
     p.estimate_parameters(s, 0, 100, only_current=False)
     np.testing.assert_allclose(p.coefficients.map['values'],
                                np.tile([0.5, 2, 3], (2, 5, 1)))
Esempio n. 6
0
    def __init__(self, spectrum, auto_background=True, auto_add_edges=True, ll=None, GOS=None, dictionary=None):
        Model1D.__init__(self, spectrum)
        self._suspend_auto_fine_structure_width = False
        self.convolved = False
        self.low_loss = ll
        self.GOS = GOS
        self.edges = []
        self._background_components = []
        if dictionary is not None:
            auto_background = False
            auto_add_edges = False
            self._load_dictionary(dictionary)

        if auto_background is True:
            background = PowerLaw()
            self.append(background)

        if self.signal.subshells and auto_add_edges is True:
            self._add_edges_from_subshells_names()
Esempio n. 7
0
 def __init__(self, spectrum,
              auto_background=True,
              auto_add_lines=True,
              *args, **kwargs):
     Model1D.__init__(self, spectrum, *args, **kwargs)
     self.xray_lines = list()
     end_energy = self.axes_manager.signal_axes[0].high_value
     self.end_energy = min(end_energy, self.signal._get_beam_energy())
     self.start_energy = self.axes_manager.signal_axes[0].low_value
     self.background_components = list()
     if 'dictionary' in kwargs or len(args) > 1:
         d = args[1] if len(args) > 1 else kwargs['dictionary']
         if len(d['xray_lines']) > 0:
             self.xray_lines.extend(
                 [self[name] for name in d['xray_lines']])
             auto_add_lines = False
         if len(d['background_components']) > 0:
             self.background_components.extend(
                 [self[name] for name in d['background_components']])
             auto_background = False
     if auto_background is True:
         self.add_polynomial_background()
     if auto_add_lines is True:
         self.add_family_lines()
Esempio n. 8
0
    def create_model(self, dictionary=None):
        """Create a model for the current signal

        Parameters
        __________
        dictionary : {None, dict}, optional
            A dictionary to be used to recreate a model. Usually generated using
            :meth:`hyperspy.model.as_dictionary`

        Returns
        -------
        A Model class

        """
        from hyperspy.models.model1D import Model1D
        return Model1D(self, dictionary=dictionary)
Esempio n. 9
0
    def fit(self, fitter=None, method='ls', grad=False,
            bounded=False, ext_bounding=False, update_plot=False,
            kind='std', **kwargs):
        """Fits the model to the experimental data

        Parameters
        ----------
        fitter : {None, "leastsq", "odr", "mpfit", "fmin"}
            The optimizer to perform the fitting. If None the fitter
            defined in the Preferences is used. leastsq is the most
            stable but it does not support bounding. mpfit supports
            bounding. fmin is the only one that supports
            maximum likelihood estimation, but it is less robust than
            the Levenberg–Marquardt based leastsq and mpfit, and it is
            better to use it after one of them to refine the estimation.
        method : {'ls', 'ml'}
            Choose 'ls' (default) for least squares and 'ml' for
            maximum-likelihood estimation. The latter only works with
            fitter = 'fmin'.
        grad : bool
            If True, the analytical gradient is used if defined to
            speed up the estimation.
        ext_bounding : bool
            If True, enforce bounding by keeping the value of the
            parameters constant out of the defined bounding area.
        bounded : bool
            If True performs bounded optimization if the fitter
            supports it. Currently only mpfit support bounding.
        update_plot : bool
            If True, the plot is updated during the optimization
            process. It slows down the optimization but it permits
            to visualize the optimization evolution.
        kind : {'std', 'smart'}
            If 'std' (default) performs standard fit. If 'smart'
            performs smart_fit

        **kwargs : key word arguments
            Any extra key word argument will be passed to the chosen
            fitter

        See Also
        --------
        multifit, smart_fit

        """
        if kind == 'smart':
            self.smart_fit(fitter=fitter,
                           method=method,
                           grad=grad,
                           bounded=bounded,
                           ext_bounding=ext_bounding,
                           update_plot=update_plot,
                           **kwargs)
        elif kind == 'std':
            Model1D.fit(self,
                        fitter=fitter,
                        method=method,
                        grad=grad,
                        bounded=bounded,
                        ext_bounding=ext_bounding,
                        update_plot=update_plot,
                        **kwargs)
        else:
            raise ValueError('kind must be either \'std\' or \'smart\'.'
                             '\'%s\' provided.' % kind)
Esempio n. 10
0
    def fit(self,
            fitter=None,
            method='ls',
            grad=False,
            bounded=False,
            ext_bounding=False,
            update_plot=False,
            kind='std',
            **kwargs):
        """Fits the model to the experimental data

        Parameters
        ----------
        fitter : {None, "leastsq", "odr", "mpfit", "fmin"}
            The optimizer to perform the fitting. If None the fitter
            defined in the Preferences is used. leastsq is the most
            stable but it does not support bounding. mpfit supports
            bounding. fmin is the only one that supports
            maximum likelihood estimation, but it is less robust than
            the Levenberg–Marquardt based leastsq and mpfit, and it is
            better to use it after one of them to refine the estimation.
        method : {'ls', 'ml'}
            Choose 'ls' (default) for least squares and 'ml' for
            maximum-likelihood estimation. The latter only works with
            fitter = 'fmin'.
        grad : bool
            If True, the analytical gradient is used if defined to
            speed up the estimation.
        ext_bounding : bool
            If True, enforce bounding by keeping the value of the
            parameters constant out of the defined bounding area.
        bounded : bool
            If True performs bounded optimization if the fitter
            supports it. Currently only mpfit support bounding.
        update_plot : bool
            If True, the plot is updated during the optimization
            process. It slows down the optimization but it permits
            to visualize the optimization evolution.
        kind : {'std', 'smart'}
            If 'std' (default) performs standard fit. If 'smart'
            performs smart_fit

        **kwargs : key word arguments
            Any extra key word argument will be passed to the chosen
            fitter

        See Also
        --------
        multifit, smart_fit

        """
        if kind == 'smart':
            self.smart_fit(fitter=fitter,
                           method=method,
                           grad=grad,
                           bounded=bounded,
                           ext_bounding=ext_bounding,
                           update_plot=update_plot,
                           **kwargs)
        elif kind == 'std':
            Model1D.fit(self,
                        fitter=fitter,
                        method=method,
                        grad=grad,
                        bounded=bounded,
                        ext_bounding=ext_bounding,
                        update_plot=update_plot,
                        **kwargs)
        else:
            raise ValueError('kind must be either \'std\' or \'smart\'.'
                             '\'%s\' provided.' % kind)