122 lines
3.2 KiB
JavaScript
122 lines
3.2 KiB
JavaScript
import OHIF from 'ohif-core';
|
|
import * as dcmjs from 'dcmjs';
|
|
|
|
const { StackManager } = OHIF.utils;
|
|
|
|
function getDisplaySet(studies, studyInstanceUid, displaySetInstanceUid) {
|
|
const study = studies.find(
|
|
study => study.studyInstanceUid === studyInstanceUid
|
|
);
|
|
|
|
const displaySet = study.displaySets.find(set => {
|
|
return set.displaySetInstanceUid === displaySetInstanceUid;
|
|
});
|
|
|
|
return displaySet;
|
|
}
|
|
|
|
function getDisplaySetsBySeries(studies, studyInstanceUid, seriesInstanceUid) {
|
|
const study = studies.find(
|
|
study => study.studyInstanceUid === studyInstanceUid
|
|
);
|
|
|
|
return study.displaySets.filter(set => {
|
|
return set.seriesInstanceUid === seriesInstanceUid;
|
|
});
|
|
}
|
|
|
|
function getCornerstoneStack(studies, studyInstanceUid, displaySetInstanceUid) {
|
|
const study = studies.find(
|
|
study => study.studyInstanceUid === studyInstanceUid
|
|
);
|
|
|
|
// Create shortcut to displaySet
|
|
const displaySet = getDisplaySet(
|
|
studies,
|
|
studyInstanceUid,
|
|
displaySetInstanceUid
|
|
);
|
|
|
|
// Get stack from Stack Manager
|
|
const stack = StackManager.findOrCreateStack(study, displaySet);
|
|
|
|
// Clone the stack here so we don't mutate it later
|
|
const stackClone = Object.assign({}, stack);
|
|
stackClone.currentImageIdIndex = 0;
|
|
|
|
return stackClone;
|
|
}
|
|
|
|
function retrieveDicomData(wadoUri) {
|
|
// TODO: Authorization header depends on the server. If we ever have multiple servers
|
|
// we will need to figure out how / when to pass this information in.
|
|
return fetch(wadoUri, {
|
|
headers: OHIF.DICOMWeb.getAuthorizationHeader()
|
|
}).then(response => response.arrayBuffer());
|
|
}
|
|
|
|
async function handleSegmentationStorage(
|
|
studies,
|
|
studyInstanceUid,
|
|
displaySetInstanceUid
|
|
) {
|
|
const study = studies.find(
|
|
study => study.studyInstanceUid === studyInstanceUid
|
|
);
|
|
const displaySet = getDisplaySet(
|
|
studies,
|
|
studyInstanceUid,
|
|
displaySetInstanceUid
|
|
);
|
|
const segWadoUri = displaySet.images[0].getData().wadouri;
|
|
const arrayBuffer = await retrieveDicomData(segWadoUri);
|
|
const dicomData = dcmjs.data.DicomMessage.readFile(arrayBuffer);
|
|
const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(
|
|
dicomData.dict
|
|
);
|
|
|
|
const segments = dcmjs.adapters.VTKjs.Segmentation.generateSegments(dataset);
|
|
|
|
dataset._meta = dcmjs.data.DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
|
|
const seriesInstanceUid = dataset.ReferencedSeriesSequence.SeriesInstanceUID;
|
|
const displaySets = getDisplaySetsBySeries(
|
|
studies,
|
|
studyInstanceUid,
|
|
seriesInstanceUid
|
|
);
|
|
|
|
if (displaySets.length > 1) {
|
|
console.warn(
|
|
'More than one display set with the same seriesInstanceUid. This is not supported yet...'
|
|
);
|
|
}
|
|
|
|
const referenceDisplaySet = displaySets[0];
|
|
const imageIds = referenceDisplaySet.images.map(image => image.getImageId());
|
|
|
|
if (!results) {
|
|
throw new Error('Fractional segmentations are not supported');
|
|
}
|
|
|
|
const cachedStack = StackManager.findOrCreateStack(
|
|
study,
|
|
referenceDisplaySet
|
|
);
|
|
const stack = Object.assign({}, cachedStack);
|
|
stack.currentImageIdIndex = 0;
|
|
|
|
return {
|
|
referenceDataObject,
|
|
labelmapDataObject
|
|
}
|
|
|
|
return {
|
|
studyInstanceUid,
|
|
displaySetInstanceUid,
|
|
stack
|
|
};
|
|
}
|
|
|
|
export default handleSegmentationStorage;
|