Exemplo n.º 1
0
    def _decompose_threaded(self,
                            callback,
                            label,
                            signal=None,
                            algorithm=None,
                            ns=None):
        if ns is None:
            ns = Namespace()
            ns.autosig = signal is None
            ns.s, signal = self._get_signal(signal)

        def do_threaded():
            ns.s = self._do_decomposition(ns.s, algorithm=algorithm)

        def on_error(message=None):
            em = QErrorMessage(self.ui)
            msg = tr("An error occurred during decomposition")
            if message:
                msg += ":\n" + message
            em.setWindowTitle(tr("Decomposition error"))
            em.showMessage(msg)

        t = ProgressThreaded(self.ui,
                             do_threaded,
                             lambda: callback(ns),
                             label=label)
        t.worker.error[str].connect(on_error)
        t.run()
Exemplo n.º 2
0
    def fft(self,
            signals=None,
            shift=True,
            power_spectrum=True,
            inverse=False,
            on_complete=None):
        if signals is None:
            signals = self.ui.get_selected_signals()
        if isinstance(signals, hs.signals.BaseSignal):
            signals = (signals, )

        fftsignals = []

        def do_ffts():
            for i, signal in enumerate(signals):
                if inverse:
                    fft = signal.ifft(shift=shift)
                else:
                    fft = signal.fft(shift=shift)
                fftsignals.append(fft)
                yield i + 1

        def on_ffts_complete():
            for fs in fftsignals:
                fs.plot(power_spectrum=power_spectrum)
                sw = self.ui.lut_signalwrapper[fs]
                if on_complete is not None:
                    on_complete(sw)

        if len(signals) > 1:
            if inverse:
                label = tr('Performing inverse FFT')
            else:
                label = tr('Performing FFT')
            t = ProgressThreaded(
                self.ui,
                do_ffts(),
                on_ffts_complete,
                label=label,
            )
            # This breaks the progress bar...
            # generator_N=len(signals))
            t.run()
        else:
            for i in do_ffts():
                pass
            on_ffts_complete()
Exemplo n.º 3
0
    def _decompose_threaded(self,
                            callback,
                            label,
                            signal=None,
                            algorithm=None,
                            ns=None):
        if ns is None:
            ns = Namespace()
            ns.autosig = signal is None
            ns.s, signal = self._get_signal(signal)

        def do_threaded():
            ns.s = self._do_decomposition(ns.s, algorithm=algorithm)

        t = ProgressThreaded(self.ui,
                             do_threaded,
                             lambda: callback(ns),
                             label=label)
        t.run()
Exemplo n.º 4
0
    def _decompose_threaded(self, callback, label, signal=None,
                            algorithm=None, ns=None):
        if ns is None:
            ns = Namespace()
            ns.autosig = signal is None
            ns.s, signal = self._get_signal(signal)

        def do_threaded():
            ns.s = self._do_decomposition(ns.s, algorithm=algorithm)

        def on_error(message=None):
            em = QErrorMessage(self.ui)
            msg = tr("An error occurred during decomposition")
            if message:
                msg += ":\n" + message
            em.setWindowTitle(tr("Decomposition error"))
            em.showMessage(msg)

        t = ProgressThreaded(self.ui, do_threaded, lambda: callback(ns),
                             label=label)
        t.worker.error[str].connect(on_error)
        t.run()
Exemplo n.º 5
0
    def nfft(self, signals=None, inverse=False):
        if signals is None:
            signals = self.ui.get_selected_signals()
            if signals is None:
                return
        # Make sure we can iterate
        if isinstance(signals, hyperspy.signal.BaseSignal):
            signals = (signals,)

        if len(signals) < 1:
            return

        fftsignals = []

        def on_ftts_complete():
            for fs in fftsignals:
                fs.plot()

        def do_ffts():
            j = 0
            for s in signals:
                ffts = s.deepcopy()
                if ffts.data.itemsize <= 4:
                    ffts.change_dtype(np.complex64)
                else:
                    ffts.change_dtype(np.complex128)

                am = AxesManager(s.axes_manager._get_axes_dicts())
                for idx in am:
                    fftdata = s.data[am._getitem_tuple]
                    fftdata = scipy.fftpack.fftn(fftdata)
                    fftdata = scipy.fftpack.fftshift(fftdata)
                    ffts.data[am._getitem_tuple] = fftdata
                    j += 1
                    yield j

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    axis.scale = 1 / (s_axis.size * s_axis.scale)
                    shift = (axis.high_value - axis.low_value) / 2
                    axis.offset -= shift
                    u = s_axis.units
                    if u is traits.Undefined:
                        pass  # Leave unit as undefined
                    elif u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                ffts.metadata.General.title = 'FFT of ' + \
                    ffts.metadata.General.title + indstr
                fftsignals.append(ffts)

        def do_iffts():
            j = 0
            for s in signals:
                ffts = s.deepcopy()
                if ffts.data.itemsize <= 4:
                    ffts.change_dtype(np.float32)
                else:
                    ffts.change_dtype(np.float64)

                am = AxesManager(s.axes_manager._get_axes_dicts())

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    shift = (axis.high_value - axis.low_value) / 2
                    axis.offset += shift
                    axis.scale = 1 / (s_axis.size * s_axis.scale)
                    u = s_axis.units
                    if u is traits.Undefined:
                        pass  # Leave unit as undefined
                    elif u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u

                for idx in am:
                    fftdata = s.data[am._getitem_tuple]
                    fftdata = scipy.fftpack.ifftshift(fftdata)
                    fftdata = scipy.fftpack.ifftn(fftdata)
                    fftdata = np.abs(fftdata)
                    ffts.data[am._getitem_tuple] = fftdata
                    j += 1
                    yield j
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                ffts.metadata.General.title = 'Inverse FFT of ' + \
                    ffts.metadata.General.title + indstr
                fftsignals.append(ffts)

        n_ffts = np.product([d for s in signals
                             for d in s.axes_manager.navigation_shape])
        if inverse:
            label = tr('Performing inverse FFT')
            f = do_iffts()
        else:
            label = tr('Performing FFT')
            f = do_ffts()
        t = ProgressThreaded(self.ui, f, on_ftts_complete,
                             label=label,
                             cancellable=True,
                             generator_N=n_ffts)
        t.run()
Exemplo n.º 6
0
    def fft(self, signals=None, inverse=False, on_complete=None):
        if signals is None:
            signals = self.ui.get_selected_signals()
        # Make sure we can iterate
        if isinstance(signals, hyperspy.signal.BaseSignal):
            signals = (signals,)

        fftsignals = []

        def on_ffts_complete():
            for fs in fftsignals:
                fs.plot()
                sw = self.ui.lut_signalwrapper[fs]
                if on_complete is not None:
                    on_complete(sw)

        def do_ffts():
            for i, s in enumerate(signals):
                if inverse:
                    fftdata = scipy.fftpack.ifftshift(s())
                    fftdata = scipy.fftpack.ifftn(fftdata)
                    fftdata = np.abs(fftdata)
                else:
                    fftdata = scipy.fftpack.fftn(s())
                    fftdata = scipy.fftpack.fftshift(fftdata)

                ffts = s.__class__(
                    fftdata,
                    axes=s.axes_manager._get_signal_axes_dicts(),
                    metadata=s.metadata.as_dictionary(),)
                ffts.axes_manager._set_axis_attribute_values("navigate", False)
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                invstr = "Inverse " if inverse else ""
                ffts.metadata.General.title = invstr + 'FFT of ' + \
                    ffts.metadata.General.title + indstr

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    if not inverse:
                        axis.scale = 1 / (s_axis.size * s_axis.scale)
                    shift = (axis.high_value - axis.low_value) / 2
                    if inverse:
                        shift = -shift
                    axis.offset -= shift
                    if inverse:
                        axis.scale = 1 / (s_axis.size * s_axis.scale)
                    u = s_axis.units
                    if u is traits.Undefined:
                        pass  # Leave unit as undefined
                    elif u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u
                fftsignals.append(ffts)
                yield i + 1

        if len(signals) > 1:
            if inverse:
                label = tr('Performing inverse FFT')
            else:
                label = tr('Performing FFT')
            t = ProgressThreaded(self.ui, do_ffts(), on_ffts_complete,
                                 label=label,
                                 generator_N=len(signals))
            t.run()
        else:
            for i in do_ffts():
                pass
            on_ffts_complete()
Exemplo n.º 7
0
    def nfft(self, signals=None, inverse=False):
        if signals is None:
            signals = self.ui.get_selected_signals()
            if signals is None:
                return
        # Make sure we can iterate
        if isinstance(signals, hyperspy.signal.BaseSignal):
            signals = (signals, )

        if len(signals) < 1:
            return

        fftsignals = []

        def on_ftts_complete():
            for fs in fftsignals:
                fs.plot()

        def do_ffts():
            j = 0
            for s in signals:
                ffts = s.deepcopy()
                if ffts.data.itemsize <= 4:
                    ffts.change_dtype(np.complex64)
                else:
                    ffts.change_dtype(np.complex128)

                am = AxesManager(s.axes_manager._get_axes_dicts())
                for idx in am:
                    fftdata = s.data[am._getitem_tuple]
                    fftdata = scipy.fftpack.fftn(fftdata)
                    fftdata = scipy.fftpack.fftshift(fftdata)
                    ffts.data[am._getitem_tuple] = fftdata
                    j += 1
                    yield j

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    axis.scale = 1 / (s_axis.size * s_axis.scale)
                    shift = (axis.high_value - axis.low_value) / 2
                    axis.offset -= shift
                    u = s_axis.units
                    if u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                ffts.metadata.General.title = 'FFT of ' + \
                    ffts.metadata.General.title + indstr
                fftsignals.append(ffts)

        def do_iffts():
            j = 0
            for s in signals:
                ffts = s.deepcopy()
                if ffts.data.itemsize <= 4:
                    ffts.change_dtype(np.float32)
                else:
                    ffts.change_dtype(np.float64)

                am = AxesManager(s.axes_manager._get_axes_dicts())

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    shift = (axis.high_value - axis.low_value) / 2
                    axis.offset += shift
                    axis.scale = 1 / (s_axis.size * s_axis.scale)
                    u = s_axis.units
                    if u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u

                for idx in am:
                    fftdata = s.data[am._getitem_tuple]
                    fftdata = scipy.fftpack.ifftshift(fftdata)
                    fftdata = scipy.fftpack.ifftn(fftdata)
                    fftdata = np.abs(fftdata)
                    ffts.data[am._getitem_tuple] = fftdata
                    j += 1
                    yield j
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                ffts.metadata.General.title = 'Inverse FFT of ' + \
                    ffts.metadata.General.title + indstr
                fftsignals.append(ffts)

        n_ffts = np.product([
            d for s in signals for d in s.signal.axes_manager.navigation_shape
        ])
        if inverse:
            label = tr('Performing inverse FFT')
            f = do_iffts()
        else:
            label = tr('Performing FFT')
            f = do_ffts()
        t = ProgressThreaded(self.ui,
                             f,
                             on_ftts_complete,
                             label=label,
                             cancellable=True,
                             generator_N=n_ffts)
        t.run()
Exemplo n.º 8
0
    def fft(self, signals=None, inverse=False, on_complete=None):
        if signals is None:
            signals = self.ui.get_selected_signals()
        # Make sure we can iterate
        if isinstance(signals, hyperspy.signal.BaseSignal):
            signals = (signals, )

        fftsignals = []

        def on_ffts_complete():
            for fs in fftsignals:
                fs.plot()
                sw = self.ui.lut_signalwrapper[fs]
                if on_complete is not None:
                    on_complete(sw)

        def do_ffts():
            for i, s in enumerate(signals):
                if inverse:
                    fftdata = scipy.fftpack.ifftshift(s())
                    fftdata = scipy.fftpack.ifftn(fftdata)
                    fftdata = np.abs(fftdata)
                else:
                    fftdata = scipy.fftpack.fftn(s())
                    fftdata = scipy.fftpack.fftshift(fftdata)

                ffts = s.__class__(
                    fftdata,
                    axes=s.axes_manager._get_signal_axes_dicts(),
                    metadata=s.metadata.as_dictionary(),
                )
                ffts.axes_manager._set_axis_attribute_values("navigate", False)
                indstr = ' ' + str(s.axes_manager.indices) \
                    if len(s.axes_manager.indices) > 0 else ''
                invstr = "Inverse " if inverse else ""
                ffts.metadata.General.title = invstr + 'FFT of ' + \
                    ffts.metadata.General.title + indstr

                for i in range(ffts.axes_manager.signal_dimension):
                    axis = ffts.axes_manager.signal_axes[i]
                    s_axis = s.axes_manager.signal_axes[i]
                    if not inverse:
                        axis.scale = 1 / (s_axis.size * s_axis.scale)
                    shift = (axis.high_value - axis.low_value) / 2
                    if inverse:
                        shift = -shift
                    axis.offset -= shift
                    if inverse:
                        axis.scale = 1 / (s_axis.size * s_axis.scale)
                    u = s_axis.units
                    if u.endswith('-1'):
                        u = u[:-2]
                    else:
                        u += '-1'
                    axis.units = u
                fftsignals.append(ffts)
                yield i + 1

        if len(signals) > 1:
            if inverse:
                label = tr('Performing inverse FFT')
            else:
                label = tr('Performing FFT')
            t = ProgressThreaded(self.ui,
                                 do_ffts(),
                                 on_ffts_complete,
                                 label=label,
                                 generator_N=len(signals))
            t.run()
        else:
            for i in do_ffts():
                pass
            on_ffts_complete()