def test_running(self, extrapolate_lowloss): s = signals.EELSSpectrum(np.arange(200)) gaussian = Gaussian() gaussian.A.value = 50 gaussian.sigma.value = 10 gaussian.centre.value = 20 s_ll = signals.EELSSpectrum(gaussian.function(np.arange(0, 200, 1))) s_ll.axes_manager[0].offset = -50 s.fourier_ratio_deconvolution(s_ll, extrapolate_lowloss=extrapolate_lowloss)
def _create_signal(shape, dim, dtype, metadata): data = np.arange(np.product(shape)).reshape(shape).astype(dtype) if dim == 1: if len(shape) > 2: s = signals.EELSSpectrum(data) if metadata: s.set_microscope_parameters(beam_energy=100., convergence_angle=1., collection_angle=10.) else: s = signals.EDSTEMSpectrum(data) if metadata: s.set_microscope_parameters(beam_energy=100., live_time=1., tilt_stage=2., azimuth_angle=3., elevation_angle=4., energy_resolution_MnKa=5.) else: s = signals.BaseSignal(data).transpose(signal_axes=dim) if metadata: s.metadata.General.date = "2016-08-06" s.metadata.General.time = "10:55:00" s.metadata.General.title = "Test title" for i, axis in enumerate(s.axes_manager._axes): i += 1 axis.offset = i * 0.5 axis.scale = i * 100 axis.name = "%i" % i if axis.navigate: axis.units = "m" else: axis.units = "eV" return s
def get_low_loss_eels_line_scan_signal(add_noise=True, random_state=None): """Get an artificial low loss electron energy loss line scan spectrum. The zero loss peak is offset by 4.1 eV. Parameters ---------- %s %s Example ------- >>> s = hs.datasets.artificial_data.get_low_loss_eels_signal() >>> s.plot() See also -------- artificial_low_loss_line_scan_signal : :py:class:`~hyperspy._signals.eels.EELSSpectrum` """ random_state = check_random_state(random_state) x = np.arange(-100, 400, 0.5) zero_loss = components1d.Gaussian(A=100, centre=4.1, sigma=1) plasmon = components1d.Gaussian(A=100, centre=60, sigma=20) data_signal = zero_loss.function(x) data_signal += plasmon.function(x) data = np.zeros((12, len(x))) for i in range(12): data[i] += data_signal if add_noise: data[i] += random_state.uniform(size=len(x)) * 0.7 s = signals.EELSSpectrum(data) s.axes_manager.signal_axes[0].offset = x[0] s.axes_manager.signal_axes[0].scale = x[1] - x[0] s.metadata.General.title = 'Artifical low loss EEL spectrum' s.axes_manager.signal_axes[0].name = 'Electron energy loss' s.axes_manager.signal_axes[0].units = 'eV' s.axes_manager.navigation_axes[0].name = 'Probe position' s.axes_manager.navigation_axes[0].units = 'nm' s.set_microscope_parameters(beam_energy=200, convergence_angle=26, collection_angle=20) return s
def setup_method(self, method): s = signals.EELSSpectrum(np.zeros((10, 100))) self.scale = 0.1 self.offset = -2 eaxis = s.axes_manager.signal_axes[0] eaxis.scale = self.scale eaxis.offset = self.offset self.izlp = eaxis.value2index(0) self.bg = 2 self.ishifts = np.array([0, 4, 2, -2, 5, -2, -5, -9, -9, -8]) self.new_offset = self.offset - self.ishifts.min() * self.scale s.data[np.arange(10), self.ishifts + self.izlp] = 10 s.data += self.bg s.axes_manager[-1].offset += 100 self.signal = s
def compare_spectra(s1, s2, same_size=True): '''Compares two EELS spectra, spectrum lines or spectrum images. Currently same_size=False is not suported.''' if same_size == False: raise NameError('Sorry, function under development') return if same_size == True and s1.data.shape != s2.data.shape: raise NameError( 'Actually, what you want to compare is not the same size.') return scomp = signals.EELSSpectrum(s1.data + 1j * s2.data) copy_eaxis(scomp, s1) scomp.plot() return scomp
def get_low_loss_eels_signal(add_noise=True, random_state=None): """Get an artificial low loss electron energy loss spectrum. The zero loss peak is offset by 4.1 eV. Parameters ---------- %s %s Example ------- >>> s = hs.datasets.artificial_data.get_low_loss_eels_signal() >>> s.plot() See also -------- get_core_loss_eels_signal, get_core_loss_eels_model, get_low_loss_eels_line_scan_signal, get_core_loss_eels_line_scan_signal """ random_state = check_random_state(random_state) x = np.arange(-100, 400, 0.5) zero_loss = components1d.Gaussian(A=100, centre=4.1, sigma=1) plasmon = components1d.Gaussian(A=100, centre=60, sigma=20) data = zero_loss.function(x) data += plasmon.function(x) if add_noise: data += random_state.uniform(size=len(x)) * 0.7 s = signals.EELSSpectrum(data) s.axes_manager[0].offset = x[0] s.axes_manager[0].scale = x[1] - x[0] s.metadata.General.title = 'Artifical low loss EEL spectrum' s.axes_manager[0].name = 'Electron energy loss' s.axes_manager[0].units = 'eV' s.set_microscope_parameters(beam_energy=200, convergence_angle=26, collection_angle=20) return s
def setup_method(self, method): # Create an empty spectrum s = signals.EELSSpectrum(np.zeros((3, 2, 1024))) energy_axis = s.axes_manager.signal_axes[0] energy_axis.scale = 0.02 energy_axis.offset = -5 gauss = Gaussian() gauss.centre.value = 0 gauss.A.value = 5000 gauss.sigma.value = 0.5 gauss2 = Gaussian() gauss2.sigma.value = 0.5 # Inflexion point 1.5 gauss2.A.value = 5000 gauss2.centre.value = 5 s.data[:] = (gauss.function(energy_axis.axis) + gauss2.function(energy_axis.axis)) self.signal = s
def setup_method(self, method): # Create an empty spectrum s = signals.EELSSpectrum(np.ones((4, 2, 1024))) self.signal = s
def setup_method(self, method): s = signals.EELSSpectrum(0.1 * np.arange(50, 250, 0.5)**-3.) s.metadata.Signal.binned = False s.axes_manager[-1].offset = 50 s.axes_manager[-1].scale = 0.5 self.s = s
def setup_method(self, method): s = signals.EELSSpectrum(np.diag(np.arange(1, 11))) s.axes_manager[-1].scale = 0.1 s.axes_manager[-1].offset = 100 self.signal = s
def get_core_loss_eels_signal(add_powerlaw=False, add_noise=True, random_state=None): """Get an artificial core loss electron energy loss spectrum. Similar to a Mn-L32 edge from a perovskite oxide. Some random noise is also added to the spectrum, to simulate experimental noise. Parameters ---------- %s %s %s Example ------- >>> import hs.datasets.artifical_data as ad >>> s = ad.get_core_loss_eels_signal() >>> s.plot() With the powerlaw background >>> s = ad.get_core_loss_eels_signal(add_powerlaw=True) >>> s.plot() To make the noise the same for multiple spectra, which can be useful for testing fitting routines >>> s1 = ad.get_core_loss_eels_signal(random_state=10) >>> s2 = ad.get_core_loss_eels_signal(random_state=10) >>> (s1.data == s2.data).all() True See also -------- get_core_loss_eels_line_scan_signal, get_low_loss_eels_line_scan_signal, get_core_loss_eels_model """ random_state = check_random_state(random_state) x = np.arange(400, 800, 1) arctan = components1d.EELSArctan(A=1, k=0.2, x0=688) mn_l3_g = components1d.Gaussian(A=100, centre=695, sigma=4) mn_l2_g = components1d.Gaussian(A=20, centre=720, sigma=4) data = arctan.function(x) data += mn_l3_g.function(x) data += mn_l2_g.function(x) if add_noise: data += random_state.uniform(size=len(x)) * 0.7 if add_powerlaw: powerlaw = components1d.PowerLaw(A=10e8, r=3, origin=0) data += powerlaw.function(x) s = signals.EELSSpectrum(data) s.axes_manager[0].offset = x[0] s.metadata.General.title = 'Artifical core loss EEL spectrum' s.axes_manager[0].name = 'Electron energy loss' s.axes_manager[0].units = 'eV' s.set_microscope_parameters(beam_energy=200, convergence_angle=26, collection_angle=20) return s
def get_core_loss_eels_line_scan_signal(add_powerlaw=False, add_noise=True, random_state=None): """Get an artificial core loss electron energy loss line scan spectrum. Similar to a Mn-L32 and Fe-L32 edge from a perovskite oxide. Parameters ---------- %s %s %s Example ------- >>> s = hs.datasets.artificial_data.get_core_loss_eels_line_scan_signal() >>> s.plot() See also -------- get_low_loss_eels_line_scan_signal, get_core_loss_eels_model """ random_state = check_random_state(random_state) x = np.arange(400, 800, 1) arctan_mn = components1d.EELSArctan(A=1, k=0.2, x0=688) arctan_fe = components1d.EELSArctan(A=1, k=0.2, x0=612) mn_l3_g = components1d.Gaussian(A=100, centre=695, sigma=4) mn_l2_g = components1d.Gaussian(A=20, centre=720, sigma=4) fe_l3_g = components1d.Gaussian(A=100, centre=605, sigma=4) fe_l2_g = components1d.Gaussian(A=10, centre=630, sigma=3) mn_intensity = [1, 1, 1, 1, 1, 1, 0.8, 0.5, 0.2, 0, 0, 0] fe_intensity = [0, 0, 0, 0, 0, 0, 0.2, 0.5, 0.8, 1, 1, 1] data = np.zeros((len(mn_intensity), len(x))) for i in range(len(mn_intensity)): data[i] += arctan_mn.function(x) * mn_intensity[i] data[i] += mn_l3_g.function(x) * mn_intensity[i] data[i] += mn_l2_g.function(x) * mn_intensity[i] data[i] += arctan_fe.function(x) * fe_intensity[i] data[i] += fe_l3_g.function(x) * fe_intensity[i] data[i] += fe_l2_g.function(x) * fe_intensity[i] if add_noise: data[i] += random_state.uniform(size=len(x)) * 0.7 if add_powerlaw: powerlaw = components1d.PowerLaw(A=10e8, r=3, origin=0) data += powerlaw.function_nd(np.stack([x] * len(mn_intensity))) if add_powerlaw: powerlaw = components1d.PowerLaw(A=10e8, r=3, origin=0) data += powerlaw.function(x) s = signals.EELSSpectrum(data) s.axes_manager.signal_axes[0].offset = x[0] s.metadata.General.title = 'Artifical core loss EEL spectrum' s.axes_manager.signal_axes[0].name = 'Electron energy loss' s.axes_manager.signal_axes[0].units = 'eV' s.axes_manager.navigation_axes[0].name = 'Probe position' s.axes_manager.navigation_axes[0].units = 'nm' s.set_microscope_parameters(beam_energy=200, convergence_angle=26, collection_angle=20) return s