From 7819e80aaa97998390628a3fbae807278001036d Mon Sep 17 00:00:00 2001 From: Adithyan Dinesh Date: Thu, 20 Jun 2024 18:38:18 +0530 Subject: [PATCH] Support for Tomosynthesis multiframe loading and segmentation. --- .../adapters/Cornerstone/Segmentation_4X.js | 22 ++++++++++++++++ .../Segmentation/overrideNormalizer.ts | 25 ++++++++++++++++--- packages/core/src/loaders/imageLoader.ts | 1 + 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js index e72475d76e..a418f9706b 100644 --- a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js +++ b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js @@ -731,6 +731,28 @@ function findReferenceSourceImageId( ); } + if (imageId === undefined && frameSourceImageSequence) { + const uniqueImagePositionPatients = new Set(); + + imageIds.forEach(imgId => { + const imageMetadata = metadataProvider.get("instance", imgId); + uniqueImagePositionPatients.add( + imageMetadata.ImagePositionPatient?.toString() + ); + }); + + if (uniqueImagePositionPatients.size !== imageIds.length) { + const { ReferencedSOPInstanceUID, ReferencedFrameNumber } = + frameSourceImageSequence; + const imageIdPrefix = + sopUIDImageIdIndexMap[ReferencedSOPInstanceUID].split( + "frame=" + )[0]; + + imageId = `${imageIdPrefix}frame=${ReferencedFrameNumber}`; + } + } + if (imageId === undefined && ReferencedSeriesSequence) { const referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] diff --git a/packages/adapters/src/adapters/Cornerstone3D/Segmentation/overrideNormalizer.ts b/packages/adapters/src/adapters/Cornerstone3D/Segmentation/overrideNormalizer.ts index fe9f4fa058..19ba17fd42 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Segmentation/overrideNormalizer.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Segmentation/overrideNormalizer.ts @@ -15,10 +15,14 @@ export default function overrideNormalize(metaData) { class MGImageNormalizer extends ImageNormalizer { normalize() { - this.dataset = getHandledSingleImageDataset( - this.datasets[0], - metaData - ); + if (this.datasets[0].NumberOfFrames > 1) { + super.convertToMultiframe(); + } else { + this.dataset = getHandledSingleImageDataset( + this.datasets[0], + metaData + ); + } super.normalizeMultiframe(); } } @@ -55,6 +59,10 @@ export default function overrideNormalize(metaData) { "1.2.840.10008.5.1.4.1.1.7": SecondaryCapturedImageNormalizer }; + const extraMultiFrameSopInstanceUIDs = [ + "1.2.840.10008.5.1.4.1.1.13.1.3" // Breast Tomosynthesis Image Storage + ]; + const parentNormalizerForSOPClassUID = Normalizer.normalizerForSOPClassUID; Normalizer.normalizerForSOPClassUID = sopClassUID => { const normalizerClass = parentNormalizerForSOPClassUID(sopClassUID); @@ -65,6 +73,15 @@ export default function overrideNormalize(metaData) { return SingleImageSOPClassUIDMap[sopClassUID]; } }; + + const parentIsMultiframeSOPClassUID = Normalizer.isMultiframeSOPClassUID; + Normalizer.isMultiframeSOPClassUID = sopClassUID => { + const isMultiFrame = parentIsMultiframeSOPClassUID(sopClassUID); + + return ( + isMultiFrame || extraMultiFrameSopInstanceUIDs.includes(sopClassUID) + ); + }; } function getHandledSingleImageDataset(dataset, metaData) { diff --git a/packages/core/src/loaders/imageLoader.ts b/packages/core/src/loaders/imageLoader.ts index d1f8e09237..3917e2d8f3 100644 --- a/packages/core/src/loaders/imageLoader.ts +++ b/packages/core/src/loaders/imageLoader.ts @@ -261,6 +261,7 @@ export function createAndCacheDerivedImage( 'imagePlaneModule', 'generalSeriesModule', 'voiLutModule', + 'instance', ].forEach((type) => { genericMetadataProvider.add(derivedImageId, { type,