From d5c83bf596ddbf35e902b71766d7b7b15ad0bbdd Mon Sep 17 00:00:00 2001 From: "James A. Petts" Date: Tue, 12 May 2020 13:49:32 +0100 Subject: [PATCH] WIP --- .../default/src/DicomWebDataSource/index.js | 44 ++++++--- .../retrieveStudyMetadata.js | 4 +- .../wado/retrieveMetadata.js | 12 ++- .../wado/retrieveMetadataLoader.js | 2 +- .../wado/retrieveMetadataLoaderAsync.js | 92 +++++++++++-------- .../wado/retrieveMetadataLoaderSync.js | 4 +- .../wado/utils/getSeriesInfo.js | 25 +++++ platform/core/src/displaySetManager.js | 2 - 8 files changed, 122 insertions(+), 63 deletions(-) create mode 100644 extensions/default/src/DicomWebDataSource/wado/utils/getSeriesInfo.js diff --git a/extensions/default/src/DicomWebDataSource/index.js b/extensions/default/src/DicomWebDataSource/index.js index fa2522166..e331dc0d9 100644 --- a/extensions/default/src/DicomWebDataSource/index.js +++ b/extensions/default/src/DicomWebDataSource/index.js @@ -8,9 +8,9 @@ import { } from './qido.js'; import { dicomMetadataStore, IWebApiDataSource, utils } from '@ohif/core'; import * as dcmjs from 'dcmjs'; -import exampleInstances from './exampleInstances.js'; -//import { retrieveStudyMetadata } from './retrieveStudyMetadata.js'; +import { retrieveStudyMetadata } from './retrieveStudyMetadata.js'; +const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary; const { urlUtil } = utils; /** @@ -96,22 +96,40 @@ function createDicomWebApi(dicomWebConfig) { ); } - // const promises = StudyInstanceUIDs.map(StudyInstanceUID => - // retrieveStudyMetadata( - // wadoDicomWebClient, - // StudyInstanceUID, - // enableStudyLazyLoad - // ) - // ); + const storeInstances = instances => { + const naturalizedInstances = instances.map(naturalizeDataset); + + dicomMetadataStore.addInstances(naturalizedInstances); + callback(naturalizedInstances); + }; + + const studyPromises = StudyInstanceUIDs.map(StudyInstanceUID => + retrieveStudyMetadata( + wadoDicomWebClient, + StudyInstanceUID, + enableStudyLazyLoad + ) + ); + + studyPromises.forEach(studyPromise => { + studyPromise.then(seriesPromises => { + seriesPromises.forEach(seriesPromise => { + seriesPromise.then(instances => { + debugger; + storeInstances(instances); + }); + }); + }); + }); // TEMP use dummy data. - const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary; - const instances = exampleInstances.map(naturalizeDataset); + //const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary; + //const instances = exampleInstances.map(naturalizeDataset); // TEMP - dicomMetadataStore.addInstances(instances); - callback(instances); + //dicomMetadataStore.addInstances(instances); + //callback(instances); }, }, }, diff --git a/extensions/default/src/DicomWebDataSource/retrieveStudyMetadata.js b/extensions/default/src/DicomWebDataSource/retrieveStudyMetadata.js index beb394a54..eb612cc2e 100644 --- a/extensions/default/src/DicomWebDataSource/retrieveStudyMetadata.js +++ b/extensions/default/src/DicomWebDataSource/retrieveStudyMetadata.js @@ -1,4 +1,4 @@ -import RetrieveMetadata from './services/wado/retrieveMetadata.js'; +import RetrieveMetadata from './wado/retrieveMetadata.js'; const moduleName = 'RetrieveStudyMetadata'; // Cache for promises. Prevents unnecessary subsequent calls to the server @@ -9,6 +9,8 @@ const StudyMetaDataPromises = new Map(); * * @param {Object} server Object with server configuration parameters * @param {string} StudyInstanceUID The UID of the Study to be retrieved + * @param {boolean} enabledStudyLazyLoad Whether the study metadata should be loaded asynchronusly. + * @param {function} storeInstancesCallback A callback used to store the retrieved instance metadata. * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against * @returns {Promise} that will be resolved with the metadata or rejected with the error diff --git a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadata.js b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadata.js index f0474708e..d0c8f9628 100644 --- a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadata.js +++ b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadata.js @@ -1,4 +1,4 @@ -import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync'; +//import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync'; import RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync'; /** @@ -17,10 +17,12 @@ async function RetrieveMetadata( enableStudyLazyLoad, filters = {} ) { - const RetrieveMetadataLoader = - enableStudyLazyLoad !== false - ? RetrieveMetadataLoaderAsync - : RetrieveMetadataLoaderSync; + // const RetrieveMetadataLoader = + // enableStudyLazyLoad !== false + // ? RetrieveMetadataLoaderAsync + // : RetrieveMetadataLoaderSync; + + const RetrieveMetadataLoader = RetrieveMetadataLoaderAsync; const retrieveMetadataLoader = new RetrieveMetadataLoader( dicomWebClient, diff --git a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js index b3222643a..664e59808 100644 --- a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js +++ b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js @@ -14,7 +14,7 @@ export default class RetrieveMetadataLoader { * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against */ constructor(client, studyInstanceUID, filters = {}) { - this.client = dicomwWebClient; + this.client = client; this.studyInstanceUID = studyInstanceUID; this.filters = filters; } diff --git a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderAsync.js b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderAsync.js index 791d78b70..194efc1d7 100644 --- a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderAsync.js +++ b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderAsync.js @@ -1,10 +1,10 @@ import RetrieveMetadataLoader from './retrieveMetadataLoader'; -import { sortStudySeries, sortingCriteria } from '../../sortStudy'; -import getSeriesInfo from '../../getSeriesInfo'; -import { - createStudyFromSOPInstanceList, - addInstancesToStudy, -} from './studyInstanceHelpers'; +//import { sortStudySeries, sortingCriteria } from '../../sortStudy'; +import getSeriesInfo from './utils/getSeriesInfo'; +// import { +// createStudyFromSOPInstanceList, +// addInstancesToStudy, +// } from './studyInstanceHelpers'; /** * Map seriesList to an array of seriesInstanceUid @@ -15,18 +15,18 @@ function mapStudySeries(seriesList) { return seriesList.map(series => getSeriesInfo(series).seriesInstanceUid); } -function attachSeriesLoader(server, study, seriesLoader) { - study.seriesLoader = Object.freeze({ - hasNext() { - return seriesLoader.hasNext(); - }, - async next() { - const series = await seriesLoader.next(); - await addInstancesToStudy(server, study, series.sopInstances); - return study.seriesMap[series.seriesInstanceUID]; - }, - }); -} +// function attachSeriesLoader(server, study, seriesLoader) { +// study.seriesLoader = Object.freeze({ +// hasNext() { +// return seriesLoader.hasNext(); +// }, +// async next() { +// const series = await seriesLoader.next(); +// await addInstancesToStudy(server, study, series.sopInstances); +// return study.seriesMap[series.seriesInstanceUID]; +// }, +// }); +// } /** * Creates an immutable series loader object which loads each series sequentially using the iterator interface @@ -46,11 +46,11 @@ function makeSeriesAsyncLoader( }, async next() { const seriesInstanceUID = seriesInstanceUIDList.shift(); - const sopInstances = await client.retrieveSeriesMetadata({ + return client.retrieveSeriesMetadata({ studyInstanceUID, seriesInstanceUID, }); - return { studyInstanceUID, seriesInstanceUID, sopInstances }; + // return { studyInstanceUID, seriesInstanceUID, sopInstances }; }, }); } @@ -90,11 +90,14 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader const preLoaders = this.getPreLoaders(); const result = await this.runLoaders(preLoaders); - const seriesSorted = sortStudySeries( - result, - sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria - ); - const seriesInstanceUidsMap = mapStudySeries(seriesSorted); + // const seriesSorted = sortStudySeries( + // result, + // sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria + // ); + + //const seriesInstanceUidsMap = mapStudySeries(seriesSorted); + + const seriesInstanceUidsMap = mapStudySeries(result); return seriesInstanceUidsMap; } @@ -108,24 +111,35 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader preLoadData ); - const firstSeries = await seriesAsyncLoader.next(); + // const firstSeries = await seriesAsyncLoader.next(); - return { - sopInstances: firstSeries.sopInstances, - asyncLoader: seriesAsyncLoader, - }; - } + // return { + // sopInstances: firstSeries.sopInstances, + // asyncLoader: seriesAsyncLoader, + // }; - async posLoad(loadData) { - const { client } = this; - const { sopInstances, asyncLoader } = loadData; + const promises = []; - const study = await createStudyFromSOPInstanceList(server, sopInstances); - - if (asyncLoader.hasNext()) { - attachSeriesLoader(server, study, asyncLoader); + while (seriesAsyncLoader.hasNext()) { + promises.push(seriesAsyncLoader.next()); } - return study; + return promises; + + // if (asyncLoader.hasNext()) { + } + + async posLoad(promises) { + return promises; + // const { client } = this; + // const { sopInstances, asyncLoader } = loadData; + + // const study = await createStudyFromSOPInstanceList(server, sopInstances); + + // if (asyncLoader.hasNext()) { + // attachSeriesLoader(server, study, asyncLoader); + // } + + // return study; } } diff --git a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderSync.js b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderSync.js index fe8a1adc6..0a53817e5 100644 --- a/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderSync.js +++ b/extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderSync.js @@ -1,5 +1,5 @@ -import { api } from 'dicomweb-client'; -import DICOMWeb from '../../../DICOMWeb/'; +// import { api } from 'dicomweb-client'; +// import DICOMWeb from '../../../DICOMWeb/'; import { createStudyFromSOPInstanceList } from './studyInstanceHelpers'; import RetrieveMetadataLoader from './retrieveMetadataLoader'; diff --git a/extensions/default/src/DicomWebDataSource/wado/utils/getSeriesInfo.js b/extensions/default/src/DicomWebDataSource/wado/utils/getSeriesInfo.js new file mode 100644 index 000000000..c59b573ea --- /dev/null +++ b/extensions/default/src/DicomWebDataSource/wado/utils/getSeriesInfo.js @@ -0,0 +1,25 @@ +import { DICOMWeb } from '@ohif/core'; +// import isLowPriorityModality from '../utils/isLowPriorityModality'; + +const INFO = Symbol('INFO'); + +/** + * Creates an object with processed series information and saves its reference + * inside the series object itself. + * @param {Object} series The raw series object + * @returns {Object} object containing some useful info from given series + */ +export default function getSeriesInfo(series) { + let info = series[INFO]; + if (!info) { + const modality = DICOMWeb.getString(series['00080060'], '').toUpperCase(); + info = Object.freeze({ + modality, + // isLowPriority: isLowPriorityModality(modality), // TODO -> We should do this in the series list level, not here. + seriesInstanceUid: DICOMWeb.getString(series['0020000E']), + seriesNumber: DICOMWeb.getNumber(series['00200011'], 0) || 0, + }); + series[INFO] = info; + } + return info; +} diff --git a/platform/core/src/displaySetManager.js b/platform/core/src/displaySetManager.js index c8467e8c8..845ebe3b3 100644 --- a/platform/core/src/displaySetManager.js +++ b/platform/core/src/displaySetManager.js @@ -7,8 +7,6 @@ class DisplaySetManager { this.extensionManager = extensionManager; this.SOPClassHandlerIds = SOPClassHandlerIds; - debugger; - const { displaySetInstanceUids, setDisplaySetInstanceUids,