This commit is contained in:
James A. Petts 2020-05-12 13:49:32 +01:00
parent b5cd7bb0b7
commit d5c83bf596
8 changed files with 122 additions and 63 deletions

View File

@ -8,9 +8,9 @@ import {
} from './qido.js'; } from './qido.js';
import { dicomMetadataStore, IWebApiDataSource, utils } from '@ohif/core'; import { dicomMetadataStore, IWebApiDataSource, utils } from '@ohif/core';
import * as dcmjs from 'dcmjs'; 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; const { urlUtil } = utils;
/** /**
@ -96,22 +96,40 @@ function createDicomWebApi(dicomWebConfig) {
); );
} }
// const promises = StudyInstanceUIDs.map(StudyInstanceUID => const storeInstances = instances => {
// retrieveStudyMetadata( const naturalizedInstances = instances.map(naturalizeDataset);
// wadoDicomWebClient,
// StudyInstanceUID, dicomMetadataStore.addInstances(naturalizedInstances);
// enableStudyLazyLoad 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. // TEMP use dummy data.
const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary; //const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
const instances = exampleInstances.map(naturalizeDataset); //const instances = exampleInstances.map(naturalizeDataset);
// TEMP // TEMP
dicomMetadataStore.addInstances(instances); //dicomMetadataStore.addInstances(instances);
callback(instances); //callback(instances);
}, },
}, },
}, },

View File

@ -1,4 +1,4 @@
import RetrieveMetadata from './services/wado/retrieveMetadata.js'; import RetrieveMetadata from './wado/retrieveMetadata.js';
const moduleName = 'RetrieveStudyMetadata'; const moduleName = 'RetrieveStudyMetadata';
// Cache for promises. Prevents unnecessary subsequent calls to the server // 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 {Object} server Object with server configuration parameters
* @param {string} StudyInstanceUID The UID of the Study to be retrieved * @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 {Object} [filters] - Object containing filters to be applied on retrieve metadata process
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against * @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 * @returns {Promise} that will be resolved with the metadata or rejected with the error

View File

@ -1,4 +1,4 @@
import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync'; //import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync';
import RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync'; import RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync';
/** /**
@ -17,10 +17,12 @@ async function RetrieveMetadata(
enableStudyLazyLoad, enableStudyLazyLoad,
filters = {} filters = {}
) { ) {
const RetrieveMetadataLoader = // const RetrieveMetadataLoader =
enableStudyLazyLoad !== false // enableStudyLazyLoad !== false
? RetrieveMetadataLoaderAsync // ? RetrieveMetadataLoaderAsync
: RetrieveMetadataLoaderSync; // : RetrieveMetadataLoaderSync;
const RetrieveMetadataLoader = RetrieveMetadataLoaderAsync;
const retrieveMetadataLoader = new RetrieveMetadataLoader( const retrieveMetadataLoader = new RetrieveMetadataLoader(
dicomWebClient, dicomWebClient,

View File

@ -14,7 +14,7 @@ export default class RetrieveMetadataLoader {
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
*/ */
constructor(client, studyInstanceUID, filters = {}) { constructor(client, studyInstanceUID, filters = {}) {
this.client = dicomwWebClient; this.client = client;
this.studyInstanceUID = studyInstanceUID; this.studyInstanceUID = studyInstanceUID;
this.filters = filters; this.filters = filters;
} }

View File

@ -1,10 +1,10 @@
import RetrieveMetadataLoader from './retrieveMetadataLoader'; import RetrieveMetadataLoader from './retrieveMetadataLoader';
import { sortStudySeries, sortingCriteria } from '../../sortStudy'; //import { sortStudySeries, sortingCriteria } from '../../sortStudy';
import getSeriesInfo from '../../getSeriesInfo'; import getSeriesInfo from './utils/getSeriesInfo';
import { // import {
createStudyFromSOPInstanceList, // createStudyFromSOPInstanceList,
addInstancesToStudy, // addInstancesToStudy,
} from './studyInstanceHelpers'; // } from './studyInstanceHelpers';
/** /**
* Map seriesList to an array of seriesInstanceUid * Map seriesList to an array of seriesInstanceUid
@ -15,18 +15,18 @@ function mapStudySeries(seriesList) {
return seriesList.map(series => getSeriesInfo(series).seriesInstanceUid); return seriesList.map(series => getSeriesInfo(series).seriesInstanceUid);
} }
function attachSeriesLoader(server, study, seriesLoader) { // function attachSeriesLoader(server, study, seriesLoader) {
study.seriesLoader = Object.freeze({ // study.seriesLoader = Object.freeze({
hasNext() { // hasNext() {
return seriesLoader.hasNext(); // return seriesLoader.hasNext();
}, // },
async next() { // async next() {
const series = await seriesLoader.next(); // const series = await seriesLoader.next();
await addInstancesToStudy(server, study, series.sopInstances); // await addInstancesToStudy(server, study, series.sopInstances);
return study.seriesMap[series.seriesInstanceUID]; // return study.seriesMap[series.seriesInstanceUID];
}, // },
}); // });
} // }
/** /**
* Creates an immutable series loader object which loads each series sequentially using the iterator interface * Creates an immutable series loader object which loads each series sequentially using the iterator interface
@ -46,11 +46,11 @@ function makeSeriesAsyncLoader(
}, },
async next() { async next() {
const seriesInstanceUID = seriesInstanceUIDList.shift(); const seriesInstanceUID = seriesInstanceUIDList.shift();
const sopInstances = await client.retrieveSeriesMetadata({ return client.retrieveSeriesMetadata({
studyInstanceUID, studyInstanceUID,
seriesInstanceUID, seriesInstanceUID,
}); });
return { studyInstanceUID, seriesInstanceUID, sopInstances }; // return { studyInstanceUID, seriesInstanceUID, sopInstances };
}, },
}); });
} }
@ -90,11 +90,14 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
const preLoaders = this.getPreLoaders(); const preLoaders = this.getPreLoaders();
const result = await this.runLoaders(preLoaders); const result = await this.runLoaders(preLoaders);
const seriesSorted = sortStudySeries( // const seriesSorted = sortStudySeries(
result, // result,
sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria // sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria
); // );
const seriesInstanceUidsMap = mapStudySeries(seriesSorted);
//const seriesInstanceUidsMap = mapStudySeries(seriesSorted);
const seriesInstanceUidsMap = mapStudySeries(result);
return seriesInstanceUidsMap; return seriesInstanceUidsMap;
} }
@ -108,24 +111,35 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
preLoadData preLoadData
); );
const firstSeries = await seriesAsyncLoader.next(); // const firstSeries = await seriesAsyncLoader.next();
return { // return {
sopInstances: firstSeries.sopInstances, // sopInstances: firstSeries.sopInstances,
asyncLoader: seriesAsyncLoader, // asyncLoader: seriesAsyncLoader,
}; // };
}
async posLoad(loadData) { const promises = [];
const { client } = this;
const { sopInstances, asyncLoader } = loadData;
const study = await createStudyFromSOPInstanceList(server, sopInstances); while (seriesAsyncLoader.hasNext()) {
promises.push(seriesAsyncLoader.next());
if (asyncLoader.hasNext()) {
attachSeriesLoader(server, study, asyncLoader);
} }
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;
} }
} }

View File

@ -1,5 +1,5 @@
import { api } from 'dicomweb-client'; // import { api } from 'dicomweb-client';
import DICOMWeb from '../../../DICOMWeb/'; // import DICOMWeb from '../../../DICOMWeb/';
import { createStudyFromSOPInstanceList } from './studyInstanceHelpers'; import { createStudyFromSOPInstanceList } from './studyInstanceHelpers';
import RetrieveMetadataLoader from './retrieveMetadataLoader'; import RetrieveMetadataLoader from './retrieveMetadataLoader';

View File

@ -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;
}

View File

@ -7,8 +7,6 @@ class DisplaySetManager {
this.extensionManager = extensionManager; this.extensionManager = extensionManager;
this.SOPClassHandlerIds = SOPClassHandlerIds; this.SOPClassHandlerIds = SOPClassHandlerIds;
debugger;
const { const {
displaySetInstanceUids, displaySetInstanceUids,
setDisplaySetInstanceUids, setDisplaySetInstanceUids,