From 82b9853a63fc5d702399c3cacbfcd68357d80f81 Mon Sep 17 00:00:00 2001 From: Kathy <37816304+kathy-snider@users.noreply.github.com> Date: Fri, 16 Apr 2021 13:34:31 -0700 Subject: [PATCH] Added FileMapper as a stage in the pipeline. (#20) * Stage needs entry in table. * Files needed to run filemapper for the infant pipeline. * Tell the pipeline how to find the FileMapper files. * Match filename to the file's name. * Left out space between args. * The pipeline uses the path to files; wrapper must 'find' root. * Use env var to find filemapper script. * Jsons need executable? * Fix applicaton name. * Correct the name of the script. * Seem to have lost a bunch of my script. * Seem to have lost a bunch of my script. * Have tested and merged internal tools; can used tagged version now. --- BIDS_filemapper_wrapper.sh | 149 +++++++++++++++++++++++++++++ Dockerfile | 10 +- SetupEnv.sh | 1 + app/pipeline_expected_outputs.json | 2 + app/pipelines.py | 10 +- current_infant.json | 30 ++++++ current_infant_no_session.json | 30 ++++++ 7 files changed, 224 insertions(+), 8 deletions(-) create mode 100755 BIDS_filemapper_wrapper.sh create mode 100755 current_infant.json create mode 100755 current_infant_no_session.json diff --git a/BIDS_filemapper_wrapper.sh b/BIDS_filemapper_wrapper.sh new file mode 100755 index 0000000..2e5de26 --- /dev/null +++ b/BIDS_filemapper_wrapper.sh @@ -0,0 +1,149 @@ +#! /bin/bash + +# The file mapper uses a 'template' json file and replaces {SUBJECT}, {SESSION}, and +# {PIPELINE} strings with the subject number, session number, and pipeline name provided +# to it. However, it does not handle task-specific files (esp. motion regressors). This +# wrapper looks for task-specific files for each of the tasks it finds in the pipeline's +# output. It copies the task files to the appropriate locations/names and then calls +# file_mapper_script.py to copy the non-task files. +# + +# Required +SUB=$1 # subject number - no 'sub-'. +SES=$2 # session number - no 'ses-'. +FILES=$3 # path to subject/session/files. +TEMPLATE_JSON=$4 # json file to use as a template. +shift 4 + +PIPE=infant-abcd-bids-pipeline + +if [ -z "${SUB}" ] || [ -z "${SES}" ] || [ -z "${FILES}" ] || [ -z "${TEMPLATE_JSON}" ] ; then + echo "usage: $0 subject-id session-id path-to-processed-data path-to-template-json " + exit 1 +fi + +# Set up strings to use for subject, session, paths etc. +session_dir=$( dirname ${FILES} ) +session=$( basename ${session_dir} ) +subject_dir=$( dirname ${session_dir} ) +subject=$(basename ${subject_dir} ) +if [[ "${session}" == "ses-${SES}" ]] && [[ "${subject}" == "sub-${SUB}" ]] ; then + ROOT=$( dirname ${subject_dir} ) +else + echo There is a problem with the processed data. Expected path to end with sub-${SUB}/ses-${SES}/files. + echo The path provided does not match that pattern. Path is: ${FILES}. +fi + +results=${FILES}/MNINonLinear/Results +if ! [ -d ${results} ]; then + echo "ERROR: Filemapper is unable to find directory ${results}. " + exit 1 +fi + +derivs="${ROOT}/derivatives/${PIPE}/${subject}/${session}" +func="${derivs}/func" +mkdir -p ${func} + + +####### START PROCESSING ############# +# Handle special cases. +# +# Each subject/session can have a different set of tasks and different numbers +# of runs of each. +# +# Furthermore, we may or may not have filtered files. +# +# These special cases cannot be handled with the json, because we would need +# to put in source and destination files for every possible combination. + +shopt -s nullglob +pushd ${results} > /dev/null + +# Each fMRI (task/run combination) has a subdirectory in processed files, in +# MNINonLinear/Results. We can use those subdirectories to get the names of the +# fMRIs. +# If filtering (bandstop) was used, there will be one file of filtered movement +# regressors for each fMRI. +# For example: +# MNINonLinear/Results/ses-1_task-rest_run-02/DCANBOLDProc_v4.0.0/DCANBOLDProc_v4.0.0_bs18.582_25.7263_filtered_Movement_Regressors.txt + +filtered=( */DCANBOLDProc_v4.0.0/DCANBOLDProc_v4.0.0*filtered_Movement_Regressors.txt ) +num=${#filtered[@]} +if (( num > 0 )) ; then + for filtered_in in ${filtered[@]} ; do + TASK=${filtered_in%%/*} # task name is *top* dirname. + if [[ ${TASK} =~ ses- ]] ; then + bids_prefix=${subject}_${TASK} + elif [[ ${TASK} =~ task- ]] ; then + bids_prefix=${subject}_${session}_${TASK} + else + echo "WARNING: Unable to make a valid bids name from ${TASK}." + bids_prefix=${subject}_${TASK} + fi + + # Get the filtered motion file for this task. + filtered_out=${func}/${bids_prefix}_desc-filtered_motion.tsv + tr ' ' '\t' <<< "X Y Z RotX RotY RotZ XDt YDt ZDt RotXDt RotYDt RotZDt" > ${filtered_out} + cat ${filtered_in} | tr ' ' '\t' >> ${filtered_out} + done + + # If we are here, then there was at least one filtered file. Therefore, the + # ptseries **are** filtered, even though the names don't reflect that. So, + # while we are in this part of the code, where we know we had at least one + # filtered movement regressors file, make the string to be used in the + # destination ptseries files (below). + ptseries_end="desc-filtered_timeseries.ptseries.nii" +else + # Since there were no filtered movement regressors files, we know that + # filtering was not used. The ptseries files are unfiltered. + ptseries_end="timeseries.ptseries.nii" +fi + +# There should always be unfiltered motion regressors. Visit each task directory. +# Get the Atlas time series for each as well. +for TASK in $( ls -1d *task*/ ) ; do + TASK=${TASK%/} + if [[ ${TASK} =~ ses- ]] ; then + bids_prefix=${subject}_${TASK} + elif [[ ${TASK} =~ task- ]] ; then + bids_prefix=${subject}_${session}_${TASK} + else + echo "WARNING: Unable to make a valid bids name from ${TASK}." + bids_prefix=${subject}_${TASK} + fi + + unfiltered_in="${TASK}/Movement_Regressors.txt" + unfiltered_out="${func}/${bids_prefix}_motion.tsv" + + if [ -e ${unfiltered_in} ] ; then + # To be valid motion.tsv files, the motion regressors are required to have + # column headers and be tab-separated (per BEP012). + tr ' ' '\t' <<< "X Y Z RotX RotY RotZ XDt YDt ZDt RotXDt RotYDt RotZDt" > ${unfiltered_out} + cat ${unfiltered_in} | tr ' ' '\t' >> ${unfiltered_out} + else + echo "ERROR: Filemapper is unable to find file ${unfiltered_in}." + continue + fi + + cp ${TASK}/${TASK}_Atlas.dtseries.nii ${func}/${bids_prefix}_bold_timeseries.dtseries.nii +done + +popd > /dev/null +shopt -u nullglob + + +fmscript=${FILEMAPPERDIR}/file_mapper_script.py +CMD="${fmscript} ${TEMPLATE_JSON} -a copy -o -s -sp ${FILES} -dp ${ROOT} -t SUBJECT=${SUB},SESSION=${SES},PIPELINE=${PIPE}" +set -x +eval ${CMD} +set +x + +result=$? +if (( 0 == result )) ; then + echo "FileMapper was successful." +else + echo "FileMapper had errors." + exit 1 +fi + + diff --git a/Dockerfile b/Dockerfile index 6339473..d8d9fa5 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM dcanlabs/internal-tools:v1.0.1 +FROM dcanlabs/internal-tools:v1.0.2 RUN apt-get update && apt-get install -yq --no-install-recommends \ apt-utils \ @@ -18,8 +18,7 @@ RUN python3 -m pip install -r "/app/requirements.txt" # insert pipeline code ADD https://github.com/DCAN-Labs/dcan-infant-pipeline.git version.json -#RUN git clone -b 'v0.0.9' --single-branch --depth 1 https://github.com/DCAN-Labs/dcan-infant-pipeline.git /opt/pipeline -RUN git clone -b 'master' --single-branch --depth 1 https://github.com/DCAN-Labs/dcan-infant-pipeline.git /opt/pipeline +RUN git clone -b 'v0.0.9' --single-branch --depth 1 https://github.com/DCAN-Labs/dcan-infant-pipeline.git /opt/pipeline # unless otherwise specified... @@ -35,6 +34,11 @@ RUN mkdir /bids_input /output /atlases COPY ["./baby_BIDS_cleaning.json", "/opt/dcan-tools/customclean/"] COPY ["./baby_BIDS_no_session_cleaning.json", "/opt/dcan-tools/customclean/"] +# Copy file mapper files. +COPY ["./current_infant.json", "/opt/dcan-tools/filemapper/"] +COPY ["./current_infant_no_session.json", "/opt/dcan-tools/filemapper/"] +COPY ["./BIDS_filemapper_wrapper.sh", "/opt/dcan-tools/filemapper/"] + # setup ENTRYPOINT COPY ["./entrypoint.sh", "/entrypoint.sh"] COPY ["./SetupEnv.sh", "/SetupEnv.sh"] diff --git a/SetupEnv.sh b/SetupEnv.sh index 9c6b874..f88ad59 100755 --- a/SetupEnv.sh +++ b/SetupEnv.sh @@ -46,6 +46,7 @@ export MATLAB_PREFDIR=/opt/mcr export ABCDTASKPREPDIR=/opt/dcan-tools/ABCD_tfMRI export CUSTOMCLEANDIR=/opt/dcan-tools/customclean export CUSTOMCLEAN_JSON=${CUSTOMCLEANDIR}/baby_BIDS_cleaning.json +export FILEMAPPERDIR=/opt/dcan-tools/filemapper # hacky solution for now... diff --git a/app/pipeline_expected_outputs.json b/app/pipeline_expected_outputs.json index 68a7fca..f0be36a 100755 --- a/app/pipeline_expected_outputs.json +++ b/app/pipeline_expected_outputs.json @@ -234,6 +234,8 @@ ], "ExecutiveSummary": [ ], + "FileMapper": [ + ], "CustomClean": [ "{path}/custom_clean_success_record.txt" ] diff --git a/app/pipelines.py b/app/pipelines.py index 0a5b8ff..3b4002a 100755 --- a/app/pipelines.py +++ b/app/pipelines.py @@ -1125,12 +1125,12 @@ def args(self): class FileMapper(Stage): - script = '{FILEMAPPERDIR}/filemapper_wrapper.sh' + script = '{FILEMAPPERDIR}/BIDS_filemapper_wrapper.sh' - spec = ' --output-root={path}' \ - ' --participant-label={subject}' \ - ' --session-id={session}' \ - ' --json={input_json}' + spec = '{subject} ' \ + '{session} ' \ + '{path} ' \ + '{input_json} ' def __init__(self, config, input_json): super(__class__, self).__init__(config) diff --git a/current_infant.json b/current_infant.json new file mode 100755 index 0000000..49ed50e --- /dev/null +++ b/current_infant.json @@ -0,0 +1,30 @@ +{ + "DCANBOLDProc_v4.0.0/analyses_v2/motion/ses-{SESSION}_task-rest_run-_power_2014_FD_only.mat": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_motion_mask.mat", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Atlas.dtseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_timeseries.dtseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Gordon.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Gordon2014FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Gordon_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Gordon2014FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_HCP.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-HCP2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_HCP_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-HCP2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Markov.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Markov2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Markov_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Markov2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Power.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Power2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Power_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Power2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Yeo.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Yeo2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/ses-{SESSION}_task-rest_run-_DCANBOLDProc_v4.0.0_Yeo_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_ses-{SESSION}_task-rest_bold_atlas-Yeo2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.curvature.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_space-fsLR32k_curv.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.sulc.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_space-fsLR32k_sulc.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.thickness.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_space-fsLR32k_thickness.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.L.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-L_space-MNI_mesh-fsLR32k_midthickness.surf.gii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.R.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-R_space-MNI_mesh-fsLR32k_midthickness.surf.gii", + "MNINonLinear/{SUBJECT}.L.midthickness.164k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-L_space-MNI_mesh-fsLR164k_midthickness.surf.gii", + "MNINonLinear/{SUBJECT}.R.midthickness.164k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-R_space-MNI_mesh-fsLR164k_midthickness.surf.gii", + "MNINonLinear/Native/{SUBJECT}.L.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-L_space-MNI_mesh-native_midthickness.surf.gii", + "MNINonLinear/Native/{SUBJECT}.R.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-R_space-MNI_mesh-native_midthickness.surf.gii", + "T1w/fsaverage_LR32k/{SUBJECT}.L.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-L_space-T1w_mesh-fsLR32k_midthickness.surf.gii", + "T1w/fsaverage_LR32k/{SUBJECT}.R.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-R_space-T1w_mesh-fsLR32k_midthickness.surf.gii", + "T1w/Native/{SUBJECT}.L.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-L_space-T1w_mesh-native_midthickness.surf.gii", + "T1w/Native/{SUBJECT}.R.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_hemi-R_space-T1w_mesh-native_midthickness.surf.gii", + "T1w/aparc+aseg.nii.gz": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_space-ACPC_dseg.nii.gz", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.MyelinMap.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_atlas-MNI_space-fsLR32k_myelinmap.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.SmoothedMyelinMap.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_ses-{SESSION}_atlas-MNI_space-fsLR32k_desc-smoothed_myelinmap.dscalar.nii" +} diff --git a/current_infant_no_session.json b/current_infant_no_session.json new file mode 100755 index 0000000..af53d76 --- /dev/null +++ b/current_infant_no_session.json @@ -0,0 +1,30 @@ +{ + "DCANBOLDProc_v4.0.0/analyses_v2/motion/task-rest_run-_power_2014_FD_only.mat": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_motion_mask.mat", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Atlas.dtseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_timeseries.dtseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Gordon.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Gordon2014FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Gordon_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Gordon2014FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_HCP.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-HCP2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_HCP_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-HCP2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Markov.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Markov2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Markov_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Markov2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Power.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Power2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Power_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Power2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Yeo.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Yeo2016FreeSurfer_timeseries.ptseries.nii", + "MNINonLinear/Results/task-rest_run-_DCANBOLDProc_v4.0.0_Yeo_subcorticals.ptseries.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/func/sub-{SUBJECT}_task-rest_bold_atlas-Yeo2016FreeSurferSubcortical_timeseries.ptseries.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.curvature.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_space-fsLR32k_curv.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.sulc.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_space-fsLR32k_sulc.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.thickness.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_space-fsLR32k_thickness.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.L.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-L_space-MNI_mesh-fsLR32k_midthickness.surf.gii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.R.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-R_space-MNI_mesh-fsLR32k_midthickness.surf.gii", + "MNINonLinear/{SUBJECT}.L.midthickness.164k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-L_space-MNI_mesh-fsLR164k_midthickness.surf.gii", + "MNINonLinear/{SUBJECT}.R.midthickness.164k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-R_space-MNI_mesh-fsLR164k_midthickness.surf.gii", + "MNINonLinear/Native/{SUBJECT}.L.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-L_space-MNI_mesh-native_midthickness.surf.gii", + "MNINonLinear/Native/{SUBJECT}.R.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-R_space-MNI_mesh-native_midthickness.surf.gii", + "T1w/fsaverage_LR32k/{SUBJECT}.L.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-L_space-T1w_mesh-fsLR32k_midthickness.surf.gii", + "T1w/fsaverage_LR32k/{SUBJECT}.R.midthickness.32k_fs_LR.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-R_space-T1w_mesh-fsLR32k_midthickness.surf.gii", + "T1w/Native/{SUBJECT}.L.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-L_space-T1w_mesh-native_midthickness.surf.gii", + "T1w/Native/{SUBJECT}.R.midthickness.native.surf.gii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_hemi-R_space-T1w_mesh-native_midthickness.surf.gii", + "T1w/aparc+aseg.nii.gz": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_space-ACPC_dseg.nii.gz", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.MyelinMap.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_atlas-MNI_space-fsLR32k_myelinmap.dscalar.nii", + "MNINonLinear/fsaverage_LR32k/{SUBJECT}.SmoothedMyelinMap.32k_fs_LR.dscalar.nii": "derivatives/{PIPELINE}/sub-{SUBJECT}/ses-{SESSION}/anat/sub-{SUBJECT}_atlas-MNI_space-fsLR32k_desc-smoothed_myelinmap.dscalar.nii" +}