def copyfile_kit(src, dest, subject_id, session_id, task, run, _init_kwargs): """Copy and rename KIT files to a new location. Parameters ---------- src : str Path to the source raw .con or .sqd folder. dest : str Path to the destination of the new bids folder. subject_id : str | None The subject ID. Corresponds to "sub". session_id : str | None The session identifier. Corresponds to "ses". task : str | None The task identifier. Corresponds to "task". run : int | None The run number. Corresponds to "run". _init_kwargs : dict Extract information of marker and headpoints """ from mne_bids.utils import make_bids_basename # KIT data requires the marker file to be copied over too sh.copyfile(src, dest) data_path = op.split(dest)[0] if 'mrk' in _init_kwargs: hpi = _init_kwargs['mrk'] acq_map = dict() if isinstance(hpi, list): if _get_mrk_meas_date(hpi[0]) > _get_mrk_meas_date(hpi[1]): raise ValueError('Markers provided in incorrect order.') _, marker_ext = _parse_ext(hpi[0]) acq_map = dict(zip(['pre', 'post'], hpi)) else: _, marker_ext = _parse_ext(hpi) acq_map[None] = hpi for key, value in acq_map.items(): marker_fname = make_bids_basename(subject=subject_id, session=session_id, task=task, run=run, acquisition=key, suffix='markers%s' % marker_ext, prefix=data_path) sh.copyfile(value, marker_fname) for acq in ['elp', 'hsp']: if acq in _init_kwargs: position_file = _init_kwargs[acq] task, run, acq = None, None, acq.upper() position_ext = '.pos' position_fname = make_bids_basename(subject=subject_id, session=session_id, task=task, run=run, acquisition=acq, suffix='headshape%s' % position_ext, prefix=data_path) sh.copyfile(position_file, position_fname)
def test_make_filenames(): """Test that we create filenames according to the BIDS spec.""" # All keys work prefix_data = dict(subject='one', session='two', task='three', acquisition='four', run='five', processing='six', recording='seven', suffix='suffix.csv') assert make_bids_basename(**prefix_data) == 'sub-one_ses-two_task-three_acq-four_run-five_proc-six_recording-seven_suffix.csv' # noqa # subsets of keys works assert make_bids_basename(subject='one', task='three') == 'sub-one_task-three' # noqa assert make_bids_basename(subject='one', task='three', suffix='hi.csv') == 'sub-one_task-three_hi.csv' # noqa with pytest.raises(ValueError): make_bids_basename(subject='one-two', suffix='there.csv')
def _write_dig_bids(electrodes_fname, coordsystem_fname, data_path, raw, kind, overwrite=False, verbose=True): """Write BIDS formatted DigMontage from Raw instance. Handles coordinatesystem.json and electrodes.tsv writing from DigMontage. Parameters ---------- electrodes_fname : str Filename to save the electrodes.tsv to. coordsystem_fname : str Filename to save the coordsystem.json to. data_path : str | pathlib.Path Path to the data directory raw : instance of Raw The data as MNE-Python Raw object. kind : str Type of the data as in ALLOWED_KINDS. overwrite : bool Whether to overwrite the existing file. Defaults to False. verbose : bool Set verbose output to true or false. """ # write electrodes data for iEEG and EEG unit = "m" # defaults to meters params = _parse_bids_filename(electrodes_fname, verbose) subject_id = params['sub'] session_id = params['ses'] acquisition = params['acq'] # get coordinate frame from digMontage digpoint = raw.info['dig'][0] if any(digpoint['coord_frame'] != _digpoint['coord_frame'] for _digpoint in raw.info['dig']): warn("Not all digpoints have the same coordinate frame. " "Skipping electrodes.tsv writing...") return # get the accepted mne-python coordinate frames coord_frame_int = int(digpoint['coord_frame']) mne_coord_frame = MNE_FRAME_TO_STR.get(coord_frame_int, None) coord_frame = MNE_TO_BIDS_FRAMES.get(mne_coord_frame, None) if verbose: print("Writing electrodes file to... ", electrodes_fname) print("Writing coordsytem file to... ", coordsystem_fname) if kind == "ieeg": if coord_frame is not None: # XXX: To improve when mne-python allows coord_frame='unknown' if coord_frame not in BIDS_IEEG_COORDINATE_FRAMES: coordsystem_fname = make_bids_basename( subject=subject_id, session=session_id, acquisition=acquisition, space=coord_frame, suffix='coordsystem.json', prefix=data_path) electrodes_fname = make_bids_basename(subject=subject_id, session=session_id, acquisition=acquisition, space=coord_frame, suffix='electrodes.tsv', prefix=data_path) coord_frame = 'Other' # Now write the data to the elec coords and the coordsystem _electrodes_tsv(raw, electrodes_fname, kind, overwrite, verbose) _coordsystem_json(raw, unit, 'n/a', coord_frame, coordsystem_fname, kind, overwrite, verbose) else: # default coordinate frame to mri if not available warn("Coordinate frame of iEEG coords missing/unknown " "for {}. Skipping reading " "in of montage...".format(electrodes_fname)) elif kind == 'eeg': # We only write EEG electrodes.tsv and coordsystem.json # if we have LPA, RPA, and NAS available to rescale to a known # coordinate system frame coords = _extract_landmarks(raw.info['dig']) landmarks = set(['RPA', 'NAS', 'LPA']) == set(list(coords.keys())) # XXX: to be improved to allow rescaling if landmarks are present # mne-python automatically converts unknown coord frame to head if coord_frame_int == FIFF.FIFFV_COORD_HEAD and landmarks: # Now write the data _electrodes_tsv(raw, electrodes_fname, kind, overwrite, verbose) _coordsystem_json(raw, 'm', 'RAS', 'CapTrak', coordsystem_fname, kind, overwrite, verbose) else: warn("Skipping EEG electrodes.tsv... " "Setting montage not possible if anatomical " "landmarks (NAS, LPA, RPA) are missing, " "and coord_frame is not 'head'.")