Exemplo n.º 1
0
    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")
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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")
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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")
Exemplo n.º 9
0
    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",
        )
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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)
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
 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)