252 lines
8.1 KiB
Plaintext
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 }
|