def test_metadata(self): field, field_val = "EchoTime", 4.0 volume = np.random.rand(10, 20, 30, 40) headers = ututils.build_dummy_headers(volume.shape[2:], {field: field_val}) mv_no_headers = MedicalVolume(volume, self._AFFINE) mv = MedicalVolume(volume, self._AFFINE, headers=headers) assert mv_no_headers.headers() is None assert mv_no_headers.headers(flatten=True) is None with self.assertRaises(ValueError): mv.get_metadata("foobar") assert mv.get_metadata("foobar", default=0) == 0 echo_time = mv.get_metadata(field) assert echo_time == field_val new_val = 5.0 mv2 = mv.clone(headers=True) mv2.set_metadata(field, new_val) assert mv.get_metadata(field, type(field_val)) == field_val assert mv2.get_metadata(field, type(new_val)) == new_val for h in mv2.headers(flatten=True): assert h[field].value == new_val new_val = 6.0 mv2 = mv.clone(headers=True) mv2[..., 1].set_metadata(field, new_val) assert mv2[..., 0].get_metadata(field) == field_val assert mv2[..., 1].get_metadata(field) == new_val headers = mv2.headers() for h in headers[..., 0].flatten(): assert h[field].value == field_val for h in headers[..., 1].flatten(): assert h[field].value == new_val # Set metadata when volume has no headers. mv_nh = MedicalVolume(volume, self._AFFINE, headers=None) with self.assertRaises(ValueError): mv_nh.set_metadata("EchoTime", 40.0) with self.assertWarns(UserWarning): mv_nh.set_metadata("EchoTime", 40.0, force=True) assert mv_nh._headers.shape == (1, ) * len(mv_nh.shape) assert mv_nh.get_metadata("EchoTime") == 40.0 assert mv_nh[:1, :2, :3]._headers.shape == (1, ) * len(mv_nh.shape)
def test_comparison(self): mv1 = MedicalVolume(np.ones((10, 20, 30)), self._AFFINE) mv2 = MedicalVolume(2 * np.ones((10, 20, 30)), self._AFFINE) assert np.all((mv1 == mv1.clone()).volume) assert np.all((mv1 != mv2).volume) assert np.all((mv1 < mv2).volume) assert np.all((mv1 <= mv2).volume) assert np.all((mv2 > mv1).volume) assert np.all((mv2 >= mv1).volume)
def test_clone(self): mv = MedicalVolume(np.random.rand(10, 20, 30), self._AFFINE) mv2 = mv.clone() assert mv.is_identical(mv2) # expected identical volumes mv = MedicalVolume( np.random.rand(10, 20, 30), self._AFFINE, headers=ututils.build_dummy_headers((1, 1, 30)), ) mv2 = mv.clone(headers=False) assert mv.is_identical(mv2) # expected identical volumes assert id(mv.headers(flatten=True)[0]) == id( mv2.headers(flatten=True) [0]), "headers not cloned, expected same memory address" mv3 = mv.clone(headers=True) assert mv.is_identical(mv3) # expected identical volumes assert id(mv.headers(flatten=True)[0]) != id( mv3.headers(flatten=True) [0]), "headers cloned, expected different memory address"
def test_reformat_header(self): volume = np.random.rand(10, 20, 30, 40) headers = ututils.build_dummy_headers(volume.shape[2:]) mv = MedicalVolume(volume, self._AFFINE, headers=headers) new_orientation = tuple(x[::-1] for x in mv.orientation[::-1]) mv2 = mv.reformat(new_orientation) assert mv2._headers.shape == (30, 1, 1, 40) mv2 = mv.clone() mv2.reformat(new_orientation, inplace=True) assert mv2._headers.shape == (30, 1, 1, 40) volume = np.random.rand(10, 20, 30, 40) headers = ututils.build_dummy_headers((volume.shape[2], 1)) mv = MedicalVolume(volume, self._AFFINE, headers=headers) new_orientation = tuple(x[::-1] for x in mv.orientation[::-1]) mv2 = mv.reformat(new_orientation) assert mv2._headers.shape == (30, 1, 1, 1)
def test_math(self): mv1 = MedicalVolume(np.ones((10, 20, 30)), self._AFFINE) mv2 = MedicalVolume(2 * np.ones((10, 20, 30)), self._AFFINE) out = mv1 + mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == 3) out = mv1 - mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == -1) out = mv1 * mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == 2) out = mv1 / mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == 0.5) out = mv1 // mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == 0) out = mv1**mv2 assert np.all(mv1._volume == 1) assert np.all(mv2._volume == 2) assert np.all(out._volume == 1) out = mv1.clone() out += mv2 assert np.all(out._volume == 3) out = mv1.clone() out -= mv2 assert np.all(out._volume == -1) out = mv1.clone() out *= mv2 assert np.all(out._volume == 2) out = mv1.clone() out /= mv2 assert np.all(out._volume == 0.5) out = mv1.clone() out //= mv2 assert np.all(out._volume == 0) out = mv1.clone() out **= mv2 assert np.all(out._volume == 1) mv3 = mv1.clone().reformat(mv1.orientation[::-1]) with self.assertRaises(ValueError): mv3 + mv2