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';
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);
},
},
},

View File

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

View File

@ -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,

View File

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

View File

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

View File

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

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.SOPClassHandlerIds = SOPClassHandlerIds;
debugger;
const {
displaySetInstanceUids,
setDisplaySetInstanceUids,