From 24f3acae3961e24f5cabc862b9a450b2bf2bda0e Mon Sep 17 00:00:00 2001 From: R Schwanhold Date: Wed, 22 Jan 2020 16:23:08 +0100 Subject: [PATCH] High-level dataset library (#165) * only log downsampling for each MB ob precessed data * log every gigabyte instead of every megabyte * implement PR feedback * WIP: implement high level dataset api * WIP: implement TiffMag * implement test for dataset api * refactor high level dataset api * add test data for WKDataset * improve high level dataset api and add more tests * use seed in tests to achieve deterministic behaviour * implement a test for writing out of bounds with a wk_slice * improve quality of dataset tests * make naming schema of test files consistent * implement PR feedback * rename tiffs in testdata * Improve error message and reformat code * add type annotation * rename Slice to View * remove comments and reformat code * add scikit-image (which is needed for skimage) as dependency * update version of scikit-image * fix relative paths in tests * reformat code --- poetry.lock | 249 +++++++- pyproject.toml | 1 + .../simple_tiff_dataset/color/1/00000.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00001.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00002.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00003.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00004.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00005.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00006.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00007.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00008.tif | Bin 0 -> 21408 bytes .../simple_tiff_dataset/color/1/00009.tif | Bin 0 -> 21408 bytes .../datasource-properties.json | 40 ++ testdata/simple_wk_dataset/color/1/header.wkw | Bin 0 -> 16 bytes .../simple_wk_dataset/color/1/z0/y0/x0.wkw | Bin 0 -> 98320 bytes .../datasource-properties.json | 38 ++ tests/test_dataset.py | 532 ++++++++++++++++++ wkcuber/api/Dataset.py | 169 ++++++ wkcuber/api/Layer.py | 130 +++++ wkcuber/api/MagDataset.py | 116 ++++ wkcuber/api/Properties.py | 317 +++++++++++ wkcuber/api/TiffData/TiffMag.py | 227 ++++++++ wkcuber/api/View.py | 119 ++++ 23 files changed, 1936 insertions(+), 2 deletions(-) create mode 100644 testdata/simple_tiff_dataset/color/1/00000.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00001.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00002.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00003.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00004.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00005.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00006.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00007.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00008.tif create mode 100644 testdata/simple_tiff_dataset/color/1/00009.tif create mode 100644 testdata/simple_tiff_dataset/datasource-properties.json create mode 100644 testdata/simple_wk_dataset/color/1/header.wkw create mode 100644 testdata/simple_wk_dataset/color/1/z0/y0/x0.wkw create mode 100644 testdata/simple_wk_dataset/datasource-properties.json create mode 100644 tests/test_dataset.py create mode 100644 wkcuber/api/Dataset.py create mode 100644 wkcuber/api/Layer.py create mode 100644 wkcuber/api/MagDataset.py create mode 100644 wkcuber/api/Properties.py create mode 100644 wkcuber/api/TiffData/TiffMag.py create mode 100644 wkcuber/api/View.py diff --git a/poetry.lock b/poetry.lock index e56095003..2e14a367a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -126,6 +126,25 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.3" +[[package]] +category = "main" +description = "Composable style cycles" +name = "cycler" +optional = false +python-versions = "*" +version = "0.10.0" + +[package.dependencies] +six = "*" + +[[package]] +category = "main" +description = "Decorators for Humans" +name = "decorator" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.4.1" + [[package]] category = "main" description = "Internationalized Domain Names in Applications (IDNA)" @@ -134,6 +153,25 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.8" +[[package]] +category = "main" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +name = "imageio" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.6.1" + +[package.dependencies] +numpy = "*" +pillow = "*" + +[package.extras] +ffmpeg = ["imageio-ffmpeg"] +fits = ["astropy"] +full = ["astropy", "gdal", "imageio-ffmpeg", "itk"] +gdal = ["gdal"] +itk = ["itk"] + [[package]] category = "dev" description = "Read metadata from Python packages" @@ -164,6 +202,17 @@ pyproject = ["toml"] requirements = ["pipreqs", "pip-api"] xdg_home = ["appdirs (>=1.4.0)"] +[[package]] +category = "main" +description = "A fast implementation of the Cassowary constraint solver" +name = "kiwisolver" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.1.0" + +[package.dependencies] +setuptools = "*" + [[package]] category = "dev" description = "A fast and thorough lazy object proxy." @@ -172,6 +221,21 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.4.3" +[[package]] +category = "main" +description = "Python plotting package" +name = "matplotlib" +optional = false +python-versions = ">=3.6" +version = "3.1.2" + +[package.dependencies] +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.11" +pyparsing = ">=2.0.1,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6" +python-dateutil = ">=2.1" + [[package]] category = "dev" description = "McCabe checker, plugin for flake8" @@ -200,6 +264,30 @@ version = "6.2.0" fast = ["fastnumbers (>=2.0.0)"] icu = ["PyICU (>=1.0.0)"] +[[package]] +category = "main" +description = "Python package for creating and manipulating graphs and networks" +name = "networkx" +optional = false +python-versions = ">=3.5" +version = "2.4" + +[package.dependencies] +decorator = ">=4.3.0" + +[package.extras] +all = ["numpy", "scipy", "pandas", "matplotlib", "pygraphviz", "pydot", "pyyaml", "gdal", "lxml", "pytest"] +gdal = ["gdal"] +lxml = ["lxml"] +matplotlib = ["matplotlib"] +numpy = ["numpy"] +pandas = ["pandas"] +pydot = ["pydot"] +pygraphviz = ["pygraphviz"] +pytest = ["pytest"] +pyyaml = ["pyyaml"] +scipy = ["scipy"] + [[package]] category = "main" description = "Access a multitude of neuroimaging data formats" @@ -304,7 +392,7 @@ isort = ">=4.2.5,<5" mccabe = ">=0.6,<0.7" [[package]] -category = "dev" +category = "main" description = "Python parsing module" name = "pyparsing" optional = false @@ -336,6 +424,28 @@ version = ">=0.12" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +category = "main" +description = "Extensions to the standard Python datetime module" +name = "python-dateutil" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.1" + +[package.dependencies] +six = ">=1.5" + +[[package]] +category = "main" +description = "PyWavelets, wavelet transform module" +name = "pywavelets" +optional = false +python-versions = ">=3.5" +version = "1.1.1" + +[package.dependencies] +numpy = ">=1.13.3" + [[package]] category = "main" description = "YAML parser and emitter for Python" @@ -362,6 +472,27 @@ urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +[[package]] +category = "main" +description = "Image processing routines for SciPy" +name = "scikit-image" +optional = false +python-versions = ">=3.6" +version = "0.16.2" + +[package.dependencies] +PyWavelets = ">=0.4.0" +imageio = ">=2.3.0" +matplotlib = ">=2.0.0,<3.0.0 || >3.0.0" +networkx = ">=2.0" +pillow = ">=4.3.0" +scipy = ">=0.19.0" + +[package.extras] +docs = ["sphinx (>=1.3,<1.7.8 || >1.7.8)", "numpydoc (>=0.9)", "sphinx-gallery", "sphinx-copybutton", "pytest-runner", "scikit-learn", "matplotlib (>=3.0.1)", "dask (>=0.15.0)", "cloudpickle (>=0.2.1)"] +optional = ["simpleitk", "astropy (>=1.2.0)", "tifffile", "qtpy", "pyamg", "dask (>=0.15.0)", "cloudpickle (>=0.2.1)"] +test = ["pytest (!=3.7.3)", "pytest-cov", "pytest-localserver", "flake8", "codecov"] + [[package]] category = "main" description = "SciPy: Scientific Library for Python" @@ -464,7 +595,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "contextlib2", "unittest2"] [metadata] -content-hash = "fa3824bee7012c6b2f52d0972a77158fb0204c2dde9a12d8f0b0ec3030b13e16" +content-hash = "273409b6423b78dda553b1088ce6abbf6324ceabfd02f925bbd39f1d35b259aa" python-versions = "^3.6" [metadata.files] @@ -546,10 +677,22 @@ colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, ] +cycler = [ + {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, + {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, +] +decorator = [ + {file = "decorator-4.4.1-py2.py3-none-any.whl", hash = "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d"}, + {file = "decorator-4.4.1.tar.gz", hash = "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce"}, +] idna = [ {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"}, {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, ] +imageio = [ + {file = "imageio-2.6.1-py3-none-any.whl", hash = "sha256:c9763e5c187ecf74091c845626b0bdcc6130a20a0de7a86ae0108e2b5335ed3f"}, + {file = "imageio-2.6.1.tar.gz", hash = "sha256:f44eb231b9df485874f2ffd22dfd0c3c711e7de076516b9374edea5c65bc67ae"}, +] importlib-metadata = [ {file = "importlib_metadata-1.3.0-py2.py3-none-any.whl", hash = "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f"}, {file = "importlib_metadata-1.3.0.tar.gz", hash = "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45"}, @@ -558,6 +701,45 @@ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, ] +kiwisolver = [ + {file = "kiwisolver-1.1.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7f4dd50874177d2bb060d74769210f3bce1af87a8c7cf5b37d032ebf94f0aca3"}, + {file = "kiwisolver-1.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:fe51b79da0062f8e9d49ed0182a626a7dc7a0cbca0328f612c6ee5e4711c81e4"}, + {file = "kiwisolver-1.1.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f790f8b3dff3d53453de6a7b7ddd173d2e020fb160baff578d578065b108a05f"}, + {file = "kiwisolver-1.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b22153870ca5cf2ab9c940d7bc38e8e9089fa0f7e5856ea195e1cf4ff43d5a"}, + {file = "kiwisolver-1.1.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e8bf074363ce2babeb4764d94f8e65efd22e6a7c74860a4f05a6947afc020ff2"}, + {file = "kiwisolver-1.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:05b5b061e09f60f56244adc885c4a7867da25ca387376b02c1efc29cc16bcd0f"}, + {file = "kiwisolver-1.1.0-cp27-none-win32.whl", hash = "sha256:47b8cb81a7d18dbaf4fed6a61c3cecdb5adec7b4ac292bddb0d016d57e8507d5"}, + {file = "kiwisolver-1.1.0-cp27-none-win_amd64.whl", hash = "sha256:b64916959e4ae0ac78af7c3e8cef4becee0c0e9694ad477b4c6b3a536de6a544"}, + {file = "kiwisolver-1.1.0-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:682e54f0ce8f45981878756d7203fd01e188cc6c8b2c5e2cf03675390b4534d5"}, + {file = "kiwisolver-1.1.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:d52e3b1868a4e8fd18b5cb15055c76820df514e26aa84cc02f593d99fef6707f"}, + {file = "kiwisolver-1.1.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:8aa7009437640beb2768bfd06da049bad0df85f47ff18426261acecd1cf00897"}, + {file = "kiwisolver-1.1.0-cp34-none-win32.whl", hash = "sha256:26f4fbd6f5e1dabff70a9ba0d2c4bd30761086454aa30dddc5b52764ee4852b7"}, + {file = "kiwisolver-1.1.0-cp34-none-win_amd64.whl", hash = "sha256:79bfb2f0bd7cbf9ea256612c9523367e5ec51d7cd616ae20ca2c90f575d839a2"}, + {file = "kiwisolver-1.1.0-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3b2378ad387f49cbb328205bda569b9f87288d6bc1bf4cd683c34523a2341efe"}, + {file = "kiwisolver-1.1.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:aa716b9122307c50686356cfb47bfbc66541868078d0c801341df31dca1232a9"}, + {file = "kiwisolver-1.1.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:58e626e1f7dfbb620d08d457325a4cdac65d1809680009f46bf41eaf74ad0187"}, + {file = "kiwisolver-1.1.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e3a21a720791712ed721c7b95d433e036134de6f18c77dbe96119eaf7aa08004"}, + {file = "kiwisolver-1.1.0-cp35-none-win32.whl", hash = "sha256:939f36f21a8c571686eb491acfffa9c7f1ac345087281b412d63ea39ca14ec4a"}, + {file = "kiwisolver-1.1.0-cp35-none-win_amd64.whl", hash = "sha256:9733b7f64bd9f807832d673355f79703f81f0b3e52bfce420fc00d8cb28c6a6c"}, + {file = "kiwisolver-1.1.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:acc4df99308111585121db217681f1ce0eecb48d3a828a2f9bbf9773f4937e9e"}, + {file = "kiwisolver-1.1.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:9105ce82dcc32c73eb53a04c869b6a4bc756b43e4385f76ea7943e827f529e4d"}, + {file = "kiwisolver-1.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f16814a4a96dc04bf1da7d53ee8d5b1d6decfc1a92a63349bb15d37b6a263dd9"}, + {file = "kiwisolver-1.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:400599c0fe58d21522cae0e8b22318e09d9729451b17ee61ba8e1e7c0346565c"}, + {file = "kiwisolver-1.1.0-cp36-none-win32.whl", hash = "sha256:db1a5d3cc4ae943d674718d6c47d2d82488ddd94b93b9e12d24aabdbfe48caee"}, + {file = "kiwisolver-1.1.0-cp36-none-win_amd64.whl", hash = "sha256:5a52e1b006bfa5be04fe4debbcdd2688432a9af4b207a3f429c74ad625022641"}, + {file = "kiwisolver-1.1.0-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:a02f6c3e229d0b7220bd74600e9351e18bc0c361b05f29adae0d10599ae0e326"}, + {file = "kiwisolver-1.1.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9491578147849b93e70d7c1d23cb1229458f71fc79c51d52dce0809b2ca44eea"}, + {file = "kiwisolver-1.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5c7ca4e449ac9f99b3b9d4693debb1d6d237d1542dd6a56b3305fe8a9620f883"}, + {file = "kiwisolver-1.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a0c0a9f06872330d0dd31b45607197caab3c22777600e88031bfe66799e70bb0"}, + {file = "kiwisolver-1.1.0-cp37-none-win32.whl", hash = "sha256:8944a16020c07b682df861207b7e0efcd2f46c7488619cb55f65882279119389"}, + {file = "kiwisolver-1.1.0-cp37-none-win_amd64.whl", hash = "sha256:d3fcf0819dc3fea58be1fd1ca390851bdb719a549850e708ed858503ff25d995"}, + {file = "kiwisolver-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:933df612c453928f1c6faa9236161a1d999a26cd40abf1dc5d7ebbc6dbfb8fca"}, + {file = "kiwisolver-1.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d22702cadb86b6fcba0e6b907d9f84a312db9cd6934ee728144ce3018e715ee1"}, + {file = "kiwisolver-1.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:210d8c39d01758d76c2b9a693567e1657ec661229bc32eac30761fa79b2474b0"}, + {file = "kiwisolver-1.1.0-cp38-none-win32.whl", hash = "sha256:76275ee077772c8dde04fb6c5bc24b91af1bb3e7f4816fd1852f1495a64dad93"}, + {file = "kiwisolver-1.1.0-cp38-none-win_amd64.whl", hash = "sha256:3b15d56a9cd40c52d7ab763ff0bc700edbb4e1a298dc43715ecccd605002cf11"}, + {file = "kiwisolver-1.1.0.tar.gz", hash = "sha256:53eaed412477c836e1b9522c19858a8557d6e595077830146182225613b11a75"}, +] lazy-object-proxy = [ {file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, {file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"}, @@ -581,6 +763,21 @@ lazy-object-proxy = [ {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"}, {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"}, ] +matplotlib = [ + {file = "matplotlib-3.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:98c2ffeab8b79a4e3a0af5dd9939f92980eb6e3fec10f7f313df5f35a84dacab"}, + {file = "matplotlib-3.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d6ab54015a7c0d727c33e36f85f5c5e4172059efdd067f7527f6e5d16ad01aa"}, + {file = "matplotlib-3.1.2-cp36-cp36m-win32.whl", hash = "sha256:819d4860315468b482f38f1afe45a5437f60f03eaede495d5ff89f2eeac89500"}, + {file = "matplotlib-3.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:08ccc8922eb4792b91c652d3e6d46b1c99073f1284d1b6705155643e8046463a"}, + {file = "matplotlib-3.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f9e885bfa1b148d16f82a6672d043ecf11197f6c71ae222d0546db706e52eb2"}, + {file = "matplotlib-3.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8cc0e44905c2c8fda5637cad6f311eb9517017515a034247ab93d0cf99f8bb7a"}, + {file = "matplotlib-3.1.2-cp37-cp37m-win32.whl", hash = "sha256:161dcd807c0c3232f4dcd4a12a382d52004a498174cbfafd40646106c5bcdcc8"}, + {file = "matplotlib-3.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ee59b7bb9eb75932fe3787e54e61c99b628155b0cedc907864f24723ba55b309"}, + {file = "matplotlib-3.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5d2e408a2813abf664bd79431107543ecb449136912eb55bb312317edecf597e"}, + {file = "matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d59bb0e82002ac49f4152963f8a1079e66794a4f454457fd2f0dcc7bf0797d30"}, + {file = "matplotlib-3.1.2-cp38-cp38-win32.whl", hash = "sha256:61c8b740a008218eb604de518eb411c4953db0cb725dd0b32adf8a81771cab9e"}, + {file = "matplotlib-3.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:80f10af8378fccc136da40ea6aa4a920767476cdfb3241acb93ef4f0465dbf57"}, + {file = "matplotlib-3.1.2.tar.gz", hash = "sha256:8e8e2c2fe3d873108735c6ee9884e6f36f467df4a143136209cff303b183bada"}, +] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, @@ -593,6 +790,10 @@ natsort = [ {file = "natsort-6.2.0-py2.py3-none-any.whl", hash = "sha256:4f0de45639f1fa43dede43ae1919bcab66e0a6fc19b68ea24f0a250814b4f176"}, {file = "natsort-6.2.0.tar.gz", hash = "sha256:58c6fb2f355117e88a19808394ec1ed30a2ff881bdd2c81c436952caebd30668"}, ] +networkx = [ + {file = "networkx-2.4-py3-none-any.whl", hash = "sha256:cdfbf698749a5014bf2ed9db4a07a5295df1d3a53bf80bf3cbd61edf9df05fa1"}, + {file = "networkx-2.4.tar.gz", hash = "sha256:f8f4ff0b6f96e4f9b16af6b84622597b5334bf9cae8cf9b2e42e7985d5c95c64"}, +] nibabel = [ {file = "nibabel-2.5.1-py2-none-any.whl", hash = "sha256:88a8867aa5a1eec70dc74c880d149539918b2983430bf3c3f3bca0a46bd9a7f4"}, {file = "nibabel-2.5.1-py3-none-any.whl", hash = "sha256:44678e9ec6151643736329103987c70f4a7b5b251e2ebb7012648365f29e2324"}, @@ -693,6 +894,33 @@ pytest = [ {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"}, {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"}, ] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +pywavelets = [ + {file = "PyWavelets-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:35959c041ec014648575085a97b498eafbbaa824f86f6e4a59bfdef8a3fe6308"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:55e39ec848ceec13c9fa1598253ae9dd5c31d09dfd48059462860d2b908fb224"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c06d2e340c7bf8b9ec71da2284beab8519a3908eab031f4ea126e8ccfc3fd567"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:be105382961745f88d8196bba5a69ee2c4455d87ad2a2e5d1eed6bd7fda4d3fd"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:076ca8907001fdfe4205484f719d12b4a0262dfe6652fa1cfc3c5c362d14dc84"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7947e51ca05489b85928af52a34fe67022ab5b81d4ae32a4109a99e883a0635e"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9e2528823ccf5a0a1d23262dfefe5034dce89cd84e4e124dc553dfcdf63ebb92"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:80b924edbc012ded8aa8b91cb2fd6207fb1a9a3a377beb4049b8a07445cec6f0"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:d510aef84d9852653d079c84f2f81a82d5d09815e625f35c95714e7364570ad4"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:889d4c5c5205a9c90118c1980df526857929841df33e4cd1ff1eff77c6817a65"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68b5c33741d26c827074b3d8f0251de1c3019bb9567b8d303eb093c822ce28f1"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18a51b3f9416a2ae6e9a35c4af32cf520dd7895f2b69714f4aa2f4342fca47f9"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cfe79844526dd92e3ecc9490b5031fca5f8ab607e1e858feba232b1b788ff0ea"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:720dbcdd3d91c6dfead79c80bf8b00a1d8aa4e5d551dc528c6d5151e4efc3403"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bc5e87b72371da87c9bebc68e54882aada9c3114e640de180f62d5da95749cd3"}, + {file = "PyWavelets-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:98b2669c5af842a70cfab33a7043fcb5e7535a690a00cd251b44c9be0be418e5"}, + {file = "PyWavelets-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e02a0558e0c2ac8b8bbe6a6ac18c136767ec56b96a321e0dfde2173adfa5a504"}, + {file = "PyWavelets-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6162dc0ae04669ea04b4b51420777b9ea2d30b0a9d02901b2a3b4d61d159c2e9"}, + {file = "PyWavelets-1.1.1-cp38-cp38-win32.whl", hash = "sha256:79f5b54f9dc353e5ee47f0c3f02bebd2c899d49780633aa771fed43fa20b3149"}, + {file = "PyWavelets-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:935ff247b8b78bdf77647fee962b1cc208c51a7b229db30b9ba5f6da3e675178"}, + {file = "PyWavelets-1.1.1.tar.gz", hash = "sha256:1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9"}, +] pyyaml = [ {file = "PyYAML-5.2-cp27-cp27m-win32.whl", hash = "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc"}, {file = "PyYAML-5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4"}, @@ -710,6 +938,23 @@ requests = [ {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"}, {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"}, ] +scikit-image = [ + {file = "scikit-image-0.16.2.tar.gz", hash = "sha256:dd7fbd32da74d4e9967dc15845f731f16e7966cee61f5dc0e12e2abb1305068c"}, + {file = "scikit_image-0.16.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:0808ab5f8218d91a1c008036993636535a37efd67a52ab0f2e6e3f4b7e75aeda"}, + {file = "scikit_image-0.16.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3af3d781ce085573ced37b2b5b9abfd32ce3d4723bd17f37e829025d189b0421"}, + {file = "scikit_image-0.16.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:063d1c20fcd53762f82ee58c29783ae4e8f6fbed445b41b704fa33b6f355729d"}, + {file = "scikit_image-0.16.2-cp36-cp36m-win32.whl", hash = "sha256:2a54bea469eb1b611bee1ce36e60710f5f94f29205bc5bd67a51793909b1e62b"}, + {file = "scikit_image-0.16.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2d346d49b6852cffb47cbde995e2696d5b07f688d8c057a0a4548abf3a98f920"}, + {file = "scikit_image-0.16.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8b2b768b02c6b7476f2e16ddd91f827d3817aef73f82cf28bff7a8dcdfd8c55c"}, + {file = "scikit_image-0.16.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3ad2efa792ab8de5fcefe6f4f5bc1ab64c411cdb5c829ce1526ab3a5a7729627"}, + {file = "scikit_image-0.16.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2aa962aa82d815606d7dad7f045f5d7ca55c65b4320d47e15a98fc92612c2d6c"}, + {file = "scikit_image-0.16.2-cp37-cp37m-win32.whl", hash = "sha256:e774377876cb258e8f4d63f7809863f961c98aa02263b3ff54a39483bc6f7d26"}, + {file = "scikit_image-0.16.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6786b127f33470fd843e644435522fbf43bce05c9f5527946c390ccb9e1cac27"}, + {file = "scikit_image-0.16.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a48fb0d34a090b578b87ffebab0fe035295c1945dbc2b28e1a55ea2cf6031751"}, + {file = "scikit_image-0.16.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:41e28db0136f29ecd305bef0408fdfc64be9d415e54f5099a95555c65f5c1865"}, + {file = "scikit_image-0.16.2-cp38-cp38-win32.whl", hash = "sha256:0715b7940778ba5d73da3908d60ddf2eb93863f7c394493a522fe56d3859295c"}, + {file = "scikit_image-0.16.2-cp38-cp38-win_amd64.whl", hash = "sha256:e18d73cc8893e2268b172c29f9aab530faf8cd3b7c11ae0bee3e763d719d35c5"}, +] scipy = [ {file = "scipy-1.4.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:1b51721e5792c4d722e0cab4daf82187d5f22f2e42c56cd247398a16e4d2f48d"}, {file = "scipy-1.4.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:cdbcfbe97a21fc6b3c55991a7bcd6a278a38bd197e2d274a45611cdc91beb5c0"}, diff --git a/pyproject.toml b/pyproject.toml index a179e77d1..e4d5264d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ cluster_tools = "1.46" natsort = "^6.2.0" psutil = "^5.6.7" nibabel = "^2.5.1" +scikit-image = "^0.16.2" [tool.poetry.dev-dependencies] pylint = "2.3.1" diff --git a/testdata/simple_tiff_dataset/color/1/00000.tif b/testdata/simple_tiff_dataset/color/1/00000.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00001.tif b/testdata/simple_tiff_dataset/color/1/00001.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00002.tif b/testdata/simple_tiff_dataset/color/1/00002.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00003.tif b/testdata/simple_tiff_dataset/color/1/00003.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00004.tif b/testdata/simple_tiff_dataset/color/1/00004.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00005.tif b/testdata/simple_tiff_dataset/color/1/00005.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00006.tif b/testdata/simple_tiff_dataset/color/1/00006.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00007.tif b/testdata/simple_tiff_dataset/color/1/00007.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00008.tif b/testdata/simple_tiff_dataset/color/1/00008.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/color/1/00009.tif b/testdata/simple_tiff_dataset/color/1/00009.tif new file mode 100644 index 0000000000000000000000000000000000000000..ae964cd4cccab32b81fbbf7d69cfbd124ab43a2c GIT binary patch literal 21408 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

-uF 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 U-v#@}dbVP!ptHFDuD&YhKh=GUKL7v# literal 0 HcmV?d00001 diff --git a/testdata/simple_tiff_dataset/datasource-properties.json b/testdata/simple_tiff_dataset/datasource-properties.json new file mode 100644 index 000000000..93ecef44f --- /dev/null +++ b/testdata/simple_tiff_dataset/datasource-properties.json @@ -0,0 +1,40 @@ +{ + "id": { + "name": "tiff_dataset_1", + "team": "" + }, + "scale": [ + 1 + ], + "dataLayers": [ + { + "name": "color", + "category": "color", + "elementClass": "uint8", + "num_channels": 1, + "boundingBox": { + "topLeft": [ + 0, + 0, + 0 + ], + "width": 265, + "height": 265, + "depth": 10 + }, + "wkwResolutions": [ + { + "resolution": [ + 1, + 1, + 1 + ] + } + ] + } + ], + "grid_shape": [ + 0, + 0 + ] +} diff --git a/testdata/simple_wk_dataset/color/1/header.wkw b/testdata/simple_wk_dataset/color/1/header.wkw new file mode 100644 index 0000000000000000000000000000000000000000..70b76607f25c5d9bb8fdf8c67406fa4e183c8814 GIT binary patch literal 16 RcmWId4rf$mWMpQ50ss(*0V4na literal 0 HcmV?d00001 diff --git a/testdata/simple_wk_dataset/color/1/z0/y0/x0.wkw b/testdata/simple_wk_dataset/color/1/z0/y0/x0.wkw new file mode 100644 index 0000000000000000000000000000000000000000..3906c14714032fb653e1459e87eb6d9d7bf71d28 GIT binary patch literal 98320 zcmeIuK@|WX2n8_zvw$6pLjd|W;Yx@t!n!&?x$j`WfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj wFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0Rwwr0IU1~GXMYp literal 0 HcmV?d00001 diff --git a/testdata/simple_wk_dataset/datasource-properties.json b/testdata/simple_wk_dataset/datasource-properties.json new file mode 100644 index 000000000..7b13d0bf7 --- /dev/null +++ b/testdata/simple_wk_dataset/datasource-properties.json @@ -0,0 +1,38 @@ +{ + "id": { + "name": "simple_wk_dataset", + "team": "" + }, + "scale": [ + 1 + ], + "dataLayers": [ + { + "dataFormat": "wkw", + "name": "color", + "category": "color", + "elementClass": "uint8", + "num_channels": 3, + "boundingBox": { + "topLeft": [ + 0, + 0, + 0 + ], + "width": 24, + "height": 24, + "depth": 24 + }, + "wkwResolutions": [ + { + "resolution": [ + 1, + 1, + 1 + ], + "cube_length": 32 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/test_dataset.py b/tests/test_dataset.py new file mode 100644 index 000000000..3175eeada --- /dev/null +++ b/tests/test_dataset.py @@ -0,0 +1,532 @@ +import filecmp + +import numpy as np +from shutil import rmtree, copytree + +from wkcuber.api.Dataset import WKDataset, TiffDataset +from os import path, makedirs + +from wkcuber.api.Layer import Layer +from wkcuber.api.Properties import TiffProperties +from wkcuber.mag import Mag + + +def delete_dir(relative_path): + if path.exists(relative_path) and path.isdir(relative_path): + rmtree(relative_path) + + +def test_create_wk_dataset_with_layer_and_mag(): + delete_dir("./testoutput/wk_dataset") + + ds = WKDataset.create("./testoutput/wk_dataset", scale=(1, 1, 1)) + ds.add_layer("color", "color") + + ds.get_layer("color").add_mag("1") + ds.get_layer("color").add_mag("2-2-1") + + assert path.exists("./testoutput/wk_dataset/color/1") + assert path.exists("./testoutput/wk_dataset/color/2-2-1") + + assert len(ds.properties.data_layers) == 1 + assert len(ds.properties.data_layers["color"].wkw_magnifications) == 2 + + +def test_create_wk_dataset_with_explicit_header_fields(): + delete_dir("./testoutput/wk_dataset_advanced") + + ds = WKDataset.create("./testoutput/wk_dataset_advanced", scale=(1, 1, 1)) + ds.add_layer("color", "color", dtype=np.uint16, num_channels=3) + + ds.get_layer("color").add_mag("1", block_len=64, file_len=64) + ds.get_layer("color").add_mag("2-2-1") + + assert path.exists("./testoutput/wk_dataset_advanced/color/1") + assert path.exists("./testoutput/wk_dataset_advanced/color/2-2-1") + + assert len(ds.properties.data_layers) == 1 + assert len(ds.properties.data_layers["color"].wkw_magnifications) == 2 + + assert ds.properties.data_layers["color"].element_class == np.dtype(np.uint16) + assert ( + ds.properties.data_layers["color"].wkw_magnifications[0].cube_length == 64 * 64 + ) # mag "1" + assert ds.properties.data_layers["color"].wkw_magnifications[0].mag == Mag("1") + assert ( + ds.properties.data_layers["color"].wkw_magnifications[1].cube_length == 32 * 32 + ) # mag "2-2-1" (defaults are used) + assert ds.properties.data_layers["color"].wkw_magnifications[1].mag == Mag("2-2-1") + + +def test_create_tiff_dataset_with_layer_and_mag(): + # This test would be the same for WKDataset + + delete_dir("./testoutput/tiff_dataset") + + ds = WKDataset.create("./testoutput/tiff_dataset", scale=(1, 1, 1)) + ds.add_layer("color", Layer.COLOR_TYPE) + + ds.get_layer("color").add_mag("1") + ds.get_layer("color").add_mag("2-2-1") + + assert path.exists("./testoutput/tiff_dataset/color/1") + assert path.exists("./testoutput/tiff_dataset/color/2-2-1") + + assert len(ds.properties.data_layers) == 1 + assert len(ds.properties.data_layers["color"].wkw_magnifications) == 2 + + +def test_open_wk_dataset(): + ds = WKDataset("./testdata/simple_wk_dataset") + + assert len(ds.properties.data_layers) == 1 + assert len(ds.properties.data_layers["color"].wkw_magnifications) == 1 + + +def test_open_tiff_dataset(): + ds = TiffDataset("./testdata/simple_tiff_dataset") + + assert len(ds.properties.data_layers) == 1 + assert len(ds.properties.data_layers["color"].wkw_magnifications) == 1 + + +def test_view_read_with_open(): + # This test would be the same for TiffDataset + + wk_view = WKDataset("./testdata/simple_wk_dataset/").get_view( + "color", "1", size=(32, 32, 32) + ) + + assert not wk_view._is_opened + + with wk_view.open(): + assert wk_view._is_opened + + data = wk_view.read((10, 10, 10)) + assert data.shape == (3, 10, 10, 10) # three channel + + assert not wk_view._is_opened + + +def test_view_read_without_open(): + # This test would be the same for TiffDataset + + wk_view = WKDataset("./testdata/simple_wk_dataset/").get_view( + "color", "1", size=(32, 32, 32) + ) + + assert not wk_view._is_opened + + # 'read()' checks if it was already opened. If not, it opens and closes automatically + data = wk_view.read((10, 10, 10)) + assert data.shape == (3, 10, 10, 10) # three channel + + assert not wk_view._is_opened + + +def test_view_wk_write(): + delete_dir("./testoutput/simple_wk_dataset/") + copytree("./testdata/simple_wk_dataset/", "./testoutput/simple_wk_dataset/") + + wk_view = WKDataset("./testoutput/simple_wk_dataset/").get_view( + "color", "1", size=(100, 100, 100) + ) + + with wk_view.open(): + np.random.seed(1234) + write_data = (np.random.rand(3, 10, 10, 10) * 255).astype(np.uint8) + + wk_view.write(write_data) + + data = wk_view.read((10, 10, 10)) + assert np.array_equal(data, write_data) + + +def test_view_tiff_write(): + delete_dir("./testoutput/simple_tiff_dataset/") + copytree("./testdata/simple_tiff_dataset/", "./testoutput/simple_tiff_dataset/") + + tiff_view = TiffDataset("./testoutput/simple_tiff_dataset/").get_view( + "color", "1", size=(100, 100, 100) + ) + + with tiff_view.open(): + np.random.seed(1234) + write_data = (np.random.rand(5, 5, 5) * 255).astype(np.uint8) + + tiff_view.write(write_data) + + data = tiff_view.read((5, 5, 5)) + assert data.shape == (1, 5, 5, 5) # this dataset has only one channel + assert np.array_equal(data, np.expand_dims(write_data, 0)) + + +def test_view_tiff_write_out_of_bounds(): + new_dataset_path = "./testoutput/tiff_view_dataset_out_of_bounds/" + + delete_dir(new_dataset_path) + copytree("./testdata/simple_tiff_dataset/", new_dataset_path) + + tiff_view = TiffDataset(new_dataset_path).get_view( + "color", "1", size=(100, 100, 100) + ) + + with tiff_view.open(): + try: + tiff_view.write( + np.zeros((200, 200, 5), dtype=np.uint8) + ) # this is bigger than the bounding_box + raise Exception( + "The test 'test_view_tiff_write_out_of_bounds' did not throw an exception even though it should" + ) + except AssertionError: + pass + + +def test_view_wk_write_out_of_bounds(): + new_dataset_path = "./testoutput/wk_view_dataset_out_of_bounds/" + + delete_dir(new_dataset_path) + copytree("./testdata/simple_wk_dataset/", new_dataset_path) + + tiff_view = WKDataset(new_dataset_path).get_view("color", "1", size=(100, 100, 100)) + + with tiff_view.open(): + try: + tiff_view.write( + np.zeros((200, 200, 5), dtype=np.uint8) + ) # this is bigger than the bounding_box + raise Exception( + "The test 'test_view_wk_write_out_of_bounds' did not throw an exception even though it should" + ) + except AssertionError: + pass + + +def test_tiff_write_out_of_bounds(): + new_dataset_path = "./testoutput/simple_tiff_dataset_out_of_bounds/" + + delete_dir(new_dataset_path) + copytree("./testdata/simple_tiff_dataset/", new_dataset_path) + + ds = TiffDataset(new_dataset_path) + mag_dataset = ds.get_layer("color").get_mag("1") + + assert ds.properties.data_layers["color"].get_bounding_box_size() == (265, 265, 10) + mag_dataset.write( + np.zeros((300, 300, 15), dtype=np.uint8) + ) # this is bigger than the bounding_box + assert ds.properties.data_layers["color"].get_bounding_box_size() == (300, 300, 15) + + +def test_wk_write_out_of_bounds(): + new_dataset_path = "./testoutput/simple_wk_dataset_out_of_bounds/" + + delete_dir(new_dataset_path) + copytree("./testdata/simple_wk_dataset/", new_dataset_path) + + ds = WKDataset(new_dataset_path) + mag_dataset = ds.get_layer("color").get_mag("1") + + assert ds.properties.data_layers["color"].get_bounding_box_size() == (24, 24, 24) + mag_dataset.write( + np.zeros((3, 1, 1, 48), dtype=np.uint8) + ) # this is bigger than the bounding_box + assert ds.properties.data_layers["color"].get_bounding_box_size() == (24, 24, 48) + + +def test_update_new_bounding_box_offset(): + # This test would be the same for WKDataset + + delete_dir("./testoutput/tiff_dataset") + + ds = TiffDataset.create("./testoutput/tiff_dataset", scale=(1, 1, 1)) + mag = ds.add_layer("color", Layer.COLOR_TYPE).add_mag("1") + + assert ds.properties.data_layers["color"].bounding_box["topLeft"] == (-1, -1, -1) + + np.random.seed(1234) + write_data = (np.random.rand(10, 10, 10) * 255).astype(np.uint8) + mag.write( + write_data, offset=(10, 10, 10) + ) # the write method of MagDataset does always use the relative offset to (0, 0, 0) + assert ds.properties.data_layers["color"].bounding_box["topLeft"] == (10, 10, 10) + + mag.write( + write_data, offset=(5, 5, 20) + ) # the write method of MagDataset does always use the relative offset to (0, 0, 0) + assert ds.properties.data_layers["color"].bounding_box["topLeft"] == (5, 5, 10) + + +def test_tiff_write_multi_channel_uint8(): + dataset_path = "./testoutput/tiff_multichannel/" + delete_dir(dataset_path) + + ds_tiff = TiffDataset.create(dataset_path, scale=(1, 1, 1)) + mag = ds_tiff.add_layer("color", Layer.COLOR_TYPE, num_channels=3).add_mag("1") + + # 10 images (z-layers), each 250x250, dtype=np.uint8 + data = np.zeros((3, 250, 250, 10), dtype=np.uint8) + for h in range(10): + for i in range(250): + for j in range(250): + data[0, i, j, h] = i + data[1, i, j, h] = j + data[2, i, j, h] = 100 + + ds_tiff.get_layer("color").get_mag("1").write(data) + + assert np.array_equal(data, mag.read(size=(250, 250, 10))) + + +def test_wk_write_multi_channel_uint8(): + dataset_path = "./testoutput/wk_multichannel/" + delete_dir(dataset_path) + + ds_tiff = WKDataset.create(dataset_path, scale=(1, 1, 1)) + mag = ds_tiff.add_layer("color", Layer.COLOR_TYPE, num_channels=3).add_mag("1") + + # 10 images (z-layers), each 250x250, dtype=np.uint8 + data = np.zeros((3, 250, 250, 10), dtype=np.uint8) + for h in range(10): + for i in range(250): + for j in range(250): + data[0, i, j, h] = i + data[1, i, j, h] = j + data[2, i, j, h] = 100 + + ds_tiff.get_layer("color").get_mag("1").write(data) + + assert np.array_equal(data, mag.read(size=(250, 250, 10))) + + +def test_tiff_write_multi_channel_uint16(): + dataset_path = "./testoutput/tiff_multichannel/" + delete_dir(dataset_path) + + ds_tiff = TiffDataset.create(dataset_path, scale=(1, 1, 1)) + mag = ds_tiff.add_layer( + "color", Layer.COLOR_TYPE, num_channels=3, dtype=np.uint16 + ).add_mag("1") + + # 10 images (z-layers), each 250x250, dtype=np.uint16 + data = np.zeros((3, 250, 250, 10), dtype=np.uint16) + for h in range(10): + for i in range(250): + for j in range(250): + data[0, i, j, h] = i * 256 + data[1, i, j, h] = j * 256 + data[2, i, j, h] = 100 * 256 + + mag.write(data) + written_data = mag.read(size=(250, 250, 10)) + + print(written_data.dtype) + + assert np.array_equal(data, written_data) + + +def test_wk_write_multi_channel_uint16(): + dataset_path = "./testoutput/wk_multichannel/" + delete_dir(dataset_path) + + ds_tiff = WKDataset.create(dataset_path, scale=(1, 1, 1)) + mag = ds_tiff.add_layer( + "color", Layer.COLOR_TYPE, num_channels=3, dtype=np.uint16 + ).add_mag("1") + + # 10 images (z-layers), each 250x250, dtype=np.uint16 + data = np.zeros((3, 250, 250, 10), dtype=np.uint16) + for h in range(10): + for i in range(250): + for j in range(250): + data[0, i, j, h] = i * 256 + data[1, i, j, h] = j * 256 + data[2, i, j, h] = 100 * 256 + + mag.write(data) + written_data = mag.read(size=(250, 250, 10)) + + print(written_data.dtype) + + assert np.array_equal(data, written_data) + + +def test_wkw_empty_read(): + filename = "./testoutput/empty_wk_dataset" + delete_dir(filename) + + mag = ( + WKDataset.create(filename, scale=(1, 1, 1)) + .add_layer("color", Layer.COLOR_TYPE) + .add_mag("1") + ) + data = mag.read(size=(0, 0, 0), offset=(1, 1, 1)) + + assert data.shape == (1, 0, 0, 0) + + +def test_tiff_empty_read(): + filename = "./testoutput/empty_tiff_dataset" + delete_dir(filename) + + mag = ( + TiffDataset.create(filename, scale=(1, 1, 1)) + .add_layer("color", Layer.COLOR_TYPE) + .add_mag("1") + ) + data = mag.read(size=(0, 0, 0), offset=(1, 1, 1)) + + assert data.shape == (1, 0, 0, 0) + + +def test_tiff_read_padded_data(): + filename = "./testoutput/empty_tiff_dataset" + delete_dir(filename) + + mag = ( + TiffDataset.create(filename, scale=(1, 1, 1)) + .add_layer("color", Layer.COLOR_TYPE, num_channels=3) + .add_mag("1") + ) + # there are no tiffs yet, however, this should not fail but pad the data with zeros + data = mag.read(size=(10, 10, 10)) + + assert data.shape == (3, 10, 10, 10) + assert np.array_equal(data, np.zeros((3, 10, 10, 10))) + + +def test_wk_read_padded_data(): + filename = "./testoutput/empty_wk_dataset" + delete_dir(filename) + + mag = ( + WKDataset.create(filename, scale=(1, 1, 1)) + .add_layer("color", Layer.COLOR_TYPE, num_channels=3) + .add_mag("1") + ) + # there is no data yet, however, this should not fail but pad the data with zeros + data = mag.read(size=(10, 10, 10)) + + assert data.shape == (3, 10, 10, 10) + assert np.array_equal(data, np.zeros((3, 10, 10, 10))) + + +def test_read_and_write_of_properties(): + destination_path = "./testoutput/read_write_properties/" + delete_dir(destination_path) + source_file_name = "./testdata/simple_tiff_dataset/datasource-properties.json" + destination_file_name = destination_path + "datasource-properties.json" + + imported_properties = TiffProperties._from_json(source_file_name) + imported_properties._path = destination_file_name + makedirs(destination_path) + imported_properties._export_as_json() + + filecmp.cmp(source_file_name, destination_file_name) + + +def test_num_channel_mismatch_assertion(): + delete_dir("./testoutput/wk_dataset") + + ds = WKDataset.create("./testoutput/wk_dataset", scale=(1, 1, 1)) + mag = ds.add_layer("color", Layer.COLOR_TYPE, num_channels=1).add_mag( + "1" + ) # num_channel=1 is also the default + + np.random.seed(1234) + write_data = (np.random.rand(3, 10, 10, 10) * 255).astype(np.uint8) # 3 channels + + try: + mag.write(write_data) # there is a mismatch between the number of channels + raise Exception( + "The test 'test_num_channel_mismatch_assertion' did not throw an exception even though it should" + ) + except AssertionError: + pass + + +def test_get_or_add_layer(): + # This test would be the same for TiffDataset + + delete_dir("./testoutput/wk_dataset") + + ds = WKDataset.create("./testoutput/wk_dataset", scale=(1, 1, 1)) + + assert "color" not in ds.layers.keys() + + # layer did not exist before + layer = ds.get_or_add_layer( + "color", Layer.COLOR_TYPE, dtype=np.uint8, num_channels=1 + ) + assert "color" in ds.layers.keys() + assert layer.name == "color" + + # layer did exist before + layer = ds.get_or_add_layer( + "color", Layer.COLOR_TYPE, dtype=np.uint8, num_channels=1 + ) + assert "color" in ds.layers.keys() + assert layer.name == "color" + + try: + # layer did exist before but with another 'dtype' (this would work the same for 'category' and 'num_channels') + layer = ds.get_or_add_layer( + "color", Layer.COLOR_TYPE, dtype=np.uint16, num_channels=1 + ) + + raise Exception( + "The test 'test_get_or_add_layer' did not throw an exception even though it should" + ) + except AssertionError: + pass + + +def test_get_or_add_mag_for_wk(): + delete_dir("./testoutput/wk_dataset") + + layer = WKDataset.create("./testoutput/wk_dataset", scale=(1, 1, 1)).add_layer( + "color", Layer.COLOR_TYPE + ) + + assert "1" not in layer.mags.keys() + + # The mag did not exist before + mag = layer.get_or_add_mag("1", block_len=32, file_len=32, block_type=1) + assert "1" in layer.mags.keys() + assert mag.name == "1" + + # The mag did exist before + layer.get_or_add_mag("1", block_len=32, file_len=32, block_type=1) + assert "1" in layer.mags.keys() + assert mag.name == "1" + + try: + # mag did exist before but with another 'block_len' (this would work the same for 'file_len' and 'block_type') + mag = layer.get_or_add_mag("1", block_len=64, file_len=32, block_type=1) + + raise Exception( + "The test 'test_get_or_add_layer' did not throw an exception even though it should" + ) + except AssertionError: + pass + + +def test_get_or_add_mag_for_tiff(): + delete_dir("./testoutput/wk_dataset") + + layer = TiffDataset.create("./testoutput/wk_dataset", scale=(1, 1, 1)).add_layer( + "color", Layer.COLOR_TYPE + ) + + assert "1" not in layer.mags.keys() + + # The mag did not exist before + mag = layer.get_or_add_mag("1") + assert "1" in layer.mags.keys() + assert mag.name == "1" + + # The mag did exist before + layer.get_or_add_mag("1") + assert "1" in layer.mags.keys() + assert mag.name == "1" diff --git a/wkcuber/api/Dataset.py b/wkcuber/api/Dataset.py new file mode 100644 index 000000000..8da76905d --- /dev/null +++ b/wkcuber/api/Dataset.py @@ -0,0 +1,169 @@ +from shutil import rmtree +from abc import ABC, abstractmethod +from os import makedirs, path +from os.path import join, normpath, basename +from pathlib import Path +import numpy as np + +from wkcuber.api.Properties import WKProperties, TiffProperties, Properties +from wkcuber.api.Layer import Layer, WKLayer, TiffLayer +from wkcuber.api.View import View + + +class AbstractDataset(ABC): + @abstractmethod + def __init__(self, dataset_path): + properties = self._get_properties_type()._from_json( + join(dataset_path, Properties.FILE_NAME) + ) + self.layers = {} + self.path = Path(properties.path).parent + self.properties = properties + + # construct self.layer + for layer_name in self.properties.data_layers: + layer = self.properties.data_layers[layer_name] + self.add_layer( + layer.name, layer.category, layer.element_class, layer.num_channels + ) + for resolution in layer.wkw_magnifications: + self.layers[layer_name].setup_mag(resolution.mag.to_layer_name()) + + @classmethod + def create_with_properties(cls, properties): + dataset_path = path.dirname(properties.path) + # create directories on disk and write datasource-properties.json + try: + makedirs(dataset_path) + properties._export_as_json() + except OSError: + raise FileExistsError("Creation of Dataset {} failed".format(dataset_path)) + + # initialize object + return cls(dataset_path) + + @classmethod + @abstractmethod + def create(cls, dataset_path, scale): + pass + + def downsample(self, layer, target_mag_shape, source_mag): + raise NotImplemented() + + def get_properties(self) -> Properties: + return self.properties + + def get_layer(self, layer_name) -> Layer: + if layer_name not in self.layers.keys(): + raise IndexError( + "The layer {} is not a layer of this dataset".format(layer_name) + ) + return self.layers[layer_name] + + def add_layer(self, layer_name, category, dtype=np.dtype("uint8"), num_channels=1): + # normalize the value of dtype in case the parameter was passed as a string + dtype = np.dtype(dtype) + + if layer_name in self.layers.keys(): + raise IndexError( + "Adding layer {} failed. There is already a layer with this name".format( + layer_name + ) + ) + self.layers[layer_name] = self._create_layer(layer_name, dtype, num_channels) + self.properties._add_layer(layer_name, category, dtype.name, num_channels) + return self.layers[layer_name] + + def get_or_add_layer( + self, layer_name, category, dtype=None, num_channels=None + ) -> Layer: + if layer_name in self.layers.keys(): + assert self.properties.data_layers[layer_name].category == category, ( + f"Cannot get_or_add_layer: The layer '{layer_name}' already exists, but the categories do not match. " + + f"The category of the existing layer is '{self.properties.data_layers[layer_name].category}' " + + f"and the passed parameter is '{category}'." + ) + assert dtype is None or self.layers[layer_name].dtype == np.dtype(dtype), ( + f"Cannot get_or_add_layer: The layer '{layer_name}' already exists, but the dtypes do not match. " + + f"The dtype of the existing layer is '{self.layers[layer_name].dtype}' " + + f"and the passed parameter is '{dtype}'." + ) + assert ( + num_channels is None + or self.layers[layer_name].num_channels == num_channels + ), ( + f"Cannot get_or_add_layer: The layer '{layer_name}' already exists, but the number of channels do not match. " + + f"The number of channels of the existing layer are '{self.layers[layer_name].num_channels}' " + + f"and the passed parameter is '{num_channels}'." + ) + return self.layers[layer_name] + else: + return self.add_layer(layer_name, category, dtype, num_channels) + + def delete_layer(self, layer_name): + if layer_name not in self.layers.keys(): + raise IndexError( + f"Removing layer {layer_name} failed. There is no layer with this name" + ) + del self.layers[layer_name] + self.properties._delete_layer(layer_name) + # delete files on disk + rmtree(join(self.path, layer_name)) + + def get_view(self, layer_name, mag_name, size, global_offset=(0, 0, 0)) -> View: + layer = self.get_layer(layer_name) + mag = layer.get_mag(mag_name) + mag_file_path = path.join(self.path, layer.name, mag.name) + + return mag.get_view(mag_file_path, size=size, global_offset=global_offset) + + def _create_layer(self, layer_name, dtype, num_channels) -> Layer: + raise NotImplementedError + + @abstractmethod + def _get_properties_type(self): + pass + + +class WKDataset(AbstractDataset): + @classmethod + def create(cls, dataset_path, scale): + name = basename(normpath(dataset_path)) + properties = WKProperties(join(dataset_path, Properties.FILE_NAME), name, scale) + return WKDataset.create_with_properties(properties) + + def __init__(self, dataset_path): + super().__init__(dataset_path) + assert isinstance(self.properties, WKProperties) + + def to_tiff_dataset(self, new_dataset_path): + raise NotImplementedError # TODO; implement + + def _create_layer(self, layer_name, dtype, num_channels) -> Layer: + return WKLayer(layer_name, self, dtype, num_channels) + + def _get_properties_type(self): + return WKProperties + + +class TiffDataset(AbstractDataset): + @classmethod + def create(cls, dataset_path, scale): + name = basename(normpath(dataset_path)) + properties = TiffProperties( + join(dataset_path, Properties.FILE_NAME), name, scale + ) + return TiffDataset.create_with_properties(properties) + + def __init__(self, dataset_path): + super().__init__(dataset_path) + assert isinstance(self.properties, TiffProperties) + + def to_wk_dataset(self, new_dataset_path): + raise NotImplementedError # TODO; implement + + def _create_layer(self, layer_name, dtype, num_channels) -> Layer: + return TiffLayer(layer_name, self, dtype, num_channels) + + def _get_properties_type(self): + return TiffProperties diff --git a/wkcuber/api/Layer.py b/wkcuber/api/Layer.py new file mode 100644 index 000000000..4ac0a4b14 --- /dev/null +++ b/wkcuber/api/Layer.py @@ -0,0 +1,130 @@ +from shutil import rmtree +from os.path import join +from os import makedirs +from wkw import wkw + +from wkcuber.api.MagDataset import MagDataset, WKMagDataset, TiffMagDataset +from wkcuber.mag import Mag + + +class Layer: + + COLOR_TYPE = "color" + SEGMENTATION_TYPE = "segmentation" + + def __init__(self, name, dataset, dtype, num_channels): + self.name = name + self.dataset = dataset + self.dtype = dtype + self.num_channels = num_channels + self.mags = {} + + full_path = join(dataset.path, name) + makedirs(full_path, exist_ok=True) + + def get_mag(self, mag) -> MagDataset: + if mag not in self.mags.keys(): + raise IndexError("The mag {} is not a mag of this layer".format(mag)) + return self.mags[mag] + + def delete_mag(self, mag): + if mag not in self.mags.keys(): + raise IndexError( + "Deleting mag {} failed. There is no mag with this name".format(mag) + ) + + del self.mags[mag] + self.dataset.properties._delete_mag(self.name, mag) + # delete files on disk + full_path = join(self.dataset.path, self.name, mag) + rmtree(full_path) + + def _create_dir_for_mag(self, mag): + full_path = join(self.dataset.path, self.name, mag) + makedirs(full_path, exist_ok=True) + + def _assert_mag_does_not_exist_yet(self, mag): + if mag in self.mags.keys(): + raise IndexError( + "Adding mag {} failed. There is already a mag with this name".format( + mag + ) + ) + + +class WKLayer(Layer): + def add_mag(self, mag, block_len=32, file_len=32, block_type=1) -> WKMagDataset: + # normalize the name of the mag + mag = Mag(mag).to_layer_name() + + self._assert_mag_does_not_exist_yet(mag) + self._create_dir_for_mag(mag) + + self.mags[mag] = WKMagDataset.create(self, mag, block_len, file_len, block_type) + self.dataset.properties._add_mag(self.name, mag, block_len * file_len) + + return self.mags[mag] + + def get_or_add_mag( + self, mag, block_len=None, file_len=None, block_type=None + ) -> WKMagDataset: + # normalize the name of the mag + mag = Mag(mag).to_layer_name() + + if mag in self.mags.keys(): + assert ( + block_len is None or self.mags[mag].header.block_len == block_len + ), f"Cannot get_or_add_mag: The mag {mag} already exists, but the block lengths do not match" + assert ( + file_len is None or self.mags[mag].header.file_len == file_len + ), f"Cannot get_or_add_mag: The mag {mag} already exists, but the file lengths do not match" + assert ( + block_type is None or self.mags[mag].header.block_type == block_type + ), f"Cannot get_or_add_mag: The mag {mag} already exists, but the block types do not match" + return self.get_mag(mag) + else: + return self.add_mag(mag, block_len, file_len, block_type) + + def setup_mag(self, mag): + # This method is used to initialize the mag when opening the Dataset. This does not create e.g. the wk_header. + + # normalize the name of the mag + mag = Mag(mag).to_layer_name() + + self._assert_mag_does_not_exist_yet(mag) + + with wkw.Dataset.open(join(self.dataset.path, self.name, mag)) as wkw_dataset: + wk_header = wkw_dataset.header + + self.mags[mag] = WKMagDataset( + self, mag, wk_header.block_len, wk_header.file_len, wk_header.block_type + ) + self.dataset.properties._add_mag( + self.name, mag, wk_header.block_len * wk_header.file_len + ) + + +class TiffLayer(Layer): + def add_mag(self, mag) -> MagDataset: + # normalize the name of the mag + mag = Mag(mag).to_layer_name() + + self._assert_mag_does_not_exist_yet(mag) + self._create_dir_for_mag(mag) + + self.mags[mag] = TiffMagDataset.create(self, mag) + self.dataset.properties._add_mag(self.name, mag) + + return self.mags[mag] + + def get_or_add_mag(self, mag) -> MagDataset: + # normalize the name of the mag + mag = Mag(mag).to_layer_name() + + if mag in self.mags.keys(): + return self.get_mag(mag) + else: + return self.add_mag(mag) + + def setup_mag(self, mag): + self.add_mag(mag) diff --git a/wkcuber/api/MagDataset.py b/wkcuber/api/MagDataset.py new file mode 100644 index 000000000..bfed0018d --- /dev/null +++ b/wkcuber/api/MagDataset.py @@ -0,0 +1,116 @@ +from os.path import join + +from wkw import wkw +import numpy as np + +import wkcuber.api as api +from wkcuber.api.View import WKView, TiffView +from wkcuber.api.TiffData.TiffMag import TiffMagHeader + + +class MagDataset: + def __init__(self, layer, name): + self.layer = layer + self.name = name + self.header = self.get_header() + + file_path = join(self.layer.dataset.path, self.layer.name, self.name) + size = self.layer.dataset.properties.data_layers[ + self.layer.name + ].get_bounding_box_size() + offset = self.layer.dataset.properties.data_layers[ + self.layer.name + ].get_bounding_box_offset() + self.view = self.get_view( + file_path, size, global_offset=(0, 0, 0), is_bounded=False + ) + + def open(self): + self.view.initialize() + + def close(self): + self.view.close() + + def read(self, size, offset=(0, 0, 0)) -> np.array: + return self.view.read(size, offset) + + def write(self, data, offset=(0, 0, 0)): + self._assert_valid_num_channels(data.shape) + self.view.write(data, offset) + layer_properties = self.layer.dataset.properties.data_layers[self.layer.name] + current_offset = layer_properties.get_bounding_box_offset() + current_size = layer_properties.get_bounding_box_size() + + new_offset = ( + offset + if current_offset == (-1, -1, -1) + else tuple(min(x) for x in zip(current_offset, offset)) + ) + total_size = tuple(max(x) for x in zip(current_size, data.shape[-3:])) + self.view.size = total_size + + self.layer.dataset.properties._set_bounding_box_of_layer( + self.layer.name, new_offset, total_size + ) + + def get_header(self): + raise NotImplementedError + + def get_view(self, mag_file_path, size, global_offset, is_bounded=True): + raise NotImplementedError + + def _assert_valid_num_channels(self, write_data_shape): + num_channels = self.layer.num_channels + if len(write_data_shape) == 3: + assert ( + num_channels == 1 + ), f"The number of channels of the dataset ({num_channels}) does not match the number of channels of the passed data (1)" + else: + assert ( + num_channels == 3 + ), f"The number of channels of the dataset ({num_channels}) does not match the number of channels of the passed data ({write_data_shape[0]})" + + +class WKMagDataset(MagDataset): + def __init__(self, layer, name, block_len, file_len, block_type): + self.block_len = block_len + self.file_len = file_len + self.block_type = block_type + super().__init__(layer, name) + + def get_header(self) -> wkw.Header: + return wkw.Header( + voxel_type=self.layer.dtype, + num_channels=self.layer.num_channels, + version=1, + block_len=self.block_len, + file_len=self.file_len, + block_type=self.block_type, + ) + + def get_view(self, mag_file_path, size, global_offset, is_bounded=True) -> WKView: + return WKView(mag_file_path, self.header, size, global_offset, is_bounded) + + @classmethod + def create(cls, layer, name, block_len, file_len, block_type): + mag_dataset = cls(layer, name, block_len, file_len, block_type) + wkw.Dataset.create( + join(layer.dataset.path, layer.name, mag_dataset.name), mag_dataset.header + ) + + return mag_dataset + + +class TiffMagDataset(MagDataset): + def get_header(self) -> TiffMagHeader: + return TiffMagHeader( + dtype=self.layer.dtype, num_channels=self.layer.num_channels + ) + + def get_view(self, mag_file_path, size, global_offset, is_bounded=True) -> TiffView: + return TiffView(mag_file_path, self.header, size, global_offset, is_bounded) + + @classmethod + def create(cls, layer, name): + mag_dataset = cls(layer, name) + return mag_dataset diff --git a/wkcuber/api/Properties.py b/wkcuber/api/Properties.py new file mode 100644 index 000000000..4b2ab51c5 --- /dev/null +++ b/wkcuber/api/Properties.py @@ -0,0 +1,317 @@ +import json +import numpy as np + +from wkcuber.mag import Mag + + +class Resolution: + def _to_json(self) -> dict: + pass + + @classmethod + def _from_json(cls, json_data): + pass + + +class TiffResolution(Resolution): + def __init__(self, mag): + self._mag = Mag(mag) + + def _to_json(self) -> dict: + return {"resolution": self.mag.to_array()} + + @classmethod + def _from_json(cls, json_data): + return cls(json_data["resolution"]) + + @property + def mag(self) -> Mag: + return self._mag + + +class WkResolution(Resolution): + def __init__(self, mag, cube_length): + self._mag = Mag(mag) + self._cube_length = cube_length + + def _to_json(self) -> dict: + return {"resolution": self.mag.to_array(), "cube_length": self.cube_length} + + @classmethod + def _from_json(cls, json_data): + return cls(json_data["resolution"], json_data["cube_length"]) + + @property + def mag(self) -> Mag: + return self._mag + + @property + def cube_length(self) -> int: + return self._cube_length + + +class Properties: + + FILE_NAME = "datasource-properties.json" + + def __init__(self, path, name, scale, team="", data_layers=None): + self._path = path + self._name = name + self._team = team + self._scale = scale + if data_layers is None: + self._data_layers = {} + else: + self._data_layers = data_layers + + @classmethod + def _from_json(cls, path): + pass + + def _export_as_json(self): + pass + + def _add_layer(self, layer_name, category, element_class, num_channels=1): + # this layer is already in data_layers in case we reconstruct the dataset from a datasource-properties.json + if layer_name not in self.data_layers: + new_layer = LayerProperties( + layer_name, category, element_class, num_channels + ) + self.data_layers[layer_name] = new_layer + self._export_as_json() + + def _delete_layer(self, layer_name): + del self.data_layers[layer_name] + self._export_as_json() + + def _delete_mag(self, layer_name, mag): + self._data_layers[layer_name]._delete_resolution(mag) + self._export_as_json() + + def _set_bounding_box_of_layer(self, layer_name, offset, size): + self._data_layers[layer_name]._set_bounding_box_size(size) + self._data_layers[layer_name]._set_bounding_box_offset(offset) + self._export_as_json() + + @property + def name(self) -> str: + return self._name + + @property + def path(self) -> str: + return self._path + + @property + def team(self) -> str: + return self._team + + @property + def scale(self) -> tuple: + return self._scale + + @property + def data_layers(self) -> dict: + return self._data_layers + + +class WKProperties(Properties): + @classmethod + def _from_json(cls, path) -> Properties: + with open(path) as datasource_properties: + data = json.load(datasource_properties) + + # reconstruct data_layers + data_layers = {} + for layer in data["dataLayers"]: + data_layers[layer["name"]] = LayerProperties._from_json( + layer, WkResolution + ) + + return cls( + path, data["id"]["name"], data["scale"], data["id"]["team"], data_layers + ) + + def _export_as_json(self): + data = { + "id": {"name": self.name, "team": self.team}, + "scale": self.scale, + "dataLayers": [ + self.data_layers[layer_name]._to_json() + for layer_name in self.data_layers + ], + } + with open(self.path, "w") as outfile: + json.dump(data, outfile, indent=4, separators=(",", ": ")) + + def _add_mag(self, layer_name, mag, cube_length): + # this mag is already in wkw_magnifications in case we reconstruct the dataset from a datasource-properties.json + if not any( + [ + res.mag == Mag(mag) + for res in self.data_layers[layer_name].wkw_magnifications + ] + ): + self._data_layers[layer_name]._add_resolution( + WkResolution(mag, cube_length) + ) + self._export_as_json() + + +class TiffProperties(Properties): + def __init__(self, path, name, scale, team="", data_layers=None, grid_shape=(0, 0)): + super().__init__(path, name, scale, team, data_layers) + self._grid_shape = grid_shape + + @classmethod + def _from_json(cls, path) -> Properties: + with open(path) as datasource_properties: + data = json.load(datasource_properties) + + # reconstruct data_layers + data_layers = {} + for layer in data["dataLayers"]: + data_layers[layer["name"]] = LayerProperties._from_json( + layer, TiffResolution + ) + + return cls( + path, + data["id"]["name"], + data["scale"], + data["id"]["team"], + data_layers, + data["grid_shape"], + ) + + def _export_as_json(self): + data = { + "id": {"name": self.name, "team": self.team}, + "scale": self.scale, + "dataLayers": [ + self.data_layers[layer_name]._to_json() + for layer_name in self.data_layers + ], + "grid_shape": self.grid_shape, + } + with open(self.path, "w") as outfile: + json.dump(data, outfile, indent=4, separators=(",", ": ")) + + @property + def grid_shape(self) -> tuple: + return self._grid_shape + + def _add_mag(self, layer_name, mag): + # this mag is already in wkw_magnifications in case we reconstruct the dataset from a datasource-properties.json + if not any( + [ + res.mag == Mag(mag) + for res in self.data_layers[layer_name].wkw_magnifications + ] + ): + self.data_layers[layer_name]._add_resolution(TiffResolution(mag)) + self._export_as_json() + + +class LayerProperties: + def __init__( + self, + name, + category, + element_class, + num_channels, + bounding_box=None, + resolutions=None, + ): + self._name = name + self._category = category + self._element_class = element_class + self._num_channels = num_channels + self._bounding_box = bounding_box or { + "topLeft": (-1, -1, -1), + "width": 0, + "height": 0, + "depth": 0, + } + self._wkw_magnifications = resolutions or [] + + def _to_json(self): + return { + "name": self.name, + "category": self.category, + "elementClass": self.element_class, + "num_channels": self.num_channels, + "boundingBox": {} + if self.bounding_box is None + else { + "topLeft": self.bounding_box["topLeft"], + "width": self.bounding_box["width"], + "height": self.bounding_box["height"], + "depth": self.bounding_box["depth"], + }, + "wkwResolutions": [r._to_json() for r in self.wkw_magnifications], + } + + @classmethod + def _from_json(cls, json_data, resolution_type): + # create LayerProperties without resolutions + layer_properties = cls( + json_data["name"], + json_data["category"], + json_data["elementClass"], + json_data["num_channels"], + json_data["boundingBox"], + ) + + # add resolutions to LayerProperties + for resolution in json_data["wkwResolutions"]: + layer_properties._add_resolution(resolution_type._from_json(resolution)) + + return layer_properties + + def _add_resolution(self, resolution): + self._wkw_magnifications.append(resolution) + + def _delete_resolution(self, resolution): + self._wkw_magnifications.delete(resolution) + + def get_bounding_box_size(self) -> tuple: + return ( + self.bounding_box["width"], + self.bounding_box["height"], + self.bounding_box["depth"], + ) + + def get_bounding_box_offset(self) -> tuple: + return tuple(self.bounding_box["topLeft"]) + + def _set_bounding_box_size(self, size): + self._bounding_box["width"] = size[0] + self._bounding_box["height"] = size[1] + self._bounding_box["depth"] = size[2] + + def _set_bounding_box_offset(self, offset): + self._bounding_box["topLeft"] = offset + + @property + def name(self) -> str: + return self._name + + @property + def category(self) -> str: + return self._category + + @property + def element_class(self): + return self._element_class + + @property + def num_channels(self) -> int: + return self._num_channels + + @property + def bounding_box(self) -> dict: + return self._bounding_box + + @property + def wkw_magnifications(self) -> dict: + return self._wkw_magnifications diff --git a/wkcuber/api/TiffData/TiffMag.py b/wkcuber/api/TiffData/TiffMag.py new file mode 100644 index 000000000..de7b5a50d --- /dev/null +++ b/wkcuber/api/TiffData/TiffMag.py @@ -0,0 +1,227 @@ +from typing import Optional, List, Generator + +from skimage import io +import numpy as np +import os +from re import findall +from glob import iglob +from itertools import zip_longest + + +def replace_coordinate(pattern: str, coord_id: str, coord: int) -> str: + occurrences = findall("{" + coord_id + "+}", pattern) + for occurrence in occurrences: + number_of_digits = len(occurrence) - 2 + if number_of_digits > 1: + format_str = "0" + str(number_of_digits) + "d" + else: + format_str = "d" + pattern = pattern.replace(occurrence, format(coord, format_str), 1) + return pattern + + +def to_file_name(z) -> str: + return replace_coordinate("{zzzzz}.tif", "z", z) + + +def detect_value( + pattern_element: str, + ls_item: str, + dim: str, + ignore_dims: Optional[List[str]] = None, +) -> List[int]: + if ignore_dims is not None: + for ignore_dim in ignore_dims: + pattern_element = pattern_element.replace("{" + ignore_dim, ignore_dim) + pattern_element = pattern_element.replace(ignore_dim + "}", ignore_dim) + + if "{" + dim in pattern_element and dim + "}" in pattern_element: + open_position = pattern_element.find("{" + dim) + close_position = pattern_element.find(dim + "}") + try: + substring = ls_item[open_position:close_position] + return [int(substring)] + except ValueError: + raise ValueError( + f"Failed to autodetect tile ranges, there were files not matching the pattern: {ls_item} does not match {pattern_element}" + ) + return [] + + +class TiffMag: + def __init__(self, root, header): + x_range = [0] # currently tiled tiffs are not supported + y_range = [0] # currently tiled tiffs are not supported + + self.root = root + self.tiffs = dict() + self.dtype = header.dtype + self.num_channels = header.num_channels + + pattern = "{zzzzz}.tif" + + z_range = [ + detect_value(pattern, file_name, dim="z")[0] + for file_name in self.list_files() + ] + + for z in z_range: + self.tiffs[z] = TiffReader.open( + self.get_file_name_for_layer(z) + ) # open is lazy + + def read(self, off, shape) -> np.array: + if not self.has_only_one_channel(): + # modify the shape to also include the num_channels + shape = tuple(shape) + tuple([self.num_channels]) + + data = np.zeros(shape=shape, dtype=self.dtype) + for i, (z, offset, size) in enumerate( + self.calculate_relevant_slices(off, shape) + ): + if z in self.tiffs: + data[:, :, i] = np.array(self.tiffs[z].read(), self.dtype)[ + offset[0] : offset[0] + size[0], offset[1] : offset[1] + size[1] + ] + else: + shape_without_z = shape[:2] + shape[3:] + data[:, :, i] = np.zeros(shape_without_z, self.dtype) + + if self.has_only_one_channel(): + # convert data into shape with dedicated num_channels (len(data.shape) == 4) + # this only effects data where the num_channel is 1 and therefore len(data.shape) was 3 + # this makes it easier to handle both, multi-channel and single-channel, similar + data = np.expand_dims(data, 3) + + # reformat array to have the channels as the first index (similar to wkw) + data = np.moveaxis(data, -1, 0) + return data + + def write(self, off, data): + # convert data into shape with dedicated num_channels (len(data.shape) == 4) + # this only effects data where the num_channel is 1 and therefore len(data.shape) was 3 + # this makes it easier to handle both, multi-channel and single-channel, similar + data = data.reshape((-1,) + data.shape[-3:]) + + # reformat array to have the channels as the first index (similar to wkw) + data = np.moveaxis(data, 0, -1) + + self.assert_correct_data_format(data) + + for i, (z, offset, _) in enumerate( + self.calculate_relevant_slices(off, data.shape) + ): + # initialize images for z_layers that did not exist before + if z not in self.tiffs: + total_shape = [ + sum(x) + for x in zip_longest(data[:, :, i].shape, offset, fillvalue=0) + ] + if self.has_only_one_channel(): + # Convert single-channel data into the expected format + # E.g. convert shape (300, 300, 1) into (300, 300) + total_shape = tuple(total_shape)[:-1] + + self.tiffs[z] = TiffReader.init_tiff( + np.zeros(total_shape, self.dtype), self.get_file_name_for_layer(z) + ) + + # write new pixel data into the image + pixel_data = ( + data[:, :, i] if not self.has_only_one_channel() else data[:, :, i, 0] + ) + + self.tiffs[z].merge_with_image(pixel_data, offset) + + def compress(self, dst_path: str, compress_files: bool = False): + raise NotImplementedError + + def list_files(self): + file_paths = list(iglob(os.path.join(self.root, "*.tif"))) + + for file_path in file_paths: + yield os.path.relpath(os.path.normpath(file_path), self.root) + + def close(self): + return + + def calculate_relevant_slices(self, offset, shape): + for z in range(offset[2] + 1, offset[2] + shape[2] + 1): + yield tuple( + (z, offset[0:2], shape[0:2]) + ) # return tuple of important z layers an the x-y offset (without z offset) and the size (without z length) + + def has_only_one_channel(self) -> bool: + return self.num_channels == 1 + + def assert_correct_data_format(self, data): + if not len(data.shape) == 4: + raise AttributeError( + "The shape of the provided data does not match the expected shape." + ) + if not data.shape[3] == self.num_channels: + raise AttributeError( + f"The shape of the provided data does not match the expected shape. (Expected {self.num_channels} channels)" + ) + if not np.dtype(data.dtype) == self.dtype: + raise AttributeError( + f"The type of the provided data does not match the expected type. (Expected np.array of type {self.dtype.name})" + ) + + def get_file_name_for_layer(self, z) -> str: + return os.path.join(self.root, to_file_name(z)) + + @staticmethod + def open(root: str, header=None): + if header is None: + header = TiffMagHeader() + return TiffMag(root, header) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.close() + + +class TiffMagHeader: + def __init__(self, pattern="{z}.tif", dtype=np.dtype("uint8"), num_channels=1): + self.pattern = pattern + self.dtype = np.dtype(dtype) + self.num_channels = num_channels + + +class TiffReader: + def __init__(self, file_name): + self.file_name = file_name + + @classmethod + def init_tiff(cls, pixels, file_name): + tr = TiffReader(file_name) + tr.write(pixels) + return tr + + @classmethod + def open(cls, file_name): + return cls(file_name) + + def read(self) -> np.array: + return io.imread(self.file_name) + + def write(self, pixels): + io.imsave(self.file_name, pixels, check_contrast=False) + + def merge_with_image(self, foreground_pixels, offset): + background_pixels = self.read() + bg_shape = background_pixels.shape + fg_shape = foreground_pixels.shape + + fg_shape_with_off = [sum(x) for x in zip_longest(fg_shape, offset, fillvalue=0)] + total_shape = [max(x) for x in zip(bg_shape, fg_shape_with_off)] + new_image = np.zeros(total_shape, dtype=background_pixels.dtype) + + new_image[0 : bg_shape[0], 0 : bg_shape[1]] = background_pixels + new_image[ + offset[0] : fg_shape_with_off[0], offset[1] : fg_shape_with_off[1] + ] = foreground_pixels + self.write(new_image) diff --git a/wkcuber/api/View.py b/wkcuber/api/View.py new file mode 100644 index 000000000..d2e79b42a --- /dev/null +++ b/wkcuber/api/View.py @@ -0,0 +1,119 @@ +import numpy as np +from wkw import Dataset + +from wkcuber.api.TiffData.TiffMag import TiffMag + + +class View: + def __init__( + self, + path_to_mag_dataset, + header, + size, + global_offset=(0, 0, 0), + is_bounded=True, + ): + self.dataset = None + self.path = path_to_mag_dataset + self.header = header + self.size = size + self.global_offset = global_offset + self.is_bounded = is_bounded + self._is_opened = False + + def open(self): + raise NotImplemented() + + def close(self): + if not self._is_opened: + raise Exception("Cannot close View: the view is not opened") + else: + self.dataset.close() + self.dataset = None + self._is_opened = False + + def write(self, data, offset=(0, 0, 0)): + # assert the size of the parameter data is not in conflict with the attribute self.size + assert_non_negative_offset(offset) + self.assert_bounds(offset, data.shape[-3:]) + + # calculate the absolute offset + absolute_offset = tuple(sum(x) for x in zip(self.global_offset, offset)) + + if not self._is_opened: + self.open() + + self.dataset.write(absolute_offset, data) + + if not self._is_opened: + self.close() + + def read(self, size=None, offset=(0, 0, 0)) -> np.array: + was_opened = self._is_opened + size = size or self.size + + # assert the parameter size is not in conflict with the attribute self.size + self.assert_bounds(offset, size) + + # calculate the absolute offset + absolute_offset = tuple(sum(x) for x in zip(self.global_offset, offset)) + + if not was_opened: + self.open() + + data = self.dataset.read(absolute_offset, size) + + if not was_opened: + self.close() + + return data + + def check_bounds(self, offset, size) -> bool: + for s1, s2, off in zip(self.size, size, offset): + if s2 + off > s1 and self.is_bounded: + return False + return True + + def assert_bounds(self, offset, size): + if not self.check_bounds(offset, size): + raise AssertionError( + f"Writing out of bounds: The passed parameter 'size' {size} exceeds the size of the current view ({self.size})" + ) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.close() + + +class WKView(View): + def open(self): + if self._is_opened: + raise Exception("Cannot open view: the view is already opened") + else: + self.dataset = Dataset.open( + self.path + ) # No need to pass the header to the wkw.Dataset + self._is_opened = True + return self + + +class TiffView(View): + def open(self): + if self._is_opened: + raise Exception("Cannot open view: the view is already opened") + else: + self.dataset = TiffMag.open(self.path, self.header) + self._is_opened = True + return self + + +def assert_non_negative_offset(offset): + all_positive = all(i >= 0 for i in offset) + if not all_positive: + raise Exception( + "All elements of the offset need to be positive: %s" % "(" + + ",".join(map(str, offset)) + + ")" + )