* Update to use beta 5.0 * fix: unit tests * fix: Allow slow server/test rendering to still work * Update tests to use viewport grid compare * Fix storage of stale retries actual/diff files * cs3d linking fixees * Linking for cs3d metadata * Use metadata import for suv scaling * Fix suv import * Use type for import * fix: Metadata registration ordering * Use beta for upstream * Merge from origin/master * Revert tests to master * Undo beta version changes * Revert bun.lock file to that of master. * Reduce test failure retries to one per test. Cap the number of failed total tests to 10. Replace the JSON reporter with the HTML reporter. * Add generic provider back in * Deprecate OHIF versions of cs3d utils * fix * Undo some cs3d beta dependencies so this PR could be merged * Build fix * Fixing build issues * build issue * bun lock * Temporary cache clear to resolve build issue * Cache bust * Remove the babel hoist fix attempt * Cache netlify toml issue * Fix netlify cache issue * Try to fix cache dependency issue * Try update resolutions * babel hoist fix * fix: Remove netlify cache bust * Revert pinned versions * PR comments on duplicated suv-factors * Undo lock changes and isEqual add --------- Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com> Co-authored-by: Alireza <ar.sedghi@gmail.com>
110 lines
4.2 KiB
TypeScript
110 lines
4.2 KiB
TypeScript
import OHIF from '@ohif/core';
|
|
|
|
import type { InstanceMetadata, PhilipsPETPrivateGroup } from '@cornerstonejs/calculate-suv/src/types';
|
|
|
|
const metadataProvider = OHIF.classes.MetadataProvider;
|
|
|
|
export default function getPTImageIdInstanceMetadata(imageId: string): InstanceMetadata {
|
|
const dicomMetaData = metadataProvider.get('instance', imageId);
|
|
|
|
if (!dicomMetaData) {
|
|
throw new Error('dicom metadata are required');
|
|
}
|
|
|
|
if (
|
|
dicomMetaData.SeriesDate === undefined ||
|
|
dicomMetaData.SeriesTime === undefined ||
|
|
dicomMetaData.CorrectedImage === undefined ||
|
|
dicomMetaData.Units === undefined ||
|
|
!dicomMetaData.RadiopharmaceuticalInformationSequence ||
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadionuclideHalfLife === undefined ||
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadionuclideTotalDose === undefined ||
|
|
dicomMetaData.DecayCorrection === undefined ||
|
|
dicomMetaData.AcquisitionDate === undefined ||
|
|
dicomMetaData.AcquisitionTime === undefined ||
|
|
(dicomMetaData.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartDateTime ===
|
|
undefined &&
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartTime ===
|
|
undefined)
|
|
) {
|
|
throw new Error('required metadata are missing');
|
|
}
|
|
|
|
if (dicomMetaData.PatientWeight === undefined) {
|
|
console.warn('PatientWeight missing from PT instance metadata');
|
|
}
|
|
|
|
const instanceMetadata: InstanceMetadata = {
|
|
CorrectedImage: dicomMetaData.CorrectedImage,
|
|
Units: dicomMetaData.Units,
|
|
RadionuclideHalfLife: dicomMetaData.RadiopharmaceuticalInformationSequence.RadionuclideHalfLife,
|
|
RadionuclideTotalDose:
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadionuclideTotalDose,
|
|
RadiopharmaceuticalStartDateTime:
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartDateTime,
|
|
RadiopharmaceuticalStartTime:
|
|
dicomMetaData.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartTime,
|
|
DecayCorrection: dicomMetaData.DecayCorrection,
|
|
PatientWeight: dicomMetaData.PatientWeight,
|
|
SeriesDate: dicomMetaData.SeriesDate,
|
|
SeriesTime: dicomMetaData.SeriesTime,
|
|
AcquisitionDate: dicomMetaData.AcquisitionDate,
|
|
AcquisitionTime: dicomMetaData.AcquisitionTime,
|
|
};
|
|
|
|
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'];
|
|
}
|
|
|
|
if (dicomMetaData.FrameReferenceTime && dicomMetaData.FrameReferenceTime !== undefined) {
|
|
instanceMetadata.FrameReferenceTime = dicomMetaData.FrameReferenceTime;
|
|
}
|
|
|
|
if (dicomMetaData.ActualFrameDuration && dicomMetaData.ActualFrameDuration !== undefined) {
|
|
instanceMetadata.ActualFrameDuration = dicomMetaData.ActualFrameDuration;
|
|
}
|
|
|
|
if (dicomMetaData.PatientSex && dicomMetaData.PatientSex !== undefined) {
|
|
instanceMetadata.PatientSex = dicomMetaData.PatientSex;
|
|
}
|
|
|
|
if (dicomMetaData.PatientSize && dicomMetaData.PatientSize !== undefined) {
|
|
instanceMetadata.PatientSize = dicomMetaData.PatientSize;
|
|
}
|
|
|
|
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 };
|