Exemple #1
0
 def dataset(self, prepare: bool = True):
     data = self._observations
     if self._file_data_format == DataFileType.time_explicit:
         data = data.T
     dataset = xr.DataArray(data,
                            coords=[('time', self._times),
                                    ('spectral', self._spectral_indices)])
     if prepare:
         dataset = prepare_time_trace_dataset(dataset)
     return dataset
Exemple #2
0
def read_sdt(
    file_path: str,
    index: np.ndarray = None,
    flim: bool = False,
    dataset_index: int = None,
    swap_axis: bool = False,
    orig_time_axis_index: int = 2,
) -> xr.Dataset:
    """
    Reads a `*.sdt` file and returns a pd.DataFrame (`return_dataframe==True`), a
    SpectralTemporalDataset (`type_of_data=='st'`) or a FLIMDataset (`type_of_data=='flim'`).

    Parameters
    ----------
    file_path: str
        Path to the sdt file which should be read.

    index: list, np.ndarray
        This is only needed if `type_of_data=="st"`, since `*.sdt` files,
        which only contain spectral temporal data, lack the spectral information.
        Thus for the spectral axis data need to be given by the user.

    flim:
        Set true if reading a result from a FLIM measurement.

    dataset_index: int: default 0
        If the `*.sdt` file contains multiple datasets the index will used
        to select the wanted one

    swap_axis: bool, default False
        Flag to switch a wavelength explicit `input_df` to time explicit `input_df`,
        before generating the SpectralTemporalDataset.

    orig_time_axis_index: int
        Index of the axis which corresponds to the time axis.
        I.e. for data of shape (64, 64, 256), which are a 64x64 pixel map
        with 256 time steps, orig_time_axis_index=2.

    Raises
    ______
    IndexError:
        If the length of the index array is incompatible with the data.
    """
    sdt_parser = SdtFile(file_path)
    if not dataset_index:
        # looking at the source code of SdtFile, times and data
        # always have the same len, so only one needs to be checked
        nr_of_datasets = len(sdt_parser.times)
        if nr_of_datasets > 1:
            warnings.warn(
                UserWarning(
                    f"The file '{file_path}' contains {nr_of_datasets} Datasets.\n "
                    f"By default only the first Dataset will be read. "
                    f"If you only need the first Dataset and want get rid of "
                    f"this warning you can set dataset_index=0."))
        dataset_index = 0
    times = sdt_parser.times[dataset_index]
    data = sdt_parser.data[dataset_index]

    if index and len(index) is not data.shape[0]:
        raise IndexError(
            f"The Dataset contains {data.shape[0]} measurements, but the "
            f"indices supplied are {len(index)}.")
    elif not index and not flim:
        warnings.warn(
            UserWarning(
                f"There was no `index` provided."
                f"That for the indices will be a entry count(integers)."
                f"To prevent this warning from being shown, provide "
                f"a list of indices, with len(index)={data.shape[0]}"))

    if flim:

        if orig_time_axis_index != 2:
            np.swapaxes(data, 2, orig_time_axis_index)

        full_data = xr.DataArray(data,
                                 coords={'time': times},
                                 dims=['x', 'y', 'time'])
        data = full_data.stack(pixel=('x', 'y')).to_dataset(name='data')
        data['full_data'] = full_data.rename({'x': 'pixel_x', 'y': 'pixel_y'})
        data['data_intensity_map'] = \
            data.data.groupby('pixel').sum().unstack().rename({'x': 'pixel_x', 'y': 'pixel_y'})
    else:
        if swap_axis:
            data = data.T
        if not index:
            index = np.array(range(data[0]))
        data = xr.DataArray(data.T,
                            coords=[('time', times), ('spectral', index)])
        data = prepare_time_trace_dataset(data)
    return data