From d81ead8e8310f240422466672594ddc759ed1488 Mon Sep 17 00:00:00 2001 From: Alexandre Gramfort Date: Tue, 4 Apr 2023 13:50:05 +0200 Subject: [PATCH 1/3] WIP : add support for EMG data --- mne_bids/config.py | 15 +++++++++++---- mne_bids/utils.py | 8 ++++++-- mne_bids/write.py | 9 +++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/mne_bids/config.py b/mne_bids/config.py index dff8407c8..50707ac7e 100644 --- a/mne_bids/config.py +++ b/mne_bids/config.py @@ -9,7 +9,7 @@ DOI = """https://doi.org/10.21105/joss.01896""" -EPHY_ALLOWED_DATATYPES = ['meg', 'eeg', 'ieeg', 'nirs'] +EPHY_ALLOWED_DATATYPES = ['meg', 'eeg', 'ieeg', 'nirs', 'emg'] ALLOWED_DATATYPES = EPHY_ALLOWED_DATATYPES + ['anat', 'beh'] @@ -110,6 +110,9 @@ '.set', # EEGLAB, potentially accompanied by .fdt ] +allowed_extensions_emg = ['.vhdr', # BrainVision, accompanied by .vmrk, .eeg + ] + allowed_extensions_ieeg = ['.vhdr', # BrainVision, accompanied by .vmrk, .eeg '.edf', # European Data Format '.set', # EEGLAB, potentially accompanied by .fdt @@ -124,6 +127,7 @@ ALLOWED_DATATYPE_EXTENSIONS = { 'meg': allowed_extensions_meg, 'eeg': allowed_extensions_eeg, + 'emg': allowed_extensions_emg, 'ieeg': allowed_extensions_ieeg, 'nirs': allowed_extensions_nirs } @@ -140,7 +144,7 @@ # the extension) ALLOWED_FILENAME_SUFFIX = [ 'meg', 'markers', 'eeg', 'ieeg', 'T1w', 'FLASH', # datatype - 'participants', 'scans', + 'emg', 'participants', 'scans', 'electrodes', 'optodes', 'channels', 'coordsystem', 'events', # sidecars 'headshape', 'digitizer', # meg-specific sidecars 'beh', 'physio', 'stim', # behavioral @@ -150,7 +154,7 @@ # converts suffix to known path modalities SUFFIX_TO_DATATYPE = { 'meg': 'meg', 'headshape': 'meg', 'digitizer': 'meg', 'markers': 'meg', - 'eeg': 'eeg', 'ieeg': 'ieeg', + 'eeg': 'eeg', 'ieeg': 'ieeg', 'emg': 'emg', 'T1w': 'anat', 'FLASH': 'anat' } @@ -415,7 +419,10 @@ 'to human intracranial electrophysiology. Scientific Data, ' '6, 102. https://doi.org/10.1038/s41597-019-0105-7', 'nirs': - 'In preperation'} + 'In preparation', + 'emg': + 'In preparation' + } # Mapping subject information between MNE-BIDS and MNE-Python. diff --git a/mne_bids/utils.py b/mne_bids/utils.py index 9a4a9b2e9..92f108ede 100644 --- a/mne_bids/utils.py +++ b/mne_bids/utils.py @@ -132,17 +132,21 @@ def _handle_datatype(raw, datatype): datatypes.append('meg') if 'eeg' in raw: datatypes.append('eeg') + if 'emg' in raw: + datatypes.append('emg') if 'fnirs_cw_amplitude' in raw: datatypes.append('nirs') if len(datatypes) == 0: - raise ValueError('No MEG, EEG or iEEG channels found in data. ' - 'Please use raw.set_channel_types to set the ' + raise ValueError('No MEG, EEG, iEEG or EMG channels found in data.' + ' Please use raw.set_channel_types to set the ' 'channel types in the data.') elif len(datatypes) > 1: if 'meg' in datatypes and 'ieeg' not in datatypes: datatype = 'meg' elif 'ieeg' in datatypes and 'meg' not in datatypes: datatype = 'ieeg' + elif 'emg' in datatypes: + datatype = 'emg' else: raise ValueError(f'Multiple data types (``{datatypes}``) were ' 'found in the data. Please specify the ' diff --git a/mne_bids/write.py b/mne_bids/write.py index 4df21cbb6..78037b199 100644 --- a/mne_bids/write.py +++ b/mne_bids/write.py @@ -883,6 +883,13 @@ def _sidecar_json(raw, task, manufacturer, fname, datatype, ('EEGPlacementScheme', _infer_eeg_placement_scheme(raw)), ('Manufacturer', manufacturer)] + ch_info_json_emg = [ + # ('EEGReference', 'n/a'), + # ('EEGGround', 'n/a'), + # ('EEGPlacementScheme', _infer_eeg_placement_scheme(raw)), + # ('Manufacturer', manufacturer) + ] + ch_info_json_ieeg = [ ('iEEGReference', 'n/a'), ('ECOGChannelCount', n_ecogchan), @@ -912,6 +919,8 @@ def _sidecar_json(raw, task, manufacturer, fname, datatype, append_datatype_json = ch_info_json_meg elif datatype == 'eeg': append_datatype_json = ch_info_json_eeg + elif datatype == 'emg': + append_datatype_json = ch_info_json_emg elif datatype == 'ieeg': append_datatype_json = ch_info_json_ieeg elif datatype == 'nirs': From 1e9fde4c55b9aae1853225d3092201513a85b823 Mon Sep 17 00:00:00 2001 From: Daniel McCloy Date: Tue, 8 Oct 2024 13:45:52 -0500 Subject: [PATCH 2/3] fix formatter-mangled comments --- mne_bids/config.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mne_bids/config.py b/mne_bids/config.py index 2e61e2311..731034532 100644 --- a/mne_bids/config.py +++ b/mne_bids/config.py @@ -174,13 +174,16 @@ # allowed suffixes (i.e. last "_" delimiter in the BIDS filenames before # the extension) ALLOWED_FILENAME_SUFFIX = [ + # datatypes: "meg", "markers", "eeg", "ieeg", "emg", + "nirs", "T1w", - "FLASH", # datatype + "FLASH", + # sidecars: "participants", "scans", "sessions", @@ -188,13 +191,14 @@ "optodes", "channels", "coordsystem", - "events", # sidecars + "events", + # MEG-specific sidecars: "headshape", - "digitizer", # meg-specific sidecars + "digitizer", + # behavioral: "beh", "physio", - "stim", # behavioral - "nirs", + "stim", ] # converts suffix to known path modalities @@ -214,9 +218,9 @@ ALLOWED_FILENAME_EXTENSIONS = ( ALLOWED_INPUT_EXTENSIONS + [".json", ".tsv", ".tsv.gz", ".nii", ".nii.gz"] - + [".pos", ".eeg", ".vmrk"] - + [".dat", ".EEG"] # extra datatype-specific metadata files. - + [".mrk"] # extra eeg extensions # KIT/Yokogawa/Ricoh marker coil + + [".pos", ".eeg", ".vmrk"] # extra datatype-specific metadata files. + + [".dat", ".EEG"] # extra eeg extensions + + [".mrk"] # KIT/Yokogawa/Ricoh marker coil ) # allowed BIDSPath entities From b3f8b98fc61c8cc67436370efeec841fd4820531 Mon Sep 17 00:00:00 2001 From: Daniel McCloy Date: Wed, 9 Oct 2024 17:17:49 -0500 Subject: [PATCH 3/3] add a couple TODOs [ci skip] --- mne_bids/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mne_bids/config.py b/mne_bids/config.py index 731034532..e864ae265 100644 --- a/mne_bids/config.py +++ b/mne_bids/config.py @@ -84,6 +84,8 @@ ".EEG": "Nihon Kohden", } +emg_manufacturers = {} # TODO + nirs_manufacturers = {".snirf": "SNIRF"} # file-extension map to mne-python readers @@ -115,6 +117,7 @@ MANUFACTURERS = dict() MANUFACTURERS.update(meg_manufacturers) MANUFACTURERS.update(eeg_manufacturers) +MANUFACTURERS.update(emg_manufacturers) MANUFACTURERS.update(ieeg_manufacturers) MANUFACTURERS.update(nirs_manufacturers) @@ -136,7 +139,7 @@ ] allowed_extensions_emg = [ - ".vhdr", # BrainVision, accompanied by .vmrk, .eeg + ".edf", # European Data Format ] allowed_extensions_ieeg = [ @@ -324,6 +327,7 @@ + BIDS_EEG_COORDINATE_FRAMES ) ALLOWED_SPACES["ieeg"] = BIDS_SHARED_COORDINATE_FRAMES + BIDS_IEEG_COORDINATE_FRAMES +ALLOWED_SPACES["emg"] = None # TODO revise if we support digitization of EMG sensors ALLOWED_SPACES["anat"] = None ALLOWED_SPACES["beh"] = None