large-image-source-ometiff 1.30.6.dev12__tar.gz → 1.30.6.dev16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (15) hide show
  1. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/PKG-INFO +4 -4
  2. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff/__init__.py +69 -1
  3. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff.egg-info/PKG-INFO +4 -4
  4. large_image_source_ometiff-1.30.6.dev16/large_image_source_ometiff.egg-info/requires.txt +5 -0
  5. large_image_source_ometiff-1.30.6.dev12/large_image_source_ometiff.egg-info/requires.txt +0 -5
  6. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/LICENSE +0 -0
  7. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/README.rst +0 -0
  8. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff/girder_source.py +0 -0
  9. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff.egg-info/SOURCES.txt +0 -0
  10. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff.egg-info/dependency_links.txt +0 -0
  11. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff.egg-info/entry_points.txt +0 -0
  12. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/large_image_source_ometiff.egg-info/top_level.txt +0 -0
  13. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/pyproject.toml +0 -0
  14. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/setup.cfg +0 -0
  15. {large_image_source_ometiff-1.30.6.dev12 → large_image_source_ometiff-1.30.6.dev16}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-ometiff
3
- Version: 1.30.6.dev12
3
+ Version: 1.30.6.dev16
4
4
  Summary: An OMETiff tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -19,10 +19,10 @@ Classifier: Programming Language :: Python :: 3.13
19
19
  Requires-Python: >=3.8
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
- Requires-Dist: large-image>=1.30.6.dev12
23
- Requires-Dist: large-image-source-tiff>=1.30.6.dev12
22
+ Requires-Dist: large-image>=1.30.6.dev16
23
+ Requires-Dist: large-image-source-tiff>=1.30.6.dev16
24
24
  Provides-Extra: girder
25
- Requires-Dist: girder-large-image>=1.30.6.dev12; extra == "girder"
25
+ Requires-Dist: girder-large-image>=1.30.6.dev16; extra == "girder"
26
26
 
27
27
  An OMETiff tilesource for large_image.
28
28
 
@@ -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 == base.tileWidth or dir.tileWidth == dir.imageWidth) and
232
+ (dir.tileHeight == base.tileHeight or dir.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,33 @@ 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
+ # DWM:: others are probably associated images
289
+ for img in self._omeinfo['Image'][1:]:
290
+ try:
291
+ if img['Name'] and img['Pixels']['TiffData'][0]['IFD']:
292
+ self._addAssociatedImage(
293
+ int(img['Pixels']['TiffData'][0]['IFD']),
294
+ None, None, img['Name'].split()[0])
295
+ except Exception:
296
+ pass
297
+ elif len(self._omeinfo['Image']) > 1:
298
+ multiple = False
299
+ for img in self._omeinfo['Image'][1:]:
300
+ try:
301
+ bpix = self._omeinfo['Image'][0]['Pixels']
302
+ imgpix = img['Pixels']
303
+ if imgpix['SizeX'] == bpix['SizeX'] and imgpix['SizeY'] == bpix['SizeY']:
304
+ multiple = True
305
+ break
306
+ except Exception:
307
+ multiple = True
308
+ if multiple:
309
+ # We should handle this as SizeXY
310
+ msg = 'OME Tiff references multiple images'
311
+ raise TileSourceError(msg)
244
312
  if (len(self._omebase['TiffData']) != int(self._omebase['SizeC']) *
245
313
  int(self._omebase['SizeT']) * int(self._omebase['SizeZ']) or
246
314
  len(self._omebase['TiffData']) != len(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-ometiff
3
- Version: 1.30.6.dev12
3
+ Version: 1.30.6.dev16
4
4
  Summary: An OMETiff tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -19,10 +19,10 @@ Classifier: Programming Language :: Python :: 3.13
19
19
  Requires-Python: >=3.8
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
- Requires-Dist: large-image>=1.30.6.dev12
23
- Requires-Dist: large-image-source-tiff>=1.30.6.dev12
22
+ Requires-Dist: large-image>=1.30.6.dev16
23
+ Requires-Dist: large-image-source-tiff>=1.30.6.dev16
24
24
  Provides-Extra: girder
25
- Requires-Dist: girder-large-image>=1.30.6.dev12; extra == "girder"
25
+ Requires-Dist: girder-large-image>=1.30.6.dev16; extra == "girder"
26
26
 
27
27
  An OMETiff tilesource for large_image.
28
28
 
@@ -0,0 +1,5 @@
1
+ large-image>=1.30.6.dev16
2
+ large-image-source-tiff>=1.30.6.dev16
3
+
4
+ [girder]
5
+ girder-large-image>=1.30.6.dev16
@@ -1,5 +0,0 @@
1
- large-image>=1.30.6.dev12
2
- large-image-source-tiff>=1.30.6.dev12
3
-
4
- [girder]
5
- girder-large-image>=1.30.6.dev12