def test_interp_param(self): """Test interp summation of two non-coincident dose grids with non-default interp parameters""" # Interp Sum equality, entire grid in one operation other_ds = read_dicom(self.rtdose_dcm) other_ds.ImagePositionPatient[0] += 0.0000005 other = dose.DoseGrid(other_ds) dosegrid = dose.DoseGrid(self.rtdose_dcm, order=2, mode="nearest") dosegrid.add(other) assert_array_not_equal(dosegrid.dose_grid, self.dosegrid.dose_grid * 2) assert_array_almost_equal( dosegrid.dose_grid, self.dosegrid.dose_grid * 2 ) # Interp Sum inequality, entire grid in one operation other_ds.ImagePositionPatient[0] += 0.0000005 other = dose.DoseGrid(other_ds) dosegrid = dose.DoseGrid(self.rtdose_dcm, order=2, mode="nearest") dosegrid.add(other) assert_array_not_equal(dosegrid.dose_grid, self.dosegrid.dose_grid * 2) assert_array_not_almost_equal( dosegrid.dose_grid, self.dosegrid.dose_grid * 2 ) self.assertEqual(dosegrid.interp_param["order"], 2) self.assertEqual(dosegrid.interp_param["mode"], "nearest")
def test_non_uniform_dose_grid_scale(self): """Check that a non-uniform dose grid is detected""" ds = dose.DoseGrid(self.rtdose_dcm).ds ds.GridFrameOffsetVector[0] += 1 dosegrid = dose.DoseGrid(ds) with self.assertRaises(NotImplementedError): dosegrid.scale
def test_save_dcm(self): """Test save DoseGrid to DICOM""" dosegrid = dose.DoseGrid(self.rtdose_dcm) self.assertFalse(hasattr(dosegrid.ds, "ContentDate")) self.assertFalse(hasattr(dosegrid.ds, "ContentTime")) dosegrid2 = dose.DoseGrid(self.rtdose_dcm) dosegrid.add(dosegrid2) # ensure other_sop_class_uid is set filepath = os.path.join(example_data, "dose_write_test.dcm") dosegrid.save_dcm(filepath) dosegrid_new = dose.DoseGrid(filepath) # load new dosegrid from file self.assertTrue(hasattr(dosegrid_new.ds, "ContentDate")) self.assertTrue(hasattr(dosegrid_new.ds, "ContentTime")) os.remove(filepath)
def test_add_attr_mismatch(self): """Test add fails with mismatched DoseSummationType""" warnings.filterwarnings("ignore") other = dose.DoseGrid(self.rtdose_dcm) other.ds.DoseSummationType = "%s1" % other.ds.DoseSummationType with self.assertRaises(NotImplementedError): other.add(self.dosegrid) warnings.filterwarnings("default")
def test_multiply(self): """Directly test the multiply function""" dosegrid = dose.DoseGrid(self.rtdose_dcm) dosegrid.multiply(2) assert_array_equal(dosegrid.dose_grid, self.dosegrid.dose_grid * 2) # Check that a negative factor raises NotImplementedError with self.assertRaises(NotImplementedError): dosegrid.multiply(-1)
def test_is_coincident(self): """Test spatial coincidence of two dose grids""" # Self coincidence other = dose.DoseGrid(self.rtdose_dcm) self.assertTrue(self.dosegrid.is_coincident(other)) # ImagePositionPatient (offset) other = dose.DoseGrid(self.rtdose_dcm) other.ds.ImagePositionPatient[0] += 1 self.assertFalse(self.dosegrid.is_coincident(other)) # PixelSpacing other = dose.DoseGrid(self.rtdose_dcm) other.ds.PixelSpacing[0] += 1 self.assertFalse(self.dosegrid.is_coincident(other)) # GridFrameOffsetVector check = arange(0, 98) * 3 assert_array_equal(self.dosegrid.ds.GridFrameOffsetVector, check) other = dose.DoseGrid(self.rtdose_dcm) other.ds.GridFrameOffsetVector[0] += 1 self.assertFalse(self.dosegrid.is_coincident(other))
def test_interp_entire_grid(self): """Test interp_entire_grid of two non-coincident dose grids""" # Interp Sum equality, entire grid in one operation other = dose.DoseGrid(self.rtdose_dcm) other.x_axis += 0.0000005 # perturb to ensure interpolation is used interp_grid_1 = other.interp_entire_grid(self.dosegrid) assert_array_not_equal(interp_grid_1, self.dosegrid.dose_grid) assert_array_almost_equal(interp_grid_1, self.dosegrid.dose_grid) # Interp Sum inequality, entire grid in one operation other.x_axis += 0.0000005 # should cause assert_array_equal failure interp_grid_2 = other.interp_entire_grid(self.dosegrid) assert_array_not_equal(interp_grid_2, self.dosegrid.dose_grid) assert_array_not_almost_equal(interp_grid_2, self.dosegrid.dose_grid)
def test_set_dicom_tag_value(self): """Test set_dicom_tag_value by tag and keyword""" # Edit existing tag by keyword ds = dose.DoseGrid(self.rtdose_dcm).ds self.assertNotEqual(str(ds.PatientID), "DoseTestByKeyword") dose.set_dicom_tag_value(ds, "PatientID", "DoseTestByKeyword") self.assertEqual(str(ds.PatientID), "DoseTestByKeyword") # Edit existing tag by tag self.assertNotEqual(str(ds.PatientID), "DoseTestByTag") dose.set_dicom_tag_value(ds, 0x00100020, "DoseTestByTag") self.assertEqual(str(ds.PatientID), "DoseTestByTag") # Create a new Tag self.assertFalse(hasattr(ds, "PatientComments")) dose.set_dicom_tag_value(ds, "PatientComments", "CommentsTest") self.assertEqual(str(ds.PatientComments), "CommentsTest")
def test_add_dicom_sequence(self): """Test add_dicom_sequence by appending or creating a new sequence""" # Add new sequence ds = dose.DoseGrid(self.rtdose_dcm).ds self.assertFalse(hasattr(ds, "ReferencedInstanceSequence")) seq_data = {"ReferencedSOPClassUID": "TestUID1"} dose.add_dicom_sequence(ds, "ReferencedInstanceSequence", seq_data) self.assertEqual( str(ds.ReferencedInstanceSequence[0].ReferencedSOPClassUID), "TestUID1", ) # Append to existing sequence seq_data = {"ReferencedSOPClassUID": "TestUID2"} dose.add_dicom_sequence(ds, "ReferencedInstanceSequence", seq_data) self.assertEqual( str(ds.ReferencedInstanceSequence[1].ReferencedSOPClassUID), "TestUID2", )
def test_add_overload(self): """Test the overloaded __add__ operator""" other = dose.DoseGrid(self.rtdose_dcm) dose_sum = self.dosegrid + other assert_array_equal(self.dosegrid.dose_grid, other.dose_grid) assert_array_equal(dose_sum.dose_grid, self.dosegrid.dose_grid * 2)
def test_modality_check(self): """Test non-RTDOSE raises AttributeError""" ds = dicomparser.DicomParser(self.rtdose_dcm).ds ds.Modality = "RTPLAN" with self.assertRaises(AttributeError): dose.DoseGrid(ds)
def setUp(self): """Setup files for common case testing.""" self.rtdose_dcm = os.path.join(example_data, "rtdose.dcm") self.rtdose = dicomparser.DicomParser(self.rtdose_dcm) self.dosegrid = dose.DoseGrid(self.rtdose_dcm)
def test_dose_interp_sum(self): """Test the interpolated summation of two coincident dose grids""" other = dose.DoseGrid(self.rtdose_dcm) other._interp_sum(self.dosegrid) assert_array_almost_equal(other.dose_grid, self.dosegrid.dose_grid * 2)
def test_dose_direct_sum(self): """Test the direct summation of two coincident dose grids""" other = dose.DoseGrid(self.rtdose_dcm) other._direct_sum(self.dosegrid) assert_array_equal(other.dose_grid, self.dosegrid.dose_grid * 2)