# Authors: The MNE-Python contributors. # License: BSD-3-Clause # Copyright the MNE-Python contributors. import numpy as np from ...epochs import EpochsArray from ...evoked import EvokedArray from ...utils import _check_fname, _import_pymatreader_funcs from ..array.array import RawArray from .utils import ( _create_event_metadata, _create_events, _create_info, _set_tmin, _validate_ft_struct, ) def read_raw_fieldtrip(fname, info, data_name="data") -> RawArray: """Load continuous (raw) data from a FieldTrip preprocessing structure. This function expects to find single trial raw data (FT_DATATYPE_RAW) in the structure data_name is pointing at. .. warning:: FieldTrip does not normally store the original information concerning channel location, orientation, type etc. It is therefore **highly recommended** to provide the info field. This can be obtained by reading the original raw data file with MNE functions (without preload). The returned object contains the necessary info field. Parameters ---------- fname : path-like Path and filename of the ``.mat`` file containing the data. info : dict or None The info dict of the raw data file corresponding to the data to import. If this is set to None, limited information is extracted from the FieldTrip structure. data_name : str Name of heading dict/variable name under which the data was originally saved in MATLAB. Returns ------- raw : instance of RawArray A Raw Object containing the loaded data. See :class:`mne.io.Raw` for documentation of attributes and methods. See Also -------- mne.io.Raw : Documentation of attributes and methods of RawArray. """ read_mat = _import_pymatreader_funcs("FieldTrip I/O") fname = _check_fname(fname, overwrite="read", must_exist=True) ft_struct = read_mat(fname, ignore_fields=["previous"], variable_names=[data_name]) # load data and set ft_struct to the heading dictionary ft_struct = ft_struct[data_name] _validate_ft_struct(ft_struct) info = _create_info(ft_struct, info) # create info structure data = np.array(ft_struct["trial"]) # create the main data array if data.ndim > 2: data = np.squeeze(data) if data.ndim == 1: data = data[np.newaxis, ...] if data.ndim != 2: raise RuntimeError( "The data you are trying to load does not seem to be raw data" ) raw = RawArray(data, info) # create an MNE RawArray return raw def read_epochs_fieldtrip( fname, info, data_name="data", trialinfo_column=0 ) -> EpochsArray: """Load epoched data from a FieldTrip preprocessing structure. This function expects to find epoched data in the structure data_name is pointing at. .. warning:: Only epochs with the same amount of channels and samples are supported! .. warning:: FieldTrip does not normally store the original information concerning channel location, orientation, type etc. It is therefore **highly recommended** to provide the info field. This can be obtained by reading the original raw data file with MNE functions (without preload). The returned object contains the necessary info field. Parameters ---------- fname : path-like Path and filename of the ``.mat`` file containing the data. info : dict or None The info dict of the raw data file corresponding to the data to import. If this is set to None, limited information is extracted from the FieldTrip structure. data_name : str Name of heading dict/ variable name under which the data was originally saved in MATLAB. trialinfo_column : int Column of the trialinfo matrix to use for the event codes. Returns ------- epochs : instance of EpochsArray An EpochsArray containing the loaded data. """ read_mat = _import_pymatreader_funcs("FieldTrip I/O") ft_struct = read_mat(fname, ignore_fields=["previous"], variable_names=[data_name]) # load data and set ft_struct to the heading dictionary ft_struct = ft_struct[data_name] _validate_ft_struct(ft_struct) info = _create_info(ft_struct, info) # create info structure data = np.array(ft_struct["trial"]) # create the epochs data array events = _create_events(ft_struct, trialinfo_column) if events is not None: metadata = _create_event_metadata(ft_struct) else: metadata = None tmin = _set_tmin(ft_struct) # create start time epochs = EpochsArray( data=data, info=info, tmin=tmin, events=events, metadata=metadata, proj=False ) return epochs def read_evoked_fieldtrip(fname, info, comment=None, data_name="data"): """Load evoked data from a FieldTrip timelocked structure. This function expects to find timelocked data in the structure data_name is pointing at. .. warning:: FieldTrip does not normally store the original information concerning channel location, orientation, type etc. It is therefore **highly recommended** to provide the info field. This can be obtained by reading the original raw data file with MNE functions (without preload). The returned object contains the necessary info field. Parameters ---------- fname : path-like Path and filename of the ``.mat`` file containing the data. info : dict or None The info dict of the raw data file corresponding to the data to import. If this is set to None, limited information is extracted from the FieldTrip structure. comment : str Comment on dataset. Can be the condition. data_name : str Name of heading dict/ variable name under which the data was originally saved in MATLAB. Returns ------- evoked : instance of EvokedArray An EvokedArray containing the loaded data. """ read_mat = _import_pymatreader_funcs("FieldTrip I/O") ft_struct = read_mat(fname, ignore_fields=["previous"], variable_names=[data_name]) ft_struct = ft_struct[data_name] _validate_ft_struct(ft_struct) info = _create_info(ft_struct, info) # create info structure data_evoked = ft_struct["avg"] # create evoked data evoked = EvokedArray(data_evoked, info, comment=comment) return evoked