def _create_signal( shape, dim, dtype, ): data = np.arange(np.product(shape)).reshape(shape).astype(dtype) if dim == 1: if len(shape) > 2: s = EELSSpectrum(data) s.set_microscope_parameters(beam_energy=100., convergence_angle=1., collection_angle=10.) else: s = EDSTEMSpectrum(data) 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 = BaseSignal(data) s.axes_manager.set_signal_dimension(dim) 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 _create_signal(shape, dim, dtype,): data = np.arange(np.product(shape)).reshape( shape).astype(dtype) if dim == 1: if len(shape) > 2: s = EELSSpectrum(data) s.set_microscope_parameters( beam_energy=100., convergence_angle=1., collection_angle=10.) else: s = EDSTEMSpectrum(data) 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 = BaseSignal(data) s.axes_manager.set_signal_dimension(dim) 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_core_loss_eels_line_scan_signal(): """Get an artificial core loss electron energy loss line scan spectrum. Similar to a Mn-L32 and Fe-L32 edge from a perovskite oxide. Returns ------- artificial_core_loss_line_scan_signal : HyperSpy EELSSpectrum Example ------- >>> s = hs.datasets.artificial_data.get_core_loss_eels_line_scan_signal() >>> s.plot() See also -------- get_low_loss_eels_model : get a low loss signal get_core_loss_eels_model : get a model instead of a signal get_low_loss_eels_line_scan_signal : get low loss signal with the same size """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d x = np.arange(400, 800, 1) arctan_mn = components1d.Arctan(A=1, k=0.2, x0=688) arctan_mn.minimum_at_zero = True arctan_fe = components1d.Arctan(A=1, k=0.2, x0=612) arctan_fe.minimum_at_zero = True 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] data[i] += np.random.random(size=len(x)) * 0.7 s = 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
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` """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d 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 = 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(self): """To test the kramers_kronig_analysis we will generate 3 EELSSpectrum instances. First a model energy loss function(ELF), in our case following the Drude bulk plasmon peak. Second, we simulate the inelastic scattering to generate a model scattering distribution (SPC). Finally, we use a lorentzian peak with integral equal to 1 to simulate a ZLP. """ # Parameters i0 = 1. t = signals.Signal(np.arange(10, 70, 10).reshape((2, 3))) # thickness t.axes_manager.set_signal_dimension(0) scale = 0.02 # Create an 3x2x2048 spectrum with Drude plasmon s = EELSSpectrum(np.zeros((2, 3, 2 * 2048))) s.set_microscope_parameters(beam_energy=300.0, convergence_angle=5, collection_angle=10.0) s.axes_manager.signal_axes[0].scale = scale k = eels_constant(s, i0, t) vpm = VolumePlasmonDrude() m = create_model(s, auto_background=False) m.append(vpm) vpm.intensity.map['values'][:] = 1 vpm.plasmon_energy.map['values'] = np.array([[8., 18.4, 15.8], [16.6, 4.3, 3.7]]) vpm.fwhm.map['values'] = np.array([[2.3, 4.8, 0.53], [3.7, 0.3, 0.3]]) vpm.intensity.map['is_set'][:] = True vpm.plasmon_energy.map['is_set'][:] = True vpm.fwhm.map['is_set'][:] = True s.data = (m.as_signal() * k).data # Create ZLP z = s.deepcopy() z.axes_manager.signal_axes[0].scale = scale z.axes_manager.signal_axes[0].offset = -10 zlp = Lorentzian() zlp.A.value = i0 zlp.gamma.value = 0.2 zlp.centre.value = 0.0 z.data[:] = zlp.function(z.axes_manager[-1].axis).reshape((1, 1, -1)) z.data *= scale self.s = s self.thickness = t self.k = k self.zlp = z
def get_low_loss_eels_line_scan_signal(): """Get an artificial low loss electron energy loss line scan spectrum. The zero loss peak is offset by 4.1 eV. Returns ------- artificial_low_loss_line_scan_signal : HyperSpy EELSSpectrum Example ------- >>> s = hs.datasets.artificial_data.get_low_loss_eels_signal() >>> s.plot() See also -------- get_core_loss_eels_signal : get a core loss signal get_core_loss_eels_model : get a core loss model get_core_loss_eels_line_scan_signal : core loss signal with the same size """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d 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 data[i] += np.random.random(size=len(x)) * 0.7 s = 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 get_low_loss_eels_signal(): """Get an artificial low loss electron energy loss spectrum. The zero loss peak is offset by 4.1 eV. Returns ------- artificial_low_loss_signal : :py:class:`~hyperspy._signals.eels.EELSSpectrum` 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 """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d 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) data += np.random.random(size=len(x)) * 0.7 s = 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 get_core_loss_eels_signal(): """Get an artificial core loss electron energy loss spectrum. Similar to a Mn-L32 edge from a perovskite oxide. Returns ------- artificial_core_loss_signal : HyperSpy EELSSpectrum Example ------- >>> s = hs.datasets.artificial_data.get_core_loss_eels_signal() >>> s.plot() See also -------- get_low_loss_eels_model : get a low loss signal get_core_loss_eels_model : get a model instead of a signal get_low_loss_eels_line_scan_signal : get EELS low loss line scan get_core_loss_eels_line_scan_signal : get EELS core loss line scan """ x = np.arange(400, 800, 1) arctan = components1d.Arctan(A=1, k=0.2, x0=688) arctan.minimum_at_zero = True 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) data += np.random.random(size=len(x)) * 0.7 s = 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_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 """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d 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 = 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 """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d 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 = 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
def get_core_loss_eels_signal(add_powerlaw=False): """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 ---------- add_powerlaw : bool If True, adds a powerlaw background to the spectrum. Default False. Returns ------- artificial_core_loss_signal : HyperSpy EELSSpectrum 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 >>> np.random.seed(seed=10) >>> s1 = ad.get_core_loss_eels_signal() >>> np.random.seed(seed=10) >>> s2 = ad.get_core_loss_eels_signal() >>> (s1.data == s2.data).all() True See also -------- get_low_loss_eels_model : get a low loss signal get_core_loss_eels_model : get a model instead of a signal get_low_loss_eels_line_scan_signal : get EELS low loss line scan get_core_loss_eels_line_scan_signal : get EELS core loss line scan """ from hyperspy.signals import EELSSpectrum from hyperspy import components1d x = np.arange(400, 800, 1) arctan = components1d.Arctan(A=1, k=0.2, x0=688) arctan.minimum_at_zero = True 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) data += np.random.random(size=len(x)) * 0.7 if add_powerlaw: powerlaw = components1d.PowerLaw(A=10e8, r=3, origin=0) data += powerlaw.function(x) s = 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_signal(add_powerlaw=False): """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 ---------- add_powerlaw : bool If True, adds a powerlaw background to the spectrum. Default False. Returns ------- artificial_core_loss_signal : HyperSpy EELSSpectrum 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 >>> np.random.seed(seed=10) >>> s1 = ad.get_core_loss_eels_signal() >>> np.random.seed(seed=10) >>> s2 = ad.get_core_loss_eels_signal() >>> (s1.data == s2.data).all() True See also -------- get_low_loss_eels_model : get a low loss signal get_core_loss_eels_model : get a model instead of a signal get_low_loss_eels_line_scan_signal : get EELS low loss line scan get_core_loss_eels_line_scan_signal : get EELS core loss line scan """ x = np.arange(400, 800, 1) arctan = components1d.Arctan(A=1, k=0.2, x0=688) arctan.minimum_at_zero = True 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) data += np.random.random(size=len(x)) * 0.7 if add_powerlaw: powerlaw = components1d.PowerLaw(A=10e8, r=3, origin=0) data += powerlaw.function(x) s = 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