Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion SegmentationComparison/SegmentationComparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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):
Expand Down