From 3e1775ea204cf12a040ac2a624278d17cad7f47e Mon Sep 17 00:00:00 2001 From: Leonardo Campos Date: Wed, 4 Jan 2017 19:17:33 -0200 Subject: [PATCH] Auto Play wasnt working for multiframe instances --- .../client/lib/classes/MetadataProvider.js | 112 +++++++++++++----- .../server/services/wado/retrieveMetadata.js | 14 ++- 2 files changed, 94 insertions(+), 32 deletions(-) diff --git a/Packages/ohif-cornerstone/client/lib/classes/MetadataProvider.js b/Packages/ohif-cornerstone/client/lib/classes/MetadataProvider.js index 28eb4cf79..294d45386 100644 --- a/Packages/ohif-cornerstone/client/lib/classes/MetadataProvider.js +++ b/Packages/ohif-cornerstone/client/lib/classes/MetadataProvider.js @@ -105,6 +105,18 @@ export class MetadataProvider { this.metadataLookup.set(imageId, Object.assign(oldMetadata, metadata)); } + getFromImage(image, type, tag, attrName, defaultValue) { + let value; + + if(image.data) { + value = this.getFromDataSet(image.data, type, tag); + } else { + value = image.instance[attrName]; + } + + return value == null ? defaultValue : value; + } + getFromDataSet(dataSet, type, tag) { if (!dataSet) { return; @@ -118,6 +130,50 @@ export class MetadataProvider { return fn.call(dataSet, tag); } + getFrameIncrementPointer(image) { + const dataSet = image.data; + let frameInstancePointer = ''; + + if (parsingUtils.isValidDataSet(dataSet)) { + const frameInstancePointerNames = { + 'x00181063': 'frameTime', + 'x00181065': 'frameTimeVector' + } + + // (0028,0009) = Frame Increment Pointer + const frameInstancePointerTag = parsingUtils.attributeTag(dataSet, 'x00280009'); + frameInstancePointer = frameInstancePointerNames[frameInstancePointerTag]; + } else { + frameInstancePointer = image.instance['frameIncrementPointer']; + } + + return frameInstancePointer || ''; + } + + getFrameTimeVector(image) { + const dataSet = image.data; + + if (parsingUtils.isValidDataSet(dataSet)) { + // Frame Increment Pointer points to Frame Time Vector (0018,1065) field + return parsingUtils.floatArray(dataSet, 'x00181065'); + } + + return image.instance['frameTimeVector']; + } + + getFrameTime(image) { + const dataSet = image.data; + + if (parsingUtils.isValidDataSet(dataSet)) { + // Frame Increment Pointer points to Frame Time (0018,1063) field or is not defined (for addtional flexibility). + // Yet another value is possible for this field (5200,9230 for Multi-frame Functional Groups) + // but that case is currently not supported. + return dataSet.floatString('x00181063', -1); + } + + return image.instance['frameTime']; + } + /** * Updates the related metadata for missing fields given a specified image * @@ -152,8 +208,8 @@ export class MetadataProvider { imageMetadata.instance.frameTime = imageMetadata.instance.frameTime || this.getFromDataSet(image.data, 'string', 'x00181063'); imageMetadata.instance.frameTimeVector = imageMetadata.instance.frameTimeVector || this.getFromDataSet(image.data, 'string', 'x00181065'); - if (image.data && !imageMetadata.instance.multiframeMetadata) { - imageMetadata.instance.multiframeMetadata = this.getMultiframeModuleMetadata(image.data); + if ((image.data || image.instance) && !imageMetadata.instance.multiframeMetadata) { + imageMetadata.instance.multiframeMetadata = this.getMultiframeModuleMetadata(image); } imageMetadata.imagePlane = imageMetadata.imagePlane || this.getImagePlane(imageMetadata.instance); @@ -209,7 +265,7 @@ export class MetadataProvider { * @param dataSet {Object} An instance of dicomParser.DataSet object where multiframe information can be found. * @return {Object} An object containing multiframe image metadata (frameIncrementPointer, frameTime, frameTimeVector, etc). */ - getMultiframeModuleMetadata(dataSet) { + getMultiframeModuleMetadata(image) { const imageInfo = { isMultiframeImage: false, frameIncrementPointer: null, @@ -221,40 +277,34 @@ export class MetadataProvider { let frameTime; - if (parsingUtils.isValidDataSet(dataSet)) { + const numberOfFrames = this.getFromImage(image, 'intString', 'x00280008', 'numberOfFrames', -1); - // (0028,0008) = Number of Frames - const numberOfFrames = dataSet.intString('x00280008', -1); - if (numberOfFrames > 0) { + if (numberOfFrames > 0) { + // set multi-frame image indicator + imageInfo.isMultiframeImage = true; + imageInfo.numberOfFrames = numberOfFrames; - // set multi-frame image indicator - imageInfo.isMultiframeImage = true; - imageInfo.numberOfFrames = numberOfFrames; + // (0028,0009) = Frame Increment Pointer + const frameIncrementPointer = this.getFrameIncrementPointer(image); - // (0028,0009) = Frame Increment Pointer - const frameIncrementPointer = parsingUtils.attributeTag(dataSet, 'x00280009') || ''; + if (frameIncrementPointer === 'frameTimeVector') { + // Frame Increment Pointer points to Frame Time Vector (0018,1065) field + const frameTimeVector = this.getFrameTimeVector(image); - if (frameIncrementPointer === 'x00181065') { - // Frame Increment Pointer points to Frame Time Vector (0018,1065) field - const frameTimeVector = parsingUtils.floatArray(dataSet, 'x00181065'); - if (frameTimeVector instanceof Array && frameTimeVector.length > 0) { - imageInfo.frameIncrementPointer = 'frameTimeVector'; - imageInfo.frameTimeVector = frameTimeVector; - frameTime = frameTimeVector.reduce((a, b) => a + b) / frameTimeVector.length; - imageInfo.averageFrameRate = 1000 / frameTime; - } - } else if (frameIncrementPointer === 'x00181063' || frameIncrementPointer === '') { - // Frame Increment Pointer points to Frame Time (0018,1063) field or is not defined (for addtional flexibility). - // Yet another value is possible for this field (5200,9230 for Multi-frame Functional Groups) - // but that case is currently not supported. - frameTime = dataSet.floatString('x00181063', -1); - if (frameTime > 0) { - imageInfo.frameIncrementPointer = 'frameTime'; - imageInfo.frameTime = frameTime; - imageInfo.averageFrameRate = 1000 / frameTime; - } + if (frameTimeVector instanceof Array && frameTimeVector.length > 0) { + imageInfo.frameIncrementPointer = frameIncrementPointer; + imageInfo.frameTimeVector = frameTimeVector; + frameTime = frameTimeVector.reduce((a, b) => a + b) / frameTimeVector.length; + imageInfo.averageFrameRate = 1000 / frameTime; } + } else if (frameIncrementPointer === 'frameTime' || frameIncrementPointer === '') { + frameTime = this.getFrameTime(image); + if (frameTime > 0) { + imageInfo.frameIncrementPointer = frameIncrementPointer; + imageInfo.frameTime = frameTime; + imageInfo.averageFrameRate = 1000 / frameTime; + } } } diff --git a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js index 1b2a46b10..60bfde31b 100644 --- a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js +++ b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js @@ -107,7 +107,19 @@ function getPaletteColors(server, instance) { } +function getFrameIncrementPointer(element) { + const frameIncrementPointerNames = { + '00181065': 'frameTimeVector', + '00181063': 'frameTime' + }; + if(!element || !element.Value || !element.Value.length) { + return; + } + + const value = element.Value[0]; + return frameIncrementPointerNames[value]; +} /** * Parses result data from a WADO search into Study MetaData @@ -195,7 +207,7 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { viewPosition: DICOMWeb.getString(instance['00185101']), acquisitionDateTime: DICOMWeb.getString(instance['0008002A']), numberOfFrames: DICOMWeb.getNumber(instance['00280008']), - frameIncrementPointer: DICOMWeb.getAttribute(instance['00280009']), + frameIncrementPointer: getFrameIncrementPointer(instance['00280009']), frameTime: DICOMWeb.getNumber(instance['00181063']), frameTimeVector: parseFloatArray(DICOMWeb.getString(instance['00181065'])), sliceThickness: DICOMWeb.getNumber(instance['00180050']),