150 lines
3.7 KiB
JavaScript
150 lines
3.7 KiB
JavaScript
import OHIF from 'ohif-core';
|
|
import * as dcmjs from 'dcmjs';
|
|
import { api } from 'dicomweb-client';
|
|
|
|
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(
|
|
studyInstanceUID,
|
|
seriesInstanceUID,
|
|
sopInstanceUID,
|
|
wadoRoot
|
|
) {
|
|
const config = {
|
|
url: wadoRoot,
|
|
headers: DICOMWeb.getAuthorizationHeader()
|
|
};
|
|
|
|
const dicomWeb = new api.DICOMwebClient(config);
|
|
const options = {
|
|
studyInstanceUID,
|
|
seriesInstanceUID,
|
|
sopInstanceUID
|
|
};
|
|
|
|
return dicomWeb.retrieveInstance(options);
|
|
}
|
|
|
|
async function handleSegmentationStorage(
|
|
studies,
|
|
studyInstanceUid,
|
|
displaySetInstanceUid
|
|
) {
|
|
const study = studies.find(
|
|
study => study.studyInstanceUid === studyInstanceUid
|
|
);
|
|
const displaySet = getDisplaySet(
|
|
studies,
|
|
studyInstanceUid,
|
|
displaySetInstanceUid
|
|
);
|
|
|
|
// TODO: This is terrible but we need to use WADO-RS or we can't retrieve the SEG
|
|
// from google cloud
|
|
const wadoRoot = displaySet.images[0].getData().wadoRoot;
|
|
|
|
const StudyInstanceUID = displaySet.images[0].getStudyInstanceUID();
|
|
const SeriesInstanceUID = displaySet.images[0].getSeriesInstanceUID();
|
|
const SOPInstanceUID = displaySet.images[0].getSOPInstanceUID();
|
|
|
|
const arrayBuffer = await retrieveDicomData(
|
|
StudyInstanceUID,
|
|
SeriesInstanceUID,
|
|
SOPInstanceUID,
|
|
wadoRoot
|
|
);
|
|
|
|
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;
|