From 5d3f6ee3e35d8c0d63d5710d2519cfec85b93b13 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauldmccarthy@gmail.com> Date: Fri, 31 Jan 2025 13:11:03 +0000 Subject: [PATCH] New extrapolation test for applywarp --- unit_tests/fugue/applywarp/feedsRun | 73 +++++++++++++--------- unit_tests/fugue/applywarp/roi_out.nii.gz | 3 + unit_tests/fugue/applywarp/roi_ref.nii.gz | 3 + unit_tests/fugue/applywarp/roi_warp.nii.gz | 3 + 4 files changed, 53 insertions(+), 29 deletions(-) create mode 100644 unit_tests/fugue/applywarp/roi_out.nii.gz create mode 100644 unit_tests/fugue/applywarp/roi_ref.nii.gz create mode 100644 unit_tests/fugue/applywarp/roi_warp.nii.gz diff --git a/unit_tests/fugue/applywarp/feedsRun b/unit_tests/fugue/applywarp/feedsRun index f990735..ce3e00b 100755 --- a/unit_tests/fugue/applywarp/feedsRun +++ b/unit_tests/fugue/applywarp/feedsRun @@ -3,26 +3,32 @@ import os import shlex import sys +import os.path as op import subprocess as sp import numpy as np import nibabel as nib -from fsl.data.image import Image +from pathlib import Path +from fsl.data.image import Image, addExt import fsl.transform.affine as affine +from fsl.wrappers import applywarp, LOAD +from pyfeeds import evalImage -def applywarp(src, ref): - cmd = f'applywarp --in={src} --ref={ref} --usesqform --out=out' - sp.run(shlex.split(cmd), check=True) - return Image('out') +SCRIPT_DIR = Path(op.abspath(op.dirname(__file__))) -def make_image(fname, data, sform, sform_code, qform, qform_code): - hdr = nib.Nifti1Header() - hdr.set_sform(sform, sform_code) - hdr.set_qform(qform, qform_code) - img = Image(data, header=hdr) - img.save(fname) - return img +#! fsl/warpfns!8 (commit 65329a37d0830d4453381579408c3bbfa5a3bed6) +# +# Make sure that regions outside of the FOV +# in the input image are extrapolated correctly +def test_applywarp_normal_usage(): + src = Path(os.environ['FSLDIR']) / 'data' / 'standard' / 'MNI152_T1_2mm' + ref = SCRIPT_DIR / 'roi_ref' + warp = SCRIPT_DIR / 'roi_warp' + expect = addExt(SCRIPT_DIR / 'roi_out') + applywarp(src, ref, 'roi_got', warp=warp) + assert np.isclose(evalImage(expect, addExt('roi_got')), 0) + # fsl/fugue!6 # @@ -37,6 +43,14 @@ def make_image(fname, data, sform, sform_code, qform, qform_code): # diagonal def test_applywarp_uses_sqform_correctly(): + def make_image(fname, data, sform, sform_code, qform, qform_code): + hdr = nib.Nifti1Header() + hdr.set_sform(sform, sform_code) + hdr.set_qform(qform, qform_code) + img = Image(data, header=hdr) + img.save(fname) + return img + srcdata = np.zeros((20, 20, 20)) refdata = np.zeros((20, 20, 20)) @@ -52,32 +66,33 @@ def test_applywarp_uses_sqform_correctly(): refaff = affine.scaleOffsetXform(1, [-5, -5, -5]) # aligned via sform - src = make_image('src', srcdata, srcaff, 2, eye, 1) - ref = make_image('ref', refdata, refaff, 2, eye, 1) - result = applywarp('src', 'ref') - assert np.all(np.isclose(result.data, ref.data)) + src = make_image('src', srcdata, srcaff, 2, eye, 1) + ref = make_image('ref', refdata, refaff, 2, eye, 1) + applywarp('src', 'ref', 'out', usesqform=True) + assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0) # aligned via sform again - src = make_image('src', srcdata, srcaff, 2, eye, 0) - ref = make_image('ref', refdata, refaff, 2, eye, 0) - result = applywarp('src', 'ref') - assert np.all(np.isclose(result.data, ref.data)) + src = make_image('src', srcdata, srcaff, 2, eye, 0) + ref = make_image('ref', refdata, refaff, 2, eye, 0) + applywarp('src', 'ref', 'out', usesqform=True) + assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0) # aligned via qform - src = make_image('src', srcdata, eye, 0, srcaff, 2) - ref = make_image('ref', refdata, eye, 0, refaff, 2) - result = applywarp('src', 'ref') - assert np.all(np.isclose(result.data, ref.data)) + src = make_image('src', srcdata, eye, 0, srcaff, 2) + ref = make_image('ref', refdata, eye, 0, refaff, 2) + applywarp('src', 'ref', 'out', usesqform=True) + assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0) # not aligned - should result in a scaling # matrix being used (an identify matrix here) - src = make_image('src', srcdata, eye, 0, srcaff, 0) - ref = make_image('ref', refdata, eye, 0, refaff, 0) - result = applywarp('src', 'ref') - assert not np.all(np.isclose(result.data, ref.data)) - assert np.all(np.isclose(result.data, src.data)) + src = make_image('src', srcdata, eye, 0, srcaff, 0) + ref = make_image('ref', refdata, eye, 0, refaff, 0) + applywarp('src', 'ref', 'out', usesqform=True) + assert not np.isclose(evalImage(addExt('out'), addExt('ref')), 0) + assert np.isclose(evalImage(addExt('out'), addExt('src')), 0) if __name__ == '__main__': os.chdir(sys.argv[1]) + test_applywarp_normal_usage() test_applywarp_uses_sqform_correctly() diff --git a/unit_tests/fugue/applywarp/roi_out.nii.gz b/unit_tests/fugue/applywarp/roi_out.nii.gz new file mode 100644 index 0000000..8b3e8e9 --- /dev/null +++ b/unit_tests/fugue/applywarp/roi_out.nii.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74535c5db3c9fb980b32a58770c49d8d05e8a48b410fdde761bb3b6209c074eb +size 4280 diff --git a/unit_tests/fugue/applywarp/roi_ref.nii.gz b/unit_tests/fugue/applywarp/roi_ref.nii.gz new file mode 100644 index 0000000..432a2a1 --- /dev/null +++ b/unit_tests/fugue/applywarp/roi_ref.nii.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:995186689c7be8b19629f0cfb4e1e8cb9dcfb4d516f37027c9b0b436d4217ed4 +size 11625 diff --git a/unit_tests/fugue/applywarp/roi_warp.nii.gz b/unit_tests/fugue/applywarp/roi_warp.nii.gz new file mode 100644 index 0000000..3e0275c --- /dev/null +++ b/unit_tests/fugue/applywarp/roi_warp.nii.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b293f7b02753de9bb6ce0404cb1c8b00d628952b2306e81153ec714e48b0306 +size 33852 -- GitLab