示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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'])
示例#5
0
    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)
示例#6
0
    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=[])
示例#7
0
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)