Source code for glmdenoise.io.directory

from glmdenoise.io.files import run_files
from glmdenoise.io.bids import BidsDirectory
from glmdenoise.io.output import Output


[docs]def run_bids_directory(directory='.', sub_num=None, sub=None, task=None): """Run glmdenoise on a whole or part of a dataset in a BIDS directory Args: directory (str, optional): Root data directory containing BIDS. Defaults to '.' sub_num (int, optional): Number of one subject to run. Defaults to None. sub (string, optional): BIDS identifier of one subject to run. Defaults to None. task (string, optional): Name of specific task to run. Defaults to None. """ bids = BidsDirectory(directory) bids.index() return run_bids(bids, sub_num=sub_num, sub=sub, task=task)
[docs]def run_bids(bids, sub_num=None, sub=None, task=None, ses=None): """Recursively run GLMdenoise on subjects, tasks, sessions This uses a bids object that is able to find data in the BIDS directory it represents. See `run_bids_directory` to call this with a directory path. Args: bids (glmdenoise.io.bids.BidsDirectory): Wrapper for pybids sub_num (int, optional): Number of one subject to run. Defaults to None. sub (str, optional): BIDS identifier of one subject to run. Defaults to None. task (str, optional): Name of specific task to run. Defaults to None. ses (str, optional): Session identifier to run. Defaults to None, meaning run all sessions one by one """ if sub and task and ses: return run_bids_subset(bids, sub, task, ses) elif sub and task: sessions = bids.get_sessions_for_task_and_subject(task, sub) for ses in sessions: run_bids(bids, sub=sub, task=task, ses=ses) if sessions == []: run_bids_subset(bids, sub, task) elif sub: tasks = bids.get_tasks_for_subject(sub) for task in tasks: run_bids(bids, sub=sub, task=task) elif sub_num: sub = bids.subject_id_from_number(sub_num) assert sub, 'Could not match subject index to a subject ID' run_bids(bids, sub=sub) else: subs = bids.get_preprocessed_subjects_ids() for sub in subs: run_bids(bids, sub=sub)
[docs]def run_bids_subset(bids, sub, task, ses=None): """Run GLMdenoise on a subset of files in a BIDS dir defined by the args This uses a bids object that is able to find data in the BIDS directory it represents. See `run_bids_directory` to call this with a directory path. Args: bids (glmdenoise.io.bids.BidsDirectory): Wrapper for pybids sub (str): BIDS identifier of one subject to run. task (str): Name of specific task to run. ses (str, optional): Session identifier to run. Defaults to None, meaning there are no sessions. """ bold_files = bids.get_filepaths_bold_runs(sub, task, ses) if not bold_files: msg = 'No preprocessed runs found for subject {} task {} session {}' print(msg.format(sub, task, ses)) return event_files = bids.get_filepaths_event_runs(sub, task, ses) bold_files, event_files = bids.match_run_files(bold_files, event_files) metas = bids.get_metas_boldfiles(bold_files) key = 'RepetitionTime' trs = [meta[key] for meta in metas if key in meta] assert trs, 'RepetitionTime not specified in metadata' assert len(set(trs)) == 1, 'RepetitionTime varies across runs' out = Output() out.fit_bids_context(bids, sub=sub, task=task, ses=ses) return run_files(bold_files, event_files, tr=trs[0], out=out)