From 01708dea9d31a3b062830d7c47fb6e8663c1d2db Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Fri, 4 Aug 2023 15:13:49 -0400 Subject: [PATCH 1/5] ENH: Allow unwarp to apply only to references --- sdcflows/workflows/apply/correction.py | 48 +++++++++++++++----------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/sdcflows/workflows/apply/correction.py b/sdcflows/workflows/apply/correction.py index 7891cac5fa..3561e586b3 100644 --- a/sdcflows/workflows/apply/correction.py +++ b/sdcflows/workflows/apply/correction.py @@ -26,7 +26,7 @@ from niworkflows.engine.workflows import LiterateWorkflow as Workflow -def init_unwarp_wf(*, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_wf"): +def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_wf"): r""" Set up a workflow that unwarps the input :abbr:`EPI (echo-planar imaging)` dataset. @@ -129,38 +129,19 @@ def init_unwarp_wf(*, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_w else: num_threads = omp_nthreads - resample = pe.Node( - ApplyCoeffsField(num_threads=num_threads), - mem_gb=mem_per_thread * num_threads, - name="resample", - ) - resample_ref = pe.Node(ApplyCoeffsField(), mem_gb=mem_per_thread, name="resample_ref") - merge = pe.Node(MergeSeries(), name="merge") - average = pe.Node(RobustAverage(mc_method=None), name="average") - brainextraction_wf = init_brainextraction_wf() # fmt:off workflow.connect([ (inputnode, rotime, [(("distorted", _pop), "in_file"), ("metadata", "metadata")]), - (inputnode, resample, [("distorted", "in_data"), - ("fmap_coeff", "in_coeff"), - ("hmc_xforms", "in_xfms")]), - (rotime, resample, [("readout_time", "ro_time"), - ("pe_direction", "pe_dir")]), (inputnode, resample_ref, [("distorted_ref", "in_data"), ("fmap_coeff", "in_coeff")]), (rotime, resample_ref, [("readout_time", "ro_time"), ("pe_direction", "pe_dir")]), - (resample, merge, [("out_corrected", "in_files")]), - (merge, average, [("out_file", "in_file")]), - (average, brainextraction_wf, [("out_file", "inputnode.in_file")]), - (merge, outputnode, [("out_file", "corrected")]), - (resample, outputnode, [("out_field", "fieldmap"), - ("out_warp", "fieldwarp")]), + (resample_ref, brainextraction_wf, [("out_corrected", "inputnode.in_file")]), (resample_ref, outputnode, [("out_field", "fieldmap_ref"), ("out_warp", "fieldwarp_ref")]), (brainextraction_wf, outputnode, [ @@ -169,4 +150,29 @@ def init_unwarp_wf(*, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_w ]), ]) # fmt:on + + if not ref_only: + resample = pe.Node( + ApplyCoeffsField(num_threads=num_threads), + mem_gb=mem_per_thread * num_threads, + name="resample", + ) + + merge = pe.Node(MergeSeries(), name="merge") + average = pe.Node(RobustAverage(mc_method=None), name="average") + + # fmt:off + workflow.connect([ + (inputnode, resample, [("distorted", "in_data"), + ("fmap_coeff", "in_coeff"), + ("hmc_xforms", "in_xfms")]), + (rotime, resample, [("readout_time", "ro_time"), + ("pe_direction", "pe_dir")]), + (resample, merge, [("out_corrected", "in_files")]), + (merge, average, [("out_file", "in_file")]), + (merge, outputnode, [("out_file", "corrected")]), + (resample, outputnode, [("out_field", "fieldmap"), + ("out_warp", "fieldwarp")]), + ]) + # fmt:on return workflow From 3b6f8d5af69af6f2a33108d256b20d091f2d9f26 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Fri, 4 Aug 2023 15:16:36 -0400 Subject: [PATCH 2/5] RF: Drop unnecessary average node --- sdcflows/workflows/apply/correction.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdcflows/workflows/apply/correction.py b/sdcflows/workflows/apply/correction.py index 3561e586b3..477c191f67 100644 --- a/sdcflows/workflows/apply/correction.py +++ b/sdcflows/workflows/apply/correction.py @@ -159,7 +159,6 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False ) merge = pe.Node(MergeSeries(), name="merge") - average = pe.Node(RobustAverage(mc_method=None), name="average") # fmt:off workflow.connect([ @@ -169,7 +168,6 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False (rotime, resample, [("readout_time", "ro_time"), ("pe_direction", "pe_dir")]), (resample, merge, [("out_corrected", "in_files")]), - (merge, average, [("out_file", "in_file")]), (merge, outputnode, [("out_file", "corrected")]), (resample, outputnode, [("out_field", "fieldmap"), ("out_warp", "fieldwarp")]), From f394b976bb72a8e46cac2ea6d96c8c6fd046567d Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Fri, 4 Aug 2023 15:27:03 -0400 Subject: [PATCH 3/5] STY: Cleanup flake8 complaints, uniformize connections --- sdcflows/workflows/apply/correction.py | 45 +++++++++++++++++--------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/sdcflows/workflows/apply/correction.py b/sdcflows/workflows/apply/correction.py index 477c191f67..08b339c2ef 100644 --- a/sdcflows/workflows/apply/correction.py +++ b/sdcflows/workflows/apply/correction.py @@ -86,7 +86,6 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False No motion is taken into account. """ - from niworkflows.interfaces.images import RobustAverage from niworkflows.interfaces.nibabel import MergeSeries from sdcflows.interfaces.epi import GetReadoutTime from sdcflows.interfaces.bspline import ApplyCoeffsField @@ -135,15 +134,23 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False # fmt:off workflow.connect([ - (inputnode, rotime, [(("distorted", _pop), "in_file"), - ("metadata", "metadata")]), - (inputnode, resample_ref, [("distorted_ref", "in_data"), - ("fmap_coeff", "in_coeff")]), - (rotime, resample_ref, [("readout_time", "ro_time"), - ("pe_direction", "pe_dir")]), + (inputnode, rotime, [ + (("distorted", _pop), "in_file"), + ("metadata", "metadata"), + ]), + (inputnode, resample_ref, [ + ("distorted_ref", "in_data"), + ("fmap_coeff", "in_coeff"), + ]), + (rotime, resample_ref, [ + ("readout_time", "ro_time"), + ("pe_direction", "pe_dir"), + ]), (resample_ref, brainextraction_wf, [("out_corrected", "inputnode.in_file")]), - (resample_ref, outputnode, [("out_field", "fieldmap_ref"), - ("out_warp", "fieldwarp_ref")]), + (resample_ref, outputnode, [ + ("out_field", "fieldmap_ref"), + ("out_warp", "fieldwarp_ref"), + ]), (brainextraction_wf, outputnode, [ ("outputnode.out_file", "corrected_ref"), ("outputnode.out_mask", "corrected_mask"), @@ -162,15 +169,21 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False # fmt:off workflow.connect([ - (inputnode, resample, [("distorted", "in_data"), - ("fmap_coeff", "in_coeff"), - ("hmc_xforms", "in_xfms")]), - (rotime, resample, [("readout_time", "ro_time"), - ("pe_direction", "pe_dir")]), + (inputnode, resample, [ + ("distorted", "in_data"), + ("fmap_coeff", "in_coeff"), + ("hmc_xforms", "in_xfms"), + ]), + (rotime, resample, [ + ("readout_time", "ro_time"), + ("pe_direction", "pe_dir"), + ]), (resample, merge, [("out_corrected", "in_files")]), (merge, outputnode, [("out_file", "corrected")]), - (resample, outputnode, [("out_field", "fieldmap"), - ("out_warp", "fieldwarp")]), + (resample, outputnode, [ + ("out_field", "fieldmap"), + ("out_warp", "fieldwarp"), + ]), ]) # fmt:on return workflow From 082b640eaf9d19cd1cf5e9d7c2785d8565a38226 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Fri, 4 Aug 2023 15:29:40 -0400 Subject: [PATCH 4/5] STY: Black --- sdcflows/workflows/apply/correction.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sdcflows/workflows/apply/correction.py b/sdcflows/workflows/apply/correction.py index 08b339c2ef..db5e7e5206 100644 --- a/sdcflows/workflows/apply/correction.py +++ b/sdcflows/workflows/apply/correction.py @@ -26,7 +26,9 @@ from niworkflows.engine.workflows import LiterateWorkflow as Workflow -def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_wf"): +def init_unwarp_wf( + *, ref_only=False, free_mem=None, omp_nthreads=1, debug=False, name="unwarp_wf", +): r""" Set up a workflow that unwarps the input :abbr:`EPI (echo-planar imaging)` dataset. @@ -95,7 +97,13 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False workflow = Workflow(name=name) inputnode = pe.Node( niu.IdentityInterface( - fields=["distorted", "distorted_ref", "metadata", "fmap_coeff", "hmc_xforms"] + fields=[ + "distorted", + "distorted_ref", + "metadata", + "fmap_coeff", + "hmc_xforms", + ] ), name="inputnode", ) @@ -128,7 +136,9 @@ def init_unwarp_wf(*, ref_only=False, free_mem=None, omp_nthreads=1, debug=False else: num_threads = omp_nthreads - resample_ref = pe.Node(ApplyCoeffsField(), mem_gb=mem_per_thread, name="resample_ref") + resample_ref = pe.Node( + ApplyCoeffsField(), mem_gb=mem_per_thread, name="resample_ref" + ) brainextraction_wf = init_brainextraction_wf() From 661ca8f6c4a2d7d81dc4a710d42380d0e2c8c924 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Wed, 9 Aug 2023 16:00:04 -0400 Subject: [PATCH 5/5] RF: Merge corrected references, if multiple --- sdcflows/workflows/apply/correction.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sdcflows/workflows/apply/correction.py b/sdcflows/workflows/apply/correction.py index db5e7e5206..f16ce88798 100644 --- a/sdcflows/workflows/apply/correction.py +++ b/sdcflows/workflows/apply/correction.py @@ -88,6 +88,7 @@ def init_unwarp_wf( No motion is taken into account. """ + from niworkflows.interfaces.images import RobustAverage from niworkflows.interfaces.nibabel import MergeSeries from sdcflows.interfaces.epi import GetReadoutTime from sdcflows.interfaces.bspline import ApplyCoeffsField @@ -140,6 +141,9 @@ def init_unwarp_wf( ApplyCoeffsField(), mem_gb=mem_per_thread, name="resample_ref" ) + merge_ref = pe.Node(MergeSeries(), name="merge_ref") + average = pe.Node(RobustAverage(mc_method=None), name="average") + brainextraction_wf = init_brainextraction_wf() # fmt:off @@ -156,7 +160,9 @@ def init_unwarp_wf( ("readout_time", "ro_time"), ("pe_direction", "pe_dir"), ]), - (resample_ref, brainextraction_wf, [("out_corrected", "inputnode.in_file")]), + (resample_ref, merge_ref, [("out_corrected", "in_files")]), + (merge_ref, average, [("out_file", "in_file")]), + (average, brainextraction_wf, [("out_file", "inputnode.in_file")]), (resample_ref, outputnode, [ ("out_field", "fieldmap_ref"), ("out_warp", "fieldwarp_ref"),