feat(url): Add SeriesInstanceUIDs wado query param (#3746)

This commit is contained in:
Igor Octaviano 2023-11-15 11:37:09 -03:00 committed by GitHub
parent 013068bcb0
commit b694228dd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 114 additions and 24 deletions

View File

@ -1,3 +1,4 @@
import retrieveMetadataFiltered from './utils/retrieveMetadataFiltered.js';
import RetrieveMetadata from './wado/retrieveMetadata.js'; import RetrieveMetadata from './wado/retrieveMetadata.js';
const moduleName = 'RetrieveStudyMetadata'; const moduleName = 'RetrieveStudyMetadata';
@ -5,14 +6,17 @@ const moduleName = 'RetrieveStudyMetadata';
const StudyMetaDataPromises = new Map(); const StudyMetaDataPromises = new Map();
/** /**
* Retrieves study metadata * Retrieves study metadata.
* *
* @param {Object} server Object with server configuration parameters * @param {Object} dicomWebClient The DICOMWebClient instance to be used for series load
* @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 asynchronously. * @param {boolean} enableStudyLazyLoad Whether the study metadata should be loaded asynchronously.
* @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} [filters.seriesInstanceUID] Series instance uid to filter results against
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against * @param {array} [filters.SeriesInstanceUIDs] Series instance uids to filter results against
* @param {function} [sortCriteria] Sort criteria function
* @param {function} [sortFunction] Sort function
*
* @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
*/ */
export function retrieveStudyMetadata( export function retrieveStudyMetadata(
@ -39,8 +43,20 @@ export function retrieveStudyMetadata(
return StudyMetaDataPromises.get(StudyInstanceUID); return StudyMetaDataPromises.get(StudyInstanceUID);
} }
let promise;
if (filters && filters.SeriesInstanceUIDs) {
promise = retrieveMetadataFiltered(
dicomWebClient,
StudyInstanceUID,
enableStudyLazyLoad,
filters,
sortCriteria,
sortFunction
);
} else {
// Create a promise to handle the data retrieval // Create a promise to handle the data retrieval
const promise = new Promise((resolve, reject) => { promise = new Promise((resolve, reject) => {
RetrieveMetadata( RetrieveMetadata(
dicomWebClient, dicomWebClient,
StudyInstanceUID, StudyInstanceUID,
@ -52,6 +68,7 @@ export function retrieveStudyMetadata(
resolve(data); resolve(data);
}, reject); }, reject);
}); });
}
// Store the promise in cache // Store the promise in cache
StudyMetaDataPromises.set(StudyInstanceUID, promise); StudyMetaDataPromises.set(StudyInstanceUID, promise);
@ -61,10 +78,9 @@ export function retrieveStudyMetadata(
/** /**
* Delete the cached study metadata retrieval promise to ensure that the browser will * Delete the cached study metadata retrieval promise to ensure that the browser will
* re-retrieve the study metadata when it is next requested * re-retrieve the study metadata when it is next requested.
* *
* @param {String} StudyInstanceUID The UID of the Study to be removed from cache * @param {String} StudyInstanceUID The UID of the Study to be removed from cache
*
*/ */
export function deleteStudyMetadataPromise(StudyInstanceUID) { export function deleteStudyMetadataPromise(StudyInstanceUID) {
if (StudyMetaDataPromises.has(StudyInstanceUID)) { if (StudyMetaDataPromises.has(StudyInstanceUID)) {

View File

@ -0,0 +1,56 @@
import RetrieveMetadata from '../wado/retrieveMetadata';
/**
* Retrieve metadata filtered.
*
* @param {*} dicomWebClient The DICOMWebClient instance to be used for series load
* @param {*} StudyInstanceUID The UID of the Study to be retrieved
* @param {*} enableStudyLazyLoad Whether the study metadata should be loaded asynchronously
* @param {object} filters Object containing filters to be applied on retrieve metadata process
* @param {string} [filters.seriesInstanceUID] Series instance uid to filter results against
* @param {array} [filters.SeriesInstanceUIDs] Series instance uids to filter results against
* @param {function} [sortCriteria] Sort criteria function
* @param {function} [sortFunction] Sort function
*
* @returns
*/
function retrieveMetadataFiltered(
dicomWebClient,
StudyInstanceUID,
enableStudyLazyLoad,
filters,
sortCriteria,
sortFunction
) {
const { SeriesInstanceUIDs } = filters;
return new Promise((resolve, reject) => {
const promises = SeriesInstanceUIDs.map(uid => {
const seriesSpecificFilters = Object.assign({}, filters, {
seriesInstanceUID: uid,
});
return RetrieveMetadata(
dicomWebClient,
StudyInstanceUID,
enableStudyLazyLoad,
seriesSpecificFilters,
sortCriteria,
sortFunction
);
});
Promise.all(promises).then(results => {
const aggregatedResult = { preLoadData: [], promises: [] };
results.forEach(({ preLoadData, promises }) => {
aggregatedResult.preLoadData = aggregatedResult.preLoadData.concat(preLoadData);
aggregatedResult.promises = aggregatedResult.promises.concat(promises);
});
resolve(aggregatedResult);
}, reject);
});
}
export default retrieveMetadataFiltered;

View File

@ -5,15 +5,20 @@ import RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync';
* Retrieve Study metadata from a DICOM server. If the server is configured to use lazy load, only the first series * Retrieve Study metadata from a DICOM server. If the server is configured to use lazy load, only the first series
* will be loaded and the property "studyLoader" will be set to let consumer load remaining series as needed. * will be loaded and the property "studyLoader" will be set to let consumer load remaining series as needed.
* *
* @param {Object} dicomWebClient The dicomweb-client. * @param {*} dicomWebClient The DICOMWebClient instance to be used for series load
* @param {string} studyInstanceUid The Study Instance UID of the study which needs to be loaded * @param {*} StudyInstanceUID The UID of the Study to be retrieved
* @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process * @param {*} enableStudyLazyLoad Whether the study metadata should be loaded asynchronously
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against * @param {object} filters Object containing filters to be applied on retrieve metadata process
* @returns {Object} A study descriptor object * @param {string} [filters.seriesInstanceUID] Series instance uid to filter results against
* @param {array} [filters.SeriesInstanceUIDs] Series instance uids to filter results against
* @param {function} [sortCriteria] Sort criteria function
* @param {function} [sortFunction] Sort function
*
* @returns {Promise} A promises that resolves the study descriptor object
*/ */
async function RetrieveMetadata( async function RetrieveMetadata(
dicomWebClient, dicomWebClient,
studyInstanceUid, StudyInstanceUID,
enableStudyLazyLoad, enableStudyLazyLoad,
filters = {}, filters = {},
sortCriteria, sortCriteria,
@ -24,7 +29,7 @@ async function RetrieveMetadata(
const retrieveMetadataLoader = new RetrieveMetadataLoader( const retrieveMetadataLoader = new RetrieveMetadataLoader(
dicomWebClient, dicomWebClient,
studyInstanceUid, StudyInstanceUID,
filters, filters,
sortCriteria, sortCriteria,
sortFunction sortFunction

View File

@ -3,10 +3,12 @@ import { sortStudySeries, sortingCriteria } from '@ohif/core/src/utils/sortStudy
import RetrieveMetadataLoader from './retrieveMetadataLoader'; import RetrieveMetadataLoader from './retrieveMetadataLoader';
/** /**
* 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.
*
* @param {DICOMWebClient} dicomWebClient The DICOMWebClient instance to be used for series load * @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 {string} studyInstanceUID The Study Instance UID from which series will be loaded
* @param {Array} seriesInstanceUIDList A list of Series Instance UIDs * @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 * @returns {Object} Returns an object which supports loading of instances from each of given Series Instance UID
*/ */
function makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDList) { function makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDList) {

View File

@ -120,7 +120,7 @@ values.
::: :::
### SeriesInstanceUID and initialSeriesInstanceUID ### SeriesInstanceUID, SeriesInstanceUIDs and initialSeriesInstanceUID
Sometimes you need to only retrieve a specific series in a study, you can do Sometimes you need to only retrieve a specific series in a study, you can do
that by providing series level QIDO query parameters in the URL such as that by providing series level QIDO query parameters in the URL such as
@ -134,6 +134,17 @@ http://localhost:3000/viewer?StudyInstanceUIDs=1.3.6.1.4.1.25403.345050719074.38
This will only open the viewer with one series (one displaySet) loaded, and no This will only open the viewer with one series (one displaySet) loaded, and no
queries made for any other series. queries made for any other series.
Sometimes you need to only retrieve a subset of series in a study, you can do
that by providing study level wado query parameters in the URL such as
SeriesInstanceUIDs. For example:
```js
http://localhost:3000/viewer?StudyInstanceUIDs=1.3.6.1.4.1.25403.345050719074.3824.20170125113417.1&SeriesInstanceUIDs=1.3.6.1.4.1.25403.345050719074.3824.20170125113545.4,1.3.6.1.4.1.25403.345050719074.3824.20170125113545.5
```
This will only open the viewer with two series (two displaySets) loaded, and no
queries made for any other series.
Alternatively, sometimes you want to just open the study on a specified series Alternatively, sometimes you want to just open the study on a specified series
and/or display a particular sop instance, which you can accomplish using: and/or display a particular sop instance, which you can accomplish using:
`initialSeriesInstanceUID` and/or `initialSOPInstanceUID` `initialSeriesInstanceUID` and/or `initialSOPInstanceUID`