def test_compound(self): phy_quant = 'Current' phy_unit = 'nA' slow_to_fast = True ret_vals = gen_2pos_2spec(s2f_aux=slow_to_fast, mode='compound') pos_dims, spec_dims, ndata, data_2d = ret_vals tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_n_pos_n_spec_compound.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) objects = hs.load(file_path) assert isinstance(objects, list) assert len(objects) == 2 # 1. Validate object type for new_sig, comp_name in zip(objects, ['amp', 'phas']): compare_signal_from_usid(file_path, ndata[comp_name], new_sig, sig_type=hs.signals.BaseSignal, axes_to_spec=['Frequency', 'Bias'], compound_comp_name=comp_name)
def test_read_all_by_default(self): slow_to_fast = True pos_dims, spec_dims, ndata, data_2d = gen_2dim(all_pos=False, s2f_aux=slow_to_fast) phy_quant = 'Current' phy_unit = 'nA' tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_0_pos_n_spec.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) ret_vals = gen_2dim(all_pos=True, s2f_aux=slow_to_fast) pos_dims, spec_dims, ndata_2, data_2d_2 = ret_vals phy_quant = 'Current' phy_unit = 'nA' with h5py.File(file_path, mode='r+') as h5_f: h5_meas_grp = h5_f.create_group('Measurement_001') _ = usid.hdf_utils.write_main_dataset(h5_meas_grp, data_2d_2, 'Spat_Map', phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) objects = hs.load(file_path) assert isinstance(objects, list) assert len(objects) == 2 dset_names = [ '/Measurement_000/Channel_000/Raw_Data', 'Measurement_001/Spat_Map' ] # 1. Validate object type for new_sig, ndim_data, dataset_path in zip(objects, [ndata, ndata_2], dset_names): compare_signal_from_usid(file_path, ndim_data, new_sig, dataset_path=dataset_path)
def test_pick_specific(self): slow_to_fast = True ret_vals = gen_2pos_2spec(s2f_aux=slow_to_fast) pos_dims, spec_dims, ndata, data_2d = ret_vals phy_quant = 'Current' phy_unit = 'nA' tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_n_pos_n_spec.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) ret_vals = gen_2dim(all_pos=True, s2f_aux=slow_to_fast) pos_dims, spec_dims, ndata_2, data_2d_2 = ret_vals phy_quant = 'Current' phy_unit = 'nA' with h5py.File(file_path, mode='r+') as h5_f: h5_meas_grp = h5_f.create_group('Measurement_001') h5_chan_grp = h5_meas_grp.create_group('Channel_000') _ = usid.hdf_utils.write_main_dataset(h5_chan_grp, data_2d_2, 'Raw_Data', phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) dataset_path = '/Measurement_001/Channel_000/Raw_Data' new_sig = hs.load(file_path, dataset_path=dataset_path) compare_signal_from_usid(file_path, ndata_2, new_sig, dataset_path=dataset_path)
def base_n_pos_m_spec(self, lazy, slow_to_fast=True): phy_quant = 'Current' phy_unit = 'nA' ret_vals = gen_2pos_2spec(s2f_aux=slow_to_fast) pos_dims, spec_dims, ndata, data_2d = ret_vals tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_n_pos_n_spec.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) new_sig = hs.load(file_path, lazy=lazy) compare_signal_from_usid(file_path, ndata, new_sig, sig_type=hs.signals.BaseSignal, axes_to_spec=['Frequency', 'Bias'])
def test_non_linear_dimension(self): pos_dims = [ usid.Dimension('Y', 'um', np.linspace(0, 60, num=5)), usid.Dimension('X', 'nm', [-250, 750]) ] spec_dims = [ usid.Dimension('Bias', 'V', np.sin(np.linspace(0, 2 * np.pi, num=7))), usid.Dimension('Frequency', 'kHz', [300, 350, 400]) ] ndata = np.random.rand(5, 2, 7, 3) phy_quant = 'Current' phy_unit = 'nA' data_2d = ndata.reshape(np.prod(ndata.shape[:2]), np.prod(ndata.shape[2:])) tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_n_pos_n_spec_non_lin_dim.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=True) with pytest.raises(ValueError): _ = hs.load(file_path, ignore_non_linear_dims=False) with pytest.warns(UserWarning) as _: new_sig = hs.load(file_path) compare_signal_from_usid(file_path, ndata, new_sig, axes_to_spec=['Frequency', 'Bias'], invalid_axes=True)
def test_0_pos_n_spec(self): phy_quant = 'Current' phy_unit = 'nA' slow_to_fast = True pos_dims, spec_dims, ndata, data_2d = gen_2dim(all_pos=False, s2f_aux=slow_to_fast) tran = usid.ArrayTranslator() with tempfile.TemporaryDirectory() as tmp_dir: file_path = tmp_dir + 'usid_0_pos_n_spec.h5' _ = tran.translate(file_path, 'Blah', data_2d, phy_quant, phy_unit, pos_dims, spec_dims, slow_to_fast=slow_to_fast) new_sig = hs.load(file_path) compare_signal_from_usid(file_path, ndata, new_sig, sig_type=hs.signals.BaseSignal, axes_to_spec=[])
def file_writer(filename, object2save, **kwds): """ Writes a HyperSpy Signal object to a HDF5 file formatted according to USID Parameters ---------- filename : str Path to target HDF5 file object2save : hyperspy.signals.Signal A HyperSpy signal """ append = False if os.path.exists(filename): append = True hs_shape = object2save.data.shape # Not sure how to safely ignore spurious / additional dimensions if len(object2save.axes_manager.shape) != len(hs_shape): raise ValueError('Number of dimensions in data (shape: {}) does not ' 'match number of axes: ({})' '.'.format(hs_shape, len(object2save.axes_manager.shape))) parm_dict = _flatten_dict(object2save.metadata.as_dictionary()) temp = object2save.original_metadata.as_dictionary() parm_dict.update(_flatten_dict(temp, parent_key='Original')) num_pos_dims = object2save.axes_manager.navigation_dimension nav_axes = object2save.axes_manager.navigation_axes sig_axes = object2save.axes_manager.signal_axes data_2d = object2save.data # data_2d is assumed to have dimensions arranged from slowest to fastest # varying dimensions if num_pos_dims > 0 and object2save.axes_manager.signal_dimension > 0: # now flatten to 2D: data_2d = data_2d.reshape(np.prod(hs_shape[:num_pos_dims]), np.prod(hs_shape[num_pos_dims:])) pos_dims = _axes_list_to_dimensions(nav_axes, hs_shape[:num_pos_dims], False) spec_dims = _axes_list_to_dimensions(sig_axes, hs_shape[num_pos_dims:], True) elif num_pos_dims == 0: # only spectroscopic: # now flatten to 2D: data_2d = data_2d.reshape(1, -1) pos_dims = _axes_list_to_dimensions(nav_axes, [], False) spec_dims = _axes_list_to_dimensions(sig_axes, hs_shape, True) else: # now flatten to 2D: data_2d = data_2d.reshape(-1, 1) pos_dims = _axes_list_to_dimensions(nav_axes, hs_shape, False) spec_dims = _axes_list_to_dimensions(sig_axes, [], True) # Does HyperSpy store the physical quantity and units somewhere? phy_quant = 'Unknown Quantity' phy_units = 'Unknown Units' dset_name = 'Raw_Data' if not append: tran = usid.ArrayTranslator() _ = tran.translate(filename, dset_name, data_2d, phy_quant, phy_units, pos_dims, spec_dims, parm_dict=parm_dict, slow_to_fast=True, **kwds) else: with h5py.File(filename, mode='r+') as h5_f: h5_grp = sidpy.prov_utils.create_indexed_group(h5_f, 'Measurement') sidpy.hdf_utils.write_simple_attrs(h5_grp, parm_dict) h5_grp = sidpy.prov_utils.create_indexed_group(h5_grp, 'Channel') _ = usid.hdf_utils.write_main_dataset(h5_grp, data_2d, dset_name, phy_quant, phy_units, pos_dims, spec_dims, slow_to_fast=True, **kwds)