UNPKG

@cornerstonejs/dicom-image-loader

Version:

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

287 lines (286 loc) 12.2 kB
import * as dicomParser from 'dicom-parser'; import { Enums, utilities, metaData as coreMetaData, } from '@cornerstonejs/core'; import getNumberValues from './getNumberValues'; import getNumberValue from './getNumberValue'; import getOverlayPlaneModule from './getOverlayPlaneModule'; import metaDataManager, { retrieveMultiframeMetadataImageId, } from '../metaDataManager'; import getValue from './getValue'; import { getMultiframeInformation, getFrameInformation, } from '../combineFrameInstance'; import { extractOrientationFromMetadata, extractPositionFromMetadata, } from './extractPositioningFromMetadata'; import { getImageTypeSubItemFromMetadata } from './NMHelpers'; import isNMReconstructable from '../../isNMReconstructable'; import { getInstanceModule, instanceModuleNames, } from '../../getInstanceModule'; import { getUSEnhancedRegions } from './USHelpers'; function metaDataProvider(type, imageId) { const { MetadataModules } = Enums; if (type === MetadataModules.MULTIFRAME) { const { metadata, frame } = retrieveMultiframeMetadataImageId(imageId); if (!metadata) { return; } const { PerFrameFunctionalGroupsSequence, SharedFunctionalGroupsSequence, NumberOfFrames, } = getMultiframeInformation(metadata); if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) { const { shared, perFrame } = getFrameInformation(PerFrameFunctionalGroupsSequence, SharedFunctionalGroupsSequence, frame); return { NumberOfFrames, PerFrameFunctionalInformation: perFrame, SharedFunctionalInformation: shared, }; } return { NumberOfFrames, }; } const metaData = metaDataManager.get(imageId); if (!metaData) { return; } if (type === MetadataModules.GENERAL_STUDY) { return { studyDescription: getValue(metaData['00081030']), studyDate: getValue(metaData['00080020']), studyTime: getValue(metaData['00080030']), accessionNumber: getValue(metaData['00080050']), }; } if (type === MetadataModules.GENERAL_SERIES) { return { modality: getValue(metaData['00080060']), seriesInstanceUID: getValue(metaData['0020000E']), seriesDescription: getValue(metaData['0008103E']), seriesNumber: getNumberValue(metaData['00200011']), studyInstanceUID: getValue(metaData['0020000D']), seriesDate: getValue(metaData['00080021']), seriesTime: getValue(metaData['00080031']), acquisitionDate: getValue(metaData['00080022']), acquisitionTime: getValue(metaData['00080032']), }; } if (type === MetadataModules.GENERAL_IMAGE) { return { sopInstanceUID: getValue(metaData['00080018']), instanceNumber: getNumberValue(metaData['00200013']), lossyImageCompression: getValue(metaData['00282110']), lossyImageCompressionRatio: getNumberValue(metaData['00282112']), lossyImageCompressionMethod: getValue(metaData['00282114']), }; } if (type === MetadataModules.PATIENT) { return { patientID: getValue(metaData['00100020']), patientName: getValue(metaData['00100010']), }; } if (type === MetadataModules.PATIENT_STUDY) { return { patientAge: getNumberValue(metaData['00101010']), patientSize: getNumberValue(metaData['00101020']), patientSex: getValue(metaData['00100040']), patientWeight: getNumberValue(metaData['00101030']), }; } if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) { const modality = getValue(metaData['00080060']); const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2); return { modality, imageType: getValue(metaData['00080008']), imageSubType, imageOrientationPatient: extractOrientationFromMetadata(metaData), imagePositionPatient: extractPositionFromMetadata(metaData), sliceThickness: getNumberValue(metaData['00180050']), spacingBetweenSlices: getNumberValue(metaData['00180088']), pixelSpacing: getNumberValues(metaData['00280030'], 2), numberOfFrames: getNumberValue(metaData['00280008']), isNMReconstructable: isNMReconstructable(imageSubType) && modality.includes('NM'), }; } if (type === MetadataModules.IMAGE_PLANE) { let imageOrientationPatient = extractOrientationFromMetadata(metaData); let imagePositionPatient = extractPositionFromMetadata(metaData); const pixelSpacing = getNumberValues(metaData['00280030'], 2); let columnPixelSpacing = null; let rowPixelSpacing = null; let rowCosines = null; let columnCosines = null; let usingDefaultValues = false; if (pixelSpacing) { rowPixelSpacing = pixelSpacing[0]; columnPixelSpacing = pixelSpacing[1]; } else { usingDefaultValues = true; rowPixelSpacing = 1; columnPixelSpacing = 1; } if (imageOrientationPatient) { rowCosines = [ parseFloat(imageOrientationPatient[0]), parseFloat(imageOrientationPatient[1]), parseFloat(imageOrientationPatient[2]), ]; columnCosines = [ parseFloat(imageOrientationPatient[3]), parseFloat(imageOrientationPatient[4]), parseFloat(imageOrientationPatient[5]), ]; } else { rowCosines = [1, 0, 0]; columnCosines = [0, 1, 0]; usingDefaultValues = true; imageOrientationPatient = [...rowCosines, ...columnCosines]; } if (!imagePositionPatient) { imagePositionPatient = [0, 0, 0]; usingDefaultValues = true; } return { frameOfReferenceUID: getValue(metaData['00200052']), rows: getNumberValue(metaData['00280010']), columns: getNumberValue(metaData['00280011']), imageOrientationPatient, rowCosines, columnCosines, imagePositionPatient, sliceThickness: getNumberValue(metaData['00180050']), sliceLocation: getNumberValue(metaData['00201041']), pixelSpacing, rowPixelSpacing, columnPixelSpacing, usingDefaultValues, }; } if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) { return getUSEnhancedRegions(metaData); } if (type === MetadataModules.CALIBRATION) { const modality = getValue(metaData['00080060']); if (modality === 'US') { const enhancedRegion = getUSEnhancedRegions(metaData); return { sequenceOfUltrasoundRegions: enhancedRegion, }; } } if (type === MetadataModules.IMAGE_URL) { return getImageUrlModule(imageId, metaData); } if (type === MetadataModules.CINE) { return getCineModule(imageId, metaData); } if (type === MetadataModules.IMAGE_PIXEL) { return { samplesPerPixel: getNumberValue(metaData['00280002']), photometricInterpretation: getValue(metaData['00280004']), rows: getNumberValue(metaData['00280010']), columns: getNumberValue(metaData['00280011']), bitsAllocated: getNumberValue(metaData['00280100']), bitsStored: getNumberValue(metaData['00280101']), highBit: getValue(metaData['00280102']), pixelRepresentation: getNumberValue(metaData['00280103']), planarConfiguration: getNumberValue(metaData['00280006']), pixelAspectRatio: getValue(metaData['00280034']), smallestPixelValue: getNumberValue(metaData['00280106']), largestPixelValue: getNumberValue(metaData['00280107']), redPaletteColorLookupTableDescriptor: getNumberValues(metaData['00281101']), greenPaletteColorLookupTableDescriptor: getNumberValues(metaData['00281102']), bluePaletteColorLookupTableDescriptor: getNumberValues(metaData['00281103']), redPaletteColorLookupTableData: getNumberValues(metaData['00281201']), greenPaletteColorLookupTableData: getNumberValues(metaData['00281202']), bluePaletteColorLookupTableData: getNumberValues(metaData['00281203']), }; } if (type === MetadataModules.VOI_LUT) { return { windowCenter: getNumberValues(metaData['00281050'], 1), windowWidth: getNumberValues(metaData['00281051'], 1), voiLUTFunction: getValue(metaData['00281056']), }; } if (type === MetadataModules.MODALITY_LUT) { return { rescaleIntercept: getNumberValue(metaData['00281052']), rescaleSlope: getNumberValue(metaData['00281053']), rescaleType: getValue(metaData['00281054']), }; } if (type === MetadataModules.SOP_COMMON) { return { sopClassUID: getValue(metaData['00080016']), sopInstanceUID: getValue(metaData['00080018']), }; } if (type === MetadataModules.PET_ISOTOPE) { const radiopharmaceuticalInfo = getValue(metaData['00540016']); if (radiopharmaceuticalInfo === undefined) { return; } return { radiopharmaceuticalInfo: { radiopharmaceuticalStartTime: getValue(radiopharmaceuticalInfo['00181072'], 0, ''), radiopharmaceuticalStartDateTime: getValue(radiopharmaceuticalInfo['00181078'], 0, ''), radionuclideTotalDose: getNumberValue(radiopharmaceuticalInfo['00181074']), radionuclideHalfLife: getNumberValue(radiopharmaceuticalInfo['00181075']), }, }; } if (type === MetadataModules.OVERLAY_PLANE) { return getOverlayPlaneModule(metaData); } if (type === 'transferSyntax') { return getTransferSyntax(imageId, metaData); } if (type === MetadataModules.PET_SERIES) { let correctedImageData = metaData['00280051']; let correctedImage = getValue(metaData['00280051']); if (correctedImageData && correctedImageData.Value && Array.isArray(correctedImageData.Value)) { correctedImage = correctedImageData.Value.join('\\'); } return { correctedImage, units: getValue(metaData['00541001']), decayCorrection: getValue(metaData['00541102']), }; } if (type === MetadataModules.PET_IMAGE) { return { frameReferenceTime: getNumberValue(metaData['00541300']), actualFrameDuration: getNumberValue(metaData['00181242']), }; } if (type === 'instance') { return coreMetaData.getNormalized(imageId, instanceModuleNames); } } export function getImageUrlModule(imageId, metaData) { const { transferSyntaxUID } = getTransferSyntax(imageId, metaData); const isVideo = utilities.isVideoTransferSyntax(transferSyntaxUID); const imageUrl = imageId.substring(7); const thumbnail = imageUrl.replace('/frames/', '/thumbnail/'); let rendered = imageUrl.replace('/frames/', '/rendered/'); if (isVideo) { rendered = rendered.replace('/rendered/1', '/rendered'); } return { isVideo, rendered, thumbnail, }; } export function getCineModule(imageId, metaData) { const cineRate = getValue(metaData['00180040']); return { cineRate, numberOfFrames: getNumberValue(metaData['00280008']), }; } export function getTransferSyntax(imageId, metaData) { return { transferSyntaxUID: getValue(metaData['00020010']) || getValue(metaData['00083002']), }; } export default metaDataProvider;