From b18d491c548ea6221616b3658e43781946dec767 Mon Sep 17 00:00:00 2001 From: mathiasg Date: Thu, 23 Jan 2025 16:39:25 -0500 Subject: [PATCH 1/7] ENH: Update anatomical coregistration defaults, purge unused file --- ...hin_subject_t1t2.json => t1-t2-coreg.json} | 4 +- nibabies/data/t1_to_bold.json | 40 ------------------- 2 files changed, 2 insertions(+), 42 deletions(-) rename nibabies/data/{within_subject_t1t2.json => t1-t2-coreg.json} (91%) delete mode 100644 nibabies/data/t1_to_bold.json diff --git a/nibabies/data/within_subject_t1t2.json b/nibabies/data/t1-t2-coreg.json similarity index 91% rename from nibabies/data/within_subject_t1t2.json rename to nibabies/data/t1-t2-coreg.json index 0fdc0e62..a64bdb07 100644 --- a/nibabies/data/within_subject_t1t2.json +++ b/nibabies/data/t1-t2-coreg.json @@ -31,9 +31,9 @@ [ 0.1, 3.0, 0.0 ] ], "transforms": [ "Translation", "Rigid", "SyN" ], - "use_histogram_matching": [ true, true, true ], + "use_histogram_matching": false, "verbose": true, "winsorize_lower_quantile": 0.0001, "winsorize_upper_quantile": 0.9999, - "write_composite_transform": false + "write_composite_transform": true } diff --git a/nibabies/data/t1_to_bold.json b/nibabies/data/t1_to_bold.json deleted file mode 100644 index e4bdeb69..00000000 --- a/nibabies/data/t1_to_bold.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "collapse_output_transforms": true, - "convergence_threshold": [ 1E-6, 1E-6, 1E-9 ], - "convergence_window_size": [ 10, 5, 2], - "dimension": 3, - "interpolation": "BSpline", - "metric": [ "Mattes", "Mattes", "Mattes" ], - "metric_weight": [ 1.0, 1.0, 1.0 ], - "number_of_iterations": [ - [ 500, 0 ], - [ 1000, 500, 250, 100 ], - [ 50, 10 ] - ], - "radius_or_number_of_bins": [ 32, 32, 32 ], - "sampling_percentage": [ 0.25, 0.25, 0.8 ], - "sampling_strategy": [ "Random", "Regular", "Random" ], - "shrink_factors": [ - [ 4, 1 ], - [ 8, 4, 2, 1 ], - [ 2, 1 ] - ], - "sigma_units": [ "vox", "vox", "vox" ], - "smoothing_sigmas": [ - [ 6.0, 0.0 ], - [ 4.0, 2.0, 1.0, 0.0], - [ 2.0, 0 ] - ], - "transform_parameters": [ - [ 1.0 ], - [ 0.1 ], - [ 0.1, 3.0, 0.0 ] - ], - "transforms": [ "Translation", "Rigid", "SyN" ], - "use_estimate_learning_rate_once": [ false, false, true ], - "use_histogram_matching": [ true, true, true ], - "verbose": true, - "winsorize_lower_quantile": 0.0001, - "winsorize_upper_quantile": 0.9999, - "write_composite_transform": false - } From 93cc325e2942ec61f3cdc009d66138755e56117a Mon Sep 17 00:00:00 2001 From: mathiasg Date: Fri, 24 Jan 2025 00:21:58 -0500 Subject: [PATCH 2/7] ENH: Output T1<->T2 coregistration --- nibabies/workflows/anatomical/fit.py | 80 +++++++++++++--------------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/nibabies/workflows/anatomical/fit.py b/nibabies/workflows/anatomical/fit.py index 1f59dc3b..e3a68d0c 100644 --- a/nibabies/workflows/anatomical/fit.py +++ b/nibabies/workflows/anatomical/fit.py @@ -35,6 +35,7 @@ ) from nibabies import config +from nibabies.interfaces import DerivativesDataSink from nibabies.workflows.anatomical.brain_extraction import init_infant_brain_extraction_wf from nibabies.workflows.anatomical.outputs import init_anat_reports_wf from nibabies.workflows.anatomical.preproc import init_anat_preproc_wf, init_csf_norm_wf @@ -741,36 +742,31 @@ def init_infant_anat_fit_wf( probmap=probmap, ) - # TODO: Currently the XFMs are transform0GenericAffine.mat, transform1Warp.nii.gz - # The coregistration should be changed to instead save - # 'composite_transform' and 'inverse_composite_transform' - # from antsRegistration (single h5 files) - # - # ds_t1w2t2w_xfm = pe.Node( - # DerivativesDataSink( - # base_directory=output_dir, - # to='T2w', - # mode='image', - # suffix='xfm', - # dismiss_entites=('desc', 'echo'), - # **{'from': 'T1w'} - # ), - # name='ds_t1w2t2w_xfm', - # run_without_submitting=True, - # ) - - # ds_t2w2t1w_xfm = pe.Node( - # DerivativesDataSink( - # base_directory=output_dir, - # to='T1w', - # mode='image', - # suffix='xfm', - # dismiss_entites=('desc', 'echo'), - # **{'from': 'T2w'} - # ), - # name='ds_t2w2t1w_xfm', - # run_without_submitting=True, - # ) + ds_t1w2t2w_xfm = pe.Node( + DerivativesDataSink( + base_directory=output_dir, + to='T2w', + mode='image', + suffix='xfm', + dismiss_entites=('desc', 'echo'), + **{'from': 'T1w'}, + ), + name='ds_t1w2t2w_xfm', + run_without_submitting=True, + ) + + ds_t2w2t1w_xfm = pe.Node( + DerivativesDataSink( + base_directory=output_dir, + to='T1w', + mode='image', + suffix='xfm', + dismiss_entites=('desc', 'echo'), + **{'from': 'T2w'}, + ), + name='ds_t2w2t1w_xfm', + run_without_submitting=True, + ) workflow.connect([ (t1w_validate, coregistration_wf, [ @@ -780,18 +776,18 @@ def init_infant_anat_fit_wf( ('t2w_preproc', 'inputnode.in_t2w'), ('t2w_mask', 'inputnode.in_mask'), ]), - # (coregistration_wf, ds_t1w2t2w_xfm, [ - # ('outputnode.t1w2t2w_xfm', 'in_file'), - # ]), - # (sourcefile_buffer, ds_t1w2t2w_xfm, [ - # ('t1w_source_files', 'source_file'), - # ]), - # (coregistration_wf, ds_t2w2t1w_xfm, [ - # ('outputnode.t2w2t1w_xfm', 'in_file'), - # ]), - # (sourcefile_buffer, ds_t2w2t1w_xfm, [ - # ('t2w_source_files', 'source_file'), - # ]), + (coregistration_wf, ds_t1w2t2w_xfm, [ + ('outputnode.t1w2t2w_xfm', 'in_file'), + ]), + (sourcefile_buffer, ds_t1w2t2w_xfm, [ + ('t1w_source_files', 'source_file'), + ]), + (coregistration_wf, ds_t2w2t1w_xfm, [ + ('outputnode.t2w2t1w_xfm', 'in_file'), + ]), + (sourcefile_buffer, ds_t2w2t1w_xfm, [ + ('t2w_source_files', 'source_file'), + ]), (coregistration_wf, coreg_buffer, [ ('outputnode.t1w2t2w_xfm', 't1w2t2w_xfm'), ('outputnode.t2w2t1w_xfm', 't2w2t1w_xfm'), From fa44fe6fed6ca77dc56c6de4ad8f1cde62e6918a Mon Sep 17 00:00:00 2001 From: mathiasg Date: Fri, 24 Jan 2025 00:22:33 -0500 Subject: [PATCH 3/7] RF: Updated settings filename --- nibabies/workflows/anatomical/registration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nibabies/workflows/anatomical/registration.py b/nibabies/workflows/anatomical/registration.py index e404d673..79caeda2 100644 --- a/nibabies/workflows/anatomical/registration.py +++ b/nibabies/workflows/anatomical/registration.py @@ -134,7 +134,7 @@ def init_coregistration_wf( # Set up T1w -> T2w within-subject registration coreg = pe.Node( - Registration(from_file=get_file('nibabies', 'data/within_subject_t1t2.json')), + Registration(from_file=get_file('nibabies', 'data/t1-t2-coreg.json')), name='coreg', n_procs=omp_nthreads, mem_gb=mem_gb, From 667a0ce7db9a93515fcc83d569d2cc89952842c9 Mon Sep 17 00:00:00 2001 From: Mathias Goncalves Date: Fri, 24 Jan 2025 10:30:21 -0500 Subject: [PATCH 4/7] FIX: Composite transform connections --- nibabies/workflows/anatomical/registration.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/nibabies/workflows/anatomical/registration.py b/nibabies/workflows/anatomical/registration.py index 79caeda2..05727701 100644 --- a/nibabies/workflows/anatomical/registration.py +++ b/nibabies/workflows/anatomical/registration.py @@ -177,15 +177,14 @@ def init_coregistration_wf( ('in_t2w', 'input_image')]), (fixed_masks_arg, coreg, [('out', 'fixed_image_masks')]), (coreg, map_t2w, [ - ('reverse_transforms', 'transforms'), - ('reverse_invert_flags', 'invert_transform_flags'), + ('inverse_composite_transform', 'transforms'), ]), (final_n4, apply_mask, [('output_image', 'in_file')]), (final_n4, outputnode, [('output_image', 't1w_preproc')]), (map_t2w, outputnode, [('output_image', 't2w_preproc')]), (apply_mask, outputnode, [('out_file', 't1w_brain')]), - (coreg, outputnode, [('forward_transforms', 't1w2t2w_xfm')]), - (coreg, outputnode, [('reverse_transforms', 't2w2t1w_xfm')]), + (coreg, outputnode, [('composite_transform', 't1w2t2w_xfm')]), + (coreg, outputnode, [('inverse_composite_transform', 't2w2t1w_xfm')]), ]) # fmt: on @@ -218,8 +217,8 @@ def init_coregistration_wf( ('in_t1w', 'reference_image'), ('in_probmap', 'input_image')]), (coreg, map_mask, [ - ('reverse_transforms', 'transforms'), - ('reverse_invert_flags', 'invert_transform_flags')]), + ('inverse_composite_transform', 'transforms'), + ]), (map_mask, thr_mask, [('output_image', 'in_file')]), (map_mask, final_n4, [('output_image', 'weight_image')]), (thr_mask, outputnode, [('out_mask', 't1w_mask')]), @@ -240,8 +239,8 @@ def init_coregistration_wf( ('in_t1w', 'reference_image'), ('in_mask', 'input_image')]), (coreg, map_precomp_mask, [ - ('reverse_transforms', 'transforms'), - ('reverse_invert_flags', 'invert_transform_flags')]), + ('inverse_composite_transform', 'transforms'), + ]), (map_precomp_mask, final_n4, [('output_image', 'weight_image')]), (map_precomp_mask, outputnode, [('output_image', 't1w_mask')]), (map_precomp_mask, apply_mask, [('output_image', 'in_mask')]), From 4875252c639a734ea0c7a80ca86119033ced3358 Mon Sep 17 00:00:00 2001 From: Mathias Goncalves Date: Fri, 24 Jan 2025 10:30:41 -0500 Subject: [PATCH 5/7] ENH: Enable coregistration report --- nibabies/workflows/anatomical/fit.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/nibabies/workflows/anatomical/fit.py b/nibabies/workflows/anatomical/fit.py index e3a68d0c..eb6b3f3b 100644 --- a/nibabies/workflows/anatomical/fit.py +++ b/nibabies/workflows/anatomical/fit.py @@ -37,7 +37,7 @@ from nibabies import config from nibabies.interfaces import DerivativesDataSink from nibabies.workflows.anatomical.brain_extraction import init_infant_brain_extraction_wf -from nibabies.workflows.anatomical.outputs import init_anat_reports_wf +from nibabies.workflows.anatomical.outputs import init_anat_reports_wf, init_coreg_report_wf from nibabies.workflows.anatomical.preproc import init_anat_preproc_wf, init_csf_norm_wf from nibabies.workflows.anatomical.registration import ( init_concat_registrations_wf, @@ -768,6 +768,8 @@ def init_infant_anat_fit_wf( run_without_submitting=True, ) + coreg_report_wf = init_coreg_report_wf(output_dir=output_dir) + workflow.connect([ (t1w_validate, coregistration_wf, [ ('out_file', 'inputnode.in_t1w'), @@ -792,6 +794,12 @@ def init_infant_anat_fit_wf( ('outputnode.t1w2t2w_xfm', 't1w2t2w_xfm'), ('outputnode.t2w2t1w_xfm', 't2w2t1w_xfm'), ]), + (coregistration_wf, coreg_report_wf, [ + ('outputnode.t1w_preproc', 'inputnode.t1w_preproc'), + ('outputnode.t2w_preproc', 'inputnode.t2w_preproc'), + ('outputnode.t1w_mask', 'inputnode.in_mask'), + ]), + (sourcefile_buffer, coreg_report_wf, [('anat_source_files', 'inputnode.source_file')]), ]) # fmt:skip if probmap: From 61a0b3c914e86c8b351c7023e5cf577f03cb7908 Mon Sep 17 00:00:00 2001 From: Mathias Goncalves Date: Fri, 24 Jan 2025 12:11:30 -0500 Subject: [PATCH 6/7] FIX: Typo when ignoring entities --- nibabies/workflows/anatomical/fit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nibabies/workflows/anatomical/fit.py b/nibabies/workflows/anatomical/fit.py index eb6b3f3b..0f87a36e 100644 --- a/nibabies/workflows/anatomical/fit.py +++ b/nibabies/workflows/anatomical/fit.py @@ -748,7 +748,7 @@ def init_infant_anat_fit_wf( to='T2w', mode='image', suffix='xfm', - dismiss_entites=('desc', 'echo'), + dismiss_entities=('desc', 'echo'), **{'from': 'T1w'}, ), name='ds_t1w2t2w_xfm', @@ -761,7 +761,7 @@ def init_infant_anat_fit_wf( to='T1w', mode='image', suffix='xfm', - dismiss_entites=('desc', 'echo'), + dismiss_entities=('desc', 'echo'), **{'from': 'T2w'}, ), name='ds_t2w2t1w_xfm', From 1edb875e90086ea4bf3fc1a29607d0b0ae9dca99 Mon Sep 17 00:00:00 2001 From: Mathias Goncalves Date: Fri, 24 Jan 2025 12:14:15 -0500 Subject: [PATCH 7/7] TST: Update expected outputs --- .circleci/bcp_anat_outputs.txt | 2 ++ .circleci/bcp_full_outputs.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.circleci/bcp_anat_outputs.txt b/.circleci/bcp_anat_outputs.txt index 059ca258..93c97abd 100644 --- a/.circleci/bcp_anat_outputs.txt +++ b/.circleci/bcp_anat_outputs.txt @@ -16,7 +16,9 @@ sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_desc-preproc_T2w.json sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_desc-preproc_T2w.nii.gz sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-MNIInfant+1_to-T1w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-MNIInfant+1_mode-image_xfm.h5 +sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-T2w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-fsnative_mode-image_xfm.txt +sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T2w_to-T1w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-fsnative_to-T1w_mode-image_xfm.txt sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_hemi-L_curv.shape.gii sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_hemi-L_inflated.surf.gii diff --git a/.circleci/bcp_full_outputs.txt b/.circleci/bcp_full_outputs.txt index e68ca575..448a7492 100644 --- a/.circleci/bcp_full_outputs.txt +++ b/.circleci/bcp_full_outputs.txt @@ -16,7 +16,9 @@ sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_desc-preproc_T2w.json sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_desc-preproc_T2w.nii.gz sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-MNIInfant+1_to-T1w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-MNIInfant+1_mode-image_xfm.h5 +sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-T2w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T1w_to-fsnative_mode-image_xfm.txt +sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-T2w_to-T1w_mode-image_xfm.h5 sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_from-fsnative_to-T1w_mode-image_xfm.txt sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_hemi-L_curv.shape.gii sub-01/ses-1mo/anat/sub-01_ses-1mo_run-001_hemi-L_inflated.surf.gii