From 8828d60c01e3576cce5cecfcfe42bd2dc4ce6a87 Mon Sep 17 00:00:00 2001 From: rspinoni Date: Tue, 22 Feb 2022 09:00:22 +0100 Subject: [PATCH 1/4] add ability to retrieve ROI names in a case insensitive way --- rt_utils/rtstruct.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rt_utils/rtstruct.py b/rt_utils/rtstruct.py index 3e22ccc..cf81667 100644 --- a/rt_utils/rtstruct.py +++ b/rt_utils/rtstruct.py @@ -106,7 +106,7 @@ def get_roi_mask_by_name(self, name) -> np.ndarray: """ for structure_roi in self.ds.StructureSetROISequence: - if structure_roi.ROIName == name: + if structure_roi.ROIName.casefold() == name.casefold(): contour_sequence = ds_helper.get_contour_sequence_by_roi_number( self.ds, structure_roi.ROINumber ) From f434fcd0cce29146bf7099aa89aecadb700e23e3 Mon Sep 17 00:00:00 2001 From: Adam Watkins Date: Tue, 22 Feb 2022 01:10:28 -0800 Subject: [PATCH 2/4] Add test for case insensitivity --- tests/test_rtstruct_builder.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/test_rtstruct_builder.py b/tests/test_rtstruct_builder.py index c5947cf..cb25248 100644 --- a/tests/test_rtstruct_builder.py +++ b/tests/test_rtstruct_builder.py @@ -72,12 +72,30 @@ def test_add_valid_roi(new_rtstruct: RTStruct): assert new_rtstruct.get_roi_names() == [NAME] +def test_get_roi_by_name_case_insensitive(new_rtstruct: RTStruct): + NAME = "Test ROI" + mask = get_empty_mask(new_rtstruct) + mask[50:100, 50:100, 0] = 1 + new_rtstruct.add_roi(mask, name=NAME) + + assert type(new_rtstruct.get_roi_mask_by_name(name=NAME.upper())) is np.ndarray + + +def test_get_invalid_roi_by_none_name(new_rtstruct: RTStruct): + NAME = "Test ROI" + mask = get_empty_mask(new_rtstruct) + mask[50:100, 50:100, 0] = 1 + new_rtstruct.add_roi(mask, name=NAME) + + with pytest.raises(RTStruct.ROIException): + new_rtstruct.get_roi_mask_by_name(name=None) + + def test_get_invalid_roi_mask_by_name(new_rtstruct: RTStruct): assert new_rtstruct.get_roi_names() == [] with pytest.raises(RTStruct.ROIException): new_rtstruct.get_roi_mask_by_name("FAKE_NAME") - def test_loading_invalid_rt_struct(series_path): invalid_rt_struct_path = os.path.join(series_path, "ct_1.dcm") assert os.path.exists(invalid_rt_struct_path) From cc439b1430e96f32dd4bcac673cd8504a9482694 Mon Sep 17 00:00:00 2001 From: Adam Watkins Date: Tue, 22 Feb 2022 01:13:07 -0800 Subject: [PATCH 3/4] Code formatting --- tests/test_rtstruct_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_rtstruct_builder.py b/tests/test_rtstruct_builder.py index cb25248..34ba5b9 100644 --- a/tests/test_rtstruct_builder.py +++ b/tests/test_rtstruct_builder.py @@ -96,6 +96,7 @@ def test_get_invalid_roi_mask_by_name(new_rtstruct: RTStruct): with pytest.raises(RTStruct.ROIException): new_rtstruct.get_roi_mask_by_name("FAKE_NAME") + def test_loading_invalid_rt_struct(series_path): invalid_rt_struct_path = os.path.join(series_path, "ct_1.dcm") assert os.path.exists(invalid_rt_struct_path) From cab9a6b7a741f4ec10f561891de7c42e7f865dde Mon Sep 17 00:00:00 2001 From: rspinoni Date: Wed, 23 Feb 2022 08:40:06 +0100 Subject: [PATCH 4/4] solve NPE issue --- rt_utils/rtstruct.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rt_utils/rtstruct.py b/rt_utils/rtstruct.py index cf81667..58673c5 100644 --- a/rt_utils/rtstruct.py +++ b/rt_utils/rtstruct.py @@ -104,9 +104,10 @@ def get_roi_mask_by_name(self, name) -> np.ndarray: """ Returns the 3D binary mask of the ROI with the given input name """ + name = name.casefold() if type(name) is str else name for structure_roi in self.ds.StructureSetROISequence: - if structure_roi.ROIName.casefold() == name.casefold(): + if structure_roi.ROIName.casefold() == name: contour_sequence = ds_helper.get_contour_sequence_by_roi_number( self.ds, structure_roi.ROINumber )