#!/usr/bin/env python3
import unittest
import copy
import math
import os.path
import tempfile
import numpy as np
import logging
import argparse
import pydicom.filereader
from .context import imagedata
import imagedata.cmdline
import imagedata.readdata
import imagedata.formats
from imagedata.series import Series
from .compare_headers import compare_headers, compare_pydicom
[docs]class TestDicomPlugin(unittest.TestCase):
[docs] def setUp(self):
parser = argparse.ArgumentParser()
imagedata.cmdline.add_argparse_options(parser)
self.opts = parser.parse_args([])
if len(self.opts.output_format) < 1:
self.opts.output_format = ['dicom']
[docs] def test_dicom_plugin(self):
plugins = imagedata.formats.get_plugins_list()
self.dicom_plugin = None
for pname, ptype, pclass in plugins:
if ptype == 'dicom':
self.dicom_plugin = pclass
self.assertIsNotNone(self.dicom_plugin)
# @unittest.skip("skipping test_read_single_file")
[docs] def test_read_single_file(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm'),
'none',
self.opts)
self.assertEqual(si1.input_format, 'dicom')
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_two_files")
[docs] def test_read_two_files(self):
si1 = Series(
[
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm'),
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00021.dcm')
],
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (2, 192, 152))
# @unittest.skip("skipping test_read_single_directory")
[docs] def test_read_single_directory(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 192, 152))
[docs] def test_read_auto_volume(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00'),
'auto',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(imagedata.formats.INPUT_ORDER_NONE, si1.input_order)
self.assertEqual((3, 192, 152), si1.shape)
self.assertEqual(3, len(si1.axes))
self.assertEqual(14, si1.seriesNumber)
[docs] def test_read_auto_time(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
'auto',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(imagedata.formats.INPUT_ORDER_TIME, si1.input_order)
self.assertEqual((3, 3, 192, 152), si1.shape)
self.assertEqual(4, len(si1.axes))
self.assertEqual(14, si1.seriesNumber)
# @unittest.skip("skipping test_read_dicom_3D_no_opt")
[docs] def test_read_dicom_3D_no_opt(self):
d = Series(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm'))
self.assertEqual('dicom', d.input_format)
self.assertEqual(d.dtype, np.uint16)
self.assertEqual(d.shape, (192, 152))
# @unittest.skip("skipping test_read_dicom_4D")
[docs] def test_read_dicom_4D(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
t = np.array([0., 2.99, 5.97])
np.testing.assert_array_almost_equal(t, si1.timeline, decimal=2)
# for axis in si1.axes:
# logging.debug('test_read_dicom_4D: axis {}'.format(axis))
# @unittest.skip("skipping test_read_dicom_4D_wrong_order")
[docs] def test_read_dicom_4D_wrong_order(self):
with self.assertRaises(imagedata.formats.CannotSort) as context:
si1 = Series(
os.path.join('data', 'dicom', 'time'),
'b',
self.opts)
# @unittest.skip("skipping test_read_dicom_user_defined_TI")
[docs] def test_read_dicom_user_defined_TI(self):
si1 = Series(
os.path.join('data', 'dicom', 'TI'),
input_order='ti',
opts={'ti': 'InversionTime'})
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (5, 1, 384, 384))
with tempfile.TemporaryDirectory() as d:
si1.write(d,
formats=['dicom'],
opts={'ti': 'InversionTime'})
si2 = Series(d,
input_order='ti',
opts={'ti': 'InversionTime'})
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
self.assertEqual(si1.shape, si2.shape)
np.testing.assert_array_equal(si1, si2)
[docs] def test_verify_correct_slice(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write(d, formats=['dicom'], opts={'keep_uid': True})
# Use pydicom as truth to verify that written copy is identical to original
orig = pydicom.filereader.dcmread(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm')
)
temp = pydicom.filereader.dcmread(
os.path.join(d, 'Image_00000.dcm')
)
compare_pydicom(self, orig, temp)
[docs] def test_verify_correct_volume(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write(d, formats=['dicom'], opts={'keep_uid': True})
# Use pydicom as truth to verify that written copy is identical to original
for i, f in enumerate(['Image_00019.dcm', 'Image_00020.dcm', 'Image_00021.dcm']):
orig = pydicom.filereader.dcmread(
os.path.join('data', 'dicom', 'time', 'time00', f)
)
temp = pydicom.filereader.dcmread(
os.path.join(d, 'Image_{:05d}.dcm'.format(i))
)
compare_pydicom(self, orig, temp)
[docs] def test_verify_correct_volume_no_slicelocation(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
for _slice in range(si1.slices):
for _tag in si1.tags[_slice]:
tag, f, ds = si1.DicomHeaderDict[_slice][_tag]
del ds.SliceLocation
si1.axes[0].values = None
with tempfile.TemporaryDirectory() as d:
si1.write(d, formats=['dicom'], opts={'keep_uid': True})
# Use pydicom as truth to verify that written copy is identical to original
for i, f in enumerate(['Image_00019.dcm', 'Image_00020.dcm', 'Image_00021.dcm']):
orig = pydicom.filereader.dcmread(
os.path.join('data', 'dicom', 'time', 'time00', f)
)
temp = pydicom.filereader.dcmread(
os.path.join(d, 'Image_{:05d}.dcm'.format(i))
)
compare_pydicom(self, orig, temp)
[docs] def test_verify_correct_4D(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
'time',
self.opts)
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write(d, formats=['dicom'], opts={'keep_uid': True})
# Use pydicom as truth to verify that written copy is identical to original
i = 0
for t in ['time00', 'time01', 'time02']:
for f in ['Image_00019.dcm', 'Image_00020.dcm', 'Image_00021.dcm']:
orig = pydicom.filereader.dcmread(
os.path.join('data', 'dicom', 'time', t, f)
)
temp = pydicom.filereader.dcmread(
os.path.join(d, 'Image_{:05d}.dcm'.format(i))
)
compare_pydicom(self, orig, temp)
i += 1
# @unittest.skip("skipping test_copy_dicom_4D")
[docs] def test_copy_dicom_4D(self):
si = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si.input_format)
logging.debug("si.sliceLocations: {}".format(si.sliceLocations))
logging.debug("si.imagePositions.keys(): {}".format(si.imagePositions.keys()))
newsi = Series(si,
imagedata.formats.INPUT_ORDER_TIME)
compare_headers(self, si, newsi)
self.assertEqual(newsi.dtype, np.uint16)
self.assertEqual(newsi.shape, (3, 3, 192, 152))
[docs] def test_write_ndarray(self):
with tempfile.TemporaryDirectory() as d:
Series(np.eye(128)).write(d, formats=['dicom'])
# @unittest.skip("skipping test_write_single_file")
[docs] def test_write_single_file(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm')
)
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write('{}?Image.dcm'.format(d), formats=['dicom'])
si2 = Series(d)
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
# @unittest.skip("skipping test_write_single_directory")
[docs] def test_write_single_directory(self):
si1 = Series(os.path.join('data', 'dicom', 'time', 'time00'))
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write('{}?Image%05d.dcm'.format(d), formats=['dicom'])
si2 = Series(d)
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
# @unittest.skip("skipping test_write_dicom_4D")
[docs] def test_write_dicom_4D(self):
si = Series(
os.path.join('data', 'dicom', 'time_all'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si.input_format)
logging.debug("si.sliceLocations: {}".format(si.sliceLocations))
logging.debug("si.imagePositions.keys(): {}".format(si.imagePositions.keys()))
with tempfile.TemporaryDirectory() as d:
si.write(os.path.join(d, 'Image_%05d'),
formats=['dicom'], opts=self.opts)
newsi = Series(d,
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', newsi.input_format)
self.assertEqual(si.shape, newsi.shape)
np.testing.assert_array_equal(si, newsi)
compare_headers(self, si, newsi)
self.assertEqual(newsi.dtype, np.uint16)
self.assertEqual(newsi.shape, (3, 3, 192, 152))
# @unittest.skip("skipping test_write_dicom_4D_no_opt")
[docs] def test_write_dicom_4D_no_opt(self):
si = Series(
os.path.join('data', 'dicom', 'time_all'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si.input_format)
logging.debug("si.sliceLocations: {}".format(si.sliceLocations))
logging.debug("si.imagePositions.keys(): {}".format(si.imagePositions.keys()))
with tempfile.TemporaryDirectory() as d:
si.write(os.path.join(d, 'Image_%05d'),
formats=['dicom'])
newsi = Series(d,
imagedata.formats.INPUT_ORDER_TIME)
self.assertEqual('dicom', newsi.input_format)
self.assertEqual(si.shape, newsi.shape)
np.testing.assert_array_equal(si, newsi)
compare_headers(self, si, newsi)
self.assertEqual(newsi.dtype, np.uint16)
self.assertEqual(newsi.shape, (3, 3, 192, 152))
[docs] def test_write_float(self):
si = Series(np.arange(8*8*8).reshape((8, 8, 8)))
si.seriesNumber = 100
si.seriesDescription = 'float'
si.imageType = ['DERIVED', 'SECONDARY']
si.header.photometricInterpretation = 'MONOCHROME2'
fsi = si / math.sqrt(2)
fsi_center = fsi.getDicomAttribute('WindowCenter')
fsi_width = fsi.getDicomAttribute('WindowWidth')
with tempfile.TemporaryDirectory() as d:
fsi.write(d, formats=['dicom'])
fsi_read = Series(d)
compare_headers(self, fsi, fsi_read)
self.assertAlmostEqual(fsi_read.getDicomAttribute('WindowCenter'), fsi_center, places=5)
self.assertAlmostEqual(fsi_read.getDicomAttribute('WindowWidth'), fsi_width, places=4)
self.assertAlmostEqual(fsi.getDicomAttribute('WindowCenter'),
fsi_read.getDicomAttribute('WindowCenter'))
[docs] def test_changed_uid(self):
eye = Series(np.eye(128, dtype=np.uint16))
eye_seriesInstanceUID = eye.seriesInstanceUID
with tempfile.TemporaryDirectory() as d:
eye.write(d, formats=['dicom'])
eye_read = Series(d)
self.assertEqual('dicom', eye_read.input_format)
self.assertNotEqual(eye_seriesInstanceUID, eye.seriesInstanceUID)
[docs] def test_write_keep_uid(self):
si1 = Series(os.path.join('data', 'dicom', 'time', 'time00'))
self.assertEqual('dicom', si1.input_format)
# Make a copy of SOPInstanceUIDs before they are possibly modified in write()
si1_seriesInstanceUID = si1.seriesInstanceUID
si1_sopinsuid = {}
for _slice in range(si1.slices):
si1_sopinsuid[_slice] = {}
for _tag in si1.tags[0]:
si1_sopinsuid[_slice][_tag] = \
si1.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
with tempfile.TemporaryDirectory() as d:
si1.write('{}?Image%05d.dcm'.format(d),
formats=['dicom'],
opts={'keep_uid': True})
si2 = Series(d)
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
self.assertEqual(si1_seriesInstanceUID, si1.seriesInstanceUID)
self.assertEqual(si1.seriesInstanceUID, si2.seriesInstanceUID)
self.assertEqual('1.2.840.10008.5.1.4.1.1.4', si2.SOPClassUID)
self.assertEqual(si1.slices, si2.slices)
self.assertEqual(len(si1.tags[0]), len(si2.tags[0]))
for _slice in range(si1.slices):
for _tag in si1.tags[0]:
# si1 SOPInstanceUIDs should be identical to si2
self.assertEqual(
si1.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag),
si2.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
)
# si2 SOPInstanceUIDs should also be identical to original si1
self.assertEqual(
si1_sopinsuid[_slice][_tag],
si2.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
)
[docs] def test_write_no_keep_uid(self):
si1 = Series(os.path.join('data', 'dicom', 'time', 'time00'))
self.assertEqual('dicom', si1.input_format)
# Make a copy of SOPInstanceUIDs before they are modified in write()
si1_seriesInstanceUID = si1.seriesInstanceUID
si1_sopinsuid = {}
for _slice in range(si1.slices):
si1_sopinsuid[_slice] = {}
for _tag in si1.tags[0]:
si1_sopinsuid[_slice][_tag] =\
si1.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
with tempfile.TemporaryDirectory() as d:
si1.write('{}?Image%05d.dcm'.format(d),
formats=['dicom'],
opts={'keep_uid': False})
si2 = Series(d)
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
self.assertNotEqual(si1_seriesInstanceUID, si1.seriesInstanceUID)
self.assertEqual(si1.seriesInstanceUID, si2.seriesInstanceUID)
self.assertEqual('1.2.840.10008.5.1.4.1.1.4', si2.SOPClassUID)
self.assertEqual(si1.slices, si2.slices)
self.assertEqual(len(si1.tags[0]), len(si2.tags[0]))
for _slice in range(si1.slices):
for _tag in si1.tags[0]:
# si1 SOPInstanceUIDs where modified at write() and will be identical to si2
self.assertEqual(
si1.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag),
si2.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
)
# si2 SOPInstanceUIDs should differ from original si1
self.assertNotEqual(
si1_sopinsuid[_slice][_tag],
si2.getDicomAttribute('SOPInstanceUID', slice=_slice, tag=_tag)
)
[docs]class TestDicomZipPlugin(unittest.TestCase):
[docs] def setUp(self):
parser = argparse.ArgumentParser()
imagedata.cmdline.add_argparse_options(parser)
self.opts = parser.parse_args([])
if len(self.opts.output_format) < 1:
self.opts.output_format = ['dicom']
plugins = imagedata.formats.get_plugins_list()
self.dicom_plugin = None
for pname, ptype, pclass in plugins:
if ptype == 'dicom':
self.dicom_plugin = pclass
self.assertIsNotNone(self.dicom_plugin)
# @unittest.skip("skipping test_write_zip")
[docs] def test_write_zip(self):
si1 = Series(os.path.join('data', 'dicom', 'time', 'time00'))
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write(os.path.join(d, 'dicom.zip?Image_%05d.dcm'),
formats=['dicom'])
si2 = Series(os.path.join(d, 'dicom.zip'))
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
[docs]class TestZipArchiveDicom(unittest.TestCase):
[docs] def setUp(self):
parser = argparse.ArgumentParser()
imagedata.cmdline.add_argparse_options(parser)
self.opts = parser.parse_args([])
if len(self.opts.output_format) < 1:
self.opts.output_format = ['dicom']
# @unittest.skip("skipping test_read_single_file")
[docs] def test_read_single_file(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_single_file_relative")
[docs] def test_read_single_file_relative(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_single_file_wildcard")
[docs] def test_read_single_file_wildcard(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?*time00/Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_two_files")
[docs] def test_read_two_files(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/Image_0002[01].dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (2, 192, 152))
# @unittest.skip("skipping test_read_single_directory")
[docs] def test_read_single_directory(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 192, 152))
# @unittest.skip("skipping test_read_two_directories")
[docs] def test_read_two_directories(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time0[02]/'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (2, 3, 192, 152))
# @unittest.skip("skipping test_read_all_files")
[docs] def test_read_all_files(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
[docs]class TestWriteZipArchiveDicom(unittest.TestCase):
[docs] def setUp(self):
parser = argparse.ArgumentParser()
imagedata.cmdline.add_argparse_options(parser)
self.opts = parser.parse_args([])
if len(self.opts.output_format) < 1:
self.opts.output_format = ['dicom']
# @unittest.skip("skipping test_read_single_file")
[docs] def test_read_single_file(self):
si1 = Series(os.path.join('data', 'dicom', 'time.zip?time/time00/Image_00020.dcm'))
self.assertEqual('dicom', si1.input_format)
with tempfile.TemporaryDirectory() as d:
si1.write(os.path.join(d, 'dicom.zip'), formats=['dicom'])
si2 = Series(os.path.join(d, 'dicom.zip?Image_00000.dcm'))
self.assertEqual('dicom', si2.input_format)
self.assertEqual(si1.dtype, si2.dtype)
self.assertEqual(si1.shape, si2.shape)
# @unittest.skip("skipping test_read_single_file_relative")
[docs] def test_read_single_file_relative(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_single_file_wildcard")
[docs] def test_read_single_file_wildcard(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?*time00/Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
# @unittest.skip("skipping test_read_two_files")
[docs] def test_read_two_files(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/Image_0002[01].dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (2, 192, 152))
# @unittest.skip("skipping test_read_single_directory")
[docs] def test_read_single_directory(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time00/'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 192, 152))
# @unittest.skip("skipping test_read_two_directories")
[docs] def test_read_two_directories(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/time0[02]/'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (2, 3, 192, 152))
# @unittest.skip("skipping test_read_all_files")
[docs] def test_read_all_files(self):
si1 = Series(
os.path.join('data', 'dicom', 'time.zip?time/'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
# @unittest.skip("skipping test_read_dicom_not_DWI")
[docs] def test_read_dicom_not_DWI(self):
with self.assertRaises(imagedata.formats.CannotSort) as context:
d = Series(
os.path.join('data', 'dicom', 'time'),
'b'
)
# @unittest.skip("skipping test_read_dicom_not_DWI_no_CSA")
[docs] def test_read_dicom_not_DWI_no_CSA(self):
with self.assertRaises(imagedata.formats.CannotSort) as context:
d = Series(
os.path.join('data', 'dicom', 'lena_color.dcm'),
'b'
)
[docs]class TestDicomSlicing(unittest.TestCase):
[docs] def setUp(self):
parser = argparse.ArgumentParser()
imagedata.cmdline.add_argparse_options(parser)
self.opts = parser.parse_args([])
if len(self.opts.output_format) < 1:
self.opts.output_format = ['dicom']
plugins = imagedata.formats.get_plugins_list()
self.dicom_plugin = None
for pname, ptype, pclass in plugins:
if ptype == 'dicom':
self.dicom_plugin = pclass
self.assertIsNotNone(self.dicom_plugin)
# @unittest.skip("skipping test_slice_inplane")
[docs] def test_slice_inplane(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00', 'Image_00020.dcm'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (192, 152))
a2 = np.array(si1)[80:120, 40:60]
si2 = si1[80:120, 40:60]
np.testing.assert_array_equal(a2, si2)
# @unittest.skip("skipping test_slice_z")
[docs] def test_slice_z(self):
si1 = Series(
os.path.join('data', 'dicom', 'time', 'time00'),
'none',
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 192, 152))
a2 = np.array(si1)[1:3]
si2 = si1[1:3]
np.testing.assert_array_equal(a2, si2)
self.assertEqual(len(si2.imagePositions), 2)
np.testing.assert_array_equal(si2.imagePositions[0], si1.imagePositions[1])
np.testing.assert_array_equal(si2.imagePositions[1], si1.imagePositions[2])
# @unittest.skip("skipping test_slice_time_z")
[docs] def test_slice_time_z(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
a2 = np.array(si1)[1:3, 1:3]
si2 = si1[1:3, 1:3]
np.testing.assert_array_equal(a2, si2)
self.assertEqual(len(si2.imagePositions), 2)
np.testing.assert_array_equal(si2.imagePositions[0], si1.imagePositions[1])
np.testing.assert_array_equal(si2.imagePositions[1], si1.imagePositions[2])
self.assertEqual(len(si2.tags[0]), 2)
# @unittest.skip("skipping test_slice_ellipsis_first")
[docs] def test_slice_ellipsis_first(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
a2 = np.array(si1)[..., 10:40]
si2 = si1[..., 10:40]
np.testing.assert_array_equal(a2, si2)
self.assertEqual(len(si2.imagePositions), len(si1.imagePositions))
for i in range(len(si2.imagePositions)):
np.testing.assert_array_equal(si2.imagePositions[i], si1.imagePositions[i])
self.assertEqual(len(si2.tags[0]), len(si1.tags[0]))
np.testing.assert_array_equal(si2.tags[0], si1.tags[0])
# @unittest.skip("skipping test_slice_ellipsis_last")
[docs] def test_slice_ellipsis_last(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
a2 = np.array(si1)[1:3, ...]
si2 = si1[1:3, ...]
np.testing.assert_array_equal(a2, si2)
self.assertEqual(len(si2.imagePositions), len(si1.imagePositions))
for i in range(len(si2.imagePositions)):
np.testing.assert_array_equal(si2.imagePositions[i], si1.imagePositions[i])
self.assertEqual(len(si2.tags[0]), 2)
np.testing.assert_array_equal(si2.tags[0], si1.tags[0][1:3])
# @unittest.skip("skipping test_slice_ellipsis_middle")
[docs] def test_slice_ellipsis_middle(self):
si1 = Series(
os.path.join('data', 'dicom', 'time'),
imagedata.formats.INPUT_ORDER_TIME,
self.opts)
self.assertEqual('dicom', si1.input_format)
self.assertEqual(si1.dtype, np.uint16)
self.assertEqual(si1.shape, (3, 3, 192, 152))
a2 = np.array(si1)[1:3, ..., 10:40]
si2 = si1[1:3, ..., 10:40]
np.testing.assert_array_equal(a2, si2)
self.assertEqual(len(si2.imagePositions), len(si1.imagePositions))
for i in range(len(si2.imagePositions)):
np.testing.assert_array_equal(si2.imagePositions[i], si1.imagePositions[i])
self.assertEqual(len(si2.tags[0]), 2)
np.testing.assert_array_equal(si2.tags[0], si1.tags[0][1:3])
if __name__ == '__main__':
unittest.main()
# logging.basicConfig(level=logging.DEBUG)
# runner = unittest.TextTestRunner(verbosity=2)
# unittest.main(testRunner=runner)