in pathology/transformation_pipeline/ingestion_lib/dicom_gen/dicom_slide_coordinates_microscopic_image.py [0:0]
def _extract_tif_tags_metadata(tif_path: str) -> _TifTagsDicomMetadata:
"""Extracts TIF tags metadata relevant to VL Slide-Coordinates DICOM.
Args:
tif_path: Path to a TIF image.
Returns:
TIF tags metadata for VL Slide-Coordinates DICOM.
"""
metadata = _TifTagsDicomMetadata()
with tifffile.TiffFile(tif_path) as tif:
if not tif.pages:
cloud_logging_client.warning(f'TIF image missing pages: {tif_path}.')
return metadata
tags = tif.pages[0].tags
if (
_TIF_X_RESOLUTION_TAG in tags
and _TIF_Y_RESOLUTION_TAG in tags
and _TIF_RESOLUTION_UNIT_TAG in tags
):
x_resolution = tags[_TIF_X_RESOLUTION_TAG].value
y_resolution = tags[_TIF_Y_RESOLUTION_TAG].value
resolution_unit = tags[_TIF_RESOLUTION_UNIT_TAG].value
metadata.column_spacing = _convert_resolution_to_spacing(
x_resolution, resolution_unit
)
metadata.row_spacing = _convert_resolution_to_spacing(
y_resolution, resolution_unit
)
if not metadata.column_spacing or not metadata.row_spacing:
cloud_logging_client.warning(
f'Invalid resolution TIF tags in {tif_path}.'
)
if _TIF_DATE_TIME_TAG in tags:
datetime_value = tags[_TIF_DATE_TIME_TAG].value
try:
metadata.acquisition_datetime = datetime.datetime.strptime(
datetime_value, _TIF_DATE_TIME_FORMAT
)
except ValueError:
cloud_logging_client.warning(
f'Failed to parse acquisition datetime TIF tag in {tif_path}: '
f'{datetime_value}.'
)
return metadata