137 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
// See https://github.com/OHIF/Viewers/blob/94a9067fe3d291d30e25a1bda5913511388edea2/platform/core/src/utils/metadataProvider/getPixelSpacingInformation.js
 | 
						||
 | 
						||
export default function getPixelSpacingInformation(instance) {
 | 
						||
  // See http://gdcm.sourceforge.net/wiki/index.php/Imager_Pixel_Spacing
 | 
						||
 | 
						||
  // TODO: Add Ultrasound region spacing
 | 
						||
  // TODO: Add manual calibration
 | 
						||
 | 
						||
  // TODO: Use ENUMS from dcmjs
 | 
						||
  const projectionRadiographSOPClassUIDs = [
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1', //	CR Image Storage
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.1', //	Digital X-Ray Image Storage – for Presentation
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.1.1', //	Digital X-Ray Image Storage – for Processing
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.2', //	Digital Mammography X-Ray Image Storage – for Presentation
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.2.1', //	Digital Mammography X-Ray Image Storage – for Processing
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.3', //	Digital Intra – oral X-Ray Image Storage – for Presentation
 | 
						||
    '1.2.840.10008.5.1.4.1.1.1.3.1', //	Digital Intra – oral X-Ray Image Storage – for Processing
 | 
						||
    '1.2.840.10008.5.1.4.1.1.12.1', //	X-Ray Angiographic Image Storage
 | 
						||
    '1.2.840.10008.5.1.4.1.1.12.1.1', //	Enhanced XA Image Storage
 | 
						||
    '1.2.840.10008.5.1.4.1.1.12.2', //	X-Ray Radiofluoroscopic Image Storage
 | 
						||
    '1.2.840.10008.5.1.4.1.1.12.2.1', //	Enhanced XRF Image Storage
 | 
						||
    '1.2.840.10008.5.1.4.1.1.12.3' // X-Ray Angiographic Bi-plane Image Storage	Retired
 | 
						||
  ]
 | 
						||
 | 
						||
  const {
 | 
						||
    PixelSpacing,
 | 
						||
    ImagerPixelSpacing,
 | 
						||
    SOPClassUID,
 | 
						||
    PixelSpacingCalibrationType,
 | 
						||
    PixelSpacingCalibrationDescription,
 | 
						||
    EstimatedRadiographicMagnificationFactor,
 | 
						||
    SequenceOfUltrasoundRegions
 | 
						||
  } = instance
 | 
						||
 | 
						||
  const isProjection = projectionRadiographSOPClassUIDs.includes(SOPClassUID)
 | 
						||
 | 
						||
  const TYPES = {
 | 
						||
    NOT_APPLICABLE: 'NOT_APPLICABLE',
 | 
						||
    UNKNOWN: 'UNKNOWN',
 | 
						||
    CALIBRATED: 'CALIBRATED',
 | 
						||
    DETECTOR: 'DETECTOR'
 | 
						||
  }
 | 
						||
 | 
						||
  if (!isProjection) {
 | 
						||
    return PixelSpacing
 | 
						||
  }
 | 
						||
 | 
						||
  if (isProjection && !ImagerPixelSpacing) {
 | 
						||
    // If only Pixel Spacing is present, and this is a projection radiograph,
 | 
						||
    // PixelSpacing should be used, but the user should be informed that
 | 
						||
    // what it means is unknown
 | 
						||
    return {
 | 
						||
      PixelSpacing,
 | 
						||
      type: TYPES.UNKNOWN,
 | 
						||
      isProjection
 | 
						||
    }
 | 
						||
  } else if (
 | 
						||
    PixelSpacing &&
 | 
						||
    ImagerPixelSpacing &&
 | 
						||
    PixelSpacing === ImagerPixelSpacing
 | 
						||
  ) {
 | 
						||
    // If Imager Pixel Spacing and Pixel Spacing are present and they have the same values,
 | 
						||
    // then the user should be informed that the measurements are at the detector plane
 | 
						||
    return {
 | 
						||
      PixelSpacing,
 | 
						||
      type: TYPES.DETECTOR,
 | 
						||
      isProjection
 | 
						||
    }
 | 
						||
  } else if (
 | 
						||
    PixelSpacing &&
 | 
						||
    ImagerPixelSpacing &&
 | 
						||
    PixelSpacing !== ImagerPixelSpacing
 | 
						||
  ) {
 | 
						||
    // If Imager Pixel Spacing and Pixel Spacing are present and they have different values,
 | 
						||
    // then the user should be informed that these are "calibrated"
 | 
						||
    // (in some unknown manner if Pixel Spacing Calibration Type and/or
 | 
						||
    // Pixel Spacing Calibration Description are absent)
 | 
						||
    return {
 | 
						||
      PixelSpacing,
 | 
						||
      type: TYPES.CALIBRATED,
 | 
						||
      isProjection,
 | 
						||
      PixelSpacingCalibrationType,
 | 
						||
      PixelSpacingCalibrationDescription
 | 
						||
    }
 | 
						||
  } else if (!PixelSpacing && ImagerPixelSpacing) {
 | 
						||
    let CorrectedImagerPixelSpacing = ImagerPixelSpacing
 | 
						||
    if (EstimatedRadiographicMagnificationFactor) {
 | 
						||
      // Note that in IHE Mammo profile compliant displays, the value of Imager Pixel Spacing is required to be corrected by
 | 
						||
      // Estimated Radiographic Magnification Factor and the user informed of that.
 | 
						||
      // TODO: should this correction be done before all of this logic?
 | 
						||
      CorrectedImagerPixelSpacing = ImagerPixelSpacing.map(
 | 
						||
        (pixelSpacing) =>
 | 
						||
          pixelSpacing / EstimatedRadiographicMagnificationFactor
 | 
						||
      )
 | 
						||
    } else {
 | 
						||
      console.warn(
 | 
						||
        'EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing.'
 | 
						||
      )
 | 
						||
    }
 | 
						||
 | 
						||
    return {
 | 
						||
      PixelSpacing: CorrectedImagerPixelSpacing,
 | 
						||
      isProjection
 | 
						||
    }
 | 
						||
  } else if (
 | 
						||
    SequenceOfUltrasoundRegions &&
 | 
						||
    typeof SequenceOfUltrasoundRegions === 'object'
 | 
						||
  ) {
 | 
						||
    const { PhysicalDeltaX, PhysicalDeltaY } = SequenceOfUltrasoundRegions
 | 
						||
    const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10]
 | 
						||
 | 
						||
    return {
 | 
						||
      PixelSpacing: USPixelSpacing
 | 
						||
    }
 | 
						||
  } else if (
 | 
						||
    SequenceOfUltrasoundRegions &&
 | 
						||
    Array.isArray(SequenceOfUltrasoundRegions) &&
 | 
						||
    SequenceOfUltrasoundRegions.length > 1
 | 
						||
  ) {
 | 
						||
    console.warn(
 | 
						||
      'Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.'
 | 
						||
    )
 | 
						||
  } else if (isProjection === false && !ImagerPixelSpacing) {
 | 
						||
    // If only Pixel Spacing is present, and this is not a projection radiograph,
 | 
						||
    // we can stop here
 | 
						||
    return {
 | 
						||
      PixelSpacing,
 | 
						||
      type: TYPES.NOT_APPLICABLE,
 | 
						||
      isProjection
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  console.warn(
 | 
						||
    'Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.'
 | 
						||
  )
 | 
						||
}
 |