From 9473c8b1878bd8e0e89801681ce5cff373b9571a Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Mon, 19 Apr 2021 19:36:54 -0300 Subject: [PATCH 1/6] Add hook to map cornestone tools from ccc srs --- .../src/DICOMSR/parseDicomStructuredReport.js | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/platform/core/src/DICOMSR/parseDicomStructuredReport.js b/platform/core/src/DICOMSR/parseDicomStructuredReport.js index df5770364b9..b870f60dd29 100644 --- a/platform/core/src/DICOMSR/parseDicomStructuredReport.js +++ b/platform/core/src/DICOMSR/parseDicomStructuredReport.js @@ -2,6 +2,8 @@ import dcmjs from 'dcmjs'; import findInstanceMetadataBySopInstanceUID from './utils/findInstanceMetadataBySopInstanceUid'; +const toArray = x => (Array.isArray(x) ? x : [x]); + /** * Function to parse the part10 array buffer that comes from a DICOM Structured report into measurementData * measurementData format is a viewer specific format to be stored into the redux and consumed by other components @@ -21,7 +23,54 @@ const parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => { const { MeasurementReport } = dcmjs.adapters.Cornerstone; const storedMeasurementByToolType = MeasurementReport.generateToolState( - dataset + dataset, + { + getToolClass: (measurementGroup, dataset, toolClasses) => { + const measurementGroupContentSequence = toArray( + measurementGroup.ContentSequence + ); + + const CrowdsCureCancer = { + identifiers: ['99CCC', 'crowds-cure', 'Crowds Cure Cancer'], + LONG_AXIS: 'G-A185', + SHORT_AXIS: 'G-A186', + FINDING_SITE: 'G-C0E3', + LENGTH: 'G-D7FE', + }; + + const isCrowdsCureCancer = CrowdsCureCancer.identifiers.some( + identifier => JSON.stringify(dataset).includes(identifier) + ); + + if (isCrowdsCureCancer) { + const ShortAxisContentItem = measurementGroupContentSequence.find( + contentItem => + contentItem.ConceptNameCodeSequence.CodeValue === + CrowdsCureCancer.SHORT_AXIS + ); + + const LongAxisContentItem = measurementGroupContentSequence.find( + contentItem => + contentItem.ConceptNameCodeSequence.CodeValue === + CrowdsCureCancer.LONG_AXIS + ); + + const LengthContentItem = measurementGroupContentSequence.find( + contentItem => + contentItem.ConceptNameCodeSequence.CodeValue === + CrowdsCureCancer.LENGTH + ); + + if (ShortAxisContentItem && LongAxisContentItem) { + return toolClasses.find(t => t.toolType === 'Bidirectional'); + } + + if (LengthContentItem) { + return toolClasses.find(t => t.toolType === 'Length'); + } + } + }, + } ); const measurementData = {}; let measurementNumber = 0; From c8d6a78286e5aee9a2be903d5501b7974fb02e14 Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Mon, 19 Apr 2021 19:47:09 -0300 Subject: [PATCH 2/6] Fix viewer retrieve loading of studies to wait srs to load properly --- .../src/connectedComponents/ViewerRetrieveStudyData.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js b/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js index d2902d5738b..0ad542ae284 100644 --- a/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js +++ b/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js @@ -259,7 +259,6 @@ function ViewerRetrieveStudyData({ ); setStudies([...studies, study]); - setIsStudyLoaded(true); }; /** @@ -295,13 +294,15 @@ function ViewerRetrieveStudyData({ setError(error); log.error(error); } + }) + .finally(() => { + setIsStudyLoaded(true); }); return study; }); setStudies(studies); - setIsStudyLoaded(true); } }; From 77f5acc7cb7d0a11cb54aa8a091fa41662652e4c Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Mon, 19 Apr 2021 20:02:01 -0300 Subject: [PATCH 3/6] Add comment --- .../core/src/DICOMSR/parseDicomStructuredReport.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/platform/core/src/DICOMSR/parseDicomStructuredReport.js b/platform/core/src/DICOMSR/parseDicomStructuredReport.js index b870f60dd29..afdf07033d4 100644 --- a/platform/core/src/DICOMSR/parseDicomStructuredReport.js +++ b/platform/core/src/DICOMSR/parseDicomStructuredReport.js @@ -25,6 +25,16 @@ const parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => { const storedMeasurementByToolType = MeasurementReport.generateToolState( dataset, { + /** + * TODO: This custom mapping for CCC uni/bidirectional annotations to + * Cornerstone tool classes is based on very limited matching + * of specific code values e.g. length and long axis. + * + * We need to use smarter matching criteria for + * different types/complex annotations in the long term. + * + * Ongoing discussion/representation here: https://github.com/OHIF/Viewers/issues/1215 + */ getToolClass: (measurementGroup, dataset, toolClasses) => { const measurementGroupContentSequence = toArray( measurementGroup.ContentSequence From 0848cb460c56365a6822e05bf7f4b38bb957f41b Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Tue, 20 Apr 2021 01:54:52 -0300 Subject: [PATCH 4/6] Add fallback --- .../core/src/DICOMSR/parseDicomStructuredReport.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/platform/core/src/DICOMSR/parseDicomStructuredReport.js b/platform/core/src/DICOMSR/parseDicomStructuredReport.js index afdf07033d4..5fe40ff7f3c 100644 --- a/platform/core/src/DICOMSR/parseDicomStructuredReport.js +++ b/platform/core/src/DICOMSR/parseDicomStructuredReport.js @@ -78,6 +78,18 @@ const parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => { if (LengthContentItem) { return toolClasses.find(t => t.toolType === 'Length'); } + } else { + const TrackingIdentifierGroup = measurementGroupContentSequence.find( + contentItem => + contentItem.ConceptNameCodeSequence.CodeMeaning === + TRACKING_IDENTIFIER + ); + + const TrackingIdentifierValue = TrackingIdentifierGroup.TextValue; + + toolClasses.find(tc => + tc.isValidCornerstoneTrackingIdentifier(TrackingIdentifierValue) + ); } }, } From 55519fa0b4d479b879acab9a5046de81c7f6cf46 Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Wed, 21 Apr 2021 17:18:44 -0300 Subject: [PATCH 5/6] Update dependency: dcmjs@0.18.6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dcmjs * @ohif/core: 0.18.5 → 0.18.6 * @ohif/extension-cornerstone: 0.18.4 → 0.18.6 * @ohif/extension-dicom-html: 0.18.5 → 0.18.6 * @ohif/extension-dicom-rt: 0.18.5 → 0.18.6 * @ohif/extension-dicom-segmentation: 0.18.5 → 0.18.6 * @ohif/extension-dicom-tag-browser: 0.18.5 → 0.18.6 * @ohif/extension-vtk: 0.18.5 → 0.18.6 * @ohif/viewer: 0.18.5 → 0.18.6 --- extensions/cornerstone/package.json | 2 +- extensions/dicom-html/package.json | 2 +- extensions/dicom-rt/package.json | 2 +- extensions/dicom-segmentation/package.json | 2 +- extensions/dicom-tag-browser/package.json | 2 +- extensions/vtk/package.json | 2 +- platform/core/package.json | 2 +- platform/viewer/package.json | 2 +- platform/viewer/public/config/default.js | 6 +++--- yarn.lock | 8 ++++---- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 2b0352ccb58..05280ab0f4c 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -36,7 +36,7 @@ "cornerstone-math": "^0.1.8", "cornerstone-tools": "^4.20.1", "cornerstone-wado-image-loader": "^3.1.0", - "dcmjs": "0.18.4", + "dcmjs": "0.18.6", "dicom-parser": "^1.8.3", "hammerjs": "^2.0.8", "prop-types": "^15.6.2", diff --git a/extensions/dicom-html/package.json b/extensions/dicom-html/package.json index 92bcd6c0aa3..15bfcab5931 100644 --- a/extensions/dicom-html/package.json +++ b/extensions/dicom-html/package.json @@ -29,7 +29,7 @@ }, "peerDependencies": { "@ohif/core": "^0.50.0", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "prop-types": "^15.6.2", "react": "^16.8.6", "react-dom": "^16.8.6" diff --git a/extensions/dicom-rt/package.json b/extensions/dicom-rt/package.json index 2b1a04deac8..54897f27b3b 100644 --- a/extensions/dicom-rt/package.json +++ b/extensions/dicom-rt/package.json @@ -31,7 +31,7 @@ "@ohif/core": "^0.50.0", "cornerstone-core": "^2.2.8", "cornerstone-tools": "^4.20.1", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "gl-matrix": "^3.3.0", "prop-types": "^15.6.2", "react": "^16.8.6", diff --git a/extensions/dicom-segmentation/package.json b/extensions/dicom-segmentation/package.json index 6c95189652f..625113f2e8d 100644 --- a/extensions/dicom-segmentation/package.json +++ b/extensions/dicom-segmentation/package.json @@ -31,7 +31,7 @@ "@ohif/core": "^0.50.0", "cornerstone-core": "^2.2.8", "cornerstone-tools": "^4.20.1", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "prop-types": "^15.6.2", "react": "^16.8.6", "react-dom": "^16.8.6" diff --git a/extensions/dicom-tag-browser/package.json b/extensions/dicom-tag-browser/package.json index d6325359108..bc3b824d9b7 100644 --- a/extensions/dicom-tag-browser/package.json +++ b/extensions/dicom-tag-browser/package.json @@ -28,7 +28,7 @@ }, "peerDependencies": { "@ohif/core": "^2.6.0", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "react": "^16.8.6" }, "dependencies": { diff --git a/extensions/vtk/package.json b/extensions/vtk/package.json index e77cd8de841..8b40c48fc51 100644 --- a/extensions/vtk/package.json +++ b/extensions/vtk/package.json @@ -35,7 +35,7 @@ "cornerstone-core": "^2.2.8", "cornerstone-tools": "^4.20.1", "cornerstone-wado-image-loader": "^3.1.0", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "dicom-parser": "^1.8.3", "i18next": "^17.0.3", "i18next-browser-languagedetector": "^3.0.1", diff --git a/platform/core/package.json b/platform/core/package.json index 4c76f2cbdff..a607c46f7f0 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -39,7 +39,7 @@ "dependencies": { "@babel/runtime": "^7.5.5", "ajv": "^6.10.0", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "dicomweb-client": "^0.6.0", "immer": "6.0.2", "isomorphic-base64": "^1.0.2", diff --git a/platform/viewer/package.json b/platform/viewer/package.json index 85bef6041a2..e13418c1db1 100644 --- a/platform/viewer/package.json +++ b/platform/viewer/package.json @@ -68,7 +68,7 @@ "cornerstone-math": "^0.1.8", "cornerstone-tools": "^4.20.1", "cornerstone-wado-image-loader": "^3.1.0", - "dcmjs": "0.18.5", + "dcmjs": "0.18.6", "dicom-parser": "^1.8.3", "dicomweb-client": "^0.4.4", "hammerjs": "^2.0.8", diff --git a/platform/viewer/public/config/default.js b/platform/viewer/public/config/default.js index 891a595294c..3338c66790d 100644 --- a/platform/viewer/public/config/default.js +++ b/platform/viewer/public/config/default.js @@ -8,9 +8,9 @@ window.config = { dicomWeb: [ { name: 'DCM4CHEE', - wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado', - qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', - wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', + wadoUriRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado', + qidoRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs', + wadoRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs', qidoSupportsIncludeField: true, imageRendering: 'wadors', thumbnailRendering: 'wadors', diff --git a/yarn.lock b/yarn.lock index 7d49192bb5a..760697ae706 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6619,10 +6619,10 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -dcmjs@0.18.5: - version "0.18.5" - resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.18.5.tgz#06edd5562a91fa1e6be3a9fd2fc919e103f44e6f" - integrity sha512-AWGFMwCdQg4C/hJIhnnWS4ieClnWMkVmV9sX29jpLYYMEb7QGBe1t9UsWvgBh1QiXePUh4u+zGFQk27duHB6rw== +dcmjs@0.18.6: + version "0.18.6" + resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.18.6.tgz#df2128eebd35c8a0b514eaca3b77dce9ac67ecb5" + integrity sha512-Ecc3NEf5cNrIJq3NIxhP2FuN3Eod3pB6YjiPZQOrYIksPc5T3L8pdhz+6Bpv0puSbEz2IMQ2p8ZVrIuYhoCOBg== dependencies: "@babel/polyfill" "^7.8.3" "@babel/runtime" "^7.8.4" From 109193b2d51fe54264ff0978fe749d87bbbb54c0 Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Thu, 22 Apr 2021 07:18:30 -0300 Subject: [PATCH 6/6] Rollback server config --- platform/viewer/public/config/default.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/viewer/public/config/default.js b/platform/viewer/public/config/default.js index 3338c66790d..891a595294c 100644 --- a/platform/viewer/public/config/default.js +++ b/platform/viewer/public/config/default.js @@ -8,9 +8,9 @@ window.config = { dicomWeb: [ { name: 'DCM4CHEE', - wadoUriRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado', - qidoRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs', - wadoRoot: 'http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs', + wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado', + qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', + wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', qidoSupportsIncludeField: true, imageRendering: 'wadors', thumbnailRendering: 'wadors',