diff --git a/nitransforms/tests/data/regressions/from-fsnative_to-bold_mode-image.fsl b/nitransforms/tests/data/regressions/from-fsnative_to-bold_mode-image.fsl new file mode 100644 index 00000000..b4005f19 --- /dev/null +++ b/nitransforms/tests/data/regressions/from-fsnative_to-bold_mode-image.fsl @@ -0,0 +1,4 @@ + 0.99971074 -0.00958054 -0.02206109 33.80017471 + -0.02333562 -0.60849756 -0.79321212 240.58090210 + -0.00582473 0.79349738 -0.60854524 70.82102203 + 0.00000000 0.00000000 0.00000000 1.00000012 diff --git a/nitransforms/tests/data/regressions/from-fsnative_to-scanner_mode-image.fsl b/nitransforms/tests/data/regressions/from-fsnative_to-scanner_mode-image.fsl new file mode 100644 index 00000000..f6e6c615 --- /dev/null +++ b/nitransforms/tests/data/regressions/from-fsnative_to-scanner_mode-image.fsl @@ -0,0 +1,4 @@ + 1.00000024 -0.00016984 0.00015428 49.00255203 + 0.00015430 0.00009513 -1.00000024 255.96905518 + 0.00016983 1.00000024 0.00009516 -0.01236603 + 0.00000000 0.00000000 0.00000000 1.00000012 diff --git a/nitransforms/tests/data/regressions/from-scanner_to-fsnative_mode-image.fsl b/nitransforms/tests/data/regressions/from-scanner_to-fsnative_mode-image.fsl new file mode 100644 index 00000000..2842e12e --- /dev/null +++ b/nitransforms/tests/data/regressions/from-scanner_to-fsnative_mode-image.fsl @@ -0,0 +1,4 @@ + 1.00000012 0.00015430 0.00016983 -49.04202271 + -0.00016984 0.00009513 1.00000012 -0.00367374 + 0.00015428 -1.00000012 0.00009516 255.96148682 + 0.00000000 0.00000000 0.00000000 1.00000012 diff --git a/nitransforms/tests/test_conversions.py b/nitransforms/tests/test_conversions.py index ead7807d..1229d49a 100644 --- a/nitransforms/tests/test_conversions.py +++ b/nitransforms/tests/test_conversions.py @@ -7,6 +7,22 @@ from ..io.lta import FSLinearTransformArray as LTA +def test_concatenation(data_path): + """Check replacement to lta_concat.""" + lta0 = _l.load( + data_path / "regressions" / "from-scanner_to-fsnative_mode-image.lta", fmt="lta" + ) + lta1 = _l.load( + data_path / "regressions" / "from-fsnative_to-bold_mode-image.lta", fmt="lta" + ) + + lta_combined = _l.load( + data_path / "regressions" / "from-scanner_to-bold_mode-image.lta", fmt="lta" + ) + + assert np.allclose(lta1.matrix.dot(lta0.matrix), lta_combined.matrix) + + @pytest.mark.parametrize( "filename", [ @@ -18,8 +34,8 @@ ) def test_lta2itk_conversions(data_path, filename): """Check conversions between formats.""" - lta = _l.load(data_path / "regressions" / ".".join((filename, "lta")), fmt="lta") - itk = _l.load(data_path / "regressions" / ".".join((filename, "tfm")), fmt="itk") + lta = _l.load(data_path / "regressions" / f"{filename}.lta", fmt="lta") + itk = _l.load(data_path / "regressions" / f"{filename}.tfm", fmt="itk") assert np.allclose(lta.matrix, itk.matrix) @@ -59,17 +75,63 @@ def test_itk2lta_conversions( assert np.allclose(converted_lta["xforms"][0]["m_L"], exp_lta["xforms"][0]["m_L"]) -def test_concatenation(data_path): - """Check replacement to lta_concat.""" - lta0 = _l.load( - data_path / "regressions" / "from-scanner_to-fsnative_mode-image.lta", fmt="lta" +@pytest.mark.parametrize( + "fromto", + [ + ("fsnative", "bold"), + ("fsnative", "scanner"), + ("scanner", "bold"), + ("scanner", "fsnative"), + ], +) +def test_lta2fsl_conversions(data_path, fromto, testdata_path): + """Check conversions between formats.""" + filename = f"from-{fromto[0]}_to-{fromto[1]}_mode-image" + movname = "bold.nii.gz" if fromto[1] == "bold" else f"T1w_{fromto[1]}.nii.gz" + + lta = _l.load(data_path / "regressions" / f"{filename}.lta", fmt="lta") + fsl = _l.load( + data_path / "regressions" / f"{filename}.fsl", + moving=testdata_path / movname, + reference=testdata_path / f"T1w_{fromto[0]}.nii.gz", + fmt="fsl", ) - lta1 = _l.load( - data_path / "regressions" / "from-fsnative_to-bold_mode-image.lta", fmt="lta" + assert np.allclose(lta.matrix, fsl.matrix, atol=1e-4) + + +@pytest.mark.parametrize( + "fromto", + [ + ("fsnative", "bold"), + ("fsnative", "scanner"), + ("scanner", "bold"), + ("scanner", "fsnative"), + ], +) +def test_fsl2lta_conversions( + data_path, testdata_path, tmp_path, fromto, +): + """Check conversions between formats.""" + filename = f"from-{fromto[0]}_to-{fromto[1]}_mode-image" + refname = "bold.nii.gz" if fromto[1] == "bold" else f"T1w_{fromto[1]}.nii.gz" + + fsl = _l.load( + data_path / "regressions" / f"{filename}.fsl", + reference=testdata_path / f"T1w_{fromto[0]}.nii.gz", + moving=testdata_path / refname, + fmt="fsl" + ) + fsl.to_filename( + tmp_path / "test.lta", + fmt="fs", ) - lta_combined = _l.load( - data_path / "regressions" / "from-scanner_to-bold_mode-image.lta", fmt="lta" + converted_lta = LTA.from_filename(tmp_path / "test.lta") + expected_fname = ( + data_path / "regressions" / "".join((filename, "_type-ras2ras.lta")) ) + if not expected_fname.exists(): + expected_fname = data_path / "regressions" / "".join((filename, ".lta")) - assert np.allclose(lta1.matrix.dot(lta0.matrix), lta_combined.matrix) + exp_lta = LTA.from_filename(expected_fname) + assert np.allclose(converted_lta["xforms"][0]["m_L"], exp_lta["xforms"][0]["m_L"], atol=1e-4)