Skip to content

Commit 5bd0b9d

Browse files
committed
feat: Function to convert transform parameters from mm to vox
1 parent f7abb18 commit 5bd0b9d

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

sdcflows/workflows/fit/syn.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,21 @@ def _warp_dir(fixed_image, pe_dir, nlevels=3):
612612
return nlevels * [retval.tolist()]
613613

614614

615+
def _mm2vox(moving_image, pe_dir, registration_config):
616+
import nibabel as nb
617+
618+
params = registration_config['transform_parameters']
619+
620+
img = nb.load(moving_image)
621+
zooms = nb.affines.voxel_sizes(img.affine)
622+
pe_res = zooms["ijk".index(pe_dir[0])]
623+
624+
return [
625+
[*level_params[:2], level_params[2] / pe_res]
626+
for level_params in params
627+
]
628+
629+
615630
def _merge_meta(epi_ref, meta_list):
616631
"""Prepare a tuple of EPI reference and metadata."""
617632
return (epi_ref, meta_list[0])

sdcflows/workflows/fit/tests/test_syn.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@
2222
#
2323
"""Test fieldmap-less SDC-SyN."""
2424
import json
25+
26+
import numpy as np
27+
import nibabel as nb
2528
import pytest
2629
from nipype.pipeline import engine as pe
2730

28-
from ..syn import init_syn_sdc_wf, init_syn_preprocessing_wf, _adjust_zooms, _set_dtype
31+
from .... import data
32+
from ..syn import init_syn_sdc_wf, init_syn_preprocessing_wf, _adjust_zooms, _set_dtype, _mm2vox
2933

3034

3135
@pytest.mark.veryslow
@@ -211,3 +215,27 @@ def test_ensure_dtype(in_dtype, out_dtype, tmpdir):
211215
assert out_file == f"{in_dtype}.nii.gz"
212216
else:
213217
assert out_file == f"{in_dtype}_{out_dtype}.nii.gz"
218+
219+
220+
def test_mm2vox(tmp_path):
221+
img = nb.Nifti1Image(np.zeros((10, 10, 10)), np.diag((2, 3, 4, 1)))
222+
img_file = tmp_path / "test.nii.gz"
223+
img.to_filename(img_file)
224+
225+
config = json.loads(data.load.readable("sd_syn.json").read_text())
226+
227+
params = config['transform_parameters']
228+
mm_values = np.array([level[2] for level in params])
229+
230+
vox_params_i = _mm2vox(str(img_file), 'i', config)
231+
vox_values_i = [level[2] for level in vox_params_i]
232+
assert [mm_level[:2] == vox_level[:2] for mm_level, vox_level in zip(params, vox_params_i)]
233+
assert np.array_equal(vox_values_i, mm_values / 2)
234+
235+
vox_params_j = _mm2vox(str(img_file), 'j', config)
236+
vox_values_j = [level[2] for level in vox_params_j]
237+
assert np.array_equal(vox_values_j, mm_values / 3)
238+
239+
vox_params_k = _mm2vox(str(img_file), 'k', config)
240+
vox_values_k = [level[2] for level in vox_params_k]
241+
assert np.array_equal(vox_values_k, mm_values / 4)

0 commit comments

Comments
 (0)