fix: retrieveSeriesMetadata (#2703)

This commit is contained in:
James Petts authored and GitHub committed 2022-02-08 08:17:37 -05:00
1 parent 0e2c31939c
commit 509c41fbab
10 files changed
+455 -443

No files matched your search

@@ -1,69 +1,67 @@
import { DicomMetadataStore, IWebApiDataSource } from '@ohif/core'
import OHIF from '@ohif/core'
import { DicomMetadataStore, IWebApiDataSource } from '@ohif/core';
import OHIF from '@ohif/core';
import dcmjs from 'dcmjs';
const metadataProvider = OHIF.classes.MetadataProvider
const { EVENTS } = DicomMetadataStore
const metadataProvider = OHIF.classes.MetadataProvider;
const { EVENTS } = DicomMetadataStore;
// Sorting SR modalities to be at the end of series list
function customSort(seriesA, seriesB) {
const modalityA = seriesA.instances[0].Modality
const modalityB = seriesB.instances[0].Modality
const modalityA = seriesA.instances[0].Modality;
const modalityB = seriesB.instances[0].Modality;
if (modalityA === "SR") {
if (modalityA === 'SR') {
return +1;
}
if (modalityB === "SR") {
if (modalityB === 'SR') {
return -1;
}
return 0;
}
function createDicomLocalApi(dicomLocalConfig) {
const { name } = dicomLocalConfig
const { name } = dicomLocalConfig;
const implementation = {
initialize: ({ params, query }) => {
const { StudyInstanceUIDs: paramsStudyInstanceUIDs } = params
const queryStudyInstanceUIDs = query.get('StudyInstanceUIDs')
const { StudyInstanceUIDs: paramsStudyInstanceUIDs } = params;
const queryStudyInstanceUIDs = query.get('StudyInstanceUIDs');
const StudyInstanceUIDs =
queryStudyInstanceUIDs || paramsStudyInstanceUIDs
queryStudyInstanceUIDs || paramsStudyInstanceUIDs;
const StudyInstanceUIDsAsArray =
StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs)
? StudyInstanceUIDs
: [StudyInstanceUIDs]
: [StudyInstanceUIDs];
// Put SRs at the end of series list to make sure images are loaded first
StudyInstanceUIDsAsArray.forEach(StudyInstanceUID => {
const study = DicomMetadataStore.getStudy(StudyInstanceUID)
study.series = study.series.sort(customSort)
})
const study = DicomMetadataStore.getStudy(StudyInstanceUID);
study.series = study.series.sort(customSort);
});
return StudyInstanceUIDsAsArray
return StudyInstanceUIDsAsArray;
},
query: {
studies: {
mapParams: () => { },
search: (params) => {
const studyUIDs = DicomMetadataStore.getStudyInstanceUIDs()
mapParams: () => {},
search: params => {
const studyUIDs = DicomMetadataStore.getStudyInstanceUIDs();
return studyUIDs.map(StudyInstanceUID => {
let numInstances = 0
const modalities = new Set()
let numInstances = 0;
const modalities = new Set();
// Calculating the number of instances in the study and modalities
// present in the study
const study = DicomMetadataStore.getStudy(StudyInstanceUID)
const study = DicomMetadataStore.getStudy(StudyInstanceUID);
study.series.forEach(aSeries => {
numInstances += aSeries.instances.length
numInstances += aSeries.instances.length;
modalities.add(aSeries.Modality);
})
});
// first instance in the first series
const firstInstance = study?.series[0]?.instances[0]
const firstInstance = study?.series[0]?.instances[0];
if (firstInstance) {
return {
@@ -80,33 +78,75 @@ function createDicomLocalApi(dicomLocalConfig) {
NumInstances: numInstances,
};
}
})
});
},
processResults: () => {
console.debug(' DICOMLocal QUERY processResults')
console.debug(' DICOMLocal QUERY processResults');
},
},
series: {
// mapParams: mapParams.bind(),
search: () => {
console.debug(' DICOMLocal QUERY SERIES SEARCH')
console.debug(' DICOMLocal QUERY SERIES SEARCH');
},
},
instances: {
search: () => {
console.debug(' DICOMLocal QUERY instances SEARCH')
console.debug(' DICOMLocal QUERY instances SEARCH');
},
},
},
retrieve: {
series: {
metaData: () => {
console.debug(' DICOMLocal retrieve series metadata')
metaData: async ({ StudyInstanceUID, madeInClient = false } = {}) => {
if (!StudyInstanceUID) {
throw new Error(
'Unable to query for SeriesMetadata without StudyInstanceUID'
);
}
// Instances metadata already added via local upload
const study = DicomMetadataStore.getStudy(
StudyInstanceUID,
madeInClient
);
// Series metadata already added via local upload
DicomMetadataStore._broadcastEvent(EVENTS.SERIES_ADDED, {
StudyInstanceUID,
madeInClient,
});
study.series.forEach(aSeries => {
const { SeriesInstanceUID } = aSeries;
aSeries.instances.forEach(instance => {
const {
url: imageId,
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID,
} = instance;
// Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
metadataProvider.addImageIdToUIDs(imageId, {
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID,
});
});
DicomMetadataStore._broadcastEvent(EVENTS.INSTANCES_ADDED, {
StudyInstanceUID,
SeriesInstanceUID,
madeInClient,
});
});
},
},
},
store: {
dicom: (naturalizedReport) => {
dicom: naturalizedReport => {
const reportBlob = dcmjs.data.datasetToBlob(naturalizedReport);
//Create a URL for the binary.
@@ -114,91 +154,49 @@ function createDicomLocalApi(dicomLocalConfig) {
window.location.assign(objectUrl);
},
},
retrieveSeriesMetadata: async ({
StudyInstanceUID,
madeInClient = false,
} = {}) => {
if (!StudyInstanceUID) {
throw new Error(
'Unable to query for SeriesMetadata without StudyInstanceUID'
)
}
// Instances metadata already added via local upload
const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient)
// Series metadata already added via local upload
DicomMetadataStore._broadcastEvent(EVENTS.SERIES_ADDED, {
StudyInstanceUID,
madeInClient,
})
study.series.forEach((aSeries) => {
const { SeriesInstanceUID } = aSeries
aSeries.instances.forEach((instance) => {
const {
url: imageId,
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID,
} = instance
// Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
metadataProvider.addImageIdToUIDs(imageId, {
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID,
})
})
DicomMetadataStore._broadcastEvent(EVENTS.INSTANCES_ADDED, {
StudyInstanceUID,
SeriesInstanceUID,
madeInClient,
})
})
},
getImageIdsForDisplaySet(displaySet) {
const images = displaySet.images
const imageIds = []
const images = displaySet.images;
const imageIds = [];
if (!images) {
return imageIds
return imageIds;
}
displaySet.images.forEach((instance) => {
const NumberOfFrames = instance.NumberOfFrames
displaySet.images.forEach(instance => {
const NumberOfFrames = instance.NumberOfFrames;
if (NumberOfFrames > 1) {
for (let i = 0; i < NumberOfFrames; i++) {
const imageId = this.getImageIdsForInstance({
instance,
frame: i,
})
imageIds.push(imageId)
});
imageIds.push(imageId);
}
} else {
const imageId = this.getImageIdsForInstance({ instance })
imageIds.push(imageId)
const imageId = this.getImageIdsForInstance({ instance });
imageIds.push(imageId);
}
})
});
return imageIds
return imageIds;
},
getImageIdsForInstance({ instance, frame }) {
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance
const storedInstance = DicomMetadataStore.getInstance(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID)
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
const storedInstance = DicomMetadataStore.getInstance(
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID
);
if (storedInstance.url) {
return storedInstance.url
return storedInstance.url;
}
},
deleteStudyMetadataPromise() {
console.log("deleteStudyMetadataPromise not implemented")
}
}
return IWebApiDataSource.create(implementation)
console.log('deleteStudyMetadataPromise not implemented');
},
};
return IWebApiDataSource.create(implementation);
}
export { createDicomLocalApi }
export { createDicomLocalApi };