From 3e25da9ec1bbee35be456f86ad1dc6ee3be83190 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Thu, 2 Jan 2025 15:08:04 -0500 Subject: [PATCH] Output fsLR meshes on subject surfaces (#478) --- .../data/expected_outputs_test_003_full.txt | 6 ++++ aslprep/workflows/base.py | 31 ++++++++++++++++--- docs/outputs.rst | 3 ++ pyproject.toml | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/aslprep/tests/data/expected_outputs_test_003_full.txt b/aslprep/tests/data/expected_outputs_test_003_full.txt index 63f020713..93d1dc04c 100644 --- a/aslprep/tests/data/expected_outputs_test_003_full.txt +++ b/aslprep/tests/data/expected_outputs_test_003_full.txt @@ -81,8 +81,14 @@ sub-01/anat sub-01/anat/sub-01_desc-ribbon_mask.json sub-01/anat/sub-01_desc-ribbon_mask.nii.gz sub-01/anat/sub-01_hemi-L_desc-preproc_sphere.surf.gii +sub-01/anat/sub-01_hemi-L_space-fsLR_den-32k_desc-preproc_midthickness.surf.gii +sub-01/anat/sub-01_hemi-L_space-fsLR_den-32k_desc-preproc_pial.surf.gii +sub-01/anat/sub-01_hemi-L_space-fsLR_den-32k_desc-preproc_white.surf.gii sub-01/anat/sub-01_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii sub-01/anat/sub-01_hemi-R_desc-preproc_sphere.surf.gii +sub-01/anat/sub-01_hemi-R_space-fsLR_den-32k_desc-preproc_midthickness.surf.gii +sub-01/anat/sub-01_hemi-R_space-fsLR_den-32k_desc-preproc_pial.surf.gii +sub-01/anat/sub-01_hemi-R_space-fsLR_den-32k_desc-preproc_white.surf.gii sub-01/anat/sub-01_hemi-R_space-fsLR_desc-msmsulc_sphere.surf.gii sub-01/anat/sub-01_space-fsLR_den-91k_desc-preproc_curv.dscalar.nii sub-01/anat/sub-01_space-fsLR_den-91k_desc-preproc_curv.json diff --git a/aslprep/workflows/base.py b/aslprep/workflows/base.py index 927f4f367..6f8eaa91a 100644 --- a/aslprep/workflows/base.py +++ b/aslprep/workflows/base.py @@ -128,13 +128,14 @@ def init_single_subject_wf(subject_id: str): from smriprep.workflows.outputs import ( init_ds_anat_volumes_wf, init_ds_grayord_metrics_wf, + init_ds_surfaces_wf, init_template_iterator_wf, ) from smriprep.workflows.surfaces import ( init_gifti_morphometrics_wf, init_hcp_morphometrics_wf, init_morph_grayords_wf, - init_resample_midthickness_wf, + init_resample_surfaces_wf, ) from aslprep.interfaces.bids import BIDSDataGrabber @@ -422,7 +423,8 @@ def init_single_subject_wf(subject_id: str): grayord_density=config.workflow.cifti_output, omp_nthreads=omp_nthreads, ) - resample_midthickness_wf = init_resample_midthickness_wf( + resample_surfaces_wf = init_resample_surfaces_wf( + surfaces=['white', 'pial', 'midthickness'], grayord_density=config.workflow.cifti_output, ) ds_grayord_metrics_wf = init_ds_grayord_metrics_wf( @@ -431,6 +433,15 @@ def init_single_subject_wf(subject_id: str): metrics=['curv', 'thickness', 'sulc'], cifti_output=config.workflow.cifti_output, ) + ds_fsLR_surfaces_wf = init_ds_surfaces_wf( + output_dir=aslprep_dir, + surfaces=['white', 'pial', 'midthickness'], + entities={ + 'space': 'fsLR', + 'density': '32k' if config.workflow.cifti_output == '91k' else '59k', + }, + name='ds_fsLR_surfaces_wf', + ) workflow.connect([ (anat_fit_wf, curv_wf, [ @@ -446,7 +457,9 @@ def init_single_subject_wf(subject_id: str): (curv_wf, hcp_morphometrics_wf, [ ('outputnode.curv', 'inputnode.curv'), ]), - (anat_fit_wf, resample_midthickness_wf, [ + (anat_fit_wf, resample_surfaces_wf, [ + ('outputnode.white', 'inputnode.white'), + ('outputnode.pial', 'inputnode.pial'), ('outputnode.midthickness', 'inputnode.midthickness'), ( f"outputnode.sphere_reg_{'msm' if msm_sulc else 'fsLR'}", @@ -466,12 +479,15 @@ def init_single_subject_wf(subject_id: str): ('outputnode.sulc', 'inputnode.sulc'), ('outputnode.roi', 'inputnode.roi'), ]), - (resample_midthickness_wf, morph_grayords_wf, [ + (resample_surfaces_wf, morph_grayords_wf, [ ('outputnode.midthickness_fsLR', 'inputnode.midthickness_fsLR'), ]), (anat_fit_wf, ds_grayord_metrics_wf, [ ('outputnode.t1w_valid_list', 'inputnode.source_files'), ]), + (anat_fit_wf, ds_fsLR_surfaces_wf, [ + ('outputnode.t1w_valid_list', 'inputnode.source_files'), + ]), (morph_grayords_wf, ds_grayord_metrics_wf, [ ('outputnode.curv_fsLR', 'inputnode.curv'), ('outputnode.curv_metadata', 'inputnode.curv_metadata'), @@ -480,6 +496,11 @@ def init_single_subject_wf(subject_id: str): ('outputnode.sulc_fsLR', 'inputnode.sulc'), ('outputnode.sulc_metadata', 'inputnode.sulc_metadata'), ]), + (resample_surfaces_wf, ds_fsLR_surfaces_wf, [ + ('outputnode.white_fsLR', 'inputnode.white'), + ('outputnode.pial_fsLR', 'inputnode.pial'), + ('outputnode.midthickness_fsLR', 'inputnode.midthickness'), + ]), ]) # fmt:skip if config.workflow.anat_only: @@ -713,7 +734,7 @@ def init_single_subject_wf(subject_id: str): (select_MNI6_xfm, asl_wf, [('anat2std_xfm', 'inputnode.anat2mni6_xfm')]), (select_MNI6_tpl, asl_wf, [('brain_mask', 'inputnode.mni6_mask')]), (hcp_morphometrics_wf, asl_wf, [('outputnode.roi', 'inputnode.cortex_mask')]), - (resample_midthickness_wf, asl_wf, [ + (resample_surfaces_wf, asl_wf, [ ('outputnode.midthickness_fsLR', 'inputnode.midthickness_fsLR'), ]), ]) # fmt:skip diff --git a/docs/outputs.rst b/docs/outputs.rst index 3b67cb767..24cba7f68 100644 --- a/docs/outputs.rst +++ b/docs/outputs.rst @@ -133,6 +133,9 @@ If FreeSurfer reconstructions are used, the following surface files are generate sub-