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 };
 |