def get_files(): with open('dset_config.json', 'r') as fo: CONFIG = json.load(fo) DATA_DIR = op.abspath('/home/data/nbc/external-datasets/ds001491/') all_info = {} for dset_name in list(CONFIG.keys())[:3]: layout = BIDSLayout(op.join(DATA_DIR, dset_name)) cfg = CONFIG[dset_name] task = cfg['task'] dset_info = {} for sub in layout.get_subjects(): runs = layout.get_runs(subject=sub, task=task) sub_info = {} for run in runs: run_info = {} run_info['files'] = [] run_info['echo_times'] = [] for echo in sorted( layout.get_echoes(subject=sub, task=task, run=run)): raw_files = layout.get(subject=sub, task=task, run=run, echo=echo, extensions='.nii.gz') preproc_files = layout.get(subject=sub, task=task, run=run, root='afni-step1', echo=echo, extensions='.nii.gz', desc='realign') preproc_files = raw_files[:] if len(preproc_files) != 1: print(preproc_files) raise Exception('BAD') # Replace filename with path when using new version of bids run_info['files'].append(preproc_files[0].filename) metadata = layout.get_metadata(preproc_files[0].filename) run_info['echo_times'].append(metadata['EchoTime']) sub_info[run] = run_info dset_info[sub] = sub_info all_info[dset_name] = dset_info with open('all_files.json', 'w') as fo: json.dump(all_info, fo, indent=4, sort_keys=True)
dataDir = '/tmp/Data/ds114' # Creating the layout object for this BIDS data set layout = BIDSLayout(dataDir) # subjects subjList = layout.get_subjects() # sessions sesList = layout.get_sessions() # tasks taskList = layout.get_tasks() # runs runList = layout.get_runs() # List of all fMRI data for subject 01 fMRI_sub01 = layout.get(subject='01', suffix='bold', extension=['nii', 'nii.gz'], return_type='file') # Lets focus on test session fMRI_sub01_test = layout.get(subject='01', session='test', suffix='bold', extension=['nii', 'nii.gz'], return_type='file') # A list of files associated with the covert verb generation
class events_class(object): def __init__(self, base_dir, task_id, sub_ids=None, verbose=True): assert type(base_dir) == str, "base_dir should be type(str)" assert type(task_id) == str, "task_id should be type(str)" self.base_dir = base_dir self.layout = BIDSLayout(base_dir) self.task_id = task_id if sub_ids == None: self.sub_ids = self.layout.get_subjects(task=task_id) else: assert type(sub_ids) == list, "sub_ids should be type(list)" for i in sub_ids: assert type( i) == str, "elements in sub_ids should be type(str)" assert any(i == j for j in self.layout.get_subjects(task=task_id) ), f"cannot find sub_ids with {task} task data" if verbose: print(f'{len(self.sub_ids)} subjects in {self.task_id} task') def get_timing(self, trial_type_cols=[], trimTRby=10, software='AFNI', write=True): ''' Throws timing information for each subject into dictionary ''' assert (software == 'AFNI' or software == 'SPM'), "software should be AFNI or SPM" self.events_dict = {} self.events_dict[self.task_id] = {} for sub_identifier in self.sub_ids: self.events_dict[self.task_id][sub_identifier] = {} run_ids = self.layout.get_runs(subject=sub_identifier, task=self.task_id) for run_identifier in run_ids: __eventFile__ = self.layout.get(suffix='events', task=self.task_id, run=run_identifier, extension='tsv', return_type='file') # get df of events information __trialInfo__ = pd.read_table(__eventFile__[0]) if run_identifier == 1: onsets = {} durations = {} if trial_type_cols == []: #if no columns for trial_types specified for column in __trialInfo__.columns[2:]: __conditions__ = sorted( list(set(__trialInfo__[column]))) # extracting onset and duration information for task, subject, run, trial_type if run_identifier == 1: onsets[column] = {} durations[column] = {} for itrial in __conditions__: if run_identifier == 1: onsets[column][itrial] = {} durations[column][itrial] = {} try: onsets[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].onset - trimTRby) ) # subtracting trimTRby due to remove dummy scans durations[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].duration)) except KeyError: onsets[column][itrial] = {} durations[column][itrial] = {} onsets[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].onset - trimTRby) ) # subtracting trimTRby due to remove dummy scans durations[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].duration)) else: for t1 in trial_type_cols: assert any(t1 == t2 for t2 in __trialInfo__.columns ), f"{t1} info is not in *events.tsv" for column in trial_type_cols: __conditions__ = sorted( list(set(__trialInfo__[column]))) # extracting onset and duration information for task, subject, run, trial_type if run_identifier == 1: onsets[column] = {} durations[column] = {} for itrial in __conditions__: if run_identifier == 1: onsets[column][itrial] = {} durations[column][itrial] = {} try: onsets[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].onset - trimTRby) ) # subtracting trimTRby due to remove dummy scans durations[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].duration)) except KeyError: onsets[column][itrial] = {} durations[column][itrial] = {} onsets[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].onset - trimTRby) ) # subtracting trimTRby due to remove dummy scans durations[column][itrial][run_identifier] = ( list(__trialInfo__[__trialInfo__[column] == itrial].duration)) self.events_dict[self.task_id][sub_identifier]['onsets'] = onsets self.events_dict[ self.task_id][sub_identifier]['durations'] = durations if write == True: if trial_type_cols == []: #if no columns for trial_types specified for column in __trialInfo__.columns[2:]: if column == 'response_time': #cannot handle response_times yet continue writeToPath = os.path.join(self.base_dir, 'derivatives', 'timing', f'sub-{sub_identifier}', column) if not os.path.exists(writeToPath): os.makedirs(writeToPath) for (onset_key, onset_val), (dur_key, dur_val) in zip( onsets[column].items(), durations[column].items()): assert ( onset_key == dur_key ), "onset conditions and duration conditions do not match!" with open( f'{writeToPath}/sub-{sub_identifier}_task-{self.task_id}_timing-{onset_key}.txt', 'w') as filehandle: for (run_onsets, run_durs) in zip(onset_val.values(), dur_val.values()): filehandle.writelines( "%f:%f\t" % (onset_time, dur_time) for (onset_time, dur_time ) in zip(run_onsets, run_durs)) filehandle.write("\n") else: for column in trial_type_cols: if column == 'response_time': #cannot handle response_times yet continue writeToPath = os.path.join(self.base_dir, 'derivatives', 'timing', f'sub-{sub_identifier}', column) if not os.path.exists(writeToPath): os.makedirs(writeToPath) for (onset_key, onset_val), (dur_key, dur_val) in zip( onsets[column].items(), durations[column].items()): assert ( onset_key == dur_key ), "onset conditions and duration conditions do not match!" with open( f'{writeToPath}/sub-{sub_identifier}_task-{self.task_id}_timing-{onset_key}.txt', 'w') as filehandle: for (run_onsets, run_durs) in zip(onset_val.values(), dur_val.values()): filehandle.writelines( "%f:%f\t" % (onset_time, dur_time) for (onset_time, dur_time ) in zip(run_onsets, run_durs)) filehandle.write("\n")
"""Simple workflow component that queries a BIDS dataset and handles files individually""" from bids.layout import BIDSLayout from nipype.interfaces.io import BIDSDataGrabber from nipype import Workflow, Node, Function, MapNode from niworkflows.interfaces.bids import DerivativesDataSink import os # Set project variables and set up workflow project_dir = os.path.abspath('../..') data_dir = 'data/ds000171/' wf = Workflow(name='wf', base_dir = os.getcwd()) # Leverage BIDS to get subject list layout = BIDSLayout(os.path.join(project_dir, data_dir)) subject_list = layout.get_subjects()[:2] runs = layout.get_runs()[:2] """ ============================== Anatomical Image Input ============================== """ grab_anat = Node(BIDSDataGrabber(), name = 'grab_anat') grab_anat.inputs.base_dir = os.path.join(project_dir, data_dir) # Iterate through subjects; [:2] for only 2 subjects to keep memory usage low grab_anat.iterables = ('subject', subject_list) # Define filetypes to grab, and how ouput will be accesses by other nodes grab_anat.inputs.output_query = {'T1w': dict(extension=['nii.gz'], suffix='T1w')}