large-image-source-ometiff 1.27.5.dev4__tar.gz → 1.30.7.dev10__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (15) hide show
  1. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/PKG-INFO +7 -2
  2. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/README.rst +20 -40
  3. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff/__init__.py +70 -3
  4. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff.egg-info/PKG-INFO +7 -2
  5. large_image_source_ometiff-1.30.7.dev10/large_image_source_ometiff.egg-info/requires.txt +5 -0
  6. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/setup.py +3 -2
  7. large-image-source-ometiff-1.27.5.dev4/large_image_source_ometiff.egg-info/requires.txt +0 -5
  8. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/LICENSE +0 -0
  9. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff/girder_source.py +0 -0
  10. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff.egg-info/SOURCES.txt +0 -0
  11. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff.egg-info/dependency_links.txt +0 -0
  12. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff.egg-info/entry_points.txt +0 -0
  13. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/large_image_source_ometiff.egg-info/top_level.txt +0 -0
  14. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/pyproject.toml +0 -0
  15. {large-image-source-ometiff-1.27.5.dev4 → large_image_source_ometiff-1.30.7.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-ometiff
3
- Version: 1.27.5.dev4
3
+ Version: 1.30.7.dev10
4
4
  Summary: An OMETiff tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -15,9 +15,14 @@ Classifier: Programming Language :: Python :: 3.9
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
18
19
  Requires-Python: >=3.8
19
- Provides-Extra: girder
20
+ Description-Content-Type: text/x-rst
20
21
  License-File: LICENSE
22
+ Requires-Dist: large-image>=1.30.7.dev10
23
+ Requires-Dist: large-image-source-tiff>=1.30.7.dev10
24
+ Provides-Extra: girder
25
+ Requires-Dist: girder-large-image>=1.30.7.dev10; extra == "girder"
21
26
 
22
27
  An OMETiff tilesource for large_image.
23
28
 
@@ -15,7 +15,7 @@ Large Image
15
15
  :target: https://codecov.io/github/girder/large_image?branch=master
16
16
  :alt: codecov.io
17
17
 
18
- .. |doi-badge| image:: https://img.shields.io/badge/DOI-10.5281%2Fzenodo.4723355-blue
18
+ .. |doi-badge| image:: https://img.shields.io/badge/DOI-10.5281%2Fzenodo.4723355-blue.svg
19
19
  :target: https://zenodo.org/badge/latestdoi/45569214
20
20
 
21
21
  .. |pypi-badge| image:: https://img.shields.io/pypi/v/large-image.svg?logo=python&logoColor=white
@@ -39,7 +39,7 @@ Highlights
39
39
  Installation
40
40
  ------------
41
41
 
42
- In addition to installing the ``large-image`` package, you'll need at least one tile source (a ``large-image-source-xxx`` package). You can install everything from the main project with one of these commands:
42
+ In addition to installing the base ``large-image`` package, you'll need at least one tile source which corresponds to your target file format(s) (a ``large-image-source-xxx`` package). You can install everything from the main project with one of these commands:
43
43
 
44
44
  Pip
45
45
  ~~~
@@ -52,7 +52,7 @@ Install all tile sources on linux::
52
52
 
53
53
  pip install large-image[all] --find-links https://girder.github.io/large_image_wheels
54
54
 
55
- Install all tile sources and all Girder plugins on linux::
55
+ When using large-image with an instance of `Girder`_, install all tile sources and all Girder plugins on linux::
56
56
 
57
57
  pip install large-image[all] girder-large-image-annotation[tasks] --find-links https://girder.github.io/large_image_wheels
58
58
 
@@ -60,8 +60,9 @@ Install all tile sources and all Girder plugins on linux::
60
60
  Conda
61
61
  ~~~~~
62
62
 
63
- Conda makes dependency management a bit easier if not on Linux. Some of the source modules are available on conda-forge. You can install the following::
63
+ Conda makes dependency management a bit easier if not on Linux. The base module, converter module, and two of the source modules are available on conda-forge. You can install the following::
64
64
 
65
+ conda install -c conda-forge large-image
65
66
  conda install -c conda-forge large-image-source-gdal
66
67
  conda install -c conda-forge large-image-source-tiff
67
68
  conda install -c conda-forge large-image-converter
@@ -118,7 +119,7 @@ Large Image consists of several Python modules designed to work together. These
118
119
 
119
120
  - ``large-image-source-deepzoom``: A tile source for reading Deepzoom tiles.
120
121
 
121
- - ``large-image-source-dicom``: A tile source for reading DICOM WSI images.
122
+ - ``large-image-source-dicom``: A tile source for reading DICOM Whole Slide Images (WSI).
122
123
 
123
124
  - ``large-image-source-gdal``: A tile source for reading geotiff files via GDAL. This handles source data with more complex transforms than the mapnik tile source.
124
125
 
@@ -128,62 +129,41 @@ Large Image consists of several Python modules designed to work together. These
128
129
 
129
130
  - ``large-image-source-nd2``: A tile source for reading nd2 (NIS Element) images.
130
131
 
131
- - ``large-image-source-ometiff``: A tile source using the tiff library that can handle some multi-frame OMETiff files.
132
+ - ``large-image-source-ometiff``: A tile source using the tiff library that can handle most multi-frame OMETiff files that are compliant with the specification.
132
133
 
133
134
  - ``large-image-source-openjpeg``: A tile source using the Glymur library to read jp2 (JPEG 2000) files.
134
135
 
135
136
  - ``large-image-source-openslide``: A tile source using the OpenSlide library. This works with svs, ndpi, Mirax, tiff, vms, and other file formats.
136
137
 
137
- - ``large-image-source-pil``: A tile source for small images via the Python Imaging Library (Pillow).
138
+ - ``large-image-source-pil``: A tile source for small images via the Python Imaging Library (Pillow). By default, the maximum size is 4096, but the maximum size can be configured.
138
139
 
139
140
  - ``large-image-source-tiff``: A tile source for reading pyramidal tiff files in common compression formats.
140
141
 
141
142
  - ``large-image-source-tifffile``: A tile source using the tifffile library that can handle a wide variety of tiff-like files.
142
143
 
143
- - ``large-image-source-vips``: A tile source for reading any files handled by libvips. This also can be used for writing tiled images from numpy arrays.
144
+ - ``large-image-source-vips``: A tile source for reading any files handled by libvips. This also can be used for writing tiled images from numpy arrays (up to 4 dimensions).
144
145
 
145
- - ``large-image-source-zarr``: A tile source using the zarr library that can handle OME-Zarr (OME-NGFF) files as well as some other zarr files.
146
+ - ``large-image-source-zarr``: A tile source using the zarr library that can handle OME-Zarr (OME-NGFF) files as well as some other zarr files. This can also be used for writing N-dimensional tiled images from numpy arrays. Written images can be saved as any supported format.
146
147
 
147
148
  - ``large-image-source-test``: A tile source that generates test tiles, including a simple fractal pattern. Useful for testing extreme zoom levels.
148
149
 
149
- - ``large-image-source-dummy``: A tile source that does nothing.
150
+ - ``large-image-source-dummy``: A tile source that does nothing. This is an absolutely minimal implementation of a tile source used for testing. If you want to create a custom tile source, start with this implementation.
150
151
 
151
- Most tile sources can be used with girder-large-image. You can specific an extras_require of ``girder`` to include ``girder-large-image`` with the source.
152
152
 
153
- - As a Girder plugin:
153
+ As a `Girder`_ plugin, ``large-image`` adds end points to access all of the image formats it can read both to get metadata and to act as a tile server.
154
+ In the Girder UI, ``large-image`` shows images on item pages, and can show thumbnails in item lists when browsing folders.
155
+ There is also cache management to balance memory use and speed of response in Girder when ``large-image`` is used as a tile server.
154
156
 
155
- - ``girder-large-image``: Large Image as a Girder_ 3.x plugin.
156
- You can specify extras_require of ``tasks`` to install a Girder Worker task that can convert otherwise unreadable images to pyramidal tiff files.
157
+ Most tile sources can be used with Girder Large Image. You can specify an extras_require of ``girder`` to install the following packages:
157
158
 
158
- - ``girder-large-image-annotation``: Annotations for large images as a Girder_ 3.x plugin.
159
+ - ``girder-large-image``: Large Image as a Girder 3.x plugin.
160
+ You can install ``large-image[tasks]`` to install a Girder Worker task that can convert otherwise unreadable images to pyramidal tiff files.
161
+
162
+ - ``girder-large-image-annotation``: Adds models to the Girder database for supporting annotating large images. These annotations can be rendered on images. Annotations can include polygons, points, image overlays, and other types. Each annotation can have a label and metadata.
159
163
 
160
164
  - ``large-image-tasks``: A utility for running the converter via Girder Worker.
161
165
  You can specify an extras_require of ``girder`` to include modules needed to work with the Girder remote worker or ``worker`` to include modules needed on the remote side of the Girder remote worker. If neither is specified, some conversion tasks can be run using Girder local jobs.
162
166
 
163
167
 
164
- Developer Installation
165
- ----------------------
166
-
167
- To install all packages from source, clone the repository::
168
-
169
- git clone https://github.com/girder/large_image.git
170
- cd large_image
171
-
172
- Install all packages and dependencies::
173
-
174
- pip install -e . -r requirements-dev.txt
175
-
176
- If you aren't developing with Girder 3, you can skip installing those components. Use ``requirements-dev-core.txt`` instead of ``requirements-dev.txt``::
177
-
178
- pip install -e . -r requirements-dev-core.txt
179
-
180
-
181
- Tile source prerequisites
182
- =========================
183
-
184
- Many tile sources have complex prerequisites. These can be installed directly using your system's package manager or from some prebuilt Python wheels for Linux. The prebuilt wheels are not official packages, but they can be used by instructing pip to use them by preference::
185
-
186
- pip install -e . -r requirements-dev.txt --find-links https://girder.github.io/large_image_wheels
187
-
188
168
 
189
- .. _Girder: https://github.com/girder/girder
169
+ .. _Girder: https://girder.readthedocs.io/en/latest/
@@ -105,6 +105,7 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
105
105
  msg = 'Not a recognized OME Tiff'
106
106
  raise TileSourceError(msg)
107
107
  info = getattr(base, '_description_record', None)
108
+ self._associatedImages = {}
108
109
  if not info or not info.get('OME'):
109
110
  msg = 'Not an OME Tiff'
110
111
  raise TileSourceError(msg)
@@ -115,6 +116,7 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
115
116
  except KeyError:
116
117
  msg = 'Not a recognized OME Tiff'
117
118
  raise TileSourceError(msg)
119
+ usesSubIfds = self._checkForSubIfds(base)
118
120
  omeimages = [
119
121
  entry['Pixels'] for entry in self._omeinfo['Image'] if
120
122
  len(entry['Pixels']['TiffData']) == len(self._omebase['TiffData'])]
@@ -125,10 +127,16 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
125
127
  omebylevel = dict(zip(levels, omeimages))
126
128
  self._omeLevels = [omebylevel.get(key) for key in range(max(omebylevel.keys()) + 1)]
127
129
  if base._tiffInfo.get('istiled'):
130
+ if usesSubIfds:
131
+ self._omeLevels = [None] * max(usesSubIfds) + [self._omeLevels[-1]]
128
132
  self._tiffDirectories = [
129
133
  self.getTiffDir(int(entry['TiffData'][0].get('IFD', 0)))
130
134
  if entry else None
131
135
  for entry in self._omeLevels]
136
+ if usesSubIfds:
137
+ for lvl in usesSubIfds:
138
+ if self._tiffDirectories[lvl] is None:
139
+ self._tiffDirectories[lvl] = False
132
140
  else:
133
141
  self._tiffDirectories = [
134
142
  self.getTiffDir(0, mustBeTiled=None)
@@ -149,7 +157,6 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
149
157
  # We can get the embedded images, but we don't currently use non-tiled
150
158
  # images as associated images. This would require enumerating tiff
151
159
  # directories not mentioned by the ome list.
152
- self._associatedImages = {}
153
160
  self._checkForInefficientDirectories()
154
161
 
155
162
  def _checkForOMEZLoop(self):
@@ -199,6 +206,40 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
199
206
  info['Image']['Pixels']['PlanesFromZloop'] = 'true'
200
207
  info['Image']['Pixels']['SizeZ'] = str(zloop)
201
208
 
209
+ def _checkForSubIfds(self, base):
210
+ """
211
+ Check if the first ifd has sub-ifds. If so, expect lower resolutions
212
+ to be in subifds, not in primary ifds.
213
+
214
+ :param base: base tiff directory
215
+ :returns: either False if no subifds are lower resolution, or a
216
+ dictionary of levels (keys) and values that are subifd numbers.
217
+ """
218
+ try:
219
+ levels = int(max(0, math.ceil(max(
220
+ math.log(float(base.imageWidth) / base.tileWidth),
221
+ math.log(float(base.imageHeight) / base.tileHeight)) / math.log(2))) + 1)
222
+ filled = {}
223
+ for z in range(levels - 2, -1, -1):
224
+ subdir = levels - 1 - z
225
+ scale = int(2 ** subdir)
226
+ try:
227
+ dir = self.getTiffDir(0, mustBeTiled=True, subDirectoryNum=subdir)
228
+ except Exception:
229
+ continue
230
+ if (dir is not None and
231
+ (dir.tileWidth in {base.tileWidth, dir.imageWidth}) and
232
+ (dir.tileHeight in {base.tileHeight, dir.imageHeight}) and
233
+ abs(dir.imageWidth * scale - base.imageWidth) <= scale and
234
+ abs(dir.imageHeight * scale - base.imageHeight) <= scale):
235
+ filled[z] = subdir
236
+ if not len(filled):
237
+ return False
238
+ filled[levels - 1] = 0
239
+ return filled
240
+ except TiffError:
241
+ return False
242
+
202
243
  def _parseOMEInfo(self): # noqa
203
244
  if isinstance(self._omeinfo['Image'], dict):
204
245
  self._omeinfo['Image'] = [self._omeinfo['Image']]
@@ -241,6 +282,32 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
241
282
  for entry in self._omebase['TiffData']}) > 1:
242
283
  msg = 'OME Tiff references multiple files'
243
284
  raise TileSourceError(msg)
285
+ if (len(self._omebase['TiffData']) ==
286
+ int(self._omebase['SizeT']) * int(self._omebase['SizeZ'])):
287
+ self._omebase['SizeC'] = 1
288
+ for img in self._omeinfo['Image'][1:]:
289
+ try:
290
+ if img['Name'] and img['Pixels']['TiffData'][0]['IFD']:
291
+ self._addAssociatedImage(
292
+ int(img['Pixels']['TiffData'][0]['IFD']),
293
+ None, None, img['Name'].split()[0])
294
+ except Exception:
295
+ pass
296
+ elif len(self._omeinfo['Image']) > 1:
297
+ multiple = False
298
+ for img in self._omeinfo['Image'][1:]:
299
+ try:
300
+ bpix = self._omeinfo['Image'][0]['Pixels']
301
+ imgpix = img['Pixels']
302
+ if imgpix['SizeX'] == bpix['SizeX'] and imgpix['SizeY'] == bpix['SizeY']:
303
+ multiple = True
304
+ break
305
+ except Exception:
306
+ multiple = True
307
+ if multiple:
308
+ # We should handle this as SizeXY
309
+ msg = 'OME Tiff references multiple images'
310
+ raise TileSourceError(msg)
244
311
  if (len(self._omebase['TiffData']) != int(self._omebase['SizeC']) *
245
312
  int(self._omebase['SizeT']) * int(self._omebase['SizeZ']) or
246
313
  len(self._omebase['TiffData']) != len(
@@ -343,8 +410,8 @@ class OMETiffFileTileSource(TiffFileTileSource, metaclass=LruCacheMetaclass):
343
410
  if subdir:
344
411
  scale = int(2 ** subdir)
345
412
  if (dir is None or
346
- (dir.tileWidth != self.tileWidth and dir.tileWidth != dir.imageWidth) or
347
- (dir.tileHeight != self.tileHeight and dir.tileHeight != dir.imageHeight) or
413
+ (dir.tileWidth not in {self.tileWidth, dir.imageWidth}) or
414
+ (dir.tileHeight not in {self.tileHeight, dir.imageHeight}) or
348
415
  abs(dir.imageWidth * scale - self.sizeX) > scale or
349
416
  abs(dir.imageHeight * scale - self.sizeY) > scale):
350
417
  return super().getTile(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-ometiff
3
- Version: 1.27.5.dev4
3
+ Version: 1.30.7.dev10
4
4
  Summary: An OMETiff tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -15,9 +15,14 @@ Classifier: Programming Language :: Python :: 3.9
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
18
19
  Requires-Python: >=3.8
19
- Provides-Extra: girder
20
+ Description-Content-Type: text/x-rst
20
21
  License-File: LICENSE
22
+ Requires-Dist: large-image>=1.30.7.dev10
23
+ Requires-Dist: large-image-source-tiff>=1.30.7.dev10
24
+ Provides-Extra: girder
25
+ Requires-Dist: girder-large-image>=1.30.7.dev10; extra == "girder"
21
26
 
22
27
  An OMETiff tilesource for large_image.
23
28
 
@@ -0,0 +1,5 @@
1
+ large-image>=1.30.7.dev10
2
+ large-image-source-tiff>=1.30.7.dev10
3
+
4
+ [girder]
5
+ girder-large-image>=1.30.7.dev10
@@ -19,8 +19,7 @@ def prerelease_local_scheme(version):
19
19
 
20
20
  if os.getenv('CIRCLE_BRANCH') in ('master', ):
21
21
  return ''
22
- else:
23
- return get_local_node_and_date(version)
22
+ return get_local_node_and_date(version)
24
23
 
25
24
 
26
25
  try:
@@ -37,6 +36,7 @@ setup(
37
36
  'fallback_version': '0.0.0'},
38
37
  description=description,
39
38
  long_description=long_description,
39
+ long_description_content_type='text/x-rst',
40
40
  license='Apache Software License 2.0',
41
41
  author='Kitware, Inc.',
42
42
  author_email='kitware@kitware.com',
@@ -49,6 +49,7 @@ setup(
49
49
  'Programming Language :: Python :: 3.10',
50
50
  'Programming Language :: Python :: 3.11',
51
51
  'Programming Language :: Python :: 3.12',
52
+ 'Programming Language :: Python :: 3.13',
52
53
  ],
53
54
  install_requires=[
54
55
  f'large-image{limit_version}',
@@ -1,5 +0,0 @@
1
- large-image>=1.27.5.dev4
2
- large-image-source-tiff>=1.27.5.dev4
3
-
4
- [girder]
5
- girder-large-image>=1.27.5.dev4