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 = "*"