From f97102a236f7539b9a58c5ba785fd52033f8ca0f Mon Sep 17 00:00:00 2001 From: tkakar Date: Wed, 29 Jan 2025 14:26:18 -0500 Subject: [PATCH] Tkakar/CAT-1100-add-container-for-reading-image-metadata (#145) * Added container * Added workflow * Fixed container name in readme --- containers/ome-tiff-metadata/Dockerfile | 26 +++++++ containers/ome-tiff-metadata/README.md | 25 ++++++ containers/ome-tiff-metadata/VERSION | 1 + containers/ome-tiff-metadata/context/main.py | 72 ++++++++++++++++++ .../context/requirements-freeze.txt | 42 ++++++++++ .../context/requirements.txt | 1 + .../test-input/test_image.ome.tiff | Bin 0 -> 10624 bytes .../test_image.metadata.json | 1 + ome-tiff-metadata-manifest.json | 7 ++ ome-tiff-metadata.cwl | 19 +++++ workflows/ome-tiff-metadata/README.md | 1 + .../test-input/test_image.ome.tiff | Bin 0 -> 10624 bytes workflows/ome-tiff-metadata/test-job.yml | 3 + .../image_metadata/test_image.metadata.json | 1 + 14 files changed, 199 insertions(+) create mode 100644 containers/ome-tiff-metadata/Dockerfile create mode 100644 containers/ome-tiff-metadata/README.md create mode 100644 containers/ome-tiff-metadata/VERSION create mode 100644 containers/ome-tiff-metadata/context/main.py create mode 100644 containers/ome-tiff-metadata/context/requirements-freeze.txt create mode 100644 containers/ome-tiff-metadata/context/requirements.txt create mode 100644 containers/ome-tiff-metadata/test-input/test_image.ome.tiff create mode 100644 containers/ome-tiff-metadata/test-output-expected/test_image.metadata.json create mode 100644 ome-tiff-metadata-manifest.json create mode 100755 ome-tiff-metadata.cwl create mode 100644 workflows/ome-tiff-metadata/README.md create mode 100644 workflows/ome-tiff-metadata/test-input/test_image.ome.tiff create mode 100644 workflows/ome-tiff-metadata/test-job.yml create mode 100644 workflows/ome-tiff-metadata/test-output-expected/image_metadata/test_image.metadata.json diff --git a/containers/ome-tiff-metadata/Dockerfile b/containers/ome-tiff-metadata/Dockerfile new file mode 100644 index 00000000..b8dd1a85 --- /dev/null +++ b/containers/ome-tiff-metadata/Dockerfile @@ -0,0 +1,26 @@ +# We just need to use --file to point at it, instead of assuming it is in context. + +# Using Conda because pyarrow did not install easily on python base images. +FROM --platform=linux/amd64 continuumio/miniconda3:24.5.0-0 + +# For tiff packages +RUN apt-get --allow-releaseinfo-change update &&\ + apt-get install -y gcc python3-dev libhdf5-dev pkg-config python3-numcodecs + +RUN pip install --upgrade pip setuptools + +COPY requirements-freeze.txt . +RUN pip install -r ./requirements-freeze.txt + +# In development, you may want to pin a single dependency in requirements.txt, +# without throwing away the entire cache layer from requirements-freeze.txt. +# (But once it works, you should check in an updated freeze!) + +COPY requirements.txt . +RUN pip install -r ./requirements.txt + +COPY . . + +CMD [ "python", "main.py", \ + "--input_dir", "/input", \ + "--output_dir", "/output" ] diff --git a/containers/ome-tiff-metadata/README.md b/containers/ome-tiff-metadata/README.md new file mode 100644 index 00000000..3a0697a9 --- /dev/null +++ b/containers/ome-tiff-metadata/README.md @@ -0,0 +1,25 @@ +# ome-tiff-metadata + +This docker container creates a JSON object for metadata (physical sizes and units) extracted from each TIFF within an input directory. This is needed particularly for laying segmentation masks over base-images when there is a misalignment between the physical sizes fo both images. Note that, even with same pixel sizes, if physical sizes are different, misalignment can occur. This metadata is useful to add scaling to the segmentation mask when visualized using Vitessce. + +## Input + +The input to the container is one or more ome-tiff image files. + +## Output + +The output is a json file that includes an object with following structure for every input ome-tiff image. + +``` +{"PhysicalSizeX": 0.5, "PhysicalSizeY": 0.5, "PhysicalSizeUnitX": "\u00b5m", "PhysicalSizeUnitY": "\u00b5m"} + +``` + +## Normalization + +None + +## Example + +Example of a hubmap dataset using this container for metadata generation for Vitessce (visualization) would be +`TODO`. diff --git a/containers/ome-tiff-metadata/VERSION b/containers/ome-tiff-metadata/VERSION new file mode 100644 index 00000000..8acdd82b --- /dev/null +++ b/containers/ome-tiff-metadata/VERSION @@ -0,0 +1 @@ +0.0.1 diff --git a/containers/ome-tiff-metadata/context/main.py b/containers/ome-tiff-metadata/context/main.py new file mode 100644 index 00000000..9207045b --- /dev/null +++ b/containers/ome-tiff-metadata/context/main.py @@ -0,0 +1,72 @@ +import argparse +from glob import glob +from pathlib import Path +from os import makedirs +from itertools import chain +import json +from ome_types import from_tiff + + +def get_metadata(tiff_file_path): + extracted_metadata = {} + try: + ome_data = from_tiff(tiff_file_path) + image = ome_data.images[0] + pixels = image.pixels + + physical_size_x = pixels.physical_size_x + physical_size_y = pixels.physical_size_y + + physical_size_unit_x = pixels.physical_size_x_unit + physical_size_unit_y = pixels.physical_size_y_unit + + + physical_size_unit_x = physical_size_unit_x.value if hasattr(physical_size_unit_x, 'value') else physical_size_unit_x + physical_size_unit_y = physical_size_unit_y.value if hasattr(physical_size_unit_y, 'value') else physical_size_unit_y + extracted_metadata = { + "PhysicalSizeX": physical_size_x, + "PhysicalSizeY": physical_size_y, + "PhysicalSizeUnitX": physical_size_unit_x, + "PhysicalSizeUnitY": physical_size_unit_y, + } + print(f"Extracted metadata: {extracted_metadata}") + except FileNotFoundError: + print(f"Error: The file {tiff_file_path} does not exist.") + except IndexError: + print("Error: The TIFF file does not contain any images.") + except Exception as e: + print(f"An unexpected error occurred: {e}") + + return extracted_metadata + + +def main(input_dir, output_dir): + makedirs(output_dir, exist_ok=True) + + # Find all OME.TIFFs in the input directory. + tiffs = list(chain(input_dir.glob('**/*.ome.tif'), input_dir.glob('**/*.ome.tiff'))) + if not tiffs: + raise Exception(f'No OME TIFFs found in {input_dir}') + for input_path in tiffs: + metadata = get_metadata(str(input_path)) + + # Create output path for each OME.TIFF: + new_output_dir = (output_dir / input_path.relative_to(input_dir)).parent + new_output_dir.mkdir(parents=True, exist_ok=True) + + # Set output filename for JSON file and dump to disk: + output_path = str(output_dir / input_path.relative_to(input_dir).with_suffix('').with_suffix(''))+'.metadata.json' + with open(output_path, 'w') as f: + f.write(json.dumps(metadata)) + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Create a json file for OME-TIFF offsets') + parser.add_argument( + '--input_dir', required=True, type=Path, + help='Directory containing ome-tiff files to read') + parser.add_argument( + '--output_dir', required=True, type=Path, + help='Directory where ome-tiff offsets should be written') + args = parser.parse_args() + main(args.input_dir, args.output_dir) diff --git a/containers/ome-tiff-metadata/context/requirements-freeze.txt b/containers/ome-tiff-metadata/context/requirements-freeze.txt new file mode 100644 index 00000000..dfb626b3 --- /dev/null +++ b/containers/ome-tiff-metadata/context/requirements-freeze.txt @@ -0,0 +1,42 @@ +anaconda-anon-usage==0.4.4 +annotated-types==0.7.0 +archspec==0.2.3 +boltons==23.0.0 +Brotli==1.0.9 +certifi==2024.6.2 +cffi==1.16.0 +charset-normalizer==2.0.4 +conda==24.5.0 +conda-content-trust==0.2.0 +conda-libmamba-solver==24.1.0 +conda-package-handling==2.3.0 +conda_package_streaming==0.10.0 +cryptography==42.0.5 +distro==1.9.0 +frozendict==2.4.2 +idna==3.7 +jsonpatch==1.33 +jsonpointer==2.1 +libmambapy==1.5.8 +menuinst==2.1.1 +ome-types==0.5.2 +packaging==23.2 +pip==24.2 +platformdirs==3.10.0 +pluggy==1.0.0 +pycosat==0.6.6 +pycparser==2.21 +pydantic==2.10.5 +pydantic-compat==0.1.2 +pydantic_core==2.27.2 +PySocks==1.7.1 +requests==2.32.2 +ruamel.yaml==0.17.21 +setuptools==75.1.0 +tqdm==4.66.4 +truststore==0.8.0 +typing_extensions==4.12.2 +urllib3==2.2.2 +wheel==0.43.0 +xsdata==24.3.1 +zstandard==0.22.0 diff --git a/containers/ome-tiff-metadata/context/requirements.txt b/containers/ome-tiff-metadata/context/requirements.txt new file mode 100644 index 00000000..24434d9e --- /dev/null +++ b/containers/ome-tiff-metadata/context/requirements.txt @@ -0,0 +1 @@ +ome-types==0.5.2 \ No newline at end of file diff --git a/containers/ome-tiff-metadata/test-input/test_image.ome.tiff b/containers/ome-tiff-metadata/test-input/test_image.ome.tiff new file mode 100644 index 0000000000000000000000000000000000000000..ed830918a71a8cc023570ab92a6ad3f3603820fc GIT binary patch literal 10624 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 K4Vibxlm7*6bo$Ex literal 0 HcmV?d00001 diff --git a/containers/ome-tiff-metadata/test-output-expected/test_image.metadata.json b/containers/ome-tiff-metadata/test-output-expected/test_image.metadata.json new file mode 100644 index 00000000..8dbc61e5 --- /dev/null +++ b/containers/ome-tiff-metadata/test-output-expected/test_image.metadata.json @@ -0,0 +1 @@ +{"PhysicalSizeX": 0.5, "PhysicalSizeY": 0.5, "PhysicalSizeUnitX": "\u00b5m", "PhysicalSizeUnitY": "\u00b5m"} \ No newline at end of file diff --git a/ome-tiff-metadata-manifest.json b/ome-tiff-metadata-manifest.json new file mode 100644 index 00000000..d8a8c378 --- /dev/null +++ b/ome-tiff-metadata-manifest.json @@ -0,0 +1,7 @@ +[ + { + "pattern": "image_metadata/(.*)\\.metadata\\.json", + "description": "JSON object containing metadata about image physical size extracted from TIFF file to help in scaling for visualization.", + "edam_ontology_term": "EDAM_1.24.format_3464" + } +] diff --git a/ome-tiff-metadata.cwl b/ome-tiff-metadata.cwl new file mode 100755 index 00000000..45367f99 --- /dev/null +++ b/ome-tiff-metadata.cwl @@ -0,0 +1,19 @@ +#!/usr/bin/env cwl-runner + +cwlVersion: v1.2 +class: CommandLineTool +# TODO: Make main.py executable? +baseCommand: ['python', '/main.py', '--output_dir', 'image_metadata', '--input_dir'] +hints: + DockerRequirement: + dockerPull: hubmap/portal-container-ome-tiff-metadata:0.0.1 +inputs: + input_directory: + type: Directory + inputBinding: + position: 6 +outputs: + json: + type: Directory + outputBinding: + glob: image_metadata diff --git a/workflows/ome-tiff-metadata/README.md b/workflows/ome-tiff-metadata/README.md new file mode 100644 index 00000000..1acd3ebf --- /dev/null +++ b/workflows/ome-tiff-metadata/README.md @@ -0,0 +1 @@ +See [containers/ome-tiff-metadata](https://github.com/hubmapconsortium/portal-containers/blob/master/containers/ome-tiff-metadata/README.md). diff --git a/workflows/ome-tiff-metadata/test-input/test_image.ome.tiff b/workflows/ome-tiff-metadata/test-input/test_image.ome.tiff new file mode 100644 index 0000000000000000000000000000000000000000..ed830918a71a8cc023570ab92a6ad3f3603820fc GIT binary patch literal 10624 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 K4Vibxlm7*6bo$Ex literal 0 HcmV?d00001 diff --git a/workflows/ome-tiff-metadata/test-job.yml b/workflows/ome-tiff-metadata/test-job.yml new file mode 100644 index 00000000..94e81e61 --- /dev/null +++ b/workflows/ome-tiff-metadata/test-job.yml @@ -0,0 +1,3 @@ +input_directory: + class: Directory + path: test-input diff --git a/workflows/ome-tiff-metadata/test-output-expected/image_metadata/test_image.metadata.json b/workflows/ome-tiff-metadata/test-output-expected/image_metadata/test_image.metadata.json new file mode 100644 index 00000000..8dbc61e5 --- /dev/null +++ b/workflows/ome-tiff-metadata/test-output-expected/image_metadata/test_image.metadata.json @@ -0,0 +1 @@ +{"PhysicalSizeX": 0.5, "PhysicalSizeY": 0.5, "PhysicalSizeUnitX": "\u00b5m", "PhysicalSizeUnitY": "\u00b5m"} \ No newline at end of file