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()
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()
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()
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()
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()
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()
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()