diff --git a/SegmentationComparison/SegmentationComparison.py b/SegmentationComparison/SegmentationComparison.py index 5d5b241..d62108c 100644 --- a/SegmentationComparison/SegmentationComparison.py +++ b/SegmentationComparison/SegmentationComparison.py @@ -1414,6 +1414,9 @@ def __init__(self) -> None: """Called when the logic class is instantiated. Can be used for initializing member variables.""" ScriptedLoadableModuleLogic.__init__(self) self.segmentBoundingBoxes = {} + # Cache for referenced CT series UIDs to avoid repeated DICOM file reads. + # Maps segmentation series UID -> referenced CT series UID + self._referencedSeriesCache = {} def setDefaultParameters(self, parameterNode): """ @@ -1748,24 +1751,42 @@ def getLayoutXML(self, viewNumber, threedCheckbox, twodCheckbox, layout, viewNam return layout_xml + def clearReferencedSeriesCache(self): + """ + Clears the cache of referenced CT series UIDs. + Should be called when the DICOM database is updated or modified. + """ + self._referencedSeriesCache.clear() + #Load all Segmentation files for chosen Volume def getReferencedCtSeries(self, segmentation_uid): """ Returns the SeriesInstanceUID of the referenced CT given a DICOM Seg File. + Uses caching to avoid repeated DICOM file reads for the same series. :param segmentation_uid: SeriesInstanceUID of a segmentation: :return String: SeriesInstanceUID of the referecned CT """ + # Check cache first + if segmentation_uid in self._referencedSeriesCache: + return self._referencedSeriesCache[segmentation_uid] + dicom_database = slicer.dicomDatabase series_files = dicom_database.filesForSeries(segmentation_uid) if not series_files: + self._referencedSeriesCache[segmentation_uid] = None return None try: ds = pydicom.dcmread(series_files[0], stop_before_pixels = True, specific_tags = ["ReferencedSeriesSequence"]) - return ds.ReferencedSeriesSequence[0].SeriesInstanceUID + referenced_series = ds.ReferencedSeriesSequence[0].SeriesInstanceUID + # Cache the result + self._referencedSeriesCache[segmentation_uid] = referenced_series + return referenced_series except Exception as e: print(e) + # Cache None for failed reads to avoid repeated failures + self._referencedSeriesCache[segmentation_uid] = None return None def getSegmentationSopInstanceUID(self, series_uid):