1616import numpy as np
1717
1818from monai .data import PydicomReader
19+ from monai .utils import MetaKeys
1920from tests .test_utils import SkipIfNoModule
2021
2122
@@ -39,6 +40,73 @@ def test_partial_orientation_tags_warns(self):
3940 affine = reader ._get_affine (metadata )
4041 np .testing .assert_array_equal (affine , np .eye (4 ))
4142
43+ def test_non_finite_pixel_spacing_raises (self ):
44+ reader = PydicomReader ()
45+ metadata = {
46+ "00200037" : {"Value" : [1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ]},
47+ "00200032" : {"Value" : [0.0 , 0.0 , 0.0 ]},
48+ "00280030" : {"Value" : [np .nan , 1.0 ]},
49+ }
50+ with self .assertRaisesRegex (ValueError , "PixelSpacing" ):
51+ reader ._get_affine (metadata , lps_to_ras = False )
52+
53+ def test_non_finite_image_position_raises (self ):
54+ reader = PydicomReader ()
55+ metadata = {
56+ "00200037" : {"Value" : [1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ]},
57+ "00200032" : {"Value" : [np .inf , 0.0 , 0.0 ]},
58+ "00280030" : {"Value" : [1.0 , 1.0 ]},
59+ }
60+ with self .assertRaisesRegex (ValueError , "ImagePositionPatient" ):
61+ reader ._get_affine (metadata , lps_to_ras = False )
62+
63+ def test_finite_values_return_affine (self ):
64+ reader = PydicomReader ()
65+ metadata = {
66+ "00200037" : {"Value" : [1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ]},
67+ "00200032" : {"Value" : [10.0 , 20.0 , 30.0 ]},
68+ "00280030" : {"Value" : [0.5 , 0.25 ]},
69+ }
70+ affine = reader ._get_affine (metadata , lps_to_ras = False )
71+ self .assertEqual (affine .shape , (4 , 4 ))
72+ self .assertTrue (np .all (np .isfinite (affine )))
73+ np .testing .assert_allclose (affine [0 , 3 ], 10.0 )
74+ np .testing .assert_allclose (affine [1 , 3 ], 20.0 )
75+ np .testing .assert_allclose (affine [2 , 3 ], 30.0 )
76+
77+ def test_non_finite_orientation_raises (self ):
78+ reader = PydicomReader ()
79+ metadata = {
80+ "00200037" : {"Value" : [np .nan , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ]},
81+ "00200032" : {"Value" : [0.0 , 0.0 , 0.0 ]},
82+ "00280030" : {"Value" : [1.0 , 1.0 ]},
83+ }
84+ with self .assertRaisesRegex (ValueError , "ImageOrientationPatient" ):
85+ reader ._get_affine (metadata , lps_to_ras = False )
86+
87+ def test_non_finite_last_image_position_raises (self ):
88+ reader = PydicomReader ()
89+ metadata = {
90+ "00200037" : {"Value" : [1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ]},
91+ "00200032" : {"Value" : [0.0 , 0.0 , 0.0 ]},
92+ "00280030" : {"Value" : [1.0 , 1.0 ]},
93+ "lastImagePositionPatient" : [0.0 , 0.0 , np .inf ],
94+ MetaKeys .SPATIAL_SHAPE : [1 , 1 , 2 ],
95+ }
96+ with self .assertRaisesRegex (ValueError , "lastImagePositionPatient" ):
97+ reader ._get_affine (metadata , lps_to_ras = False )
98+
99+ def test_overflow_from_finite_inputs_raises (self ):
100+ # Finite inputs whose product overflows produce a non-finite affine.
101+ reader = PydicomReader ()
102+ metadata = {
103+ "00200037" : {"Value" : [1e308 , 0.0 , 0.0 , 1e308 , 0.0 , 0.0 ]},
104+ "00200032" : {"Value" : [0.0 , 0.0 , 0.0 ]},
105+ "00280030" : {"Value" : [1e308 , 1e308 ]},
106+ }
107+ with self .assertRaisesRegex (ValueError , "not finite" ):
108+ reader ._get_affine (metadata , lps_to_ras = False )
109+
42110
43111if __name__ == "__main__" :
44112 unittest .main ()
0 commit comments