diff --git a/src/simbids/cli/parser.py b/src/simbids/cli/parser.py index aa5b9a2..60552bc 100644 --- a/src/simbids/cli/parser.py +++ b/src/simbids/cli/parser.py @@ -151,6 +151,11 @@ def _bids_filter(value, parser): choices=['qsiprep', 'qsirecon', 'xcp_d', 'fmriprep'], help=('BIDS-App to be simulated'), ) + parser.add_argument( + '--anat-only', + action='store_true', + help=('Only run the anatomical workflow'), + ) g_bids = parser.add_argument_group('Options for filtering BIDS queries') g_bids.add_argument( diff --git a/src/simbids/config.py b/src/simbids/config.py index 6e0d209..6fd9906 100644 --- a/src/simbids/config.py +++ b/src/simbids/config.py @@ -541,6 +541,8 @@ class workflow(_Config): """Ignore particular steps for *SimBIDS*.""" bids_app = 'qsiprep' """The BIDS App to simulate.""" + anat_only = False + """Only run the anatomical workflow.""" class loggers: diff --git a/src/simbids/data/nipreps.json b/src/simbids/data/nipreps.json new file mode 100644 index 0000000..7a50f79 --- /dev/null +++ b/src/simbids/data/nipreps.json @@ -0,0 +1,185 @@ +{ + "name": "nipreps", + "entities": [ + { + "name": "subject", + "pattern": "[/\\\\]+sub-([a-zA-Z0-9+]+)", + "directory": "{subject}" + }, + { + "name": "session", + "pattern": "[_/\\\\]+ses-([a-zA-Z0-9+]+)", + "mandatory": false, + "directory": "{subject}{session}" + }, + { + "name": "task", + "pattern": "[_/\\\\]+task-([a-zA-Z0-9+]+)" + }, + { + "name": "acquisition", + "pattern": "[_/\\\\]+acq-([a-zA-Z0-9+]+)" + }, + { + "name": "ceagent", + "pattern": "[_/\\\\]+ce-([a-zA-Z0-9+]+)" + }, + { + "name": "reconstruction", + "pattern": "[_/\\\\]+rec-([a-zA-Z0-9+]+)" + }, + { + "name": "direction", + "pattern": "[_/\\\\]+dir-([a-zA-Z0-9+]+)" + }, + { + "name": "run", + "pattern": "[_/\\\\]+run-(\\d+)", + "dtype": "int" + }, + { + "name": "proc", + "pattern": "[_/\\\\]+proc-([a-zA-Z0-9+]+)" + }, + { + "name": "modality", + "pattern": "[_/\\\\]+mod-([a-zA-Z0-9+]+)" + }, + { + "name": "echo", + "pattern": "[_/\\\\]+echo-([0-9]+)" + }, + { + "name": "flip", + "pattern": "[_/\\\\]+flip-([0-9]+)" + }, + { + "name": "inv", + "pattern": "[_/\\\\]+inv-([0-9]+)" + }, + { + "name": "mt", + "pattern": "[_/\\\\]+mt-(on|off)" + }, + { + "name": "part", + "pattern": "[_/\\\\]+part-(mag|phase|real|imag)" + }, + { + "name": "recording", + "pattern": "[_/\\\\]+recording-([a-zA-Z0-9+]+)" + }, + { + "name": "space", + "pattern": "[_/\\\\]+space-([a-zA-Z0-9+]+)" + }, + { + "name": "suffix", + "pattern": "[._]*([a-zA-Z0-9]*?)\\.[^/\\\\]+$" + }, + { + "name": "scans", + "pattern": "(.*\\_scans.tsv)$" + }, + { + "name": "fmap", + "pattern": "(phasediff|magnitude[1-2]|phase[1-2]|fieldmap|epi)\\.nii" + }, + { + "name": "datatype", + "pattern": "[/\\\\]+(func|anat|fmap|dwi|meg|eeg|perf|figures)[/\\\\]+" + }, + { + "name": "extension", + "pattern": "[._]*[a-zA-Z0-9]*?(\\.[^/\\\\]+)$" + }, + { + "name": "atlas", + "pattern": "[_/\\\\]+atlas-([a-zA-Z0-9+]+)" + }, + { + "name": "roi", + "pattern": "[_/\\\\]+roi-([a-zA-Z0-9+]+)" + }, + { + "name": "label", + "pattern": "[_/\\\\]+label-([a-zA-Z0-9+]+)" + }, + { + "name": "fmapid", + "pattern": "[_/\\\\]+fmapid-([a-zA-Z0-9+]+)" + }, + { + "name": "desc", + "pattern": "[_/\\\\]+desc-([a-zA-Z0-9+]+)" + }, + { + "name": "from", + "pattern": "(?:^|_)from-([a-zA-Z0-9+]+).*xfm" + }, + { + "name": "to", + "pattern": "(?:^|_)to-([a-zA-Z0-9+]+).*xfm" + }, + { + "name": "mode", + "pattern": "(?:^|_)mode-(image|points).*xfm" + }, + { + "name": "hemi", + "pattern": "hemi-(L|R)" + }, + { + "name": "model", + "pattern": "model-([a-zA-Z0-9+]+)" + }, + { + "name": "subset", + "pattern": "subset-([a-zA-Z0-9+]+)" + }, + { + "name": "resolution", + "pattern": "res-([a-zA-Z0-9+]+)" + }, + { + "name": "density", + "pattern": "res-([a-zA-Z0-9+]+)" + }, + { + "name": "cohort", + "pattern": "[_/\\\\]+cohort-0*(\\d+)", + "dtype": "int" + } + ], + "default_path_patterns": [ + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_hemi-{hemi}]_from-{from}_to-{to}_mode-{mode|image}_{suffix|xfm}{extension<.txt|.h5>}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}]_hemi-{hemi}[_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.surf.gii|.shape.gii>}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.dscalar.nii|.json>}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_desc-{desc}_{suffix|mask}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_label-{label}[_desc-{desc}]_{suffix|probseg}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_hemi-{hemi}]_from-{from}_to-{to}_mode-{mode|image}[_desc-{desc}]_{suffix|xfm}{extension<.txt|.h5>}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_desc-{desc}_{suffix|mask}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix|AROMAnoiseICs}{extension<.csv|.tsv>|.csv}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix|timeseries}{extension<.json|.tsv>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix|components}{extension<.json|.tsv|.nii|.nii.gz>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix|decomposition}{extension<.json>|.json}", + "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_hemi-{hemi}][_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.dtseries.nii|.dtseries.json|.func.gii|.func.json>}", + "sub-{subject}[/ses-{session}]/{datatype}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.json|.nii.gz|.nii>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_desc-{desc}_{suffix}{extension<.json|.nii.gz|.nii>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.tsv|.bval|.bvec|.b>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}]_from-{from}_to-{to}_mode-{mode|image}[_desc-{desc}]_{suffix|xfm}{extension<.txt|.h5>}", + "sub-{subject}[/ses-{session}]/{datatype|perf}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}]_{suffix}{extension<.tsv|.json>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|perf}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}]_from-{from}_to-{to}_mode-{mode|image}_{suffix|xfm}{extension<.txt|.h5>}", + "sub-{subject}[/ses-{session}]/{datatype|perf}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_atlas-{atlas}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.json|.tsv>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|perf}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_atlas-{atlas}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json|.tsv>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|fmap}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_dir-{direction}][_run-{run}][_part-{part}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_fmapid-{fmapid}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_fmapid-{fmapid}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}" + ] + } diff --git a/src/simbids/interfaces/bids.py b/src/simbids/interfaces/bids.py index 387118d..ccaaa38 100644 --- a/src/simbids/interfaces/bids.py +++ b/src/simbids/interfaces/bids.py @@ -78,3 +78,27 @@ class QSIReconDerivativesDataSink(BaseDerivativesDataSink): _config_entities = config_entities _config_entities_dict = merged_entities _file_patterns = simbids_spec['default_path_patterns'] + + +class NiPrepsDerivativesDataSink(BaseDerivativesDataSink): + """Store derivative files. + + A child class of the niworkflows DerivativesDataSink, + using simbids's configuration files. + """ + + simbids_spec = loads(load_data('nipreps.json').read_text()) + bids_config = Config.load('bids') + deriv_config = Config.load('derivatives') + + simbids_entities = {v['name']: v['pattern'] for v in simbids_spec.get('entities', {})} + merged_entities = {**bids_config.entities, **deriv_config.entities} + merged_entities = {k: v.pattern for k, v in merged_entities.items()} + merged_entities = {**merged_entities, **simbids_entities} + merged_entities = [{'name': k, 'pattern': v} for k, v in merged_entities.items()] + config_entities = frozenset({e['name'] for e in merged_entities}) + out_path_base = '' + _allowed_entities = set(config_entities) + _config_entities = config_entities + _config_entities_dict = merged_entities + _file_patterns = simbids_spec['default_path_patterns'] diff --git a/src/simbids/workflows/base.py b/src/simbids/workflows/base.py index 3e8c94c..b72d823 100644 --- a/src/simbids/workflows/base.py +++ b/src/simbids/workflows/base.py @@ -124,5 +124,9 @@ def init_single_subject_wf(subject_id: str): write_root_level_atlases(config.execution.output_dir) return init_single_subject_qsirecon_wf(subject_id) + elif config.workflow.bids_app == 'fmriprep': + from simbids.workflows.fmriprep import init_single_subject_fmriprep_wf + + return init_single_subject_fmriprep_wf(subject_id) else: raise ValueError(f'Unknown application: {config.workflow.bids_app}') diff --git a/src/simbids/workflows/fmriprep.py b/src/simbids/workflows/fmriprep.py new file mode 100644 index 0000000..58b10f7 --- /dev/null +++ b/src/simbids/workflows/fmriprep.py @@ -0,0 +1,826 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +# +# Copyright 2024 The NiPreps Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# We support and encourage derived works from this project, please read +# about our expectations at +# +# https://www.nipreps.org/community/licensing/ +# +""" +SimBIDS workflows +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: init_simbids_wf +.. autofunction:: init_single_subject_wf +.. autofunction:: init_single_run_wf + +""" + +import sys +from importlib import resources + +import nipype.pipeline.engine as pe +import yaml +from niworkflows.engine.workflows import LiterateWorkflow as Workflow +from niworkflows.interfaces.bids import BIDSInfo + +from simbids import config +from simbids.interfaces.bids import NiPrepsDerivativesDataSink +from simbids.interfaces.reportlets import AboutSummary, SubjectSummary +from simbids.utils.utils import _get_wf_name +from simbids.workflows.freesurfer import write_fs_files + +text_file = resources.files('simbids').joinpath('data/text_file.txt') + + +def collect_data(layout, participant_label, session_id=None, filters=None): + """Use pybids to retrieve the input data for a given participant.""" + + from bids.layout import Query + + queries = { + 'fmap': {'datatype': 'fmap'}, + 'sbref': {'datatype': 'func', 'suffix': 'sbref'}, + 'flair': {'datatype': 'anat', 'suffix': 'FLAIR'}, + 't2w': {'datatype': 'anat', 'suffix': 'T2w'}, + 't1w': {'datatype': 'anat', 'suffix': 'T1w'}, + 'roi': {'datatype': 'anat', 'suffix': 'roi'}, + 'bold': {'datatype': 'func', 'suffix': 'bold'}, + } + bids_filters = filters or {} + for acq in queries.keys(): + entities = bids_filters.get(acq, {}) + + if ('session' in entities.keys()) and (session_id is not None): + config.loggers.workflow.warning( + 'BIDS filter file value for session may conflict with values specified ' + 'on the command line' + ) + queries[acq]['session'] = session_id or Query.OPTIONAL + queries[acq].update(entities) + + subj_data = { + dtype: sorted( + layout.get( + return_type='file', + subject=participant_label, + extension=['nii', 'nii.gz'], + **query, + ) + ) + for dtype, query in queries.items() + } + + config.loggers.workflow.log( + 25, + f'Collected data:\n{yaml.dump(subj_data, default_flow_style=False, indent=4)}', + ) + + return subj_data + + +def init_single_subject_fmriprep_wf(subject_id: str): + """Organize the postprocessing pipeline for a single subject.""" + + workflow = Workflow(name=f'sub_{subject_id}_wf') + workflow.__desc__ = f""" +Results included in this manuscript come from postprocessing +performed using *SimBIDS* {config.environment.version}, +which is based on *Nipype* {config.environment.nipype_version} +(@nipype1; @nipype2; RRID:SCR_002502). + +""" + workflow.__postdesc__ = """ + +For more details of the pipeline, see [the section corresponding +to workflows in *SimBIDS*'s documentation]\ +(https://simbids.readthedocs.io/en/latest/workflows.html). + + +### Copyright Waiver + +The above boilerplate text was automatically generated by SimBIDS +with the express intention that users should copy and paste this +text into their manuscripts *unchanged*. +It is released under the +[CC0](https://creativecommons.org/publicdomain/zero/1.0/) license. + +### References + +""" + spaces = config.workflow.spaces + subject_data = collect_data(config.execution.layout, subject_id) + # Make sure we always go through these two checks + if not subject_data['bold']: + raise RuntimeError( + f'No bold images found for participant {subject_id}. ' + f'Please check your BIDS filters: {config.execution.bids_filters}.' + ) + + config.loggers.workflow.info( + f'Collected subject data:\n{yaml.dump(subject_data, default_flow_style=False, indent=4)}', + ) + + bids_info = pe.Node( + BIDSInfo( + bids_dir=config.execution.bids_dir, + bids_validate=False, + in_file=subject_data['bold'][0], + ), + name='bids_info', + ) + + summary = pe.Node( + SubjectSummary( + bold=subject_data['bold'], + std_spaces=spaces.get_spaces(nonstandard=False), + nstd_spaces=spaces.get_spaces(standard=False), + ), + name='summary', + run_without_submitting=True, + ) + workflow.connect([(bids_info, summary, [('subject', 'subject_id')])]) + + about = pe.Node( + AboutSummary(version=config.environment.version, command=' '.join(sys.argv)), + name='about', + run_without_submitting=True, + ) + + ds_report_summary = pe.Node( + NiPrepsDerivativesDataSink( + source_file=subject_data['bold'][0], + base_directory=config.execution.output_dir, + desc='summary', + datatype='figures', + ), + name='ds_report_summary', + run_without_submitting=True, + ) + workflow.connect([(summary, ds_report_summary, [('out_report', 'in_file')])]) + + ds_report_about = pe.Node( + NiPrepsDerivativesDataSink( + source_file=subject_data['bold'][0], + base_directory=config.execution.output_dir, + desc='about', + datatype='figures', + ), + name='ds_report_about', + run_without_submitting=True, + ) + workflow.connect([(about, ds_report_about, [('out_report', 'in_file')])]) + + # Append the functional section to the existing anatomical excerpt + # That way we do not need to stream down the number of bold datasets + bold_pre_desc = f""" +fMRI data postprocessing + +: For each of the {len(subject_data['bold'])} bold runs found per subject +(across all sessions), these files were copied into the output directory. +""" + workflow.__desc__ += bold_pre_desc + + anat_file = (subject_data['t1w'] + subject_data['t2w'])[0] + workflow.add_nodes(_get_smriprep_datasinks(anat_file)) + + if config.workflow.anat_only: + write_fs_files(config.execution.output_dir, subject_id) + workflow.add_nodes(_get_bold_datasinks(subject_data['bold'][0])) + return clean_datasinks(workflow) + + for bold_file in subject_data['bold']: + workflow.add_nodes(_get_bold_datasinks(bold_file)) + return clean_datasinks(workflow) + + +def _get_bold_datasinks(source_file): + return [ + # Native space outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + desc='preproc', + suffix='bold', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_t1w'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + desc='brain', + suffix='mask', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_t1w_mask'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + suffix='boldref', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_t1w_boldref'), + run_without_submitting=True, + ), + # MNI space outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + res='2', + desc='preproc', + suffix='bold', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_mni'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + res='2', + desc='brain', + suffix='mask', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_mni_mask'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + res='2', + suffix='boldref', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_mni_boldref'), + run_without_submitting=True, + ), + # fsLR space outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='fsLR', + den='91k', + suffix='bold', + extension='.dtseries.nii', + ), + name=_get_wf_name(source_file, 'ds_bold_fslr'), + run_without_submitting=True, + ), + # Coregistration outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + desc='coreg', + suffix='boldref', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_coreg_boldref'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='T1w', + mode='image', + desc='coreg', + suffix='xfm', + extension='.txt', + **{'from': 'boldref'}, + ), + name=_get_wf_name(source_file, 'ds_bold_coreg_xfm'), + run_without_submitting=True, + ), + # Head motion correction outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + desc='hmc', + suffix='boldref', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_bold_hmc_boldref'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='boldref', + mode='image', + desc='hmc', + suffix='xfm', + extension='.txt', + **{'from': 'orig'}, + ), + name=_get_wf_name(source_file, 'ds_bold_hmc_xfm'), + run_without_submitting=True, + ), + # Fieldmap registration outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='phasesfmap0', + mode='image', + suffix='xfm', + extension='.txt', + **{'from': 'boldref'}, + ), + name=_get_wf_name(source_file, 'ds_bold_fmap_xfm'), + run_without_submitting=True, + ), + # Confounds outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + desc='confounds', + suffix='timeseries', + extension='.tsv', + ), + name=_get_wf_name(source_file, 'ds_bold_confounds'), + run_without_submitting=True, + ), + ] + + +def _get_smriprep_datasinks(source_file): + return [ + # T1w preprocessed image and brain mask in native space + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + desc='preproc', + suffix='T1w', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_t1'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + desc='brain', + suffix='mask', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_brainmask'), + run_without_submitting=True, + ), + # Ribbon mask + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + desc='ribbon', + suffix='mask', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_ribbon'), + run_without_submitting=True, + ), + # Segmentation files + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + suffix='dseg', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_dseg'), + run_without_submitting=True, + ), + # Probability segmentations + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + label='CSF', + suffix='probseg', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_csf'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + label='GM', + suffix='probseg', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_gm'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + label='WM', + suffix='probseg', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_wm'), + run_without_submitting=True, + ), + # MNI space outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + desc='preproc', + suffix='T1w', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_mni_t1'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + desc='brain', + suffix='mask', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_mni_brainmask'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='MNI152NLin6Asym', + suffix='dseg', + extension='.nii.gz', + ), + name=_get_wf_name(source_file, 'ds_anat_mni_dseg'), + run_without_submitting=True, + ), + # Transforms + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='T1w', + mode='image', + suffix='xfm', + extension='.h5', + datatype='anat', + **{'from': 'MNI152NLin2009cAsym'}, + ), + name=_get_wf_name(source_file, 'ds_anat_mni2009c_to_t1w'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='T1w', + mode='image', + suffix='xfm', + extension='.h5', + datatype='anat', + **{'from': 'MNI152NLin6Asym'}, + ), + name=_get_wf_name(source_file, 'ds_anat_mni6_to_t1w'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='MNI152NLin2009cAsym', + mode='image', + suffix='xfm', + extension='.h5', + datatype='anat', + **{'from': 'T1w'}, + ), + name=_get_wf_name(source_file, 'ds_anat_t1w_to_mni2009c'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='MNI152NLin6Asym', + mode='image', + suffix='xfm', + extension='.h5', + datatype='anat', + **{'from': 'T1w'}, + ), + name=_get_wf_name(source_file, 'ds_anat_t1w_to_mni6'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='fsnative', + mode='image', + suffix='xfm', + extension='.txt', + datatype='anat', + **{'from': 'T1w'}, + ), + name=_get_wf_name(source_file, 'ds_anat_t1w_to_fsnative'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + to='T1w', + mode='image', + suffix='xfm', + extension='.txt', + datatype='anat', + **{'from': 'fsnative'}, + ), + name=_get_wf_name(source_file, 'ds_anat_fsnative_to_t1w'), + run_without_submitting=True, + ), + # Surface files + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='midthickness', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_midthickness'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='midthickness', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_midthickness'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='pial', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_pial'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='pial', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_pial'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='white', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_white'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='white', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_white'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='sphere', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_sphere'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='sphere', + extension='.surf.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_sphere'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='sulc', + extension='.shape.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_sulc'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='sulc', + extension='.shape.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_sulc'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='L', + suffix='thickness', + extension='.shape.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_lh_thickness'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='T1w', + hemi='R', + suffix='thickness', + extension='.shape.gii', + ), + name=_get_wf_name(source_file, 'ds_anat_rh_thickness'), + run_without_submitting=True, + ), + # fsLR space outputs + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='fsLR', + den='91k', + suffix='curv', + extension='.dscalar.nii', + ), + name=_get_wf_name(source_file, 'ds_anat_fslr_curv'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='fsLR', + den='91k', + suffix='sulc', + extension='.dscalar.nii', + ), + name=_get_wf_name(source_file, 'ds_anat_fslr_sulc'), + run_without_submitting=True, + ), + pe.Node( + NiPrepsDerivativesDataSink( + source_file=source_file, + in_file=source_file, + base_directory=config.execution.output_dir, + space='fsLR', + den='91k', + suffix='thickness', + extension='.dscalar.nii', + ), + name=_get_wf_name(source_file, 'ds_anat_fslr_thickness'), + run_without_submitting=True, + ), + ] + + +def clean_datasinks(workflow: pe.Workflow) -> pe.Workflow: + """Overwrite ``out_path_base`` of DataSinks.""" + for node in workflow.list_node_names(): + if node.split('.')[-1].startswith('ds_'): + workflow.get_node(node).interface.out_path_base = '' + return workflow diff --git a/src/simbids/workflows/freesurfer.py b/src/simbids/workflows/freesurfer.py new file mode 100644 index 0000000..ad21cd8 --- /dev/null +++ b/src/simbids/workflows/freesurfer.py @@ -0,0 +1,712 @@ +from pathlib import Path + +fs_files = [ + '{output_dir}/sourcedata/freesurfer/', + '{output_dir}/sourcedata/freesurfer/fsaverage/', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/Yeo_Brainmap_fsaverage_README', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA3a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA3a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA3b_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA3b_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA44_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA44_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA45_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA45_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA4a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA4a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA4p_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA4p_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA6_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.BA6_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.FG1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.FG2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.FG3.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.FG4.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.MT_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.MT_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Medial_wall.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.PALS_B12.labels.gii', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.PALS_B12_Brodmann.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.PALS_B12_Lobes.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.PALS_B12_OrbitoFrontal.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.PALS_B12_Visuotopic.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.V1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.V1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.V2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.V2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo2011_17NetworksConfidence_N1000.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo2011_17Networks_N1000.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo2011_7NetworksConfidence_N1000.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo2011_7Networks_N1000.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_10Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_10to14Comp_Flexibility.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_10to14Comp_Specialization.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_10to14Comp_SpecializationROI.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_10to14Comp_TopSpecializationComp.csv', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_11Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_12Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_13Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.Yeo_Brainmap_14Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.aparc.a2005s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.aparc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.cortex.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.entorhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.entorhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.hOc1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.hOc2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.hOc3v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.hOc4v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.high-myelin.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.ifc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.ipc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.ips.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.lateraltemporal.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.medialpfc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.mtl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.retrosplenial.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.oasis.chubs.tp.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.perirhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/lh.perirhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA3a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA3a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA3b_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA3b_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA44_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA44_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA45_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA45_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA4a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA4a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA4p_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA4p_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA6_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.BA6_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.FG1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.FG2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.FG3.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.FG4.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.MT_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.MT_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Medial_wall.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.PALS_B12.labels.gii', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.PALS_B12_Brodmann.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.PALS_B12_Lobes.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.PALS_B12_OrbitoFrontal.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.PALS_B12_Visuotopic.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.V1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.V1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.V2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.V2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo2011_17NetworksConfidence_N1000.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo2011_17Networks_N1000.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo2011_7NetworksConfidence_N1000.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo2011_7Networks_N1000.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_10Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_10to14Comp_Flexibility.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_10to14Comp_Specialization.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_10to14Comp_SpecializationROI.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_10to14Comp_TopSpecializationComp.csv', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_11Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_12Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_13Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.Yeo_Brainmap_14Comp_PrActGivenComp.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.aparc.a2005s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.aparc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.cortex.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.entorhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.entorhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.hOc1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.hOc2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.hOc3v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.hOc4v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.high-myelin.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.ifc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.ipc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.ips.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.lateraltemporal.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.medialpfc.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.mtl.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.retrosplenial.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.oasis.chubs.tp.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.perirhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/label/rh.perirhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/README', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/T1.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/brain.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/brainmask.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/mni305.cor.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/orig.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/reg.2mm.dat', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/reg.2mm.mni152.dat', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/subcort.mask.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri.2mm/subcort.prob.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/T1.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/aparc+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/aparc.a2005s+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/aparc.a2009s+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/brain.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/brainmask.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/lh.ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/mni305.cor.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/orig/', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/orig.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/p.aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/rh.ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/subcort.mask.1mm.README', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/subcort.mask.1mm.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/subcort.prob.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/subcort.prob.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/transforms/', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/transforms/bak/', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/transforms/reg.mni152.2mm.dat', + '{output_dir}/sourcedata/freesurfer/fsaverage/mri/transforms/talairach.xfm', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/build-stamp.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/cvs_log_pre_31May2011.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/fix-surf7.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/make_average_surface.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/make_average_volume.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/mris_inflate.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/mris_inflate_lh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/mris_inflate_rh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all-status.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.cmd', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.done', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.env', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.env.bak', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.local-copy', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/recon-all.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/surfreg.fsaverage_sym.lh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/scripts/surfreg.fsaverage_sym.rh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.area', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.avg_curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.avg_sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.avg_thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.cortex.patch.3d', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.cortex.patch.flat', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.fsaverage_sym.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.inflated.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.inflated.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.inflated_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.inflated_pre', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.orig', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.orig.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.orig_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.pial', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.pial.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.pial_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.pial_semi_inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.smoothwm', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.sphere', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.sphere.reg.avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.white', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.white.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.white_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.white_avg.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/lh.white_avg.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/mris_preproc.surface.lh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/mris_preproc.surface.rh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.area', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.avg_curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.avg_sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.avg_thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.cortex.patch.3d', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.cortex.patch.flat', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.fsaverage_sym.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.inflated.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.inflated.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.inflated_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.inflated_pre', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.orig', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.orig.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.orig_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.pial', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.pial.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.pial_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.pial_semi_inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.smoothwm', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.sphere', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.sphere.reg.avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.white', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.white.avg.area.mgh', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.white_avg', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.white_avg.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/surf/rh.white_avg.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/bem/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/lh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/lh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/lh.cortex.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/rh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/rh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/label/rh.cortex.label', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/lrrev.pure.register.dat', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/lrrev.register.dat', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/T1.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/aparc+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/aseg.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/brain.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/brainmask.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/mri_nu_correct.mni.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/orig/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/orig.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/orig_nu.mgz', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/bak/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/talairach.auto.xfm', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/talairach.xfm', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/talairach_avi.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/mri/transforms/talsrcimg_to_711-2C_as_mni_average_305_t4_vox2vox.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/build-stamp.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/lastcall.build-stamp.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/patchdir.txt', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all-status.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all.cmd', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all.done', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all.env', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all.local-copy', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/recon-all.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/surfreg.fsaverage_sym.lh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/scripts/surfreg.fsaverage_sym.rh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/src/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/stats/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.area', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.fsaverage_sym.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.inflated.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.inflated.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.orig', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.pial', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.smoothwm', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.sphere', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/lh.white', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.area', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.curv', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.fsaverage_sym.sphere.reg', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.inflated', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.inflated.H', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.inflated.K', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.orig', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.pial', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.smoothwm', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.sphere', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.sulc', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.thickness', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/surf/rh.white', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/tmp/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/touch/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/touch/talairach.touch', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/trash/', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/xhemireg.lh.log', + '{output_dir}/sourcedata/freesurfer/fsaverage/xhemi/xhemireg.rh.log', + '{output_dir}/sourcedata/freesurfer/{subid}/', + '{output_dir}/sourcedata/freesurfer/{subid}/label/', + '{output_dir}/sourcedata/freesurfer/{subid}/label/BA_exvivo.ctab', + '{output_dir}/sourcedata/freesurfer/{subid}/label/BA_exvivo.thresh.ctab', + '{output_dir}/sourcedata/freesurfer/{subid}/label/aparc.annot.DKTatlas.ctab', + '{output_dir}/sourcedata/freesurfer/{subid}/label/aparc.annot.a2009s.ctab', + '{output_dir}/sourcedata/freesurfer/{subid}/label/aparc.annot.ctab', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA3a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA3a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA3b_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA3b_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA44_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA44_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA45_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA45_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA4a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA4a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA4p_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA4p_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA6_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA6_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA_exvivo.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.BA_exvivo.thresh.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.FG1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.FG2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.FG3.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.FG4.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.MT_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.MT_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.V1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.V1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.V2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.V2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.aparc.DKTatlas.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.cortex+hipamyg.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.cortex.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.entorhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.entorhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.hOc1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.hOc2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.hOc3v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.hOc4v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.mpm.vpnl.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.nofix.cortex.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.perirhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/lh.perirhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA3a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA3a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA3b_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA3b_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA44_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA44_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA45_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA45_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA4a_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA4a_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA4p_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA4p_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA6_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA6_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA_exvivo.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.BA_exvivo.thresh.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.FG1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.FG2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.FG3.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.FG4.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.MT_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.MT_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.V1_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.V1_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.V2_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.V2_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.aparc.DKTatlas.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.aparc.a2009s.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.aparc.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.cortex+hipamyg.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.cortex.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.entorhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.entorhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.hOc1.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.hOc2.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.hOc3v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.hOc4v.mpm.vpnl.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.mpm.vpnl.annot', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.nofix.cortex.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.perirhinal_exvivo.label', + '{output_dir}/sourcedata/freesurfer/{subid}/label/rh.perirhinal_exvivo.thresh.label', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/T1.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/antsdn.brain.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aparc+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aparc.DKTatlas+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aparc.a2009s+aseg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.auto.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.auto_noCCseg.label_intensities.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.auto_noCCseg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.presurf.hypos.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/aseg.presurf.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/brain.finalsurfs.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/brain.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/brainmask.auto.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/brainmask.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/ctrl_pts.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/filled.auto.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/filled.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/lh.ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/lh.surface.defects.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/mri_nu_correct.mni.log', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/mri_nu_correct.mni.log.bak', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/norm.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/nu.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/orig/', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/orig.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/orig/001.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/orig_nu.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/rawavg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/rh.ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/rh.surface.defects.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/ribbon.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/segment.dat', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/talairach.label_intensities.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/talairach.log', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/bak/', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/cc_up.lta', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.auto.xfm', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.auto.xfm.lta', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.lta', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.m3z', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.xfm', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach.xfm.lta', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach_avi.log', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talairach_avi_QA.log', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/transforms/talsrcimg_to_711-2C_as_mni_average_305_t4_vox2vox.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/wm.asegedit.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/wm.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/wm.seg.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/mri/wmparc.mgz', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/build-stamp.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/defect2seg.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/lastcall.build-stamp.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/patchdir.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/pctsurfcon.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/pctsurfcon.log.old', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/ponscc.cut.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-lh.cmd', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-lh.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-rh.cmd', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-rh.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-status-lh.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-status-rh.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all-status.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.cmd', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.done', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.env', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.env.bak', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.local-copy', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-all.log', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/recon-config.yaml', + '{output_dir}/sourcedata/freesurfer/{subid}/scripts/unknown-args.txt', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/aseg.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/brainvol.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.BA_exvivo.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.BA_exvivo.thresh.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.aparc.DKTatlas.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.aparc.a2009s.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.aparc.pial.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.aparc.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.curv.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/lh.w-g.pct.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.BA_exvivo.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.BA_exvivo.thresh.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.aparc.DKTatlas.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.aparc.a2009s.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.aparc.pial.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.aparc.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.curv.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/rh.w-g.pct.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/stats/wmparc.stats', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/autodet.gw.stats.lh.dat', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/autodet.gw.stats.rh.dat', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.area', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.area.mid', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.area.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.avg_curv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.curv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.curv.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.defect_borders', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.defect_chull', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.defect_labels', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.defects.pointset', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.fsaverage.sphere.reg', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.inflated', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.inflated.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.inflated.K', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.inflated.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.jacobian_white', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.midthickness', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.orig', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.orig.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.orig.premesh', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.pial.T1', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.qsphere.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.BE.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.C.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.FI.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.H.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.K.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.K1.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.K2.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.S.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.smoothwm.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.sphere', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.sphere.reg', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.sulc', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.thickness', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.volume', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.w-g.pct.mgh', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white.K', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white.preaparc', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white.preaparc.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/lh.white.preaparc.K', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.area', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.area.mid', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.area.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.avg_curv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.curv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.curv.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.defect_borders', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.defect_chull', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.defect_labels', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.defects.pointset', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.fsaverage.sphere.reg', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.inflated', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.inflated.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.inflated.K', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.inflated.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.jacobian_white', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.midthickness', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.orig', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.orig.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.orig.premesh', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.pial', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.pial.T1', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.qsphere.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.BE.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.C.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.FI.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.H.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.K.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.K1.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.K2.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.S.crv', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.smoothwm.nofix', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.sphere', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.sphere.reg', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.sulc', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.thickness', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.volume', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.w-g.pct.mgh', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white.K', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white.preaparc', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white.preaparc.H', + '{output_dir}/sourcedata/freesurfer/{subid}/surf/rh.white.preaparc.K', + '{output_dir}/sourcedata/freesurfer/{subid}/tmp/', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/apas2aseg.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/asegmerge.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/ca_label.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/ca_normalize.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/ca_register.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/conform.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/cortical_ribbon.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/em_register.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/fill.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/inorm1.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/inorm2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.aparc.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.aparc2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.aparcstats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.aparcstats2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.aparcstats3.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.autodet.gw.stats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.avgcurv.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.cortex+hipamyg.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.cortex.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.curvstats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.inflate.H.K.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.inflate1.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.inflate2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.jacobian_white.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.pctsurfcon.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.pial.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.qsphere.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.smoothwm1.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.smoothwm2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.sphmorph.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.sphreg.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.tessellate.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.topofix.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.white.H.K.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.white.preaparc.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/lh.white.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/nu.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/relabelhypos.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.aparc.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.aparc2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.aparcstats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.aparcstats2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.aparcstats3.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.autodet.gw.stats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.avgcurv.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.cortex+hipamyg.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.cortex.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.curvstats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.inflate.H.K.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.inflate1.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.inflate2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.jacobian_white.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.pctsurfcon.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.pial.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.qsphere.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.smoothwm1.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.smoothwm2.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.sphmorph.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.sphreg.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.tessellate.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.topofix.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.white.H.K.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.white.preaparc.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/rh.white.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/segstats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/talairach.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/wmaparc.stats.touch', + '{output_dir}/sourcedata/freesurfer/{subid}/touch/wmsegment.touch', +] + + +def write_fs_files(output_dir, subid): + """Touches an empty file for each FreeSurfer file in the output directory.""" + for file_pattern in fs_files: + fpath = Path(file_pattern.format(output_dir=output_dir, subid=subid)) + if file_pattern.endswith('/'): + # For directories, only create if it doesn't exist + if not fpath.exists(): + fpath.mkdir(parents=True, exist_ok=True) + else: + # For files, ensure parent directory exists and create file + if not fpath.parent.exists(): + fpath.parent.mkdir(parents=True, exist_ok=True) + if not fpath.exists(): + fpath.touch()