From f95e99750b6b0a813775a11bea6dc0c20727ee93 Mon Sep 17 00:00:00 2001 From: Robin Hegering <44192264+rheg49@users.noreply.github.com> Date: Wed, 1 Feb 2023 22:57:01 +0100 Subject: [PATCH] Add shorthand function to merge two pre-existing RTStruct structure sets (#70) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ Add class to merge two pre-existing RTStruct structure sets --- rt_utils/__init__.py | 1 + rt_utils/rtstruct_merger.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 rt_utils/rtstruct_merger.py diff --git a/rt_utils/__init__.py b/rt_utils/__init__.py index cbf06fe..a17580d 100644 --- a/rt_utils/__init__.py +++ b/rt_utils/__init__.py @@ -1,2 +1,3 @@ from .rtstruct import RTStruct from .rtstruct_builder import RTStructBuilder +from .rtstruct_merger import RTStructMerger diff --git a/rt_utils/rtstruct_merger.py b/rt_utils/rtstruct_merger.py new file mode 100644 index 0000000..c1e8a8f --- /dev/null +++ b/rt_utils/rtstruct_merger.py @@ -0,0 +1,33 @@ +from .rtstruct import RTStruct +from .rtstruct_builder import RTStructBuilder +from . import ds_helper, image_helper + +class RTStructMerger: + + + @staticmethod + def merge_rtstructs(dicom_series_path: str, rt_struct_path1: str, + rt_struct_path2: str) -> RTStruct: + """ + Method to merge two existing RTStruct files belonging to same series data, returning them as one RTStruct + """ + + rtstruct1 = RTStructBuilder.create_from(dicom_series_path, rt_struct_path1) + rtstruct2 = RTStructBuilder.create_from(dicom_series_path, rt_struct_path2) + + for roi_contour_seq, struct_set_roi_seq, rt_roi_observation_seq in zip(rtstruct1.ds.ROIContourSequence, rtstruct1.ds.StructureSetROISequence, rtstruct1.ds.RTROIObservationsSequence): + roi_number = len(rtstruct2.ds.StructureSetROISequence) + 1 + roi_contour_seq.ReferencedROINumber = roi_number + struct_set_roi_seq.ROINumber = roi_number + rt_roi_observation_seq.ReferencedROINumber = roi_number + + # check for ROI name duplication + for struct_set_roi_seq2 in rtstruct2.ds.StructureSetROISequence: + if struct_set_roi_seq.ROIName == struct_set_roi_seq2.ROIName: + struct_set_roi_seq += "_2" + + rtstruct2.ds.ROIContourSequence.append(roi_contour_seq) + rtstruct2.ds.StructureSetROISequence.append(struct_set_roi_seq) + rtstruct2.ds.RTROIObservationsSequence.append(rt_roi_observation_seq) + + return rtstruct2 \ No newline at end of file