1
+ import nibabel as nb
1
2
import numpy as np
2
3
import pytest
3
4
from h5py import File as H5File
4
5
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
6
8
7
9
8
10
def test_x5_transform_defaults ():
@@ -75,3 +77,49 @@ def test_from_filename_invalid(tmp_path):
75
77
76
78
with pytest .raises (TypeError ):
77
79
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