212 lines
7.0 KiB
Plaintext
212 lines
7.0 KiB
Plaintext
import { metaData } from '@cornerstonejs/core';
|
|
import type { InstanceMetadata } from '@cornerstonejs/calculate-suv';
|
|
|
|
export default function getPTImageIdInstanceMetadata(
|
|
imageId: string
|
|
): InstanceMetadata {
|
|
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);
|
|
|
|
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: 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): string {
|
|
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): string {
|
|
const month = `${date.month}`.padStart(2, '0');
|
|
const day = `${date.day}`.padStart(2, '0');
|
|
const dateString = `${date.year}${month}${day}`;
|
|
return dateString;
|
|
}
|
|
|
|
export { getPTImageIdInstanceMetadata };
|