diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index ea4cebf349d..773787d844e 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -207,7 +207,9 @@ - + + + @@ -1055,6 +1057,7 @@ + diff --git a/lib/galaxy/datatypes/display_applications/configs/image/avivator.xml b/lib/galaxy/datatypes/display_applications/configs/image/avivator.xml new file mode 100644 index 00000000000..b1c54b8a89d --- /dev/null +++ b/lib/galaxy/datatypes/display_applications/configs/image/avivator.xml @@ -0,0 +1,7 @@ + + + http://avivator.gehlenborglab.org/?image_url=${qp($tiff_file.url)} + + + + diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index 8e37d71a660..df5aa0587e6 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -2,6 +2,7 @@ Image classes """ import base64 +import json import logging import zipfile from io import StringIO @@ -9,8 +10,13 @@ from urllib.parse import quote_plus import mrcfile import numpy as np +import tifffile from galaxy.datatypes.binary import Binary +from galaxy.datatypes.metadata import ( + FileParameter, + MetadataElement, +) from galaxy.datatypes.text import Html as HtmlFromText from galaxy.util import nice_size from galaxy.util.image_util import check_image_type @@ -80,6 +86,28 @@ class Tiff(Image): file_ext = "tiff" +class OMETiff(Tiff): + file_ext = "ome.tiff" + MetadataElement(name="offsets", desc="Offsets File", param=FileParameter, file_ext="json", readonly=True, no_value=None, visible=False, optional=True) + + def set_meta(self, dataset, overwrite=True, **kwd): + spec_key = 'offsets' + offsets_file = dataset.metadata.offsets + if not offsets_file: + offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) + with tifffile.TiffFile(dataset.file_name) as tif: + offsets = [page.offset for page in tif.pages] + with open(offsets_file.file_name, 'w') as f: + json.dump(offsets, f) + dataset.metadata.offsets = offsets_file + + def sniff(self, filename): + with tifffile.TiffFile(filename) as tif: + if tif.is_ome: + return True + return False + + class Hamamatsu(Image): file_ext = "vms" diff --git a/lib/galaxy/datatypes/test/1.ome.tiff b/lib/galaxy/datatypes/test/1.ome.tiff new file mode 100644 index 00000000000..805dd66e62f Binary files /dev/null and b/lib/galaxy/datatypes/test/1.ome.tiff differ diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt index e8dc32251de..73020b1aee7 100644 --- a/lib/galaxy/dependencies/dev-requirements.txt +++ b/lib/galaxy/dependencies/dev-requirements.txt @@ -234,6 +234,7 @@ svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==7.0.0 testfixtures==6.17.1 +tifffile==2020.9.3 toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" tornado==6.1; python_version >= "3.5" tqdm==4.59.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" diff --git a/lib/galaxy/dependencies/pinned-requirements.txt b/lib/galaxy/dependencies/pinned-requirements.txt index 3c77aa615cc..000d8452733 100644 --- a/lib/galaxy/dependencies/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pinned-requirements.txt @@ -188,6 +188,7 @@ stevedore==3.3.0; python_version >= "3.6" svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==7.0.0 +tifffile==2020.9.3 tornado==6.1; python_version >= "3.5" tqdm==4.59.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" typing-extensions==3.7.4.3; python_version >= "3.6" and python_version < "3.8" diff --git a/packages/data/requirements.txt b/packages/data/requirements.txt index 2dd78df22a3..8fa2fe55212 100644 --- a/packages/data/requirements.txt +++ b/packages/data/requirements.txt @@ -16,4 +16,5 @@ social-auth-core[openidconnect]==3.3.0 SQLAlchemy>=1.3.0,<1.4.0 # https://github.com/kvesteri/sqlalchemy-utils/issues/474 sqlalchemy-migrate sqlalchemy-utils +tifffile<=2020.9.3 # Last version compatible with python 3.6 WebOb diff --git a/pyproject.toml b/pyproject.toml index 12c452d0385..b6aa16e2369 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ sqlparse = "*" starlette = "*" starlette-context = {version = "*", python = ">=3.7"} svgwrite = "*" +tifffile = "<=2020.9.3" # Last version compatible with python 3.6 uvicorn = "*" WebOb = "*" Whoosh = "*"