131 lines
3.4 KiB
JavaScript
131 lines
3.4 KiB
JavaScript
import * as dcmjs from "dcmjs";
|
|
|
|
import OHIF from "@ohif/core";
|
|
import cornerstone from "cornerstone-core";
|
|
import cornerstoneTools from "cornerstone-tools";
|
|
|
|
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 parseSeg(arrayBuffer, imageIds) {
|
|
return dcmjs.adapters.Cornerstone.Segmentation.generateToolState(
|
|
imageIds,
|
|
arrayBuffer,
|
|
cornerstone.metaData
|
|
);
|
|
}
|
|
|
|
function addSegMetadataToCornerstoneToolState(
|
|
segMetadata,
|
|
toolState,
|
|
displaySetInstanceUid
|
|
) {
|
|
cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(
|
|
toolState
|
|
);
|
|
|
|
const brushModule = cornerstoneTools.store.modules.brush;
|
|
|
|
for (let i = 0; i < segMetadata.length; i++) {
|
|
brushModule.setters.metadata(displaySetInstanceUid, i, segMetadata[i]);
|
|
}
|
|
}
|
|
|
|
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
|
|
);
|
|
|
|
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());
|
|
const results = parseSeg(arrayBuffer, imageIds);
|
|
|
|
if (!results) {
|
|
throw new Error("Fractional segmentations are not supported");
|
|
}
|
|
|
|
const { segMetadata, toolState } = results;
|
|
|
|
segMetadata.seriesInstanceUid = seriesInstanceUid;
|
|
|
|
addSegMetadataToCornerstoneToolState(
|
|
segMetadata,
|
|
toolState,
|
|
displaySetInstanceUid
|
|
);
|
|
|
|
const cachedStack = StackManager.findOrCreateStack(
|
|
study,
|
|
referenceDisplaySet
|
|
);
|
|
const stack = Object.assign({}, cachedStack);
|
|
stack.currentImageIdIndex = 0;
|
|
|
|
return {
|
|
studyInstanceUid,
|
|
displaySetInstanceUid,
|
|
stack
|
|
};
|
|
}
|
|
|
|
export default handleSegmentationStorage;
|