from pathlib import Path
from numpy import ndarray
from .utils import _match, get_tsv, get_json
from ..dataset import Dataset
BIDS_ENTITIES = (
'sub',
'ses',
'task',
'acq',
'ce',
'rec',
'dir',
'run',
'mod',
'echo',
'recording',
'proc',
'space',
)
[docs]class BIDSName():
values = {}
def __init__(self, filename):
self._filename = Path(filename).resolve()
self.path = self._filename.parent
for entity in BIDS_ENTITIES:
self.values[entity] = _match(self._filename, f'{entity}-([a-zA-Z0-9-]+)_')
if self._filename.name.endswith('.nii.gz'):
self.extension = '.nii.gz'
else:
self.extension = self._filename.suffix
self.format = _match(self._filename, f'_([a-zA-Z0-9-]+){self.extension}')
@property
def filename(self):
return self.path / build_name(self.values, f'{self.format}{self.extension}')
[docs]def build_name(values, ending):
parts = []
for k, v in values.items():
if v is None:
continue
parts.append(f'{k}-{v}')
return '_'.join(parts) + '_' + ending
[docs]class BIDSMain(BIDSName):
def __init__(self, filename):
super().__init__(filename)
@property
def header(self):
return get_json(self.path, self.values, f'{self.format}.json')
@property
def events(self):
"""
TODO
----
how to handle n/a
"""
return get_tsv(self.path, self.values, 'events.tsv')
[docs]class BIDSEEG(BIDSMain):
def __init__(self, filename):
super().__init__(filename)
[docs] def read_data(self, chan=None, begtime=None, endtime=None, events=None,
pre=1, post=1):
"""
TODO
----
rename channels using bids info
"""
if chan is not None:
if isinstance(chan, ndarray) and chan.dtype.names is not None:
chan = chan['name']
chan = list(chan)
if events is not None:
if isinstance(events, ndarray) and events.dtype.names is not None:
events = events['onset']
events = list(events)
return Dataset(self.filename).read_data(
chan=chan, begtime=begtime, endtime=endtime, events=events,
pre=pre, post=post)
@property
def channels(self):
return get_tsv(self.path, self.values, 'channels.tsv')
@property
def electrodes(self):
return get_tsv(self.path, self.values, 'electrodes.tsv')