fix: retrieveSeriesMetadata (#2703)
This commit is contained in:
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 };
|
||||
Reference in new issue
Block a user