UNPKG

@cornerstonejs/dicom-image-loader

Version:

Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file

237 lines (236 loc) 9.8 kB
import { Enums, metaData } from '@cornerstonejs/core'; import * as dicomParser from 'dicom-parser'; import getNumberValues from './getNumberValues'; import parseImageId from '../parseImageId'; import dataSetCacheManager from '../dataSetCacheManager'; import getImagePixelModule from './getImagePixelModule'; import getOverlayPlaneModule from './getOverlayPlaneModule'; import getLUTs from './getLUTs'; import getModalityLUTOutputPixelRepresentation from './getModalityLUTOutputPixelRepresentation'; import { getDirectFrameInformation } from '../combineFrameInstanceDataset'; import multiframeDataset from '../retrieveMultiframeDataset'; import { getImageTypeSubItemFromDataset, extractOrientationFromDataset, extractPositionFromDataset, extractSpacingFromDataset, extractSliceThicknessFromDataset, } from './extractPositioningFromDataset'; import isNMReconstructable from '../../isNMReconstructable'; import { instanceModuleNames } from '../../getInstanceModule'; import { getUSEnhancedRegions } from './USHelpers'; function metaDataProvider(type, imageId) { const { MetadataModules } = Enums; if (Array.isArray(imageId)) { return; } const parsedImageId = parseImageId(imageId); if (type === MetadataModules.MULTIFRAME) { const multiframeData = multiframeDataset.retrieveMultiframeDataset(parsedImageId.url); if (!multiframeData.dataSet) { return; } const multiframeInfo = getDirectFrameInformation(multiframeData.dataSet, multiframeData.frame); return multiframeInfo; } let url = parsedImageId.url; if (parsedImageId.frame) { url = `${url}&frame=${parsedImageId.frame}`; } const dataSet = dataSetCacheManager.get(url); if (!dataSet) { return; } return metadataForDataset(type, imageId, dataSet); } export function metadataForDataset(type, imageId, dataSet) { const { MetadataModules } = Enums; if (type === MetadataModules.GENERAL_STUDY) { return { studyDescription: dataSet.string('x00081030'), studyDate: dicomParser.parseDA(dataSet.string('x00080020')), studyTime: dicomParser.parseTM(dataSet.string('x00080030') || ''), accessionNumber: dataSet.string('x00080050'), }; } if (type === MetadataModules.GENERAL_SERIES) { return { modality: dataSet.string('x00080060'), seriesInstanceUID: dataSet.string('x0020000e'), seriesDescription: dataSet.string('x0008103e'), seriesNumber: dataSet.intString('x00200011'), studyInstanceUID: dataSet.string('x0020000d'), seriesDate: dicomParser.parseDA(dataSet.string('x00080021')), seriesTime: dicomParser.parseTM(dataSet.string('x00080031') || ''), acquisitionDate: dicomParser.parseDA(dataSet.string('x00080022')), acquisitionTime: dicomParser.parseTM(dataSet.string('x00080032') || ''), }; } if (type === MetadataModules.GENERAL_IMAGE) { return { sopInstanceUID: dataSet.string('x00080018'), instanceNumber: dataSet.intString('x00200013'), lossyImageCompression: dataSet.string('x00282110'), lossyImageCompressionRatio: dataSet.floatString('x00282112'), lossyImageCompressionMethod: dataSet.string('x00282114'), }; } if (type === MetadataModules.PATIENT) { return { patientID: dataSet.string('x00100020'), patientName: dataSet.string('x00100010'), }; } if (type === MetadataModules.PATIENT_STUDY) { return { patientAge: dataSet.intString('x00101010'), patientSize: dataSet.floatString('x00101020'), patientSex: dataSet.string('x00100040'), patientWeight: dataSet.floatString('x00101030'), }; } if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) { const modality = dataSet.string('x00080060'); const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2); return { modality, imageType: dataSet.string('x00080008'), imageSubType, imageOrientationPatient: extractOrientationFromDataset(dataSet), imagePositionPatient: extractPositionFromDataset(dataSet), sliceThickness: extractSliceThicknessFromDataset(dataSet), pixelSpacing: extractSpacingFromDataset(dataSet), numberOfFrames: dataSet.uint16('x00280008'), isNMReconstructable: isNMReconstructable(imageSubType) && modality.includes('NM'), }; } if (type === MetadataModules.IMAGE_PLANE) { const imageOrientationPatient = extractOrientationFromDataset(dataSet); const imagePositionPatient = extractPositionFromDataset(dataSet); const pixelSpacing = extractSpacingFromDataset(dataSet); const sliceThickness = extractSliceThicknessFromDataset(dataSet); let columnPixelSpacing = null; let rowPixelSpacing = null; let usingDefaultValues = false; if (pixelSpacing) { rowPixelSpacing = pixelSpacing[0]; columnPixelSpacing = pixelSpacing[1]; } else { usingDefaultValues = true; rowPixelSpacing = 1; columnPixelSpacing = 1; } let rowCosines = null; let columnCosines = null; if (imageOrientationPatient) { rowCosines = [ parseFloat(imageOrientationPatient[0]), parseFloat(imageOrientationPatient[1]), parseFloat(imageOrientationPatient[2]), ]; columnCosines = [ parseFloat(imageOrientationPatient[3]), parseFloat(imageOrientationPatient[4]), parseFloat(imageOrientationPatient[5]), ]; } return { frameOfReferenceUID: dataSet.string('x00200052'), rows: dataSet.uint16('x00280010'), columns: dataSet.uint16('x00280011'), imageOrientationPatient, rowCosines, columnCosines, imagePositionPatient, sliceThickness, sliceLocation: dataSet.floatString('x00201041'), pixelSpacing, rowPixelSpacing, columnPixelSpacing, usingDefaultValues, }; } if (type === MetadataModules.CINE) { return { frameTime: dataSet.floatString('x00181063'), }; } if (type === MetadataModules.IMAGE_PIXEL) { return getImagePixelModule(dataSet); } if (type === MetadataModules.VOI_LUT) { const modalityLUTOutputPixelRepresentation = getModalityLUTOutputPixelRepresentation(dataSet); return { windowCenter: getNumberValues(dataSet, 'x00281050', 1), windowWidth: getNumberValues(dataSet, 'x00281051', 1), voiLUTSequence: getLUTs(modalityLUTOutputPixelRepresentation, dataSet.elements.x00283010), voiLUTFunction: dataSet.string('x00281056'), }; } if (type === MetadataModules.MODALITY_LUT) { return { rescaleIntercept: dataSet.floatString('x00281052'), rescaleSlope: dataSet.floatString('x00281053'), rescaleType: dataSet.string('x00281054'), modalityLUTSequence: getLUTs(dataSet.uint16('x00280103'), dataSet.elements.x00283000), }; } if (type === MetadataModules.SOP_COMMON) { return { sopClassUID: dataSet.string('x00080016'), sopInstanceUID: dataSet.string('x00080018'), }; } if (type === MetadataModules.PET_ISOTOPE) { const radiopharmaceuticalInfo = dataSet.elements.x00540016; if (radiopharmaceuticalInfo === undefined) { return; } const firstRadiopharmaceuticalInfoDataSet = radiopharmaceuticalInfo.items[0].dataSet; return { radiopharmaceuticalInfo: { radiopharmaceuticalStartTime: dicomParser.parseTM(firstRadiopharmaceuticalInfoDataSet.string('x00181072') || ''), radionuclideTotalDose: firstRadiopharmaceuticalInfoDataSet.floatString('x00181074'), radionuclideHalfLife: firstRadiopharmaceuticalInfoDataSet.floatString('x00181075'), }, }; } if (type === MetadataModules.OVERLAY_PLANE) { return getOverlayPlaneModule(dataSet); } if (type === 'transferSyntax') { let transferSyntaxUID; try { transferSyntaxUID = dataSet.string('x00020010'); } catch (error) { } return { transferSyntaxUID, }; } if (type === MetadataModules.PET_SERIES) { return { correctedImage: dataSet.string('x00280051'), units: dataSet.string('x00541001'), decayCorrection: dataSet.string('x00541102'), }; } if (type === MetadataModules.PET_IMAGE) { return { frameReferenceTime: dataSet.floatString(dataSet.string('x00541300') || ''), actualFrameDuration: dataSet.intString(dataSet.string('x00181242')), }; } if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) { return getUSEnhancedRegions(dataSet); } if (type === MetadataModules.CALIBRATION) { const modality = dataSet.string('x00080060'); if (modality === 'US') { const enhancedRegion = getUSEnhancedRegions(dataSet); return { sequenceOfUltrasoundRegions: enhancedRegion, }; } } if (type === 'instance') { return metaData.getNormalized(imageId, instanceModuleNames); } } export default metaDataProvider;