1+ import nibabel as nb
12import numpy as np
23import pytest
34from h5py import File as H5File
45
5- from ..io .x5 import X5Transform , X5Domain , to_filename , from_filename
6+ from nitransforms .nonlinear import DenseFieldTransform , BSplineFieldTransform
7+ from nitransforms .io .x5 import X5Transform , X5Domain , to_filename , from_filename
68
79
810def test_x5_transform_defaults ():
@@ -75,3 +77,49 @@ def test_from_filename_invalid(tmp_path):
7577
7678 with pytest .raises (TypeError ):
7779 from_filename (fname )
80+
81+
82+ @pytest .mark .parametrize ("is_deltas" , [True , False ])
83+ def test_densefield_x5_roundtrip (tmp_path , is_deltas ):
84+ """Ensure dense field transforms roundtrip via X5."""
85+ ref = nb .Nifti1Image (np .zeros ((2 , 2 , 2 ), dtype = "uint8" ), np .eye (4 ))
86+ disp = nb .Nifti1Image (np .random .rand (2 , 2 , 2 , 3 ).astype ("float32" ), np .eye (4 ))
87+
88+ xfm = DenseFieldTransform (disp , is_deltas = is_deltas , reference = ref )
89+
90+ node = xfm .to_x5 (metadata = {"GeneratedBy" : "pytest" })
91+ assert node .type == "nonlinear"
92+ assert node .subtype == "densefield"
93+ assert node .representation == "displacements" if is_deltas else "deformations"
94+ assert node .domain .size == ref .shape
95+ assert node .metadata ["GeneratedBy" ] == "pytest"
96+
97+ fname = tmp_path / "test.x5"
98+ to_filename (fname , [node ])
99+
100+ xfm2 = DenseFieldTransform .from_filename (fname , fmt = "X5" )
101+
102+ assert xfm2 .reference .shape == ref .shape
103+ assert np .allclose (xfm2 .reference .affine , ref .affine )
104+ assert xfm == xfm2
105+
106+
107+ def test_bspline_to_x5 (tmp_path ):
108+ """Check BSpline transforms export to X5."""
109+ coeff = nb .Nifti1Image (np .zeros ((2 , 2 , 2 , 3 ), dtype = "float32" ), np .eye (4 ))
110+ ref = nb .Nifti1Image (np .zeros ((2 , 2 , 2 ), dtype = "uint8" ), np .eye (4 ))
111+
112+ xfm = BSplineFieldTransform (coeff , reference = ref )
113+ node = xfm .to_x5 (metadata = {"tool" : "pytest" })
114+ assert node .type == "nonlinear"
115+ assert node .subtype == "bspline"
116+ assert node .representation == "coefficients"
117+ assert node .metadata ["tool" ] == "pytest"
118+
119+ fname = tmp_path / "bspline.x5"
120+ to_filename (fname , [node ])
121+
122+ xfm2 = BSplineFieldTransform .from_filename (fname , fmt = "X5" )
123+ assert np .allclose (xfm ._coeffs , xfm2 ._coeffs )
124+ assert xfm2 .reference .shape == ref .shape
125+ assert np .allclose (xfm2 .reference .affine , ref .affine )
0 commit comments