Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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")
Exemplo n.º 4
0
"""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')}