77from tempfile import TemporaryDirectory
88
99from common import run_tests
10+ from copy import deepcopy
1011
1112import math
1213import numpy .testing as nptest
@@ -1351,19 +1352,21 @@ def get_nifti_spatial_transform_from_metadata(self):
13511352 self .assertTrue (xform ['transform_source' ] == 'sform' )
13521353
13531354 # Flip sform just to be different
1354- mni_metadata_flip = self .mni_metadata . deepcopy ( )
1355+ mni_metadata_flip = deepcopy ( self .mni_metadata )
13551356 srow_x = self .mni_metadata ['srow_x' ].split ()
13561357 srow_x = [str (- float (v )) for v in srow_x ]
13571358 mni_metadata_flip ['srow_x' ] = ' ' .join (srow_x )
13581359
13591360 xform = ants .get_nifti_spatial_transform_from_metadata (mni_metadata_flip )
13601361 self .assertTrue (np .allclose (xform ['direction' ][0 ], - self .mni .direction [0 ], atol = 1e-5 ))
13611362 self .assertTrue (np .allclose (xform ['origin' ][0 ], - self .mni .origin [0 ], atol = 1e-5 ))
1363+
1364+ # Prefer qform should give original
13621365 xform_q = ants .get_nifti_spatial_transform_from_metadata (mni_metadata_flip , prefer_sform = False )
13631366 self .assertTrue (np .allclose (xform_q ['direction' ], self .mni .direction , atol = 1e-5 ))
13641367
13651368 # Check that shear gets removed
1366- mni_metadata_shear = self .mni_metadata . deepcopy ( )
1369+ mni_metadata_shear = deepcopy ( self .mni_metadata )
13671370 srow_x = self .mni_metadata ['srow_x' ].split ()
13681371 srow_x [1 ] = str ('-0.0001' )
13691372 mni_metadata_shear ['srow_x' ] = ' ' .join (srow_x )
@@ -1383,5 +1386,44 @@ def get_nifti_spatial_transform_from_metadata(self):
13831386 self .assertTrue (xform ['transform_source' ] == 'qform' )
13841387
13851388
1389+ def test_set_nifti_spatial_transform_from_metadata (self ):
1390+ # Flip sform
1391+ mni_metadata_flip = deepcopy (self .mni_metadata )
1392+ srow_x = self .mni_metadata ['srow_x' ].split ()
1393+ srow_x = [str (- float (v )) for v in srow_x ]
1394+ mni_metadata_flip ['srow_x' ] = ' ' .join (srow_x )
1395+
1396+ mni_copy = ants .image_clone (self .mni )
1397+ ants .set_nifti_spatial_transform_from_metadata (mni_copy , mni_metadata_flip )
1398+ self .assertTrue (np .allclose (mni_copy .direction [0 ], - self .mni .direction [0 ], atol = 1e-5 ))
1399+ self .assertTrue (np .allclose (mni_copy .direction [1 ], self .mni .direction [1 ], atol = 1e-5 ))
1400+ self .assertTrue (np .allclose (mni_copy .direction [2 ], self .mni .direction [2 ], atol = 1e-5 ))
1401+ self .assertTrue (np .allclose (mni_copy .origin [0 ], - self .mni .origin [0 ], atol = 1e-5 ))
1402+ self .assertTrue (np .allclose (mni_copy .origin [1 ], self .mni .origin [1 ], atol = 1e-5 ))
1403+ self .assertTrue (np .allclose (mni_copy .origin [2 ], self .mni .origin [2 ], atol = 1e-5 ))
1404+
1405+ # Make a time series image
1406+ mni_metadata_ts = deepcopy (mni_metadata_flip )
1407+ mni_metadata_ts ['dim[0]' ] = '4'
1408+ mni_metadata_ts ['dim[4]' ] = '3'
1409+ mni_metadata_ts ['pixdim[4]' ] = '2.0'
1410+ array_list = [img .numpy () for img in [self .mni , self .mni , self .mni ]]
1411+ stacked_array = np .stack (array_list , axis = - 1 )
1412+ mni_ts = ants .from_numpy (
1413+ stacked_array ,
1414+ has_components = False ,
1415+ spacing = self .mni .spacing + (2.0 ,),
1416+ origin = self .mni .origin + (0.0 ,),
1417+ direction = np .eye (4 )
1418+ )
1419+ ants .set_nifti_spatial_transform_from_metadata (mni_ts , mni_metadata_ts )
1420+
1421+ mni_ts_expected_direction = np .eye (4 )
1422+ mni_ts_expected_direction [:3 ,:3 ] = mni_copy .direction
1423+
1424+ self .assertTrue (np .allclose (mni_ts .direction , mni_ts_expected_direction , atol = 1e-5 ))
1425+ self .assertTrue (np .allclose (mni_ts .origin , mni_copy .origin + (0.0 ,), atol = 1e-5 ))
1426+ self .assertTrue (np .allclose (mni_ts .spacing , mni_copy .spacing + (2.0 ,), atol = 1e-5 ))
1427+
13861428if __name__ == "__main__" :
13871429 run_tests ()
0 commit comments