irc_web/.svn/pristine/05/052815696d407a7849d9a3f27cb...

252 lines
8.1 KiB
Plaintext

import { metaData } from '@cornerstonejs/core'
// import { InstanceMetadata } from '@cornerstonejs/calculate-suv'
import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'
function parseImageId(imageId) {
// build a url by parsing out the url scheme and frame index from the imageId
const firstColonIndex = imageId.indexOf(':')
let url = imageId.substring(firstColonIndex + 1)
const frameIndex = url.indexOf('frame=')
let frame
if (frameIndex !== -1) {
const frameStr = url.substr(frameIndex + 6)
frame = parseInt(frameStr, 10)
url = url.substr(0, frameIndex - 1)
}
return {
scheme: imageId.substr(0, firstColonIndex),
url,
frame
}
}
function getMetaData(type, imageId) {
// const { dicomParser } = cornerstoneDICOMImageLoader.external
const parsedImageId = parseImageId(imageId)
const url = parsedImageId.url
const dataSet = cornerstoneDICOMImageLoader.wadouri.dataSetCacheManager.get(url)
if (!dataSet) {
return
}
if (type === 'petImageModule') {
// 1340137.4196974 240000
// console.log(dataSet.string('x00541300'), dataSet.string('x00181242'))
return {
frameReferenceTime: dataSet.string('x00541300') || '',
actualFrameDuration: dataSet.string('x00181242')
}
}
}
export default function getPTImageIdInstanceMetadata(imageId) {
const petSequenceModule = metaData.get('petIsotopeModule', imageId)
const generalSeriesModule = metaData.get('generalSeriesModule', imageId)
const patientStudyModule = metaData.get('patientStudyModule', imageId)
const ptSeriesModule = metaData.get('petSeriesModule', imageId)
// const ptImageModule = metaData.get('petImageModule', imageId)
const ptImageModule = getMetaData('petImageModule', imageId)
if (!petSequenceModule) {
throw new Error('petSequenceModule metadata is required')
}
const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo
const { seriesDate, seriesTime, acquisitionDate, acquisitionTime } =
generalSeriesModule
const { patientWeight } = patientStudyModule
const { correctedImage, units, decayCorrection } = ptSeriesModule
if (
seriesDate === undefined ||
seriesTime === undefined ||
patientWeight === undefined ||
acquisitionDate === undefined ||
acquisitionTime === undefined ||
correctedImage === undefined ||
units === undefined ||
decayCorrection === undefined ||
radiopharmaceuticalInfo.radionuclideTotalDose === undefined ||
radiopharmaceuticalInfo.radionuclideHalfLife === undefined ||
(radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime === undefined &&
seriesDate === undefined &&
radiopharmaceuticalInfo.radiopharmaceuticalStartTime === undefined)
//
) {
throw new Error('required metadata are missing')
}
const instanceMetadata = {
CorrectedImage: correctedImage,
Units: units,
RadionuclideHalfLife: radiopharmaceuticalInfo.radionuclideHalfLife,
RadionuclideTotalDose: radiopharmaceuticalInfo.radionuclideTotalDose,
DecayCorrection: decayCorrection,
PatientWeight: patientWeight,
SeriesDate: seriesDate,
SeriesTime: seriesTime,
AcquisitionDate: acquisitionDate,
AcquisitionTime: acquisitionTime
}
if (
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime &&
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== undefined &&
typeof radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime === 'string'
) {
instanceMetadata.RadiopharmaceuticalStartDateTime =
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime
}
if (
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime &&
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== undefined &&
typeof radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== 'string'
) {
const dateString = convertInterfaceDateToString(
radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime
)
instanceMetadata.RadiopharmaceuticalStartDateTime = dateString
}
if (
instanceMetadata.AcquisitionDate &&
instanceMetadata.AcquisitionDate !== undefined &&
typeof instanceMetadata.AcquisitionDate !== 'string'
) {
const dateString = convertInterfaceDateToString(
instanceMetadata.AcquisitionDate
)
instanceMetadata.AcquisitionDate = dateString
}
if (
instanceMetadata.SeriesDate &&
instanceMetadata.SeriesDate !== undefined &&
typeof instanceMetadata.SeriesDate !== 'string'
) {
const dateString = convertInterfaceDateToString(
instanceMetadata.SeriesDate
)
instanceMetadata.SeriesDate = dateString
}
if (
radiopharmaceuticalInfo.radiopharmaceuticalStartTime &&
radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== undefined &&
typeof radiopharmaceuticalInfo.radiopharmaceuticalStartTime === 'string'
) {
instanceMetadata.RadiopharmaceuticalStartTime =
radiopharmaceuticalInfo.radiopharmaceuticalStartTime
}
if (
radiopharmaceuticalInfo.radiopharmaceuticalStartTime &&
radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== undefined &&
typeof radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== 'string'
) {
const timeString = convertInterfaceTimeToString(
radiopharmaceuticalInfo.radiopharmaceuticalStartTime
)
instanceMetadata.RadiopharmaceuticalStartTime = timeString
}
if (
instanceMetadata.AcquisitionTime &&
instanceMetadata.AcquisitionTime !== undefined &&
typeof instanceMetadata.AcquisitionTime !== 'string'
) {
const timeString = convertInterfaceTimeToString(
instanceMetadata.AcquisitionTime
)
instanceMetadata.AcquisitionTime = timeString
}
if (
instanceMetadata.SeriesTime &&
instanceMetadata.SeriesTime !== undefined &&
typeof instanceMetadata.SeriesTime !== 'string'
) {
const timeString = convertInterfaceTimeToString(
instanceMetadata.SeriesTime
)
instanceMetadata.SeriesTime = timeString
}
if (
ptImageModule.frameReferenceTime &&
ptImageModule.frameReferenceTime !== undefined
) {
instanceMetadata.FrameReferenceTime = ptImageModule.frameReferenceTime
}
if (
ptImageModule.actualFrameDuration &&
ptImageModule.actualFrameDuration !== undefined
) {
instanceMetadata.ActualFrameDuration = ptImageModule.actualFrameDuration
}
if (
patientStudyModule.patientSex &&
patientStudyModule.patientSex !== undefined
) {
instanceMetadata.PatientSex = patientStudyModule.patientSex
}
if (
patientStudyModule.patientSize &&
patientStudyModule.patientSize !== undefined
) {
instanceMetadata.PatientSize = patientStudyModule.patientSize
}
// Todo: add private tags
// if (
// dicomMetaData['70531000'] ||
// dicomMetaData['70531000'] !== undefined ||
// dicomMetaData['70531009'] ||
// dicomMetaData['70531009'] !== undefined
// ) {
// const philipsPETPrivateGroup: PhilipsPETPrivateGroup = {
// SUVScaleFactor: dicomMetaData['70531000'],
// ActivityConcentrationScaleFactor: dicomMetaData['70531009'],
// };
// instanceMetadata.PhilipsPETPrivateGroup = philipsPETPrivateGroup;
// }
// if (dicomMetaData['0009100d'] && dicomMetaData['0009100d'] !== undefined) {
// instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d'];
// }
return instanceMetadata
}
function convertInterfaceTimeToString(time) {
const hours = `${time.hours || '00'}`.padStart(2, '0')
const minutes = `${time.minutes || '00'}`.padStart(2, '0')
const seconds = `${time.seconds || '00'}`.padStart(2, '0')
const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd(
6,
'0'
)
const timeString = `${hours}${minutes}${seconds}.${fractionalSeconds}`
return timeString
}
function convertInterfaceDateToString(date) {
const month = `${date.month}`.padStart(2, '0')
const day = `${date.day}`.padStart(2, '0')
const dateString = `${date.year}${month}${day}`
return dateString
}
export { getPTImageIdInstanceMetadata }