2020-07-24 12:51:57 +02:00
|
|
|
import dcmjs from 'dcmjs';
|
|
|
|
|
import { studies } from '@ohif/core';
|
2020-05-11 18:56:46 +02:00
|
|
|
import RetrieveMetadataLoader from './retrieveMetadataLoader';
|
|
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
const { sortStudySeries, sortingCriteria } = studies;
|
|
|
|
|
|
2020-05-11 18:56:46 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an immutable series loader object which loads each series sequentially using the iterator interface
|
|
|
|
|
* @param {DICOMWebClient} dicomWebClient The DICOMWebClient instance to be used for series load
|
|
|
|
|
* @param {string} studyInstanceUID The Study Instance UID from which series will be loaded
|
|
|
|
|
* @param {Array} seriesInstanceUIDList A list of Series Instance UIDs
|
|
|
|
|
* @returns {Object} Returns an object which supports loading of instances from each of given Series Instance UID
|
|
|
|
|
*/
|
|
|
|
|
function makeSeriesAsyncLoader(
|
|
|
|
|
client,
|
|
|
|
|
studyInstanceUID,
|
|
|
|
|
seriesInstanceUIDList
|
|
|
|
|
) {
|
|
|
|
|
return Object.freeze({
|
|
|
|
|
hasNext() {
|
|
|
|
|
return seriesInstanceUIDList.length > 0;
|
|
|
|
|
},
|
|
|
|
|
async next() {
|
|
|
|
|
const seriesInstanceUID = seriesInstanceUIDList.shift();
|
2020-05-12 14:49:32 +02:00
|
|
|
return client.retrieveSeriesMetadata({
|
2020-05-11 18:56:46 +02:00
|
|
|
studyInstanceUID,
|
|
|
|
|
seriesInstanceUID,
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class for async load of study metadata.
|
|
|
|
|
* It inherits from RetrieveMetadataLoader
|
|
|
|
|
*
|
|
|
|
|
* It loads the one series and then append to seriesLoader the others to be consumed/loaded
|
|
|
|
|
*/
|
|
|
|
|
export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {
|
|
|
|
|
/**
|
|
|
|
|
* @returns {Array} Array of preLoaders. To be consumed as queue
|
|
|
|
|
*/
|
|
|
|
|
*getPreLoaders() {
|
|
|
|
|
const preLoaders = [];
|
|
|
|
|
const {
|
|
|
|
|
studyInstanceUID,
|
|
|
|
|
filters: { seriesInstanceUID } = {},
|
|
|
|
|
client,
|
|
|
|
|
} = this;
|
|
|
|
|
|
|
|
|
|
if (seriesInstanceUID) {
|
|
|
|
|
const options = {
|
|
|
|
|
studyInstanceUID,
|
|
|
|
|
queryParams: { SeriesInstanceUID: seriesInstanceUID },
|
|
|
|
|
};
|
|
|
|
|
preLoaders.push(client.searchForSeries.bind(client, options));
|
|
|
|
|
}
|
|
|
|
|
// Fallback preloader
|
|
|
|
|
preLoaders.push(client.searchForSeries.bind(client, { studyInstanceUID }));
|
|
|
|
|
|
|
|
|
|
yield* preLoaders;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async preLoad() {
|
|
|
|
|
const preLoaders = this.getPreLoaders();
|
|
|
|
|
const result = await this.runLoaders(preLoaders);
|
|
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
|
|
|
|
|
const naturalized = result.map(naturalizeDataset);
|
2020-05-12 14:49:32 +02:00
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
return sortStudySeries(
|
|
|
|
|
naturalized,
|
|
|
|
|
sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria
|
|
|
|
|
);
|
2020-05-11 18:56:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async load(preLoadData) {
|
|
|
|
|
const { client, studyInstanceUID } = this;
|
|
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
const seriesInstanceUIDs = preLoadData.map(s => s.SeriesInstanceUID);
|
|
|
|
|
|
2020-05-11 18:56:46 +02:00
|
|
|
const seriesAsyncLoader = makeSeriesAsyncLoader(
|
|
|
|
|
client,
|
|
|
|
|
studyInstanceUID,
|
2020-07-24 12:51:57 +02:00
|
|
|
seriesInstanceUIDs
|
2020-05-11 18:56:46 +02:00
|
|
|
);
|
|
|
|
|
|
2020-05-12 14:49:32 +02:00
|
|
|
const promises = [];
|
|
|
|
|
|
|
|
|
|
while (seriesAsyncLoader.hasNext()) {
|
|
|
|
|
promises.push(seriesAsyncLoader.next());
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
return {
|
|
|
|
|
preLoadData,
|
|
|
|
|
promises,
|
|
|
|
|
};
|
2020-05-11 18:56:46 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-24 12:51:57 +02:00
|
|
|
async posLoad({ preLoadData, promises }) {
|
|
|
|
|
return {
|
|
|
|
|
preLoadData,
|
|
|
|
|
promises,
|
|
|
|
|
};
|
2020-05-11 18:56:46 +02:00
|
|
|
}
|
|
|
|
|
}
|