From 02a0737bbccb5732ec33fa0e5740a3c8e68bc041 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 17 Sep 2025 16:57:19 -0400 Subject: [PATCH 1/2] feat: Parameterize epi_reference_wf to better support rodents --- niworkflows/workflows/epi/refmap.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/niworkflows/workflows/epi/refmap.py b/niworkflows/workflows/epi/refmap.py index 1ee3b2297e0..b998d313630 100644 --- a/niworkflows/workflows/epi/refmap.py +++ b/niworkflows/workflows/epi/refmap.py @@ -34,6 +34,9 @@ def init_epi_reference_wf( omp_nthreads, auto_bold_nss=False, name='epi_reference_wf', + n4_iterations=(50,)*5, + n4_shrink_factor=4, + calculate_bspline_grid=False, ): """ Build a workflow that generates a reference map from a set of EPI images. @@ -121,7 +124,7 @@ def init_epi_reference_wf( from ...interfaces.header import ValidateImage from ...interfaces.images import RobustAverage from ...interfaces.nibabel import IntensityClip - from ...utils.connections import listify + from ...utils.connections import listify, pop_file wf = Workflow(name=name) @@ -153,9 +156,9 @@ def init_epi_reference_wf( N4BiasFieldCorrection( dimension=3, copy_header=True, - n_iterations=[50] * 5, + n_iterations=list(n4_iterations), convergence_threshold=1e-7, - shrink_factor=4, + shrink_factor=n4_shrink_factor, ), n_procs=omp_nthreads, name='n4_avgs', @@ -220,6 +223,13 @@ def _set_threads(in_list, maximum): else: wf.connect(inputnode, 't_masks', per_run_avgs, 't_mask') + if calculate_bspline_grid: + bspline_grid = pe.Node(niu.Function(function=_bspline_grid), name='bspline_grid') + wf.connect([ + (inputnode, bspline_grid, [(('in_files', pop_file), 'in_file')]), + (bspline_grid, n4_avgs, [('out', 'args')]), + ]) # fmt:skip + return wf @@ -256,3 +266,16 @@ def _post_merge(in_file, in_xfms): img = nb.load(in_file) nb.Nifti1Image(img.dataobj, img.affine, None).to_filename(out_file) return _advanced_clip(out_file, p_min=0.0, p_max=100.0) + + +def _bspline_grid(in_file): + import nibabel as nb + import numpy as np + import math + + img = nb.load(in_file) + zooms = img.header.get_zooms()[:3] + extent = (np.array(img.shape[:3]) - 1) * zooms + # get mesh resolution ratio + retval = [f'{math.ceil(i / extent[np.argmin(extent)])}' for i in extent] + return f"-b [{'x'.join(retval)}]" From 7e8483d5aee1c0ebcc298ad191cdedd63cf5ce8d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 21:00:54 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- niworkflows/workflows/epi/refmap.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/niworkflows/workflows/epi/refmap.py b/niworkflows/workflows/epi/refmap.py index b998d313630..f902fbb4159 100644 --- a/niworkflows/workflows/epi/refmap.py +++ b/niworkflows/workflows/epi/refmap.py @@ -34,7 +34,7 @@ def init_epi_reference_wf( omp_nthreads, auto_bold_nss=False, name='epi_reference_wf', - n4_iterations=(50,)*5, + n4_iterations=(50,) * 5, n4_shrink_factor=4, calculate_bspline_grid=False, ): @@ -269,13 +269,14 @@ def _post_merge(in_file, in_xfms): def _bspline_grid(in_file): + import math + import nibabel as nb import numpy as np - import math img = nb.load(in_file) zooms = img.header.get_zooms()[:3] extent = (np.array(img.shape[:3]) - 1) * zooms # get mesh resolution ratio retval = [f'{math.ceil(i / extent[np.argmin(extent)])}' for i in extent] - return f"-b [{'x'.join(retval)}]" + return f'-b [{"x".join(retval)}]'