#!/usr/bin/env python3
# import nose.tools
import unittest
import numpy as np
import copy
# import logging
import pydicom.datadict
from .context import imagedata
from imagedata.series import Series
import imagedata.axis
[docs]class TestSeries(unittest.TestCase):
#@unittest.skip("skipping test_repr")
[docs] def test_repr(self):
si = Series(
'data/dicom/time/time00/Image_00000.dcm')
r = si.__repr__()
#@unittest.skip("skipping test_repr_vol")
[docs] def test_repr_vol(self):
si = Series(
'data/dicom/time/time00')
r = si.__repr__()
#@unittest.skip("skipping test_max")
[docs] def test_max(self):
si = Series(
'data/dicom/time/time00/Image_00000.dcm')
mi = si.max()
self.assertEqual(type(mi), np.uint16)
#@unittest.skip("skipping test_get_keyword")
[docs] def test_get_keyword(self):
si1 = Series(
'data/dicom/time/time00/Image_00000.dcm')
pname = si1.getDicomAttribute('PatientName')
self.assertEqual(
si1.getDicomAttribute('PatientName'),
'PHANTOM^T1')
self.assertEqual(
si1.getDicomAttribute(
pydicom.datadict.tag_for_keyword('PatientID')),
'19.02.07-14:04:17-STD-1.3.12.2.1107.5.2.43.66035')
#@unittest.skip("skipping test_create_series")
[docs] def test_create_series(self):
a = np.eye(128)
si = Series(a)
self.assertEqual(si.dtype, np.float64)
self.assertEqual(si.shape, (128, 128))
#@unittest.skip("skipping test_print_header")
#@unittest.skip("skipping test_copy_series")
[docs] def test_copy_series(self):
a = np.eye(128)
si1 = Series(a)
si1.spacing = (1, 1, 1)
si2 = si1
self.assertEqual(si2.slices, 1)
np.testing.assert_array_equal(si2.spacing, np.array((1, 1, 1)))
#@unittest.skip("skipping test_copy_series2")
[docs] def test_copy_series2(self):
a = np.eye(128)
si1 = Series(a)
si1.spacing = (1, 1, 1)
si2 = si1.copy()
self.assertEqual(si2.slices, 1)
np.testing.assert_array_equal(si2.spacing, np.array((1, 1, 1)))
#@unittest.skip("skipping test_subtract_series")
[docs] def test_subtract_series(self):
a = Series(np.eye(128))
b = Series(np.eye(128))
a.spacing = (1, 1, 1)
b.spacing = a.spacing
si = a - b
self.assertEqual(si.slices, 1)
np.testing.assert_array_equal(si.spacing, np.array((1, 1, 1)))
#@unittest.skip("skipping test_increase_ndim")
[docs] def test_increase_ndim(self):
a = np.eye(128)
s = Series(a)
with self.assertRaises(IndexError):
s.shape = (1,1,128,128)
#@unittest.skip("skipping test_slicing_dim")
[docs] def test_slicing_dim(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a = np.vstack([a1, a1, a1, a1, a1])
s = Series(a)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
s_slice = s[2]
self.assertEqual(s_slice.ndim, 2)
self.assertEqual(len(s_slice.axes), 2)
self.assertEqual(s_slice.axes[0].name, 'row')
self.assertEqual(s_slice.axes[1].name, 'column')
#@unittest.skip("skipping test_slicing_y")
[docs] def test_slicing_y(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a = np.vstack([a1, a1, a1])
s = Series(a)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
a_slice = a[:,:,3:5]
s_slice = s[:,:,3:5]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, 3)
#@unittest.skip("skipping test_slicing_y_neg")
[docs] def test_slicing_y_neg(self):
from numpy.random import default_rng
rng = default_rng()
s = Series(rng.standard_normal(64).reshape((4,4,4)))
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
np.testing.assert_array_equal(s[:,3,:], s[:,-1,:])
np.testing.assert_array_equal(s[:,2,:], s[:,-2,:])
np.testing.assert_array_equal(s[:,1,:], s[:,-3,:])
np.testing.assert_array_equal(s[:,0,:], s[:,-4,:])
np.testing.assert_array_equal(s[:,2:3,:], s[:,2:-1,:])
np.testing.assert_array_equal(s[:,1:2,:], s[:,1:-2,:])
np.testing.assert_array_equal(s[:,0:2,:], s[:,0:-2,:])
#@unittest.skip("skipping test_slicing_x")
[docs] def test_slicing_x(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a = np.vstack([a1, a1, a1])
s = Series(a)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
a_slice = a[:,3:5,...]
s_slice = s[:,3:5,...]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, 3)
#@unittest.skip("skipping test_slicing_x_neg")
[docs] def test_slicing_x_neg(self):
from numpy.random import default_rng
rng = default_rng()
s = Series(rng.standard_normal(64).reshape((4,4,4)))
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
np.testing.assert_array_equal(s[:,:,3], s[:,:,-1])
np.testing.assert_array_equal(s[:,:,2], s[:,:,-2])
np.testing.assert_array_equal(s[:,:,1], s[:,:,-3])
np.testing.assert_array_equal(s[:,:,0], s[:,:,-4])
np.testing.assert_array_equal(s[:,:,2:3], s[:,:,2:-1])
np.testing.assert_array_equal(s[:,:,1:2], s[:,:,1:-2])
np.testing.assert_array_equal(s[:,:,0:2], s[:,:,0:-2])
#@unittest.skip("skipping test_assign_slice_x")
[docs] def test_assign_slice_x(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a = np.vstack([a1, a1, a1])
s = Series(a)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
n = np.ones_like(a) * 4
p = Series(n)
p.spacing = (1,1,1)
p.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, p.shape[0])
a[:,3:5,...] = n[:,3:5,...]
s[:,3:5,...] = p[:,3:5,...]
np.testing.assert_array_equal(a, s)
np.testing.assert_array_equal(s[:,3:5,...], p[:,3:5,...])
self.assertEqual(s.slices, 3)
#@unittest.skip("skipping test_assign_slice")
[docs] def test_assign_slice(self):
a = np.array(range(4*5*6), dtype=np.uint16)
a.shape = (4,5,6)
s = Series(a)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
n = np.zeros((2,2,2), dtype=np.uint16)
p = Series(n)
p.spacing = (1,1,1)
p.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, p.shape[0])
a[1:3,2:4,2:4] = n[:]
s[1:3,2:4,2:4] = p[:]
np.testing.assert_array_equal(a, s)
self.assertEqual(s.slices, 4)
#@unittest.skip("skipping test_slicing_z")
[docs] def test_slicing_z(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a = np.vstack([a1, a1, a1])
s = Series(a)
s.spacing = (1, 1, 1)
s.sliceLocations = [3, 6, 9]
for slice in range(s.slices):
s.imagePositions = {
slice: np.array([slice, 0, 0])
}
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
a_slice = a[0:2,...]
s_slice = s[0:2,...]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, 2)
np.testing.assert_array_equal(s_slice.sliceLocations, np.array([3, 6]))
# Compare imagePositions
ipp2 = {}
for slice in range(2):
ipp2[slice] = np.array([slice, 0, 0])
self.assertEqual(len(s_slice.imagePositions), len(ipp2))
for slice in range(2):
np.testing.assert_array_equal(
s_slice.imagePositions[slice],
ipp2[slice])
#@unittest.skip("skipping test_slicing_z_neg")
[docs] def test_slicing_z_neg(self):
from numpy.random import default_rng
rng = default_rng()
s = Series(rng.standard_normal(64).reshape((4,4,4)))
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0])
np.testing.assert_array_equal(s[3,:,:], s[-1,:,:])
np.testing.assert_array_equal(s[2,:,:], s[-2,:,:])
np.testing.assert_array_equal(s[1,:,:], s[-3,:,:])
np.testing.assert_array_equal(s[0,:,:], s[-4,:,:])
np.testing.assert_array_equal(s[2:3], s[2:-1])
np.testing.assert_array_equal(s[2:3,:,:], s[2:-1,:,:])
np.testing.assert_array_equal(s[1:2,:,:], s[1:-2,:,:])
np.testing.assert_array_equal(s[0:2,:,:], s[0:-2,:,:])
#@unittest.skip("skipping test_slicing_t")
[docs] def test_slicing_t(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a2 = np.vstack([a1, a1, a1])
a2.shape = (1,3,128,128)
a = np.vstack([a2,a2,a2,a2])
s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0])
s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1])
tags = {}
k = 0
for i in range(s.slices):
tags[i] = np.arange(k, k+s.shape[0])
k += s.shape[0]
s.tags = tags
a_slice = a[1:3,...]
s_slice = s[1:3,...]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, 3)
self.assertEqual(len(s_slice.tags[0]), 2)
for s in range(s_slice.slices):
np.testing.assert_array_equal(s_slice.tags[s], tags[s][1:3])
#@unittest.skip("skipping test_slicing_t_neg")
[docs] def test_slicing_t_neg(self):
from numpy.random import default_rng
rng = default_rng()
s = Series(rng.standard_normal(192).reshape((3,4,4,4)))
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0])
s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1])
np.testing.assert_array_equal(s[2], s[-1])
np.testing.assert_array_equal(s[1], s[-2])
np.testing.assert_array_equal(s[0], s[-3])
np.testing.assert_array_equal(s[1:2], s[1:-1])
np.testing.assert_array_equal(s[1:2,:,:], s[1:-1,:,:])
np.testing.assert_array_equal(s[0:1,:,:], s[0:-2,:,:])
#@unittest.skip("skipping test_multiple_ellipses")
[docs] def test_multiple_ellipses(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a2 = np.vstack([a1, a1, a1])
a2.shape = (1,3,128,128)
a = np.vstack([a2,a2,a2,a2])
s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0])
s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1])
tags = {}
k = 0
for i in range(s.slices):
tags[i] = np.arange(k, k+s.shape[0])
k += s.shape[0]
s.tags = tags
with self.assertRaises(IndexError):
s_slice = s[...,1:3,...]
#@unittest.skip("skipping test_ellipsis_first")
[docs] def test_ellipsis_first(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a2 = np.vstack([a1, a1, a1])
a2.shape = (1,3,128,128)
a = np.empty([4, 3,128,128])
for i in range(4):
a[i] = a2
# a = np.vstack([a2,a2,a2,a2])
s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0])
s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1])
tags = {}
k = 0
for i in range(s.slices):
tags[i] = np.arange(k, k+s.shape[0])
k += s.shape[0]
s.tags = tags
a_slice = a[..., 3:5]
s_slice = s[..., 3:5]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, s.slices)
self.assertEqual(len(s_slice.tags[0]), len(s.tags[0]))
#@unittest.skip("skipping test_ellipsis_middle")
[docs] def test_ellipsis_middle(self):
a1 = np.eye(128)
a1.shape = (1,128,128)
a2 = np.vstack([a1, a1, a1])
a2.shape = (1,3,128,128)
a = np.vstack([a2,a2,a2,a2])
s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME)
s.spacing = (1, 1, 1)
s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0])
s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1])
tags = {}
k = 0
for i in range(s.slices):
tags[i] = np.arange(k, k+s.shape[0])
k += s.shape[0]
s.tags = tags
a_slice = a[1:3, ..., 3:5]
s_slice = s[1:3, ..., 3:5]
np.testing.assert_array_equal(a_slice, s_slice)
self.assertEqual(s_slice.slices, s.slices)
self.assertEqual(len(s_slice.tags[0]), 2)
#@unittest.skip("skipping test_cross_talk")
[docs] def test_cross_talk(self):
si = Series('data/dicom/time', 'time')
si1 = si[0]
si1.seriesNumber = si.seriesNumber + 10
self.assertNotEqual(si.seriesNumber, si1.seriesNumber)
si2 = Series('data/dicom/time', 'time')
si2.seriesNumber += 10
self.assertNotEqual(si.seriesNumber, si2.seriesNumber)
# @nose.tools.raises(AssertionError)
[docs] @unittest.expectedFailure
#@unittest.skip("skipping test_cross_talk_spacing")
def test_cross_talk_spacing(self):
si = Series('data/dicom/time', 'time')
si1 = si[0]
si1.spacing = (1,1,1)
np.testing.assert_array_equal(si.spacing, si1.spacing)
#@unittest.skip("skipping test_cross_talk_2")
[docs] def test_cross_talk_2(self):
si1 = Series('data/dicom/time/time00')
si2 = si1
si2.seriesNumber += 10
self.assertEqual(si1.seriesNumber, si2.seriesNumber)
#@unittest.skip("skipping test_cross_talk_3")
[docs] def test_cross_talk_3(self):
si1 = Series('data/dicom/time/time00')
si2 = copy.copy(si1)
si2.seriesNumber += 10
self.assertNotEqual(si1.seriesNumber, si2.seriesNumber)
#@unittest.skip("skipping test_set_axes")
[docs] def test_set_axes(self):
si1 = Series('data/dicom/time/time00')
shape = si1.shape + (3,)
img = np.zeros(shape, dtype=np.uint8)
img[...,0] = si1[:]
img[...,1] = si1[:]
img[...,2] = si1[:]
rgb = Series(img, geometry=si1,
axes=si1.axes + [imagedata.axis.VariableAxis('rgb',['r', 'g', 'b'])]
)
if __name__ == '__main__':
unittest.main()