# -*- coding: utf-8 -*-
"""
Read BIDS datasets
"""
from mne_bids import BIDSPath, read_raw_bids
from mne_bids import print_dir_tree, make_report
from mne_bids import get_entity_vals
from typing import Literal, Optional, List
from pathlib import Path
from tqdm.std import tqdm
[docs]
def read_raw_bids_dataset(bids_root: Path, datatype: Literal['meg'] = 'meg', subjects: List[str] = None,
sessions: List[str] = None,
tasks: List[str] = None, runs: List[str] = None,
print_dir: bool = False, bids_report: bool = False) -> List:
"""
Read and load MEG data from a BIDS dataset.
Parameters
----------
bids_root : str
The root path of the BIDS dataset.
datatype : {'meg'}
The type of data to read, currently only 'meg' is supported.('eeg')
subjects : str, optional
The specific subjects to load. Default is None, which loads all subjects.
sessions : str, optional
The specific sessions to load. Default is None, which loads all sessions.
tasks : str, optional
The specific tasks to load. Default is None, which loads all tasks.
runs : str, optional
The specific runs to load. Default is None, which loads all runs.
print_dir : bool, optional
If True, print the directory tree structure. Default is False.
bids_report : bool, optional
If True, generate a BIDS report. Default is False.
Returns
-------
list of str
A list of MEG file paths.
"""
bids_root = str(bids_root)
if print_dir:
print_dir_tree(bids_root, max_depth=3)
if bids_report:
print(make_report(bids_root))
bids_path = BIDSPath(root=bids_root, datatype=datatype)
entities = bids_path.entities
for entity in bids_path.entities.keys():
values = get_entity_vals(bids_root, entity, with_key=False)
if values:
entities[entity] = values # get all subjects
else:
entities[entity] = ['']
# Specify certain subjects, sessions, tasks if provided
if subjects is not None:
entities['subject'] = subjects
if sessions is not None:
entities['session'] = sessions
if tasks is not None:
entities['task'] = tasks
if runs is not None:
entities['run'] = runs
# Load and read all raw data
raw_list = []
total_iters = len(entities['subject']) * len(entities['session']) * len(entities['task']) * len(entities['run'])
with tqdm(total=total_iters) as pbar:
for subj in entities['subject']:
for sess in entities['session']:
for tk in entities['task']:
if sess == '':
sess = None
for run in entities['run']:
try:
if run == '':
bids_path.update(subject=subj, session=sess, task=tk)
else:
bids_path.update(subject=subj, session=sess, task=tk, run=run)
except ValueError as e:
print("ValueError", e)
continue
try:
_ = read_raw_bids(bids_path, verbose=False)
# raw = mne.io.read_raw(bids_path,verbose=False)
except (FileNotFoundError, ValueError, OSError, RuntimeError) as e:
print("BIDS Parse Error:", e)
continue
raw_list.append(bids_path.copy()) # notice hell: 同一个内存地址
pbar.update(1)
return raw_list
[docs]
def get_subjects_from_bids(bids_root: Path):
bids_path = BIDSPath(root=bids_root, datatype='meg')
entities = bids_path.entities
for entity in bids_path.entities.keys():
values = get_entity_vals(bids_root, entity, with_key=False)
if values:
entities[entity] = values # get all subjects
else:
entities[entity] = ['']
return entities['subject']
[docs]
def get_info_from_bids(bids_root: Path):
bids_path = BIDSPath(root=bids_root, datatype='meg')
entities = bids_path.entities
for entity in bids_path.entities.keys():
values = get_entity_vals(bids_root, entity, with_key=False)
if values:
entities[entity] = values # get all subjects
else:
entities[entity] = ['']
subjects = entities['subject']
sessions = entities['session']
tasks = entities['task']
runs = entities['run']
return (subjects, sessions, tasks, runs)
if __name__ == "__main__":
from mne.datasets import somato
bids_root = somato.data_path()
# specified subject\task\session
# datatype = 'meg'
# subject = ['01']
# task = ['somato']
# suffix = ['meg']
# session = ['']
# raw_list = read_raw_bids_dataset(bids_root, datatype='meg', subjects=subject, sessions=session, tasks=task, suffixes=suffix,
# print_dir=True)
# example 1
raw_lists = read_raw_bids_dataset(bids_root, datatype='meg', print_dir=True)
print("raw_lists:", raw_lists)
print("------")
print(raw_lists[0])
# example 2
# raw_lists = read_raw_bids_dataset(r'C:\Data\Datasets\OPM-FACE.v2', datatype='meg', print_dir=True)
# print(raw_lists)