B
    xb2
                @   s  d Z dZdZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZmZ ddlmZ ddlZyddlZW n ek
r   dZY nX d?dd	Zd@d
dZdAddZG dd dZG dd deZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$G dd  d Z%G d!d" d"Z&G d#d$ d$Z'G d%d& d&eZ(G d'd( d(e(Z)G d)d* d*e(Z*G d+d, d,Z+G d-d. d.e+Z,G d/d0 d0Z-G d1d2 d2Z.G d3d4 d4Z/G d5d6 d6Z0G d7d8 d8Z1G d9d: d:eZ2G d;d< d<Z3G d=d> d>Z4e4G d?d@ d@Z5dBdAdBZ6dCdD Z7dEdF Z8dGdH Z9dIdJ Z:dKdL Z;dMdN Z<dOdP Z=dQdR Z>dSdT Z?dUdV Z@dCdWdXZAdYdZ ZBd[d\ ZCd]d^ ZDd_d` ZEdadb ZFdcdd ZGdedf ZHdgdh ZIdidj ZJdkdl ZKdmdn ZLdodp ZMdqdr ZNdsdt ZOdudv ZPdwdx ZQdydz ZRd{d| ZSd}d~ ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dDddZ\dEddZ]dd Z^dd Z_dd Z`dd Zadd ZbdFddZcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd ZjdGddZkdd ZldHddZmdIddZndJddZodKddZpedkrdLddZqdMddZrdg fddZsdNddZtdOddÄZudPddńZvn4ejsZsejuZuejtZty
ejlZlW n ewk
r   Y nX dQddǄZxdRddɄZydd˄ Zzdd̈́ Z{ddτ Z|ddф Z}ddӄ Z~ddՄ ZdSddׄZdTddلZdUddۄZdVdd߄ZdWddZdXddZdYddZdd ZdZddZdd Zd[ddZd\ddZd]ddZdd Zdd Zdd Zdd Zdd Zdd  Zd^ddZd_ddZdd Zdd Zd	d
 Zd`ddZdaddZdd ZdbddZdd ZdcddZddddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zded'd(Zdfd)d*Zdgd+d,Zdhd-d.Zdid0d1Zd2d3 Zd4d5 Zd6d7 Zdjd9d:Zdkd<d=ZeZeje_e Zed>kree  dS (l  an  Read and write TIFF files.

Tifffile is a Python library to

(1) store numpy arrays in TIFF (Tagged Image File Format) files, and
(2) read image and metadata from TIFF-like files used in bioimaging.

Image and metadata can be read from TIFF, BigTIFF, OME-TIFF, STK, LSM, SGI,
NIHImage, ImageJ, MicroManager, FluoView, ScanImage, SEQ, GEL, SVS, SCN, SIS,
BIF, ZIF (Zoomable Image File Format), QPTIFF (QPI), NDPI, and GeoTIFF files.

Image data can be read as numpy arrays or zarr arrays/groups from strips,
tiles, pages (IFDs), SubIFDs, higher order series, and pyramidal levels.

Numpy arrays can be written to TIFF, BigTIFF, OME-TIFF, and ImageJ hyperstack
compatible files in multi-page, volumetric, pyramidal, memory-mappable, tiled,
predicted, or compressed form.

A subset of the TIFF specification is supported, mainly 8, 16, 32 and 64-bit
integer, 16, 32 and 64-bit float, grayscale and multi-sample images.
Specifically, CCITT and OJPEG compression, chroma subsampling without JPEG
compression, color space transformations, samples with differing types, or
IPTC, ICC, and XMP metadata are not implemented.

TIFF, the Tagged Image File Format, was created by the Aldus Corporation and
Adobe Systems Incorporated. BigTIFF allows for files larger than 4 GB.
STK, LSM, FluoView, SGI, SEQ, GEL, QPTIFF, NDPI, SCN, SVS, ZIF, BIF, and
OME-TIFF, are custom extensions defined by Molecular Devices (Universal Imaging
Corporation), Carl Zeiss MicroImaging, Olympus, Silicon Graphics International,
Media Cybernetics, Molecular Dynamics, PerkinElmer, Hamamatsu, Leica,
ObjectivePathology, Roche Digital Pathology, and the Open Microscopy
Environment consortium, respectively.

For command line usage run ``python -m tifffile --help``

:Author:
  `Christoph Gohlke <https://www.lfd.uci.edu/~gohlke/>`_

:Organization:
  Laboratory for Fluorescence Dynamics, University of California, Irvine

:License: BSD 3-Clause

:Version: 2021.11.2

Requirements
------------
This release has been tested with the following requirements and dependencies
(other versions may work):

* `CPython 3.7.9, 3.8.10, 3.9.7, 3.10.0, 64-bit <https://www.python.org>`_
* `Numpy 1.21.3 <https://pypi.org/project/numpy/>`_
* `Imagecodecs 2021.8.26  <https://pypi.org/project/imagecodecs/>`_
  (required only for encoding or decoding LZW, JPEG, etc.)
* `Matplotlib 3.4.3 <https://pypi.org/project/matplotlib/>`_
  (required only for plotting)
* `Lxml 4.6.3 <https://pypi.org/project/lxml/>`_
  (required only for validating and printing XML)
* `Zarr 2.10.3 <https://pypi.org/project/zarr/>`_
  (required only for opening zarr storage)

Revisions
---------
2021.11.2
    Pass 4731 tests.
    Lazy-load non-essential tag values (breaking).
    Warn when reading from closed file.
    Support ImageJ 'prop' metadata type (#103).
    Support writing indexed ImageJ format.
    Fix multi-threaded access of multi-page Zarr stores with chunkmode 2.
    Raise error if truncate is used with compression, packints, or tile.
    Read STK metadata without UIC2tag.
    Improve log and warning messages (WIP).
    Improve string representation of large tag values.
2021.10.12
    Revert renaming of 'file' parameter in FileSequence.asarray (breaking).
    Deprecate 'file' parameter in FileSequence.asarray.
2021.10.10
    Disallow letters as indices in FileSequence; use categories (breaking).
    Do not warn of missing files in FileSequence; use files_missing property.
    Support predictors in ZarrTiffStore.write_fsspec.
    Add option to specify zarr group name in write_fsspec.
    Add option to specify categories for FileSequence patterns (#76).
    Add option to specify chunk shape and dtype for ZarrFileSequenceStore.
    Add option to tile ZarrFileSequenceStore and FileSequence.asarray.
    Add option to pass additional zattrs to Zarr stores.
    Detect Roche BIF files.
2021.8.30
    Fix horizontal differencing with non-native byte order.
    Fix multi-threaded access of memory-mappable, multi-page Zarr stores (#67).
2021.8.8
    Fix tag offset and valueoffset for NDPI > 4 GB (#96).
2021.7.30
    Deprecate first parameter to TiffTag.overwrite (no longer required).
    TiffTag init API change (breaking).
    Detect Ventana BIF series and warn that tiles are not stitched.
    Enable reading PreviewImage from RAW formats (#93, #94).
    Work around numpy.ndarray.tofile is very slow for non-contiguous arrays.
    Fix issues with PackBits compression (requires imagecodecs 2021.7.30).
2021.7.2
    Decode complex integer images found in SAR GeoTIFF.
    Support reading NDPI with JPEG-XR compression.
    Deprecate TiffWriter RGB auto-detection, except for RGB24/48 and RGBA32/64.
2021.6.14
    Set stacklevel for deprecation warnings (#89).
    Fix svs_description_metadata for SVS with double header (#88, breaking).
    Fix reading JPEG compressed CMYK images.
    Support ALT_JPEG and JPEG_2000_LOSSY compression found in Bio-Formats.
    Log warning if TiffWriter auto-detects RGB mode (specify photometric).
2021.6.6
    Fix TIFF.COMPESSOR typo (#85).
    Round resolution numbers that do not fit in 64-bit rationals (#81).
    Add support for JPEG XL compression.
    Add numcodecs compatible TIFF codec.
    Rename ZarrFileStore to ZarrFileSequenceStore (breaking).
    Add method to export fsspec ReferenceFileSystem from ZarrFileStore.
    Fix fsspec ReferenceFileSystem v1 for multifile series.
    Fix creating OME-TIFF with micron character in OME-XML.
2021.4.8
    Fix reading OJPEG with wrong photometric or samplesperpixel tags (#75).
    Fix fsspec ReferenceFileSystem v1 and JPEG compression.
    Use TiffTagRegistry for NDPI_TAGS, EXIF_TAGS, GPS_TAGS, IOP_TAGS constants.
    Make TIFF.GEO_KEYS an Enum (breaking).
2021.3.31
    Use JPEG restart markers as tile offsets in NDPI.
    Support version 1 and more codecs in fsspec ReferenceFileSystem (untested).
2021.3.17
    Fix regression reading multi-file OME-TIFF with missing files (#72).
    Fix fsspec ReferenceFileSystem with non-native byte order (#56).
2021.3.16
    TIFF is no longer a defended trademark.
    Add method to export fsspec ReferenceFileSystem from ZarrTiffStore (#56).
2021.3.5
    Preliminary support for EER format (#68).
    Do not warn about unknown compression (#68).
2021.3.4
    Fix reading multi-file, multi-series OME-TIFF (#67).
    Detect ScanImage 2021 files (#46).
    Shape new version ScanImage series according to metadata (breaking).
    Remove Description key from TiffFile.scanimage_metadata dict (breaking).
    Also return ScanImage version from read_scanimage_metadata (breaking).
    Fix docstrings.
2021.2.26
    Squeeze axes of LSM series by default (breaking).
    Add option to preserve single dimensions when reading from series (WIP).
    Do not allow appending to OME-TIFF files.
    Fix reading STK files without name attribute in metadata.
    Make TIFF constants multi-thread safe and pickleable (#64).
    Add detection of NDTiffStorage MajorVersion to read_micromanager_metadata.
    Support ScanImage v4 files in read_scanimage_metadata.
2021.2.1
    Fix multi-threaded access of ZarrTiffStores using same TiffFile instance.
    Use fallback zlib and lzma codecs with imagecodecs lite builds.
    Open Olympus and Panasonic RAW files for parsing, albeit not supported.
    Support X2 and X4 differencing found in DNG.
    Support reading JPEG_LOSSY compression found in DNG.
2021.1.14
    Try ImageJ series if OME series fails (#54)
    Add option to use pages as chunks in ZarrFileStore (experimental).
    Fix reading from file objects with no readinto function.
2021.1.11
    Fix test errors on PyPy.
    Fix decoding bitorder with imagecodecs >= 2021.1.11.
2021.1.8
    Decode float24 using imagecodecs >= 2021.1.8.
    Consolidate reading of segments if possible.
2020.12.8
    Fix corrupted ImageDescription in multi shaped series if buffer too small.
    Fix libtiff warning that ImageDescription contains null byte in value.
    Fix reading invalid files using JPEG compression with palette colorspace.
2020.12.4
    Fix reading some JPEG compressed CFA images.
    Make index of SubIFDs a tuple.
    Pass through FileSequence.imread arguments in imread.
    Do not apply regex flags to FileSequence axes patterns (breaking).
2020.11.26
    Add option to pass axes metadata to ImageJ writer.
    Pad incomplete tiles passed to TiffWriter.write (#38).
    Split TiffTag constructor (breaking).
    Change TiffTag.dtype to TIFF.DATATYPES (breaking).
    Add TiffTag.overwrite method.
    Add script to change ImageDescription in files.
    Add TiffWriter.overwrite_description method (WIP).
2020.11.18
    Support writing SEPARATED color space (#37).
    Use imagecodecs.deflate codec if available.
    Fix SCN and NDPI series with Z dimensions.
    Add TiffReader alias for TiffFile.
    TiffPage.is_volumetric returns True if ImageDepth > 1.
    Zarr store getitem returns numpy arrays instead of bytes.
2020.10.1
    Formally deprecate unused TiffFile parameters (scikit-image #4996).
2020.9.30
    Allow to pass additional arguments to compression codecs.
    Deprecate TiffWriter.save method (use TiffWriter.write).
    Deprecate TiffWriter.save compress parameter (use compression).
    Remove multifile parameter from TiffFile (breaking).
    Pass all is_flag arguments from imread to TiffFile.
    Do not byte-swap JPEG2000, WEBP, PNG, JPEGXR segments in TiffPage.decode.
2020.9.29
    Fix reading files produced by ScanImage > 2015 (#29).
2020.9.28
    Derive ZarrStore from MutableMapping.
    Support zero shape ZarrTiffStore.
    Fix ZarrFileStore with non-TIFF files.
    Fix ZarrFileStore with missing files.
    Cache one chunk in ZarrFileStore.
    Keep track of already opened files in FileCache.
    Change parse_filenames function to return zero-based indices.
    Remove reopen parameter from asarray (breaking).
    Rename FileSequence.fromfile to imread (breaking).
2020.9.22
    Add experimental zarr storage interface (WIP).
    Remove unused first dimension from TiffPage.shaped (breaking).
    Move reading of STK planes to series interface (breaking).
    Always use virtual frames for ScanImage files.
    Use DimensionOrder to determine axes order in OmeXml.
    Enable writing striped volumetric images.
    Keep complete dataoffsets and databytecounts for TiffFrames.
    Return full size tiles from Tiffpage.segments.
    Rename TiffPage.is_sgi property to is_volumetric (breaking).
    Rename TiffPageSeries.is_pyramid to is_pyramidal (breaking).
    Fix TypeError when passing jpegtables to non-JPEG decode method (#25).
2020.9.3
    Do not write contiguous series by default (breaking).
    Allow to write to SubIFDs (WIP).
    Fix writing F-contiguous numpy arrays (#24).
2020.8.25
    Do not convert EPICS timeStamp to datetime object.
    Read incompletely written Micro-Manager image file stack header (#23).
    Remove tag 51123 values from TiffFile.micromanager_metadata (breaking).
2020.8.13
    Use tifffile metadata over OME and ImageJ for TiffFile.series (breaking).
    Fix writing iterable of pages with compression (#20).
    Expand error checking of TiffWriter data, dtype, shape, and tile arguments.
2020.7.24
    Parse nested OmeXml metadata argument (WIP).
    Do not lazy load TiffFrame JPEGTables.
    Fix conditionally skipping some tests.
2020.7.22
    Do not auto-enable OME-TIFF if description is passed to TiffWriter.save.
    Raise error writing empty bilevel or tiled images.
    Allow to write tiled bilevel images.
    Allow to write multi-page TIFF from iterable of single page images (WIP).
    Add function to validate OME-XML.
    Correct Philips slide width and length.
2020.7.17
    Initial support for writing OME-TIFF (WIP).
    Return samples as separate dimension in OME series (breaking).
    Fix modulo dimensions for multiple OME series.
    Fix some test errors on big endian systems (#18).
    Fix BytesWarning.
    Allow to pass TIFF.PREDICTOR values to TiffWriter.save.
2020.7.4
    Deprecate support for Python 3.6 (NEP 29).
    Move pyramidal subresolution series to TiffPageSeries.levels (breaking).
    Add parser for SVS, SCN, NDPI, and QPI pyramidal series.
    Read single-file OME-TIFF pyramids.
    Read NDPI files > 4 GB (#15).
    Include SubIFDs in generic series.
    Preliminary support for writing packed integer arrays (#11, WIP).
    Read more LSM info subrecords.
    Fix missing ReferenceBlackWhite tag for YCbCr photometrics.
    Fix reading lossless JPEG compressed DNG files.
2020.6.3
    ...

Refer to the CHANGES file for older revisions.

Notes
-----
The API is not stable yet and might change between revisions.

Tested on little-endian platforms only.

Python 32-bit versions are deprecated. Python <= 3.7 are no longer supported.

Tifffile relies on the `imagecodecs <https://pypi.org/project/imagecodecs/>`_
package for encoding and decoding LZW, JPEG, and other compressed image
segments.

Several TIFF-like formats do not strictly adhere to the TIFF6 specification,
some of which allow file or data sizes to exceed the 4 GB limit:

* *BigTIFF* is identified by version number 43 and uses different file
  header, IFD, and tag structures with 64-bit offsets. It adds more data types.
  Tifffile can read and write BigTIFF files.
* *ImageJ* hyperstacks store all image data, which may exceed 4 GB,
  contiguously after the first IFD. Files > 4 GB contain one IFD only.
  The size (shape and dtype) of the up to 6-dimensional image data can be
  determined from the ImageDescription tag of the first IFD, which is Latin-1
  encoded. Tifffile can read and write ImageJ hyperstacks.
* *OME-TIFF* stores up to 8-dimensional data in one or multiple TIFF of BigTIFF
  files. The 8-bit UTF-8 encoded OME-XML metadata found in the ImageDescription
  tag of the first IFD defines the position of TIFF IFDs in the high
  dimensional data. Tifffile can read OME-TIFF files, except when the OME-XML
  metadata are stored in a separate file. Tifffile can write numpy arrays
  to single-file OME-TIFF.
* *LSM* stores all IFDs below 4 GB but wraps around 32-bit StripOffsets.
  The StripOffsets of each series and position require separate unwrapping.
  The StripByteCounts tag contains the number of bytes for the uncompressed
  data. Tifffile can read large LSM files.
* *STK* (MetaMorph Stack) contains additional image planes stored contiguously
  after the image data of the first page. The total number of planes
  is equal to the counts of the UIC2tag. Tifffile can read STK files.
* *NDPI* uses some 64-bit offsets in the file header, IFD, and tag structures.
  Tag values/offsets can be corrected using high bits stored after IFD
  structures. Tifffile can read NDPI files > 4 GB.
  JPEG compressed segments with dimensions >65530 or missing restart markers
  are not decodable with libjpeg. Tifffile works around this limitation by
  separately decoding the MCUs between restart markers.
  BitsPerSample, SamplesPerPixel, and PhotometricInterpretation tags may
  contain wrong values, which can be corrected using the value of tag 65441.
* *Philips* TIFF slides store wrong ImageWidth and ImageLength tag values for
  tiled pages. The values can be corrected using the DICOM_PIXEL_SPACING
  attributes of the XML formatted description of the first page. Tifffile can
  read Philips slides.
* *Ventana/Roche BIF* slides store tiles and metadata in a BigTIFF container.
  Tiles may overlap and require stitching based on the TileJointInfo elements
  in the XMP tag. Volumetric scans are stored using the ImageDepth extension.
  Tifffile can read BIF and decode individual tiles, but does not perform
  stitching.
* *ScanImage* optionally allows corrupted non-BigTIFF files > 2 GB. The values
  of StripOffsets and StripByteCounts can be recovered using the constant
  differences of the offsets of IFD and tag values throughout the file.
  Tifffile can read such files if the image data are stored contiguously in
  each page.
* *GeoTIFF* sparse files allow strip or tile offsets and byte counts to be 0.
  Such segments are implicitly set to 0 or the NODATA value on reading.
  Tifffile can read GeoTIFF sparse files.

Other libraries for reading scientific TIFF files from Python:

* `Python-bioformats <https://github.com/CellProfiler/python-bioformats>`_
* `Imread <https://github.com/luispedro/imread>`_
* `GDAL <https://github.com/OSGeo/gdal/tree/master/gdal/swig/python>`_
* `OpenSlide-python <https://github.com/openslide/openslide-python>`_
* `Slideio <https://gitlab.com/bioslide/slideio>`_
* `PyLibTiff <https://github.com/pearu/pylibtiff>`_
* `SimpleITK <https://github.com/SimpleITK/SimpleITK>`_
* `PyLSM <https://launchpad.net/pylsm>`_
* `PyMca.TiffIO.py <https://github.com/vasole/pymca>`_ (same as fabio.TiffIO)
* `BioImageXD.Readers <http://www.bioimagexd.net/>`_
* `CellCognition <https://cellcognition-project.org/>`_
* `pymimage <https://github.com/ardoi/pymimage>`_
* `pytiff <https://github.com/FZJ-INM1-BDA/pytiff>`_
* `ScanImageTiffReaderPython
  <https://gitlab.com/vidriotech/scanimagetiffreader-python>`_
* `bigtiff <https://pypi.org/project/bigtiff>`_
* `Large Image <https://github.com/girder/large_image>`_

Some libraries are using tifffile to write OME-TIFF files:

* `Zeiss Apeer OME-TIFF library
  <https://github.com/apeer-micro/apeer-ometiff-library>`_
* `Allen Institute for Cell Science imageio
  <https://pypi.org/project/aicsimageio>`_
* `xtiff <https://github.com/BodenmillerGroup/xtiff>`_

Other tools for inspecting and manipulating TIFF files:

* `tifftools <https://github.com/DigitalSlideArchive/tifftools>`_
* `Tyf <https://github.com/Moustikitos/tyf>`_

References
----------
* TIFF 6.0 Specification and Supplements. Adobe Systems Incorporated.
  https://www.adobe.io/open/standards/TIFF.html
* TIFF File Format FAQ. https://www.awaresystems.be/imaging/tiff/faq.html
* The BigTIFF File Format.
  https://www.awaresystems.be/imaging/tiff/bigtiff.html
* MetaMorph Stack (STK) Image File Format.
  http://mdc.custhelp.com/app/answers/detail/a_id/18862
* Image File Format Description LSM 5/7 Release 6.0 (ZEN 2010).
  Carl Zeiss MicroImaging GmbH. BioSciences. May 10, 2011
* The OME-TIFF format.
  https://docs.openmicroscopy.org/ome-model/latest/
* UltraQuant(r) Version 6.0 for Windows Start-Up Guide.
  http://www.ultralum.com/images%20ultralum/pdf/UQStart%20Up%20Guide.pdf
* Micro-Manager File Formats.
  https://micro-manager.org/wiki/Micro-Manager_File_Formats
* ScanImage BigTiff Specification - ScanImage 2019.
  http://scanimage.vidriotechnologies.com/display/SI2019/
  ScanImage+BigTiff+Specification
* ZIF, the Zoomable Image File format. http://zif.photo/
* GeoTIFF File Format https://gdal.org/drivers/raster/gtiff.html
* Cloud optimized GeoTIFF.
  https://github.com/cogeotiff/cog-spec/blob/master/spec.md
* Tags for TIFF and Related Specifications. Digital Preservation.
  https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml
* CIPA DC-008-2016: Exchangeable image file format for digital still cameras:
  Exif Version 2.31.
  http://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf
* The EER (Electron Event Representation) file format.
  https://github.com/fei-company/EerReaderLib
* Digital Negative (DNG) Specification. Version 1.5.0.0, June 2012.
  https://www.adobe.com/content/dam/acom/en/products/photoshop/pdfs/
  dng_spec_1.5.0.0.pdf
* Roche Digital Pathology. BIF image file format for digital pathology.
  https://diagnostics.roche.com/content/dam/diagnostics/Blueprint/en/pdf/rmd/
  Roche-Digital-Pathology-BIF-Whitepaper.pdf

Examples
--------
Write a numpy array to a single-page RGB TIFF file:

>>> data = numpy.random.randint(0, 255, (256, 256, 3), 'uint8')
>>> imwrite('temp.tif', data, photometric='rgb')

Read the image from the TIFF file as numpy array:

>>> image = imread('temp.tif')
>>> image.shape
(256, 256, 3)

Write a 3D numpy array to a multi-page, 16-bit grayscale TIFF file:

>>> data = numpy.random.randint(0, 2**12, (64, 301, 219), 'uint16')
>>> imwrite('temp.tif', data, photometric='minisblack')

Read the whole image stack from the TIFF file as numpy array:

>>> image_stack = imread('temp.tif')
>>> image_stack.shape
(64, 301, 219)
>>> image_stack.dtype
dtype('uint16')

Read the image from the first page in the TIFF file as numpy array:

>>> image = imread('temp.tif', key=0)
>>> image.shape
(301, 219)

Read images from a selected range of pages:

>>> images = imread('temp.tif', key=range(4, 40, 2))
>>> images.shape
(18, 301, 219)

Iterate over all pages in the TIFF file and successively read images:

>>> with TiffFile('temp.tif') as tif:
...     for page in tif.pages:
...         image = page.asarray()

Get information about the image stack in the TIFF file without reading
the image data:

>>> tif = TiffFile('temp.tif')
>>> len(tif.pages)  # number of pages in the file
64
>>> page = tif.pages[0]  # get shape and dtype of the image in the first page
>>> page.shape
(301, 219)
>>> page.dtype
dtype('uint16')
>>> page.axes
'YX'
>>> series = tif.series[0]  # get shape and dtype of the first image series
>>> series.shape
(64, 301, 219)
>>> series.dtype
dtype('uint16')
>>> series.axes
'QYX'
>>> tif.close()

Inspect the "XResolution" tag from the first page in the TIFF file:

>>> with TiffFile('temp.tif') as tif:
...     tag = tif.pages[0].tags['XResolution']
>>> tag.value
(1, 1)
>>> tag.name
'XResolution'
>>> tag.code
282
>>> tag.count
1
>>> tag.dtype
<DATATYPES.RATIONAL: 5>

Iterate over all tags in the TIFF file:

>>> with TiffFile('temp.tif') as tif:
...     for page in tif.pages:
...         for tag in page.tags:
...             tag_name, tag_value = tag.name, tag.value

Overwrite the value of an existing tag, e.g. XResolution:

>>> with TiffFile('temp.tif', mode='r+b') as tif:
...     _ = tif.pages[0].tags['XResolution'].overwrite((96000, 1000))

Write a floating-point ndarray and metadata using BigTIFF format, tiling,
compression, and planar storage:

>>> data = numpy.random.rand(2, 5, 3, 301, 219).astype('float32')
>>> imwrite('temp.tif', data, bigtiff=True, photometric='minisblack',
...         compression='zlib', planarconfig='separate', tile=(32, 32),
...         metadata={'axes': 'TZCYX'})

Write a 10 fps time series of volumes with xyz voxel size 2.6755x2.6755x3.9474
micron^3 to an ImageJ hyperstack formatted TIFF file:

>>> volume = numpy.random.randn(6, 57, 256, 256).astype('float32')
>>> imwrite('temp.tif', volume, imagej=True, resolution=(1./2.6755, 1./2.6755),
...         metadata={'spacing': 3.947368, 'unit': 'um', 'finterval': 1/10,
...                   'axes': 'TZYX'})

Read the volume and metadata from the ImageJ file:

>>> with TiffFile('temp.tif') as tif:
...     volume = tif.asarray()
...     axes = tif.series[0].axes
...     imagej_metadata = tif.imagej_metadata
>>> volume.shape
(6, 57, 256, 256)
>>> axes
'TZYX'
>>> imagej_metadata['slices']
57
>>> imagej_metadata['frames']
6

Create a TIFF file containing an empty image and write to the memory-mapped
numpy array:

>>> memmap_image = memmap(
...     'temp.tif', shape=(256, 256, 3), dtype='float32', photometric='rgb'
... )
>>> type(memmap_image)
<class 'numpy.memmap'>
>>> memmap_image[255, 255, 1] = 1.0
>>> memmap_image.flush()
>>> del memmap_image

Memory-map and read contiguous image data in the TIFF file:

>>> memmap_image = memmap('temp.tif')
>>> memmap_image.shape
(256, 256, 3)
>>> memmap_image[255, 255, 1]
1.0
>>> del memmap_image

Write two numpy arrays to a multi-series TIFF file:

>>> series0 = numpy.random.randint(0, 255, (32, 32, 3), 'uint8')
>>> series1 = numpy.random.randint(0, 1023, (4, 256, 256), 'uint16')
>>> with TiffWriter('temp.tif') as tif:
...     tif.write(series0, photometric='rgb')
...     tif.write(series1, photometric='minisblack')

Read the second image series from the TIFF file:

>>> series1 = imread('temp.tif', series=1)
>>> series1.shape
(4, 256, 256)

Successively write the frames of one contiguous series to a TIFF file:

>>> data = numpy.random.randint(0, 255, (30, 301, 219), 'uint8')
>>> with TiffWriter('temp.tif') as tif:
...     for frame in data:
...         tif.write(frame, contiguous=True)

Append an image series to the existing TIFF file:

>>> data = numpy.random.randint(0, 255, (301, 219, 3), 'uint8')
>>> imwrite('temp.tif', data, photometric='rgb', append=True)

Create a TIFF file from a generator of tiles:

>>> data = numpy.random.randint(0, 2**12, (31, 33, 3), 'uint16')
>>> def tiles(data, tileshape):
...     for y in range(0, data.shape[0], tileshape[0]):
...         for x in range(0, data.shape[1], tileshape[1]):
...             yield data[y : y + tileshape[0], x : x + tileshape[1]]
>>> imwrite('temp.tif', tiles(data, (16, 16)), tile=(16, 16),
...         shape=data.shape, dtype=data.dtype, photometric='rgb')

Write two numpy arrays to a multi-series OME-TIFF file:

>>> series0 = numpy.random.randint(0, 255, (32, 32, 3), 'uint8')
>>> series1 = numpy.random.randint(0, 1023, (4, 256, 256), 'uint16')
>>> with TiffWriter('temp.ome.tif') as tif:
...     tif.write(series0, photometric='rgb')
...     tif.write(series1, photometric='minisblack',
...               metadata={'axes': 'ZYX', 'SignificantBits': 10,
...                         'Plane': {'PositionZ': [0.0, 1.0, 2.0, 3.0]}})

Write a tiled, multi-resolution, pyramidal, OME-TIFF file using
JPEG compression. Sub-resolution images are written to SubIFDs:

>>> data = numpy.arange(1024*1024*3, dtype='uint8').reshape((1024, 1024, 3))
>>> with TiffWriter('temp.ome.tif', bigtiff=True) as tif:
...     options = dict(tile=(256, 256), photometric='rgb', compression='jpeg')
...     tif.write(data, subifds=2, **options)
...     # save pyramid levels to the two subifds
...     # in production use resampling to generate sub-resolutions
...     tif.write(data[::2, ::2], subfiletype=1, **options)
...     tif.write(data[::4, ::4], subfiletype=1, **options)

Access the image levels in the pyramidal OME-TIFF file:

>>> baseimage = imread('temp.ome.tif')
>>> second_level = imread('temp.ome.tif', series=0, level=1)
>>> with TiffFile('temp.ome.tif') as tif:
...     baseimage = tif.series[0].asarray()
...     second_level = tif.series[0].levels[1].asarray()

Iterate over and decode single JPEG compressed tiles in the TIFF file:

>>> with TiffFile('temp.ome.tif') as tif:
...     fh = tif.filehandle
...     for page in tif.pages:
...         for index, (offset, bytecount) in enumerate(
...             zip(page.dataoffsets, page.databytecounts)
...         ):
...             _ = fh.seek(offset)
...             data = fh.read(bytecount)
...             tile, indices, shape = page.decode(
...                 data, index, jpegtables=page.jpegtables
...             )

Use zarr to read parts of the tiled, pyramidal images in the TIFF file:

>>> import zarr
>>> store = imread('temp.ome.tif', aszarr=True)
>>> z = zarr.open(store, mode='r')
>>> z
<zarr.hierarchy.Group '/' read-only>
>>> z[0]  # base layer
<zarr.core.Array '/0' (1024, 1024, 3) uint8 read-only>
>>> z[0][256:512, 512:768].shape  # read a tile from the base layer
(256, 256, 3)
>>> store.close()

Read images from a sequence of TIFF files as numpy array:

>>> imwrite('temp_C001T001.tif', numpy.random.rand(64, 64))
>>> imwrite('temp_C001T002.tif', numpy.random.rand(64, 64))
>>> image_sequence = imread(['temp_C001T001.tif', 'temp_C001T002.tif'])
>>> image_sequence.shape
(2, 64, 64)
>>> image_sequence.dtype
dtype('float64')

Read an image stack from a series of TIFF files with a file name pattern
as numpy or zarr arrays:

>>> image_sequence = TiffSequence('temp_C0*.tif', pattern=r'_(C)(\d+)(T)(\d+)')
>>> image_sequence.shape
(1, 2)
>>> image_sequence.axes
'CT'
>>> data = image_sequence.asarray()
>>> data.shape
(1, 2, 64, 64)
>>> with image_sequence.aszarr() as store:
...     zarr.open(store, mode='r')
<zarr.core.Array (1, 2, 64, 64) float64 read-only>
>>> image_sequence.close()

Write the zarr store to a fsspec ReferenceFileSystem in JSON format:

>>> with image_sequence.aszarr() as store:
...     store.write_fsspec('temp.json', url='file://')

Open the fsspec ReferenceFileSystem as a zarr array:

>>> import fsspec
>>> import tifffile.numcodecs
>>> tifffile.numcodecs.register_codec()
>>> mapper = fsspec.get_mapper(
...     'reference://', fo='temp.json', target_protocol='file')
>>> zarr.open(mapper, mode='r')
<zarr.core.Array (1, 2, 64, 64) float64 read-only>

z	2021.11.2)5OmeXmlOmeXmlErrorTIFFTiffFileTiffFileError	TiffFrameTiffPageTiffPageSeries
TiffReaderTiffSequenceTiffTagTiffTagsTiffTagRegistry
TiffWriterZarrFileSequenceStore	ZarrStoreZarrTiffStoreimreadimshowimwritelsm2binmemmapread_micromanager_metadataread_scanimage_metadatatiff2fsspectiffcomment	FileCache
FileHandleFileSequenceTimeraskopenfilenameastypecreate_outputenumargenumstrformat_sizelazyattrmatlabstr2pynatural_sortednullfuncparse_kwargspformatproduct	repeat_ndreshape_axes
reshape_ndsqueeze_axes	stripnulltranspose_axesupdate_kwargsxml2dictimsave	_app_show    N)IterableMutableMapping)ThreadPoolExecutorFc             K   s  t |ddddddddd	f
d
d |D  }t |dddddd}|dddk	r|dddk	rftdtjdtdd |d|d< |dddkrDt| trd| ksd| krt		| } | st
dt| dst| ttjfst| dkr| d } t| ttjfst| drDt| f| }|r2|jf |S |jf |S Q R X t| f|(}|rh|jf ||S |jf ||S Q R X dS )a  Return image data from TIFF file(s) as numpy array or zarr storage.

    Refer to the TiffFile and TiffSequence classes and their asarray
    functions for documentation.

    Parameters
    ----------
    files : str, path-like, binary stream, or sequence
        File name, seekable binary stream, glob pattern, or sequence of
        file names.
    aszarr : bool
        If True, return file sequences, series, or single pages as
        zarr storage instead of numpy array (experimental).
    kwargs : dict
        Parameters 'name', 'offset', 'size', and 'is_' flags are passed to
        TiffFile or TiffSequence.imread.
        Parameters 'imread', 'container', 'sort', 'pattern', 'axesorder',
        and 'categories' are passed to TiffSequence.
        Other parameters are passed to the asarray or aszarr functions.
        The first image series in the file is returned if no arguments are
        provided.

    Returns
    -------
    numpy.ndarray or zarr storage
        Image data from the specified pages.
        Zarr storage instances must be closed after use.
        See TiffPage.asarray for operations that are applied (or not)
        to the raw data stored in the file.

    nameoffsetsize
_multifile
_useframesfastijmovie	multifilemultifile_closec             s   s"   | ]}|d d dkr|V  qd S )N   is_ ).0keyrE   rE   T/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/tifffile/tifffile.py	<genexpr>S  s    zimread.<locals>.<genexpr>r   	containersortpattern	axesorder
categoriespagesNrG   z8the 'pages' and 'key' parameters cannot be used togetherz^<tifffile.imread> the 'pages' parameter is deprecated since 2017.9.29. Use the 'key' parameter   )
stacklevel*?zno files foundseek   r6   )r)   get	TypeErrorwarningswarnDeprecationWarningpop
isinstancestrglob
ValueErrorhasattrosPathLikelenr   aszarrasarrayr
   )filesrd   kwargsZkwargs_fileZ
kwargs_seqtifZimseqrE   rE   rH   r   $  s^     

r   c          	   K   s   t |ddddd}|dkr:t|}t||j }|j}n0y|j}|jj}W n tk
rh   d}d}Y nX |dd	}d|kr||kr|	dd
s|	dd
s|	dd
s|	dd
sd|d< d|kr||d< t
| f|}	|	j|||f|}
W dQ R X |
S )a  Write numpy array to TIFF file.

    Refer to the TiffWriter class and its write function for documentation.

    A BigTIFF file is created if the data's size is larger than 4 GB minus
    32 MB (for metadata), and 'bigtiff' is not specified, and 'imagej' or
    'truncate' are not enabled.

    Parameters
    ----------
    file : str, path-like, or binary stream
        File name or writable binary stream, such as an open file or BytesIO.
    data : array-like
        Input image. The last dimensions are assumed to be image depth,
        length, width, and samples.
        If None, an empty array of the specified shape and dtype is
        saved to file.
        Unless 'byteorder' is specified in 'kwargs', the TIFF file byte order
        is determined from the data's dtype or the dtype argument.
    shape : tuple
        If 'data' is None, shape of an empty array to save to the file.
    dtype : numpy.dtype
        If 'data' is None, datatype of an empty array to save to the file.
    kwargs : dict
        Parameters 'append', 'byteorder', 'bigtiff', 'imagej', and 'ome',
        are passed to TiffWriter().
        Other parameters are passed to TiffWriter.write().

    Returns
    -------
    offset, bytecount : tuple or None
        If the 'returnoffset' argument is True and the image data are written
        contiguously, return offset and bytecount of image data in the file.

    appendbigtiff	byteorderimagejomeNr6   bigsizel      | FtruncatecompressioncompressT)r)   numpydtyper+   itemsizerk   nbytes	Exceptionr[   rV   r   write)filedatashapers   rg   Ztifargsdatasizerk   rn   rh   resultrE   rE   rH   r     s2    $

r   r+c          	   K   s   |dk	rL|dk	rL|j d||tjdd t| f|}|dkrBtd|d }	nt| f|x}
|dk	r|
j| }|jsztd|j\}	}|j	}|j
}n.|
j| }|jdkrtd|j	}|j
}|j}	|
j|j }W dQ R X t| |||	|dS )a%  Return memory-mapped numpy array stored in TIFF file.

    Memory-mapping requires data stored in native byte order, without tiling,
    compression, predictors, etc.
    If 'shape' and 'dtype' are provided, existing files are overwritten or
    appended to depending on the 'append' parameter.
    Otherwise the image data of a specified page or series in an existing
    file are memory-mapped. By default, the image data of the first
    series are memory-mapped.
    Call flush() to write any changes in the array to the file.
    Raise ValueError if the image data in the file are not memory-mappable.

    Parameters
    ----------
    filename : str or path-like
        Name of the TIFF file which stores the array.
    shape : tuple
        Shape of the empty array.
    dtype : numpy.dtype
        Datatype of the empty array.
    page : int
        Index of the page which image data to memory-map.
    series, level : int
        Index of the page series and pyramid level which image data to
        memory-map.
    mode : {'r+', 'r', 'c'}
        The file open mode. Default is to open existing file for reading and
        writing ('r+').
    kwargs : dict
        Additional parameters passed to imwrite() or TiffFile().

    Returns
    -------
    numpy.memmap
        Image data in TIFF file.

    NT)ry   rz   rs   alignreturnoffsetz"image data are not memory-mappabler6   C)updater   ALLOCATIONGRANULARITYr   r_   r   rO   is_memmappableis_contiguousrz   rs   seriesr;   rk   charrr   r   )filenamerz   rs   pager   levelmoderg   r|   r;   rh   _rE   rE   rH   r     s6    /




r   c                   s,   e Zd ZdZdZdd Z fddZ  ZS )r%   z\Attribute whose value is computed on first access.

    Lazyattrs are not thread-safe.

    )func__dict__c             C   s*   || _ |j| _|j| _|j| _|j| _dS )z,Initialize instance from decorated function.N)r   __doc__
__module____name____qualname__)selfr   rE   rE   rH   __init__&  s
    zlazyattr.__init__c          
      sv   |d kr| S y|  |}W n* tk
rD } zt|W d d }~X Y nX |tkrbtt||| j jS t|| j j| |S )N)r   AttributeErrorRuntimeErrorNotImplementedgetattrsuperr   setattr)r   instanceownervalueexc)	__class__rE   rH   __get__/  s    zlazyattr.__get__)r   r   r   r   	__slots__r   r   __classcell__rE   rE   )r   rH   r%     s   	r%   c               @   s   e Zd ZdZdS )r   z-Exception to indicate invalid TIFF structure.N)r   r   r   r   rE   rE   rE   rH   r   =  s   r   c               @   s   e Zd ZdZdddZedd Zddddddddddddddddddddddddi d	dddfd
dZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r   a  Write numpy arrays to TIFF file.

    TiffWriter's main purpose is saving nD numpy array's as TIFF, not to
    create any possible TIFF format. Specifically, ExifIFD and GPSIFD tags
    are not supported.

    TiffWriter instances must be closed using the 'close' method, which is
    automatically called when using the 'with' context manager.

    TiffWriter instances are not thread-safe.

    FNc       
   
   C   sf  |ryxt |ddd`}| }zDt|2}	|dkr@|	js@td|	j}|	j}|	jj| _	W dQ R X W d|
| X W dQ R X W n ttfk
r   d}Y nX |dkrtjd	krd
nd}n|dkrtd| |d
kr|rtjntj| _n|rtjntj| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _g | _ g | _!d| _"d| _#|rt |ddd| _$| j$
dt%j& nt |ddd| _$| j$'ddd|  |r| j$'t()|d ddd n| j$'t()|d d | j$ | _	| j$'t()| jj*d |dkrdnt+|| _,| j,r,dnt+|| _-| j-rDd| _,|rb|rbt./| dt0 dS )a  Open TIFF file for writing.

        An empty TIFF file is created if the file does not exist, else the
        file is overwritten with an empty TIFF file unless 'append'
        is true. Use 'bigtiff=True' when creating files larger than 4 GB.

        Parameters
        ----------
        file : path-like, binary stream, or FileHandle
            File name or writable binary stream, such as an open file
            or BytesIO.
        bigtiff : bool (optional)
            If True, the BigTIFF format is used.
        byteorder : {'<', '>', '=', '|'} (optional)
            The endianness of the data in the file.
            By default, this is the system's native byte order.
        append : bool (optional)
            If True and 'file' is an existing standard TIFF file, image data
            and tags are appended to the file. This does not scale well with
            the number of pages already in the file.
            Appending data may corrupt specifically formatted TIFF files
            such as OME-TIFF, LSM, STK, ImageJ, or FluoView.
        imagej : bool (optional)
            If True and not 'ome', write an ImageJ hyperstack compatible file.
            This format can handle data types uint8, uint16, or float32 and
            data shapes up to 6 dimensions in TZCYXS order.
            RGB images (S=3 or S=4) must be uint8.
            ImageJ's default byte order is big-endian but this implementation
            uses the system's native byte order by default.
            ImageJ hyperstacks do not support BigTIFF or compression.
            The ImageJ file format is undocumented.
            When using compression, use ImageJ's Bio-Formats import function.
        ome : bool (optional)
            If True, write an OME-TIFF compatible file. If None (default),
            the value is determined from the file name extension, the value of
            the 'description' parameter in the first call of the write
            function, and the value of 'imagej'.
            Refer to the OME model for restrictions of this format.

        rbr6   )r   r<   forcez)cannot append to file containing metadataNF)N=|little<>)r   r   zinvalid byteorder zr+bwbs   IIs   MMZHHH+      H*   z% writing nonconformant BigTIFF ImageJ)1r   tellr   is_appendabler_   rk   
is_bigtiffrO   next_page_offset
_ifdoffsetrT   OSErrorFileNotFoundErrorsysr   BIG_LE
CLASSIC_LEtiffBIG_BE
CLASSIC_BE	_truncate	_metadata	_colormap_tags
_datashape
_datadtype_dataoffset_databytecounts_dataoffsetstag_descriptiontag_subifds_subifdslevel_subifdsoffsets_nextifdoffsets	_ifdindex_storedshape_fhra   SEEK_ENDrw   structpackoffsetformatbool_ome_imagejrX   rY   UserWarning)
r   rx   rj   rk   ri   rl   rm   fhposrh   rE   rE   rH   r   O  sn    1

zTiffWriter.__init__c             C   s   | j S )zReturn file handle.)r   )r   rE   rE   rH   
filehandle  s    zTiffWriter.filehandler6   rE   c       q         s$  j }jj |dkr<d}t|} t| }!|!j}"n|dk	r|dk	rt|drt|drf|}nt	|}t|} t| }!|!j}"nt|drt
dnt|drt| |jj d}nt| }!t||!d}|dk	r
||jkr
tdt |dk	r2||jkr2tdt d}|j} |j}!|jj}"|oT|!j}|dkr|dk	rtjd	td
d t|ttjfr|dkrdt|f}d|  k rdksn td| n|}~|"dk}#|#r<| d dkrdnd}$t| d|$ }%| |$ d r*|%| |$ d d 9 }%n|%| |$ d 9 }%nt| |!j }%|%dkrpd}d}d}|dk	r~d}
n|dkr~d}| }&|dk	o||!jd k}'jdk	rF|	r܈jdd | ks܈j|!kst|jsڈ  jrtdnnjrDjdk rdjj jjjd dkr,dndd j!fj" n |dk	rd#  |$dt%j& j'r̈j(sz|
rtd jd7  _jj'krg _)g _*d_d_'d_+n|rtdd_d_nl|s|'s|rtdnPjd d f|  _|, }(|dkr*|-|% n
|.| |rB|(|%fS dS jdkrp|dkrjd|j/k_nd_jr|dnt0|
_(j(r|s|'s|rtd|%dkrd} tdt jj1 djj2})jj3jj1jj4}*t5j6j7}+t5j6j8},t5j6j9}-t5j6j:}.t5j6j;}/t5j<j=}0t5j<j>}1|dk	rDt?t5j6|}|rVt?t5j<|}|rxt|t0sxt0t?t5j@|}|dkrd}2ntd d! tA|D }2|r<t|ttBfr tC|d
krd"|d i}3n&tD|d
 }3|d dk	r|d |3d"< |d }ni }3t|tEr&|F }|d#kr&d}t?t5jG|}4|4dk}nd}d}4|sVi }3d}d}5|r|4d$krld}nX|!jHd%kr|!jd&krd}nd
}5t5jId
 }n*|!jHd'krd(}5t5jId( }ntd)|! jr.|dk	rtd*t d}tjtJstJf |_|s |r(tC|d
kr(td+d}njr(|dk	rVtd,t d}|"d-krntd.|"|s|rtC|d
krtd/d}|r||-knd}6|"d0krd}6tK| |6|Ld1d}7|7d d2kr|-}|"d0krtd.|"d3n|dkr|+}d}||1krtd4|6r$|0nd}|dk	r~|"d5krDtd6tj| d7 d8}|jd(d
|!jd  fkrxtd9|_|	rtd:d! |dd( D }tC|d
k s|d d; s|d d; stMd<d! |D rtd=|	r tC|d
k	r d>| }tC|d(k}nd?}t0|}tN| t5jOL|d
}8|8}tC|8}9d}:d}|	rV|9d(k 	rVd}|dk		rh|/}d}|dk
rd};|+}|#	r|,}n||0k	r|9d
k
r|d d2k
r|-}|"d5k};n||1k
r|	r|9d(k	r|d@ d2k	r|-}d};n |9d
k
r|dA d2k
r|-}d};n|9d
k
r6|d d2k
r6|-}|0}|"d5k};njj
sFj
rP|+}d}nP|
r||9d(k
r||d@ d2k
r||-}|1}d};n$|9d
k
r|dA d2k
r|-}|1}d};|;
r||0k
rdB}<ndC}<tjdD|  dE|! dF|<d  dG|<d  dH	td
d ~<~;~ t5jO| }=|r,tC||rd(nd
kr,d}|=dkr,|+}|=dkrLtC|d(k rTtdI|dJtC|d&k rfd}|dkr||-kr|=d&f}>n|=f}>|d |>kr|0}nD||rd@ndA |>kr|1}n&|d ||rd@ndA kr|1}n|0}||0krdK||rd@ndAd  }8|8d }:n&dL||rd@ndAd  d> }8|8d }:|:|=kr|:|= }nZ|t5j6jPkrtC|d
krptdMd}d}dK|dd  d> }8n|rtC||rd(nd
kr||0krdK||rd@ndAd  }8|8d }:n&dL||rd@ndAd  d> }8|8d }:|:d }nd}x.tC|d
kr>|d dkr>|dd }qW tC|d(k rRd}|2dkr|dK||rjdAndd  d> }8n*dK||rd@ndAd  }8|8d }:|:d }|d&@ r|#r|:dkr|dNkstdOt5j6jQ}d}'|#r|dk	r|dkrtdP| dQd}n|4dRkrN|!dSkrN|dk	rH|dTkrHtdP| dUdT}n|dkrd|!jd }n|!jHdVks||!jd&kr||!jd krtdP| dW|! nz|ddd;dX|!j kr||!jd kstdP| dY|! n<|r||!jd krtdP| dZn||!jd krd}'tC|8d[kr>tRd\tC|8 d]tC|8d^krh|8dd
 d> |8d
d  }8|8d dkrt|8dd }?|?dkrdn
t|&|? }?|?f|8dd  }8y|S|8}W n tTk
r   Y nX ||/kr|:dks|s|8d dks|8d dkrtd_||-kr2|:d
kr2td`g |rFda}@db}Andc}@dd}A|A_U fdedfdԇfdgdh	}Bdidj }C|dk	r|Bdkd
d|ddl |si n|V _"jrtCjjWdkrdm}nd}n؈jrl|dkrtXj"dndodpdqdrdsdtdudvdwdxdydzd{d|d}}ntjd~td
d xtY| D ]}D|B|D  q0W tZ|&|8d d2kjdk	fj"}|d7 }nB|s||i krj(rj"j[dd t\|&fj"}|d7 }nd}|dk	r|]d}|Bdkd
d|ddl ~|dkrd}|r|Bdd
d|ddl |rzt|tEr4tC|dks*|d; dkrhtdn4y|^d}W n$ tTk
rf   _ ^d}Y nX |Bdd
d|ddl |Bdd(d|4 |4dkr|Bdd&d
d |r|Bdd(d|5 |Bdd&d|8d  |Bdd&d|8dA  |r|Bdd&d|d  |Bdd&d|d  |r2|Bdd&d|8d@  |r2|Bdd&d|d  |rF|Bdd&d| |sTj'rʈjdk rʈj'rpj'}n8yt| _'}W n$ t
k
r   tC| _'}Y nX |Bdd&krdnd|dg|  |#s|!jHdVksdd
d(dd|!jH }E|Bdd(|:|Ef|:  |dk	r|Bdd(|j`| |Bdd(d|: |#r4nD|rj|:dkrj|Bdd(d|ja |Bdd(|:|f|:  n|Bdd(d| |r|2dk	r|tC|2krtd| dtC|2 |Bdd(||2 n6||-kr|dkr|Bdd(dd
 n|Bdd(|d|  |dk	r|BddRtC|| |4dRkr|dkr||-|.fkr|dkrBd}n|dkrZtd|tb|d }F|r|d |F s|d |F rtd|F |dkrtd|Bdd(d
| t?t5j6|3Ldd}G||3d< |j/|3d< |Gj/|3d< |Bdd(d|G tcdd! |D r|Bdd^dd nn|dkr4tdd| d}d}F|Bdd(d|ja ||.kr|Bdd(d
d tcdd! |D r|Bdd^dd |dk	r|Bdd^d|C|d  |Bdd^d|C|d  tC|d
kr|d
 }H|Hdkrdn
t?t5je|H}Hnjrd}Hnd
}H|Bdd(d|H n2jsB|Bdd^dd |Bdd^dd |Bdd(dd |fdd}I|p^|'p^|# }	|rtC|d
kr|8d( |d  d |d  |8d& |d  d |d  f}J|	o|8d( |d ko|8d& |d k}	n|8d
 |d  d |d  |8d( |d  d |d  |8d& |d
  d |d
  f}J|	ob|8d
 |d kob|8d( |d kob|8d& |d
 k}	t|J|8d  }Kt||8d  |!j g|K }L|I|L}M|B|@|M|K|L |B|A|Kdg|K  |M|K }M|	s|dk	rntf|||J}n|	r|dkr|8d |8d
  }Nt|8d(d |!j g|N }L|I|L}M|B|@|M|N|L |B|A|Ndg|N  |Bdd&d|8dA  |M|8d  }M|	s|dk	rzntg|}nRt|8dd |!j }O|dkr|rd|O }n|8dA }|dk r|F}n:||8dA kr|8dA }n"|r||F rthi||F |F }|Bdd&d| |8dA | d | }P|P|8d  |8d
  }Q||O }R|Rg|Q }L|R|O|P| |8dA   8 }Rx"tj|Pd |Q|PD ]}S|R|L|S< qzW |I|L}M|B|@|M|Q|L |B|A|Qdg|Q  |M|Q }M|	s|dk	rntg|}|dkr|	stdx|D ]}D|B|D  qW tkdd d|#r^|4dkr4ddd}n(|4dkrTt5jl|4 |3fdd}ntmdŃn|rt5jl|4 }T|4dkrd|3d< |r|T|3fdd}n2|r||T|3fdd}n|3r|T|3fdd}n|T}n|'r|fdd}nd}~|, }Ud&ksjs|s|U|% dkrtd̓xtj|	r*dn|8d D ]}V|U}W|Wd
 rZ|ndΡ |Wd7 }Wjdk r|$jo |n|W |$|W |Vd
k rd}Xtpq }Y|Yn|)tC |Y, }Z|YndϠrdd! D  |Y, }[|Ynd xntsD ]`\}\}]|Z|\|*  d&  }(|]d }^|]d
 }_|_r|Y, }`|`d
 rT|YndΡ |`d7 }`|Y$|( |Yn|W|`  |Y$|` |Yn|_ |^|Akr|(|`f}anR|^|@kr|(|`f}bn>|^dkkr|W|Z |\|*  jt_u|W|` jt_vn|^dkr\|(|`f}Xnn|^|Akr|(df}anZ|^|@kr|(df}bnF|^dkkrJ|W|Z |\|*  jt_ujtju d& jt_vn|^dkr|(df}XqW |Y, }c|cd
 r|YndΡ |cd7 }c|$|ct%jw |, }d|dkrd;}||d|  | }e|$|et%jw |d|e7 }d|	rP|dkr|-|% n`|dk	rBxT|D ]@}f|fj|!kr"td|fjdW|!|.|fS|8dd  qW n
|.| nZ| r|8d dkrj|}gn||8d f }gt|g|!j }h|dkr|-|K|h  n| r8d}ixtj|8d t|J D ]r}jtx|}k|kdkrd|L|j< q|irt|ktyrn$|kjz|hk rt{|k|g|!}kd}i||k}k|n|k tC|k|L|j< qW nbx`tj|8d t|J D ]H}jtx|}k|kdk rr|-|h  qN|kjz|hk rt{|k|g|!}k|.|k  qNW n|!rh|8dA | d | }Qd}ltx|S|8dd }f|fj|!k rtd|fjdW|!x|fD ]h}mx`|mD ]X}nxPtj|QD ]D}S|n|S| |Sd |  }o||o}o|n|o tC|o|L|l< |ld7 }l!qW !qW  qW nBtx|S|8dd }f|fj|!k!rtd|fjdW|!|.|f |a\}(}`|Y$|( |`"r|Yn|W|`  |Y$|` |d}(x8|LD ]}p|Yn|( |(|p7 }(!qW n|Yn|d |"rn|b\}(}`|Y$|( |`"rZ|Yn|W|`  |Y$|` |Yn|Mf|L  |Xdk	"r|X\}(}`|`dk	"r|Y$|( |Yn|W|`  j*||W|`  nj*||W|(  |, }U|$|W |n|Y}  |~  jdk #r
|W|[ _on|$j*j+ j   |n|W jdk#rTj)||W|[  n2|$j)j+  |n|W |W|[ j)j+<  j+d7  _+ j+tCj*;  _+|$|U |Vdkr4ddӄ D q4W |8_!d>|& _|!_|d_|L_|	$r_|$r|dt|LfS dS )a.  Write numpy ndarray to a series of TIFF pages.

        The ND image data are written to a series of TIFF pages/IFDs.
        By default, metadata in JSON, ImageJ, or OME-XML format are written
        to the ImageDescription tag of the first page to describe the series
        such that the image data can later be read back as a ndarray of same
        shape.

        The data shape's last dimensions are assumed to be image depth,
        length (height), width, and samples.
        If a colormap is provided, the data's dtype must be uint8 or uint16
        and the data values are indices into the last dimension of the
        colormap.
        If 'shape' and 'dtype' are specified instead of 'data', an empty array
        is written. This option cannot be used with compression, predictors,
        packed integers, bilevel images, or multiple tiles.
        If 'shape', 'dtype', and 'tile' are specified, 'data' must be an
        iterable of all tiles in the image.
        If 'shape', 'dtype', and 'data' are specified but not 'tile', 'data'
        must be an iterable of all single planes in the image.
        Image data are written uncompressed in one strip per plane by default.
        Dimensions larger than 2 to 4 (depending on photometric mode, planar
        configuration, and volumetric mode) are flattened and written as
        separate pages.
        If the data size is zero, a single page with shape (0, 0) is written.
        The SampleFormat tag is derived from the data type or dtype.

        A UserWarning is logged if RGB colorspace is auto-detected. Specify
        the 'photometric' parameter to avoid the warning.

        Parameters
        ----------
        data : numpy.ndarray, iterable of numpy.ndarray, or None
            Input image or iterable of tiles or images.
            A copy of the image data is made if 'data' is not a C-contiguous
            numpy array with the same byteorder as the TIFF file.
            Iterables must yield C-contiguous numpy array of TIFF byteorder.
            Iterable tiles must match 'dtype' and the shape specified in
            'tile'. Incomplete tiles are zero-padded.
            Iterable images must match 'dtype' and 'shape[1:]'.
        shape : tuple or None
            Shape of the empty or iterable data to write.
            Use only if 'data' is None or an iterable of tiles or images.
        dtype : numpy.dtype or None
            Datatype of the empty or iterable data to write.
            Use only if 'data' is None or an iterable of tiles or images.
        photometric : {MINISBLACK, MINISWHITE, RGB, PALETTE, SEPARATED, CFA}
            The color space of the image data according to TIFF.PHOTOMETRIC.
            By default, this setting is inferred from the data shape, dtype,
            and the value of colormap. Always specify this parameter to avoid
            ambiguities.
            For CFA images, the CFARepeatPatternDim, CFAPattern, and other
            DNG or TIFF/EP tags must be specified in 'extratags' to produce a
            valid file.
        planarconfig : {CONTIG, SEPARATE}
            Specifies if samples are stored interleaved or in separate planes.
            By default, this setting is inferred from the data shape.
            If this parameter is set, extra samples are used to store grayscale
            images.
            CONTIG: last dimension contains samples.
            SEPARATE: third (or fourth) last dimension contains samples.
        extrasamples : tuple of {UNSPECIFIED, ASSOCALPHA, UNASSALPHA}
            Defines the interpretation of extra components in pixels.
            UNSPECIFIED: no transparency information (default).
            ASSOCALPHA: single, true transparency with pre-multiplied color.
            UNASSALPHA: independent transparency masks.
        volumetric : bool
            If True, the SGI ImageDepth tag is used to write volumetric data
            in one page. The volumetric format is not officially specified,
            and few software can read it. OME and ImageJ formats are not
            compatible with volumetric storage.
        tile : tuple of int
            The shape ([depth,] length, width) of image tiles to write.
            If None (default), image data are written in strips.
            The tile length and width must be a multiple of 16.
            If a tile depth is provided, the SGI ImageDepth and TileDepth
            tags are used to write volumetric data.
            Tiles cannot be used to write contiguous series, except if tile
            matches the data shape.
        contiguous : bool
            If False (default), write data to a new series.
            If True and the data and parameters are compatible with previous
            written ones (same shape, no compression, etc.), the image data
            are stored contiguously after the previous one. In that case,
            'photometric', 'planarconfig', and 'rowsperstrip' are ignored.
            Metadata such as 'description', 'metadata', 'datetime', and
            'extratags' are written to the first page of a contiguous series
            only. Cannot be used with the OME or ImageJ formats.
        truncate : bool
            If True, only write the first page of a contiguous series if
            possible (uncompressed, contiguous, not tiled).
            Other TIFF readers will only be able to read part of the data.
            Cannot be used with the OME or ImageJ formats.
        align : int
            Byte boundary on which to align the image data in the file.
            Default 16. Use mmap.ALLOCATIONGRANULARITY for memory-mapped data.
            Following contiguous writes are not aligned.
        rowsperstrip : int
            The number of rows per strip. By default, strips are ~64 KB if
            compression is enabled, else rowsperstrip is set to the image
            length.
        bitspersample : int
            Number of bits per sample. By default, this is the number of
            bits of the data dtype. Different values for different samples
            are not supported. Unsigned integer data are packed into bytes
            as tightly as possible. Valid values are 1-8 for uint8, 9-16 for
            uint16 and 17-32 for uint32. Cannot be used with compression,
            contiguous series, or empty files.
        compression : str, (str, int), (str, int, dict)
            If None (default), data are written uncompressed.
            If a str, one of TIFF.COMPRESSION, e.g. 'JPEG' or 'ZSTD'.
            If a tuple, the first item is one of TIFF.COMPRESSION, the
            second item is the compression level, and the third item is a dict
            of arguments passed to the compression codec.
            Compression cannot be used to write contiguous series.
            Compressors may require certain data shapes, types or value ranges.
            For example, JPEG requires grayscale or RGB(A), uint8 or 12-bit
            uint16. JPEG compression is experimental. JPEG markers and TIFF
            tags may not match.
            Only a limited set of compression shemes are implemented.
        predictor : bool or TIFF.PREDICTOR
            If True, apply horizontal differencing or floating-point predictor
            before compression. Predictors are disabled for 64-bit integers.
        subsampling : {(1, 1), (2, 1), (2, 2), (4, 1)}
            The horizontal and vertical subsampling factors used for the
            chrominance components of images. The default is (2, 2).
            Currently applies to JPEG compression of RGB images only.
            Images are stored in YCbCr color space.
            Segment widths must be a multiple of 8 times the horizontal factor.
            Segment lengths and rowsperstrip must be a multiple of 8 times the
            vertical factor.
        jpegtables : bytes
            JPEG quantization and/or Huffman tables. Use for copying
            pre-compressed JPEG segments.
        colormap : numpy.ndarray
            RGB color values for the corresponding data value.
            Must be of shape (3, 2**(data.itemsize*8)) and dtype uint16.
        description : str or encoded bytes
            The subject of the image. Must be 7-bit ASCII. Cannot be used with
            the ImageJ or OME formats. Written with the first page of a series
            only.
        datetime : datetime, str, or bool
            Date and time of image creation in '%Y:%m:%d %H:%M:%S' format or
            datetime object. Else if True, the current date and time is used.
            Written with the first page of a series only.
        resolution : (float, float[, str]) or ((int, int), (int, int)[, str])
            X and Y resolutions in pixels per resolution unit as float or
            rational numbers. A third, optional parameter specifies the
            resolution unit, which must be None (default for ImageJ),
            'INCH' (default), or 'CENTIMETER'.
        subfiletype : int
            Bitfield to indicate the kind of data. Set bit 0 if the image
            is a reduced-resolution version of another image. Set bit 1 if
            the image is part of a multi-page image. Set bit 2 if the image
            is transparency mask for another image (photometric must be
            MASK, SamplesPerPixel and BitsPerSample must be 1).
        software : str or bool
            Name of the software used to create the file.
            If None (default), 'tifffile.py'. Must be 7-bit ASCII.
            Written with the first page of a series only.
        subifds : int
            Number of child IFDs. If greater than 0, the following 'subifds'
            number of series are written as child IFDs of the current
            series. The number of IFDs written for each SubIFD level must match
            the number of IFDs written for the current series. All pages
            written to a certain SubIFD level of the current series must have
            the same hash. SubIFDs cannot be used with truncated or ImageJ
            files. SubIFDs in OME-TIFF files must be sub-resolutions of the
            main IFDs.
        metadata : dict
            Additional metadata describing the image data, written along with
            shape information in JSON, OME-XML, or ImageJ formats in
            ImageDescription or IJMetadata tags.
            If None, do not write an ImageDescription tag with shape in JSON
            format.
            If ImageJ format, values for keys 'Info', 'Labels', 'Ranges',
            'LUTs', 'Plot', 'ROI', and 'Overlays' are written in IJMetadata and
            IJMetadataByteCounts tags. Refer to the imagej_metadata_tag
            function for valid values.
            Refer to the OmeXml class for supported keys when writing OME-TIFF.
            Strings must be 7-bit ASCII.
            Written with the first page of a series only.
        extratags : sequence of tuples
            Additional tags as [(code, dtype, count, value, writeonce)].

            code : int
                The TIFF tag Id.
            dtype : int or str
                Data type of items in 'value'. One of TIFF.DATATYPES.
            count : int
                Number of data values. Not used for string or bytes values.
            value : sequence
                'Count' values compatible with 'dtype'.
                Bytes must contain count values of dtype packed as binary data.
            writeonce : bool
                If True, the tag is written to the first page of a series only.

        returnoffset : bool
            If True and the image data in the file are memory-mappable, return
            the offset and number of bytes of the image data in the file.

        Returns
        -------
        offset, bytecount : tuple or None
            If 'returnoffset' is true and the image data in the file are
            memory-mappable, return the offset and number of bytes of the
            image data in the file.

        N__iter____next__z1generators require 'shape' and 'dtype' parametersrs   r   z ignoring 'dtype' argumentz ignoring 'shape' argumentzs<tifffile.TiffWriter.write> the 'compress' parameter is deprecated since 2020.9.30. Use the 'compression' parameterrP   )rQ   r6   r   	   zinvalid compression level rS   r   rU   FT)Nr6   rU   NONEnonez8the ImageJ format does not support non-contiguous seriesz,SubIFDs cannot be used with truncated seriesz$SubIFDs in SubIFDs are not supportedz7contiguous cannot be used with compression, tiles, etc.z.ome.tifz<truncate cannot be used with compression, packints, or tiles)r6   r6   z. writing zero size array to nonconformant TIFFsc             s   s   | ]}t tj|V  qd S )N)r"   r   EXTRASAMPLE)rF   esrE   rE   rH   rI     s    z#TiffWriter.write.<locals>.<genexpr>r   ZLIB)   i  i  i  i  i  iL  iu  iv  iQ  iR  iu   frC   zcannot apply predictor to z$ not writing description to OME-TIFFz$OME-TIFF does not support ImageDepthz' not writing description to ImageJ fileZBHhfz-the ImageJ format does not support data type z-the ImageJ format does not support ImageDepthBaxes)rC   r   z for RGBz0the ImageJ format does not support planar imagesBHz#invalid data dtype for palette moder   )rs   zinvalid color map shapec             s   s   | ]}t |V  qd S )N)int)rF   irE   rE   rH   rI     s       c             s   s   | ]}|d k V  qdS )rU   NrE   )rF   r   rE   rE   rH   rI     s    zinvalid tile shape)rU   rE   )zcontiguous sampleszparameter is)zseparate component planesz!and 'planarconfig' parameters arez,<tifffile.TiffWriter.write> data with shape z and dtype 'z' are stored as RGB with zk. Future versions will store such data as MINISBLACK in separate pages by default unless the 'photometric' z specified.znot a z image)r   rU   )r   zinvalid CFA image)r6   rU   r   zinvalid SubfileType MASKzbitspersample z must be 1 for bilevelr   uint16   z& must be 12 for JPEG compressed uint16uz does not match dtype )rU   rP   r   z out of range of dtype z  cannot be used with compression)      zlength of storedshape z not in (5, 6)r   z#invalid data shape for palette modez#not a RGB image (samplesperpixel=2)iE  iD  i  i  c                s$   | d dkr |  } t j| f| S )Nr6   z<>)r   r   )fmtval)rk   rE   rH   r     s    zTiffWriter.write.<locals>.packc                sT  t | tstj|  } y|}tj| d }W nv tk
r } zXy*|}|d dkrZ|dd  }tj| }W n( ttfk
r   td| |Y nX W d d }~X Y nX ~|}|dkrt |t	ry|
d}W n, tk
r } ztd|W d d }~X Y nX nt |tstdt|dks*|d d	kr2|d	7 }t|}| d
krtdd
d|d d_|d}|dk rt|}ntd |d }t||}n|}|f}n<t |trt|}	t||	 rtdt||	 }|}|dkr|d9 }|d }d| | |g}
d }t|| krt |tr@|
| n`|dkr~t |tttjfrf|d }|
|| n"|
| | f|  n|
 d t |tr|}ntt |tjr|j|krtd|jj|krtd| }n2t |ttfr.| | f| }n
||}| d|
||f d S )Nr   r6   z<>rU   zunknown dtype rP   asciiz TIFF strings must be 7-bit ASCII    i  s     zinvalid packed binary data)r   
   HHzvalue.size != countzvalue.dtype.char != dtype    ) r\   r   r   TAGSDATA_FORMATSKeyErrorDATA_DTYPESrW   r_   r]   encodeUnicodeEncodeErrorbytesrc   r   r   findmaxminr   calcsizeri   tuplelistrr   ndarrayr<   r   rs   r   tobytesjoin)coders   countr   	writeoncedatatype
dataformatr   Zrawcountrt   ZifdentryZifdvalue)r   
offsetsizer   r   tagsvalueformatrE   rH   addtag  s    

(








 

z TiffWriter.write.<locals>.addtagc             S   s   ddl m} y|| }W n& tk
r@   || d | d }Y nX y| \}}W n, tk
r~   |d}|j|j }}Y nX |dks|dkrdt	|| }t
|| }t
|| }||fS )Nr6   )FractionrU   l    l    )	fractionsr  
from_floatrW   as_integer_ratior   limit_denominator	numeratordenominatorr  round)argr  r   r  r  r   rE   rE   rH   rationalm  s    
z"TiffWriter.write.<locals>.rationali  )r   InfoLabelsRangesLUTsPlotROIOverlays
PropertiesinfolabelsrangesZlutsZplotZroiZoverlayspropzq<tifffile.TiffWriter.write> the 'ijmetadata' parameter is deprecated since 2020.5.5. Use the 'metadata' parameterz@                                                                )	truncatedz                r   ztifffile.pyi1     :zinvalid datetime stringz%Y:%m:%d %H:%M:%Si2  i  iG  i  )r   r6   i=     i  iB  iC  i  i     iJ        r   )r   r   r   ciS  i@  i  i  i  zwrong number of extrasamples z != iR  )r6   i[  )rP   rP   ))rU   rU   )rP   rU   )rP   rP   )r   rU   zinvalid subsampling factors ztile shape not a multiple of z'JPEG subsampling requires RGB(A) imagesi  outcolorspacesubsampling
colorspacei  c             s   s   | ]}|d  dkV  qdS )r6   i  NrE   )rF   etrE   rE   rH   rI   (	  s    i  )r6   rU      rU      rU   r6  rU   r7  rU   r6  rU   )N)rU   rU   z cannot apply subsampling )rU   rU   c             s   s   | ]}|d  dkV  qdS )r6   i  NrE   )rF   r5  rE   rE   rH   rI   7	  s    i  i  i(  c             S   sV   t | dkrddd| S | d }|r.|d }|dk r:dS |d	k rFdS |d
krRdS dS )NrU   IQ)r   r   r6   r   i   r   l        r   )rc   )
bytecountsrp   r<   	bytecountrE   rE   rH   bytecount_formatN	  s    z*TiffWriter.write.<locals>.bytecount_formati  i   z&cannot write non-contiguous empty filec             S   s   | d S )Nr6   rE   )xrE   rE   rH   <lambda>	  r   z"TiffWriter.write.<locals>.<lambda>)rG   c             S   s   t j| dd S )Nr   )axis)rr   packbitsr  )ry   r   rE   rE   rH   rq   	  s    z"TiffWriter.write.<locals>.compress)r   i  c             S   s   t j| dd } || f|S )Nr   )r?  )rr   r@  r  )ry   
compressorrg   rE   rE   rH   rq   	  s    zcannot compress bilevel imagei  r?  c             S   s   || f|S )NrE   )ry   rA  rg   rE   rE   rH   rq   	  s    c             S   s   || dd} || f|S )Nr   )r?  rE   )ry   	predictorrA  rg   rE   rE   rH   rq   	  s    c             S   s   || f|S )NrE   )ry   rA  rg   rE   rE   rH   rq   	  s    c             S   s   t | |ddS )Nr   )r?  )packints_encode)ry   bpsrE   rE   rH   rq   
  s    l    z%data too large for standard TIFF filer   r   c             s   s   | ]}|d  V  qdS )rU   NrE   )rF   trE   rE   rH   rI   '
  s    zdtype of iterable c             S   s   g | ]}|d  s|qS )r   rE   )rF   tagrE   rE   rH   
<listcomp>
  s    z$TiffWriter.write.<locals>.<listcomp>)F)N)r   r   rk   r  rr   rs   newbyteorderr   r`   iterrW   re   rX   rY   r   rz   isnativerZ   r\   r   integerr_   r+   rt   r   r   Zarray_equalr   _write_remaining_pagesr   r   r   addimager   r   _write_image_descriptionrT   ra   r   r   r   r   r   r   r   write_emptywrite_arrayr:   r   r  tagnoformatr   tagsizer   PHOTOMETRIC
MINISBLACK
MINISWHITERGBYCBCRPALETTEPLANARCONFIGCONTIGSEPARATEr"   	PREDICTORsequencer  rc   dictr]   upperCOMPRESSIONkind
PREDICTORSr   imagej_shaperV   anyr.   PHOTOMETRIC_SAMPLESCFAMASKr   reshaper   r   copyimagesr)   imagej_metadata_tagimagej_descriptionr   json_descriptionr   strftime_nowr<   r   r  alllog_warningRESUNIT
iter_tilesiter_imagesmathceilrangesortedCOMPRESSORSNotImplementedErrorrw   r   ioBytesIOr	  	enumerater   r;   valueoffsetSEEK_CURnextr   ru   pad_tileri   	getbufferflushr   r   r   sum)qr   ry   rz   rs   photometricplanarconfigextrasamplesZ
volumetrictile
contiguousro   r~   rowsperstripbitspersamplerp   rB  r3  
jpegtablescolormapdescriptiondatetime
resolutionsubfiletypesoftwaresubifdsmetadataZ	extratagsr   Z
ijmetadatarq   r   ZdataiterZ	datashapeZ	datadtypeZdatadtypecharZbilevelindexr{   Z
inputshapeZpackintsr;   rQ  rR  rT  rU  rV  rW  rX  rZ  r[  Zextrasamples_ZcompressionargsZcompressiontagZpredictortagZijrgbZijshapestoredshapendimsamplesperpixelZ	deprecatemsgZphotometricsamplesZsamples_s0ZtagbytecountsZ
tagoffsetsr  r  rE  sampleformatZmaxsamplingr2  unitr<  tilesZnumtilesdatabytecountsZbytecountformatr  ZrowsizeZ
numstrips1Z	numstripsZ	stripsizer   rA  fhpos	pageindexifdpossubifdsoffsetsifd	tagoffset	ifdoffsettagindexrF  r
  r   r   dataoffsetsoffsetZdatabytecountsoffsetifdsize
dataoffsetskipZpagedataZ	tileshapeZtilesizeisbytes	tileindexchunk
stripindexplanedepthstripr<   rE   )rk   r   r  r   r   r  r  rH   rw     s    s



































$












 



`










"






"
















 



























 





















zTiffWriter.writec             C   s4   | j dkrtd|   | j j|dd d| _ dS )zOverwrite the value of the last ImageDescription tag.

        Can be used to write OME-XML after writing the image data.
        Ends a contiguous series.

        Nzno ImageDescription tag foundF)erase)r   r_   rL  	overwrite)r   r  rE   rE   rH   overwrite_description
  s
    
z TiffWriter.overwrite_descriptionc          	   C   sR  | j r| js| jdkrdS | jd | jd  d }|dk rPd| _ d| _d| _dS | j}| }|d rx|d |d7 }t	j
}| jj}| jj}| jj}| jj}| j}	t| j}
d}t }|||t| j  | }|ddd | j D  | }|||d x4t| j D ]$\}}|||  | d	 }|d }|d }|r| }|d rr|d |d7 }|| y|||||  W nB tk
r   | jrt| d
t d| _dS tdY nX || || || jkr||f}n|dkr>||f}n(|| jkr,|df}n|dkr|df}qW | }|d rh|d |d7 }|dk r|||  dkr| jrt| d
t d| _dS tdtt|| }|}xt|D ]}|	|
7 }	|\}}|| |dk	rJ|||||  || |	}x:| jD ]}|||| ||7 }q&W n||||	 |dk	r|\}}| j !||dk	r|n|  | j"dk r|dk	r|\}}|dk	r|| |||||  ||7 }|| |||| n|| j | j# | j"|   |||| | j"dkr>| j$!||  n2|| j$| j#  |||| || | j$| j#< |  j#d7  _#|  j#t| j ;  _#||7 }||%  qW |||d  7 }|| |||d || ||%  | j"dk r<| }|| j& |||| |'  || || | _&d| _ d| _d| _dS )z(Write outstanding IFDs and tags to file.Nr6   rU   rP   r   r   c             s   s   | ]}|d  V  qdS )rU   NrE   )rF   rE  rE   rE   rH   rI   )  s    z4TiffWriter._write_remaining_pages.<locals>.<genexpr>r   z truncating ImageJ fileTz#data too large for non-BigTIFF fileiJ  r   l    )(r   r   r   r   r   r   r   r   rw   r   r   r   r   r  rQ  rR  r  r{  r|  rc   r	  r}  rT   rv   r   rX   rY   r   r_   r   r   rw  r   ri   r   r   r   r  r   r  )r   Zpagenor   r  r   r   r  rQ  rR  r  Zpagedatasizer  r  r  r  r  rF  r;   r
  r   r   r  r  ifdsr  r   r<   rE   rE   rH   rL  	  s    


























z!TiffWriter._write_remaining_pagesc             C   s   | j dks| jdkrd| _dS | jrx| jdk rd| jj| j| j | j d dkrNdndd | jf| j | jjdd	 }n\| j d dkrd| _dS | j
r| jdk	}| jd dk}t| j ||f| j}nt| j f| j}| jj|dd	 d| _dS )
z'Write metadata to ImageDescription tag.Nr6   rU   T)declarationr   )rC   r   F)r  )r   r   r   r   rM  r   r   r   tostringr   r   r   rl  rm  r  )r   r  ZcolormappedisrgbrE   rE   rH   rN    s,    

z#TiffWriter._write_image_descriptionc             C   s
   t j  S )zReturn current date and time.)r  now)r   rE   rE   rH   ro    s    zTiffWriter._nowc             C   s$   | j s|   |   | j  dS )z,Write remaining pages and close file handle.N)r   rL  rN  r   close)r   rE   rE   rH   r    s    zTiffWriter.closec             C   s   | S )NrE   )r   rE   rE   rH   	__enter__  s    zTiffWriter.__enter__c             C   s   |    d S )N)r  )r   exc_type	exc_value	tracebackrE   rE   rH   __exit__  s    zTiffWriter.__exit__c             C   s   dt | jjddS )Nz<tifffile.TiffWriter     r   )snipstrr   r:   )r   rE   rE   rH   __repr__  s    zTiffWriter.__repr__)FNFFN)r   r   r   r   r   propertyr   rw   r  rL  rN  ro  r  r  r  r  rE   rE   rE   rH   r   A  sr       
s             %"r   c               @   s  e Zd ZdZdddZedd Zedd	 Zed
d Ze	dd Z
dd ZdddZdddZe	dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d>d? Z#d@dA Z$dBdC Z%dDdE Z&dFdG Z'ddJdKZ(e	dLdM Z)edNdO Z*e	dPdQ Z+e	dRdS Z,edTdU Z-e	dVdW Z.edXdY Z/edZd[ Z0ed\d] Z1ed^d_ Z2e	d`da Z3e	dbdc Z4e	ddde Z5edfdg Z6edhdi Z7edjdk Z8edldm Z9e	dndo Z:edpdq Z;edrds Z<edtdu Z=e	dvdw Z>e	dxdy Z?e	dzd{ Z@e	d|d} ZAed~d ZBedd ZCdS )r   ao  Read image and metadata from TIFF file.

    TiffFile instances must be closed using the 'close' method, which is
    automatically called when using the 'with' context manager.

    TiffFile instances are not thread-safe.

    Attributes
    ----------
    pages : TiffPages
        Sequence of TIFF pages in file.
    series : list of TiffPageSeries
        Sequences of closely related TIFF pages. These are computed
        from OME, LSM, ImageJ, etc. metadata or based on similarity
        of page properties such as shape, dtype, and compression.
    is_flag : bool
        If True, file is of a certain format.
        Flags are: bigtiff, uniform, shaped, ome, imagej, stk, lsm, fluoview,
        nih, vista, micromanager, metaseries, mdgel, mediacy, tvips, fei,
        sem, scn, svs, scanimage, andor, epics, ndpi, pilatus, qpi.

    All attributes are read-only.

    NTc	          
   K   s\  |	rx2dD ]*}
|
|	kr
|	|
= t jd|
dtdd q
W d|	krHtdx^|	 D ]R\}
}|
dd	 d
kr|
d	d tjkr|dk	rt| |
t| qRtd|
 qRW |dkrt	d|t
|||||d}|| _t|| _|j| i| _i | _|dkr| n|| _y0|d |d}ydddd|dd  }W n$ tk
r\   td|Y nX t|d |dd d }|dkrt|d |d\}}|dks|dkrtd||f |dkrtj| _ntj| _n|dkr0|dkr tj| _n.|	dds|jdr&tj| _ntj| _n|dkrd|dkrLtdt| d  tj| _n`|d!ks|d"ks|d#krt| d$|d%d& |dkrtj| _ntj| _ntd'| t | | _!| j"r| j#j$d(ks| j!d j%d)ks| j!d) j%d)kr| &  n | j'rv| j(svy| j!)  W n@ t*k
rr } z t| d*|j+j, d+|  W dd}~X Y nX n| j-ry| .  W n@ t*k
r } z t| d,|j+j, d+|  W dd}~X Y nX nf| j/r&y| 0  W n@ t*k
r" } z t| d-|j+j, d+|  W dd}~X Y nX n|r4d.| j!_1W n  t*k
rV   |2   Y nX dS )/al  Initialize instance from file.

        Parameters
        ----------
        arg : path_like or open file
            Name of file or open file object.
            The file objects are closed in TiffFile.close().
        mode : str (optional)
            File open mode in case 'arg' is a file name. Must be 'rb' or 'r+b'.
            Default is 'rb'.
        name : str (optional)
            Optional name of file in case 'arg' is a file handle.
        offset : int (optional)
            Optional start position of embedded file. By default, this is
            the current file position.
        size : int (optional)
            Optional size of embedded file. By default, this is the number
            of bytes from the 'offset' to the end of the file.
        kwargs : bool (optional)
            'is_ome': If False, disable processing of OME-XML metadata.

        )r?   r@   rA   rB   z<tifffile.TiffFile> the z argument is ignoredrP   )rQ   rO   zwthe 'pages' parameter is no longer supported.

Use TiffFile.asarray(key=[...]) to read image data from specific pages.
NrC   rD   zunexpected keyword argument: )Nr   zr+bzinvalid mode )r   r:   r;   r<   r6   r   r   r   )s   IIs   MMs   EPznot a TIFF file r   r   r   r   zinvalid BigTIFF offset size r   is_ndpiFndpii1N  zinvalid NIFF filez NIFF format not supportedU   iRO  iRS  z RAW format 0xZ04Xz not supportedzinvalid TIFF version l        rU   z" _load_virtual_frames failed with z: z! _philips_load_pages failed with z _ndpi_load_pages failed with T)3rX   rY   rZ   rW   itemsr   
FILE_FLAGSr   r   r_   r   r   r=   r:   _files	_decoders_parentrT   readr   r   r   unpackr   r   r   r   rV   endswithNDPI_LEr   rq  	TiffPagesrO   is_lsmr   r<   rp   _lsm_load_pagesis_scanimager   _load_virtual_framesrv   r   r   
is_philips_philips_load_pagesr  _ndpi_load_pages	useframesr  )r   r  r   r:   r;   r<   r=   r>   r  rg   rG   r   r   headerrk   versionr  zeror   rE   rE   rH   r     s    "

"


















...zTiffFile.__init__c             C   s   | j jS )N)r   rk   )r   rE   rE   rH   rk     s    zTiffFile.byteorderc             C   s   | j S )zReturn file handle.)r   )r   rE   rE   rH   r     s    zTiffFile.filehandlec             C   s   | j jS )zReturn name of file handle.)r   r:   )r   rE   rE   rH   r     s    zTiffFile.filenamec             C   s*   yt | j S  tk
r$   dS X dS )z3Return status of file handle as stat_result object.N)ra   fstatr   filenorv   )r   rE   rE   rH   r    s    zTiffFile.fstatc             C   s"   x| j  D ]}|j  qW dS )zClose open file handle(s).N)r  valuesr   r  )r   rh   rE   rE   rH   r    s    zTiffFile.closec       
         s  | j stg S |dkr$|dkr$d}|dkr4| j  n@y| j| }W n ttfk
rZ   Y nX |dk	rn|j| }|j  |dkr~nl|dkr| j | nVt|t	tj
fr | g n:t|trĈ |  n&t|tr fdd|D  ntd std|dkr|r|jr| j|jj } d jr\t|tr\|dkr\||}| j|||j}	nF||}|dk	r~t|||j}| j|j | jj|t||d}	n0t d	krƈ d j||d
}	nt ||d
}	|	dkrdS |dkrj||}y
||	_W nf tk
rf   y(t| d|	j d|  d| |	_W n& tk
r`   d d j |	_Y nX Y nX nht d	kr|dkrd}|r d jn d j |	_n.|dkrd}d|rĈ d jn d j  |	_|	S )a'  Return image data from selected TIFF page(s) as numpy array.

        By default, the data from the first series is returned.

        Parameters
        ----------
        key : int, slice, or sequence of indices
            Defines which pages to return as array.
            If None (default), data from a series (default 0) is returned.
            If not None, data from the specified pages in the whole file
            (if 'series' is None) or a specified series are returned as a
            stacked array.
            Requesting an array from multiple pages that are not compatible
            wrt. shape, dtype, compression etc. is undefined, i.e. may crash
            or return incorrect values.
        series : int or TiffPageSeries
            Defines which series of pages to return as array.
        level : int
            Defines which pyramid level of a series to return as array.
        squeeze : bool
            If True, all length-1 dimensions (except X and Y) are squeezed
            out from the array.
            If False, single pages are returned as 5D array (TiffPage.shaped).
            For series, the shape of the returned array also includes singlet
            dimensions specified in some file formats. E.g. ImageJ series, and
            most commonly also OME series, are returned in TZCYXS order.
            If None (default), all but "shaped" series are squeezed.
        out : numpy.ndarray, str, or file-like object
            Buffer where image data are saved.
            If None (default), a new array is created.
            If numpy.ndarray, a writable array of compatible dtype and shape.
            If 'memmap', directly memory-map the image data in the TIFF file
            if possible; else create a memory-mapped array in a temporary file.
            If str or open file, the file name or file object used to
            create a memory-map to an array stored in a binary file on disk.
        maxworkers : int or None
            Maximum number of threads to concurrently get data from multiple
            pages or compressed segments.
            If None (default), up to half the CPU cores are used.
            If 1, multi-threading is disabled.
            Reading data from file is limited to a single thread.
            Using multiple threads can significantly speed up this function
            if the bottleneck is decoding compressed data, e.g. in case of
            large LZW compressed LSM files or JPEG compressed tiled slides.
            If the bottleneck is I/O or pure Python code, using multiple
            threads might be detrimental.

        Returns
        -------
        numpy.ndarray
            Image data from the specified pages.
            See TiffPage.asarray for operations that are applied (or not)
            to the raw data stored in the file.

        Nr6   c                s   g | ]} | qS rE   rE   )rF   k)rO   rE   rH   rG    s    z$TiffFile.asarray.<locals>.<listcomp>z&key must be an int, slice, or sequencezno pages selectedr   )outrU   )r  
maxworkersz asarray failed to reshape z to )r   T)!rO   rr   arrayr   r   rW   levels_getlistr\   r   rK  slicer7   r_   r;   rk   rs   r   r   r]   	get_shaper   memmap_arrayr!   rT   
read_arrayr+   rc   re   stack_pagesrz   rq  shaped)
r   rG   r   r   squeezer  r  typecoderz   r|   rE   )rO   rH   re     s    @














zTiffFile.asarrayc          	   K   s   | j std|dkr8|dkr8| jd jf d|i|S |dkrH| j }nJy| j| }W n ttfk
rn   Y nX |dkr|jf d|i|S |j }t|ttj	fr|| jf |S tddS )z=Return image data from selected TIFF page(s) as zarr storage.zempty zarr arrays not supportedNr6   r   zkey must be an integer index)
rO   rz  r   rd   r   rW   r\   r   rr   rK  )r   rG   r   r   rg   rO   rE   rE   rH   rd   P  s     zTiffFile.aszarrc             C   s   | j s
g S | j j}| j jj}g }xLdD ]D}t| d| dr&t| d|  }|sh|dkrh| jrh| j   q&P q&W || j _|| j _|s|  }xt|D ]\}}||_qW |S )zReturn related pages as TiffPageSeries.

        Side effect: after calling this function, TiffFile.pages might contain
        TiffPage and TiffFrame instances.

        )r  lsmrm   rl   ZfluoviewstkZsissvsscnqpir  bifZ	scanimageZmdgeluniformrD   FZ_series_rm   )	rO   r  keyframer  r   	is_imagej_clear_series_genericr}  )r   r  r  r   r:   r   r   rE   rE   rH   r   d  s(    


zTiffFile.seriesc             C   sj   | j d }|jp|j }| j j|d}t|f|j }d|j }|j}|jrRd}nd}t|||||dgS )z+Return all images in file as single series.r6   )validater8  ZNIHImageZUniform)ra  )	rO   r  is_nihr  rc   rz   r   rs   r   )r   r   r  rO   rz   r   rs   ra  rE   rE   rH   _series_uniform  s    

zTiffFile._series_uniformc                sn  | j }|d d|_|jr$|  g }g  i  fdd}x|D ]}|| |jdk	rDxt|jD ]z\}}|dk rxqfy | j| t	| |j
|f}W n> tk
r } z t| d|jj d|  W dd}~X Y qfX || qfW qDW xj D ]b}	|	 }|d }t|f|j }
d	|j }d
|kr6|
d7 }
|d
7 }|t||
|j|dd qW t|dk| _t| |S )zgReturn image series in file.

        A series is a sequence of TiffPages with the same hash.

        Fc                s`   | j s
d S | j}|krHxB| D ]}|j| jkr"P q"W | |  n | | g|< d S )N)rz   hashr;   ri   )r   rG   p)keys
seriesdictrE   rH   addpage  s    
z)TiffFile._series_generic.<locals>.addpageNr   z generic series failed with z: r6   r8  S)rU   Generic)ra  rU   )rO   r  r  cache_loadr  r}  r   rT   r   r  rv   rq  r   r   rc   rz   r   ri   r   rs   
is_uniformpyramidize_series)r   rO   r   r  r   r   r;   subifdr   rG   rz   r   rE   )r  r  rH   r    sF    


,


zTiffFile._series_genericc                s\   fdd d
 fdd	dj _j g }|dkr>dS t|dk_t|dd	 |S )z%Return image series in "shaped" file.c                s   |d }|s:|j }|j}t|dkr:t|f| }d| }t|}t|}	|jr|	|kr|	| dkr|d krpd}d| }|	| f| }yt|||}|}W n> tk
r }
 z t d|
jj	 d|
  W d d }
~
X Y nX | 
t|||j||d|dd	 d S )
Nr6   rU   r9  Tz shaped series failed with z: ZShapedF)r:   ra  r*  r  )rz   r   rc   r+   r   r-   r_   rq  r   r   ri   r   rs   )r   rO   r   rz   rh  r:   r*  r   r<   resizer   )r   rE   rH   ri     s<    ,z'TiffFile._series_shaped.<locals>.appendFc                s  t | }d  } } } }}d}	x|	|kr.P |r<| d }n|	| _| j}|js`td d S d }d }t|j}
|
dd}|
d }|jd krd nd}|
d|}d|
kr|
d }t |t |kr|}nd}td	 |g}t|}|dkr
t|t|j	\}}nd
}d}|r*td d S d
|  k rF||	 krn n||j
j9 }|rbd
}nn|jr|j| | |	d
  jk r|jd krd}n:d}x4t|	d
 |	| D ]}| | }||_|| qW  ||||||| |	|7 }	|jr$xt|jD ]\}}|dk rqg }xt|D ]\}}yJj|j|  |dkr^t|j|f}|}nt|j|f|d}W n@ tk
r } z td|jj d|  d S d }~X Y nX || q"W |r||d}|d krd S qW q$W |S )Nr6   z1 invalid shaped series metadata or corrupted filer:   r  rz   Fr*  r   z& shaped series axes do not match shaperU   z. shaped series shape does not match page shaper   )r  z shaped series failed with z: T)rc   r  	is_shapedrq  json_description_metadatarV   r  r+   divmodrz   _dtypert   is_finalr;   rw  ri   r}  r   rT   r   r  r   rv   r   r   )rO   r   Z	issubifdslenpagesr  r   rz   rh  r:   r  r  r*  Zspagesr<   npagesmodjr   r   r;   r  r  Z	keysubifdr   )ri   detect_seriesr   rE   rH   r    s    


 


z.TiffFile._series_shaped.<locals>.detect_seriesTNrU   )	isreduced)F)rO   r  rc   r  r  )r   r   rE   )ri   r  r   rH   _series_shaped  s    %fzTiffFile._series_shapedc          	      s
  j d_d_d j  fdd}y
| }W n& ttfk
rb   td dS X |rpgndd  dt} dd	} d
d	} dd	}|||f}d}|t	| }	|	d	krtd |	f| }d| }j
d d	krVj
d |kr0td| dj
d   |dd j }|jd	d 7 }nJj
d |kr|d	kr||d	fj }|j7 }n|j7 }|j7 }d|kr|d7 }|d7 }|otj d	kojd	 t	|j d k}
d_t|j|d|
dgS )z#Return image series in ImageJ file.Tr6   c                 s   j s
dS  dd} | dkr"dS j\}}|tjj d ksX|||   jjkr\tt	dkr|||   d j
krdS dS )NFrj  r6   rU   r   T)r  rV   r   r+   rz   r  r   r<   r_   rc   r;   )rj  r;   r  )metar   rO   r   rE   rH   
is_virtual  s    
"z+TiffFile._series_imagej.<locals>.is_virtualz1 ImageJ series metadata invalid or corrupted fileNrj  framesrU   sliceschannelsTZCz. ImageJ series contains unidentified dimensionr8  z" ImageJ series number of channels z! does not match separate samples r   r   )rU   r   ImageJ)ra  r*  )rO   r  r  imagej_metadatar_   r   rq  rV   rc   r+   r  rz   r   r   r  r  r   rs   )r   r  Z	isvirtualrj  r  r  r  rz   r   Zremainr*  rE   )r  r   rO   r   rH   _series_imagej|  sj    





zTiffFile._series_imagejc          
   C   sn  | j jdd}|d }|j}d}| jdi }d|kr6y|d }yt|}W n tk
rj   t|}Y nX d}yt|d }W n8 tk
r   d}t|| rt	d	t|| }Y nX |dkrt
t|||  d}|||f|j }d
|j }	W n@ tk
r4 }
 z t| d|
jj d|
  W dd}
~
X Y nX |dkrZt|f|j }d|j }	t||||	ddgS )z&Return image series in ScanImage file.F)r  r6   N	FrameDatazSI.hChannels.channelSavezSI.hStackManager.framesPerSlicerU   z"unable to determine framesPerSliceZZTCz ScanImage series failed withz: r8  Z	ScanImage)ra  )rO   r  rs   scanimage_metadatarV   rc   rW   r   rv   r_   r  rz   r   rq  r   r   r   )r   rO   r   rs   rz   	framedatar  r  r  r   r   rE   rE   rH   _series_scanimage  s>    
,	

zTiffFile._series_scanimagec             C   sp   | j jdd}| j}tt|d }ddd |D }tdd |D }d| _t|||d	 j	||d
 ddgS )z%Return image series in FluoView file.F)r  
Dimensionsr  c             s   s$   | ]}t j|d   dV  qdS )r6   r9  N)r   MM_DIMENSIONSrV   r_  )rF   r   rE   rE   rH   rI     s    z,TiffFile._series_fluoview.<locals>.<genexpr>c             s   s   | ]}t |d  V  qdS )rU   N)r   )rF   r   rE   rE   rH   rI     s    Tr6   	ImageNameZFluoView)r:   ra  )
rO   r  fluoview_metadatar  reversedr	  r  r  r   rs   )r   rO   mmZmmhdr   rz   rE   rE   rH   _series_fluoview  s    zTiffFile._series_fluoviewc                s   d| j _d| j _| j}|d dkrltd}|d   d  d   |d dkr^ fd	d
}qp fdd
}nd}| j d }d| _t|g|j||j	|ddgS )z#Return image series in MD Gel file.Fr6   ZFileTag)rP   r7  float32Z
ScalePixelrU   rP   c                s   |  dd   S )Nr(  rP   )r    )a)scalerE   rH   	transform6  s    z)TiffFile._series_mdgel.<locals>.transformc                s   |  d  S )Nr(  )r    )r)  )r*  rE   rH   r+  ;  s    NZMDGel)r+  ra  )
rO   r  r  mdgel_metadatarr   rs   r  r   rz   r   )r   mdrs   r+  r   rE   )r*  rH   _series_mdgel*  s(    

zTiffFile._series_mdgelc             C   s   |   }x|D ]}d|_|jd dkr:d|jdd  |_|jrf|jd jd}|dkr^dn||_q|jd jd	}|dk	r|d
krd|_q|dkrd|_qW |S )z+Return pyramidal image series in NDPI file.ZNDPIr6   r8  ZrU   Ni  Baselinei  g      Macrog       ZMap)r  ra  r   is_pyramidalrO   r  valueofr:   )r   r   r   r:   magrE   rE   rH   _series_ndpiM  s     

zTiffFile._series_ndpic             C   s   | j jdd}|d }t|}| j}d|krRd|krR|d |j }|d |j }n|f|j }d|j }d| _t|||j|dd	gS )
z(Return image series in Olympus SIS file.F)r  r6   rz   r   r8  TZSIS)ra  )	rO   r  rc   sis_metadatarz   r   r  r   rs   )r   rO   r   r  r-  rz   r   rE   rE   rH   _series_sis`  s    
zTiffFile._series_sisc       
   
   C   sH  g }| j }d|_d|_d|_|  g }d}d|d j }|d j}|d j}x6|t|k r|| }|j|krpP |	| |d7 }qPW t|f| }	|	t
||	||ddd |t|k r|| }|	t
|g|j|j|jd	dd |d7 }|d jrx|t|k r|d d
 |d d
 f|d
d  }g }x<|t|k rl|| }|j|krVP |	| |d7 }q2W t|t|d j krP t|f| }	|d j	t
||	||ddd qW |d jr>|t|k r>|| }|	t
|g|j|j|jddd |d7 }|t|k r>|| }|	t
|g|j|j|jddd d| _|S )z,Return image series in PerkinElmer QPI file.TFr6   r   rU   r0  ZQPI)r:   ra  	ThumbnailrP   N
Resolutionr1  Label)rO   r  r  r  r  r   rs   rz   rc   ri   r   is_tiledr  r2  r  )
r   r   rO   r  r  r   rs   Zpshaper   rz   rE   rE   rH   _series_qpio  s    




$



zTiffFile._series_qpic             C   sr  | j d jsdS g }d| _d| j _d| j _d| j _| j   d}| j | }|t|g|j	|j
|jddd |d7 }|t| j kr|S | j | }|t|g|j	|j
|jd	dd |d7 }x\|t| j k r| j | }|jr|jrP |d jt|g|j	|j
|jd
dd |d7 }qW xTdD ]L}|t| j kr4P | j | }|t|g|j	|j
|j|dd |d7 }qW |S )z'Return image series in Aperio SVS file.r6   NFTr0  SVS)r:   ra  rU   r8  r9  )r:  r1  )rO   r;  r  r  r  r  r  ri   r   rz   rs   r   rc   
is_reducedr  )r   r   r  r   r:   rE   rE   rH   _series_svs  st    










zTiffFile._series_svsc             C   s  ddl m} | jd j}||}g }d| _d| j_d| j_d| j_| j	  xp|D ]f}|j
dsjqVxP|D ]F}|j
dsqr|jdd}x"|D ]}|j
d	sqi }	x|D ]}
|
j
d
sqt|jdddkrtdt|
jd }t|
jd }t|
jdd}t|
jdd}t|
jdd}t|
jd }||	kr|	| }||d krt||d< ||d kr||d< ||d ||f< q||g||||f|id|	|< qW |	sqg }xt|	 D ]\}}|d d |d d f}d}dgt| }x<t|d  D ](\\}}}| j| |||d  | < qW ||d j7 }||d j7 }|d j}|t||||| |dd qW |d j|dd  ||d  qW qrW qVW |S )z0Return pyramidal image series in Leica SCN file.r6   )ElementTreeFT
collectionimager:   Unknownpixels	dimensionZsizeZrU   z@SCN series: Z-Stacks not supported. Please submit a sample file.ZsizeXZsizeYr1  zrr  r  sizezr  )r<   r  rH  r  ZCZNZSCN)parentr:   ra  )	xml.etreer@  rO   r  
fromstringr  r  r  r  r  rF  r  attribrV   r   rz  rx  r  r+   r   rz   rs   ri   r   r  extend)r   etreeZscnxmlrootr   rA  rB  r:   rD  resolutionsrE  ZsizexZsizeyr1  rF  rG  r  r   r  rz   r   r  rs   rE   rE   rH   _series_scn  s    


 
zTiffFile._series_scnc             C   sR  g }d}d| _ d| j_d| j_d| j_| j  x| jD ] }|jdd dkrv|t|g|j	|j
|jddd q:|jd	ks|jdd
 dkr|t|g|j	|j
|jd	dd q:d|jkr|t|g|j	|j
|jddd q:|dkrt|g|j	|j
|jddd}|d| q:|jt|g|j	|j
|jddd q:W t| d |S )z.Return image series in Ventana/Roche BIF file.NFTr6   r   r:  ZBIF)r:   ra  r8     ZProbabilityr   rC  r0  r9  r=  z! BIF series tiles are not stiched)r  rO   r  r  r  r  r  ri   r   rz   rs   r   insertr  rq  )r   r   Zbaseliner   rE   rE   rH   _series_bifp  sn    



zTiffFile._series_bifc       0         s  ddl m} | jd j}y||}W nt |jk
r } zTt| d|jj d|  y|j	dd
 }||}W n tk
r   dS X W dd}~X Y nX d| j_d| j_d| j_| jjdd	 |jd
d}|| i| _| jj}g }i }g }	xt|D ]j}
|
jdrt| d P |
jdr<x|
D ]}|jdddsPq0i  ||jd < }x|D ]}x|D ]}x|D ]}|jdd dsq||jd }|jdd}tj| }d|jkr
t|jdd}t|jd }t|jd | }t|||}ndd |D }||f||< q|W qrW qhW q0W |
jdsLqx,|
D ] }|jdrR|jd }P qRW d}|
j  dd}x|
D ]}|jdsq|j dt d  } fd!d|D g }dd}xx|D ]n}|jd"rd|j |rBd#}t d$dkr`fd%dt|D nt d$dkrt d&q|jd'svq|j t d(d}t d)d( krdnd}t d*|} fd+d|dd, D }ytt!|dd, }W n( t k
r   t| d- wY nX x:|D ]} | jd
s:q"|dkrh| j"dk	rh| j"}| jd | j|< n| j"| jkr<| j#sg S | jd. }!y@t$t%j&||!| d/}"d|"j_d|"j_d|"j_|"jjdd	 W nZ t't(t fk
r&   t| d0|! |r |n|#}#|)dg|#| t*|   P Y nX |"| j| j"< |"+  | j| j" j}$yZ|rV|nt*|$}#|)dg|#| t*|   x&t,|#D ]}%|$||%  |||% < qW W n$ t-k
r   t| d1 Y nX P q"W | j}$yZ|r|nt*|$}#|)dg|#| t*|   x&t,|#D ]}%|$||%  |||% < qW W n$ t-k
rV   t| d1 Y nX qW |rt.d2d3 |D r|qd}&x&|D ]}|r||jkr|}&P qW |&dkr"xnt|D ]b\}%}&|&r|&j/j0j1}'|'r|&j/j02  |&j3|&j/j_|&j/j|&j3 }&|&||%< |'r|&j/j0+  P qW d#}(x(|D ] }|r,|j/|&j/kr,d}(P q,W dkr|&j4dkrzg7 |d47 }n:dd, g d,d  |dd, d4 |d,d  }d4krЈdg7 |d47 }t5t6|&j7 d}#|#t*|krt| d5|# d6t*|  |d|# }t8|d })|&j9t:|)t*|&j9 d krvt| d7|&j9t:|)t*|&j9 d  ~q|&j/j0j;|&i}*xt|D ]\}%}+|+dkrq|+j/j0},|,j;|*k	r|+j|+k	r|,j1}'|'r|,2  |+j3|+j/j_|+j/j|+j3 }+|+||%< |'	r|,+  |+|*|,j;< |+j|+kr|*|,j; |+_qW |<| |	<t=||&j>|| ||(d8d9 ~qW qW xt?|	|D ]\}-}||k	r	qrt@|-Ad#|-Bd#}x|| C D ]p\}\}}|3|}%t*|}#|% |#k	r|D||d}n2|%  |#  < E|%d |# |D||| d}	qW |-F| 	qrW x|	D ]~}-|-j}&|&jGdk
rX
q<t*| jdk
rxt| d: P x>t,t*|&jGD ]*}.d}&g }x|-jD ]}+|+dk
r|<d 
q|+j/j0H|+jG|.  |+j|+k
rtI| |+j3|.f }}&n$|&dkrtJd;ntK| |+j3|&d	}|<| 
qW g xXt|-jLD ]J\}%}/|/d<krV<|&jM n(|/d=krn<|&jN n<|-j9|%  q6W |-jO<t=|t:|&j>|-jL| d>|.d  d8d? 
qW 
q<W t*|	dkot*|	d jOdk| _P|	S )@z(Return image series in OME-TIFF file(s).r6   )r@  z OME series failed with z: ignore)errorsNT)r  UUIDZ
BinaryOnlyz7 OME series is BinaryOnly, not an OME-TIFF master file ZStructuredAnnotations	Namespacer  moduloIDr   ZAlongTypeotherZStartZSteprU   ZEndc             S   s   g | ]}|j d r|jqS )r:  )rF  r  text)rF   labelrE   rE   rH   rG    s   z(TiffFile._series_ome.<locals>.<listcomp>ImageZAnnotationRefNamePixelsDimensionOrderc                s   g | ]}t  d |  qS )Size)r   )rF   ax)attrrE   rH   rG    s    ChannelFSamplesPerPixelc                s,   g | ]$\}}|d kr  |  n | qS )r   rE   )rF   r   rd  )rz   spprE   rH   rG    s   z2OME series cannot handle differing SamplesPerPixelZTiffDataIFDZ	NumPlanesZ
PlaneCountc                s    g | ]}t  d | dqS )ZFirstr6   )r   rV   )rF   rd  )re  rE   rH   rG  .  s    r   z+ OME series contains invalid TiffData indexZFileName)r  z OME series failed to read z' OME series contains index out of rangec             s   s   | ]}|d kV  qd S )NrE   )rF   r   rE   rE   rH   rI   t  s    z'TiffFile._series_ome.<locals>.<genexpr>r   z OME series expected z frames, got z: OME series cannot handle discontiguous storage (%s != %s)OME)rI  r:   rA   ra  z+ OME series cannot read multi-file pyramidszno keyframeXYzlevel )rI  r:   ra  )QrJ  r@  rO   r  rK  
ParseErrorrq  r   r   decoder   rv   r  r  r  r  rL  rV   r  r   dirnamerF  r  r   AXES_LABELSfloatrr   aranger	  r%  r   r}  r_   ravel_multi_indexr]  r=   r   ra   pathr   r   rM  rc   r  rw  
IndexErrorrp  rI  r   closedopenr  r  r  r+   r<   r/   rz   r  r:   ri   r   rs   zipr  r  get_axesr  replacerS  set_shape_axesr  rT   r   r   r   r   
imagewidthimagelengthr  r  )0r   rN  omexmlrO  r   Z	root_uuidro  Z	modulorefrY  r   elementannotr  r   ZmodulZalongr?  Znewaxisstepstartstopr'  annotationrefr:   rD  r   r  firstry   r  numidxuuidfnamerh   r<   rO   r   r  isclosedrA   ZsqueezedZ	keyframesr   r   Zserier   rd  rE   )re  rz   rh  rH   _series_ome  s   





$













 












"zTiffFile._series_omec          	   C   s   | j d }| j}|d }|dd}|dkrBd|j }d|j }npt|d dkrl|f|j }d	|j }nFtt|d
 dkr|f|j }d|j }n|f|j }d|j }d| _t	|g||j
|||dkdd}|gS )zReturn series in STK file.r6   NumberPlanesr`  r  rU   )rU   r8  	ZDistancer/  TimeCreatedTTZSTK)r:   r*  ra  )rO   stk_metadatarV   rz   r   rr   rp  diffr  r   rs   )r   r   r  planesr:   rz   r   r   rE   rE   rH   _series_stk"  s2    


zTiffFile._series_stkc       
   
      s  | j  tj d  }| jd jdkr8|dddd} dddkrP|d	7 } d
ddkrh|d7 }|ddd }t fdd|D } dd}| jjt	ddddd}|d j
}t|||||ddg}| jd }|jr| jjt	ddddd}|j
}d}d}	x:|t|k rB|	t|d k rB|||	 9 }|	d7 }	q
W |d|	 |j }|d|	 d }|t|||||dd d| _|S )z-Return main and thumbnail series in LSM file.ScanTyper6   rP   r   r  XYZXYC
DimensionPP
DimensionMMNr   c             3   s    | ]}t  tj|  V  qd S )N)r   r   CZ_LSMINFO_DIMENSIONS)rF   r   )lsmirE   rH   rI   L  s    z'TiffFile._series_lsm.<locals>.<genexpr>r`  F)r  ZLSM)r:   ra  rU   SYXZ
LSMreduced)lsm_metadatar   CZ_LSMINFO_SCANTYPErO   r  rz  rV   r  r  r  rs   r   r>  rc   rz   ri   r  )
r   r   rz   r:   rO   rs   r   r   cpr   rE   )r  rH   _series_lsmA  s<    

"zTiffFile._series_lsmc             C   s   | j }d|_d|_d|_d|_|jdd |   |   |d }x|ddd D ]
}||_qRW |d }x|ddd D ]
}||_qxW dS )z%Load and fix all pages from LSM file.TrU   r6   N)r  rP   )rO   r  r  r  r  _lsm_fix_strip_offsets_lsm_fix_strip_bytecounts)r   rO   r  r   rE   rE   rH   r  i  s    
zTiffFile._lsm_load_pagesc             C   s  | j jdk rdS | j}t|}| jd }|j}d}x(dD ] }|j| dkr8||j| 9 }q8W |dkrd}x$dD ]}|| dkrn|j| }P qnW |rt|d	| | \}}	|	dkrtd
|||d	f}
t	
t|
|
}t	|dd}nt	
|dd	}|d jd |d jd kr*|ddddf }d}d}x`|jD ]V}|t| }g }x4|jD ]*}||k rl|d7 }|||  |}qVW t||_q:W dS )zUnwrap strip offsets for LSM files greater than 4 GB.

        Each series and position require separate unwrapping (undocumented).

        l        Nr6   rU   )r6   rU   ZPM)rU   rP   r  rP   zmod != 0r   .)r   r<   rO   rc   r   r   rz   r
  r   rr   rr  r+   rh  Zmoveaxisdataoffsetsflatr   ri   r  )r   rO   r  r   r   Z	positionsr   Zntimesdivr  rz   indiceswrapZpreviousoffsetr   r  ZcurrentoffsetrE   rE   rH   r    sJ    





zTiffFile._lsm_fix_strip_offsetsc       	      C   s   | j }|d jdkrdS t|dd d}t|d }xt|D ]\}}|jd rRq>|j}|j}||k rz||d  jd }nt|d d|d   | j	j
}t|}x0tt|d D ]}||d  ||  ||< qW ||d  |d< t||_q>W dS )	zSet databytecounts to size of compressed data.

        The StripByteCounts tag in LSM files contains the number of bytes
        for the uncompressed data.

        r6   rU   Nc             S   s
   | j d S )Nr6   )r  )r  rE   rE   rH   r>    r   z4TiffFile._lsm_fix_strip_bytecounts.<locals>.<lambda>)rG   rP   r   )rO   rp   rx  rc   r}  r  r  r  r  r   r<   r  rw  r  )	r   rO   r  r   r   offsetsr:  Z
lastoffsetr  rE   rE   rH   r    s&    
z"TiffFile._lsm_fix_strip_bytecountsc             C   s   | j }|d jd}|dks&|dk r*dS d|_d|_|  x|D ]}|jd}|dksd|dkrDtjj|_	d|_
d|_d	|_td
 |_|_|jd dkrD|jdd |_|jdd |_|jdd d |_qDW dS )a  Load and fix pages from NDPI slide file if CaptureMode > 6.

        If the value of the CaptureMode tag is greater than 6, change the
        attributes of the TiffPages that are part of the pyramid to match
        16-bit grayscale data. TiffTags are not corrected.

        r6   i  Nr   TFi  rU   r   r   r   )rU   )rO   r  r3  r  r  r  r   rS  rT  r  r  r  r  rr   rs   r  r  r   rz   )r   rO   Zcapturemoder   r4  rE   rE   rH   r    s&    

zTiffFile._ndpi_load_pagesc          	   C   s  ddl m} | j}d|_d|_|  t|}||d j}|d j	}|d j
}d}x| D ]}|jdks`|jddd	krq`d
d |jdd D \}	}
|dkr||
9 }||	9 }g }q`|tt||
 tt||	 f q`W d}x|D ]\}}x,||k r,|| jdkr,|d7 }qqW ||kr:P || }||_	||_
|jd dkrr|||jd f|_n.|jd dkr|jd ||f|_n
||f|_|jdd ||f |jdd  |_|d7 }qW dS )zLoad and fix all pages from Philips slide file.

        The imagewidth and imagelength values of all tiled pages are corrected
        using the DICOM_PIXEL_SPACING attributes of the XML formatted
        description of the first page.

        r6   )r@  TFN	Attributer`  r  ZDICOM_PIXEL_SPACINGc             s   s   | ]}t |V  qd S )N)rq  )rF   vrE   rE   rH   rI     s    z/TiffFile._philips_load_pages.<locals>.<genexpr>"rU   r   rP   )rJ  r@  rO   r  r  r  rc   rK  r  r|  r}  rI  rF  rL  rV   r]  rz  splitri   r   ru  rv  	tilewidthr  rz   )r   rN  rO   r  rO  r|  r}  sizeselemwhr   r   rE   rE   rH   r    sN    


 


&zTiffFile._philips_load_pagesc             C   sZ   |dd t jkr@| jsdS tt| jd |}t| || |S t| jjd|dS )z,Return 'is_flag' attributes from first page.rC   NFr6   z object has no attribute )	r   r  rO   r   r   r   r   r   r   )r   r:   r   rE   rE   rH   __getattr__1  s    zTiffFile.__getattr__c             C   s   | S )NrE   )r   rE   rE   rH   r  =  s    zTiffFile.__enter__c             C   s   |    d S )N)r  )r   r  r  r  rE   rE   rH   r  @  s    zTiffFile.__exit__c             C   s   dt | jjddS )Nz<tifffile.TiffFile r  r   )r  r   r:   )r   rE   rE   rH   r  C  s    zTiffFile.__repr__r6   O   c                sr  dt | jjt| jrdnddd| j g}| jr<|d |ddd	 | jD  t	| j
d
kr||t	| j
 d t	| jd
kr|t	| j d t	| jd
kr|t	| j d d|}|dddd}|t| jjtdd t	| } dkr|S |g}|ddd	 | jD   dkrx| j
D ]R}|dkr\qJ|tj| d x&|j
D ]}|tj| d qzW qJW nV| jr| fdd	| jD  n0| j
r| j
d r|tj| j
d  d  dkr`x\t| jD ]N}t| |d rt| |d }|r|d| t| d d qW d|ddS ) a  Return string containing information about TiffFile.

        The detail parameter specifies the level of detail returned:

        0: file only.
        1: all series, first page of series and its tags.
        2: large tag values and file metadata.
        3: all pages.

        zTiffFile '{}'r  zlittle-endianz
big-endian)r   r   ZBigTiff c             s   s   | ]}|  V  qd S )N)lower)rF   r   rE   rE   rH   rI   Z  s    z#TiffFile.__str__.<locals>.<genexpr>rU   z Pagesz Seriesz Filesz  z    z   r   rP   r6   
c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   i  s    rC   N)detailwidthc             3   s,   | ]$}|j jjjstj|j  d V  qdS ))r  r  N)r  rI  r   rv  r   __str__)rF   r   )r  r  rE   rH   rI   u  s   r   z{}_METADATA
{}   )r  heightz

z


)r$   r   r<   byteorder_isnativerk   r   ri   r	  flagsrc   rO   r   r  rz  formatr  r:   r  r   r  rM  rx  r`   r   r_  r*   )r   r  r  r&  r  r   r:   mrE   )r  r  rH   r  F  s\    


"


 
zTiffFile.__str__c                s    fddt tjD S )z<Return set of file flags, a potentially expensive operation.c                s"   h | ]}t  d | r| qS )rD   )r   r  )rF   r:   )r   rE   rH   	<setcomp>  s   z!TiffFile.flags.<locals>.<setcomp>)rx  r   r  )r   rE   )r   rH   r    s    
zTiffFile.flagsc             C   s   | j jdkS )z"Return if file has BigTIFF format.r   )r   r  )r   rE   rE   rH   r     s    zTiffFile.is_bigtiffc             C   sF   y,| j d jp| j jdddj}|r*d| _|S  tk
r@   dS X dS )z!Return if file has MD Gel format.r6   rU   T)r  FN)rO   is_mdgelrV   r  ru  )r   ZismdgelrE   rE   rH   r    s    zTiffFile.is_mdgelc             C   s   | j }|d }|jrdS |js$|jr(dS zTy:|j}d|_|j}x"dD ]}||  j|krDdS qDW W n tk
rx   dS X W d||_X dS )z2Return if file contains a uniform series of pages.r6   FT)rU   r   r   N)rO   r  r  r  r  r  aspageru  )r   rO   r   r  r  r   rE   rE   rH   r    s"    

zTiffFile.is_uniformc             C   s&   | j p"| jp"| jp"| jp"| jp"| j S )z;Return if pages can be appended to file without corrupting.)is_omer  is_stkr  is_fluoviewis_micromanager)r   rE   rE   rH   r     s    zTiffFile.is_appendablec             C   s   | j s
dS tdd | jD S )z9Return tifffile metadata from JSON descriptions as dicts.Nc             s   s,   | ]$}|j  d krt|jd jV  qdS )r  r6   N)ra  r  r	  rO   r  )rF   r   rE   rE   rH   rI     s   z+TiffFile.shaped_metadata.<locals>.<genexpr>)r  r  r   )r   rE   rE   rH   shaped_metadata  s
    zTiffFile.shaped_metadatac             C   s   | j s
dS | jd jS )zReturn OME XML.Nr6   )r  rO   r  )r   rE   rE   rH   ome_metadata  s    zTiffFile.ome_metadatac             C   s   | j s
dS | jd jS )zReturn Leica SCN XML.Nr6   )is_scnrO   r  )r   rE   rE   rH   scn_metadata  s    zTiffFile.scn_metadatac             C   s   | j s
dS | jd jS )zReturn Philips DP XML.Nr6   )r  rO   r  )r   rE   rE   rH   philips_metadata  s    zTiffFile.philips_metadatac             C   s   | j s
dS | jd jdS )z0Return LSM metadata from CZ_LSMINFO tag as dict.Nr6   il  )r  rO   r  r3  )r   rE   rE   rH   r    s    zTiffFile.lsm_metadatac          
   C   s~  | j s
dS | jd }|j}i }|jr4|jd|d< |d}|dkrJdn|j|d< |d}|dk	rp|| |d	}|dk	r|| |d
}|dk	r|| |d}|dk	rz|d |d< |d |d< |d |d< yXt	j
dd t|d |d D dd|d< t	j
dd t|d |d D dd|d< W n@ tk
rx } z t| d|jj d|  W dd}~X Y nX |S )z*Return STK metadata from UIC tags as dict.Nr6    ZPlaneDescriptionsi]  rU   r  i\  i^  i_  r  r  TimeModifiedc             S   s   g | ]}t | qS rE   )julian_datetime)rF   dtrE   rE   rH   rG    s   z)TiffFile.stk_metadata.<locals>.<listcomp>DateCreatedzdatetime64[ns])rs   ZDatetimeCreatedc             S   s   g | ]}t | qS rE   )r  )rF   r  rE   rE   rH   rG    s   DateModifiedZDatetimeModifiedz STK metadata failed with z: )r  rO   r  r  r  rV   r  r3  r   rr   r  rx  r_   rq  r   r   )r   r   r  r|   rF  r   Zuic2tagr   rE   rE   rH   r    sL    









,zTiffFile.stk_metadatac             C   sZ   | j s
dS | jd }t|j }|jd}|dk	rVy|| W n tk
rT   Y nX |S )z,Return consolidated ImageJ metadata as dict.Nr6   i  )r  rO   imagej_description_metadatar  r3  r   rv   )r   r   r|   r   rE   rE   rH   r  )  s    

zTiffFile.imagej_metadatac             C   sV   | j s
dS i }| jd }|jd}|dk	r6|| |jd}|dk	rR||d< |S )z.Return consolidated FluoView metadata as dict.Nr6   i9  i:  ZStamp)r  rO   r  r3  r   )r   r|   r   r   rE   rE   rH   r$  8  s    

zTiffFile.fluoview_metadatac             C   s   | j s
dS | jd jdS )z:Return NIH Image metadata from NIHImageHeader tag as dict.Nr6   i2  )r  rO   r  r3  )r   rE   rE   rH   nih_metadataR  s    zTiffFile.nih_metadatac             C   s(   | j s
dS | jd j}|d|dS )z5Return FEI metadata from SFEG or HELIOS tags as dict.Nr6   ix  iz  )is_feirO   r  r3  )r   r  rE   rE   rH   fei_metadataY  s    zTiffFile.fei_metadatac             C   s   | j s
dS | jd jdS )z,Return SEM metadata from CZ_SEM tag as dict.Nr6   iF  )is_semrO   r  r3  )r   rE   rE   rH   sem_metadataa  s    zTiffFile.sem_metadatac             C   sr   | j s
dS | jd j}i }y||d W n tk
rB   Y nX y||d W n tk
rl   Y nX |S )z:Return Olympus SIS metadata from SIS and INI tags as dict.Nr6   i  i  )is_sisrO   r  r   r3  rv   )r   r  r|   rE   rE   rH   r6  h  s    zTiffFile.sis_metadatac             C   st   x,| j dd D ]}d|jkr|j}P qW dS i }x<tddD ].}||krLq>tj| }||||dd < q>W |S )z6Return consolidated metadata from MD GEL tags as dict.NrP   i  i  )rO   r  rw  r   r   r3  )r   r   r  r|   r
  r:   rE   rE   rH   r,  y  s    

zTiffFile.mdgel_metadatac             C   s   | j d jS )zReturn Andor tags as dict.r6   )rO   
andor_tags)r   rE   rE   rH   andor_metadata  s    zTiffFile.andor_metadatac             C   s   | j d jS )z'Return EPICS areaDetector tags as dict.r6   )rO   
epics_tags)r   rE   rE   rH   epics_metadata  s    zTiffFile.epics_metadatac             C   s   | j s
dS | jd jdS )zReturn TVIPS tag as dict.Nr6   iJ  )is_tvipsrO   r  r3  )r   rE   rE   rH   tvips_metadata  s    zTiffFile.tvips_metadatac             C   s   | j s
dS t| jd jS )z:Return MetaSeries metadata from image description as dict.Nr6   )is_metaseriesmetaseries_description_metadatarO   r  )r   rE   rE   rH   metaseries_metadata  s    zTiffFile.metaseries_metadatac             C   s   | j s
dS t| jd jS )z7Return Pilatus metadata from image description as dict.Nr6   )
is_pilatuspilatus_description_metadatarO   r  )r   rE   rE   rH   pilatus_metadata  s    zTiffFile.pilatus_metadatac             C   s   | j s
dS t| jS )z8Return MicroManager non-TIFF settings from file as dict.N)r  r   r   )r   rE   rE   rH   micromanager_metadata  s    zTiffFile.micromanager_metadatac             C   sV   | j s
dS i }y.t| j\}}}||d< ||d< || W n tk
rP   Y nX |S )zReturn ScanImage non-varying frame and ROI metadata as dict.

        The returned dict may be empty or contain 'FrameData', 'RoiGroups',
        and 'version' keys.

        The varying frame data can be found in the ImageDescription tags.

        Nr  r  )r  r   r   r   r_   )r   r|   r  Zroidatar  rE   rE   rH   r    s    
zTiffFile.scanimage_metadatac             C   s   | j s
dS | jd jS )z0Return GeoTIFF metadata from first page as dict.Nr6   )
is_geotiffrO   geotiff_tags)r   rE   rE   rH   geotiff_metadata  s    zTiffFile.geotiff_metadatac             C   s0   | j s
dS | jd jd}|dkr(dS | S )z+Return EER metadata from first page as XML.Nr6   i  )is_eerrO   r  r3  rn  )r   r   rE   rE   rH   eer_metadata  s    zTiffFile.eer_metadata)NNNNTNN)NNNNNN)NNN)r6   r  )Dr   r   r   r   r   r  rk   r   r   r%   r  r  re   rd   r   r  r  r  r  r   r'  r.  r5  r7  r<  r?  rQ  rT  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r  r$  r  r  r  r6  r,  r  r  r  r  r  r  r  r  r  rE   rE   rE   rH   r     s         
      
 
4@ e5#_MUI  k(6>
D	6r   c               @   s   e Zd ZdZd*ddZedd Zejdd Zedd	 Zejd
d	 Zedd Z	e	jdd Z	edd Z
d+ddZd,ddZdd Zd-ddZd.ddZd/ddZd0ddZd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdS )1r  zSequence of TIFF image file directories (IFD chain).

    Instances of TiffPages have a state (cache, keyframe, etc.) and are not
    thread-safe.

    Nc             C   s  d| _ g | _d| _d| _t| _d| _d| _d| _d| _	t
|ttjfrTt|f| _n|dkrdd| _n
t|| _t
|tr|| _ | j j}| | _	t| j jj|| j jjd }|dkrt|d d| _dS n^d|jkr(|j | _ | j j}|jd j}|d }|dkr2t|d d| _dS n
d| _dS || _||jkr`t| d| d| _dS | jdkrpdn| jd	 }|| t| j |d
}| j| || _| j	dkr| j|dd  d| _d| _dS )zInitialize instance and read first TiffPage from file.

        If arg is a TiffFile, the file position must be at an offset to an
        offset to a TiffPage. If arg is a TiffPage, page offsets are read
        from the SubIFDs tag.

        NFr6   z contains no pagesTiJ  z contains invalid SubIFDsz invalid offset to first page )r6   )r  rU   ) rI  rO   _indexed_cachedr   	_tiffpage	_keyframe_cache_offset_nextpageoffsetr\   r   rr   rK  _indexr  r   r   r   r   r  r   r   r  r  rq  r  r   r<   rT   ri   rM  )r   r  r  r   r;   r  r  r   rE   rE   rH   r     sf    




zTiffPages.__init__c             C   s   | j S )z2Return if pages/frames are currently being cached.)r  )r   rE   rE   rH   r  %  s    zTiffPages.cachec             C   s$   t |}| jr|s|   || _dS )z@Enable or disable caching of pages/frames. Clear cache if False.N)r   r  r  )r   r   rE   rE   rH   r  *  s    
c             C   s   | j tkottk	S )z?Return if currently using TiffFrame (True) or TiffPage (False).)r  r   r   )r   rE   rE   rH   r  2  s    zTiffPages.useframesc             C   s   |rt nt| _dS )z0Set to use TiffFrame (True) or TiffPage (False).N)r   r   r  )r   r   rE   rE   rH   r  7  s    c             C   s   | j S )zReturn current keyframe.)r  )r   rE   rE   rH   r  <  s    zTiffPages.keyframec             C   s   t |}|dk r|t| ; }| jj|kr,dS |dkrD| jd | _dS | jsX|t| jk r| j| }t|trv|| _dS t|tr|j	| j|< | j
}t| _
z| || _W d|| _
X | j| j|< dS )z;Set current keyframe. Load TiffPage from file if necessary.r6   N)r   rc   r  r  rO   r  r\   r   r   r;   r  _getitem)r   r  r   tiffpagerE   rE   rH   r  A  s*    


c             C   s   | j s| d | jS )z7Return offset where offset to a new page can be stored.r   )r  _seekr  )r   rE   rE   rH   r   ^  s    
zTiffPages.next_page_offsetFTc             C   s6   y| j ||||dS  tk
r0   |dkr, Y nX |S )z)Return specified page from cache or file.)r  r  r  N)r  ru  )r   rG   defaultr  r  r  rE   rE   rH   rV   e  s    zTiffPages.getc             C   s   | j r
dS | j}|sdS | js(| d | js2dS | jj}|dk	rH| j}xbt|D ]V\}}t	|t
tjfrR| jdkrx|n
| j|f }|| | j| j||d}|||< qRW d| _ dS )z#Read all remaining pages from file.Nr   )r  r  T)r  rO   r  r  r  rI  r   r  r}  r\   r   rr   rK  r  rT   r  )r   r  rO   r   r   r   r  rE   rE   rH   r  p  s(    

zTiffPages._loadc                s  | j }yrt|dkrtd|d }|js4td| d |d |d  }|d |d  |ksv|d |d  |kr~td| jd|jd	}|jd |j }|dk s||krtd||g}| j	j
j| }xtt|j| ||D ]x\}}|d }	|	|  t fd
d|jD }
|dk r"|nd}| jdk	r>| j|	f }	|t|j	|	||
|j|d qW || _ d| _d| _d| _W nR tk
r } z2| j	j
jdkrt| d|jj d| d W dd}~X Y nX dS )zCalculate virtual TiffFrames.rU   zpages already loadedr6   zdata not contiguousr   rP   rC   zpage offsets not equidistant)r  c             3   s   | ]}|  V  qd S )NrE   )rF   r   )drE   rH   rI     s    z1TiffPages._load_virtual_frames.<locals>.<genexpr>iN)rI  r  r;   r  r:  r  Tl        z# _load_virtual_frames failed with (z: ))rO   rc   r_   r   r  r  r  r  r;   rI  r   r<   r}  rw  r  r  ri   r   r  r  r  r  rv   rq  r   r   )r   rO   r   deltaZpage1Zoffsetoffsetfilesizer  r;   r  r  r   rE   )r  rH   r    sR    
(
zTiffPages._load_virtual_framesc             C   s   | j }|sdS |d | _|r^x|t|dd D ]*\}}t|ts.|jdk	r.|j||d < q.W n<ttk	rx2t|D ]&\}}t|trp|jdk	rp|j||< qpW d| _dS )zADelete all but first page from cache. Set keyframe to first page.Nr6   rU   F)	rO   r  r}  r\   r   r;   r   r   r  )r   ZfullyrO   r   r   rE   rE   rH   r    s    
zTiffPages._clearc          	   C   s  | j }t|}|dkrtd| jj}|jr4td| jsRd|  krN|k r|n n*|| }t|t	rh|n|j
}|| dS | jj}|j}	|j}
|j}|j}|j}tj}|d }t|t	r|n|j
}|dkrd}x||k r|| y0||||d }|dkrtd|W nD tk
r\   t| d	| d
|  |d= |d8 }d| _P Y nX || ||  | _|| j y||	||
d }W n< tk
r   t| d|d  d
| j  d| _P Y nX |dkrd| _P ||jkr
t| d| d| _P || |d7 }d|  kr4|k r:n nP |dkrx:|dd D ]*}|t|t	rf|n|j
krPtdqPW qW ||krtd|| }|t|t	r|n|j
 dS )z/Seek file to offset of page specified by index.r6   zindex out of rangezseek of closed fileNr   i  @ i   zsuspicious number of tags z corrupted tag list of page z @rU   Tz invalid offset to page z invalid page offset d   zinvalid circular IFD reference)rO   rc   ru  rI  r   rv  r_   r  r\   r   r;   rT   r   r   r  rQ  	tagnosizerR  r   r  r  r   rv   rq  r  r<   ri   )r   r  ZmaxpagesrO   r  r   r   r;   r   r   r  rQ  r  rR  r  tagnor  rE   rE   rH   r    s    





zTiffPages._seekc       
         sB  | j  | j}|dkr&ttt| }nt|tr:t|}nt|tr|d\}}}| j	sxt
||t| jkrx| d tt|t| j }nHt|ttjfrd| _|dkr| j| gS z
 |gS || _X ntd| j}t|| _r| jj|rd| _z& fdd	|D }	|	d| j W d|| _|r<|| _X |	S )
zReturn specified pages as list of TiffPages or TiffFrames.

        The first item is a TiffPage, and is used as a keyframe for
        following TiffFrames.

        Nir   Fr6   z*key must be an integer, slice, or iterableTc                s   g | ]} |qS rE   rE   )rF   r   )getitemr  rE   rH   rG  H  s    z&TiffPages._getlist.<locals>.<listcomp>)r  r  rI  rw  rc   r\   r7   r  r  r  r  rO   r  r   rr   rK  rW   r  r  r  r  rS  )
r   rG   r  r  r>   r  r  r   r  rO   rE   )r  r  rH   r  !  s@    






zTiffPages._getlistc       	      C   s:  t |}| j}|dk r$|t| ; }n,| jrP|t|krPtd| dt| d|rXtn| j}|t|k r|| }| jr|st|t t	j
fs|r||jkrtd|S n(t|t|fr|r||jkrtd|S | jdkr|n
| j|f }| | || j|| jd}|r ||jkr td| js.|r6|||< |S )z)Return specified page from cache or file.r6   zindex z out of range(r  zpage hash mismatchN)r  r  )r   rO   rc   r  ru  r   r  r  r\   rr   rK  r  r   r  r  rI  r  )	r   rG   r  r  r  rO   r  r   r  rE   rE   rH   r  R  s4    

zTiffPages._getitemc                s   | j }| j t|ttjfr4|dkr,|| S  |S t|tr|d\}}}| jspt	||t
|krp| d  fddt|t
| D S t|tr fdd|D S tddS )	zReturn specified page(s).r6   ir   c                s   g | ]} |qS rE   rE   )rF   r   )r  rE   rH   rG    s    z)TiffPages.__getitem__.<locals>.<listcomp>c                s   g | ]} |qS rE   rE   )rF   r  )r  rE   rH   rG    s    z*key must be an integer, slice, or iterableN)rO   r  r\   r   rr   rK  r  r  r  r  rc   r  rw  r7   rW   )r   rG   rO   r  r  r   rE   )r  rH   __getitem__s  s    

 
zTiffPages.__getitem__c             c   sJ   d}x4y|  |V  |d7 }W q tk
r4   P Y qX qW | jrFd| _dS )zReturn iterator over all pages.r6   rU   TN)r  ru  r  r  )r   r   rE   rE   rH   r     s    zTiffPages.__iter__c             C   s   t | jdkS )z'Return True if file contains any pages.r6   )rc   rO   )r   rE   rE   rH   __bool__  s    zTiffPages.__bool__c             C   s   | j s| d t| jS )zReturn number of pages in file.r   )r  r  rc   rO   )r   rE   rE   rH   __len__  s    
zTiffPages.__len__c             C   s   d| j  dS )Nz<tifffile.TiffPages @r   )r  )r   rE   rE   rH   r    s    zTiffPages.__repr__)N)NFNT)T)T)N)NTT)FNN)r   r   r   r   r   r  r  setterr  r  r   rV   r  r  r  r  r  r  r  r   r   r  r  rE   rE   rE   rH   r    s*   
F

2

U
1
!r  c               @   s~  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZddd	Zed
d ZdddZ dddZ!dd Z"dddZ#dddZ$dd Z%dd Z&e'dd Z(e(j)dd Z(e'dd  Z*e'd!d" Z+e'd#d$ Z,e'd%d& Z-e'd'd( Z.ed)d* Z/ed+d, Z0ed-d. Z1ed/d0 Z2ed1d2 Z3ed3d4 Z4ed5d6 Z5ed7d8 Z6d9d: Z7dd<d=Z8ed>d? Z9ed@dA Z:edBdC Z;edDdE Z<edFdG Z=e'dHdI Z>e'dJdK Z?e'dLdM Z@e'dNdO ZAe'dPdQ ZBe'dRdS ZCedTdU ZDedVdW ZEe'dXdY ZFe'dZd[ ZGe'd\d] ZHe'd^d_ ZIe'd`da ZJe'dbdc ZKe'ddde ZLe'dfdg ZMe'dhdi ZNe'djdk ZOe'dldm ZPe'dndo ZQe'dpdq ZRe'drds ZSe'dtdu ZTe'dvdw ZUe'dxdy ZVe'dzd{ ZWe'd|d} ZXe'd~d ZYe'dd ZZe'dd Z[e'dd Z\e'dd Z]e'dd Z^e'dd Z_e'dd Z`e'dd ZadS )r   az  TIFF image file directory (IFD).

    Attributes
    ----------
    index : int or tuple of int
        Index of the page in file.
    dtype : numpy.dtype or None
        Data type (native byte order) of the image in IFD.
    shape : tuple of int
        Dimensions of the image in IFD, as returned by asarray.
    axes : str
        Axes label codes for each dimension in shape:
        'S' sample,
        'X' width,
        'Y' length,
        'Z' depth,
    tags : TiffTags
        Multidict like interface to tags in IFD.
    colormap : numpy.ndarray
        Color look up table, if exists.
    shaped : tuple of int
        Normalized 5-dimensional shape of the image in IFD:
        0 : separate samplesperpixel or 1.
        1 : imagedepth Z or 1.
        2 : imagelength Y.
        3 : imagewidth X.
        4 : contig samplesperpixel or 1.

    All attributes are read-only.

    r6   rU   l    rE   Nr  c                s
  || _ || _d| _d| _d| _d| _d| _t  | _}d| _	d| _
|j}|j}| | _y4t|j||jd }|dkrtd| W n4 tk
r } ztd| j |W dd}~X Y nX | j|j }	|j }
}||
|  t |
| krtd|jd	krT|jd
krTd}
|d
tj |d| d fddt|D  |
 }xt|D ]~}||
7 } |||
  }yt !||	||  |}W n: tk
r } zt"| d|  wdW dd}~X Y nX |#| qdW |sdS x`t$j%& D ]R\}}|'|dkrq|dks0|dkr@t(t)s@qt*| | qW |j'dddrl| _+| j,dkr|'ddkrd| _,ndkrd| _,|'d| _	| j	dkr |'d| _	| j	dkr |'d| _	| j	dkr d| _	t"| d |'d| _
| j
dkr<|'d| _
| j
dkr<|'d| _
| j-dkr | j.dkr | j	r | j
r y6|| j	d  t/|t0| j
d d\}}}}W n tk
r   Y nlX || _.|| _-|| _1d|kr|d
krd
nd| _2d |kr|dkrd!| _3d"|krd!| _4d#|kr|| _5nx| j4d!krd |kr>d!| _3n| j3dkrPd!| _3d|kr`d
| _2d$|kr| j3d%kr~d| _1n| j3d&krd| _1n| j6s| jdkr| j j6r|d 7  | j4dkr| j8dkrd| _8n| j9s| jdkr| j j9rd| _:n| j;r|<d'dk	r|<d(}||j= y$t>||j?|j|j@d|d' j@|_AW n@ tk
r } z t"| d)|jBjC d*|  W dd}~X Y nX |<d+}|dk	r
ytD|jA|d, jA|j?|_AW n@ tk
r } z t"| d-|jBjC d*|  W dd}~X Y nX |'ddk	r|| j2dkr,nP|d j@dkrD| _2n8d| j1 tEfd.dD rr| _2n
d | _2|'d/dk	r|d/ j@dkr| _Fn8d| j1 tEfd0dD rֈ| _Fn
d | _Fd1|krd| _5n<d2|kr.d#|ks|d# j@dkr| j.| _5t0| j5| j.| _5t$jG<| jF| j2fd}|dk	rXtH|}| | _| _| j.}| j-}| j:}| j1}| j3dks|dkr&| jIdkrd||||f| _|dkr|||f| _d3| _n||||f| _d4| _nB||||df| _|dkr|||f| _d5| _n||||f| _d6| _n>d|||df| _|dkrR||f| _d7| _n|||f| _d8| _| j
stJ| j| j2d
  f| _
| j4dkrt"| d9 |	rn| j5	rn| j6	sntKtLM|| j5 d | j5 | j: }| jIdkr|| j19 }|t| j
k	r.t"| d:t| j
 d;| d< | j
d| | _
|t| j	k	rnt"| d=t| j	 d;| d< | j	d| | _	|'d>dk		ry tN|NdO }|| _PW n tk
	r   Y nX |'d?}|dk	
r| jQ
r|'d@}|dk	
r|RdA}|dBK }|RdA}||7 }|| j	d  ||d }ytS|\| _T| _U| _VW n@ tk

r } z t"| dC|jBjC d*|  W dd}~X Y nLX |dd |ddD  W | j
d tK|dD  g | _
|| j	d  W | _	dS )EzlInitialize instance from file.

        The file handle position must be at offset to a valid IFD.

        rE   Nr  r6   i   zsuspicious number of tags zcorrup tag list at offset zcorrupted IFD structurer   r   r   r   r   c             3   s>   | ]6} |d  |d  d   |d |d d   V  qdS )r   r   NrE   )rF   r   )ry   extrE   rH   rI   	  s   z$TiffPage.__init__.<locals>.<genexpr>r  i  i1  rU   )r  r6  rP   rC   iD  i  i  z missing data offset tagiE  i  i  i  i  r   i  i  i  )rP   r   )r6   rU   i]  i\  z read_uic1tag failed with z: i  i  z imagej_metadata failed with c             3   s   | ]}| d   V  qdS )r6   NrE   )rF   r  )r   rE   rH   rI     s    iS  c             3   s   | ]}| d   V  qdS )r6   NrE   )rF   r  )r   rE   rH   rI     s    iB  i  YXSZZYXSr  ZSZYXYXZZYXz missing ByteCounts tagz" incorrect StripByteCounts count (z != r  z incorrect StripOffsets count (i  i  i  uint64r  z ndpi_jpeg_tile failed with r   )XrI  r  rz   r  rs   r  r   r   r  r  r  r   r   r   r;   r   r  rQ  r  r  r_   rv   r   rR  rc   r  r  rT   ra   r  r	  rw  r   fromfilerq  addr   TAG_ATTRIBUTESr  r3  r\   r]   r   description1r  r|  r}  
jpeg_shaper  r  r  r  rp   r  r  _fix_lsm_bitspersamplerB  is_vista
imagedepthr  rV   r~  read_uic1tagrk   r  r   r   r   r  rd  r  SAMPLE_DTYPESrr   r  r+   r   ru  floortypeitemnodatar  r    ndpi_jpeg_tile
tilelengthr  
jpegheadertolist)r   rI  r  r  r  r   r   r  r   r  rR  Ztagsize_r  r   ZtagdatarF  r
  r:   	precisionr}  r|  r  rs   r  Z	maxstripsZpytype	mcustartshighr  rE   )ry   r  r   rH   r     s   



 


&








,

,





















,zTiffPage.__init__c          
      s(  j jjjkr jjjj  S fdd}jdkrJfdd}||S djkrddd }||S y jdkrvd ntjj  W n@ t	k
r } z"t
|dd	 d
dd}||S d}~X Y nX y jdkrdntjj W nB t	k
r( } z"t
|dd	 d
dd}||S d}~X Y nX jddk	rjd jdkrtfddjD rfdd}||S jrjdksjdkrdd }||S jr̈jjjdgndjjdgjdkrjd	< t\jdd \jr d   d  	 d  	fddfddjfdd
nB d  		fdddd jffdd	
jdkrbjdkrtd r
td d jkr$td! tj jj!\}}ddd"j"||f
fd#d	}||S jd$krĈjdkrtd%j  rtd&j  d: 
fd'd	}||S t#jj$j%j& j'd(krFdk	rt(d)t#jj$ d*j"d+  t#jj$ d,j)d  fd-d.nj"d/krj"  d0 rnt*d1jd2krt#j%j&fd3d.nlt+j"trfd4d.nNj"d5krj&d,krdk	rt(d6jj$fd7d.nfd8d.d; 
fd9d	}||S )<a0  Return decoded segment, its shape, and indices in image.

        The decode function is implemeted as a closure.

        Parameters
        ----------
        data : bytes
            Encoded bytes of a segment (aka strile, strip or tile)
            or None for empty segments.
        index : int
            The index of the segment in the Offsets and Bytecount tag values.
        jpegtables : bytes or None
            For JPEG compressed segments only, the value of the JPEGTables tag
            if any.

        Returns
        -------
        segment : numpy.ndarray
            Decoded segment or None for empty segments.
        indices : tuple of int
            The position of the segment in the image array of normalized shape:
            (separate sample, depth, length, width, contig sample).
        shape : tuple of int
            The shape of the segment: (depth, length, width, contig samples).
            The shape of strips depends on their linear index.

        Raises ValueError or NotImplementedError if decoding is not supported.

        c                s   |  j jj j< | S )N)rI  r  r  r  )rn  )r   rE   rH   r  y  s    zTiffPage.decode.<locals>.cacheNc                 s   t d j d j dd S )Nz&data type not supported (SampleFormat z, z-bit))r_   r  r  )argsrg   )r   rE   rH   rn    s    zTiffPage.decode.<locals>.decoder6   c              _   s   t dd S )Nzempty image)r_   )r  rg   rE   rE   rH   rn    s    rU   r   )r   c             _   s   t |  d S )N)r_   )r   r  rg   rE   rE   rH   rn    s    c             _   s   t |  d S )N)r_   )r   r  rg   rE   rE   rH   rn    s    iS  c             3   s   | ]}| j d   V  qdS )r6   N)r   )rF   r   )rF  rE   rH   rI     s    z"TiffPage.decode.<locals>.<genexpr>c                 s   t d j d S )Nzsample formats do not match )r_   r   )r  rg   )rF  rE   rH   rn    s    )r   r   rP   c              _   s   t dd S )Nz chroma subsampling not supported)rz  )r  rg   rE   rE   rH   rn    s    c                sB   |     |      |    |   dffS )Nr6   rE   )r  )r  lengthstdepthstlengthstshapestwidthr  rE   rH   r    s    
z TiffPage.decode.<locals>.indicesc                s  | d kr| S |d |d  |d  |d  }| j |krHd| _| d | } | j |kr^| |} nyL| t |d  |d t|d  |d t|d  |d f} W nd tk
r   td| j d|  t|| j}t| j |}| d | |d |< ||} Y nX | S )Nr6   rU   rP   rC   r   z+<tifffile.TiffPage.decode> incomplete tile r  )	r<   rz   rh  r  r_   rq  rr   zerosrs   )ry   r  rz   r<   rE  )imdepthimlengthimwidthsamplesrE   rH   rh    s,     

z TiffPage.decode.<locals>.reshapec             S   sJ   | d ks| j |kr| |fS dd t|| j D }tj| ||d} | | j fS )Nc             S   s   g | ]\}}d || fqS )r6   rE   )rF   r   r  rE   rE   rH   rG    s    z0TiffPage.decode.<locals>.pad.<locals>.<listcomp>)constant_values)rz   rx  rr   pad)ry   rz   r  padwidthrE   rE   rH   r(    s
    zTiffPage.decode.<locals>.padc                sL   |    |     |   ddf}t |d  f}||fS )Nr6   rP   )r  )r  r  rz   )r#  r$  r  r&  r  r  r!  rE   rH   r    s    

c             S   sx   | d kr| S |d |d  |d  |d  }| j |krHd| _| d | } | j |krZ|| _n|d d|d |d f| _| S )Nr6   rU   rP   rC   r   )r<   rz   )ry   r  rz   r<   rE   rE   rH   rh    s     

c                sf   |d  |d |d f}| d ks*| j |kr2| |fS dd | j d  fddg}tj| ||d} | | j fS )Nr6   rP   rC   )r6   r6   rU   )r'  )rz   rr   r(  )ry   rz   r  r)  )r  rE   rH   r(  0  s    )r   r   iL  i  z disabling LSB2MSB for JPEGz disabling predictor for JPEGi p  z@ SonyRawFileType might need additional unpacking (see issue #95)Fc       
   
      sx    |\}}	| d kr0|r&| |	\} }	| ||	fS t j| ||||||	dd d} | ||	} |rn| |	\} }	| ||	fS )NrU   rC   )r  tablesr  r4  r2  rz   )imagecodecsjpeg_decode)
ry   segmentindexr  r  	_fullsizer  r4  r2  r  rz   )r  r(  rh  rE   rH   rn  N  s"    
)	i  i  i  i  iu  iv  iRX  iQ  iR  z# disabling LSB2MSB for compression z% disabling predictor for compression c                s`   |\}}| d kr0|r&| |\} }| ||fS  | } | ||} |rV| |\} }| ||fS )NrE   )ry   r-  r  r.  r  rz   )
decompressr  r(  rh  rE   rH   rn    s    
r   z+unpredicting complex integers not supportedr   r   r   c                s   t | } |  S )N)rr   
frombufferr    view)ry   )rs   ftypeityperE   rH   r    s    zTiffPage.decode.<locals>.unpack)r   r   r  @   r7  r   zdata and sample size mismatchrC   c                sP   yt |  S  tk
rJ   jd }t| | | }t | d |  S X d S )Nr   )rr   r0  r_   r  rc   )ry   rD  r<   )rs   r   rE   rH   r    s    
c                s   t |  jS )N)
unpack_rgbr  )ry   )rs   r   rE   rH   r    s    r  z"unpredicting float24 not supportedc             S   s
   t | |S )N)float24_decode)ry   rk   rE   rE   rH   r    s    c                s   t |  j S )N)packints_decoder  )ry   )rs   r&  r   r!  rE   rH   r    s    c                s   |\}}| d kr0|r&| |\} }| ||fS j dkrBt| }  d k	r||d |d  |d  |d  } | |j d} | } | ||} | dj } d k	r| d| d} |rȈ| |\} }| ||fS )	NrP   r6   rU   rC   )r  r   r   )r?  r  )	fillorderbitorder_decodert   r    r   )ry   r-  r  r.  r  rz   r<   )r/  rs   r  r(  rh  r   r  	unpredictrE   rH   rn    s$    

 )NF)NF),r  rI  r  r  rs   r  rp   r   DECOMPRESSORSr   r]   rB  UNPREDICTORSr  rV   r  rd  r   is_subsampledr  r;  	tiledepthr  r  r  r|  r  r  r  r8  rq  jpeg_decode_colorspacer  r  r  rr   rk   r  r   r  rz  rt   r_   r\   )r   r  rn  r   r4  r2  rE   )r/  r  rs   r2  r#  r$  r%  r  r3  r  r(  rh  r&  r   r  r  r   r!  rF  r  r:  r  rH   rn  W  s    




&
%


zTiffPage.decodeFc          	   c   s  | j }| jj}|dkr|j}|dkr*|j}dt|i}|jdkrT| j|d< |j|d< |dkrl||fdd}	n|||fdd}	|dks|d	k r|j	}|d
k rxt|j
| j| j||ddD ]}
|	|
V  qW nHt|:}x2|j
| j| j||ddD ]}||	|E dH  qW W dQ R X dS )zpReturn iterator over decoded segments in TiffPage.

        See the decode function for return values.

        Nr.  )r   r   iL  i  r  r  c             S   s   |j | |S )N)rn  )r  
decodeargsr  rE   rE   rH   rn    s    z!TiffPage.segments.<locals>.decodec             S   s   ||j | |S )N)rn  )r  r@  r  r   rE   rE   rH   rn    s    rU   rP   T)lockrK   r  F)r  rI  r   rA  r;  r   rp   r  r  r  read_segmentsr  r  r9   map)r   rA  r  r   rK   r.  r  r   r@  rn  segmentexecutorsegmentsrE   rE   rH   rF    s>    



zTiffPage.segmentsTc          	      s  | j }|jrt|jdkrdS t| jdkr4td| jj}|dkrJ|j}|* |j	}|rtt
| dt |  W dQ R X t|tr|dkr|jr|* |j|jj|jj |j| jd d W dQ R X n|jr|jrtd|dk	rt||j|j}|8 || jd  |j|jj|jj t|j|d W dQ R X |jd	krVt  d |jd
krtj|j }|jd
kr| d d n| d d}| dd< n|j dk	rD|| krDd| j!krD| j"rD| j#dkrD| j$dkrD|2 || j!d j%d  |&| j!d j%d }	W dQ R X tj'| j( }
|
|	| j)|d ~	nHt||j|j |j* ||f fdd	}x| j+|||dddD ]}qW |j _,|ry|j, _,W n2 t-k
r   t.| d j, d|j,  Y nX |r|/   S )a  Read image data from file and return as numpy array.

        Raise ValueError if format is not supported.

        Parameters
        ----------
        out : numpy.ndarray, str, or file-like object
            Buffer where image data are saved.
            If None (default), a new array is created.
            If numpy.ndarray, a writable array of compatible dtype and shape.
            If 'memmap', directly memory-map the image data in the TIFF file
            if possible; else create a memory-mapped array in a temporary file.
            If str or open file, the file name or file object used to
            create a memory-map to an array stored in a binary file on disk.
        squeeze : bool
            If True (default), all length-1 dimensions (except X and Y) are
            squeezed out from the array.
            If False, the shape of the returned array is the normalized
            5-dimensional shape (TiffPage.shaped).
        lock : {RLock, NullContext}
            A reentrant lock used to synchronize seeks and reads from file.
            If None (default), the lock of the parent's filehandle is used.
        maxworkers : int or None
            Maximum number of threads to concurrently decode strips or tiles.
            If None (default), up to half the CPU cores are used.
            See remarks in TiffFile.asarray.

        Returns
        -------
        numpy.ndarray
            Numpy array of decompressed, unpredicted, and unpacked image data
            read from Strip/Tile Offsets/ByteCounts, formatted according to
            shape and dtype metadata found in tags and parameters.
            Photometric conversion, pre-multiplied alpha, orientation, and
            colorimetry corrections are not applied. Specifically, CMYK images
            are not converted to RGB, MinIsWhite images are not inverted,
            and color palettes are not applied. Exception are YCbCr JPEG
            compressed images, which are converted to RGB.

        r6   Nzmissing data offsetz reading array from closed filer   )r;   z chroma subsampling not supported)r  rP   rU   r   )r?  r  i  i  i  )r  r  c       
   	      s   | \}\}}}}}}	|d kr$|j }n,|d |j| d |j| d |j| f }| ||||	d  |||	d  |||	d  f< d S )Nr6   rU   rP   )r  r  r}  r|  )
Zdecoderesultr  r  rD  r   r  lr  r   rz   )r|   rE   rH   r     s    zTiffPage.asarray.<locals>.funcTF)r   rA  r  rK   r.  z failed to reshape z to )0r  r  r+   rc   r  r   rI  r   rA  rv  rX   rY   r   rw  r\   r]   r   r  rk   r  r   r   r=  rz  r!   rT   r  r8  r9  rB  r   r<  r  r  r;  r|  r}  r   r  r;  rp   r  rn  rF  rz   r_   rq  r  )r   r  r  rA  r  r  r   rv  r:  ry   r/  r   r   rE   )r|   rH   re   )  s    )

  zTiffPage.asarrayc             K   s   t | f|S )z"Return image data as zarr storage.)r   )r   rg   rE   rE   rH   rd     s    zTiffPage.aszarrc             K   s  | j f |}| j}|jtjjkr|j}|jd d|j k sF|j	j
dkrNtd|rp| dkrf|dL }|d}d|jkr|jdkr|d	 n|d
 }t||}n|jtjjkrb|jr.|dkrtj}xt|jD ]T\}	}
|
|kr|jdkr
|dd
ddd|	 gf }n|ddd
ddd|	 gf }P qW n2|jdkrL|dddf }n|ddddf }nF|jtjjkrxtn0|jtjjkrtn|jtjjkrtnt|S )zAReturn image data as RGB(A).

        Work in progress.

        rU   rP   r   zcannot apply colormapr6  r   uint8r   ).r6   r6   N.rC   )re   r  r  r   rS  rX  r  rz   r  rs   r   r_   r  r    r   r  apply_colormaprV  r  r   r}  rT  rz  rU  	SEPARATED)r   rH  alphar  ZdminZdmaxrg   ry   r  r   exsrE   rE   rH   asrgb  sF    

zTiffPage.asrgbc                s    fdd| j D S )zReturn list of (code, TiffTag).c                s(   g | ] } d ks|j  kr|j |fqS )N)r
  )rF   rF  )codesrE   rH   rG    s   z%TiffPage._gettags.<locals>.<listcomp>)r  )r   rN  rA  rE   )rN  rH   _gettags  s    
zTiffPage._gettagsc             C   sl   | j j}| j j}|| j t|j||j	d }|| j|j	 ||j
   t|j||jd S )z$Return offset to next IFD from file.r6   )rI  r   r   rT   r;   r   r  rQ  r  r  rR  r   r  )r   r   r   r  rE   rE   rH   _nextifd  s    zTiffPage._nextifdc             C   s   | S )zReturn self.rE   )r   rE   rE   rH   r    s    zTiffPage.aspagec             C   s   | S )zReturn keyframe, self.rE   )r   rE   rE   rH   r  "  s    zTiffPage.keyframec             C   s   dS )zSet keyframe, NOP.NrE   )r   r  rE   rE   rH   r  '  s    c             C   s
   t | jS )z"Return number of array dimensions.)rc   rz   )r   rE   rE   rH   r  ,  s    zTiffPage.ndimc             C   s
   t | jS )z#Return number of elements in array.)r+   rz   )r   rE   rE   rH   r<   1  s    zTiffPage.sizec             C   s   t | j| jj S )z Return number of bytes in array.)r+   rz   rs   rt   )r   rE   rE   rH   ru   6  s    zTiffPage.nbytesc             C   s   | j dS )zReturn colormap as numpy array.i@  )r  r3  )r   rE   rE   rH   r  ;  s    zTiffPage.colormapc             C   s   | j dS )z'Return transferfunction as numpy array.i-  )r  r3  )r   rE   rE   rH   transferfunction@  s    zTiffPage.transferfunctionc             C   sn   g }| j dkr|| j  | jr4|| j| jf n|| j| jf | jdkrf| j	dkrf|| j	 t
|S )z!Return shape of tiles or stripes.rU   )r>  ri   r;  rM  r  r  r  r|  r  r  r  )r   rz   rE   rE   rH   chunksE  s    
zTiffPage.chunksc             C   s   g }| j dkr$| jdkr$|| j | jr| jdkrP|| j| j d | j  || j| j d | j  || j| j	 d | j	  n<| jdkr|| j || j| j
 d | j
  |d | j dkr| jdkr|d t|S )zReturn shape of chunked image.rP   rU   )r  r  ri   r;  r  r>  r}  r  r|  r  r  r  )r   rz   rE   rE   rH   chunkedS  s&    



zTiffPage.chunkedc             C   sD   t | j| jj| j| j| j| j| j| j	| j
| j| j| j| j| jf S )zReturn checksum to identify pages in same series.

        Pages with the same hash can use the same decode function.

        )r  r  rI  rk   r  r  r>  r  r  r  r8  rB  r  r  r  rp   )r   rE   rE   rH   r  o  s    zTiffPage.hashc             C   s   d| j krdS t| | jdS )z&Return sequence of sub-pages, SubIFDs.iJ  rE   )r  )r  r  r  )r   rE   rE   rH   rO     s    
zTiffPage.pagesc             C   s   | j s| jdkrdS | jdkr0ttjt| jS t| j	| jj
 }|dk rNdS | jdksl| jdksl| jdkr| jdkr|dk rdS t| jdk rdS | jdks| jdks| jdkrtdk	rttjt| jS d	S )
zReturn maximum number of threads for decoding segments.

        Return 0 to disable multi-threading also for stacking pages.

        Nr6   )r   r   i  i  i  i  i  iL  iu  iv  iRX  iQ  iR  i   rU   r   i @  r   rP   )r   rs   rp   r  r   
MAXWORKERSrc   r  r+   rR  rt   r8  rB  r+  )r   r;  rE   rE   rH   r    s"    zTiffPage.maxworkersc                s  | j dkrdS | jdks"| jdkr&dS d| jkr| j| jks\| j| j s\| jd s\| jd r`dS d| jkrd| jkr| j| jks| j| j	 rdS | j
| j td	krdS tdkrȈd	  d	 fS | js| jrd	 t fS t fd
dttd D rd	 t fS dS )zlReturn offset and size of contiguous data, else None.

        Excludes prediction and fill_order.

        r   NrU   )r   r   r  r4  iB  r   i  i  r6   c             3   s6   | ].} | d ko,|  |  |d  kV  qdS )r6   rU   NrE   )rF   r   )r:  r  rE   rH   rI     s   z)TiffPage.is_contiguous.<locals>.<genexpr>)r  rp   r  r  r|  r  r}  r  r  r>  r  r  rc   r  r  r  rp  rw  )r   rE   )r:  r  rH   r     s8    





zTiffPage.is_contiguousc             C   s"   | j o | jdko | jdko | j S )z`Return if page's image data are stored in final form.

        Excludes byte-swapping.

        rU   )r   r8  rB  r=  )r   rE   rE   rH   r    s    

zTiffPage.is_finalc             C   s&   | j jjo$| jo$| jd | jj dkS )z9Return if page's image data in file can be memory-mapped.r6   )rI  r   is_filer  r   rs   rt   )r   rE   rE   rH   r     s    
zTiffPage.is_memmappablec             C   s   d| j  d| j dS )Nz<tifffile.TiffPage z @r   )r  r;   )r   rE   rE   rH   r    s    zTiffPage.__repr__r  c                s   j  krt ||S d}x(dD ] }t d| }|r"| }P q"W d$ fdd	}ddd	 d
dd	  jD dt	 j
j jddd	 t jj jrdnd jrdnd jrdnd|d|d|d|dftdd	  jD  |f D fD }d j d j d| }|dkr.|S | jj|d |dg}|dkrxLdD ]D}|d }t |d}|rV|d| t|||d d  qVW |d!kry&|d"t  ||d d  W n tk
r   Y nX d#|S )%z4Return string containing information about TiffPage.r  )memmappablefinalr  rD   rU   c                s>   t  | }yt |d}W n tk
r,   dS X ||kr:|S dS )Nr:   r  )r   r   )r:   r  objr   )r   rE   rH   tostr  s    
zTiffPage.__str__.<locals>.tostrz  c             s   s   | ]}|r|  V  qd S )N)r  )rF   r   rE   rE   rH   rI     s   z#TiffPage.__str__.<locals>.<genexpr>r=  c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI     s    z{}{}r  c             s   s   | ]}|r|V  qd S )NrE   )rF   r   rE   rE   rH   rI     s   ZREDUCEDrg  ZTILEDrp   r  rB  r8  c             s   s   | ]}|  V  qd S )N)r_  )rF   r   rE   rE   rH   rI   )  s    z	TiffPage z @r6   )r  )r  r   Fz{}
{}r   )r  r  rC   zDATA
{}z

)rU   )r  r   r  r   r_  r	  rz   r  r   SAMPLEFORMATr  r:   r  rS  r  r>  is_maskr;  r  r  r  r;   r  ri   r*   re   rv   )r   r  r  re  r:   rY  r&  rE   )r   rH   r     sN    


t



zTiffPage.__str__c                s    fddt tjD S )zReturn set of flags.c                s"   h | ]}t  d | r| qS )rD   )r   r  )rF   r:   )r   rE   rH   r  M  s   z!TiffPage.flags.<locals>.<setcomp>)rx  r   r  )r   rE   )r   rH   r  J  s    
zTiffPage.flagsc             C   sx   | j s
dS d| jd ji}xX| jD ]N}|j}d|  k r@dk sDq" q"|j}t|dkrb|dd n|}|j||< q"W |S )z5Return consolidated metadata from Andor tags as dict.NZIdi   i  r   )is_andorr  r   r
  r:   rc   )r   r|   rF  r
  r:   rE   rE   rH   r  S  s    zTiffPage.andor_tagsc             C   s   | j s
dS i }x| jD ]}|j}d|  kr4dk s8q q|j}|dkrTt||d< q|dkrjt||d< q|dkrt||d< q|d	krt||d
< q|dd\}}t|||< qW |S )zReturn consolidated metadata from EPICS areaDetector tags as dict.

        Use epics_datetime() to get a datetime object from the epicsTSSec and
        epicsTSNsec tags.

        Ni  i  Z	timeStampi  ZuniqueIDi  Z
epicsTSSeci  ZepicsTSNsecr,  rU   )is_epicsr  r
  r   rq  r   r  r    )r   r|   rF  r
  r   rG   rE   rE   rH   r  c  s&    zTiffPage.epics_tagsc             C   s   | j s
dS | j}i }xdD ]}|| j||< qW x,tj D ]\}}||kr<|| j||< q<W d|kr|d }d|kr|d d}|dK }|d}||7 }|d= ||d< |S )z9Return consolidated metadata from Hamamatsu NDPI as dict.N)MakeModelSoftware	McuStartsMcuStartsHighBytesr  r  )r  r  r   r   	NDPI_TAGSr  r    )r   r  r|   r:   r
  r  r  rE   rE   rH   	ndpi_tags  s&    

zTiffPage.ndpi_tagsc             C   s|  | j s
dS | j}|d}|dks:t|dk s:|d dkrLt| d i S |d |d |d d}tj}tj}xt|d D ]}y(|d	|d	  |d	 d
  \}}}	}
W nB t	k
r } z$t| d|j
j d| d wW dd}~X Y nX |dkr|
}ny|| j|
|
|	  }W nT tk
rF   t| d|  wY n, tk
rp   t| d| d wY nX |dkr|	dkr|d dkr|dd }|	dkr|n|d }||kry|| |}W n t	k
r   Y nX y||j}W n tk
r   |}Y nX |||< qW |d}|dk	r`t|}t|dkrX|d }||d< |d}|dk	rt| |d< |d}|dk	rt|d  }||d< |d}|dk	rt|d }||d< |d}|dk	rx|d |d |d |d |d	 |d  |d! |d" |d
 |d# |d$ |d% |d&d' |d'd( |d(d) |d)d d*|d+< |S ),z7Return consolidated metadata from GeoTIFF tags as dict.Ni  rP   r6   rU   z invalid GeoKeyDirectoryTag)ZKeyDirectoryVersionZKeyRevisionZKeyRevisionMinorrC   r   r   z corrupted GeoKeyDirectoryTag (z: r  z corrupted GeoKeyDirectoryTag z GeoKeyDirectoryTag z
 not foundi  r   r   i  r   )r   r   ZIntergraphMatrixi  ZModelPixelScalei  )r   r   ZModelTiepointi؅  ZModelTransformationi  r   r   r   r   r   rR  r   !   5   I   )ZERR_BIASZERR_RANDZLINE_OFFZSAMP_OFFZLAT_OFFZLONG_OFFZ
HEIGHT_OFFZ
LINE_SCALEZ
SAMP_SCALEZ	LAT_SCALEZ
LONG_SCALEZHEIGHT_SCALEZLINE_NUM_COEFFzLINE_DEN_COEFF ZSAMP_NUM_COEFFZSAMP_DEN_COEFFZRPCCoefficient)r  r  r3  rc   rq  r   GEO_KEYS	GEO_CODESrw  rv   r   r   r   r   r   r:   r_   rr   r  rh  r  r  )r   r  Zgkdr|   ZgeokeysZgeocodesr  Zkeyidtagidr  r;   r   r   rG   ZrpccrE   rE   rH   r    s    
 &
"















zTiffPage.geotiff_tagsc             C   s
   | j d@ S )z'Page is reduced image of another image.rU   )r  )r   rE   rE   rH   r>    s    zTiffPage.is_reducedc             C   s
   | j d@ S )z!Page is part of multi-page image.rP   )r  )r   rE   rE   rH   is_multipage  s    zTiffPage.is_multipagec             C   s
   | j d@ S )z,Page is transparency mask for another image.r   )r  )r   rE   rE   rH   r[     s    zTiffPage.is_maskc             C   s
   | j d@ S )z%Page is part of Mixed Raster Content.r   )r  )r   rE   rE   rH   is_mrc%  s    zTiffPage.is_mrcc             C   s
   | j dkS )zPage contains tiled image.r6   )r  )r   rE   rE   rH   r;  *  s    zTiffPage.is_tiledc             C   s2   | j dk	r| j dkS | jdko0| jdko0| jdkS )z&Page contains chroma subsampled image.N)rU   rU   r   rU   )rP   r   )r3  rp   r  r  )r   rE   rE   rH   r=  /  s
    



zTiffPage.is_subsampledc             C   s6   x0| j | jfD ] }|sdS |dd dkr|S qW dS )z/Return ImageJ description if exists, else None.Nr   zImageJ=)r  r
  )r   r  rE   rE   rH   r  :  s    zTiffPage.is_imagejc             C   sZ   xT| j | jfD ]D}|rd|kr"dS |dd dkr>d|kr>|S |dd dkr|S qW dS )z?Return description containing array shape if exists, else None.z"mibi.NrU   {z"shape":r   zshape=)r  r
  )r   r  rE   rE   rH   r  D  s    zTiffPage.is_shapedc             C   s
   d| j kS )zPage contains MDFileTag tag.i  )r  )r   rE   rE   rH   r  P  s    zTiffPage.is_mdgelc             C   s@   | j d}y|dk	o&|jdd dkS  tk
r:   dS X dS )z'Page contains Media Cybernetics Id tag.ip  Nr   s   MC TIFFF)r  rV   r   rv   )r   rF  rE   rE   rH   
is_mediacyU  s
    zTiffPage.is_mediacyc             C   s
   d| j kS )zPage contains UIC1Tag tag.i\  )r  )r   rE   rE   rH   r  ^  s    zTiffPage.is_stkc             C   s
   d| j kS )zPage contains CZ_LSMINFO tag.il  )r  )r   rE   rE   rH   r  c  s    zTiffPage.is_lsmc             C   s
   d| j kS )z$Page contains FluoView MM_STAMP tag.i:  )r  )r   rE   rE   rH   r  h  s    zTiffPage.is_fluoviewc             C   s
   d| j kS )z!Page contains NIHImageHeader tag.i2  )r  )r   rE   rE   rH   r  m  s    zTiffPage.is_nihc             C   s
   | j dkS )z0Page contains SGI ImageDepth tag with value > 1.rU   )r  )r   rE   rE   rH   is_volumetricr  s    zTiffPage.is_volumetricc             C   s
   | j dkS )zSoftware tag is 'ISS Vista'.z	ISS Vista)r  )r   rE   rE   rH   r  w  s    zTiffPage.is_vistac             C   s2   | j dks| jdkrdS | j}|do0|dS )z>Page contains MDS MetaSeries metadata in ImageDescription tag.r6   Z
MetaSeriesFz
<MetaData>z</MetaData>)r  r  r  
startswithr  )r   r  rE   rE   rH   r  |  s    zTiffPage.is_metaseriesc             C   s&   | j dks| jsdS | jdd dkS )z.Page contains OME-XML in ImageDescription tag.r6   Fr   NzOME>)r  r  )r   rE   rE   rH   r    s    zTiffPage.is_omec             C   s&   | j dks| jsdS | jdd dkS )z4Page contains Leica SCN XML in ImageDescription tag.r6   FiNz</scn>)r  r  )r   rE   rE   rH   r    s    zTiffPage.is_scnc             C   s
   d| j kS )z'Page contains MicroManagerMetadata tag.i  )r  )r   rE   rE   rH   r    s    zTiffPage.is_micromanagerc             C   s
   d| j kS )z.Page contains Andor Technology tags 4864-5030.i   )r  )r   rE   rE   rH   r\    s    zTiffPage.is_andorc             C   s$   | j dd dko"| jdd dkS )zPage contains Pilatus tags.Nr   zTVX TIFFrP   z# )r  r  )r   rE   rE   rH   r    s    zTiffPage.is_pilatusc             C   s   | j dkp| jdkS )z&Page contains EPICS areaDetector tags.zEPICS areaDetector)r  r  )r   rE   rE   rH   r]    s    
zTiffPage.is_epicsc             C   s
   d| j kS )zPage contains TVIPS metadata.iJ  )r  )r   rE   rE   rH   r    s    zTiffPage.is_tvipsc             C   s   d| j kpd| j kS )z*Page contains FEI_SFEG or FEI_HELIOS tags.ix  iz  )r  )r   rE   rE   rH   r    s    zTiffPage.is_feic             C   s
   d| j kS )zPage contains CZ_SEM tag.iF  )r  )r   rE   rE   rH   r    s    zTiffPage.is_semc             C   s   | j dd dkS )zPage contains Aperio metadata.Nr   zAperio )r  )r   rE   rE   rH   is_svs  s    zTiffPage.is_svsc             C   s^   yDd| j koDd| jkpD| jdd dkpD| jdkpD| jdkpD| jdkS  tk
rX   d	S X dS )
zPage contains Ventana metadata.i  ZVentanaN   ZScanOutputManagerzLabel ImageZLabel_ImageZProbability_ImageF)r  r  r  rv   )r   rE   rE   rH   is_bif  s    




zTiffPage.is_bifc             C   s6   | j dd dkp4| jdd dkp4d| jdd kS )z!Page contains ScanImage metadata.NrC   zSI.r   zstate.zscanimage.SIi )r  r  )r   rE   rE   rH   r    s    zTiffPage.is_scanimagec             C   s   | j dd dkS )z1Page contains PerkinElmer tissue images metadata.N   zPerkinElmer-QPI)r  )r   rE   rE   rH   is_qpi  s    zTiffPage.is_qpic             C   s
   d| j kS )zPage contains GeoTIFF metadata.i  )r  )r   rE   rE   rH   r    s    zTiffPage.is_geotiffc             C   s
   d| j kS )zPage contains TIFF/EP metadata.i  )r  )r   rE   rE   rH   	is_tiffep  s    zTiffPage.is_tiffepc             C   s   d| j kpd| j kS )z#Page contains Olympus SIS metadata.i  i  )r  )r   rE   rE   rH   r    s    zTiffPage.is_sisc             C   s   d| j kod| j kS )zPage contains NDPI metadata.i  i  )r  )r   rE   rE   rH   r    s    zTiffPage.is_ndpic             C   s$   | j dd dko"| jdd dkS )z"Page contains Philips DP metadata.Nr   z
Philips DPiz</DataObject>)r  r  )r   rE   rE   rH   r    s    zTiffPage.is_philipsc             C   s   | j jo| jdkod| jkS )zPage contains EER metadata.)i  i  i  )rI  r   rp   r  )r   rE   rE   rH   r    s    
zTiffPage.is_eer)N)NNNFN)NTNN)FNNNN)NN)r6   r  )br   r   r   r   r  r|  r}  r  r  r  r>  r  r  r  r  rp   r  r8  r  rB  r  r3  r  r  r  r  r  r
  r  r   r%   rn  rF  re   rd   rM  rO  rP  r  r  r  r  r  r<   ru   r  rQ  rR  rS  r  rO   r  r   r  r   r  r  r  r  r  rd  r  r>  rk  r[  rl  r;  r=  r  r  r  rn  r  r  r  r  ro  r  r  r  r  r  r\  r  r]  r  r  r  rq  rs  r  ru  r  rv  r  r  r  r  rE   rE   rE   rH   r     s   
  {   
8
 %    
6
	)+
J	 z
		r   c               @   s   e Zd ZdZdZdZdZd'ddZd(dd	Zd
d Z	dd Z
dd Zdd Zdd Zdd Zedd Zejdd Zedd Zedd Zedd Zdd  Zd!d" Zd)d%d&ZdS )*r   a\  Lightweight TIFF image file directory (IFD).

    Only a limited number of tag values are read from file.
    Other tag values are assumed to be identical with a specified TiffPage
    instance, the keyframe.

    TiffFrame is intended to reduce resource usage and speed up reading image
    data from file, not for introspection of metadata.

    )r  rI  r;   r  r  r  r  r  FrE   Nc       
      C   sn  d| _ || _|| _|| _d| _d| _d| _d| _|dk	rN|| _|| _|| _ dS |dkrf| jj	 | _n| jj
| |dkrddddddh}n.|jrd	dddh}|j| _nd	ddddddh}x| |D ]\}}	|dks|dkr|	j| _q|dks|dkr|	j| _q|dkr|	j| _q|dkr.|	j| _q|d	kr|j|	jkrtd
qW | jsdt| d || _dS )z{Initialize TiffFrame from file or values.

        The file handle position must be at the offset to a valid IFD.

        NrE   i  i  iD  iE  iJ  i[  r-  zincompatible keyframez is missing required tags)r  rI  r  r;   r  r  r  r  r   r   rT   r   rO  r   r|  r   rq  r  )
r   rI  r  r;   r  r  r:  r  r
  rF  rE   rE   rH   r     sH    






zTiffFrame.__init__c             C   s  | j j}| j j}tj}|dkr$t n|}g }|X || j y2||j|	|j
d }|dkrptd| W n, tk
r } ztd|W dd}~X Y nX | j|j
 }	|j}
|
 }|jdd }|	|
| }xt|D ]}||
7 }|||||d  d }|r||krqy$t| j |	| ||||
  }W n8 tk
rr } zt| d|  wW dd}~X Y nX |||f qW W dQ R X |S )z)Return list of (code, TiffTag) from file.Nr6   i   zsuspicious number of tags zcorrupted tag listrP   r  )rI  r   r   r   r  NullContextrT   r;   rQ  r  r  r   rv   rR  
tagformat1rw  r   r  rq  ri   )r   rN  rA  r   r   r  r  r  r   r  rR  r  Z
codeformatZtagbytesr   r
  rF  rE   rE   rH   rO  [  sB    zTiffFrame._gettagsc             C   s
   t | S )z$Return offset to next IFD from file.)r   rP  )r   rE   rE   rH   rP    s    zTiffFrame._nextifdc             C   sr   | j dkrtd| jj}|j}|r>t| dt |  z |	| j  t
| j| jd}W d|rl|  X |S )zReturn TiffPage from file.Nz#cannot return virtual frame as pagez" reading TiffPage from closed file)r  )r;   r_   rI  r   rv  rX   rY   r   rw  rT   r   r  r  )r   r   rv  r   rE   rE   rH   r    s    

zTiffFrame.aspagec             O   s   t j| f||S )z4Read image data from file and return as numpy array.)r   re   )r   r  rg   rE   rE   rH   re     s    zTiffFrame.asarrayc             K   s   t j| f|S )z"Return image data as zarr storage.)r   rd   )r   rg   rE   rE   rH   rd     s    zTiffFrame.aszarrc             O   s   t j| f||S )z>Read image data from file and return RGB image as numpy array.)r   rM  )r   r  rg   rE   rE   rH   rM    s    zTiffFrame.asrgbc             O   s   t j| f||S )z3Return iterator over decoded segments in TiffFrame.)r   rF  )r   r  rg   rE   rE   rH   rF    s    zTiffFrame.segmentsc             C   s   | j S )zReturn keyframe.)r  )r   rE   rE   rH   r    s    zTiffFrame.keyframec             C   sT   | j |krdS | j dk	r tdt| jt|jkr<td|jrJ|j| _|| _ dS )zSet keyframe.Nzcannot reset keyframezincompatible keyframe)r  r   rc   r  r   r  )r   r  rE   rE   rH   r    s    

c             C   s"   | j jr| jd | j jd fS dS )z5Return offset and size of contiguous data, else None.r6   rU   N)r  r   r  )r   rE   rE   rH   r     s    zTiffFrame.is_contiguousc             C   s   | j jS )z9Return if page's image data in file can be memory-mapped.)r  r   )r   rE   rE   rH   r     s    zTiffFrame.is_memmappablec             C   s   | j jS )z1Return checksum to identify pages in same series.)r  r  )r   rE   rE   rH   r    s    zTiffFrame.hashc             C   s0   |t jkrt| j|S t| jjd|dS )zReturn attribute from keyframe.z object has no attribute N)r   FRAME_ATTRSr   r  r   r   r   )r   r:   rE   rE   rH   r    s    
zTiffFrame.__getattr__c             C   s   d| j  d| j dS )Nz<tifffile.TiffFrame z @r   )r  r;   )r   rE   rE   rH   r    s    zTiffFrame.__repr__r6   r  c             C   s   | j dkrd}d}nDddd ddd | jD t| jfD }tj| j |d d	}|d
krt| j|d |d
 d}t| j	|d |d
 d}d| d| d| }d| j
 d| j d| S )z5Return string containing information about TiffFrame.Nr  z  c             s   s   | ]
}|V  qd S )NrE   )rF   r   rE   rE   rH   rI     s   z$TiffFrame.__str__.<locals>.<genexpr>r=  c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI     s    rR  )r  rC   r   )r  r  r0  z
 Keyframe z

 Offsets z
 Bytecounts z
TiffFrame z @)r  r	  rz   r]   rs   r   r  r*   r  r  r  r;   )r   r  r  r&  ZkfZofbcrE   rE   rH   r    s    
zTiffFrame.__str__)NNNN)NN)r6   r  )r   r   r   r   r   r  rO   r   rO  rP  r  re   rd   rM  rF  r  r  r  r   r   r  r  r  r  rE   rE   rE   rH   r     s.   

   
6
)	
r   c               @   s   e Zd ZdZdZdd Zed$ddZed	d
 Z	edd Z
edd Zejdd Zedd Zedd Zedd Zedd Zdd Zd%ddZdd Zdd Zd&d"d#ZdS )'r   a+  TIFF tag structure.

    Attributes
    ----------
    name : string
        Name of tag, TIFF.TAGS[code].
    code : int
        Decimal code of tag.
    dtype : int
        Datatype of tag data. One of TIFF.DATATYPES.
    count : int
        Number of values.
    value : various types
        Tag data as Python object.
    valueoffset : int
        Location of value in file.
    offset : int
        Location of tag structure in file.
    parent : TiffFile or TiffWriter
        Reference to parent TIFF file.

    All attributes are read-only.

    )rI  r;   r
  rs   r  _valuer~  c             C   sd   || _ t|| _t|| _t|| _|| _|| _yt|| _	W n t
k
r^   t|| _	Y nX dS )z(Initialize TiffTag instance from values.N)rI  r   r;   r
  r  r{  r~  r   	DATATYPESrs   r_   )r   rI  r;   r
  rs   r  r   r~  rE   rE   rH   r     s    


zTiffTag.__init__NTc             C   s  |j }|dkr>|dkr"|j }n|j| |j|j}n|dkrP|j }||j |j }t|j	|dd \}}t|j
|dd \}	}
ytj| }W nN tk
r   d| d| d|}|rt|t| | |||||	ddS X |	t| }||jks|tjkrt|j|
d }|rR|tjkrRt|||||	|}
nt|dk sn|| |jjkrd| d| d| }|rt|t| d}
n&|tjkrt|||||	|}
nd}
n|d	ks|d
ks|dkr|
d| }
n|jdkrJ|jdkrJ|	d	krJ|dks*|dkrJ|
dd dkrJtd|
}
n4d|j|	t|d  |d	 }t||
d| }
t|
|||}
| |||||	|
|S )z'Return TiffTag instance read from file.Nr   z<tifffile.TiffTag z @z> invalid data type r6   r   z> invalid value offset rU   rP   r   r   r0  s       z<Qz{}{}{})r   r   r   rT   r  rR  tagoffsetthresholdr   r  rx  
tagformat2r   r   r   r   rq  r  TAG_READERSr   TAG_LOADr   _read_valuer<   r  r  r  rk   r   _process_value)clsrI  r;   r  r  r   r~  r
  rs   r  r   r  r  	valuesizer   rE   rE   rH   r  +  sd    


zTiffTag.fromfilec          
   C   sp  yt j| }W n. tk
r<   td| d| d|Y nX | j}| j}|t| }	|dksv|dk sv||	 |jkrtd| d| d| |	| |t j
krt j
| }
|
||j|||j}n|dks|dks|d	kr||	}t||	krltd| d| d
 n^|t jkr:|dkr:t||j|||j}n2d|j|t|d  |d }t|||	}|S )zRead tag value from file.z<tifffile.TiffTag z @z> invalid data type Nr   z> invalid value offset rU   rP   r   z> could not read all valuesi   z{}{}{}r6   )r   r   r   r   r   r   r   r  r<   rT   r  rk   r  r  rc   rq  	TAG_TUPLE
read_numpyr  r   r  )rI  r;   r
  rs   r  r~  r  r   r   r  readfuncr   r   rE   rE   rH   r  {  s:    	



zTiffTag._read_valuec          
      s   | dks2|dks2|dks2|t jks2t| tttfs6| S |dkrytt| dd } W n* t	k
r   t
d| d| d	 Y nX | S |t jkrt j|  yt fd
d| D } W nD tk
r } z&|dkrt
d| d| d|  W dd}~X Y nX t| dkr|t jkr| d } | S )zProcess tag value. .NrU   r   rP   F)r  z<tifffile.TiffTag z @z!> coercing invalid ASCII to bytesc             3   s   | ]} |V  qd S )NrE   )rF   r  )rE  rE   rH   rI     s    z)TiffTag._process_value.<locals>.<genexpr>)i  i=  z> r6   )r   r  r\   r   r]   r  	bytes2strr0   r  UnicodeDecodeErrorrq  TAG_ENUMr_   rc   r  )r   r
  rs   r;   r   rE   )rE  rH   r    s.    


,zTiffTag._process_valuec          	   C   s   | j dkr| jj}|j^ |j}|r>t| dt |  z$t	
| j| j| j| j| j| j}W d|rp|  X W dQ R X t	|| j| j| j| _ | j S )z1Return value of tag. Load from file if necessary.Nz reading value from closed file)r{  rI  r   rA  rv  rX   rY   r   rw  r   r  r;   r
  rs   r  r~  r  r  )r   r   rv  r   rE   rE   rH   r     s0    

zTiffTag.valuec             C   s
   || _ d S )N)r{  )r   r   rE   rE   rH   r     s    c             C   s*   y| j jS  tk
r$   d| j  S X d S )NTYPE)rs   r:   r   )r   rE   rE   rH   
dtype_name  s    zTiffTag.dtype_namec             C   s   t j| jt| jS )z+Return name of tag from TIFF.TAGS registry.)r   r   rV   r
  r]   )r   rE   rE   rH   r:      s    zTiffTag.namec             C   s   t j| j S )z)Return data type as Python struct format.)r   r   rs   )r   rE   rE   rH   r     s    zTiffTag.dataformatc             C   s   | j ttj| j  S )zReturn size of value in file.)r  r   r  r   r   rs   )r   rE   rE   rH   valuebytecount   s    zTiffTag.valuebytecountc             C   s   t | jtr| j}ntj| j }| jt|d  }d| j	j
j||d }y.|dkrdt|| j}ntj|f| j }W nn tk
r   | j	j
}|jdkr|jdkrtd| j	j}| }|| j |t|}|| Y nX | j| jj| j|fS )zvReturn tag code, dtype, count, and encoded value.

        The encoded value is read from file if necessary.

        r6   z{}{}{}rU   r   r   z"cannot read from NDPI > 4 GB files)r\   r   r   r   r   rs   r  r   r  rI  r   rk   r   r   rv   r  r  rz  r   r   rT   r~  r  r  r
  )r   r   r  r  r   r   r   r   rE   rE   rH   _astuple   s*    zTiffTag._astuplec             C   s2  | j dk s| jdk r&td| j  dt|drD|}tjdtdd | jj}| jj	}|j
dkrp|jdkrptd	|d
kr|d}|d
kr| j}ytj| }W n tk
r } zby2|dd
 }|d dkr|dd
 }tj| }W n* ttfk
r   td| |Y nX W d
d
}~X Y nX |dkrt|trry|d}W n. tk
rn } ztd|W d
d
}~X Y nX nt|tstdt|dks|d dkr|d7 }t|}	|f}nnt|trt|}
t||
 rtdt||
 }	|f}n.yt|}	W n  tk
r&   |f}d}	Y nX |dkrV|	dk sF|	d rNtd|	d }	tjd|j|	t|d  |d f| }t|}| jttj| j  }| j}|  }zX|| jkr|!| j d  |"t|jd | ||j#kr||j#kr(|!| j d  |"t|j$|	| nl|!dt%j& |  }|d rZ|"d |d7 }|"| |!| j d  |"t|j$|	t|j'| np||j#kr| j d |j }|!| j d  |"t|j$|	| |r|!| j |"d|  n
||ks| j| |j(kr||!| j d  |"t|j'|	 |!| j |"| |r|| dkr|"d||   n|r|!| j |"d|  |!dt%j& |  }|d r|"d |d7 }|"| |!| j d  |"t|j$|	t|j'| W d
|!| X t)| j| j | j*||	||S )aR  Write new tag value to file and return new TiffTag instance.

        The value must be compatible with the struct.pack formats in
        TIFF.DATA_FORMATS.

        The new packed value is appended to the file if it is longer than the
        old value. The old value is zeroed. The file position is left where it
        was.

        r   zcannot rewrite tag at offset z < 8r   zn<tifffile.TiffTag.overwrite> passing a TiffFile instance is deprecated and no longer required since 2021.7.30.rP   )rQ   r   zcannot patch NDPI > 4 GB filesNr   r   r6   z<>rU   zunknown dtype r   z TIFF strings must be 7-bit ASCIIr   zinvalid packed binary data)r   r   zinvalid RATIONAL valuez{}{}{}r   r   )+r;   r~  r_   r`   rX   rY   rZ   rI  r   r   r  r  rz  rs   r   r   r   r   rW   r\   r]   r   r   r   rc   r   r  r   r  rk   r   r  r   rT   rw   r}  r~  ra   r   r   r<   r   r
  )r   r   Z_argrs   r  r   r   r  r   r  ZdtsizeZpackedvaluenewsizeZoldsizer~  r   rE   rE   rH   r  6   s    
(










zTiffTag.overwritec             C   st   | j dks| jdkrdS t| d tjd	| j }td|d | _| jj	
| j td| jj	d| _dS )
zCorrect LSM bitspersample tag.

        Old LSM writers may use a separate region for two 16-bit values,
        although they fit into the tag value element of the tag.

        i  rP   Nz! correcting LSM bitspersample tag<HHz<Ir6   r   )r  )r
  r  rq  r   r   r   r  r~  rI  r   rT   r  )r   r   rE   rE   rH   r     s    zTiffTag._fix_lsm_bitspersamplec             C   s   d| j  d| j dS )Nz<tifffile.TiffTag z @r   )r
  r;   )r   rE   rE   rH   r     s    zTiffTag.__repr__r6   r  c             C   sR  |dkrdnd| }| j }| jdkr6|d| j d7 }dtj| jd}|rj| j d| d	| j }n| j d	| j }d
| d| d	| j d}|d| }y
| j	}W n t
k
r   d}Y nVX y.| jdkrt|}nttdd |D }W n$ tk
r   t|||d}Y nX |dkrB||d| 7 }|d| }n|d| 7 }|S )z3Return string containing information about TiffTag.r6   rU   r   []r   rE   r  z @zTiffTag NZCORRUPTc             s   s   | ]}t |V  qd S )N)r#   )rF   r  rE   rE   rH   rI   !  s    z"TiffTag.__str__.<locals>.<genexpr>)r  r  r  )r  r  r	  r   r   getallr
  r;   r~  r   r   r#   r*   r  rv   )r   r  r  r  rs   r:   liner   rE   rE   rH   r     s2    





zTiffTag.__str__)NNT)NNT)r6   r  )r   r   r   r   r   r   classmethodr  staticmethodr  r  r  r   r  r  r:   r  r  r  r  r  r  r  rE   rE   rE   rH   r     s&   	O5%&!
 *r   c               @   s   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	d&ddZ
d'ddZd(ddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd)d$d%ZdS )*r   aG  Multidict like interface to TiffTag instances in TiffPage.

    Differences to a regular dict:

    * values are instances of TiffTag.
    * keys are TiffTag.code (int).
    * multiple values can be stored per key.
    * can be indexed with TiffTag.name (str), although slower than by key.
    * iter() returns values instead of keys.
    * values() and items() contain all values sorted by offset stored in file.
    * len() returns the number of all values.
    * get() takes an optional index argument.
    * some functions are not implemented, e.g. update, setdefault, pop.

    )_dict_listc             C   s   i | _ | j g| _dS )zInitialize empty instance.N)r  r  )r   rE   rE   rH   r   &!  s    zTiffTags.__init__c             C   s<   |j }x0| jD ]}||kr|||< P qW | j||i dS )z
Add a tag.N)r
  r  ri   )r   rF  r
  r  rE   rE   rH   r  +!  s    zTiffTags.addc             C   s
   | j  S )zReturn new view of all codes.)r  r  )r   rE   rE   rH   r  5!  s    zTiffTags.keysc             C   s    dd | j D }t|dd dS )z1Return all tags in order they are stored in file.c             s   s    | ]}|  D ]
}|V  qqd S )N)r  )rF   r  rE  rE   rE   rH   rI   ;!  s    z"TiffTags.values.<locals>.<genexpr>c             S   s   | j S )N)r;   )rE  rE   rE   rH   r>  <!  r   z!TiffTags.values.<locals>.<lambda>)rG   )r  rx  )r   r  rE   rE   rH   r  9!  s    zTiffTags.valuesc             C   s    dd | j D }t|dd dS )z>Return all (code, tag) pairs in order tags are stored in file.c             s   s    | ]}|  D ]
}|V  qqd S )N)r  )rF   r  r   rE   rE   rH   rI   @!  s    z!TiffTags.items.<locals>.<genexpr>c             S   s
   | d j S )NrU   )r;   )r   rE   rE   rH   r>  A!  r   z TiffTags.items.<locals>.<lambda>)rG   )r  rx  )r   r  rE   rE   rH   r  >!  s    zTiffTags.itemsNc             C   s<   | j |d|d}|dkr|S y|jS  tk
r6   |S X dS )z,Return value of tag if exists, else default.N)r  r  )rV   r   r   )r   rG   r  r  rF  rE   rE   rH   r3  C!  s    zTiffTags.valueofc             C   s   |dkr.|| j kr| j | S t|ts*|S d}y| j| }W n tk
rP   |S X ||krb|| S t|tsp|S x| D ]}|j|krz|S qzW |S )z3Return tag of code or name if exists, else default.Nr6   )r  r\   r]   r  ru  r  r:   )r   rG   r  r  r  rF  rE   rE   rH   rV   M!  s$    




zTiffTags.getc             C   s   g }x(| j D ]}||kr(|||  qP qW |r6|S t|tsD|S x<| j D ]2}x&| D ]}|j|krZ|| P qZW |sLP qLW |r|S |S )z@Return list of all tags of code or name if exists, else default.)r  ri   r\   r]   r  r:   )r   rG   r  r|   r  rF  rE   rE   rH   r  b!  s"    


zTiffTags.getallc             C   sT   || j kr| j | S t|ts&t|x | j  D ]}|j|kr2|S q2W t|dS )z>Return first tag of code or name. Raise KeyError if not found.N)r  r\   r]   r   r  r:   )r   rG   rF  rE   rE   rH   r  w!  s    



zTiffTags.__getitem__c             C   s   |  | dS )z
Add a tag.N)r  )r   r
  rF  rE   rE   rH   __setitem__!  s    zTiffTags.__setitem__c             C   s   d}x$| j D ]}||kr$d}||= qP qW |r2dS t|tsDt|x:| j D ]0}x*| D ]}|j|krZ||j= d}P qZW P qLW |st|dS )z Delete all tags of code or name.FTN)r  r\   r]   r   r  r:   r
  )r   rG   foundr  rF  rE   rE   rH   __delitem__!  s(    

zTiffTags.__delitem__c             C   sB   || j krdS t|tsdS x | j  D ]}|j|kr(dS q(W dS )zReturn if tag is in map.TF)r  r\   r]   r  r:   )r   r  rF  rE   rE   rH   __contains__!  s    


zTiffTags.__contains__c             C   s   t |  S )zReturn iterator over all tags.)rI  r  )r   rE   rE   rH   r   !  s    zTiffTags.__iter__c             C   s$   d}x| j D ]}|t|7 }qW |S )zReturn number of tags.r6   )r  rc   )r   r<   r  rE   rE   rH   r  !  s    zTiffTags.__len__c             C   s   dt | ddS )Nz<tifffile.TiffTags @0x016Xr   )id)r   rE   rE   rH   r  !  s    zTiffTags.__repr__r6   r  c          
   C   s:  g }g }g }x| D ]}|j |d d}||d|   |dkrt||kry
|j}W n tk
rp   wY nX |dk r|jdkrt|||d d}nt|||d	 d}|jdkr||j	 d
|j
 d|j d|  q||j	 d|  qW |d| |dkr0|r0|d |d| d|S )z.Return string with information about TiffTags.rU   )r  Nr6   rP   )i  i  iD  iE  r   )r  r  r   r  r  z]
r  z

)r  ri   r  rc   r   rv   r
  r*   r  r:   r  r	  )r   r  r  r&  ZtlinesZvlinesrF  r   rE   rE   rH   r  !  s.    


$
zTiffTags.__str__)NN)NN)N)r6   r  )r   r   r   r   r   r   r  r  r  r  r3  rV   r  r  r  r  r  r   r  r  r  rE   rE   rE   rH   r   !  s$   




r   c               @   s   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdddZ	dddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) r   ar  Registry of TIFF tag codes and names.

    The registry allows to look up tag codes and names by indexing with names
    and codes respectively.
    One tag code may be registered with several names, e.g. 34853 is used for
    GPSTag or OlympusSIS2.
    Different tag codes may be registered with the same name, e.g. 37387 and
    41483 are both named FlashEnergy.

    )r  r  c             C   s   i | _ | j g| _| | d S )N)r  r  r   )r   r  rE   rE   rH   r   !  s    
zTiffTagRegistry.__init__c             C   sP   t |tr| j|j dS t |tr.| }x|D ]\}}| || q4W dS )z6Add codes and names from sequence or dict to registry.N)r\   r   r  rM  r^  r  r  )r   r  r
  r:   rE   rE   rH   r   !  s    

zTiffTagRegistry.updatec             C   s`   xZ| j D ]<}||kr"|| |kr"P ||kr||kr|||< |||< P qW | j ||||i dS )zAdd code and name to registry.N)r  ri   )r   r
  r:   r  rE   rE   rH   r  !  s    zTiffTagRegistry.addc             C   s    dd | j D }t|dd dS )z*Return all registry items as (code, name).c             s   s.   | ]&}|  D ]}t|d  tr|V  qqdS )r6   N)r  r\   r   )rF   r  r   rE   rE   rH   rI   "  s    z(TiffTagRegistry.items.<locals>.<genexpr>c             S   s   | d S )Nr6   rE   )r   rE   rE   rH   r>  "  r   z'TiffTagRegistry.items.<locals>.<lambda>)rG   )r  rx  )r   r  rE   rE   rH   r   "  s    zTiffTagRegistry.itemsNc             C   s$   x| j D ]}||kr|| S qW |S )z/Return first code/name if exists, else default.)r  )r   rG   r  r  rE   rE   rH   rV   "  s    zTiffTagRegistry.getc                s     fdd| j D }|r|S |S )z7Return list of all codes/names if exists, else default.c                s   g | ]} |kr|  qS rE   rE   )rF   r  )rG   rE   rH   rG  "  s    z*TiffTagRegistry.getall.<locals>.<listcomp>)r  )r   rG   r  r|   rE   )rG   rH   r  "  s    zTiffTagRegistry.getallc             C   s,   x| j D ]}||kr|| S qW t|dS )z4Return first code/name. Raise KeyError if not found.N)r  r   )r   rG   r  rE   rE   rH   r  "  s    zTiffTagRegistry.__getitem__c             C   sD   d}x.| j D ]$}||krd}|| }||= ||= qW |s@t|dS )z Delete all tags of code or name.FTN)r  r   )r   rG   r  r  r   rE   rE   rH   r  "  s    
zTiffTagRegistry.__delitem__c             C   s    x| j D ]}||krdS qW dS )z&Return if code or name is in registry.TF)r  )r   r  r  rE   rE   rH   r  &"  s    zTiffTagRegistry.__contains__c             C   s   t |  S )z+Return iterator over all items in registry.)rI  r  )r   rE   rE   rH   r   -"  s    zTiffTagRegistry.__iter__c             C   s(   d}x| j D ]}|t|7 }qW |d S )z!Return number of registered tags.r6   rP   )r  rc   )r   r<   r  rE   rE   rH   r  1"  s    zTiffTagRegistry.__len__c             C   s   dt | ddS )Nz<tifffile.TiffTagRegistry @0xr  r   )r  )r   rE   rE   rH   r  8"  s    zTiffTagRegistry.__repr__c             C   s   d ddd |  D S )z.Return string with information about TiffTags.zTiffTagRegistry(((
  {}
))z,
  c             s   s$   | ]\}}d | d|dV  qdS )(z, r  NrE   )rF   r
  r:   rE   rE   rH   rI   >"  s    z*TiffTagRegistry.__str__.<locals>.<genexpr>)r  r	  r  )r   rE   rE   rH   r  ;"  s    zTiffTagRegistry.__str__)N)N)r   r   r   r   r   r   r   r  r  rV   r  r  r  r  r   r  r  r  rE   rE   rE   rH   r   !  s   



r   c            
   @   s   e Zd ZdZd'ddZd(ddZd)d	d
Zd*ddZd+ddZd,ddZ	e
dd Zedd Zedd Zedd Zedd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdS )-r   a0  Series of TIFF pages with compatible shape and data type (same hash).

    Attributes
    ----------
    pages : list of TiffPage, TiffFrame, or None
        Sequence of TiffPages or TiffFrame in series.
        May be None if pages or files of pages are missing in the series.
        The file handles of TiffPages or TiffFrames may not be open.
    keyframe : TiffPage
        A key frame of the series.
    dtype : numpy.dtype
        Data type (native byte order) of the image array in series.
    shape : tuple
        Dimensions of the image array in series.
    axes : str
        Labels of axes in shape. See TIFF.AXES_LABELS.
    offset : int or None
        Position of image data in file if memory-mappable, else None.
    levels : list of TiffPageSeries
        Pyramid levels. levels[0] is 'self'.

    NFTc             C   s"  d| _ || _| g| _|dkr&|d j}|dkr8|d j}|dkrJ|d j}| ||| t|| _|rl|nd| _|rz|nd| _	|| _
tdd |D | _t|
| _|r|| _n|r| jj| _nd| _|	st|dkrt|d j}|dkrtt| j| | _n
t|| _n
t|| _dS )zInitialize instance.r6   Nr  c             s   s   | ]}|d k	r|j V  qd S )N)r  )rF   r  rE   rE   rH   rI   y"  s    z*TiffPageSeries.__init__.<locals>.<genexpr>rU   )r  _pagesr  rz   r   rs   r{  rr   ra  r:   r+  r  r  r   is_multifilerI  rc   r+   r   _len)r   rO   rz   rs   r   rI  r:   r+  ra  r*  rA   r  r   rE   rE   rH   r   Z"  s6    




zTiffPageSeries.__init__c             C   sX   t |}d|}|| _|| _t||\| _| _|r:| jn| j| _|rL| jn| j| _dS )zSet shape and axes.r  N)	r  r	  _shape_expanded_axes_expandedr/   _shape_squeezed_axes_squeezedrz   r   )r   rz   r   r  rE   rE   rH   r{  "  s    
zTiffPageSeries.set_shape_axesc             C   s   |dkr| j S |r| jS | jS )z,Return default, squeezed, or expanded shape.N)rz   r  r  )r   r  rE   rE   rH   r  "  s    zTiffPageSeries.get_shapec             C   s   |dkr| j S |r| jS | jS )z+Return default, squeezed, or expanded axes.N)r   r  r  )r   r  rE   rE   rH   ry  "  s    zTiffPageSeries.get_axesc             K   sR   |dk	r| j | jf |S | jrN| jjf d| i|}| jdk	rJ| |}|S dS )z;Return image data from series of TIFF pages as numpy array.Nr   )r  re   rI  r+  )r   r   rg   r|   rE   rE   rH   re   "  s    

zTiffPageSeries.asarrayc             K   s   | j rt| fd|i|S dS )z<Return image data from series of TIFF pages as zarr storage.r   N)rI  r   )r   r   rg   rE   rE   rH   rd   "  s    zTiffPageSeries.aszarrc             C   s   | j s
dS d}x^| j D ]T}|dkr&dS |js0dS |sJ|jd |jd  }q||jd kr\dS ||jd 7 }qW | j d }|jd }|js|js|jrt| j dkr|S ||t| j| j	j
  kr|S dS )z-Return offset to series data in file, if any.Nr6   rU   )r  r  r   r  r  r  rc   r+   rz   rs   rt   )r   r   r   r;   rE   rE   rH   r;   "  s.    

zTiffPageSeries.offsetc             C   s   t | jdkS )z)Return if series contains several levels.rU   )rc   r  )r   rE   rE   rH   r2  "  s    zTiffPageSeries.is_pyramidalc             C   s
   t | jS )z"Return number of array dimensions.)rc   rz   )r   rE   rE   rH   r  "  s    zTiffPageSeries.ndimc             C   s   t t| jS )z#Return number of elements in array.)r   r+   rz   )r   rE   rE   rH   r<   "  s    zTiffPageSeries.sizec             C   s   | S )z'Return sequence of all pages in series.rE   )r   rE   rE   rH   rO   "  s    zTiffPageSeries.pagesc             C   sj   t |}|dk r|| j; }t| jdkr`d|  k r>| jk r`n n| jd j}| jj|| S | j| S )z3Return specified page of series from cache or file.r6   rU   )r   r  rc   r  r  rI  rO   r  )r   rG   r  rE   rE   rH   r  "  s    
(zTiffPageSeries._getitemc                sj   t |ttjfr |S t |trB fddt| j D S t |t	r^ fdd|D S t
ddS )zReturn specified page(s).c                s   g | ]}  |qS rE   )r  )rF   r   )r   rE   rH   rG  "  s    z.TiffPageSeries.__getitem__.<locals>.<listcomp>c                s   g | ]}  |qS rE   )r  )rF   r  )r   rE   rH   rG  "  s    z*key must be an integer, slice, or iterableN)r\   r   rr   rK  r  r  rw  r  r  r7   rW   )r   rG   rE   )r   rH   r  "  s    


zTiffPageSeries.__getitem__c             c   sX   t | j| jkr| jE dH  n6| jj}| jd j}x t| jD ]}|||  V  q>W dS )z%Return iterator over pages in series.Nr6   )rc   r  r  rI  rO   r  rw  )r   rO   r  r   rE   rE   rH   r   "  s    zTiffPageSeries.__iter__c             C   s   | j S )z!Return number of pages in series.)r  )r   rE   rE   rH   r  #  s    zTiffPageSeries.__len__c             C   s   d| j  dS )Nz<tifffile.TiffPageSeries r   )r  )r   rE   rE   rH   r  
#  s    zTiffPageSeries.__repr__c             C   s   d dd | jrt| jdndd dd | jD t| j| j| j| jrZt	| j
 dndt	|  d	| jrzd
| j ndfD }d| j d| S )z4Return string with information about TiffPageSeries.z  c             s   s   | ]}|r|V  qd S )NrE   )rF   r   rE   rE   rH   rI   #  s   
z)TiffPageSeries.__str__.<locals>.<genexpr>   r  r=  c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   #  s    z Levelsz Pages@zTiffPageSeries )r	  r:   r  rz   r]   rs   r   ra  r2  rc   r  r;   r  )r   r   rE   rE   rH   r  #  s    zTiffPageSeries.__str__)
NNNNNNNFFT)T)N)N)N)N)r   r   r   r   r   r{  r  ry  re   rd   r%   r;   r  r2  r  r<   rO   r  r  r   r  r  r  rE   rE   rE   rH   r   B"  s6            
%







r   c               @   s   e Zd ZdZd1ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 ZdS )2r   a  Zarr storage base class.

    ZarrStore instances must be closed using the 'close' method, which is
    automatically called when using the 'with' context manager.

    https://zarr.readthedocs.io/en/stable/spec/v2.html
    https://forum.image.sc/t/multiscale-arrays-v0-1/37930

    Nc             C   s@   i | _ |dkrdn|| _|dkr.td| _nttj|| _dS )zInitialize ZarrStore.Nr6   )_store
_fillvaluer   	CHUNKMODE
_chunkmoder"   )r   	fillvalue	chunkmoderE   rE   rH   r   +#  s
    zZarrStore.__init__c             C   s   | S )NrE   )r   rE   rE   rH   r  4#  s    zZarrStore.__enter__c             C   s   |    d S )N)r  )r   r  r  r  rE   rE   rH   r  7#  s    zZarrStore.__exit__c             C   s   |    d S )N)r  )r   rE   rE   rH   __del__:#  s    zZarrStore.__del__c             C   s   dS )zClose ZarrStore.NrE   )r   rE   rE   rH   r  =#  s    zZarrStore.closec             C   s   t ddS )zFlush ZarrStore.zZarrStore is read-onlyN)PermissionError)r   rE   rE   rH   r  @#  s    zZarrStore.flushc             C   s   t ddS )zClear ZarrStore.zZarrStore is read-onlyN)r  )r   rE   rE   rH   clearD#  s    zZarrStore.clearc             C   s
   | j  S )zReturn keys in ZarrStore.)r  r  )r   rE   rE   rH   r  H#  s    zZarrStore.keysc             C   s
   | j  S )zReturn items in ZarrStore.)r  r  )r   rE   rE   rH   r  L#  s    zZarrStore.itemsc             C   s
   | j  S )zReturn values in ZarrStore.)r  r  )r   rE   rE   rH   r  P#  s    zZarrStore.valuesc             C   s   t | j S )N)rI  r  r  )r   rE   rE   rH   r   T#  s    zZarrStore.__iter__c             C   s
   t | jS )N)rc   r  )r   rE   rE   rH   r  W#  s    zZarrStore.__len__c             C   s   t dd S )NzZarrStore is read-only)r  )r   rG   rE   rE   rH   r  Z#  s    zZarrStore.__delitem__c             C   s
   || j kS )N)r  )r   rG   rE   rE   rH   r  ]#  s    zZarrStore.__contains__c             C   s   t dd S )NzZarrStore is read-only)r  )r   rG   r   rE   rE   rH   r  `#  s    zZarrStore.__setitem__c             C   s   || j kr| j | S | |S )N)r  r  )r   rG   rE   rE   rH   r  c#  s    

zZarrStore.__getitem__c             C   s   t dS )zReturn chunk from file.N)rz  )r   rG   rE   rE   rH   r  h#  s    zZarrStore._getitemc             C   s   d| j d kS )z#Return if ZarrStore is multiscales.s   multiscalesz.zattrs)r  )r   rE   rE   rH   is_multiscalesl#  s    zZarrStore.is_multiscalesc             C   s>   |dks|dkr"t t| |j S t| |}||dd< |S )zReturn empty chunk.Nr6   )r   r+   rt   rr   empty)rz   rs   r  r  rE   rE   rH   _empty_chunkq#  s
    zZarrStore._empty_chunkc             C   s2   | j dkrd}ndddtj }|| jdd  S )z.Return dtype as string with native byte order.rU   r   r   r   )bigr   N)rt   r   rk   r]   )rs   rk   rE   rE   rH   r  z#  s    
zZarrStore._dtypec             C   s   t j| ddddddS )z)Serialize obj to a JSON formatted string.rU   T),z: )indent	sort_keysensure_ascii
separatorsr   )jsondumpsr   )rX  rE   rE   rH   _json#  s    zZarrStore._jsonc             C   s   | dkr| S |j dkrt| S |j dkr0t| S |j dkrlt| rHdS t| rVdS t| rddS t| S |j dkrt| |} t	
| j| jjt	
| j| jjfS | S )	z+Return value which is serializable to JSON.Nbuir   NaNInfinityz	-Infinityr1  )ra  r   r   rr   isnanZisposinfZisneginfrq  r  r   r{  realr  rs   imag)r   rs   rE   rE   rH   r{  #  s&    






zZarrStore._valuec             c   sZ   t | t |ksttdd t| |D }x(t|D ]}ddd |D V  q8W dS )z-Return iterator over all chunk index strings.c             s   s*   | ]"\}}|| || rd nd V  qdS )rU   r6   NrE   )rF   r   r  rE   rE   rH   rI   #  s    z%ZarrStore._ndindex.<locals>.<genexpr>.c             s   s   | ]}t |V  qd S )N)r]   )rF   r  rE   rE   rH   rI   #  s    N)rc   AssertionErrorr  rx  rr   Zndindexr	  )rz   rR  rS  r  rE   rE   rH   _ndindex#  s
    zZarrStore._ndindex)NN)r   r   r   r   r   r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r{  r  rE   rE   rE   rH   r    #  s0   	
			r   c                   s`   e Zd ZdZd fdd	Zdd Zddd	Zd
d Zdd Zdd Z	e
dd Zdd Z  ZS )r   zZarr storage interface to image data in TiffPage or TiffPageSeries.

    ZarrTiffStore instances are using a TiffFile instance for reading and
    decoding chunks. Therefore ZarrTiffStore instances cannot be pickled.

    Nc
                sj  t  j||d | jdkr*t| jd|| _|dkr<dnt|| _t|dd| _t|dt	|gg| _
|dk	r| j
| g| _
|dkr| j
d jjjj}
d|
_|
j}t|	|d	| _|dkri nt|}t| j
d
krtddi| jd< tddd tt| j
D i |jddgi|| jd< xt| j
D ]\}}|jj ||}|j}|dkrj|jj | _}| jr||jj}n|jj }td|t!"||t#|dt$||ddd| j| d< q2W n| j
d }|jj ||}|j}|dkr|jj | _}| jr|jj}n|jj }t|| jd< td|t!"||t#|dt$||ddd| jd< dS )ak  Initialize Zarr storage.

        Parameters
        ----------
        arg : TiffPage or TiffPageSeries
            The TiffPage or TiffPageSeries instance to wrap as a zarr store.
        level : int (optional)
            Specifies a pyramidal level to wrap.
        chunkmode : {0, 2} (optional)
            Specifies to use strips/tiles (0, the default) or whole page data
            (2) as chunks.
        fillvalue : number (optional)
            Value to use for missing chunks of the Zarr store. Default: 0.
        zattrs : dict (optional)
            Additional attributes to store in .zattrs.
        lock : {RLock, NullContext} (optional)
            A reentrant lock used to synchronize seeks and reads from file.
            If None (default), the lock of the parent's filehandle is used.
        squeeze : bool (optional)
            Squeeze shape of TiffPageSeries.
        maxworkers : int or None
            Maximum number of threads to concurrently decode strips or tiles
            if chunkmode=2.  If None (default), up to half the CPU cores are
            used. See remarks in TiffFile.asarray.

        )r  r  )r6   rP   z not implementedNr+  r  r6   T)r<   rA  rU   zarr_formatrP   z.zgroupZmultiscalesc             S   s   g | ]}d t |iqS )rt  )r]   )rF   r   rE   rE   rH   rG  #  s   z*ZarrTiffStore.__init__.<locals>.<listcomp>z0.1)Zdatasetsr  r:   r  z.zattrsr   )r  rz   rR  rs   rA  
fill_valueorderfiltersz/.zarrayz.zarray)%r   r   r  rz  _maxworkersr   _squeezer   
_transformr   _datar  rI  r  r   rA  r   
_filecacher^  rc   r   r  r  rw  r:   r}  rn  r  rs   r  r  rz   rR  r   _chunksr  r{  )r   r  r   r  r  zattrsrA  r  r  Z
_openfilesr   r   rz   rs   rR  )r   rE   rH   r   #  s|    &












zZarrTiffStore.__init__c             C   s   t | dr| j  dS )zClose ZarrTiffStore.r  N)r`   r  r  )r   rE   rE   rH   r  7$  s    
zZarrTiffStore.closeFc       %      C   s  dddddddddd	d	d	dd	d
dddddd|dkr8i n|}x| j D ]}d}|j}	|	j|krvt|	jd| |	jdkrt|	jd| |	jdkrt|	jd| |	jdkr|	jdkrtd|	j d| | js|	js|	j	|	j
 rtd| | jr*|	js*t| jd| |	jdk	rHt|jdkrHtd| qHW |dkrbd}n|r~|d dkr~|d7 }|dkrd}n|r|d dkr|d7 }tjdkrdnd}
| j d jjj|
ks| j d jjjdkrd}
t }|dkr|rtdd|d < i |d!< g |d"< i }| j d jrd}x| j d jD ]\}|dkrZqH|jjjj}||krtqHd#| }d$| ||< || |d! |< |d7 }qHW n2| j d jjjj}d#}d$| ||< || |d! |< t  |d%< }n|}|r|std&d'i |d(< x| j D ]\}}d)|krd|krPt|dd nd}| j | j}	t |}||	j }|dkr|	j}|dk	rddl!}|"| }|	j#}|dk	rddl!}|"| }t$|	j%|	j&|	j'\}}||||	j||d*|d+< n|dk	rd,|i|d+< |	j(dkr|	j(d-kr.d.}nd/}|	j(d0krDd}n|	j(d1krVd'}nd2}|	j&dkrx|	j)dkrxd3}nd}||||d4 |d5 d6g|d7< |
dk	r|
|d5 dd  |d5< t|}| ||| < q W t*|d8r|}n
t+|d9}|dkr,|,tj-|dd:.d;dd d;  d<}nR|r^|,d= |,tj-|dd:d'd3  d>}n |,tj-|dd:dd3  d>}x| j D ]\}}d)|krt |}|d? }|d4 } d|kr|dd d nd}xt/|| D ]}!||! }| 0|\}	}}"}#}$|r0| jr0|#dkr0|j1d }#|	j2}$|#r|$r|	jjj}|dkrZ|| }n| | }|,d=| d@| | dA| dB|# dC|$ dD qW qW |dkr|,dE n|s|,dF t*|d8s|3  dS )Ga  Write fsspec ReferenceFileSystem as JSON to file.

        Url is the remote location of the TIFF file without the file name(s).

        Raise ValueError if TIFF store can not be represented as
        ReferenceFileSystem due to features that are not supported by zarr,
        numcodecs, or imagecodecs:

        * compressors, e.g. CCITT
        * filters, e.g. bitorder reversal, packed integers
        * dtypes, e.g. float24
        * JPEGTables in multi-page files
        * incomplete chunks, e.g. if imagelength % rowsperstrip != 0

        Files containing incomplete tiles may fail at runtime.

        https://github.com/intake/fsspec-reference-maker

        NzliblzmaZzstdZimagecodecs_lzwimagecodecs_jpegimagecodecs_jpegxrZimagecodecs_packbitsimagecodecs_jpeg2kZimagecodecs_lercimagecodecs_pngimagecodecs_webpimagecodecs_jpegxl)rU   r   i  im  iP  r   r   iRX  i  i  i  i  i  i  iG  iL  iu  iv  iQ  iR  z0 not supported by the fsspec ReferenceFileSystemz isrU   )rU   rP   rC   r   )r   r   r  r4  r7  )r   i  iL  zBitsPerSample zincomplete chunks arez"JPEGTables in multi-page files arer  r   /r  r   r   r6   zcannot append to version 1r  	templatesgenr   z{{%s}}refsr  rP   z.zgroupz.zarray)r  r*  r  r  colorspace_jpegcolorspace_datarA  r  )rP   iL  iM  Zimagecodecs_deltaZimagecodecs_floatpredrC   )iL  iN  r   r   rR  rs   )r  r?  distrz   rs   r  rw   r  )r  z}"z  z,
r  rz   r  z": ["z", z, r  z
 }
}z
})4r  r  rp   r_   r8  r  r  r  r;  r}  r  r  r  rc   rO   r   rk   rI  rs   rt   r^  r  r   r:   r   r  rn  r  r  r   r  r  loadsbase64	b64encoder  r?  r  r  r  rB  r  r`   rw  rw   r  rsplitr  
_parse_keyr  ru   r  )%r   r  url	groupnameZcompressorsr  _appendr   Zerrormsgr  rk   r  r  r   r   r  rG   refzarrr   r   codec_idr*  r  r  r  r  Z	filter_idr  r?  r   r  rz   rR  
chunkindexr   r;   r;  rE   rE   rH   write_fsspec<$  sV   









 









$


 



6

zZarrTiffStore.write_fsspecc             C   s\  |  |\}}}}}| jr"|j}n|j}|dks@|dks@|dkrjt||j| j}| jdk	rf| |}|S |j	j
}	| jr|dkr| j|	 |j| jj| jd}| j|	 | jdk	r| |}|S | j|	||}ddi}
|jdk	r|j|
d< |jdk	r|j|
d< |j||f|
d }| jdk	r0| |}|jt|krXt|j dt| |S )	zReturn chunk from file.Nr6   )rA  r  r.  Tr  r  z != )r  r  rz   rR  r   r  rs   r  r  rI  r   r  rw  re   rA  r  r  r  r  r  rn  r<   r+   r   )r   rG   r  r   r  r;   r;  rR  r  r   r@  rE   rE   rH   r  <%  s>    







zZarrTiffStore._getitemc       
   	   C   sz  t | jdkr,|d\}}| jt| }n
| jd }|j}| ||\}}|dkrt |dkr|jdkrrtd|d }|dkr|d|ddfS ||j |j	j
 }||j| 7 }| jr|j|j	j
 }	|j||||	fS n| jr"| jj || }W dQ R X |dkr|ddddfS |j|dddfS | jj || }W dQ R X |dkrV|d|ddfS |j| }|j| }	|j||||	fS )z=Return keyframe, page, index, offset, and bytecount from key.rU   r  r6   Nz"truncated series is not contiguous)rc   r  r  r   r  _indicesr;   r   r<   rs   rt   r  r  r  rA  r  )
r   rG   r   r   r  r  r  r   r;   r;  rE   rE   rH   r  i%  s<    







zZarrTiffStore._parse_keyc             C   s  |j }|| j}dd |dD }t|t|ks:t| jrPdt|j }n|j}d}xzt	|ddd D ]`\}}	||	9 }||j
krnt|| d }|d| }
||d }|d| }t||d }P qnW tt|t|jkr|}nt|d }t|jd }xn|| |j| kr<|| ||< |d8 }|d8 }n || dkrT|d8 }ntd|d	k sp|d	k r
P q
W t|t|kstt|
d	krtt|
|}nd	}t|d	krtt||}nd	}||fS )
z5Return page and strile indices from zarr chunk index.c             S   s   g | ]}t |qS rE   )r   )rF   r   rE   rE   rH   rG  %  s    z*ZarrTiffStore._indices.<locals>.<listcomp>r  )rU   rU   Nr   zshape does not match page shaper6   )r  r  r  r  rc   r  r  rz   rS  r}  r<   r  r   r+   r   rr   rs  )r   rG   r   r  rz   r  rS  r  r   r   Zframes_indicesZstrile_indicesZframes_chunkedZstrile_chunkedr  Z
frameindexZstrileindexrE   rE   rH   r  %  sT    


zZarrTiffStore._indicesc             C   s0  t |}|dkrdS d|kr$d| S g }|d }t | d }x|dk rZ|d |d8 }n|| dkr| | dkr|| |  |d8 }|d8 }np|| | | kr|d |d8 }|d8 }nD|| dkr|d |d8 }n$| | dkr|d |d8 }nt|dk s|t |kr>P q>W t|ddd S )z(Return chunks with same length as shape.r6   rE   )rU   rU   Nr   )rc   ri   r   r  )rR  rz   r  Z	newchunksr   r  rE   rE   rH   r  %  s<    








zZarrTiffStore._chunksc             C   s   dt | ddS )Nz<tifffile.ZarrTiffStore @0xr  r   )r  )r   rE   rE   rH   r  %  s    zZarrTiffStore.__repr__)NNNNNNNN)NNNF)r   r   r   r   r   r  r  r  r  r  r  r  r  r   rE   rE   )r   rH   r   #  s(          s	   
 z-%6$r   c                   sL   e Zd ZdZd fdd	Zdd Zdd Zdd
dZdd Zdd Z	  Z
S )r   z5Zarr storage interface to image data in FileSequence.Nc       
         sv  t  j||d | jdkr*td| jt|ts<td|jrJtd|| _	|j
| _i | _| | _|dksx|dkr|j
|jd f|}	|	j| _|	j| _nt|| _t|| _d}	t|j| j|| _tt| j|j|j| _|	dk	r|	| jt| j|jdd < |dkri nt|}t|| jd	< td
| jj| jj t| jdt!|| jddd| jd< dS )a  Initialize Zarr storage from FileSequence.

        Parameters
        ----------
        arg: FileSequence
            FileSequence instance to wrap as zarr store. Files in containers
            are not supported.
        fillvalue : number (optional)
            Default value to use for missing chunks of the Zarr store.
            Default: 0.
        chunkmode: {0, 3} (optional)
            Currently only one chunk per file is supported.
        chunkshape : tuple of int (optional)
            Shape of the chunk in each file.
            Must match `arg.imread(file, **kwargs).shape`.
        dtype : numpy.dtype (optional)
            Data type of the chunk in each file.
            Must match `arg.imread(file, **kwargs).dtype`.
        axestiled: dict (optional)
           Defines the axes to be tiled. Map stacked sequence axis to
           chunk axis.
        zattrs : dict
            Additional attributes to store in .zattrs.
        kwargs: dict
            Additional parameters passed to the FileSequence.imread function.

        Notes
        -----
        If chunkshape or dtype are None (default), their values are determined
        by reading the first file using `arg.imread(arg.files[0], **kwargs)`.

        )r  r  )r6   rC   zinvalid chunkmode znot a FileSequencez%cannot open container as zarr storageNr6   rU   z.zattrsrP   r   )r  rz   rR  rs   rA  r  r  r  z.zarray)"r   r   r  r_   r\   r   rW   
_containerrz  _kwargsr   _imreadr  
commonpath_commonpathrf   rz   r  rs   r  r  rr   TiledSequence_tiledr^  rx  r  _lookupr  r   r  r  rR  r{  )
r   r  r  r  
chunkshapers   	axestiledr  rg   r  )r   rE   rH   r   %  sB    +





 
zZarrFileSequenceStore.__init__c             C   s   t dd |dD }|| jkr,| j| S | j  | j|d}|dkrbt| j| j	| j
}n| j|f| j}|| j|< |S )zReturn chunk from file.c             s   s   | ]}t |V  qd S )N)r   )rF   r   rE   rE   rH   rI   J&  s    z1ZarrFileSequenceStore._getitem.<locals>.<genexpr>r  N)r  r  r  r  r  rV   r   r  r  r  r  r  r  )r   rG   r  r   r  rE   rE   rH   r  H&  s    



zZarrFileSequenceStore._getitemc             C   s   | j   dS )zClear chunk cache.N)r  r  )r   rE   rE   rH   r  X&  s    zZarrFileSequenceStore.closeFc             C   s  ddl m} | j }|dk	r n| jtkr0d}nd| jjkr| jjdksRd| jkrZtd|	d}	t
|	ttfrz|	d }	t|	r|	jd	d }	d
dddddddddddddd|	 }ntd|dkrd}n|r|d dkr|d7 }|dkrd}n|r|d dkr|d7 }t }
|dkr`|r0tdd|
d< d|i|
d< g |
d< t  |
d < }d!}n|
}|r|std"d#i |d$< xV| j D ]H\}}d%|krt|}d&|i||d'< t|}| ||| < qW t|d(r|}n
t|d)}|dkr.|tj|
dd*d+dd d+  d,}nR|r`|d- |tj|
dd*d#d.  d/}n |tj|
dd*dd.  d/}t| j}x| j D ]\}}d%|krt|}xt| j d0d1 d2D ]v\}}|||d  d3d}|d dkr|dd }d4!d5d6 |D }|d-| d7| | d8| | d9	 qW qW |dkr`|d: n|sp|d; t|d(s|"  dS )<zWrite fsspec ReferenceFileSystem as JSON to file.

        Url is the remote location of the files without the file names.

        r6   )quoteNtifffilezimagecodecs.r   codeczcan not determine codec_idr   Zimagecodecs_avifZimagecodecs_gifr  r  Zimagecodecs_jpeglsr  r  Zimagecodecs_ljpegr  Zimagecodecs_tiffr  Zimagecodecs_zfp)ZavifZgifjpegZjpeg8Zjpeg12Zjpeg2kZjpeglsZjpegxlZjpegxrZljpegZpngr   ZwebpZzfpr  r   r  rU   z"cannot append when using version 1r  r   r  r  r  z{{u}}r  rP   z.zgroupz.zarrayr  rA  rw   r  )r  z}"z  z,
r   r  c             S   s   | d S )Nr6   rE   )r=  rE   rE   rH   r>  &  r   z4ZarrFileSequenceStore.write_fsspec.<locals>.<lambda>)rG   \r  c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   &  s    z5ZarrFileSequenceStore.write_fsspec.<locals>.<genexpr>r  z": ["z"]z
 }
}z
})#urllib.parser  r  ri  r  r   r   r   r_   r[   r\   r  r  callabler  r^  r   r  rn  r  r  r  r  r`   rw  rw   r  r  rc   r  rx  r  rz  r	  r  )r   r  r  r  r  r  r  r  rg   r  r  r  rG   r   r   r  prefixr  r   rE   rE   rH   r  \&  s    









$



.

z"ZarrFileSequenceStore.write_fsspecc             C   s   dt | ddS )Nz#<tifffile.ZarrFileSequenceStore @0xr  r   )r  )r   rE   rE   rH   r  &  s    zZarrFileSequenceStore.__repr__c          
   C   s\   d | jjdd dd | jjD dd dd | jjD d| j d	| j fS )
z"Return information about instance.z
 z	shape: {}z, c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   &  s    z0ZarrFileSequenceStore.__str__.<locals>.<genexpr>z
chunks: {}c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   &  s    zdtype: zfillvalue: )	r	  r   r   r  r  rz   rR  r  r  )r   rE   rE   rH   r  &  s    
zZarrFileSequenceStore.__str__)NNNNNN)NNNF)r   r   r   r   r   r  r  r  r  r  r   rE   rE   )r   rH   r   %  s        Q   
wr   c               @   sp   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdddZdd Zdd ZdS )r   a  Series of files containing array data of compatible shape and type.

    Attributes
    ----------
    files : list
        List of file names.
    shape : tuple
        Shape of file series. Excludes shape of chunks in files.
    axes : str
        One letter labels of axes in shape.
    labels : tuple of str
        Labels of axes in shape.
    indices : tuple of tuples
        ND indices of files in shape.

    Nc          
      s  |dkrd}|dkrt }|_|rddl}t|ttjfrPddl}||_nt	jdsdt
dt|tr|j |}|r||}n:t|tjrt|g}n t|trt|}|r||}dd |D }|st
dt	|d	rt|jst
d
|  fdd}nt|s&t
d
|r>|  fdd}|dkrZ|ddrZt}|ry||f|\}	}
}}W n. t
k
r } zt
d|W dd}~X Y nX n(d}	t|f}
tdd tt|D }|_|_ddd |	D  _t|	_t|
_|_dS )ag  Initialize instance from multiple files.

        Parameters
        ----------
        imread : function or class
            Array read function or class with asarray function returning numpy
            array from single file.
        files : str, path-like, or sequence thereof
            Glob filename pattern or sequence of file names. Default: \*.
            Binary streams are not supported.
        container : str or container instance (optional)
            Name or open instance of ZIP file in which files are stored.
        sort : function (optional)
            Sort function used to sort file names when 'files' is a pattern.
            The default (None) is the natural_sorted function.
            If False, disable sorting.
        parse : func (optional)
            Parse function used to parse the sequence of sorted file names to
            axes labels, shape, chunk indices, and filtered file names.
            The default (None) is the parse_filenames function if kwargs
            contains 'pattern'.
        kwargs : dict
            Additional arguments passed to the parse function.

        NrR   r6   rw  zinvalid containerc             S   s   g | ]}t |qS rE   )ra   fspath)rF   r   rE   rE   rH   rG  ;'  s    z)FileSequence.__init__.<locals>.<listcomp>zno files foundre   zinvalid imread functionc          	      s     | }|j f |S Q R X d S )N)re   )r  rg   handle)_imread_rE   rH   r   E'  s    
z%FileSequence.__init__.<locals>.imreadc          
      s>   j | (}t| } |f|S Q R X W d Q R X d S )N)r  rw  r{  r|  r  )r  rg   Zhandle1Zhandle2)r  r   rE   rH   r   P'  s    rL   zfailed to parse file names)r8  c             s   s   | ]}|fV  qd S )NrE   )rF   r   rE   rE   rH   rI   `'  s    z(FileSequence.__init__.<locals>.<genexpr>r  c             s   s   | ]}|d  V  qdS )r6   NrE   )rF   r^  rE   rE   rH   rI   d'  s    )r'   r  fnmatchr\   r]   ra   rb   zipfileZipFiler`   r_   filternamelistr  r^   r  re   rV   parse_filenamesrc   r  rw  r   rf   r	  r_  r   r'  rz   r  )r   r   rf   rJ   rK   parserg   r  r  r'  rz   r  r   rE   )r  r   rH   r    '  sf    "







zFileSequence.__init__c             C   s   t | jt| j S )zReturn number of empty chunks.)r+   rz   rc   rf   )r   rE   rE   rH   files_missingi'  s    zFileSequence.files_missingc             C   s   | j rt| j n| jd }tj|d }d| jj|dt	| j d| j
 dddd	d
 | jD dddd
 | jD fS )z7Return string with information about file FileSequence.r6   r   z
 zfiles: z (z	 missing)z	shape: {}z, c             s   s   | ]}t |V  qd S )N)r]   )rF   r   rE   rE   rH   rI   w'  s    z'FileSequence.__str__.<locals>.<genexpr>z
labels: {}c             s   s   | ]
}|V  qd S )NrE   )rF   r   rE   rE   rH   rI   x'  s    )r  r]   rf   ra   rt  r  r	  r   r   rc   r  r  rz   r'  )r   rx   rE   rE   rH   r  n'  s    zFileSequence.__str__c             C   s   dt | ddS )Nz<tifffile.FileSequence @0xr  r   )r  )r   rE   rE   rH   r  }'  s    zFileSequence.__repr__c             C   s
   t | jS )N)rc   rf   )r   rE   rE   rH   r  '  s    zFileSequence.__len__c             C   s   | S )NrE   )r   rE   rE   rH   r  '  s    zFileSequence.__enter__c             C   s   |    d S )N)r  )r   r  r  r  rE   rE   rH   r  '  s    zFileSequence.__exit__c             C   s   | j r| j   d | _ d S )N)r  r  )r   rE   rE   rH   r  '  s    
zFileSequence.closerU   c          	      s  |dk	rJt jdtdd t|ttjfr<jj| f S j|f S t	jdk r^d}n*|dksn|dk rddl
}t| d d}jjd f }|rFtj|j|}t||j|jd fd	d
}	|dk rxdt|jjD ]\}
}|	|
| qW n8t|*}x"||	|jjD ]}q0W W dQ R X nj|j }t|||jdjd|j  fdd
}	|dk rxZtjjD ]\}
}|	|
| qW n2t|$}x||	jjD ]}qW W dQ R X |_S )a  Read image data from files and return as numpy array.

        Raise IndexError or ValueError if array shapes do not match.

        Parameters
        ----------
        file : int or str (optional, deprecated)
            Index or name of single file to read.
        axestiled: dict (optional)
           Defines the axes to be tiled. Map stacked sequence axis to
           chunk axis.
        ioworkers : int  (optional)
            Maximum number of threads to execute the array read function
            asynchronously. Default: 1.
            If None, default to the number of processors multiplied by 5.
            Using threads can significantly improve runtime when
            reading many small files from a network share.
        out : numpy.ndarray, str, or file-like object (optional)
            Buffer where image data are saved.
            If None (default), a new array is created.
            If numpy.ndarray, a writable array of compatible dtype and shape.
            If 'memmap', create a memory-mapped array in a temporary file.
            If str or open file, the file name or file object used to
            create a memory-map to an array stored in a binary file on disk.
        kwargs : dict
            Additional parameters passed to the array read function.

        NzT<tifffile.FileSequence.asarray> the 'file' parameter is deprecated since 2021.10.12.rP   )rQ   rU   r6   r   )rs   c                s   j |f | < d S )N)r   )r  r  )rg   r|   r   rE   rH   r   '  s    z"FileSequence.asarray.<locals>.funcr   c                s8   | d krd S t t| j} j|f }|| < d S )N)r   rr   rs  rz   r   )r  r  im)rg   r|   r   rE   rH   r   '  s
    )r   )rX   rY   rZ   r\   r   rr   rK  r   rf   rc   multiprocessingr  	cpu_countr  rz   r!   rs   rx  r  r  r9   rC  rh  )r   rx   r  Z	ioworkersr  rg   r  r  tiledr   r  r  rE  r   rz   rE   )rg   r|   r   rH   re   '  sL    $



zFileSequence.asarrayc             K   s   t | f|S )z-Return image data from files as zarr storage.)r   )r   rg   rE   rE   rH   rd   '  s    zFileSequence.aszarrc             C   s4   t | jdkr"tj| jd }ntj| j}|S )z8Return longest common sub-path of each file in sequence.rU   r6   )rc   rf   ra   rt  ro  r  )r   r  rE   rE   rH   r  '  s    zFileSequence.commonpath)NNN)NNrU   N)r   r   r   r   r   r  r  r  r  r  r  r  r  re   rd   r  rE   rE   rE   rH   r   &  s"     
c   
ar   c                   s.   e Zd ZdZdef fdd	Zdd Z  ZS )r
   zSeries of TIFF files.Nc                s"   t  j||dkrdn|f| dS )z-Initialize instance from multiple TIFF files.Nz*.tif)r   r   )r   rf   r   rg   )r   rE   rH   r   (  s    zTiffSequence.__init__c             C   s   dt | ddS )Nz<tifffile.TiffSequence @0xr  r   )r  )r   rE   rE   rH   r  (  s    zTiffSequence.__repr__)r   r   r   r   r   r   r  r   rE   rE   )r   rH   r
   (  s   r
   c               @   sB   e Zd ZdZdddZdd Zdd Zed	d
 Zedd Z	dS )r  a  Tiled Sequence.

    Transform a sequence of stacked chunks to tiled chunks.

    Attributes
    ----------
    shape : tuple of int
        Shape of the tiled sequence.
    chunks : tuple of int
        Shape of the chunks in the tiled sequence.

    Examples
    --------
    >>> ts = TiledSequence((1, 2), (3, 4), {1: 0})
    >>> ts.shape
    (1, 6, 4)
    >>> ts.chunks
    (1, 3, 4)

    Nc       	      C   sB  t || _t || _t|t| | _|rt|}x"| D ]\}}|| j ||< q>W ttt| | _	t
| j}dg| j t
| }t }xR| j	D ]H\}}||ks||krtd|| || ||  || 9  < qW x| j	D ]\}}||= ||= qW t|| _t|| _n"d| _	| j| _d| j t| | _dS )a  Initialize from shape of stacked sequence and axes to be tiled.

        Parameters
        ----------
        stackshape : tuple of int
            Shape of the stacked sequence excluding chunks.
        chunkshape : tuple of int
            Shape of the chunks excluding stack axes.
        axestiled: dict (optional)
           Defines the axes to be tiled. Map stacked sequence axis to
           chunk axis.

        rU   zduplicate axisrE   )rU   N)rc   
_stackdims
_chunkdimsr  _stackshaper^  r  r%  rx  
_axestiledr  setr_   r  rz   rR  )	r   Z
stackshaper  r  ax0ax1rz   rR  usedrE   rE   rH   r   "(  s2    






zTiledSequence.__init__c             c   s   dg| j  }x|D ]}|dkr&dV  qt|| jkrLtt| d| j t|| }x| jD ]\}}|| ||< q`W x| jD ]\}}||= qW t|V  qW dS )zReturn iterator over chunk indices of tiled sequence.

        Parameters
        ----------
        indices : sequence of tuple of int
            Indices of chunks in the stacked sequence.

        r6   Nz != )r  rc   r  r_   r  r  r  )r   r  r  r  r  r  rE   rE   rH   r  M(  s    	

zTiledSequence.indicesc             c   s   t dg| j }x|D ]}|dkr*dV  qt|| jks<tt|| }x:| jD ]0\}}| j| }|| | }t ||| ||< qPW x| jD ]\}}||= qW t|V  qW dS )zReturn iterator over slices of chunks in tiled sequence.

        Parameters
        ----------
        indices : sequence of tuple of int
            Indices of chunks in the stacked sequence.

        N)	r  r  rc   r  r  r  r  r  r  )r   r  Z
chunkslicer  r  r  r  r   rE   rE   rH   r  d(  s    	


zTiledSequence.slicesc             C   s
   t | jS )N)rc   rz   )r   rE   rE   rH   r  |(  s    zTiledSequence.ndimc             C   s
   t | jS )N)r   r  )r   rE   rE   rH   r;  (  s    zTiledSequence.is_tiled)N)
r   r   r   r   r   r  r  r  r  r;  rE   rE   rE   rH   r  (  s   
+r  c               @   s$  e Zd ZdZdZdAddZdd Zdd	 Zd
d ZdBddZ	dCddZ
dd Zdd Zdd ZdDddZdEddZdFdd Zd!d" Zd#d$ ZdGd&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zed2d3 Zed4d5 Zed6d7 Zed8d9 Zed:d; Zed<d= Zej d>d= Zed?d@ Z!dS )Hr   a  Binary file handle.

    A limited, special purpose file handle that can:

    * handle embedded files (e.g. for LSM within LSM files)
    * re-open closed files (for multi-file formats, such as OME-TIFF)
    * read and write numpy arrays and records from file like objects

    Only 'rb', 'r+b', and 'wb' modes are supported. Concurrently reading and
    writing of the same stream is untested.

    When initialized from another file handle, do not use it unless this
    FileHandle is closed.

    Attributes
    ----------
    name : str
        Name of the file.
    path : str
        Absolute path to file.
    size : int
        Size of file in bytes.
    is_file : bool
        If True, file has a fileno and can be memory-mapped.

    All attributes are read-only.

    )
r   _file_mode_name_dir_lockr  _size_closerU  Nc             C   sV   d| _ || _|dkrdn|| _|| _d| _|| _|| _d| _d| _t	 | _
|   dS )a  Initialize file handle from file name or another file handle.

        Parameters
        ----------
        file : str, path-like, binary stream, or FileHandle
            File name or seekable binary stream, such as an open file
            or BytesIO.
        mode : str
            File open mode in case 'file' is a file name. Must be 'rb', 'r+b',
            or 'wb'. Default is 'rb'.
        name : str
            Optional name of file in case 'file' is a binary stream.
        offset : int
            Optional start position of embedded file. By default, this is
            the current file position.
        size : int
            Optional size of embedded file. By default, this is the number
            of bytes from the 'offset' to the end of the file.

        Nr   r  T)r   r  r  r  r  r  r  r  rU  rw  r  rw  )r   rx   r   r:   r;   r<   rE   rE   rH   r   (  s    zFileHandle.__init__c             C   s  | j dk	rdS t| jtjr*t| j| _t| jtrtj| j| _tj	| j\| _
| _t| j| j| _ d| _| jdkrd| _nt| jtrB| jj | _ | jdkrd| _|  j| jj7  _d| _| js| jrtj| jj\}}| d| j | | _n
| jj| _| jr,| j| jjkr,td| jj| _| jj
| _
nt| jdry| j  W n tk
r|   tdY nX | j| _ | jdkr| j | _d| _| jsytj	| j j\| _
| _W n tk
r   d	| _Y nX y| j j| _W n tk
r
   Y nX ntd
| jr,| j | j | jdkrl| j  }| j | jtj | j  | _| j | | jdkry| j   d| _W n tk
r   d| _Y nX dS )zOpen or re-open file.NTr6   Fr  zFileHandle has wrong moderT   zbinary stream is not seekablezUnnamed binary streamzNthe first parameter must be a file name, seekable binary stream, or FileHandle)r   r\   r  ra   rb   r  r]   rt  realpathr  r  r  rw  r  r  r  r   splitextr_   r`   r   rv   r:   r   r   rT   r  r   rU  r  )r   r:   r  r   rE   rE   rH   rw  (  sv    









zFileHandle.openc             C   s$   | j r | jdk	r | j  d| _dS )zClose file.N)r  r   r  )r   rE   rE   rH   r  )  s    
zFileHandle.closec             C   s   | j  | j S )zReturn file's current position.)r   r   r  )r   rE   rE   rH   r    )  s    zFileHandle.tellr6   c             C   sh   | j rZ|dkr(| j| j | || j  S |dkrZ| jdkrZ| j| j | j | d| j  S | j||S )zSet file's current position.r6   rP   )r  r   rT   r  )r   r;   whencerE   rE   rH   rT   $)  s    zFileHandle.seekr   c             C   s    |dk r| j r| j}| j|S )z5Read 'size' bytes from file, or until EOF is reached.r6   )r  r  r   r  )r   r<   rE   rE   rH   r  2)  s    zFileHandle.readc             C   s   | j |S )z?Read up to len(b) bytes into b and return number of bytes read.)r   readinto)r   r  rE   rE   rH   r"  8)  s    zFileHandle.readintoc             C   s   | j |S )zWrite bytes to file.)r   rw   )r   
bytestringrE   rE   rH   rw   <)  s    zFileHandle.writec             C   s
   | j  S )z"Flush write buffers if applicable.)r   r  )r   rE   rE   rH   r  @)  s    zFileHandle.flushrG  r   c             C   s,   | j stdtj| j||| j| ||dS )z+Return numpy.memmap of data stored in file.z%cannot memory-map file without fileno)rs   r   r;   rz   r  )rU  r_   rr   r   r   r  )r   rs   rz   r;   r   r  rE   rE   rH   r  D)  s    zFileHandle.memmap_arrayc             C   s.  t |}|dk r2|dkr | jn|j}||j }n
||j }|dkrPt ||n|}|j|krftdy| j|}W n< t	k
r   t 
| j|||j|dd< |}Y nX ||krtd| d| |jjs|js|d | }n|jj|jkr|d |dk	r*t|dr*|  |S )z2Return numpy array from file in native byte order.r6   Nzsize mismatchzfailed to read z bytes, got Tr  )rr   rs   r  ru   rt   r  r_   r   r"  r   r0  r  rh  rz   rJ  byteswaprH  r`   r  )r   rs   r  r  ru   r|   nrE   rE   rH   r  Q)  s4    







zFileHandle.read_arrayrU   c          	   C   s   t j}y|j| j|||d}W nb tk
r   t |}|dkrL| j|j }tt	||j }| j
|}|j||||d}Y nX |dkr|d S |S )zReturn numpy record from file.)rk   NrU   r6   )rr   recr  r   rv   rs   r  rt   r+   r]  r  rK  )r   rs   rz   rk   r&  recordr<   ry   rE   rE   rH   read_recordx)  s    
zFileHandle.read_recordc             C   s0   |dk rdS | j |d tj | j d dS )z;Append size bytes to file. Position must be at end of file.rU   Nr   )r   rT   ra   r  rw   )r   r<   rE   rE   rH   rO  )  s    zFileHandle.write_emptyc             C   s@   yt || j W n$ tk
r:   | j|  Y nX dS )z!Write numpy array to binary file.N)rr   ascontiguousarraytofiler   rv   rw   r  )r   ry   rE   rE   rH   rP  )  s    zFileHandle.write_arrayTc          	   #   s  t }|dk rdS |dkrdkr(dnd }	 |	 dkr|	 dkr|dkrV| j}|$ | |	  | j |	 }
W dQ R X nd}
|r|
|	fn|
|	fgV  dS |dkr| j}|dkrd}dkr fddt|D }n fddt|D }|rt|dd	 d
}d}xjt|d D ]Z}|| \}}}||d  d }|dks$|dks$|dkrhq$|| |kr$d}P q$W | j}| jj}|rd}x:||k r|}d}d}xZ||k r||k r|| \}}}|dkr|dkr|dkr|}||7 }|d7 }qW |dkr d}
n | || ||}
W dQ R X d}d}g }xl||k r|| \}	}}|dkr|dkr||7 }||
|| |	f |}n|d|	f |d7 }qNW |r|E dH  n|V  qW dS d}x||k rg }d}|~ xv||k rp||k rp|| \}	}}|dkrV|dkrV|| ||||	f ||7 }n|d|	f |d7 }qW W dQ R X |r|E dH  n|V  qW dS )aF  Return iterator over segments read from file and their indices.

        The purpose of this function is to

        * reduce small or random reads
        * reduce acquiring reentrant locks
        * synchronize seeks and reads
        * limit the size of segments read into memory at once
          (ThreadPoolExecutor.map is not collecting iterables lazily).

        Parameters
        ----------
        offsets, bytecounts : sequence of int
            offsets and bytecounts of the segments to read from file.
        indices : sequence of int
            Indices of the segments in the image. Default: range(len(offsets)).
        sort : bool
            If True (default), segments are read from file in the order of
            their offsets.
        lock:
            A reentrant lock used to synchronize seeks and reads.
        buffersize : int
            Approximate number of bytes to read from file in one pass.
            Default: 64 MB.
        flat : bool
            If True (default), return an iterator over individual
            (segment, index) tuples. Else return an iterator over a list
            of (segment, index) tuples that were acquired in one pass.

        Returns
        -------
        items : (bytes, int) or [(bytes, int)]
            Iterator over individual or lists of (segment, index) tuples.

        rU   Nr6   i   c                s   g | ]}||  | fqS rE   rE   )rF   r   )r:  r  rE   rH   rG  )  s    z,FileHandle.read_segments.<locals>.<listcomp>c                s"   g | ]}| |  | fqS rE   rE   )rF   r   )r:  r  r  rE   rH   rG  )  s    c             S   s   | d S )NrU   rE   )r=  rE   rE   rH   r>  )  r   z*FileHandle.read_segments.<locals>.<lambda>)rG   TF)rc   r  rT   r   r  rw  rx  ri   )r   r  r:  r  rK   rA  Z
buffersizer  r  r  ry   rF  Ziscontigr   r   r;   r;  Z
nextoffsetrT   r  r  or  r  r  r|   r<   rE   )r:  r  r  rH   rB  )  s    .


zFileHandle.read_segmentsc             C   s   | S )NrE   )r   rE   rE   rH   r  0*  s    zFileHandle.__enter__c             C   s   |    d S )N)r  )r   r  r  r  rE   rE   rH   r  3*  s    zFileHandle.__exit__c             C   s&   | j rtd| dt t| j|S )z-Return attribute from underlying file object.z<tifffile.FileHandle> z# not implemented for embedded files)r  rX   rY   r   r   r   )r   r:   rE   rE   rH   r  6*  s
    
zFileHandle.__getattr__c             C   s   dt | jddS )Nz<tifffile.FileHandle r  r   )r  r:   )r   rE   rE   rH   r  @*  s    zFileHandle.__repr__c             C   s*   d d| j| j| j d| jr"dndfS )z0Return string with information about FileHandle.z
 r   z bytesrv  rw  )r	  r:   ro  r<   rv  )r   rE   rE   rH   r  C*  s    
zFileHandle.__str__c             C   s   | j S )N)r  )r   rE   rE   rH   r:   O*  s    zFileHandle.namec             C   s   | j S )N)r  )r   rE   rE   rH   ro  S*  s    zFileHandle.dirnamec             C   s   t j| j| jS )N)ra   rt  r	  r  r  )r   rE   rE   rH   rt  W*  s    zFileHandle.pathc             C   s   | j S )N)r  )r   rE   rE   rH   r<   [*  s    zFileHandle.sizec             C   s
   | j d kS )N)r   )r   rE   rE   rH   rv  _*  s    zFileHandle.closedc             C   s   | j S )zReturn current lock instance.)r  )r   rE   rE   rH   rA  c*  s    zFileHandle.lockc             C   s,   t |t| jtkr(|r t nt | _d S )N)r   r\   r  rw  	threadingRLock)r   r   rE   rE   rH   rA  h*  s    c             C   s   t | jt S )zReturn if a RLock is used.)r\   r  rw  )r   rE   rE   rH   has_lockm*  s    zFileHandle.has_lock)NNNN)r6   )r   )r6   rG  r   )r   N)rU   N)NTNNT)"r   r   r   r   r   r   rw  r  r   rT   r  r"  rw   r  r  r  r(  rO  rP  rB  r  r  r  r  r  r  r:   ro  rt  r<   rv  rA  r  r.  rE   rE   rE   rH   r   (  sF   
!I



'
    
 
r   c               @   sX   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dddZ
dd Zdd ZdS )r   zKeep FileHandles open.)rf   keeppastrA  r<   Nc             C   sB   g | _ i | _t | _|dkr"t n|| _|dkr4dnt|| _dS )zInitialize open file cache.Nr   )r0  rf   r  r/  rw  rA  r   r<   )r   r<   rA  rE   rE   rH   r   x*  s
    zFileCache.__init__c             C   s
   t | jS )zReturn number of open files.)rc   rf   )r   rE   rE   rH   r  *  s    zFileCache.__len__c          	   C   s|   | j l || jkr&| j|  d7  < nH|jrL|  d| j|< | j| n"d| j|< | j| | j| W dQ R X dS )z Open file, re-open if necessary.rU   rP   N)rA  rf   rv  rw  r0  ri   r/  r  )r   r   rE   rE   rH   rw  *  s    


zFileCache.openc          	   C   s:   | j * || jkr$| j|  d8  < |   W dQ R X dS )z%Close least recently used open files.rU   N)rA  rf   _trim)r   r   rE   rE   rH   r  *  s    
zFileCache.closec          	   C   s\   | j L xDt| j D ]2\}}|| jkr|  | j|= | j| j|= qW W dQ R X dS )z7Close all opened files if not in use when opened first.N)rA  r  rf   r  r/  r  r0  r  )r   r   refcountrE   rE   rH   r  *  s    
zFileCache.clearr6   c          	   C   s   | j r || jk}|rR|jr0|  d| j|< nd| j|< | j| | j| ||| |	|}|rt| 
  W dQ R X |S )z#Return bytes read from binary file.r6   rU   N)rA  rf   rv  rw  r/  r  r0  ri   rT   r  r1  )r   r   r;   r;  r!  r  ry   rE   rE   rH   r  *  s    


zFileCache.readc             C   s~   d}t | j}xj||  k r&| jkrxn nN| j| }|| jkrn| j| dkrn|  | j|= | j|= |d8 }q|d7 }qW dS )zTrim file cache.r6   rU   N)rc   r0  r<   r/  rf   r  )r   r  r<   r   rE   rE   rH   r1  *  s    


zFileCache._trimc             C   s   dt | ddS )Nz<tifffile.FileCache @0xr  r   )r  )r   rE   rE   rH   r  *  s    zFileCache.__repr__)NN)r6   )r   r   r   r   r   r   r  rw  r  r  r  r1  r  rE   rE   rE   rH   r   s*  s   
	
r   c               @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
rw  zINull context manager.

    >>> with NullContext():
    ...     pass

    rE   c             C   s   | S )NrE   )r   rE   rE   rH   r  *  s    zNullContext.__enter__c             C   s   d S )NrE   )r   r  r  r  rE   rE   rH   r  *  s    zNullContext.__exit__c             C   s   dS )NzNullContext()rE   )r   rE   rE   rH   r  *  s    zNullContext.__repr__N)r   r   r   r   Z_NullContext__slotsr  r  r  rE   rE   rE   rH   rw  *  s
   rw  c               @   sb   e Zd ZdZdZejZdddZdddZ	dd	d
Z
dddZdd Zdd Zdd Zdd ZdS )r   z%Stopwatch for timing execution speed.)startedstoppeddurationNr  c             C   s<   |dk	rt ||dd d| _|dkr,t }| | _| _dS )z#Initialize timer and print message.NT)endr  r6   )printr5  r   clockr3  r4  )r   messager6  r3  rE   rE   rH   r   *  s    zTimer.__init__c             C   s2   |dk	rt ||dd d| _t  | _| _| jS )z$Start timer and return current time.NT)r6  r  r6   )r7  r5  r   r8  r3  r4  )r   r9  r6  rE   rE   rH   r  *  s
    zTimer.startc             C   s4   t  | _|dk	r t||dd | j| j | _| jS )z$Return duration of timer till start.NT)r6  r  )r   r8  r4  r7  r3  r5  )r   r9  r6  rE   rE   rH   r  *  s
    
z
Timer.stopc             C   s.   t | }|dk	rt|dd t||dd dS )z6Print duration from timer start till last stop or now.Nr  )r6  T)r6  r  )r]   r7  )r   r9  r6  r  rE   rE   rH   r7   +  s    zTimer.printc             C   s   | j dkrt | j }n| j }ttj|d}d}x,|t|k r`|||d  dkr`|d7 }q6W |||d  dkr~|d7 }||d  dS )	zAReturn duration from timer start till last stop or now as string.r6   )secondsrP   z0:0010203040506070809rU   r,  Nz s)r5  r   r8  r3  r]   r  	timedeltarc   )r   r5  r   r   rE   rE   rH   r  +  s    
"zTimer.__str__c             C   s   d| j  dS )NzTimer(started=r  )r3  )r   rE   rE   rH   r  +  s    zTimer.__repr__c             C   s   | S )NrE   )r   rE   rE   rH   r  +  s    zTimer.__enter__c             C   s   |    d S )N)r7  )r   r  r  r  rE   rE   rH   r  +  s    zTimer.__exit__)Nr  N)Nr  )Nr  )NN)r   r   r   r   r   timeperf_counterr8  r   r  r  r7  r  r  r  r  rE   rE   rE   rH   r   *  s   
	


r   c               @   s   e Zd ZdZdS )r   z;Exception to indicate invalid OME-XML or unsupported cases.N)r   r   r   r   rE   rE   rE   rH   r    +  s   r   c               @   s   e Zd ZdZdd ZdddZddd	Zd
d Zdd Ze	dd Z
e	dddZe	dd Ze	d ddZe	dd Ze	dd Ze	ddg fddZdS )!r   zOME-TIFF XML.c             K   s   d|kr|d }d| _ g | _g | _g | _d|krF|d dd | _nddlm} t| | _tj	|ddt
 d	}d
}d| d| d| d| j d| d| _dS )zCreate a new instance.

        Creator : str (optional)
            Name of the creating application. Default 'tifffile.py'.
        UUID : str (optional)
            Unique identifier.

        rj  r6   rW  r,  r   )uuid1ZCreatorztifffile.py )r  z1http://www.openmicroscopy.org/Schemas/OME/2016-06z{declaration}<OME xmlns="zL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="r  z/ome.xsd" UUID="urn:uuid:z" z&>{images}{annotations}{elements}</OME>N)r  rj  annotationselementsr  r  r>  r]   r   
_attribute__version__xml)r   r  r>  ZcreatorZschemarE   rE   rH   r   '+  s    	zOmeXml.__init__Nc       *         s4	  t | j}|d|}|d|}t|ttfr8|| }d|krjd|d krV|d d= ||d  |d= y0t|j	}ddddd	d
dddddd| }W n$ t
k
r   td|dY nX |d||krtd|d d|d}|\}}	}
}}}|
dkrtd|	dks*|dks*tdtdd |D }t |}|dk s\t|dkrdtd|dkr`|dks|dd ||dfkrd}|}n:|	dks|d kr|dd d||fkrd!}|	}nd"}t ||  krd#|krd nd$ksn t| d%|d&d'ddd( }|d#|kr4d nd$| d | }t |t |kstnj| }t |t |krtd)|d"s|dstd*g }xL|D ]D}|d+krtd,|d||krtd-|d.|| qW |d#|krd/nd0krtd1|dkrp|}|d2k r4td3|d( d#krJtd4|d( |ksf|d5 |krtd6nZ|	dkr|	}|d2k rtd3|d d#krtd4|d |	ks|d( |krtd6||d7 |ks||d8 |krtd6d#|kr$|dt|d#|d8 }n|d|d8 }td9d |D rbi }g  d:d;d<d=d>d?d@}xt|D ]\}}|dAkr||d | }|r|dBkr|| || f||< nLxVdBD ]:}| kr||kr|| || f||<  | P qW tdCn
 | qnW dD }dDdEd | D }dF| dG}dH| dI| dJ}| j| ni }dD}|ddd( }x@|d&d'd'dKdLdMdNdOfD ] | krP qW tdP|dg xt D ]l}|d#kr֐q||kr||| }nd}|dQkr
|}||9 }||kr$||| d 9 }| qW dDdRd t D }d&|kr|d& }dD fdSd|D }||krtdT|xDt D ]6\}}|dU| ||krtdV| dW|qW  dQ  |  < |tdXd krtd6g }|dYdD}|rt fdZdd[D }xt|D ]x} t|| d\d]d^d_d`dadbdcdd}!tj| dXd dedffdgd|D \}"}#}$|dh|" di|# dj|$ dk|! dl	 qBW dD|}g }%xpt|D ]d}"dm}&t|dndD|"dodpdqdrdsdtdudvdwdxdydzd{d|}!|%d}| d~|" d| dk|! d|& d qW dD|%}%t|dd}'tj|dod| d}(t|dddddddddd}!|	dks|dkr|	dkrdnd})d|) dk})ndD})| jd| dk|( d|' d| d  d| dk| |) |! d|% d| j  d| dG| d| d |  j |7  _ dS )a*  Add image to OME-XML.

        The OME model can handle up to 9 dimensional images for selected
        axes orders. Refer to the OME-XML specification for details.
        Non-TZCYXS (modulo) dimensions must be after a TZC dimension or
        require an unused TZC dimension.

        Parameters
        ----------
        dtype : numpy.dtype
            Data type of image array.
        shape : tuple
            Shape of image array.
        storedshape: tuple
            Normalized shape describing how the image array is stored in TIFF:
            (pages, separate_samples, depth, length, width, contig_samples).
        axes : str (optional)
            Axes labels for each dimension in shape.
            By default, axes are matched to the shape in reverse order of
            TZC(S)YX(S) based on storedshape.
            The following axes codes are supported: 'S' sample, 'X' width,
            'Y' length, 'Z' depth, 'C' channel, 'T' time, 'A' angle, 'P' phase,
            'R' tile, 'H' lifetime, 'E' lambda, 'Q' other.
        metadata : miscellaneous (optional)
            Additional OME-XML attributes or elements to be stored.
            Image/Pixels: Name, AcquisitionDate, Description,
            PhysicalSizeX, PhysicalSizeXUnit, PhysicalSizeY, PhysicalSizeYUnit,
            PhysicalSizeZ, PhysicalSizeZUnit, TimeIncrement, TimeIncrementUnit.
            Per Plane: DeltaTUnit, ExposureTime, ExposureTimeUnit,
            PositionX, PositionXUnit, PositionY, PositionYUnit, PositionZ,
            PositionZUnit.
            Per Channel: Name, AcquisitionMode, Color, ContrastMethod,
            EmissionWavelength, EmissionWavelengthUnit, ExcitationWavelength,
            ExcitationWavelengthUnit, Fluor, IlluminationType, NDFilter,
            PinholeSize, PinholeSizeUnit, PockelCellSetting.

        rj  r_  ra  rZ  int8int16int32rH  r   uint32rq  doublecomplexzdouble-complexbit)rD  rE  rF  rH  r   rG  r(  float64Z	complex64Z
complex128r   z
data type z not supportedr[  zmetadata Pixels Type z does not match array dtype rU   zImageDepth not supportedzinvalid stored shapec             s   s   | ]}t |V  qd S )N)r   )rF   r   rE   rE   rH   rI   +  s    z"OmeXml.addimage.<locals>.<genexpr>r6   zempty arrays not supportedNr   r  r   r  r  r   r   z dimensions not supportedrb  XYCZTr   zaxes do not match shapez"dimensions must end with YX or YXSZTZCYXSAPRHEQz
dimension z	multiple z dimensionsr   r   z$more than 8 dimensions not supportedrC   z$dimensions do not match stored shapezaxes do not match stored shaper   z!shape does not match stored shaperk  rl  c             s   s   | ]}|d kV  qdS )APRHEQNrE   )rF   rd  rE   rE   rH   rI   +  s    anglephaser  lifetimelambdar\  )Ar  Rr   Er9  rM  r  zmore than 3 modulo dimensionsr  c             s   s2   | ]*\}\}}d | d| d|d  dV  qdS )z<ModuloAlongz Type="z" Start="0" End="rU   z"/>NrE   )rF   rd  Zaxtyper<   rE   rE   rH   rI   ,  s   z<AnnotationRef ID="Annotation:z"/>z<XMLAnnotation ID="Annotation:z" Namespace="openmicroscopy.org/omero/dimension/modulo"><Value><Modulo namespace="http://www.openmicroscopy.org/Schemas/Additions/2011-09">z!</Modulo></Value></XMLAnnotation>XYZCTXYZTCXYCTZXYTCZZXYTZCzdimension order r   c             s   s$   | ]\}}d | d| dV  qdS )z Sizez="r  NrE   )rF   rd  r<   rE   rE   rH   rI   A,  s    c             3   s$   | ]}  | d kr|V  qdS )rU   N)r  )rF   rd  )dimorderdimsizesrE   rH   rI   H,  s    z'metadata DimensionOrder does not match rc  zmetadata Sizez does not match rP   ZPlanec             3   s    | ]} d d  |V  qdS )rP   N)r  )rF   rd  )rY  rE   rH   rI   ],  s    ZCZTZ
DeltaTUnitExposureTimeZExposureTimeUnitZ	PositionXZPositionXUnitZ	PositionYZPositionYUnitZ	PositionZZPositionZUnitF)r  c             3   s   | ]}t  | V  qd S )N)r   )rF   r   )	unraveledrE   rH   rI   m,  s    z<Plane TheC="z" TheZ="z" TheT="r  z/>z<LightPath/>rf  r`  ZAcquisitionModeColorZContrastMethodZEmissionWavelengthZEmissionWavelengthUnitZExcitationWavelengthZExcitationWavelengthUnitZFluorZIlluminationTypeZNDFilterZPinholeSizeZPinholeSizeUnitZPockelCellSettingz<Channel ID="Channel:r,  z" SamplesPerPixel="r   z
</Channel>ZAcquisitionDateDescription)r  ZSignificantBitsZPhysicalSizeXZPhysicalSizeXUnitZPhysicalSizeYZPhysicalSizeYUnitZPhysicalSizeZZPhysicalSizeZUnitZTimeIncrementZTimeIncrementUnitfalsetruez Interleaved="z<Image ID="Image:z<Pixels ID="Pixels:z" DimensionOrder="z" Type="z<TiffData IFD="z" PlaneCount="z	</Pixels>z</Image>)!rc   rj  rV   r\   r  r  r   rr   rs   r:   r   r   r_   r+   r  r_  r  ri   r  r  rd  r}  r	  r  r?  rx  rw  r   _attributesZunravel_index	_elementsrA  r  )*r   rs   rz   r  r   r  r  r&  
planecountZseparater  r  r  contigr  Zhiaxesuniquerd  rY  Zaxestyper   r=  Zmoduloalongr  r?  r<   Zsizecr  Zomedimorderr  ZplaneattributesZcztorderr  
attributesr1  rF  rE  r  Z	lightpathr@  r:   ZinterleavedrE   )rY  rZ  r]  rH   rM  Y+  s   &




"
","







(
 















&

,
ZzOmeXml.addimageFc             C   sZ   d | j}d | j}d | j}|r4d| d}|r>d}nd}| jj||||d}|S )zReturn OME-XML string.r  z<StructuredAnnotations>z</StructuredAnnotations>z&<?xml version="1.0" encoding="UTF-8"?>)r  rj  r?  r@  )r	  r@  rj  r?  rC  r  )r   r  r@  rj  r?  rC  rE   rE   rH   r  ,  s    zOmeXml.tostringc             C   s   dt | ddS )Nz<tifffile.OmeXml @0xr  r   )r  )r   rE   rE   rH   r  ,  s    zOmeXml.__repr__c          
   C   s   |   }y>ddlm} |jdd}|||}|j |dddd }W nP tk
r } z td|j	j
 d| t W d	d	}~X Y n tk
r   Y nX |S )
zReturn OME-XML string.r6   )rN  T)Zremove_blank_textzutf-8)encodingpretty_printxml_declarationz<tiffile.OmeXml.__str__> z: N)r  lxmlrN  	XMLParserrK  rn  rv   rX   rY   r   r   r   ImportError)r   rC  rN  parsertreer   rE   rE   rH   r  ,  s    zOmeXml.__str__c             C   sX   t | tst| } nd| ks,d| ks,d| kr0| S | dd} | dd} | dd} | S )zReturn escaped string of value.z&amp;z&gt;z&lt;&r   r   )r\   r]   rz  )r   rE   rE   rH   _escape,  s    

zOmeXml._escapec             C   s6   |  ||}|dkrdS d| dt| d| dS )z1Return XML formatted element if name in metadata.Nr   r   z</)rV   r   rq  )r  r:   r  r   rE   rE   rH   _element,  s    zOmeXml._elementc                s.    sdS  fdd|D }d dd |D S )zReturn XML formatted elements.r  c             3   s   | ]}t  |V  qd S )N)r   rr  )rF   r:   )r  rE   rH   rI   -  s    z#OmeXml._elements.<locals>.<genexpr>c             s   s   | ]}|r|V  qd S )NrE   )rF   erE   rE   rH   rI   -  s    )r	  )r  namesr@  rE   )r  rH   rc  -  s    zOmeXml._elementsc             C   sl   |  ||}|dkrdS |dk	rTt|ttfr8|| }n|dkrTtt|jdd| dt| dS )z3Return XML formatted attribute if name in metadata.Nr6   z is not a list or tupler  z="r  )	rV   r\   r  r  rW   r  r   r   rq  )r  r:   r  r  r   rE   rE   rH   rA  	-  s    
zOmeXml._attributec                s   sdS  dkr$fdd|D }nHt ttfrN  fdd|D }nt trl fdd|D }ddd |D S )z Return XML formatted attributes.r  Nc             3   s   | ]}t  |V  qd S )N)r   rA  )rF   r:   )r  rE   rH   rI   -  s    z%OmeXml._attributes.<locals>.<genexpr>c             3   s   | ]}t  |V  qd S )N)r   rA  )rF   r:   )r  rE   rH   rI   !-  s    c             3   s   | ]}t | V  qd S )N)r   rA  )rF   r:   )index_r  rE   rH   rI   $-  s    c             s   s   | ]}|r|V  qd S )NrE   )rF   r)  rE   rE   rH   rI   &-  s    )r\   r  r  r^  r	  )r  ru  rt  rg  rE   )ru  r  rH   rb  -  s    
zOmeXml._attributesc             C   sR   |  |d}|dkrdS y|d }W n tk
r8   Y nX d| dt| dS )z'Return XML formatted reference element.Nr  rZ  r   z ID="z"/>)rV   r   r   rq  )r  r:   r   rE   rE   rH   
_reference(-  s    zOmeXml._referenceTc          	   C   s>  ddl m} |s|dkrtjtjtd}tj|rZt|d}|	 }W dQ R X n(ddl
}|jd}|	 }W dQ R X |dr|dd	d
 }y||||  W n tk
r   |d Y nX |r:|d dk	r:| dr
| dd	d
 } || }|r,|d | dS |d |S dS )zReturn if OME-XML is valid according to XMLSchema.

        If 'assert_' is True, raise an AssertionError if validation fails.

        On first run, this function takes several seconds to download and
        parse the 2016-06 OME XMLSchema.

        r6   )rN  Nzome.xsdr   z:https://www.openmicroscopy.org/Schemas/OME/2016-06/ome.xsds   <?xml   >rU   r   z<?xmlr   T)rk  rN  ra   rt  r	  ro  __file__existsrw  r  urllib.requestrequesturlopenrp  r  ri   Z	XMLSchemarK  rn  rv   assert_r  )r~  Zomexsdr}  Z_schemarN  r   urllibro  rE   rE   rH   r  4-  s8    


zOmeXml.validate)N)F)N)NN)r   r   r   r   r   rM  r  r  r  r  rq  rr  rc  rA  rb  rv  r  rE   rE   rE   rH   r   $+  s$   2
  i
r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		LazyConstzEClass whose attributes are computed on first access from its methods.c             C   s4   || _ |j| _|j| _|j| _|j| _t | _d S )N)_clsr   r   r   r   r,  r-  rA  )r   r  rE   rE   rH   r   e-  s    zLazyConst.__init__c             C   s   | j jS )N)r  r   )r   rE   rE   rH   
__reduce__m-  s    zLazyConst.__reduce__c          	   C   s   | j  || jkr| j| }nt| j|}t|r8| n|}yt|dt|d W n tk
rf   Y nX yt|dt|d W n tk
r   Y nX yt|dt|d W n tk
r   Y nX t| || W d Q R X |S )Nr   r   r   )rA  r   r   r  r  r   r   )r   r:   r   r   rE   rE   rH   r  q-  s(    
zLazyConst.__getattr__N)r   r   r   r   r   r  r  rE   rE   rE   rH   r  b-  s   r  c               @   sP  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2d`da Z3dbdc Z4ddde Z5dfdg Z6dhdi Z7djdk Z8dldm Z9dndo Z:dpdq Z;drds Z<dtdu Z=dvdw Z>dxdy Z?dzd{ Z@d|d} ZAd~d ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdS )r   zNamespace for module constants.c              C   s   G dd d} | S )Nc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )z&TIFF.CLASSIC_LE.<locals>.ClassicTiffLerE   r   r   r   z<IrP   z<Hr   z<HHz<I4sN)r   r   r   r   r  rk   r  r   r  rQ  rR  rx  r~  r}  rE   rE   rE   rH   ClassicTiffLe-  s   r  rE   )r  rE   rE   rH   r   -  s    zTIFF.CLASSIC_LEc              C   s   G dd d} | S )Nc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )z&TIFF.CLASSIC_BE.<locals>.ClassicTiffBerE   r   r   r   z>IrP   z>Hr   z>HHz>I4sN)r   r   r   r   r  rk   r  r   r  rQ  rR  rx  r~  r}  rE   rE   rE   rH   ClassicTiffBe-  s   r  rE   )r  rE   rE   rH   r   -  s    zTIFF.CLASSIC_BEc              C   s   G dd d} | S )Nc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZd	S )
zTIFF.BIG_LE.<locals>.BigTiffLerE   r   r   r   z<Qr  z<HHz<Q8sN)r   r   r   r   r  rk   r  r   r  rQ  rR  rx  r~  r}  rE   rE   rE   rH   	BigTiffLe-  s   r  rE   )r  rE   rE   rH   r   -  s    zTIFF.BIG_LEc              C   s   G dd d} | S )Nc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZd	S )
zTIFF.BIG_BE.<locals>.BigTiffBerE   r   r   r   z>Qr  z>HHz>Q8sN)r   r   r   r   r  rk   r  r   r  rQ  rR  rx  r~  r}  rE   rE   rE   rH   	BigTiffBe-  s   r  rE   )r  rE   rE   rH   r   -  s    zTIFF.BIG_BEc              C   s   G dd d} | S )Nc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )z TIFF.NDPI_LE.<locals>.NdpiTiffLerE   r   r   r   z<QrP   z<Hr   z<HHz<I8sr   N)r   r   r   r   r  rk   r  r   r  rQ  rR  rx  r~  r}  rE   rE   rE   rH   
NdpiTiffLe-  s   r  rE   )r  rE   rE   rH   r  -  s    zTIFF.NDPI_LEc               C   s   t dS )N({  )rR  ZProcessingSoftware)r.  ZNewSubfileType)r6  ZSubfileType)r-  
ImageWidth)i  ZImageLength)i  BitsPerSample)i  ZCompression)i  ZPhotometricInterpretation)i  ZThresholding)i  Z	CellWidth)i	  Z
CellLength)i
  Z	FillOrder)i  ZDocumentName)i  ZImageDescription)i  r^  )i  r_  )i  ZStripOffsets)i  ZOrientation)i  rg  )i  ZRowsPerStrip)i  ZStripByteCounts)i  ZMinSampleValue)i  ZMaxSampleValue)i  ZXResolution)i  ZYResolution)i  ZPlanarConfiguration)i  ZPageName)i  Z	XPosition)i  Z	YPosition)i   ZFreeOffsets)i!  ZFreeByteCounts)i"  ZGrayResponseUnit)i#  ZGrayResponseCurve)i$  Z	T4Options)i%  Z	T6Options)i(  ZResolutionUnit)i)  Z
PageNumber)i,  ZColorResponseUnit)i-  ZTransferFunction)i1  r`  )i2  DateTime)i;  ZArtist)i<  ZHostComputer)i=  Z	Predictor)i>  Z
WhitePoint)i?  ZPrimaryChromaticities)i@  ZColorMap)iA  ZHalftoneHints)iB  Z	TileWidth)iC  Z
TileLength)iD  ZTileOffsets)iE  ZTileByteCounts)iF  ZBadFaxLines)iG  ZCleanFaxData)iH  ZConsecutiveBadFaxLines)iJ  ZSubIFDs)iL  ZInkSet)iM  ZInkNames)iN  ZNumberOfInks)iP  ZDotRange)iQ  ZTargetPrinter)iR  ZExtraSamples)iS  ZSampleFormat)iT  ZSMinSampleValue)iU  ZSMaxSampleValue)iV  ZTransferRange)iW  ZClipPath)iX  ZXClipPathUnits)iY  ZYClipPathUnits)iZ  ZIndexed)i[  
JPEGTables)i_  ZOPIProxy)i  ZGlobalParametersIFD)i  ZProfileType)i  Z
FaxProfile)i  ZCodingMethods)i  ZVersionYear)i  Z
ModeNumber)i  ZDecode)i  ZDefaultImageColor)i  Z
T82Options)i  r  )i   ZJPEGProc)i  ZJPEGInterchangeFormat)i  ZJPEGInterchangeFormatLength)i  ZJPEGRestartInterval)i  ZJPEGLosslessPredictors)i  ZJPEGPointTransforms)i  ZJPEGQTables)i  ZJPEGDCTables)i	  ZJPEGACTables)i  ZYCbCrCoefficients)i  ZYCbCrSubSampling)i  ZYCbCrPositioning)i  ZReferenceBlackWhite)i/  ZStripRowCounts)i  ZXMP)i  ZGDIGamma)i  ZICCProfileDescriptor)i  ZSRGBRenderingIntent)i   Z
ImageTitle)i  ZUSPTO_Miscellaneous)i   ZAndorId)i  ZAndorTemperature)i  ZAndorExposureTime)i  ZAndorKineticCycleTime)i  ZAndorAccumulations)i  ZAndorAcquisitionCycleTime)i  ZAndorReadoutTime)i  ZAndorPhotonCounting)i  ZAndorEmDacLevel)i  ZAndorFrames)i   ZAndorHorizontalFlip)i!  ZAndorVerticalFlip)i"  ZAndorClockwise)i#  ZAndorCounterClockwise)i(  ZAndorVerticalClockVoltage)i)  ZAndorVerticalShiftSpeed)i+  ZAndorPreAmpSetting)i,  ZAndorCameraSerial)i/  ZAndorActualTemperature)i0  ZAndorBaselineClamp)i1  ZAndorPrescans)i2  Z
AndorModel)i3  ZAndorChipSizeX)i4  ZAndorChipSizeY)iP  ZAndorBaselineOffset)if  ZAndorSoftwareVersion)iFG  ZRating)iGG  Z
XP_DIP_XML)iHG  Z
StitchInfo)iIG  ZRatingPercent)iP  ZResolutionXUnit)iP  ZResolutionYUnit)iP  ZResolutionXLengthUnit)iP  ZResolutionYLengthUnit)iP  Z
PrintFlags)iP  ZPrintFlagsVersion)iP  ZPrintFlagsCrop)iP  ZPrintFlagsBleedWidth)i	P  ZPrintFlagsBleedWidthScale)i
P  ZHalftoneLPI)iP  ZHalftoneLPIUnit)iP  ZHalftoneDegree)iP  ZHalftoneShape)iP  ZHalftoneMisc)iP  ZHalftoneScreen)iP  ZJPEGQuality)iP  ZGridSize)iP  ZThumbnailFormat)iP  ZThumbnailWidth)iP  ZThumbnailHeight)iP  ZThumbnailColorDepth)iP  ZThumbnailPlanes)iP  ZThumbnailRawBytes)iP  ZThumbnailSize)iP  ZThumbnailCompressedSize)iP  ZColorTransferFunction)iP  ZThumbnailData)i P  ZThumbnailImageWidth)i!P  ZThumbnailImageHeight)i"P  ZThumbnailBitsPerSample)i#P  ZThumbnailCompression)i$P  ZThumbnailPhotometricInterp)i%P  ZThumbnailImageDescription)i&P  ZThumbnailEquipMake)i'P  ZThumbnailEquipModel)i(P  ZThumbnailStripOffsets)i)P  ZThumbnailOrientation)i*P  ZThumbnailSamplesPerPixel)i+P  ZThumbnailRowsPerStrip)i,P  ZThumbnailStripBytesCount)i-P  ZThumbnailResolutionX)i.P  ZThumbnailResolutionY)i/P  ZThumbnailPlanarConfig)i0P  ZThumbnailResolutionUnit)i1P  ZThumbnailTransferFunction)i2P  ZThumbnailSoftwareUsed)i3P  ZThumbnailDateTime)i4P  ZThumbnailArtist)i5P  ZThumbnailWhitePoint)i6P  ZThumbnailPrimaryChromaticities)i7P  ZThumbnailYCbCrCoefficients)i8P  ZThumbnailYCbCrSubsampling)i9P  ZThumbnailYCbCrPositioning)i:P  ZThumbnailRefBlackWhite)i;P  ZThumbnailCopyRight)iAP  InteroperabilityIndex)iBP  InteroperabilityVersion)iP  ZLuminanceTable)iP  ZChrominanceTable)i Q  Z
FrameDelay)iQ  Z	LoopCount)iQ  ZGlobalPalette)iQ  ZIndexBackground)iQ  ZIndexTransparent)iQ  Z	PixelUnit)iQ  ZPixelPerUnitX)iQ  ZPixelPerUnitY)iQ  ZPaletteHistogram)i p  ZSonyRawFileType)i2p  ZVignettingCorrParams)i5p  ZChromaticAberrationCorrParams)i7p  ZDistortionCorrParams)i  ZImageID)i  ZWangTag1)i  ZWangAnnotation)i  ZWangTag3)i  ZWangTag4)i  ZImageReferencePoints)i  ZRegionXformTackPoint)i  ZWarpQuadrilateral)i  ZAffineTransformMat)i  ZMatteing)i  DataType)i  Z
ImageDepth)i  Z	TileDepth)i  ZImageFullWidth)i  ZImageFullLength)i  ZTextureFormat)i  ZTextureWrapModes)i  ZFieldOfViewCotangent)i  ZMatrixWorldToScreen)i  ZMatrixWorldToCamera)i}  ZModel2)i  ZCFARepeatPatternDim)i  
CFAPattern)i  ZBatteryLevel)i  ZKodakIFD)i  r[  )i  ZFNumber)i  Z	Copyright)i  Z	MDFileTag)i  ZMDScalePixel)i  ZMDColorTable)i  Z	MDLabName)i  ZMDSampleInfo)i  Z
MDPrepDate)i  Z
MDPrepTime)i  ZMDFileUnits)i  ZNiffRotation)i  ZNiffNavyCompression)i  ZNiffTileIndex)i  Z
OlympusINI)i  ZModelPixelScaleTag)i  Z
OlympusSIS)i5  ZAdventScale)i6  ZAdventRevision)i\  ZUIC1tag)i]  ZUIC2tag)i^  ZUIC3tag)i_  ZUIC4tag)i  ZIPTCNAA)iB  ZExtendedTagsOffset)i~  ZIntergraphPacketData)i  ZIntergraphFlagRegisters)i  ZIntergraphMatrixTag)i  ZINGRReserved)i  ZModelTiepointTag)i  Z
LeicaMagic)i  ZSite)i  ZColorSequence)i  Z	IT8Header)i  ZRasterPadding)i  ZBitsPerRunLength)i  ZBitsPerExtendedRunLength)i  Z
ColorTable)i  ZImageColorIndicator)i  ZBackgroundColorIndicator)i  ZImageColorValue)i  ZBackgroundColorValue)i  ZPixelIntensityRange)i  ZTransparencyIndicator)i  ZColorCharacterization)i  ZHCUsage)i  ZTrapIndicator)i  ZCMYKEquivalent)iF  ZCZ_SEM)ih  Z	AFCP_IPTC)i  ZPixelMagicJBIGOptions)iׅ  ZJPLCartoIFD)iJ  ZIPLAB)i؅  ZModelTransformationTag)i  ZWB_GRGBLevels)i  ZLeafData)i9  Z	MM_Header)i:  ZMM_Stamp)i;  Z
MM_Unknown)iI  ZImageResources)iR  ZMM_UserBlock)il  
CZ_LSMINFO)ii  ZExifTag)is  ZInterColorProfile)ix  ZFEI_SFEG)iz  Z
FEI_HELIOS)i{  Z	FEI_TITAN)i  ZFXExtensions)i  ZMultiProfiles)i  Z
SharedData)i  Z
T88Options)i  ZMarCCD)i  Z
ImageLayer)i  ZGeoKeyDirectoryTag)i  ZGeoDoubleParamsTag)i  ZGeoAsciiParamsTag)i  ZJBIGOptions)i  PIXTIFF)i"  ZExposureProgram)i$  ZSpectralSensitivity)i%  ZGPSTag)i%  ZOlympusSIS2)i'  ZISOSpeedRatings)i'  ZPhotographicSensitivity)i(  ZOECF)i)  Z	Interlace)i*  ZTimeZoneOffset)i+  ZSelfTimerMode)i0  ZSensitivityType)i1  ZStandardOutputSensitivity)i2  ZRecommendedExposureIndex)i3  ZISOSpeed)i4  ZISOSpeedLatitudeyyy)i5  ZISOSpeedLatitudezzz)i\  ZHylaFAXFaxRecvParams)i]  ZHylaFAXFaxSubAddress)i^  ZHylaFAXFaxRecvTime)i_  ZFaxDcs)iq  ZFedexEDR)i  Z
LeafSubIFD)i  Z	Aphelion1)i  Z	Aphelion2)i  ZAphelionInternal)i   ExifVersion)i  ZDateTimeOriginal)i  ZDateTimeDigitized)i	  ZGooglePlusUploadCode)i  Z
OffsetTime)i  ZOffsetTimeOriginal)i  ZOffsetTimeDigitized)i   TVX_Unknown)i  ZTVX_NumExposure)i  ZTVX_NumBackground)i  ZTVX_ExposureTime)i  ZTVX_BackgroundTime)i  r  )i	  Z
TVX_SubBpp)i
  ZTVX_SubWide)i  ZTVX_SubHigh)i  ZTVX_BlackLevel)i  ZTVX_DarkCurrent)i  ZTVX_ReadNoise)i  ZTVX_DarkCurrentNoise)i  ZTVX_BeamMonitor)i   ZTVX_UserVariables)i  ZComponentsConfiguration)i  ZCompressedBitsPerPixel)i  ZShutterSpeedValue)i  ZApertureValue)i  ZBrightnessValue)i  ZExposureBiasValue)i  ZMaxApertureValue)i  ZSubjectDistance)i  ZMeteringMode)i  ZLightSource)i	  ZFlash)i
  FocalLength)i  FlashEnergy)i  SpatialFrequencyResponse)i  Noise)i  FocalPlaneXResolution)i  FocalPlaneYResolution)i  FocalPlaneResolutionUnit)i  ImageNumber)i  SecurityClassification)i  ImageHistory)i  SubjectLocation)i  ZExposureIndex)i  ZTIFFEPStandardID)i  SensingMethod)i:  ZCIP3DataFile)i;  Z	CIP3Sheet)i<  ZCIP3Side)i?  ZStoNits)i|  Z	MakerNote)i  UserComment)i  Z
SubsecTime)i  ZSubsecTimeOriginal)i  ZSubsecTimeDigitized)i/  ZMODIText)i0  ZMODIOLEPropertySetStorage)i1  ZMODIPositioning)iJ  ZTVIPS)iK  ZTVIPS1)iL  ZTVIPS2)i\  ZImageSourceData)i   ZTemperature)i  ZHumidity)i  ZPressure)i  Z
WaterDepth)i  ZAcceleration)i  ZCameraElevationAngle)i@  ZXPos)iA  ZYPos)iB  ZPos)iA  ZMC_IpWinScal)iA  Z	RecipName)iB  ZRecipNumber)iC  Z
SenderName)iD  ZRouting)iE  ZCallerId)iF  ZTSID)iG  ZCSID)iH  ZFaxTime)i  ZMC_IdOld)i  Z
MC_Unknown)i  ZInteroperabilityTag)i  ZXPTitle)i  Z	XPComment)i  ZXPAuthor)i  Z
XPKeywords)i  Z	XPSubject)i   FlashpixVersion)i  Z
ColorSpace)i  ZPixelXDimension)i  ZPixelYDimension)i  ZRelatedSoundFile)i  ZSamsungRawPointersOffset)i  ZSamsungRawPointersLength)i  ZSamsungRawByteOrder)i  ZSamsungRawUnknown)i  r  )i  r  )i  r  )i  r  )i  r  )i  r  )i  r  )i  r  )i  r  )i  r  )i  zExposureIndex )i  zTIFF-EPStandardID)i  r  )i   Z
FileSource)i  Z	SceneType)i  r  )i  ZCustomRendered)i  ZExposureMode)i  WhiteBalance)i  ZDigitalZoomRatio)i  ZFocalLengthIn35mmFilm)i  ZSceneCaptureType)i  ZGainControl)i  Contrast)i	  
Saturation)i
  	Sharpness)i  ZDeviceSettingDescription)i  ZSubjectDistanceRange)i   ZImageUniqueID)i0  ZCameraOwnerName)i1  ZBodySerialNumber)i2  ZLensSpecification)i3  ZLensMake)i4  Z	LensModel)i5  ZLensSerialNumber)i`  ZCompositeImage)ia  ZSourceImageNumberCompositeImage)ib  Z!SourceExposureTimesCompositeImage)i  ZGDAL_METADATA)i  ZGDAL_NODATA)i   Gamma)i2  ZNIHImageHeader)i  ZExpandSoftware)i  Z
ExpandLens)i¯  Z
ExpandFilm)iï  ZExpandFilterLens)iį  ZExpandScanner)iů  ZExpandFlashLamp)i  ZPixelFormat)i  ZTransformation)i  ZUncompressed)i  	ImageType)i  r  )i  ZImageHeight)i  ZWidthResolution)i  ZHeightResolution)i  ZImageOffset)i  ZImageByteCount)i¼  ZAlphaOffset)iü  ZAlphaByteCount)iļ  ZImageDataDiscard)iż  ZAlphaDataDiscard)iS  Z	KodakAPP3)i'  ZOceScanjobDescription)i(  ZOceApplicationSelector)i)  ZOceIdentificationNumber)i*  ZOceImageLogicCharacteristics)iO  ZAnnotations)ip  ZMC_Id)iq  ZMC_XYPosition)ir  ZMC_ZPosition)is  ZMC_XYCalibration)it  ZMC_LensCharacteristics)iu  ZMC_ChannelName)iv  ZMC_ExcitationWavelength)iw  ZMC_TimeStamp)ix  ZMC_FrameProperties)i  ZPrintImageMatching)i?  ZPCO_RAW)is  ZOriginalFileName)i  ZUSPTO_OriginalContentType)i  ZUSPTO_RotationCode)i  ZCR2Unknown1)i  ZCR2Unknown2)i  ZCR2CFAPattern)i  ZLercParameters)i  Z
DNGVersion)i  ZDNGBackwardVersion)i  ZUniqueCameraModel)i  ZLocalizedCameraModel)i  ZCFAPlaneColor)i  Z	CFALayout)i  ZLinearizationTable)i  ZBlackLevelRepeatDim)i  Z
BlackLevel)i  ZBlackLevelDeltaH)i  ZBlackLevelDeltaV)i  Z
WhiteLevel)i  ZDefaultScale)i  ZDefaultCropOrigin)i   ZDefaultCropSize)i!  ZColorMatrix1)i"  ZColorMatrix2)i#  ZCameraCalibration1)i$  ZCameraCalibration2)i%  ZReductionMatrix1)i&  ZReductionMatrix2)i'  ZAnalogBalance)i(  ZAsShotNeutral)i)  ZAsShotWhiteXY)i*  ZBaselineExposure)i+  ZBaselineNoise)i,  ZBaselineSharpness)i-  ZBayerGreenSplit)i.  ZLinearResponseLimit)i/  ZCameraSerialNumber)i0  ZLensInfo)i1  ZChromaBlurRadius)i2  ZAntiAliasStrength)i3  ZShadowScale)i4  ZDNGPrivateData)i5  ZMakerNoteSafety)i@  ZRawImageSegmentation)iZ  ZCalibrationIlluminant1)i[  ZCalibrationIlluminant2)i\  ZBestQualityScale)i]  ZRawDataUniqueID)i`  ZAliasLayerMetadata)i  ZOriginalRawFileName)i  ZOriginalRawFileData)i  Z
ActiveArea)i  ZMaskedAreas)i  ZAsShotICCProfile)i  ZAsShotPreProfileMatrix)i  ZCurrentICCProfile)i  ZCurrentPreProfileMatrix)i  ZIJMetadataByteCounts)i  Z
IJMetadata)i  ZRPCCoefficientTag)i  ZColorimetricReference)i  ZSRawType)i  ZPanasonicTitle)i  ZPanasonicTitle2)i  ZRSID)i  ZGEO_METADATA)i  ZCameraCalibrationSignature)i  ZProfileCalibrationSignature)i  Z
ProfileIFD)i  ZAsShotProfileName)i  ZNoiseReductionApplied)i  ZProfileName)i  ZProfileHueSatMapDims)i  ZProfileHueSatMapData1)i  ZProfileHueSatMapData2)i  ZProfileToneCurve)i  ZProfileEmbedPolicy)i  ZProfileCopyright)i  ZForwardMatrix1)i  ZForwardMatrix2)i  ZPreviewApplicationName)i  ZPreviewApplicationVersion)i  ZPreviewSettingsName)i  ZPreviewSettingsDigest)i  ZPreviewColorSpace)i  ZPreviewDateTime)i  ZRawImageDigest)i  ZOriginalRawFileDigest)i  ZSubTileBlockSize)i  ZRowInterleaveFactor)i%  ZProfileLookTableDims)i&  ZProfileLookTableData)i@  ZOpcodeList1)iA  ZOpcodeList2)iN  ZOpcodeList3)iO  Z	FibicsXML)ia  ZNoiseProfile)ic  Z	TimeCodes)id  Z	FrameRate)ir  ZTStop)i  ZReelName)i  ZOriginalDefaultFinalSize)i  ZOriginalBestQualitySize)i  ZOriginalDefaultCropSize)i  ZCameraLabel)i  ZProfileHueSatMapEncoding)i  ZProfileLookTableEncoding)i  ZBaselineExposureOffset)i  ZDefaultBlackRender)i  ZNewRawImageDigest)i  ZRawToPreviewGain)i  Z	CacheBlob)i  ZCacheVersion)i  ZMicroManagerMetadata)i  ZDefaultUserCrop)i  ZZIFmetadata)i  ZZIFannotations)i  ZDepthFormat)i  Z	DepthNear)i  ZDepthFar)i  Z
DepthUnits)i  ZDepthMeasureType)i  ZEnhanceParams)i  Padding)i  ZOffsetSchema)i  ZFlexXML)r   rE   rE   rE   rH   r   -  s    z	TIFF.TAGSc            "   C   sH   t t ttttttttt	t	t
ttttttttttttttttt	t	t	td!S )N)!i-  i@  i  i\  i]  i^  i_  iF  i9  i:  i;  iR  il  ix  iz  iJ  i\  i  i2  i  ip  ix  i  i  i  i  ii  i%  i  i  i  i  i  )read_colormap
read_bytesr  read_uic2tagread_uic3tagread_uic4tagread_cz_semread_mm_headerread_mm_stampr  read_cz_lsminforead_fei_metadataread_tvips_headerread_nih_image_header	read_jsonread_sis_iniread_sisread_exif_ifdread_gps_ifdread_interoperability_ifdrE   rE   rE   rH   r  y0  sB    zTIFF.TAG_READERSc               C   s   t dS )N)i  i  i  i  i  i  i  i1  iD  iE  iJ  iR  iS  i[  i  i  i  i\  i  i  i  )	frozensetrE   rE   rE   rH   r  0  s    zTIFF.TAG_LOADc               C   s   t dS )N)i  i  iD  iE  iJ  iR  i  i  i  i  i  )r  rE   rE   rE   rH   r  0  s    zTIFF.TAG_TUPLEc               C   s.   ddddddddd	d
dddddddddddS )Nr  r|  r}  rp   r  r8  r  r  r  r  r  rB  r  r  r  r  r  r3  r  r>  )r.  r-  i  i  i  i
  i  i  i  i  i1  i=  iB  iC  iJ  iR  i[  i  i  i  rE   rE   rE   rE   rH   r	  0  s(    zTIFF.TAG_ATTRIBUTESc              C   s   G dd d} |  S )Nc               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	zTIFF.TAG_ENUM.<locals>.TAG_ENUM)_codesc             S   s0   d d t jt jd d d t jd d d d d t jd| _d S )N)r.  r6  i  i  i  i
  i  i  i"  i(  i,  i=  iR  iS  )r   r`  rS  rY  rZ  r  )r   rE   rE   rH   r   0  s    z(TIFF.TAG_ENUM.<locals>.TAG_ENUM.__init__c             S   s
   || j kS )N)r  )r   rG   rE   rE   rH   r  0  s    z,TIFF.TAG_ENUM.<locals>.TAG_ENUM.__contains__c             S   s   | j | }|d k	r|S |dkr&tj}n|dkr6tj}n|dkrFtj}nx|dkrVtj}nh|dkrftj}nX|dkrvtj}nH|dkrtj}n8|dkrtj	}n(|d	krtj
}n|d
krtj}nt||| j |< |S )Nr.  r6  i  i
  i  i"  i(  i,  i=  iR  )r  r   FILETYPE	OFILETYPE
THRESHHOLD	FILLORDERORIENTATIONGRAYRESPONSEUNITrr  COLORRESPONSEUNITr\  r   r   )r   rG   r   rE   rE   rH   r   1  s4    

z+TIFF.TAG_ENUM.<locals>.TAG_ENUM.__getitem__N)r   r   r   r   r   r  r  rE   rE   rE   rH   r  0  s   r  rE   )r  rE   rE   rH   r  0  s    >zTIFF.TAG_ENUMc              C   s   G dd dt j} | S )Nc               @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	zTIFF.FILETYPE.<locals>.FILETYPEr6   rU   rP   r   r   r   i   N)
r   r   r   	UNDEFINEDREDUCEDIMAGEPAGErg  ZMACROZENHANCEDZDNGrE   rE   rE   rH   r  (1  s   r  )enumIntFlag)r  rE   rE   rH   r  '1  s    	zTIFF.FILETYPEc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdZdZdS )z!TIFF.OFILETYPE.<locals>.OFILETYPEr6   rU   rP   rC   N)r   r   r   r  ZIMAGEr  r  rE   rE   rE   rH   r  41  s   r  )r  IntEnum)r  rE   rE   rH   r  31  s    zTIFF.OFILETYPEc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6d7 Z8d8S )9z%TIFF.COMPRESSION.<locals>.COMPRESSIONrU   rP   rC   r   r   r   r   r   r   r   c   i  iRX  i  i  i  i  i  i  i  i)  i  i  i  i  i  i  i  i  i  i  i  i  ie  it  iu  i  i  i  i  i  i  iG  iL  im  in  io  iu  iv  iP  iQ  iR  i]  c             S   s   | dkS )NrU   rE   )r   rE   rE   rH   r   x1  s    z.TIFF.COMPRESSION.<locals>.COMPRESSION.__bool__N)9r   r   r   r   ZCCITTRLEZCCITT_T4ZCCITT_T6ZLZWZOJPEGZJPEGZADOBE_DEFLATEZJBIG_BWZ
JBIG_COLORZJPEG_99Z	KODAK_262ZJPEGXR_NDPIZNEXTZSONY_ARWZ
PACKED_RAWZSAMSUNG_SRWZCCIRLEWZSAMSUNG_SRW2ZPACKBITSZTHUNDERSCANZIT8CTPADZIT8LWZIT8MPZIT8BLZ	PIXARFILMZPIXARLOGDEFLATEZDCSZAPERIO_JP2000_YCBCZJPEG_2000_LOSSYZAPERIO_JP2000_RGBZALT_JPEGZJBIGZSGILOGZSGILOG24ZJPEG2000Z	NIKON_NEFZJBIG2Z
MDI_BINARYZMDI_PROGRESSIVEZ
MDI_VECTORZLERCZ
JPEG_LOSSYLZMAZZSTD_DEPRECATEDZWEBP_DEPRECATEDZPNGZJPEGXRZZSTDZWEBPZJPEGXLr  r   rE   rE   rE   rH   r`  =1  sl   r`  )r  r  )r`  rE   rE   rH   r`  <1  s    >zTIFF.COMPRESSIONc              C   s   G dd dt j} | S )Nc               @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )z%TIFF.PHOTOMETRIC.<locals>.PHOTOMETRICr6   rU   rP   rC   r   r   r   r   r   r   i#  iL  iM  iL  i  i/  N)r   r   r   rU  rT  rV  rX  rg  rJ  rW  ZCIELABZICCLABZITULABrf  ZLOGLZLOGLUVZ
LINEAR_RAWZ	DEPTH_MAPZSEMANTIC_MASKrE   rE   rE   rH   rS  ~1  s    rS  )r  r  )rS  rE   rE   rH   rS  }1  s    zTIFF.PHOTOMETRICc               C   s&   dddddddddddddddddS )NrU   rC   r   )r6   rU   rP   rC   r   r   r   r   r   r   i#  iL  iM  iL  i  i/  rE   rE   rE   rE   rH   re  1  s     zTIFF.PHOTOMETRIC_SAMPLESc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdZdS )z#TIFF.THRESHHOLD.<locals>.THRESHHOLDrU   rP   rC   N)r   r   r   ZBILEVELZHALFTONEZERRORDIFFUSErE   rE   rE   rH   r  1  s   r  )r  r  )r  rE   rE   rH   r  1  s    zTIFF.THRESHHOLDc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdS )z!TIFF.FILLORDER.<locals>.FILLORDERrU   rP   N)r   r   r   ZMSB2LSBZLSB2MSBrE   rE   rE   rH   r  1  s   r  )r  r  )r  rE   rE   rH   r  1  s    zTIFF.FILLORDERc              C   s   G dd dt j} | S )Nc               @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
z%TIFF.ORIENTATION.<locals>.ORIENTATIONrU   rP   rC   r   r   r   r   r   N)r   r   r   TOPLEFTTOPRIGHTBOTRIGHTBOTLEFTLEFTTOPRIGHTTOPRIGHTBOTLEFTBOTrE   rE   rE   rH   r  1  s   r  )r  r  )r  rE   rE   rH   r  1  s    
zTIFF.ORIENTATIONc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdS )z'TIFF.PLANARCONFIG.<locals>.PLANARCONFIGrU   rP   N)r   r   r   rZ  r[  rE   rE   rE   rH   rY  1  s   rY  )r  r  )rY  rE   rE   rH   rY  1  s    zTIFF.PLANARCONFIGc              C   s   G dd dt j} | S )Nc               @   s    e Zd ZdZdZdZdZdZdS )z/TIFF.GRAYRESPONSEUNIT.<locals>.GRAYRESPONSEUNITrU   rP   rC   r   r   N)r   r   r   _10S_100S_1000S_10000S_100000SrE   rE   rE   rH   r  1  s
   r  )r  r  )r  rE   rE   rH   r  1  s    zTIFF.GRAYRESPONSEUNITc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdS )z!TIFF.GROUP4OPT.<locals>.GROUP4OPTrP   N)r   r   r   ZUNCOMPRESSEDrE   rE   rE   rH   	GROUP4OPT1  s   r  )r  r  )r  rE   rE   rH   r  1  s    zTIFF.GROUP4OPTc              C   s   G dd dt j} | S )Nc               @   s(   e Zd ZdZdZdZdZdZdd ZdS )	zTIFF.RESUNIT.<locals>.RESUNITrU   rP   rC   r   r   c             S   s   | dkS )NrU   rE   )r   rE   rE   rH   r   1  s    z&TIFF.RESUNIT.<locals>.RESUNIT.__bool__N)	r   r   r   r   ZINCHZ
CENTIMETERZ
MILLIMETERZ
MICROMETERr   rE   rE   rE   rH   rr  1  s   rr  )r  r  )rr  rE   rE   rH   rr  1  s    
zTIFF.RESUNITc              C   s   G dd dt j} | S )Nc               @   s    e Zd ZdZdZdZdZdZdS )z1TIFF.COLORRESPONSEUNIT.<locals>.COLORRESPONSEUNITrU   rP   rC   r   r   N)r   r   r   r  r  r  r  r  rE   rE   rE   rH   r  1  s
   r  )r  r  )r  rE   rE   rH   r  1  s    zTIFF.COLORRESPONSEUNITc              C   s   G dd dt j} | S )Nc               @   s0   e Zd ZdZdZdZdZdZdZdZ	dd	 Z
d
S )z!TIFF.PREDICTOR.<locals>.PREDICTORrU   rP   rC   iL  iM  iN  iO  c             S   s   | dkS )NrU   rE   )r   rE   rE   rH   r   1  s    z*TIFF.PREDICTOR.<locals>.PREDICTOR.__bool__N)r   r   r   r   Z
HORIZONTALZFLOATINGPOINTZHORIZONTALX2ZHORIZONTALX4ZFLOATINGPOINTX2ZFLOATINGPOINTX4r   rE   rE   rE   rH   r\  1  s   r\  )r  r  )r\  rE   rE   rH   r\  1  s    zTIFF.PREDICTORc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdZdS )z%TIFF.EXTRASAMPLE.<locals>.EXTRASAMPLEr6   rU   rP   N)r   r   r   ZUNSPECIFIEDZ
ASSOCALPHAZ
UNASSALPHArE   rE   rE   rH   r    2  s   r   )r  r  )r   rE   rE   rH   r   1  s    zTIFF.EXTRASAMPLEc              C   s   G dd dt j} | S )Nc               @   s$   e Zd ZdZdZdZdZdZdZdS )z'TIFF.SAMPLEFORMAT.<locals>.SAMPLEFORMATrU   rP   rC   r   r   r   N)	r   r   r   ZUINTINTZIEEEFPZVOIDZ
COMPLEXINTZCOMPLEXIEEEFPrE   rE   rE   rH   rZ  2  s   rZ  )r  r  )rZ  rE   rE   rH   rZ  2  s    zTIFF.SAMPLEFORMATc              C   s   G dd dt j} | S )Nc               @   sT   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdS )z!TIFF.DATATYPES.<locals>.DATATYPESrU   rP   rC   r   r   r   r   r   r   r   rR  r   r0     rt  r   rr  r/  N)r   r   r   ZBYTEASCIIZSHORTLONGZRATIONALZSBYTEr  ZSSHORTZSLONGZ	SRATIONALFLOATDOUBLEri  UNICODEZCOMPLEXZLONG8ZSLONG8ZIFD8rE   rE   rE   rH   r|  2  s$   r|  )r  r  )r|  rE   rE   rH   r|  2  s    zTIFF.DATATYPESc               C   s&   dddddddddd	d
ddddddS )NZ1BZ1sZ1HZ1I2IZ1bZ1hZ1i2iZ1fZ1dZ1QZ1q)rU   rP   rC   r   r   r   r   r   r   r   rR  r   r0  r   rr  r/  rE   rE   rE   rE   rH   r   -2  s     zTIFF.DATA_FORMATSc               C   s    ddddddddd	d
ddddS )NrU   rP   rC   r   r   r   r   r   r   rR  r   r   rr  )r   r   r   r8  r  r  r  r   r  r   r  r9  qrE   rE   rE   rE   rH   r   D2  s    zTIFF.DATA_DTYPESc            Q   C   s   dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	d
ddddddddddPS )NrS   r   r   r8  r9  r  r  r   r  rs  r   r  r\  DrT  )P)rU   rU   )rU   rP   )rU   rC   )rU   r   )rU   r   )rU   r   )rU   r   )rU   r   )rU   r   )rU   r   )rU   rR  )rU   r   )rU   r0  )rU   r  )rU   rt  )rU   r   )rU   rr  )rU   r/  )rU   r+  )rU   r  )rU      )rU      )rU      )rU   r  )rU      )rU      )rU      )rU      )rU      )rU      )rU      )rU   r  )rU   r4  )r   rU   )r   rP   )r   rC   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   rR  )r   r   )r   r0  )r   r  )r   rt  )r   r   )r   rr  )r   r/  )r   r+  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r4  )rP   r   )rP   r   )rP   r  )rP   r4  )rC   r   )rC   r  )rC   r  )rC   r4  )r   r4  )r   r7  )rU   )r   r   r   )r   r   )r   r  )r   r4  rE   rE   rE   rE   rH   r  V2  s    zTIFF.SAMPLE_DTYPESc              C   s   G dd d} |  S )Nc               @   s   e Zd Zdd Zdd ZdS )z#TIFF.PREDICTORS.<locals>.PREDICTORSc             S   s"   t t d| _td krt| jd< d S )N)NrU   rP   )identityfunc_codecsr+  delta_encode)r   rE   rE   rH   r   2  s    z,TIFF.PREDICTORS.<locals>.PREDICTORS.__init__c             S   s   || j kr| j | S y|dkr&tj}nn|dkr6tj}n^|dkrJddd}nJ|dkr^ddd}n6|d	krrdd
d}n"|dkrddd}nt| dW n( tk
r   tt|dY nX || j |< |S )NrP   rC   iL  r   c             S   s   t j| ||ddS )NrP   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  2  s    z>TIFF.PREDICTORS.<locals>.PREDICTORS.__getitem__.<locals>.codeciM  c             S   s   t j| ||ddS )Nr   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  2  s    iN  c             S   s   t j| ||ddS )NrP   )r?  r  r  )r+  floatpred_encode)ry   r?  r  rE   rE   rH   r  2  s    iO  c             S   s   t j| ||ddS )Nr   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  2  s    z is not a known PREDICTORz# requires the 'imagecodecs' package)r   N)r   N)r   N)r   N)r  r+  r  r  r   r   r   r\  )r   rG   r  rE   rE   rH   r  2  s*    


z/TIFF.PREDICTORS.<locals>.PREDICTORS.__getitem__N)r   r   r   r   r  rE   rE   rE   rH   rb  2  s   rb  rE   )rb  rE   rE   rH   rb  2  s    4zTIFF.PREDICTORSc              C   s   G dd d} |  S )Nc               @   s   e Zd Zdd Zdd ZdS )z'TIFF.UNPREDICTORS.<locals>.UNPREDICTORSc             S   s"   t t d| _td krt| jd< d S )N)NrU   rP   )r  r  r+  delta_decode)r   rE   rE   rH   r   2  s    z0TIFF.UNPREDICTORS.<locals>.UNPREDICTORS.__init__c             S   s   || j kr| j | S y|dkr&tj}nn|dkr6tj}n^|dkrJddd}nJ|dkr^ddd}n6|d	krrdd
d}n"|dkrddd}nt| dW n( tk
r   tt|dY nX || j |< |S )NrP   rC   iL  r   c             S   s   t j| ||ddS )NrP   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  2  s    zBTIFF.UNPREDICTORS.<locals>.UNPREDICTORS.__getitem__.<locals>.codeciM  c             S   s   t j| ||ddS )Nr   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  3  s    iN  c             S   s   t j| ||ddS )NrP   )r?  r  r  )r+  floatpred_decode)ry   r?  r  rE   rE   rH   r  3  s    iO  c             S   s   t j| ||ddS )Nr   )r?  r  r  )r+  r  )ry   r?  r  rE   rE   rH   r  3  s    z is not a known PREDICTORz# requires the 'imagecodecs' package)r   N)r   N)r   N)r   N)r  r+  r  r  r   r   r   r\  )r   rG   r  rE   rE   rH   r  2  s*    


z3TIFF.UNPREDICTORS.<locals>.UNPREDICTORS.__getitem__N)r   r   r   r   r  rE   rE   rE   rH   r<  2  s   r<  rE   )r<  rE   rE   rH   r<  2  s    4zTIFF.UNPREDICTORSc              C   s   G dd d} |  S )Nc               @   s   e Zd Zdd Zdd ZdS )z%TIFF.COMPRESSORS.<locals>.COMPRESSORSc             S   s6   t t d| _td kr2t| jd< t| jd< t| jd< d S )N)NrU   r   i  im  )r  r  r+  zlib_encodelzma_encode)r   rE   rE   rH   r   (3  s
    

z.TIFF.COMPRESSORS.<locals>.COMPRESSORS.__init__c             S   s  || j kr| j | S y~|dkr*tj}nh|dkr<tj}nV|dksL|dkrzttdrdtjrdtj}ntjrrtj}nt}n|dkrtj	}n|dks|dks|d	ks|d
krtj
}n|dkrtj}n|dkrtj}n|dkrtjrtj}nt}n|dkrtj}n|dks|dkrtj}nt|dkr0tj}nb|dkrBtj}nP|dkrTtj}n>yt|d}W n  tk
r   | d}Y nX t|W n* tk
r   tt|dY nX || j |< |S )Nr   r   r   i  r  i  i  i  i  i  iG  iL  im  iu  iv  iRX  iP  iQ  iR  z not supportedz is not a known COMPRESSIONz# requires the 'imagecodecs' package)r  r+  Z
lzw_encodeZjpeg_encoder`   r  Zdeflate_encoder   r  Zpackbits_encodeZjpeg2k_encodeZlerc_encodeZjpeg8_encoder  r  Z
png_encodeZjpegxr_encodeZzstd_encodeZwebp_encodeZjpegxl_encoder   r`  r_   r   r   )r   rG   r  r  rE   rE   rH   r  /3  sb    










z1TIFF.COMPRESSORS.<locals>.COMPRESSORS.__getitem__N)r   r   r   r   r  rE   rE   rE   rH   ry  '3  s   ry  rE   )ry  rE   rE   rH   ry  $3  s    DzTIFF.COMPRESSORSc              C   s   G dd d} |  S )Nc               @   s$   e Zd Zdd Zdd Zdd ZdS )z)TIFF.DECOMPRESSORS.<locals>.DECOMPRESSORSc             S   s@   t t d| _td kr<t| jd< t| jd< t| jd< t| jd< d S )N)NrU   r   i  i  im  )r  r  r+  zlib_decodepackbits_decodelzma_decode)r   rE   rE   rH   r   q3  s    


z2TIFF.DECOMPRESSORS.<locals>.DECOMPRESSORS.__init__c             S   s  || j kr| j | S y|dkr*tj}n|dksB|dksB|dkrLtj}nl|dks\|dkrttdrttjrttj}ntjrtj}nt}n.|dkrtj	}n|d	ks|d
ks|dks|dkrtj
}n|dkrtj}n|dkrtj}n|dkrtjrtj}nt}n|dkrtj}n|dks(|dkr0tj}n|dksD|dkrLtj}nl|dks`|dkrhtj}nP|dkrztj}n>yt|d}W n  tk
r   | d}Y nX t|W n* tk
r   tt|dY nX || j |< |S )Nr   r   r   i  r   i  r  i  i  i  i  i  iG  iL  im  iu  iv  iRX  iP  in  iQ  io  iR  z not supportedz is not a known COMPRESSIONz# requires the 'imagecodecs' package)r  r+  Z
lzw_decoder,  r`   r  Zdeflate_decoder   r  r  Zjpeg2k_decodeZlerc_decodeZjpeg8_decoder  r  Z
png_decodeZjpegxr_decodeZzstd_decodeZwebp_decodeZjpegxl_decoder   r`  r_   r   r   )r   rG   r  r  rE   rE   rH   r  y3  sb    









z5TIFF.DECOMPRESSORS.<locals>.DECOMPRESSORS.__getitem__c             S   s&   y| |  W n t k
r    dS X dS )NFT)r   )r   rG   rE   rE   rH   r  3  s
    z6TIFF.DECOMPRESSORS.<locals>.DECOMPRESSORS.__contains__N)r   r   r   r   r  r  rE   rE   rE   rH   r;  p3  s   <r;  rE   )r;  rE   rE   rH   r;  m3  s    LzTIFF.DECOMPRESSORSc               C   s   dddddddhS )Nrz   r  r<   rs   r   r  rn  rE   rE   rE   rE   rH   ry  3  s    zTIFF.FRAME_ATTRSc                  s(   dddddddh  fdd	t tD S )
NZreducedmaskrW  rV  r  r  Z
subsampledc                s8   h | ]0}|d d dkr|dd   kr|dd  qS )NrC   rD   rE   )rF   r)  )excluderE   rH   r  3  s   z"TIFF.FILE_FLAGS.<locals>.<setcomp>)dirr   rE   rE   )r  rH   r  3  s    
zTIFF.FILE_FLAGSc               C   s   ddiS )Nr   a  (?ix)
                # matches Olympus OIF and Leica TIFF series
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
                rE   rE   rE   rE   rH   FILE_PATTERNS3  s    	zTIFF.FILE_PATTERNSc               C   s   dS )N)rh   r   zome.tifr  r  r  ZpcorawZqptiffZgelseqr  r  Zzifr  r  Ztf8Ztf2ZbtfZeerrE   rE   rE   rE   rH   FILE_EXTENSIONS3  s    zTIFF.FILE_EXTENSIONSc               C   s   dd t jD dg S )Nc             S   s$   g | ]}|   d d| fqS )z filesz*.)r_  )rF   r  rE   rE   rH   rG  3  s   z(TIFF.FILEOPEN_FILTER.<locals>.<listcomp>)allfilesrR   )r   r   rE   rE   rE   rH   FILEOPEN_FILTER3  s    zTIFF.FILEOPEN_FILTERc              C   sB   ddddddddd	d
ddddddd} |  dd |  D  | S )Nr  r  r  sampler   r<  ZchannelrN  rO  r  rP  rQ  Zexposureeventr\  Zmosaic)rk  rl  r/  r   r8  r  r   rR  r  rS  r   rT  LVr9  r  c             S   s   i | ]\}}||qS rE   rE   )rF   r  r  rE   rE   rH   
<dictcomp>4  s    z$TIFF.AXES_LABELS.<locals>.<dictcomp>)r   r  )r   rE   rE   rH   rp  4  s$    zTIFF.AXES_LABELSc               C   s   t dS )N)*)i,  ZOffsetHighBytes)i-  ZByteCountHighBytes)i  Z
FileFormat)i  Magnification)i  ZXOffsetFromSlideCenter)i  ZYOffsetFromSlideCenter)i  ZZOffsetFromSlideCenter)i  ZTissueIndex)i  ra  )i  Z
SlideLabel)i  ZAuthCode)i  Z65429)i  Z65430)i  Z65431)i  rb  )i  Z65433)i  ZFluorescence)i  ZExposureRatio)i  ZRedMultiplier)i  ZGreenMultiplier)i  ZBlueMultiplier)i  ZFocusPoints)i  ZFocusPointRegions)i  ZCaptureMode)i  ZScannerSerialNumber)i  Z65443)i  ZJpegQuality)i  ZRefocusInterval)i  ZFocusOffset)i  Z
BlankLines)i  ZFirmwareVersion)i  Comments)i  ZLabelObscured)i  
Wavelength)i  Z65452)i  ZLampAge)i  r[  )i  Z	FocusTime)i  ZScanTime)i  Z	WriteTime)i  ZFullyAutoFocus)i  ZDefaultGamma)r   rE   rE   rE   rH   rc  4  s    zTIFF.NDPI_TAGSc              C   s   t d} | tj | S )N))i  Z	OwnerName)i  ZSerialNumber)i  ZLens)iL  ZRawFile)iM  Z	Converter)iN  r  )iQ  ZExposure)iR  ZShadows)iS  Z
Brightness)iT  r  )iU  r  )iV  r  )iW  Z
Smoothness)iX  ZMoireFilter)r   r   r   r   )r  rE   rE   rH   	EXIF_TAGSK4  s    zTIFF.EXIF_TAGSc               C   s   t dS )N) )r6   ZGPSVersionID)rU   ZGPSLatitudeRef)rP   ZGPSLatitude)rC   ZGPSLongitudeRef)r   ZGPSLongitude)r   ZGPSAltitudeRef)r   ZGPSAltitude)r   ZGPSTimeStamp)r   ZGPSSatellites)r   Z	GPSStatus)r   ZGPSMeasureMode)rR  ZGPSDOP)r   ZGPSSpeedRef)r0  ZGPSSpeed)r  ZGPSTrackRef)rt  ZGPSTrack)r   ZGPSImgDirectionRef)rr  ZGPSImgDirection)r/  ZGPSMapDatum)r+  ZGPSDestLatitudeRef)r  ZGPSDestLatitude)r  ZGPSDestLongitudeRef)r  ZGPSDestLongitude)r  ZGPSDestBearingRef)r  ZGPSDestBearing)r  ZGPSDestDistanceRef)r  ZGPSDestDistance)r  ZGPSProcessingMethod)r  ZGPSAreaInformation)r  ZGPSDateStamp)r  ZGPSDifferential)r  ZGPSHPositioningError)r   rE   rE   rE   rH   GPS_TAGSb4  s    zTIFF.GPS_TAGSc               C   s   t dS )N))rU   r  )rP   r  )i   ZRelatedImageFileFormat)i  ZRelatedImageWidth)i  ZRelatedImageLength)r   rE   rE   rE   rH   IOP_TAGS4  s    zTIFF.IOP_TAGSc              C   sb   yddl m}  W nL tk
r\   yddl m}  W n& tk
rV   G dd dtj} Y nX Y nX | S )NrU   )GeoKeysr6   c               @   s   e Zd ZdS )zTIFF.GEO_KEYS.<locals>.GeoKeysN)r   r   r   rE   rE   rE   rH   r  4  s   r  )tifffile_geodbr  rm  r  r  )r  rE   rE   rH   rh  4  s    zTIFF.GEO_KEYSc              C   sT   yddl m}  W n> tk
rN   yddl m}  W n tk
rH   i } Y nX Y nX | S )NrU   )ri  r6   )r  ri  rm  )ri  rE   rE   rH   ri  4  s    zTIFF.GEO_CODESc            :   C   sx   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:g:S );N)ZMagicNumberu4)ZStructureSizei4)
DimensionXr  )
DimensionYr  )
DimensionZr  )DimensionChannelsr  )DimensionTimer  )r  r  )Z
ThumbnailXr  )Z
ThumbnailYr  )Z
VoxelSizeXf8)Z
VoxelSizeYr  )Z
VoxelSizeZr  )ZOriginXr  )ZOriginYr  )ZOriginZr  )r  u2)ZSpectralScanr  )Z
TypeOfDatar  )ZOffsetVectorOverlayr  )ZOffsetInputLutr  )ZOffsetOutputLutr  )ZOffsetChannelColorsr  )TimeIntervallr  )ZOffsetChannelDataTypesr  )ZOffsetScanInformationr  )ZOffsetKsDatar  )ZOffsetTimeStampsr  )ZOffsetEventListr  )Z	OffsetRoir  )ZOffsetBleachRoir  )ZOffsetNextRecordingr  )ZDisplayAspectXr  )ZDisplayAspectYr  )ZDisplayAspectZr  )ZDisplayAspectTimer  )ZOffsetMeanOfRoisOverlayr  )ZOffsetTopoIsolineOverlayr  )ZOffsetTopoProfileOverlayr  )ZOffsetLinescanOverlayr  )ZToolbarFlagsr  )ZOffsetChannelWavelengthr  )ZOffsetChannelFactorsr  )ZObjectiveSphereCorrectionr  )ZOffsetUnmixParametersr  )ZOffsetAcquisitionParametersr  )ZOffsetCharacteristicsr  )ZOffsetPaletter  )ZTimeDifferenceXr  )ZTimeDifferenceYr  )ZTimeDifferenceZr  )ZInternalUse1r  )r  r  )r  r  )ZDimensionsReservedZ16i4)ZOffsetTilePositionsr  )r  Z9u4)ZOffsetPositionsr  rE   rE   rE   rE   rH   r  4  st    zTIFF.CZ_LSMINFOc               C   s6   t tttttd ttd td d d d d d d td d d d d dS )N)ZScanInformationZ
TimeStampsZ	EventListZChannelColorsZ	PositionsZTilePositionsZVectorOverlayZInputLutZ	OutputLutr  ZChannelDataTypesZKsDataZRoiZ	BleachRoiZNextRecordingZMeanOfRoisOverlayZTopoIsolineOverlayZTopoProfileOverlayZChannelWavelengthZSphereCorrectionZChannelFactorsZUnmixParametersZAcquisitionParametersZCharacteristics)read_lsm_scaninforead_lsm_timestampsread_lsm_eventlistread_lsm_channelcolorsread_lsm_positionsread_lsm_lookuptableread_lsm_channeldatatypesread_lsm_channelwavelengthrE   rE   rE   rH   CZ_LSMINFO_READERS4  s0    zTIFF.CZ_LSMINFO_READERSc               C   s   ddddddddddddS )NrU  rX  rV  rW  rL  )r6   rU   rP   rC   r   r   r   r   r   r   r   rE   rE   rE   rE   rH   r  	5  s    zTIFF.CZ_LSMINFO_SCANTYPEc               C   s   ddddddddS )	Nr  r  r  r  r  r  r  )rk  rl  r/  r   r  r  r  rE   rE   rE   rE   rH   r  5  s    zTIFF.CZ_LSMINFO_DIMENSIONSc               C   s   dddddS )Nzvarying data typesz8 bit unsigned integerz12 bit unsigned integerz32 bit float)r6   rU   rP   r   rE   rE   rE   rE   rH   CZ_LSMINFO_DATATYPES%5  s    zTIFF.CZ_LSMINFO_DATATYPESc               C   s   dddddS )NzOriginal scan datazCalculated dataz3D reconstructionzTopography height map)r6   rU   rP   rC   rE   rE   rE   rE   rH   CZ_LSMINFO_TYPEOFDATA.5  s    zTIFF.CZ_LSMINFO_TYPEOFDATAc            	   C   s   ddddddddd	S )
NZTracksZLasersZDetectionChannelsZIlluminationChannelsZBeamSplittersZDataChannelsZTimersZMarkers)i    i   0i   `l        l      @ l        i   i   rE   rE   rE   rE   rH   CZ_LSMINFO_SCANINFO_ARRAYS75  s    zTIFF.CZ_LSMINFO_SCANINFO_ARRAYSc            	   C   s   ddddddddd	S )
NZTrackZLaserZDetectionChannelZIlluminationChannelZBeamSplitterZDataChannelr   Marker)i   @i   Pi   pl        l      ` l        i   i   rE   rE   rE   rE   rH   CZ_LSMINFO_SCANINFO_STRUCTSC5  s    z TIFF.CZ_LSMINFO_SCANINFO_STRUCTSc               C   s|  ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMddNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndoddKdpdqdrdsdtdudvdwdxdydzdKd{d|d}d~ddddddddddddddddpddddddddddKddddddddddddddddddddKddddUdVdddddUdVdS )Nr`  r_  ZNotesZ	ObjectiveZProcessingSummaryZSpecialScanModer  ZScanModeZNumberOfStacksZLinesPerPlaneZSamplesPerLineZPlanesPerVolumeZImagesWidthZImagesHeightZImagesNumberPlanesZImagesNumberStacksZImagesNumberChannelsZLinscanXySizeZScanDirectionZ
TimeSeriesZOriginalScanDataZZoomXZZoomYZZoomZZSample0XZSample0YZSample0ZZSampleSpacingZLineSpacingZPlaneSpacingZ
PlaneWidthZPlaneHeightZVolumeDepthZNutationZRotationZ
PrecessionZSample0timeZStartScanTriggerInZStartScanTriggerOutZStartScanEventZStartScanTimeZStopScanTriggerInZStopScanTriggerOutZStopScanEventZStopScanTimeZUseRoisZUseReducedMemoryRoisZUserZUseBcCorrectionZPositionBcCorrection1ZPositionBcCorrection2ZInterpolationYZCameraBinningZCameraSupersamplingZCameraFrameWidthZCameraFrameHeightZCameraOffsetXZCameraOffsetYZ	RtBinningZRtFrameWidthZRtFrameHeightZRtRegionWidthZRtRegionHeightZ	RtOffsetXZ	RtOffsetYZRtZoomZRtLinePeriodZPrescanZScanDirectionZZMultiplexTypeZMultiplexOrderZSamplingModeZSamplingMethodZSamplingNumberZAcquireZSampleObservationTimeZTimeBetweenStacksZCollimator1NameZCollimator1PositionZCollimator2NameZCollimator2PositionZIsBleachTrackZIsBleachAfterScanNumberZBleachScanNumberZ	TriggerInZ
TriggerOutZIsRatioTrackZBleachCountZSpiCenterWavelengthZ	PixelTimeZCondensorFrontlensZFieldStopValueZIdCondensorApertureZCondensorApertureZIdCondensorRevolverZCondensorFilterZIdTransmissionFilter1ZIdTransmission1ZIdTransmissionFilter2ZIdTransmission2ZRepeatBleachZEnableSpotBleachPosZSpotBleachPosxZSpotBleachPosyZSpotBleachPoszZ
IdTubelensZIdTubelensPositionZTransmittedLightZReflectedLightZSimultanGrabAndBleachZBleachPixelTimeZPowerZIntegrationModeZSpecialModeZDetectorGainFirstZDetectorGainLastZAmplifierGainFirstZAmplifierGainLastZAmplifierOffsFirstZAmplifierOffsLastZPinholeDiameterZCountingTriggerZPointDetectorNameZAmplifierNameZPinholeNameZFilterSetNameZ
FilterNameZIntegratorNameZChannelNameZDetectorGainBc1ZDetectorGainBc2ZAmplifierGainBc1ZAmplifierGainBc2ZAmplifierOffsetBc1ZAmplifierOffsetBc2ZSpectralScanChannelsZSpiWavelengthStartZSpiWavelengthStopZDyeNameZ	DyeFolderr
  ZAquireZDetchannelNameZPowerBc1ZPowerBc2Z	FilterSetFilterr^  Z
SampleTyper  Z	RatioTypeZRatioTrack1ZRatioTrack2ZRatioChannel1ZRatioChannel2ZRatioConst1ZRatioConst2ZRatioConst3ZRatioConst4ZRatioConst5ZRatioConst6ZRatioFirstImages1ZRatioFirstImages2SpectrumZIntervalZActivationTimeZActivationNumber)i  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i   i!  i#  i4  i5  i6  i7  i8  i9  i@  iA  iB  iC  iD  iE  iF  iG  iH  iI  iP  iQ  iR  iS  iT  iU  iV  iW  iY  iZ  i[  i\  i]  i^  i_  i`  ia  ib  ic  i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i  @i!  @i#  @i$  @i%  @i&  @i'  @i(  @i)  @i0  @i1  @i2  @i3  @i4  @i5  @i6  @i7  @i8  @i9  @i:  @i;  @i<  @i  Pi  Pi  Pi  pi  pi  pi  pi  pi  pi  pi  pi	  pi
  pi  pi  pi  pi  pi  pi  pi  pi  pi  pi  pi  pi  pi  pi   pi!  pi"  pi#  pi&  pi'  pl       l       l       l       l       l       l       l     ` l     ` l     ` l       l       l       l       l       l       l       l   	    l   
    l       l       l       l       l       l       l       l       l       l       l       l       l       i  i  i  i  i  i  i  i  i  i  i  rE   rE   rE   rE   rH   CZ_LSMINFO_SCANINFO_ATTRIBUTESP5  sv   z#TIFF.CZ_LSMINFO_SCANINFO_ATTRIBUTESc              C   s   G dd dt j} | S )Nc               @   s$   e Zd ZdZdZdZdZdZdZdS )z+TIFF.CZ_LSM_LUTTYPE.<locals>.CZ_LSM_LUTTYPEr6   rU   rP   rC   r   r   N)	r   r   r   ZNORMALZORIGINALRAMPZPOLYLINEZSPLINEGAMMArE   rE   rE   rH   CZ_LSM_LUTTYPE6  s   r-  )r  r  )r-  rE   rE   rH   r-  6  s    zTIFF.CZ_LSM_LUTTYPEc              C   s   G dd dt j} | S )Nc               @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	z7TIFF.CZ_LSM_SUBBLOCK_TYPE.<locals>.CZ_LSM_SUBBLOCK_TYPEr6   rU   rP   rC   r   r   r   N)
r   r   r   ZENDr,  Z
BRIGHTNESSZCONTRASTr+  ZKNOTSZPALETTE_12_TO_12rE   rE   rE   rH   CZ_LSM_SUBBLOCK_TYPE$6  s   r.  )r  r  )r.  rE   rE   rH   r.  #6  s    	zTIFF.CZ_LSM_SUBBLOCK_TYPEc            .   C   sp   ddddddddd	d
ddddddddddgfdddgfddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0g.S )1N)ZFileIDZa8)nLinesi2)ZPixelsPerLiner0  )Versionr0  )Z
OldLutModer0  )Z
OldnColorsr0  )Colorsu1)rC   r  )ZOldColorStartr0  )Z
ColorWidthr0  )ZExtraColorsr  )r   rC   )ZnExtraColorsr0  )ZForegroundIndexr0  )ZBackgroundIndexr0  )ZXScaler  )ZUnused2r0  )ZUnused3r0  )ZUnitsIDr0  p1)r=  r0  )yr0  p2)ZCurveFitTyper0  )ZnCoefficientsr0  )ZCoeffr  r   )UMsizer3  )UMZa15)ZUnusedBooleanr3  )Z	BinaryPicb1)Z
SliceStartr0  )ZSliceEndr0  )ZScaleMagnificationf4)ZnSlicesr0  )ZSliceSpacingr:  )ZCurrentSlicer0  )ZFrameIntervalr:  )ZPixelAspectRatior:  )Z
ColorStartr0  )ZColorEndr0  )ZnColorsr0  )ZFill13u2)ZFill2r;  )Tabler3  )ZLutModer3  )ZInvertedTabler9  )ZZeroClipr9  )	XUnitSizer3  )XUnitZa11)Z	StackTyper0  rE   rE   rE   rE   rH   NIH_IMAGE_HEADER/6  s\    

zTIFF.NIH_IMAGE_HEADERc               C   s   dS )N)
ZCustomTableZAppleDefaultZPseudo20ZPseudo32ZRainbowZFire1ZFire2ZIceZGraysr)  rE   rE   rE   rE   rH   NIH_COLORTABLE_TYPEb6  s    zTIFF.NIH_COLORTABLE_TYPEc               C   s   dS )N)ZPseudoColorZOldAppleDefaultZOldSpectrumZ	GrayScaleZColorLutZCustomGrayscalerE   rE   rE   rE   rH   NIH_LUTMODE_TYPEp6  s    zTIFF.NIH_LUTMODE_TYPEc               C   s   dS )N)ZStraightLineZPoly2ZPoly3ZPoly4ZPoly5ZExpoFitZPowerFitZLogFitZ
RodbardFitZ	SpareFit1ZUncalibratedZUncalibratedODrE   rE   rE   rE   rH   NIH_CURVEFIT_TYPEz6  s    zTIFF.NIH_CURVEFIT_TYPEc               C   s   dS )N)Z
NanometersZMicrometersZMillimetersZCentimetersZMetersZ
KilometersZInchesZFeetZMilesra  Z
OtherUnitsrE   rE   rE   rE   rH   NIH_UNITS_TYPE6  s    zTIFF.NIH_UNITS_TYPEc            *   C   sX   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*g*S )+N)r1  r  )Z	CommentV1Za80)ZHighTensionr  )ZSphericalAberrationr  )ZIlluminationAperturer  )r  r  )PostMagnificationr  )r  r  )ZDefocusr  )ZAstigmatismr  )ZAstigmatismDirectionr  )ZBiprismVoltager  )ZSpecimenTiltAngler  )ZSpecimenTiltDirectionr  )ZIlluminationTiltDirectionr  )ZIlluminationTiltAngler  )Z	ImageModer  )ZEnergySpreadr  )ZChromaticAberrationr  )ZShutterTyper  )ZDefocusSpreadr  )Z	CcdNumberr  )ZCcdSizer  )Z	OffsetXV1r  )Z	OffsetYV1r  )PhysicalPixelSizer  )ZBinningr  )ZReadoutSpeedr  )ZGainV1r  )ZSensitivityV1r  )ZExposureTimeV1r  )ZFlatCorrectedr  )ZDeadPxCorrectedr  )Z	ImageMeanr  )ZImageStdr  )ZDisplacementXr  )ZDisplacementYr  )ZDateV1r  )ZTimeV1r  )ZImageMinr  )ZImageMaxr  )ZImageStatisticsQualityr  rE   rE   rE   rE   rH   TVIPS_HEADER_V16  sT    zTIFF.TVIPS_HEADER_V1c            6   C   sp   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6g6S )7N)r#  V160)ZImageFolderrG  )Z
ImageSizeXr  )Z
ImageSizeYr  )Z
ImageSizeZr  )Z
ImageSizeEr  )ZImageDataTyper  )Dater  )Timer  )CommentV1024)r  rK  )ZScalingZ16f4)ZImageStatisticsZ16c16)r  r  )ZImageDisplaTyper  )Z
PixelSizeXr:  )Z
PixelSizeYr:  )ZImageDistanceZr:  )ZImageDistanceEr:  )Z	ImageMisc32f4)ZTemTyperG  )ZTemHighTensionr:  )ZTemAberrationsrL  )Z	TemEnergyrL  )ZTemModer  )ZTemMagnificationr:  )ZTemMagnificationCorrectionr:  )rD  r:  )ZTemStageTyper  )ZTemStagePositionZ5f4)ZTemImageShift2f4)ZTemBeamShiftrM  )ZTemBeamTiltrM  )ZTilingParametersZ7f4)ZTemIlluminationZ3f4)Z
TemShutterr  )ZTemMiscrL  )Z
CameraTyperG  )ZPhysicalPixelSizeXr:  )ZPhysicalPixelSizeYr:  )ZOffsetXr  )ZOffsetYr  )ZBinningXr  )ZBinningYr  )r[  r:  )ZGainr:  )ZReadoutRater:  )ZFlatfieldDescriptionrG  )ZSensitivityr:  )ZDoser:  )ZCamMiscrL  )ZFeiMicroscopeInformationrK  )ZFeiSpecimenInformationrK  )Magicr  rE   rE   rE   rE   rH   TVIPS_HEADER_V26  sl    zTIFF.TVIPS_HEADER_V2c              C   sJ   dddddg} dddd	d
ddddd| dfdddddddddd| fdddgS )N)r`  Za16)rc  r  )ZOriginr  )r9  r  )ZUnitZa64)Z
HeaderFlagr0  )r  r3  )r#  Za257)Z
OffsetDatar  )ZPaletteSizer  )ZOffsetPalette0r  )ZOffsetPalette1r  )ZCommentSizer  )ZOffsetCommentr  r!  r   )ZOffsetPositionr  )ZMapTyper0  )ZMapMinr  )ZMapMaxr  )ZMinValuer  )ZMaxValuer  )Z	OffsetMapr  )r  r  )Offsetr  GrayChannel)ZOffsetThumbnailr  )Z
VoiceFieldr  )ZOffsetVoiceFieldr  rE   )ZMM_DIMENSIONrE   rE   rH   	MM_HEADER7  s8    zTIFF.MM_HEADERc               C   s   ddddddddddd	
S )
Nrk  rl  r/  r  r   rS  r  r  )
rk  rl  r/  r  ZCHZ
WAVELENGTHZTIMEr  ZEVENTZEXPOSURErE   rE   rE   rE   rH   r"  &7  s    zTIFF.MM_DIMENSIONSc           C   C   sH  ddl m}  dtfdtfdtfdtfd| fd| fd	tfd
tfdtfdtfddtfdtfdtfdtfdtfdtfdtfdtfddd| fd| fd| fd| fdtfdtfdtfdd d!d"d#d$d%d&d'tfd(d)| fd*| fd+d,d-d.d/d0d1d2tfd3d4tfd5d6tfd7| fd8| fd9tfd:tfd;tfd<| fd=| fd>tfd?tfd@tfdA| fdB| fdCtfdDtfgBS )ENr6   )r  Z	AutoScaleMinScaleMaxScaleZSpatialCalibrationZXCalibrationZYCalibrationZCalibrationUnitsr`  ZThreshStateZThreshStateRed)Ztagid_10NZThreshStateGreenZThreshStateBlueZThreshStateLoZThreshStateHiZZoomZ
CreateTimeZLastSavedTimeZcurrentBuffer)ZgrayFitN)ZgrayPointCountNZgrayXZgrayYZgrayMinZgrayMaxZgrayUnitNameZStandardLUTZ
wavelength)ZStagePositionz
(%i,2,2)u4)ZCameraChipOffsetz
(%i,2,2)u4)ZOverlayMaskN)ZOverlayCompressN)ZOverlayN)ZSpecialOverlayMaskN)ZSpecialOverlayCompressN)ZSpecialOverlayNZImageProperty)Z
StageLabelz%ipZAutoScaleLoInfoZAutoScaleHiInfo)Z	AbsoluteZz(%i,2)u4)ZAbsoluteZValidz(%i,)u4)r  r8  )ZGammaRedr8  )Z
GammaGreenr8  )Z	GammaBluer8  )Z	CameraBinr  ZNewLUT)ZImagePropertyExNZPlaneProperty)ZUserLutTablez	(256,3)u1ZRedAutoScaleInfoZRedAutoScaleLoInfoZRedAutoScaleHiInfoZRedMinScaleInfoZRedMaxScaleInfoZGreenAutoScaleInfoZGreenAutoScaleLoInfoZGreenAutoScaleHiInfoZGreenMinScaleInfoZGreenMaxScaleInfoZBlueAutoScaleInfoZBlueAutoScaleLoInfoZBlueAutoScaleHiInfoZBlueMinScaleInfoZBlueMaxScaleInfo)r  r  r   r]   r  read_uic_image_property)r  rE   rE   rH   UIC_TAGS57  s    zTIFF.UIC_TAGSc            '   C   sJ  t dd gtfddgtfdgtfdgtfdgtfdgtfdgtfdgtfddgtfdgtfdgtfdgtfdgtfdgtfdgtfddgtfdgtfdgtfddgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtfdgtft dd gtfdgtfdgtfdgtfdgtfdgtfdgtfd&S )NrU   r   rC   rP   )&ZDetectorZ
Pixel_sizeZSiliconZExposure_timeZExposure_periodTauZCount_cutoffZThreshold_settingZGain_settingZN_excluded_pixelsZExcluded_pixelsZ
Flat_fieldZ	Trim_fileZ
Image_pathr
  ZEnergy_rangeZDetector_distanceZDetector_VoffsetZBeam_xyZFluxZFilter_transmissionZStart_angleZAngle_incrementZDetector_2thetaZPolarizationAlphaKappaPhiZPhi_incrementChiZChi_incrementZOscillation_axisZN_oscillationsZStart_positionZPosition_incrementZShutter_timeOmegaZOmega_increment)r  r]   rq  r   rE   rE   rE   rH   PILATUS_HEADER7  sL    



zTIFF.PILATUS_HEADERc              C   s   dd l } | jS )Nr6   )mmapr   )r^  rE   rE   rH   r   7  s    zTIFF.ALLOCATIONGRANULARITYc              C   s   dd l } t|  d dS )Nr6   rP   rU   )r  r  r  )r  rE   rE   rH   rT  7  s    zTIFF.MAXWORKERSc              C   s   G dd dt j} | S )Nc               @   s   e Zd ZdZdZdZdZdS )z!TIFF.CHUNKMODE.<locals>.CHUNKMODEr6   rU   rP   rC   N)r   r   r   r   ZPLANEr  FILErE   rE   rE   rH   r  7  s   r  )r  r  )r  rE   rE   rH   r  7  s    zTIFF.CHUNKMODEN)Lr   r   r   r   r   r   r   r   r  r   r  r  r  r	  r  r  r  r`  rS  re  r  r  r  rY  r  r  rr  r  r\  r   rZ  r|  r   r   r  rb  r<  ry  r;  ry  r  r  r   r  rp  rc  r  r  r  rh  ri  r  r"  r  r  r#  r$  r%  r'  r*  r-  r.  r?  r@  rA  rB  rC  rF  rO  rR  r"  rV  r]  r   rT  r  rE   rE   rE   rH   r   -  s        *B	A

\99IQ2&
A		 I3
/;#K-r   c       !         s  |dkr2|d }d}|d }d}	|d }
|d }n:|dkrd|d	 }d}|d	 }d
}	|d }
|d }nt d|dkrxi }|dkrd}g }tj}|  }xt||k ry.||| |d }|dkrtd| W n< tk
r } ztd| d| d P W dd}~X Y nX i }| |	| }|  }d}x"t	|D ]}||
|||d  \}}||||d ||	  \}}||	7 }|
|t|}ytj| }W n* tk
r   td|d| Y nX |t| }||ks||kr|||d }|dk s|| | jkr,td| d| | | ||kr^|| d }|| ||||}n|dks||dks||dkr| |}t||krtd|  nJ||krd||t|d  |d }||| |}nt| ||||}n\|dks|dks|dkr|d| }n0d||t|d  |d }|||d| }||koh|tjkoh|dk} | r|dkrytt|dd }W n$ tk
r   td|  Y nX n|tjkr.tj|  yt fdd |D }W nB t k
r, } z"|d!krtd"| d#|  W dd}~X Y nX | rJt|dkrJ|d }|||< q>W || | | ||| |d }|dkrP || jkrtd$|  P | | qW |r|dkr|d }|S )%zRead tags from chain of IFDs and return as list of dicts.

    The file handle position must be at a valid IFD header.
    Does not work with NDPI.

    r   r8  rP   r   r   r   ZI4sr   r9  r  ZQ8szinvalid offset sizeNl        r6   i   zsuspicious number of tags z)<tifffile.read_tags> corrupted tag list @z (r  zinvalid data type z
 for tag #zinvalid value offset rU   r   z8<tifffile.read_tags> could not read all values for tag #z{}{}{}F)r  z><tifffile.read_tags> coercing invalid ASCII to bytes for tag #c             3   s   | ]} |V  qd S )NrE   )rF   r  )rE  rE   rH   rI   :8  s    zread_tags.<locals>.<genexpr>)i  i=  z%<tifffile.read_tags> failed for tag #z: z.<tifffile.read_tags> invalid next page offset )r_   r   r  r   rc   r  r   rv   rq  rw  rV   r]   r   r   r   r  r<   rT   r  r   r  r  r  r0   r  r  r  r  ri   )!r   rk   r  ZtagnamesZ
customtagsmaxifdsr   r  rQ  rR  rx  r~  r|   r  r;   r  r   r  ry   r   r  r   r
  rs   r  r   r:   r  r  r~  r  r   processrE   )rE  rH   	read_tags7  s    	








$


rb  c          	   C   s   t | ||tjdd}x6dD ].}yt|| ||< W q tk
rF   Y qX qW d|kr|d dd }yH|dkrt|d dd |d< n"|dkr|d dd d	|d< W n tk
r   Y nX |S )
z,Read EXIF tags from file and return as dict.rU   )r`  )r  r  r  Nr   s   ASCII   s   UNICODE zutf-16)rb  r   r  r  rv   rn  )r   rk   rs   r  r  Zexifr:   ZidcoderE   rE   rH   r  Y8  s     

r  c             C   s   t | ||tjddS )z+Read GPS tags from file and return as dict.rU   )r`  )rb  r   r  )r   rk   rs   r  r  rE   rE   rH   r  m8  s    r  c             C   s   t | ||tjddS )z8Read Interoperability tags from file and return as dict.rU   )r`  )rb  r   r  )r   rk   rs   r  r  rE   rE   rH   r  r8  s    r  c             C   sb   |dkrdn|t j| d  }|t|j9 }| |}t||kr^td| dt| d |S )z,Read tag data from file and return as bytes.rP   r   r   z%<tifffile.read_bytes> failed to read z bytes, got r  )r   r   rr   rs   rt   r  rc   rq  )r   rk   rs   r  r  ry   rE   rE   rH   r  w8  s    
r  c             C   s   |  | S )z5Read tag data from file and return as Unicode string.)r  rn  )r   rk   rs   r  r  rE   rE   rH   	read_utf88  s    rc  c             C   s*   |dkrdn|t j| d  }| ||S )z2Read tag data from file and return as numpy array.rP   r  r   )r   r   r  )r   rk   rs   r  r  rE   rE   rH   r  8  s    r  c             C   s0   |  |tj| d  |}|d dkr,d|_|S )zCRead ColorMap/TransferFunction from file and return as numpy array.r   rC   r6   )rC   r   )r  r   r   rz   )r   rk   rs   r  r  cmaprE   rE   rH   r  8  s    r  c          
   C   s\   |  |}ytt| S  tk
rV } ztd|jj d|  W dd}~X Y nX dS )z2Read JSON tag data from file and return as object.z<tifffile.read_json> z: N)	r  r  r  r0   rn  r_   rq  r   r   )r   rk   rs   r  r  ry   r   rE   rE   rH   r  8  s    
*r  c             C   sp   | j tj|d}t|}dd |d D |d< |d }t|d  |d |d |d	 t|d
  f|d< |S )z9Read FluoView mm_header tag from file and return as dict.)rk   c          	   S   s>   g | ]6}t |d   |d |d |d t |d  fqS )r6   rU   rP   rC   r   )r  r  )rF   r  rE   rE   rH   rG  8  s   z"read_mm_header.<locals>.<listcomp>r!  rQ  r6   rU   rP   rC   r   )r(  r   rR  recarray2dictr  r  )r   rk   rs   r  r  Zmmhr  rE   rE   rH   r  8  s    r  c             C   s   |  |d dS )zARead FluoView mm_stamp tag from file and return as numpy.ndarray.r  r   )r  )r   rk   rs   r  r  rE   rE   rH   r  8  s    r  c             C   s   |dks|dkr"t d| | i }|dkrl| dd| |d}d|ddd	f |ddd
f  i}nXxVt|D ]J}td| dd	 }	|	dkr| d qvt| |	|dd\}
}|||
< qvW |S )zuRead MetaMorph STK UIC1Tag from file and return as dict.

    Return empty dictionary if planecount is unknown.

    )r   r   r   zinvalid UIC1Tag r   z<u4rP   r  Nr6   rU   z<Ir   )r  r  %   (   )   T)r;   )r_   r  rh  rw  r   r  r  read_uic_tag)r   rk   rs   r  r  rd  r|   r  r   rj  r:   r   rE   rE   rH   r  8  s    &
r  c             C   s   |dks|dkrt d| dd| |d}|dddf |dddf  |ddd	f |ddd
f |dddf |dddf dS )z8Read MetaMorph STK UIC2Tag from file and return as dict.r   r   zinvalid UIC2Tagz<u4r   Nr6   rU   rP   rC   r   )r  r  r  r  r  )r_   r  rh  )r   rk   rs   rd  r  r  rE   rE   rH   r  8  s    r  c             C   sT   |dks|dkrt d| dd| |d}d|dddf |ddd	f  iS )
z8Read MetaMorph STK UIC3Tag from file and return as dict.r   r   zinvalid UIC3Tagz<u4rP   ZWavelengthsNr6   rU   )r_   r  rh  )r   rk   rs   rd  r  r  rE   rE   rH   r  8  s    r  c       	      C   sb   |dks|dkrt di }x@td| dd }|dkr>P t| ||dd\}}|||< qW |S )	z8Read MetaMorph STK UIC4Tag from file and return as dict.r   r   zinvalid UIC4Tagz<HrP   r6   F)r;   )r_   r   r  r  ri  )	r   rk   rs   rd  r  r|   rj  r:   r   rE   rE   rH   r  8  s    r  c                s  d fdd	}yt j| \}}W n  tk
r@   d| | fS X t jd d }|r  }|tdfkr| }	|	dk r|tkr|dfS td	|d
|	  ||	fS  |	 |dkrd| }| }
n.|tkr| }
n||k r|d}
|
d |
d  }
n|tkrt|d }
n|t	kr.t	 }
n|tkr| }d|  krVdk rn n2t
| d |d dd }
tt|
}
n(|rd}
td| ntd| n<|dkrd}
n*|dkrpg }
xt|D ]}| }d|  krdk rDn n<t
| d |d dd }tt|}|
| n$|rZtd| ntd| qW nd| }d|kr|| }d|krƈ |dd }
|
jd dkr|
d |
d  }
n.t
| t
|}
t|
dkr|
d }
|r |d  ||
fS )zgRead a single UIC tag value from file and return tag name and value.

    UIC1Tags use an offset.

    rU   c                s2   t d|  d d|  }| dkr.|d S |S )Nr   r8  r   rU   r6   )r   r  r  )r  r   )r   rE   rH   read_int8  s    zread_uic_tag.<locals>.read_intZ_TagIdr   Nr   r  z/<tifffile.read_uic_tag> invalid offset for tag z @r   rP   r6   i   r   r   z.<tifffile.read_uic_tag> invalid string in tag zinvalid string size z%ipzinvalid string size: r   z%ir  ).r6   ).rU   )rU   )r   rV  ru  r   r   r]   rq  rT   r  rU  r   r  r  r  r0   r_   rw  ri   r  rz   r  rc   )r   rj  rd  r;   rj  r:   rs   r  r   offr   r<   r   stringrE   )r   rH   ri  8  s    






$

$

ri  c             C   s   t d| dd }t | d| |d dd }t d| d\}}|dkr|t d	| d
}|d |d  }n2t d| dd }t | d| |d }t|||dS )z:Read UIC ImagePropertyEx tag from file and return as dict.r   rU   r6   r   Nr   z<IBr   IIr   )r:   r  r   )r   r  r  r^  )r   r<   r:   r  r)  r   rE   rE   rH   rU  ]9  s    $rU  c          	   C   s*  |dkrt dtd| d\}}|dkr6t d| dtj |tt	j
jk rg }d}xBt	j
D ]0\}	}|t|j7 }||krP ||	|f qfW nt	j
}| j||d}t|}xlt	j D ]^\}	}
|
d	krq|d
|	 d}|dk rq| | y|
| ||	< W q t k
r    Y qX qW |S )z1Read CZ_LSMINFO tag from file and return as dict.r   zinvalid CZ_LSMINFO structurez<IIr   )iLI iLI ir6   )rk   NrP  )r_   r   r  r  rT   ra   r  rr   rs   r   r  rt   ri   r(  re  r"  r  rV   )r   rk   rs   r  r  Zmagic_numberZstructure_sizeZlsminfor<   r:   readerr;   rE   rE   rH   r  l9  s:    

r  c             C   s$   t d| dd }| jd|dS )zRead LSM channel data type.z<Ir   r6   z<u4)r  )r   r  r  r  )r   r<   rE   rE   rH   r   9  s    r   c             C   s$   t d| dd }| jd|dS )z@Read LSM channel wavelength ranges from file and return as list.z<ir   r6   z<2f8)r  )r   r  r  r  )r   r<   rE   rE   rH   r!  9  s    r!  c             C   s$   t d| dd }| jd|dS )z0Read LSM positions from file and return as list.z<Ir   r6   z<3f8)r  )r   r  r  r  )r   r<   rE   rE   rH   r  9  s    r  c             C   s@   t d| d\}}|dd|  kr2td g S | jd|dS )z2Read LSM time stamps from file and return as list.z<iir   z;<tifffile.read_lsm_timestamps> invalid LSM TimeStamps blockz<f8)r  )r   r  r  rq  r  )r   r<   r  rE   rE   rH   r  9  s    r  c             C   sr   t d| dd }g }xR|dkrlt d| d\}}}tt| |d }||||f |d8 }qW |S )zCRead LSM events from file and return as list of (time, type, text).z<IIr   rU   r6   z<IdIr   )r   r  r  r  r0   ri   )r   r  eventsesizeZetimeetypeZetextrE   rE   rH   r  9  s    
r  c             C   s  dg g d}|   }td| d\}}}}}}||krFtd |S t||d< | ||  | jd|d d	|df}	|		 |d
< | ||  | || }
g }xRt
|
dkrtd|
dd d }|t|
dd|   |
d| d }
qW ||d< |S )z>Read LSM ChannelColors structure from file and return as dict.F)Monor2  
ColorNamesz<IIIIIIr  zE<tifffile.read_lsm_channelcolors> invalid LSM ChannelColors structurerr  rH  r   )r  r2  z<INr6   rC   rs  )r   r   r  r  rq  r   rT   r  rh  r  rc   ri   r  )r   r|   r   r<   ZncolorsZnnamesZcoffsetZnoffsetmonocolorsbufferrt  rE   rE   rH   r  9  s*    r  c             C   s  i }t d| d\}}}}}}|dk r6td |S | d t||d< ||d< ||d< ||d	< g  |d
< }xTt|D ]F}	t d| dd }
|
dkrP t d| dd d }|
dkr| jd|d}n|
dkr| jd|d}n|
dkr| jd|d}n|
dkr0| jd|d d}|d}n|
dkrxt d| dd }| jd|| d d}|||df}n8|
dkr| jd|d d}|d}ntd|
  P |	t
|
|d q~W |S )z4Read LSM lookup tables from file and return as dict.z<iiiiiir  <   zB<tifffile.read_lsm_lookuptable> invalid LSM LookupTables structure$   ZLutTypeZAdvancedZNumberChannelsZCurrentChannelZ	SubBlocksz<ir   r6   r   rU   z<f8)r  rP   rC   z<i4)r   rP   rP   r   r   z<i2i   )r   i   z:<tifffile.read_lsm_lookuptable> invalid LSM SubBlock type )r[  Data)r   r  r  rq  r   r-  rw  r  rh  ri   r.  )r   r|   r<   Z
nsubblocksZ	nchannelsZluttypeZadvancedZcurrentchannelZ	subblocksr   Zsbtypery   ZnknotsrE   rE   rH   r  9  sN    




r  c       
      C   sb  i }|g}t j}t d| dd dkr6td |S | d x|d| d\}}}|d	krvtt| |}n@|dkr|d
| dd }n"|dkr|d| dd }nd}|tjkr|| tj| }g }	|	||< |	}nn|tj	kr|| i }	||	 |	}nD|tj
kr0tj
| }|||< n$|dkrD| }n||d|d< |sDP qDW |S )z9Read LSM ScanInfo structure from file and return as dict.z<Ir   r6   i   z;<tifffile.read_lsm_scaninfo> invalid LSM ScanInfo structurer   z<IIIr   rP   z<ir   z<dl    ZEntry0xr=  )r   r  r  rq  r  r0   r   r%  ri   r'  r*  r[   )
r   blockblocksr  entryrs   r<   r   r:   ZnewobjrE   rE   rH   r  :  sJ    









r  c             C   sR  i }t d| d\}}}}	}
}}}|dkr6tdtt||d< y"td| |
d |	|||d< W n tk
r|   Y nX | d	| }xtd
|d	 d	D ]}t d|||d	  \}}}| | |dkr@t d| d\}}}}}}t	
d|}|| |d< || |d< ||d< tt||d< tt||d< q|dkrqqW |S )zrRead OlympusSIS structure and return as dict.

    No specification is avaliable. Only few fields are known.

    z<4s6xhhhhh6x32shrw  s   SIS0zinvalid OlympusSIS structurer:   il  rU   r  r   r6   z<hhIz<10xhdd8xd2x34s32sp   r   Z
pixelsizexZ
pixelsizeyZmagnificationZ
cameranameZpicturetype)r   r  r  r_   r  r0   r  rw  rT   ru  pow)r   rk   rs   r  r  r|   magicminutehourdaymonthyearr:   Ztagcountry   r   Ztagtyper;   ZlenexpZxcalZycalr4  ZcamnameZpictyper  rE   rE   rH   r  G:  s6    

	r  c          
   C   s^   |  |}tt|}yt|S  tk
rX } ztd|jj d|  i S d}~X Y nX dS )z.Read OlympusSIS INI string and return as dict.z<tifffile.olympusini_metadata> z: N)r  r  r0   olympusini_metadatarv   rq  r   r   )r   rk   rs   r  r  inistrr   rE   rE   rH   r  {:  s    
r  c             C   s  i }| j tj|d}x"tjD ]\}}||  ||< qW |d dkr| j tj|d}|d tdkrptd i S xTtjD ]J\}}|dr||  j	dd	d
}	t
|	dd||< qx||  ||< qxW xNdD ],}
|d|
   d  < |d|
   d  < qW n|jdkrtd i S |S )z.Read TVIPS EM-MENU headers and return as dict.)rk   r1  rP   rN  l   *UU z:<tifffile.read_tvips_header> invalid TVIPS v2 magic numberr  zutf-16rU  )rV  r  )nullr  rE  g    eAZ	PixelSizerU   z9<tifffile.read_tvips_header> unknown TVIPS header version)r(  r   rF  r  rO  r   rq  rp  r  rn  r0   r  )r   rk   rs   r  r  r|   r  r:   Ztypestrr   r?  rE   rE   rH   r  :  s.    

r  c          	   C   s   i }i }t t| |}xn| D ]b}| }|drPi }|||dd < q$y|d\}	}
W n tk
rx   w$Y nX t|
||	< q$W |S )z0Read FEI SFEG/HELIOS headers and return as dict.r  rU   r   r   )	r  r0   r  
splitlinesr  rp  r  r_   r    )r   rk   rs   r  r  r|   sectionry   r  rG   r   rE   rE   rH   r  :  s    
r  c             C   sz  ddi}d}t t| |}xT| D ]F}| rB| }q*|rVy|d\}	}
W n@ tk
r   y|dd\}	}
W n tk
r   w*Y nX Y nX |
	 }
d}y.|
 \}}t
|ttf}||kr|}
|}W nP tk
r&   t
|
ttf}||
kr|}
|
dkrd}
n|
d	kr"d
}
Y nX |		 |
f||< |rP||  |f7  < d}q*|d  t
|ttff7  < q*W |S )zRead Zeiss SEM tag and return as dict.

    See https://sourceforge.net/p/gwyddion/mailman/message/29275000/ for
    unnamed values.

    r  rE   Nr   r,  rU   )ZNoZOffF)ZYesZOnT)r  r0   r  r  isupperr  r  r_   rv   r  r    r   rq  )r   rk   rs   r  r  r|   rG   ry   r  r:   r   r  r  r   numberrE   rE   rH   r  :  sH    




 r  c             C   sV   | j tj|d}||}t|}|d d|d  |d< |d d|d  |d< |S )z7Read NIH_IMAGE_HEADER tag from file and return as dict.)rk   r>  Nr=  r8  r7  )r(  r   r?  rH  re  )r   rk   rs   r  r  r)  rE   rE   rH   r  :  s    
r  c       	   
   C   s   |  d y|td| d\}}|dks2|dkr:td|  d td| d\}}}}|d	ksn|d
krtd| d| dW nV tk
r } ztd|W dd}~X Y n, tk
r } ztd|W dd}~X Y nX tt| |dd }|dkrt	| dd|dni }|||fS )a  Read ScanImage BigTIFF v3 or v4 static and ROI metadata from open file.

    Return non-varying frame data, ROI group data, and version as
    tuple(dict, dict, int).

    The settings can be used to read image data and metadata without parsing
    the TIFF file.

    Raise ValueError if file does not contain valid ScanImage metadata.

    Frame data and ROI groups can alternatively be obtained from the Software
    and Artist tags of any TIFF page.

    r6   z<2sHr   s   IIr   znot a BigTIFF filer   z<IIIIi)rC   r   zinvalid magic z or version z numberz"file must be opened in binary modeNz%not a ScanImage BigTIFF v3 or v4 filer   rU   r   )
rT   r   r  r  r_   r  rv   r&   r  r  )	r   rk   r  r  Zsize0Zsize1r   Z
frame_dataZroi_datarE   rE   rH   r   :  s"    

r   c             C   s*  |  d yddd| d }W n tk
r>   tdY nX i }|  d t|d | d	\}}}}}}}	}
|	d
krt| |d|
d|d< ntd |dkrB|  | t|d | d\}}|dkr8t|d|  | d| }|ddd |ddd |ddd |ddd |ddd d|d< ntd ntd |dkr|  | t|d | d\}}|dkrt| |d|d|d< ntd ntd d|d< |dkr
|  | t|d | d\}}|d kr t| |d|d|d!< ntd" n|d#kr||d< ntd" |S )$zRead MicroManager non-TIFF settings from open file and return as dict.

    The settings can be used to read image data without parsing the TIFF file.

    r6   r   r   )s   IIs   MMrP   znot a MicroManager TIFF filer   IIIIIIIIr  i$# NZSummaryzI<tifffile.read_micromanager_metadata> invalid MicroManager summary headeriCrm  i4 ZIIIIIr  r   rU   rC   r   )rf  SliceFrameZPositionrP  ZIndexMapzG<tifffile.read_micromanager_metadata> invalid MicroManager index headeriidZDisplaySettingszI<tifffile.read_micromanager_metadata> invalid MicroManager display headerZMajorVersioni}ier	  zJ<tifffile.read_micromanager_metadata> invalid MicroManager comments headeria )rT   r  ru  r_   r   r  r  rq  )r   rk   r|   Zindex_headerZindex_offsetZdisplay_headerZdisplay_offsetZcomments_headerZcomments_offsetZsummary_headerZsummary_lengthr  r  ry   rE   rE   rH   r   ;  sf    


&










r   c             C   s   t dS )zRead MetaSeries non-TIFF hint catalog from file.

    Raise ValueError if the file does not contain a valid hint catalog.

    N)rz  )r   rE   rE   rH   read_metaseries_catalog};  s    r  c          
   C   s  | sdS ddd| g}dg}g }dd }dd	 }d
d }dd }dd|fdd|fdd|fdd|fdd|fdd|fdd|fdd|ff}	x|	D ]\}
}}|
  | kr|
  }
n
|
| krq|dkr|ddd  }| |
 }t|trd!d" | D }t|}n t|trt|}n
|g}d#}||t|d$ |  x0|D ](}|||}|| |t| q:W qW |stdS d%	|}d%	|}|| }t||d< tj|d$t|  f| }d&d#t||d'fd(d)t|d) |d'ffS )*aW  Return IJMetadata and IJMetadataByteCounts tags from metadata dict.

    The tags can be passed to TiffWriter.write() as extratags.

    The metadata dict may contain the following keys and values:

        Info : str
            Human-readable information as string.
        Labels : sequence of str
            Human-readable labels for each channel.
        Ranges : sequence of doubles
            Lower and upper values for each channel.
        LUTs : sequence of (3, 256) uint8 ndarrays
            Color palettes for each channel.
        Plot : bytes
            Undocumented ImageJ internal format.
        ROI: bytes
            Undocumented ImageJ internal region of interest format.
        Overlays : bytes
            Undocumented ImageJ internal format.
        Properties : {str: str}
            Map of key, value items as strings.

    rE   s   IJIJs   JIJI)r   r   r6   c             S   s   |  dddd|  S )Nzutf-16bele)r   r   )r   )ry   rk   rE   rE   rH   _string;  s    z$imagej_metadata_tag.<locals>._stringc             S   s   t j|dt|   f|  S )Nr  )r   r   rc   )ry   rk   rE   rE   rH   _doubles;  s    z%imagej_metadata_tag.<locals>._doublesc             S   s   |   S )N)r  )ry   rk   rE   rE   rH   _ndarray;  s    z%imagej_metadata_tag.<locals>._ndarrayc             S   s   | S )NrE   )ry   rk   rE   rE   rH   _bytes;  s    z#imagej_metadata_tag.<locals>._bytesr  s   infor  s   lablr   s   rangr!  s   lutsr"  s   plotr#  s   roi r$  s   overr%  s   propr   Nr   c             S   s   g | ]}|D ]}t |qqS rE   )r]   )rF   r  r   rE   rE   rH   rG  ;  s    z'imagej_metadata_tag.<locals>.<listcomp>rU   r8  r   i  Ti  r   )
r  r\   r^  r  rc   r  ri   r   r   r	  )r  rk   r  r:  bodyr  r  r  r  metadata_typesrG   mtyper   r  r  r   ry   rE   rE   rH   rk  ;  s\    








rk  c          	      s  dd }dd }dd }dd }d	|fd
|fd|fd|fd|fd|fd|fd|fd}| dd | D  |sztd| dd dkrtd|d }|dk s|dkrtd|d d }	t|d|	  | dd|	d   }
d|	d  }d}i }xt|
ddd |
d dd D ]\}}g }||t||f\}}xBt|D ]6}|d 7 }|||  }|	|| || | |}qDW |d kr|d n|||
 < qW |d  rt d dkrt fd!d"tdt dD |d< |S )#a]  Return IJMetadata tag value as dict.

    The 'Info' string can have multiple formats, e.g. OIF or ScanImage,
    that might be parsed into dicts using the matlabstr2py or
    oiffile.SettingsFile functions.
    'ROI' and 'Overlays' are returned as bytes, which can be parsed with the
    ImagejRoi.frombytes() function of the roifile package.

    c             S   s   |  dddd|  S )Nzutf-16r  r  )r   r   )rn  )ry   rk   rE   rE   rH   r  ;  s    z imagej_metadata.<locals>._stringc             S   s   t |dt| d   | S )Nr  r   )r   r  rc   )ry   rk   rE   rE   rH   r  ;  s    z!imagej_metadata.<locals>._doublesc             S   s   t | dddS )NrH  r   r-  )rr   r0  rh  )ry   rk   rE   rE   rH   _lut;  s    zimagej_metadata.<locals>._lutc             S   s   | S )NrE   )ry   rk   rE   rE   rH   r  ;  s    zimagej_metadata.<locals>._bytesr  r  r   r!  r"  r#  r$  r%  )s   infos   labls   rangs   lutss   plots   roi s   overs   propc             S   s    i | ]\}}||d d d qS )Nr   rE   )rF   r  r  rE   rE   rH   r  <  s    z#imagej_metadata.<locals>.<dictcomp>zno ImageJ metadataNr   )s   IJIJs   JIJIzinvalid ImageJ metadatar6   r   i$  z#invalid ImageJ metadata header sizer   Z4sIrP   rU   c             3   s   | ]} ||d   V  qdS )rP   NrE   )rF   r   )r)  rE   rH   rI   "<  s    z"imagej_metadata.<locals>.<genexpr>)r   r  r_   r   r  rx  rV   r  rw  ri   r  rc   r^  )ry   r:  rk   r  r  r  r  r  Zheader_sizeZntypesr  r   counterr|   r  r  r  r:   r   r   Zpos1rE   )r)  rH   r  ;  sP     (
$
$r  c          
   C   s   dd }i }x|   D ]~}y|d\}}W n tk
rB   wY nX | }| }x6tt|fD ](}y||}P W q` tk
r   Y q`X q`W |||< qW d|krtd|S )a8  Return metatata from ImageJ image description as dict.

    Raise ValueError if not a valid ImageJ description.

    >>> description = 'ImageJ=1.11a\nimages=510\nhyperstack=true\n'
    >>> imagej_description_metadata(description)  # doctest: +SKIP
    {'ImageJ': '1.11a', 'images': 510, 'hyperstack': True}

    c             S   s   ddd|    S )NTF)ra  r`  )r  )r   rE   rE   rH   _bool2<  s    z*imagej_description_metadata.<locals>._boolr   r  znot an ImageJ image description)r  r  rv   r  r   rq  r_   )r  r  r|   r  rG   r   rs   rE   rE   rH   r  '<  s&    
r  c             K   s  |rd}d}|dkr | dd}| dd}t| ||d} | d dk}g }	d	| g}
|
d
t| dd   |dkrd}|	d n|	dt|  | d dkr|
d| d   |dkr|s|sd}|r|r|	d|  | d dkr|
d| d   | d dkrB|
d| d   |dkrB|	d |dk	rd|	dt|   x8| D ],\}}|dkrn|	|  d|  qnW d|
|	 dg S )a5  Return ImageJ image description from data shape.

    ImageJ can handle up to 6 dimensions in order TZCYXS.

    >>> imagej_description((51, 5, 2, 196, 171))  # doctest: +SKIP
    ImageJ=1.11a
    images=510
    channels=2
    slices=5
    frames=51
    hyperstack=true
    mode=grayscale
    loop=false

    FNr  z1.11ar   )rgbr   r   )rC   r   zImageJ=zimages=r   Tzhyperstack=truezhyperstack=rP   rU   z	channels=Z	grayscalezmode=zslices=r6   zframes=z
loop=falsezloop=)rj  r  r  r  r   r  r  )r[   rc  ri   r+   r   r  r  r	  )rz   r  Z
colormapedr  Z
hyperstackr   looprg   r   ri   r|   rG   r   rE   rE   rH   rl  J<  sB    



rl  c       	      C   s  t dd | D } t| }d|  kr.dkr:n ntd|rt||krRtdd}| }x*|D ]"}d|}||k rtd	|}qdW t|}g }d}xBdD ]:}||k r||| kr|| |  |d7 }q|d qW |d
 dkrtdt |S |dkr| d
 dko|dk}|r6| d
 dkr6td|s\|dkr\| d
 dkr\td|sp| d
 dkrdd|  |  S dd|  |  d S )zReturn shape normalized to 6D ImageJ hyperstack TZCYXS.

    Raise ValueError if not a valid ImageJ hyperstack shape or axes order.

    >>> imagej_shape((2, 3, 4, 5, 3), False)
    (2, 3, 4, 5, 3, 1)

    c             s   s   | ]}t |V  qd S )N)r   )rF   r   rE   rE   rH   rI   <  s    zimagej_shape.<locals>.<genexpr>rU   r   z)ImageJ hyperstack must be 2-6 dimensionalz-ImageJ hyperstack shape and axes do not matchr6   ZTZCYXSz.ImageJ hyperstack axes must be in TZCYXS orderr   )rU   rC   r   z1ImageJ hyperstack must contain 1, 3, or 4 samplesN)rC   r   rP   z$ImageJ hyperstack is not a RGB imagez*ImageJ hyperstack is not a grayscale image)rU   r   )r  rc   r_   r_  r  ri   )	rz   r  r   r  r   rd  r  ZndimsnewshaperE   rE   rH   rc  <  sH    	




rc  c             C   s`   d}d}|rnJ| dkrd}n<| dkr6|dkrXd }}n"| dkrDd}n| dkrXt | j}||fS )z;Return JPEG and output colorspace for jpeg_decode function.Nr   rP   rU   r   r   rC   )r   rS  r:   )r  r  r  r4  r2  rE   rE   rH   r?  <  s    
r?  c             C   s   d}x|t | k rtd| ||d  d }|d7 }|dkr@q|dkrJP d|  kr^dkrdq nq|d	krnqtd| ||d  d }|d7 }d
|  krdkrn ntd| ||d  S |dkrP ||d 7 }qW tddS )z(Return bitdepth and shape of JPEG image.r6   Tz>HrP   i  i  i  i  i  i  i  z>BHHBr   i  zno SOF marker foundN)rc   r   r  r_   )r  r   markerr  rE   rE   rH   r  <  s(    r  c             C   s  d}d}d}d}x|t | k rtd| ||d  d }|d7 }|dkrPq|dkrZP d|  krndkrtq nq|d	kr~qtd| ||d  d }|d7 }|d
krtd| ||d  d }n|dkr|d }td| ||d  \}}}	}
|d7 }d}d}xdt|
D ]X}td| ||d  \}}}|d7 }|d? |krT|d? }|d@ |kr|d@ }qW |d9 }|d9 }|d }n|dkr|| d }P ||d 7 }qW |dks|dks|dkrtd|}|| }| d| td|| | |d |  }|||fS )zAReturn tile shape and JPEG header from JPEG with restart markers.r6   Tz>HrP   i  i  i  i  i  i  i  rU   z>BHHBr   z>BBBrC   r   rt  r   i  zmissing required JPEG markersNz>HH)rc   r   r  rw  r_   r   )r  ZrestartintervalZ	sofoffsetZ	sosoffsetr   r  r  r  r$  r%  ZncomponentsZmcuwidthZ	mcuheightr   Zcidfactortabler  r  r  rE   rE   rH   r  <  s\    


*r  c             K   s   |j | d t|S )zReturn JSON image description from data shape and other metadata.

    Return UTF-8 encoded JSON.

    >>> json_description((256, 256, 3), axes='YXS')  # doctest: +SKIP
    b'{"shape": [256, 256, 3], "axes": "YXS"}'

    )rz   )r   r  r  )rz   r  rE   rE   rH   rm  >=  s    	rm  c             C   sr   | dd dkr:t dd | dd dD }t|d	S | dd
 dkrd| dd dkrdt| S td| dS )a  Return metatata from JSON formated image description as dict.

    Raise ValuError if description is of unknown format.

    >>> description = '{"shape": [256, 256, 3], "axes": "YXS"}'
    >>> json_description_metadata(description)  # doctest: +SKIP
    {'shape': [256, 256, 3], 'axes': 'YXS'}
    >>> json_description_metadata('shape=(256, 256, 3)')
    {'shape': (256, 256, 3)}

    Nr   zshape=c             s   s   | ]}t |V  qd S )N)r   )rF   r   rE   rE   rH   rI   Y=  s    z,json_description_metadata.<locals>.<genexpr>r   r   r  )rz   rU   rm  }zinvalid JSON image description)r  r  r^  r  r  r_   )r  rz   rE   rE   rH   r	  K=  s     
 
r	  c             C   s  |  dstd|dkr"ddh}i }|g}d}x~|  D ]p}|sN| }|sTq<|d dkr(|dd d	kr|d
= |d
 }|dd }|rd|| ||< |dd dkr<tj|| tjd}d|_|||< q<d}|dd
 }|dd dkrg }n||krg }d}ni }|	| |||< q<|r:|	| q<|
dd}t|dkrfd||d  < q<|\}	}
|	dd dkr|dd |

 D  q<t|
 ||	 < q<W |S )al  Return metatata from FluoView image description as dict.

    The FluoView image description format is unspecified. Expect failures.

    >>> descr = ('[Intensity Mapping]\nMap Ch0: Range=00000 to 02047\n'
    ...          '[Intensity Mapping End]')
    >>> fluoview_description_metadata(descr)
    {'Intensity Mapping': {'Map Ch0: Range': '00000 to 02047'}}

    r  z"invalid FluoView image descriptionNzRegion Info (Fields)zProtocol DescriptionFr6   z End]r   rU   r  r   zLUT )rs   )r   rC   Tr   zRGB c             s   s   | ]}t |V  qd S )N)r   )rF   r  rE   rE   rH   rI   =  s    z0fluoview_description_metadata.<locals>.<genexpr>)rp  r_   r  r  r	  rr   r  rH  rz   ri   r  rc   rM  r    )r  Zignoresectionsr|   sectionscommentr  r  r:   r)  rG   r   rE   rE   rH   fluoview_description_metadataa=  s^    



r  c          	      sj  i }|  ds|S xdD ]}| |d} qW x6| dD ]&dd dkrRq: d }d tjkrytjdd	|d
< W q: tk
r   ddd ||< Y q:X q:tjd  \} t	|d t
r|d  }nfdd|D } tkr|d dkrdg}t fdd|D } tkrDd|}nt|dkrZ|d }|||< q:W |S )a  Return metatata from Pilatus image description as dict.

    Return metadata from Pilatus pixel array detectors by Dectris, created
    by camserver or TVX software.

    >>> pilatus_description_metadata('# Pixel_size 172e-6 m x 172e-6 m')
    {'Pixel_size': (0.000172, 0.000172)}

    z# z#:=,()r  r  NrP   z  r6   z%Y-%m-%dT%H %M %S.%fr  rU   c                s   g | ]} | qS rE   rE   )rF   r   )r  rE   rH   rG  =  s    z0pilatus_description_metadata.<locals>.<listcomp>notr  c             3   s   | ]} |V  qd S )NrE   )rF   r  )rs   rE   rH   rI   =  s    z/pilatus_description_metadata.<locals>.<genexpr>)rp  rz  r  r   r]  r  strptimer	  rv   r\   r  rq  r  r]   rc   )r  r|   r1  r:   r  r  rE   )rs   r  rH   r  =  s<    



r  c             C   sx   |  dstdi }| d}|d |d< t|dkr<|S x6|dd D ]&}|d\}}t| || < qJW |S )	zReturn metatata from Aperio image description as dict.

    The Aperio image description format is unspecified. Expect failures.

    >>> svs_description_metadata('Aperio Image Library v1.0')
    {'Header': 'Aperio Image Library v1.0'}

    zAperio z invalid Aperio image descriptionr   r6   HeaderrU   Nz = )rp  r_   r  rc   r    r  )r  r|   r  r  rG   r   rE   rE   rH   svs_description_metadata=  s    	

r  c          
   C   s   |   } | sg S yt| } W n: tk
rV } ztd|jj d|  g S d}~X Y nX g }x| dD ]}i }xz|dD ]l}|dd}t|dkr|\}}t|  ||  < q||d   }|r|d	|kr|d	 	| q||g|d	< q|W |	| qhW |S )
zReturn metadata from MetaMorph image description as list of dict.

    The MetaMorph image description format is unspecified. Expect failures.

    z$<tifffile.stk_description_metadata> z: Nr  z
r,  rU   r6   r  )
r  r  r  rq  r   r   r  rc   r    ri   )r  r   r|   r  r  r  r:   r   rE   rE   rH   stk_description_metadata=  s0    r  c                sp   |  dstdddlm} || }ttdd d fdd	  |i }d
|krl|d
 dd|d
< |S )z:Return metatata from MetaSeries image description as dict.z
<MetaData>z$invalid MetaSeries image descriptionr6   )r@  c             S   s   t | ddS )Nonrk  )asbool)r=  rE   rE   rH   r>  >  r   z1metaseries_description_metadata.<locals>.<lambda>)rq  r   r   c                sp   xj| D ]b}|j }|s& |i ||j< qd|kr|d }|d }|d }|kr`| |||< q|||< qW |S )Nr  r  r   )rL  rF  )rO  r|   childrL  r   rE  r  )r
  typesrE   rH   r
  >  s    
z.metaseries_description_metadata.<locals>.parser_  z
&#13;&#10;r  )rp  r_   rJ  r@  rK  rq  r   rz  )r  rN  rO  adictrE   )r
  r  rH   r  
>  s    


r  c             C   s   t | S )z9Return metatata from ScanImage image description as dict.)r&   )r  rE   rE   rH   scanimage_description_metadata/>  s    r  c          
   C   sJ   y
t | S  tk
rD } ztd|jj d|  W dd}~X Y nX dS )z2Return metatata from ScanImage artist tag as dict.z%<tifffile.scanimage_artist_metadata> z: N)r  r  r_   rq  r   r   )Zartistr   rE   rE   rH   scanimage_artist_metadata4>  s    
(r  c          	   C   s  dd }i }g }d}d}x|   D ]}| }|dks$|d dkrHq$|d dkr*|d d	kr*|d
d }i  ||< }|dkrg  |d< }	g  |d< }
n|dkrg ||< nx|dkrd|krg  || d< }nV|dkrd|krg  || d< }n4|dkr|d d }dd t|D }|||< d}q$|d\}}| dkrLd}n,d|krptdd |dD }nt|}|dkr|||< |	| |
| q$|dkr|dkri g| |d< n||\}}||d | |< q$|dkrf|dd dkrL|| d }td|}|t	|dd
 t	|d
d t	|dd g n||\}}||| |< q$|dd dkr|dk	r|| q$|dd  dkr|dk	r|| q$|||< q$W d|krFdd!i}g }	g }
xNt
|d |d D ]8\}}|d
kr|	|||d   |
| qW d|	|d< t|
|d< y0t|d d d|d d  d"|d d< W n tk
r   Y nX y0t|d d d|d d  d#|d d< W n tk
r   Y nX x"|D ]}t|d d$|d< qW |S )%zUReturn OlympusSIS metadata from INI string.

    No documentation is available.

    c             S   sF   d}t | d}|t | k r>t| |d  d }| d | } | |fS )Nr6   
0123456789rU   )rc   rstripr   )rG   r  r   rE   rE   rH   keyindexG>  s    z%olympusini_metadata.<locals>.keyindexNr  r6   ;r  r   r  rU   Z	Dimensionr   rz   ZASDr/  r  rI  ZTimePosZBandc             S   s   g | ]}d g iqS )LUTrE   )rF   r   rE   rE   rH   rG  h>  s    z'olympusini_metadata.<locals>.<listcomp>r   r  c             s   s   | ]}t |V  qd S )N)r    )rF   r  rE   rE   rH   rI   p>  s    z&olympusini_metadata.<locals>.<genexpr>ZCountrC   r  z<IrP   r   r   r   rK  rF  rH  )r  r  rw  r  r  r    ri   r   r   ordrx  rV   r_  r	  rr   r  rv   )r  r  r|   ZbandsZzposZtposr  section_namer  r   rz   ZnbandsZibandrG   r   r  ZlutZsisaxesr   r=  ZbandrE   rE   rH   r  @>  s    	







2

,,
r  Tc       
         sj  |dkrd}dkrdt tt |  dkrNtfdd|D s\td| t fddd	D }t | j| } t 	| j
t|fj}xt|D ]\}}| tt ||d
 d ? }|tdd|  dM }|rLjd | d
 | }	|	| jjd kr|d}|d|	 d
 d| d
  9 }|d|	jd    }||dd|f< qW |dS )a   Return array from bytes containing packed samples.

    Use to unpack RGB565 or RGB555 to RGB888 format.
    Works on little-endian platforms only.

    Parameters
    ----------
    data : byte str
        The data to be decoded. Samples in each pixel are stored consecutively.
        Pixels are aligned to 8, 16, or 32 bit boundaries.
    dtype : numpy.dtype
        The sample data type. The byteorder applies also to the data stream.
    bitspersample : tuple
        Number of bits for each sample in a pixel.
    rescale : bool
        Upscale samples to the number of bits in dtype.

    Returns
    -------
    numpy.ndarray
        Flattened array of unpacked samples of native dtype.

    Examples
    --------
    >>> data = struct.pack('BBBB', 0x21, 0x08, 0xff, 0xff)
    >>> print(unpack_rgb(data, '<B', (5, 6, 5), False))
    [ 1  1  1 31 63 31]
    >>> print(unpack_rgb(data, '<B', (5, 6, 5)))
    [  8   4   8 255 255 255]
    >>> print(unpack_rgb(data, '<B', (5, 5, 5)))
    [ 16   8   8 255 255 255]

    N)r   r   r   z<Br  c             3   s   | ]}| j d  kV  qdS )r   N)rt   )rF   r   )rs   rE   rH   rI   >  s    zunpack_rgb.<locals>.<genexpr>zsample size not supported: c             3   s&   | ]}t |jd   kr|V  qdS )r   N)rr   rs   rt   )rF   r   )bitsrE   rH   rI   >  s    ZBHIrU   0b1rP   r   r8  r   )rr   rs   r   r  rp  r_   r  r0  rk   r  r<   rc   r   r}  rt   r    rh  )
ry   rs   r  Zrescaler  r|   r   rD  rE  r+  rE   )r  rs   rH   r5  >  s,    "

r5  c             C   s   t ddS )z"Return float32 array from float24.r6  N)rz  )ry   rk   rE   rE   rH   r6  >  s    r6  c             C   s    ddl }|| |dkrdn|S )zCompress Zlib DEFLATE.r6   Nr   )r  rq   )ry   r   r  r  rE   rE   rH   r  >  s    r  c             C   s   ddl }|| S )zDecompress Zlib DEFLATE.r6   N)r  r/  )ry   r  r  rE   rE   rH   r  >  s    r  c             C   s   ddl }|| S )zCompress LZMA.r6   N)r  rq   )ry   r   r  r  rE   rE   rH   r  >  s    r  c             C   s   ddl }|| S )zDecompress LZMA.r6   N)r  r/  )ry   r  r  rE   rE   rH   r   ?  s    r  r   rU   c             C   s   |dkrt d| dt| ttfrZtj| tjd} tj| dd}t|d| d 	 S | j
}|jdkr|| d|j } tj| |d}td	g| j }d||< tj|d| t| |d}|jdkr||S |S )
zEncode Delta.rU   zdist z not implemented)rs   r6   )r?  r   r   N)rz  r\   r   	bytearrayrr   r0  rH  r  rS  r  rs   ra  r1  rt   r  r  r  )ry   r?  r  r  r  rs   rG   rE   rE   rH   r  	?  s     


r  c             C   s   |dkrt d| d|dk	r,|jjs,d}t| ttfrbtj| tjd} tj	| dtj|d
 S | jjdkr| d	| jj }tj	|||jd
}|| jS tj	| || j|dS )zDecode Delta.rU   zdist z not implementedN)rs   r6   )r?  rs   r  r   r   )r?  rs   )rz  r  	writeabler\   r   r  rr   r0  rH  Zcumsumr  rs   ra  r1  rt   )ry   r?  r  r  r1  rE   rE   rH   r  ?  s    r  c             C   s   |s(| d | tj|d tjd y"| d}tj|d ||d | S  tk
rh   | |d S  tk
r   t	dY nX dS )	a  Reverse bits in each byte of bytes or numpy array.

        Decode data where pixels with lower column values are stored in the
        lower-order bits of the bytes (TIFF FillOrder is LSB2MSB).

        Parameters
        ----------
        data : bytes or ndarray
            The data to be bit reversed. If bytes, a new bit-reversed
            bytes is returned. Numpy arrays are bit-reversed in-place.

        Examples
        --------
        >>> bitorder_decode(b'\x01\x64')
        b'\x80&'
        >>> data = numpy.array([1, 666], dtype='uint16')
        >>> bitorder_decode(data)
        >>> data
        array([  128, 16473], dtype=uint16)

        s    @ `P0pH(hX8xD$dT4tL,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	I)iY9yE%eU5uM-m]=}C#cS3sK+k[;{G'gW7wO/o_?r6   )rs   rH  rU   )r  zslices of arrays not supportedN)
ri   rr   r0  rH  r1  taker   	translater_   rz  )ry   r  Z	_bitorderr1  rE   rE   rH   r9  0?  s    
r9  c             C   s   t ddS )zTightly pack integers.rC  N)rz  )ry   r  r?  r  rE   rE   rH   rC  b?  s    rC  c             C   s   |dkrbt | d} t | } |d rX| d|d|d   } | ddd|f d} | |S |dkrvt | |S td| dt | d	dS )
a  Decompress bytes to array of integers.

        This implementation only handles itemsizes 1, 8, 16, 32, and 64 bits.
        Install the imagecodecs package for decoding other integer sizes.

        Parameters
        ----------
        data : byte str
            Data to decompress.
        dtype : numpy.dtype or str
            A numpy boolean or integer type.
        bitspersample : int
            Number of bits per integer.
        runlen : int
            Number of consecutive integers, after which to start at next byte.

        Examples
        --------
        >>> packints_decode(b'a', 'B', 1)
        array([0, 1, 1, 0, 0, 0, 0, 1], dtype=uint8)

        rU   z|Br   r   N)r   r   r  r4  z
unpacking z-bit integers to z not supported)rr   r0  Z
unpackbitsrh  r    rz  rs   )ry   rs   r  Zrunlenr  rE   rE   rH   r7  f?  s    

r7  c             C   s   g }|j }d}y|xvt| ||d  d }|d7 }|dkr`|| ||d  d|   |d7 }q|dk r|| |||   ||7 }qW W n tk
r   Y nX t|S )aw  Decompress PackBits encoded byte string.

        >>> packbits_decode(b'\x80\x80')  # NOP
        b''
        >>> packbits_decode(b'\x02123')
        b'123'
        >>> packbits_decode(
        ...   b'\xfe\xaa\x02\x80\x00\x2a\xfd\xaa\x03\x80\x00\x2a\x22\xf7\xaa'
        ...     )[:-5]
        b'\xaa\xaa\xaa\x80\x00*\xaa\xaa\xaa\xaa\x80\x00*"\xaa\xaa\xaa\xaa\xaa'

        r6   rU      i  )rM  r  rW   r   )encodedr  Z
out_extendr   r%  rE   rE   rH   r  ?  s     
r  c             C   s2   t j|| dd} t | d| j} |r.t | } | S )a  Return palette-colored image.

    The image values are used to index the colormap on axis 1. The returned
    image is of shape image.shape+colormap.shape[0] and dtype colormap.dtype.

    Parameters
    ----------
    image : numpy.ndarray
        Indexes into the colormap.
    colormap : numpy.ndarray
        RGB lookup table aka palette of shape (3, 2**bits_per_sample).
    contig : bool
        If True, return a contiguous array.

    Examples
    --------
    >>> image = numpy.arange(256, dtype='uint8')
    >>> colormap = numpy.vstack([image, image, image]).astype('uint16') * 256
    >>> apply_colormap(image, colormap)[-1]
    array([65280, 65280, 65280], dtype=uint16)

    rU   )r?  r6   )rr   r  Zrollaxisr  r)  )rB  r  re  rE   rE   rH   rI  ?  s
    
rI  c                s  |}dkrr|dk	rJt |dks0|d t | k rJtdt | f d| dt | ftdd tt | D | fS tjstd	ttrt	
dkri fd
d}dd | D }t |dkrtj|d }ntj|}t |}dg }	x|D ]}
||
|d \}dkr| dk	rt  t ksjt fddtt D rtd dn|krtd dk	rfdd D |	 qW  dkrtntfdd D tj|	tjd}	tj|	dd}|dkrDtj|	dd}|	|8 }	||8 }|d7 }t| }n@t |t |ksptdd t||D rtd| d| dd |	 D }	||	| fS )a  Return shape and axes from sequence of file names matching pattern.

    Parameters
    ----------
    files : sequence of str
        Sequence of file names to parse.
    pattern : str
        Regular expression pattern matching axes labels and chunk indices
        in file names. By default, no pattern matching is performed.
        Axes labels can be specified by matching groups preceding the index
        groups in the file name, be provided as group names for the index
        groups, or be omitted.
        The predefined 'axes' pattern matches Olympus OIF and Leica TIFF
        series.
    axesorder : sequence of int (optional)
        Indices of axes in pattern. By default axes are returned in the order
        they appear in pattern.
    categories : dict of dicts (optional)
        Map of index group matches to integer indices.
        {'axislabel': {'category': index}}
    _shape : tuple of int (optional)
        Shape of the file sequence. If None (default), the shape is
        maximum-minimum+1 of the parsed indices for each dimension.

    Returns
    -------
    labels : tuple of str
        Axes labels for each dimension.
    shape : tuple of int
        Shape of file series.
    indices : sequence of tuples
        Index of each file in shape.
    files : sequence of str
        Filtered sequence of file names.

    Examples
    --------
    >>> parse_filenames(
    ...     ['c1001.ext', 'c2002.ext'], r'([^\d])(\d)(?P<t>\d+)\.ext'
    ... )
    (('c', 't'), (2, 2), [(0, 0), (1, 1)], ['c1001.ext', 'c2002.ext'])

    NrU   r6   zshape z does not fit provided shape )r8  c             s   s   | ]}|fV  qd S )NrE   )rF   r   rE   rE   rH   rI   @  s    z"parse_filenames.<locals>.<genexpr>zinvalid patternc       	         s  g }g }dd j  D }| }|s8td| d }xt| D ]\}}|d kr\qJ|d |krv||d  }n|d  r|}qJ|d krd}y | kr | | }t|}W n2 tk
r } ztd||W d d }~X Y nX |	| |	| d }qJW t
||fS )Nc             S   s   i | ]\}}||qS rE   rE   )rF   r  r  rE   rE   rH   r  @  s    z2parse_filenames.<locals>.parse.<locals>.<dictcomp>z!pattern does not match file name rU   r6   r9  zinvalid index )
groupindexr  searchr_   r}  groupsisalphar   rv   ri   r  )	r  r'  r  r  matchrd  r   r  r   )rN   rL   rE   rH   r
  @  s6    
"

zparse_filenames.<locals>.parsec             S   s   g | ]}t j|qS rE   )ra   rt  normpath)rF   r   rE   rE   rH   rG  8@  s    z#parse_filenames.<locals>.<listcomp>c             3   s   | ]}| kV  qd S )NrE   )rF   r   )rM   rE   rH   rI   G@  s    zinvalid axesorder z for z.axes labels do not match within image sequencec                s   g | ]} | qS rE   rE   )rF   r   )r  rE   rH   rG  O@  s    c             3   s   | ]} | V  qd S )NrE   )rF   r   )r'  rE   rH   rI   U@  s    )rs   )r?  c             s   s   | ]\}}||kV  qd S )NrE   )rF   r   r  rE   rE   rH   rI   b@  s    zparsed shape c             S   s   g | ]}t |qS rE   )r  )rF   r  rE   rE   rH   rG  h@  s    )rc   r_   r  rw  r   r  rV   r\   r]   recompilera   rt  ro  r  rd  ri   rr   r  Zintpr  r  r  rx  )rf   rL   rM   rN   _shaperz   r
  Z	normpathsr   r  r  ZlblZparsedshapeZ
startindexrE   )rM   rN   r  r'  rL   rH   r	  ?  sn    0$




 




r	  c             c   s   | E dH  dS )z=Return iterator over pages in data array of normalized shape.NrE   )ry   rE   rE   rH   rt  m@  s    rt  c             c   s  | j }tj||d f | jd}dt|  k r8dk sBn tdt|dkr@x| D ]}x|D ]}xt|d D ]}xt|d D ]}t|d |d ||d   }	t|d |d ||d   }
d||	d	|
d	f< |d||d  ||d  |	 ||d  ||d  |
 f |d	|	d	|
f< |V  qW qrW q`W qVW n|xx| D ]n}xd|D ]Z}xPt|d D ]>}x4t|d D ]"}xt|d D ]}t|d |d ||d   }t|d |d ||d   }	t|d |d ||d   }
d||d	|	d	|
d	f< |||d  ||d  | ||d  ||d  |	 ||d  ||d  |
 f |d	|d	|	d	|
f< |d dkr|d V  n|V  qW qW qlW qVW qHW d	S )
z=Return iterator over tiles in data array of normalized shape.r   )rs   rU   r   zinvalid tile shaperP   r6   rC   N)rz   rr   r  rs   rc   r_   rw  r  )ry   r  r  rz   r  r   r  tytxc1c2tzZc0rE   rE   rH   rs  r@  sB    

06rs  c             C   sL   | j |ks| jt||j kr&tdtdd t|| jD }t	| |S )z!Return tile padded to tile shape.zinvalid tile shape or dtypec             s   s   | ]\}}d || fV  qdS )r6   NrE   )rF   r   r  rE   rE   rH   rI   @  s    zpad_tile.<locals>.<genexpr>)
rs   ru   r+   rt   r_   r  rx  rz   rr   r(  )r  rz   rs   r(  rE   rE   rH   r  @  s    r  c             C   sD  t j}t||}||jkr| S ||jkr@| ddddddf S ||jkrh| ddddddddf S ||jkr| dddddddddf S ||jkrt	| ddS ||j
krt	| ddddddddf S ||jkr
t	| ddddddddddf S ||jkr@t	| dddddddddddf S | S )a+  Return reoriented view of image array.

    Parameters
    ----------
    image : numpy.ndarray
        Non-squeezed output of asarray() functions.
        Axes -3 and -2 must be image length and width respectively.
    orientation : int or str
        One of TIFF.ORIENTATION names or values.

    .Nr   r   r   )r   r  r"   r  r  r  r  r  rr   swapaxesr  r  r  )rB  ZorientationZorientrE   rE   rH   reorient@  s&    




 

"(*r  c             C   s|   t | } g }g }g }xHt| j| j|D ]4\}}}|||f ||df |||  q(W t jjj	| ||dd
|S )a  Return read-only view into input array with elements repeated.

    Zoom nD image by integer factors using nearest neighbor interpolation
    (box filter).

    Parameters
    ----------
    a : array-like
        Input array.
    repeats : sequence of int
        The number of repetitions to apply along each dimension of input array.

    Examples
    --------
    >>> repeat_nd([[1, 2], [3, 4]], (2, 2))
    array([[1, 1, 2, 2],
           [1, 1, 2, 2],
           [3, 3, 4, 4],
           [3, 3, 4, 4]])

    r6   F)r  )rr   re   rx  stridesrz   rM  ri   libZstride_tricksZ
as_stridedrh  )r)  Zrepeatsrh  rz   r  r   r  r  rE   rE   rH   r,   @  s    
r,   c             C   sN   t | t}|r| n| j}t||kr(| S d|t|  | }|rD|S | |S )a  Return image array or shape with at least ndim dimensions.

    Prepend 1s to image shape as necessary.

    >>> reshape_nd(numpy.empty(0), 1).shape
    (0,)
    >>> reshape_nd(numpy.empty(1), 2).shape
    (1, 1)
    >>> reshape_nd(numpy.empty((2, 3)), 3).shape
    (1, 2, 3)
    >>> reshape_nd(numpy.empty((3, 4, 5)), 3).shape
    (3, 4, 5)
    >>> reshape_nd((2, 3), 3)
    (1, 2, 3)

    )rU   )r\   r  rz   rc   rh  )Zdata_or_shaper  Zis_shaperz   rE   rE   rH   r.   @  s    
r.   c                s   t | t |krtd dkr$d y$t fddt| |D  \}}W n, tk
rt   | dd }|dd }Y nX t|d|fS )a  Return shape and axes with single-dimensional entries removed.

    Remove unused dimensions unless their axes are listed in 'skip'.

    >>> squeeze_axes((5, 1, 2, 1, 1), 'TZYXC')
    ((5, 2, 1), 'TYX')

    >>> squeeze_axes((1,), 'Q')
    ((1,), 'Q')

    z)dimensions of axes and shape do not matchNr  c             3   s*   | ]"}|d  dks|d  kr|V  qdS )r6   rU   NrE   )rF   r   )r  rE   rH   rI   A  s    zsqueeze_axes.<locals>.<genexpr>r   r  )rc   r_   rx  r  r	  )rz   r   r  Zshape_squeezedZaxes_squeezedrE   )r  rH   r/   A  s    "r/   c                s   x" D ]}||krt d| qW |dkr0d}| j}x(t|D ]}| kr@|   d| }q@W | |} |  fdd|D } | S )zReturn image with its axes permuted to match specified axes.

    A view is returned if possible.

    >>> transpose_axes(numpy.zeros((2, 3, 4, 5)), 'TYXC', asaxes='CTZYX').shape
    (5, 2, 1, 3, 4)

    zunknown axis NZCTZYX)rU   c                s   g | ]}  |qS rE   )r  )rF   rd  )r   rE   rH   rG  3A  s    z"transpose_axes.<locals>.<listcomp>)r_   rz   r%  rh  Z	transpose)rB  r   Zasaxesrd  rz   rE   )r   rH   r1   A  s    	

r1   c             C   sb  t |}t |}t| t|kr(tdt|}t|}||krTtd| d| | r\|s`dS tdt|t| }|r|d|  }t|d }d}d}	g }
x|ddd	 D ]}||9 }x(|dkr|| dkr|dkr|d8 }qW ||| kr(||	||  kr(|	|| 9 }	|
| |  |d8 }q|r:|
| qd
}|
| qW dt|
|d S )zReturn axes matching new shape.

    By default, unknown dimensions are labelled 'Q'.

    >>> reshape_axes('YXS', (219, 301, 1), (219, 301))
    'YX'
    >>> reshape_axes('IYX', (12, 219, 301), (3, 4, 219, 1, 301, 1))
    'QQYQXQ'

    zaxes do not match shapezcannot reshape z to r  r6   )rU   rU   Nr   r9  )r  rc   r_   r+   r  ri   r	  r%  )r   rz   r  unknownr<   r  Zlendiffr   ZprodnsZprodsr|   nsrE   rE   rH   r-   7A  s<     
r-   rP   r   c       
      C   s   | j |j ks| j|jkrdS d}xt| j  | j|jD ]\}}}|dkr|dkrxpt|D ]2}|| }	|	|krtdS t||	 | dk r\|}P q\W dS q|| }	|	|krdS t||	 | dkrdS q8||kr8dS q8W |S )z7Return level of subresolution of series or page b vs a.NZxyzg      ?)r   rs   rx  r  rz   rw  abs)
r)  r  r  r%  r   rd  r   r  rG  r  rE   rE   rH   subresolutiongA  s,    "r  c       	      C   s   d}d}x|t | k r| | }d}|d }t|jjtrB|d7 }q
x|t | k r| | }|rn|jjsn|d7 }qD|dkrxX|D ]"}t|jd ||ddkr||}P q|W |d7 }qDn"t|jd ||ddkr|d7 }qD|j| | |= qDW |d7 }q
W dS )aN  Pyramidize list of TiffPageSeries in-place.

    TiffPageSeries that are a subresolution of another TiffPageSeries are
    appended to the other's TiffPageSeries levels and removed from the list.
    Levels are to be ordered by size using the same downsampling factor.
    TiffPageSeries of subifds cannot be pyramid top levels.

    )rP   rC   r   r6   NrU   r   )r  )	rc   r\   r  r  r  r>  r  r  ri   )	r   r  Zsamplingfactorsr   r)  r  r  r  r   rE   rE   rH   r  A  s6    	

r  c          	   K   s  t | }|dkrtd|dkr@||d< | d jf d|i|S tdd | D }|f|j }|j}t|||}|dks|dk r|j}t|t	j
}|dks|dk rd }}n>|d	k rd}n0|d
kr|jdkr|jdkr|jdkrd}nd}n6|dkrd }}n$||ks|jd
k rd}n|}d}||d< |jj}	|	j}
|
sH|dksR|dkrXd|	_ttd||	jd}|||fdd}|d
k rxZt| D ]\}}||| qW n8|j t|$}x||| t|D ]}qW W dQ R X |  |
sd|	_|S )zRead data from sequence of TiffPage/Frame and stack them vertically.

    Additional parameters are passsed to the TiffPage.asarray function.

    r6   zno pagesrU   r  r  c             s   s   | ]}|d k	r|j V  qd S )N)r  )rF   r  rE   rE   rH   rI   A  s    zstack_pages.<locals>.<genexpr>NrC   rP   Tr   )r<   rA  c             S   sD   | d k	r@| | jj | jf |j|| d| || jj d S )N)rA  r  )rw  rI  r   re   rA  r  )r   r  r  	filecacherg   rE   rE   rH   r   A  s    zstack_pages.<locals>.funcF)rc   r_   re   r  rz   rs   r!   r  r  r   rT  rp   r8  rB  rI  r   r.  rA  r   r  r}  rn  r9   rC  rw  r  )rO   r  r  rg   r  Zpage0rz   rs   Zpage_maxworkersr   Zhaslockr  r   r   r   rE  r   rE   rE   rH   r  A  s^    






r  w+c       	   	   C   s  | dkrH|dkrt ||S |r<t ||} || dd< | S t ||S t| t jrt|t| jkrntdt || j	std| 
|S t| tr| dd dkrddl}t| dkr| dd nd}|dkrd}|j||d	}t j||||d
S Q R X t j| |||d
S )a  Return numpy array where image data of shape and dtype can be copied.

    The 'out' parameter may have the following values or types:

    None
        A zeroed array of shape and dtype is created and returned.
    numpy.ndarray
        An existing writable array of compatible dtype and shape. A view of
        the same array is returned after verification.
    'memmap' or 'memmap:tempdir'
        A memory-map to an array stored in a temporary binary file on disk
        is created and returned.
    str or open file
        The file name or file object used to create a memory-map to an array
        stored in a binary file on disk. The created memory-mapped array is
        returned.

    Nzincompatible output shapezincompatible output dtyper   r   r6   r   z.memmap)r  suffix)rz   rs   r   )rr   r  r"  r\   r  r+   rz   r_   Zcan_castrs   rh  r]   tempfilerc   NamedTemporaryFiler   )	r  rz   rs   r   r  r  r  tempdirr   rE   rE   rH   r!   A  s,    
r!   c                s   fdddd dddfdd	}d
| ks<d| kri }xf|   D ]Z}| }|rJ|d dkrhqJ|dd\ }   t fdddD rqJ||| < qJW |S || S )aN  Return Python object from Matlab string representation.

    Return str, bool, int, float, list (Matlab arrays or cells), or
    dict (Matlab structures) types.

    Use to access ScanImage metadata.

    >>> matlabstr2py('1')
    1
    >>> matlabstr2py("['x y z' true false; 1 2.0 -3e4; NaN Inf @class]")
    [['x y z', True, False], [1, 2.0, -30000.0], [nan, inf, '@class']]
    >>> d = matlabstr2py(
    ...     "SI.hChannels.channelType = {'stripe' 'stripe'}\n"
    ...     "SI.hChannels.channelsActive = 2"
    ... )
    >>> d['SI.hChannels.channelType']
    ['stripe', 'stripe']

    c                s   dg}xl | \}}|d krP |dkr2| d n2|dkrF| d n|dkrZ| d n
|| | |d  } qW |d |S )Nr  r  )r  r  )r  r  r  )r  r  )rM  ri   )r   tokensrE  r   )
next_tokenrE   rH   lex:B  s    

zmatlabstr2py.<locals>.lexc             S   s@  t | }|dkrdS d}x ||k r8| | dkr8|d7 }qW ||krJd |fS | | dkrf| | |d fS | | dkr|d }x ||k r| | dkr|d7 }q|W | ||d  |d fS | | dkr|d }x ||k r| | dkr|d7 }qW | ||d  |d fS |}x&||k r.| | d	kr.|d7 }q
W | || |fS )
Nr6   )Nr6   r  rU   z{[;]}'r   r   z {[;]})rc   )r   r  r   r  rE   rE   rH   r  MB  s0    z matlabstr2py.<locals>.next_tokenFc                s       s S t dkrByt S  tk
r@   |r<t S X  d dkr~|r^ d dksnd dd krrt dd S  d dkr|r d dksd dd krt S |rt fddd	D rt d d
kr S  dks dkrdS  dks dkrdS  d d dkrDtdd  dd dD 	 S  d d dkr|t
dd  dd dD 	 S d ksd kryt S  tk
r   Y nX yt S  tk
r   Y nX yt S  tk
r   |rtY nX  S )NrU   r6   r  r   r   r   c             3   s   | ]}| kV  qd S )NrE   )rF   r   )r   rE   rH   rI   |B  s    z.matlabstr2py.<locals>.value.<locals>.<genexpr>z ';[]{}r  ra  TrueTr`  FalseFr   zzeros(c             S   s   g | ]}t |qS rE   )r   )rF   r   rE   rE   rH   rG  B  s    z/matlabstr2py.<locals>.value.<locals>.<listcomp>r  r   zones(c             S   s   g | ]}t |qS rE   )r   )rF   r   rE   rE   rH   rG  B  s    r  rs  )r  rc   r   rv   r_   rd  rr   r"  r  r  Zonesrq  )r   failrE   )r   rH   r   hB  sZ      &&
zmatlabstr2py.<locals>.valuec                s   |   } y| ddS  tk
r(   Y nX g  }}|g}x | D ]t}|dkr^g }|| qB|dkr| }t|dkrt|d ttfr|d }|d }|| qB|| qBW t|dkrt|d ttfr|d }|S )NT)r  z[{z]}rU   r6   r   )r  r_   ri   r[   rc   r\   r  r]   )r   r|   Zadd2r  rE  r=  )r  r   rE   rH   r
  B  s*    zmatlabstr2py.<locals>.parser  r6   %r   rU   c             3   s   | ]}| kV  qd S )NrE   )rF   r1  )r  rE   rH   rI   B  s    zmatlabstr2py.<locals>.<genexpr>z	 ';[]{}<>)F)r  r  r  rd  )rl  r
  r  r  r  rE   )r  r  r  r   rH   r&   #B  s"    
0r&   r   c             C   sj   |r&|  |}|dk r| S | d| S |d }t| }x"|rT|d8 }| | |kr8P q8W d}| d|d  S )a?  Return string truncated at first null character.

    Clean NULL terminated C strings. For Unicode strings use null='\0'.

    >>> stripnull(b'string\x00\x00')
    b'string'
    >>> stripnull(b'string\x00string\x00\x00', first=False)
    b'string\x00string'
    >>> stripnull('string\x00', null='\0')
    'string'

    r6   NrU   r   )r  rc   )rl  r  r  r   rE   rE   rH   r0   B  s    
r0   c             C   sL   t | }x2|r6|d8 }d| |   k r.dk r
n q
P q
W d}| d|d  S )zReturn string truncated at last byte that is 7-bit ASCII.

    Clean NULL separated and terminated TIFF strings.

    >>> stripascii(b'string\x00string\n\x01\x00')
    b'string\x00string\n'
    >>> stripascii(b'\x00')
    b''

    rU   r      r   N)rc   )rl  r   rE   rE   rH   
stripasciiB  s    r  c             C   s   |    } d}|dkr@t| tr4| dkr.dS d}n| dkr@dS |dkrp|sVt| trd| dkrpdS n| dkrpdS | |kr|dS | |krdS tdS )zReturn string as bool if possible, else raise TypeError.

    >>> asbool(b' False ')
    False
    >>> asbool('ON', ['on'], ['off'])
    True

    FNs   trueTra  s   falser`  )r  r  r\   r   rW   )r   ra  r`  r  rE   rE   rH   r  B  s(    	
r  c             C   sL   |dkrt tttf}x2|D ]*}y|| S  ttttfk
rB   Y qX qW | S )zReturn argument as one of types if possible.

    >>> astype('42')
    42
    >>> astype('3.14')
    3.14
    >>> astype('True')
    True
    >>> astype(b'Neee-Wom')
    'Neee-Wom'

    N)r   rq  r  r  r_   r   rW   r   )r   r  typrE   rE   rH   r    C  s    

r       c             C   sD   | |k r|  dS x,dD ]$}| d } | |k r| dd| S qW dS )zReturn file size as string from byte size.

    >>> format_size(1234)
    '1234 B'
    >>> format_size(12345678901)
    '11.50 GiB'

    z B)KiBMiBGiBTiBPiBg      @z.2fr  Z	ginormousrE   )r<   	thresholdr  rE   rE   rH   r$   (C  s    	

r$   c             O   s   | S )zOSingle argument identity function.

    >>> identityfunc('arg')
    'arg'

    rE   )r  r  rg   rE   rE   rH   r  :C  s    r  c              O   s   dS )z<Null function.

    >>> nullfunc('arg', kwarg='kwarg')

    NrE   )r  rg   rE   rE   rH   r(   DC  s    r(   c             C   s   t | ttfr| S | fS )zReturn tuple containing value if value is not a tuple or list.

    >>> sequence(1)
    (1,)
    >>> sequence([1])
    [1]
    >>> sequence('ab')
    ('ab',)

    )r\   r  r  )r   rE   rE   rH   r]  MC  s    r]  c             C   s   d}x| D ]}||9 }q
W |S )zReturn product of sequence of numbers.

    Equivalent of functools.reduce(operator.mul, iterable, 1).
    Multiplying numpy integers might overflow.

    >>> product([2**8, 2**30])
    274877906944
    >>> product([])
    1

    rU   rE   )iterableprodr   rE   rE   rH   r+   [C  s    
r+   c                s"    fdd}t d t| |dS )zReturn human sorted list of strings.

    E.g. for sorting file names.

    >>> natural_sorted(['f1', 'f2', 'f10'])
    ['f1', 'f2', 'f10']

    c                s   dd t  | D S )Nc             S   s    g | ]}|  rt|n|qS rE   )isdigitr   )rF   r1  rE   rE   rH   rG  xC  s    z3natural_sorted.<locals>.sortkey.<locals>.<listcomp>)r  r  )r=  )numbersrE   rH   sortkeywC  s    znatural_sorted.<locals>.sortkeyz(\d+))rG   )r  r  rx  )r  r  rE   )r  rH   r'   mC  s    

r'   c             C   s   t j | d |d  S )zBReturn datetime object from epicsTSSec and epicsTSNsec tag values.i%g    eA)r  fromtimestamp)secZnsecrE   rE   rH   epics_datetime~C  s    r  c             C   s"   |dkrt j d}|t |  S )zReturn datetime object from timestamp in Excel serial format.

    Convert LSM time stamps.

    >>> excel_datetime(40237.029999999795)
    datetime.datetime(2010, 2, 28, 0, 43, 11, 999982)

    NiZ
 )r  fromordinalr;  )	timestampepochrE   rE   rH   excel_datetimeC  s    	r  c          	   C   s  | dkrdS | d }|dkrBt |d d }|d| |d  7 }||dkrPdnd	 }t |d
 d }t d| }t || d }|| t d|  }||dk rdnd }	||	dkrdnd }
t|d\}}t|d\}}t|d\}}t|
|	|||||S )zReturn datetime from days since 1/1/4713 BC and ms since midnight.

    Convert Julian dates according to MetaMorph.

    >>> julian_datetime(2451576, 54362783)
    datetime.datetime(2000, 2, 2, 15, 6, 2, 783)

    iOD NrU   i# g   @}<Ag    @r   i  i  gfffff^@g     v@gaTR'>@g      +@r0  g      @il  ik  i6 i`  i  )ru  truncr
  r  )Z	juliandayZ
milisecondr)  rK  r  r1  r  rs  r  r  r  r  r  secondrE   rE   rH   r  C  s$    	r  c             C   s6   | dks| t jkrdS ddd}|| | |t j kS )zcReturn if byteorder matches the system's byteorder.

    >>> byteorder_isnative('=')
    True

    r   Tr   r   )r  r   )r   rk   rV   )rk   r  rE   rE   rH   r  C  s    
r  c             C   sV   | |ks| dks|dkrdS | dkr6dddt j } n|dkrNdddt j }| |kS )z}Return if byteorders match.

    >>> byteorder_compare('<', '<')
    True
    >>> byteorder_compare('>', '<')
    False

    r   Tr   r   r   )r  r   )r   rk   )rk   Z
byteorder2rE   rE   rH   byteorder_compareC  s    	r   c             C   sh   i }x^t | jj| D ]L\}}|dd \}}|d dkrFtt|}n|jdk rX| }|||< qW |S )zReturn numpy.recarray as dict.NrP   rU   r   )rx  rs   descrr  r0   r  r  )Zrecarrayr|   r  r   r:   rs   rE   rE   rH   re  C  s    
re  c                sJ   ddl m} d |r |\dd   fdd|| S )zReturn XML as dict.

    >>> xml2dict('<?xml version="1.0" ?><root attr="name"><key>1</key></root>')
    {'root': {'key': 1, 'attr': 'name'}}
    >>> xml2dict('<level1><level2>3.5322</level2></level1>')
    {'level1': {'level2': 3.5322}}

    r6   )r@  r  c          	   S   sH   t | ttfs| S x0tttfD ]"}y|| S  tk
r>   Y qX qW | S )N)r\   r]   r   r   rq  r  rv   )r   rE  rE   rE   rH   r    C  s    
zxml2dict.<locals>.astypec       	         s  | j }r|ddd }|| jr&i nd i}t| }|rtt}x:t|D ],}x&| D ]\}}||  | q\W qNW | fdd| D i}| jr|| 	 fdd| j D  | j
r| j
 }|s| jr|r ||| d < n |||< |S )	Nr  rU   r   c                s2   i | ]*\}}t |d kr$ |d n ||qS )rU   r6   )rc   )rF   r  r  )r    rE   rH   r  D  s   z0xml2dict.<locals>.etree2dict.<locals>.<dictcomp>c             3   s"   | ]\}}|  |fV  qd S )NrE   )rF   r  r  )r    atrE   rH   rI   D  s    z/xml2dict.<locals>.etree2dict.<locals>.<genexpr>r   )rF  r  rL  r  collectionsdefaultdictrC  r  ri   r   r]  r  )	rE  rG   r  childrendddcr  r  r]  )r    r  
etree2dictsanitizer  rE   rH   r  C  s*    
$

zxml2dict.<locals>.etree2dict)rJ  r@  rK  )rC  r	  r   rN  rE   )r    r  r  r	  r  rH   r3   C  s    	r3   K   r  r   c          
      s>  t | }|dk s |dk s |dk r$dS |dkr`d}t||t | d |  |}|dk rZdS d}	nbdt d|  }t||t |d  d |  |}|dk rdS d| t |d  }|d | d }	|d	ks|dkr|}n0d
t|  k rdk rn ntt|| }|d
k r||7 }|dks.|	dkrRd
| d	| fg}
d}d}d| }n|d	ksf|	|krrd
| fg}
n|d
kr||	|  }|| |d	 fg}
n~||ks|dk r|| }d
| d	| fg}
nN|| }||| d  }d
| d	| f|| | d	f|| | || d	 fg}
|d	kr(dn|d}g }x|
D ]\}} | d	kr\|| q<t	| }t
dd| }xtd
t | |D ]}|d| d| |d    |dkr|||  n|}|d fddtd
d| dD 7 }|d|t |  7 }|||||  7 }|| qW q<W d|}|d}|S )zReturn hexdump representation of bytes.

    >>> hexdump(binascii.unhexlify('49492a00080000000e00fe0004000100'))
    '49 49 2a 00 08 00 00 00 0e 00 fe 00 04 00 01 00 II*.............'

    rU   rP   r  r   r   s   %%0%ix: s   %xrC   Nr6   s   ...cp1252s   [^\x20-\x7f]   .    c             3   s   | ]} ||d   V  qdS )rP   NrE   )rF   r   )r  rE   rH   rI   _D  s    zhexdump.<locals>.<genexpr>   
r   )rc   r  r  r   ru  r  r   ri   binasciihexlifyr  subrw  r	  rn  )bytestrr  r  snipatrY  ellipsisr<   addrZbytesperlinenlinesr{  r  r6  end1end2r|   ZhexstrZstrstrr   rG  rE   )r  rH   hexdumpD  sv     





(

r  c             C   sT   |   } | sdS y|  S  tk
r,   Y nX y|   S  tk
rN   Y nX dS )zReturn if all characters in string are printable.

    >>> isprintable('abc')
    True
    >>> isprintable(b'\01')
    False

    TN)r  isprintablerv   rn  )rl  rE   rE   rH   r  hD  s    	r  c             C   sd   |  dd dd dd dd dd} |r\|  dd dd	 dd dd dd} |  S )
z)Return string with compressed whitespace.z
r  r  z

	r  z  z[ r  )rz  r  )rl  compactrE   rE   rH   clean_whitespace~D  s    r  c             C   s   yPddl m} t| ts |  } |t| }|j|dd|j	j
d} t| } W n2 tk
r   t| trrt| } | dd} Y nX | ddd	dS )
zReturn pretty formatted XML.r6   )rN  T)ri  rj  rh  z><z>
<z  r  r  )rk  rN  r\   r   r   r
  r{  r|  r  Zdocinforh  r  rv   rz  )rC  rN  ro  rE   rE   rH   pformat_xmlD  s     

r  r  c                s  |dks|dk rd} dks$ dk r(d t  }t jd d t| trt| dd  dksl| d	d d
krtt| } t| trt| rt| } t| } nt jf | t	|  |ddS | 
 } nt| tr| dd  dks| d	d dkr|dkr
| dd   nt| } | 
 } n0t| t jr4|  } nddl}|j|  |d} t jf | |dkr| d    } t| dd} | d  S t|  }t||krd fdd|d|d  dg || d d  D } n d fdd|d| D } | S )zcReturn pretty formatted representation of object as string.

    Whitespace might be altered.

    NrU   i   r-  r  )r  Z	linewidthr   s   <?xmlr   s   OME>)r  r  rY  z<?xmlzOME>r   r6   )r  r  T)r  r  c             3   s   | ]}|d   V  qd S )NrE   )rF   r  )r  rE   rH   rI   D  s   zpformat.<locals>.<genexpr>rP   z...c             3   s   | ]}|d   V  qd S )NrE   )rF   r  )r  rE   rH   rI   D  s    )rr   Zget_printoptionsZset_printoptionsr\   r   r  r  r  r  r  r  r]   r  r'  pprintr*   r  r  rc   r	  )r  r  r  r  Znpoptr  ZarglrE   )r  rH   r*   D  sH    
$


&"



0 r*   c             C   s  |dkrd}|dkr(t | tr$d}nd}t|}|  }g }x|D ]~}|dkr^|| qDt|}||krz||  qD|}	|	dks|	dkr|}	n.dt|	  k rdk rn ntt||	 }	|	dk r|	|7 }	|	dk rd}	|dks||d k r(|	dkr|| | d  n|| d|  qD|	dkrN||| || d   qD|	|ksf||d k r|| d||  |  qD|| | }
|	|
d  }||
 }|| d| | | |d   qDW t | trd		|S d
	|S )zcReturn string cut to specified length.

    >>> snipstr('abcdefghijklmnop', 8)
    'abc...op'

    Ng      ?s   ...u   …rU   r6   r   rP   r  r  )
r\   r   rc   r  ri   r  r   ru  r  r	  )rl  r  r  r  rp  r  r|   r  Zlinelenr  Zsplitlenr  r  rE   rE   rH   r  D  sR    




&
r  c             C   s   | j }|dkrt| }|S )z4Return short string representation of Enum instance.N)r:   r]   )r  r:   rE   rE   rH   r#    E  s    r#   c             C   sR   y| |S  t k
rL   y| |  S  t k
rF   td| Y nX Y nX dS )zReturn enum member from its name or value.

    >>> enumarg(TIFF.PHOTOMETRIC, 2)
    <PHOTOMETRIC.RGB: 2>
    >>> enumarg(TIFF.PHOTOMETRIC, 'RGB')
    <PHOTOMETRIC.RGB: 2>

    zinvalid argument N)rv   r_  r_   )r  r  rE   rE   rH   r"   (E  s    	r"   c             O   sj   i }x&|D ]}|| kr
| | ||< | |= q
W x8|  D ],\}}|| krZ| | ||< | |= q6|||< q6W |S )aX  Return dict with keys from keys|keyvals and values from kwargs|keyvals.

    Existing keys are deleted from kwargs.

    >>> kwargs = {'one': 1, 'two': 2, 'four': 4}
    >>> kwargs2 = parse_kwargs(kwargs, 'two', 'three', four=None, five=5)
    >>> kwargs == {'one': 1}
    True
    >>> kwargs2 == {'two': 2, 'four': 4, 'five': 5}
    True

    )r  )rg   r  	keyvaluesr|   rG   r   rE   rE   rH   r)   :E  s    

r)   c             K   s*   x$|  D ]\}}|| kr
|| |< q
W dS )zUpdate dict with keys and values if keys do not already exist.

    >>> kwargs = {'one': 1, }
    >>> update_kwargs(kwargs, one=None, two=2)
    >>> kwargs == {'one': 1, 'two': 2}
    True

    N)r  )rg   r   rG   r   rE   rE   rH   r2   UE  s    	r2   c             O   s$   ddl }|tj| f|| dS )zLog message with level WARNING.r6   N)logging	getLoggerr   warning)r  r  rg   r!  rE   rE   rH   rq  cE  s    rq  c             C   s   ddl }|dkrdg}|dkr"d}||| ddg}d|krxT| D ]H}| }|drF|dd  }x|D ]}||krrP qrW t|P qFW dS )	a2  Validate TIFF file using jhove -m TIFF-hul.

    Raise ValueError if jhove outputs an error message unless the message
    contains one of the strings in 'ignore'.

    JHOVE does not support bigtiff or more than 50 IFDs.

    See `JHOVE TIFF-hul Module <http://jhove.sourceforge.net/tiff-hul.html>`_

    r6   NzMore than 50 IFDsjhovez-mzTIFF-huls   ErrorMessage: r  )
subprocesscheck_outputr  r  rp  rn  r_   )r   r$  rU  r%  r  r  errorr   rE   rE   rH   validate_jhovejE  s     

r(  c          	   C   s   |dkrd}|dkrd}|dkr$dnd}t | |dP}|j| j|d}|dkrhtdtj|  d|dkrv|jS || W dQ R X dS )zDReturn or replace ImageDescription value in first page of TIFF file.Nr6   i  zr+b)r   zno z
 tag found)	r   rO   r  rV   r_   r   r   r   r  )r  r  r  r
  r   rh   rF  rE   rE   rH   r   E  s    r   c       
   
   C   sV   |dkr| d }t | 4}|j||||d}	|	j|||d W dQ R X W dQ R X dS )z5Write fsspec ReferenceFileSystem JSON from TIFF file.Nz.json)rG   r   r   r  )r  )r   rd   r  )
r   r  r  rG   r   r   r  r  rh   storerE   rE   rH   r   E  s    
r   c             C   s  |rt nt}|dkrd}|dkr&| }n| dkr6d}|rB|d7 }|dddd t }t| d}|js~|d	|dd
 td|jd }|d}|	d}|j
}	t||	j }
|| |d|||	t|
dd
 |jdstd|dddd |  |d |d  |d |d  f}|rD||d |d |d |d f }ddt|  | }tj|dd |	d}tj|d |d |d |d f|	d}t|j}xt|d D ] }xt|d D ]}xt|d D ]}x&t|d D ]}t| ||< qW xt|d D ]}xt|d D ]x}|d||d  |d |d  ||d  |d |d  f |dd< |r|||||||f  |dddd q W qW qW qW qW ||dd
 W dQ R X dS )zConvert [MP]TZCYX LSM file to series of BIN files.

    One BIN file containing 'ZCYX' data are created for each position, time,
    and tile. The position, time, and tile indices are encoded at the end
    of the filenames.

    N)r-  r-  r   z*_(z%ic%iy%ix%i)_m%%ip%%it%%03iy%%ix%%i.binz
Opening LSM file... r  T)r6  r  r  )r  znot a LSM filer6   Fz5Image
  axes:  {}
  shape: {}
  dtype: {}
  size:  {}ZTZCYXznot a *TZCYX LSM filez#Copying image from LSM to BIN filesr   r   r   r   rU   )rU   r   rC   )rs   rP   .r  )r7  r(   r  r   r   r  r_   r   r  ry  rs   r+   rt   r  r$   r   r  r  rc   rr   r  rI  rO   rw  r  re   r*  )ZlsmfileZbinfiler  verbosetimerr  r   rz   r   rs   r<   r  ry   r  rO   r  r  rE  rF  r5  r=  rE   rE   rH   r   E  sh    


  "
(,r   `   c                s  |dkrd}|dkrd}|dk}j dkr4dj jdkrDd}|rvjd	 d
ksvjdkrnjd d
ksvd}d} |dkrtdn
tdjdk rtddkrdd}n|rjd d
krt	ddt	dd	nV|sJjd	 jd d k rJjd	 jd d k rJt	dd	t	dd	|o\jd	 d
k}|rjdnd8 |dkrd}nt
|tr|}nd}|rdd|d|d|f |r0jd |ksވjd |krd}nd}nFdd|d|f |r0jd	 |ks&jd |kr,d}nd}|dkr|ryt}W n tk
rh   d}Y nX |dkr|d? dnj jdkr`|rj jdkr|dkryttt d}W n" tk
r   j jd }Y nX nt
|ttjfsj jd }d| }|rD|dk r>d| > n|dkrT|d ? dnj jdkr|r ddk< yt}W n tk
r   d}Y nX |rD|d krDj jd!krd| n| nVj jdkrd}nBj jd"krDtyt}W n tk
rB   d}Y nX |rPd}n|dkr^|}|dkr4j jd#krtj j}yt}W n tk
r   d	}Y nX ||kr4t|k }nhj jdkr0tj j}yt}W n tk
r   d}Y nX ||kr4t|k }nd}tjd$ dkrֈjd%d&d'dd( j|d)d*d+d,d-yjjj |
 W n tk
r   Y nX |
rt!|
" nd}j#d.d  d/|d.  d0d1d2dd3 |dkrd4}$|}|%d5 |
r2yt&|
d6}
W n t'k
r"   Y nX j |
d7d8 |dkrj jd9krPd:}n"j jd;ksh|dkrnd<}nd=}|d>kr|d?7 }j(t)d@   f||||dA||s*   fdBdC}dDdE }||_+|_,|_-rt.d@ dt/  g fdFdGt0D }x|D ]}d|_1q0W |f fdHdI	f fdJdK	f fdLdM	}j2dN| x,t3|D ] \}}|4|ffdOdP	 qW |fS )Qa  Plot n-dimensional images using matplotlib.pyplot.

    Return figure, subplot, and plot axis.
    Requires pyplot already imported C{from matplotlib import pyplot}.

    Parameters
    ----------
    data : nd array
        The image data.
    photometric : {'MINISWHITE', 'MINISBLACK', 'RGB', or 'PALETTE'}
        The color space of the image data.
    planarconfig : {'CONTIG' or 'SEPARATE'}
        Defines how components of each pixel are stored.
    bitspersample : int
        Number of bits per channel in integer RGB images.
    interpolation : str
        The image interpolation method used in matplotlib.imshow. By default,
        'nearest' is used for image dimensions <= 512, else 'bilinear'.
    cmap : str or matplotlib.colors.Colormap
        The colormap maps non-RGBA scalar data to colors.
    vmin, vmax : scalar
        Data range covered by the colormap. By default, the complete
        range of the data is covered.
    figure : matplotlib.figure.Figure
        Matplotlib figure to use for plotting.
    title : str
        Window and subplot title.
    subplot : int
        A matplotlib.pyplot.subplot axis.
    maxdim : int
        Maximum image width and length.
    kwargs : dict
        Additional arguments for matplotlib.pyplot.imshow.

    NrV  i   )rV  rW  Zfloat16r(  r  Fr   )rC   r   rP   r   rT  )rU  rT  NrC   znot an imager6   r   r   i   .ZbilinearZnearestrX  rU   r6  r   r  r   g        gꌠ9Y>)Fg      ?r  r1  r   zmatplotlib.pyplotfontz
sans-serifnormal)familyweightr<   )g$@g333333@Tz1.0r  )dpiZfigsizeZframeon	facecolorZ	edgecolorgQ?g\(\?g?gffffff?g?)bottomtopleftrightZhspaceZwspaceo   )r6   r6   r6   zWindows-1252rR  )r<   rS   graybufZviridisZcoolwarmrU  _r)r6   )vminvmaxrd  interpolationc                s   t | d } t |d }yRrJ d || f  d d|dd| ddS || f  d|dd| ddS  tk
r~   d	S X d S )
Ng      ?rU   z @ z [4z, r  z @ [r  )r   ru  )r=  r5  )curaxdatcurrentry   dimsrE   rH   format_coordF  s    ,"zimshow.<locals>.format_coordc             S   s   dS )Nr  rE   )r  rE   rE   rH   r   F  s    zimshow.<locals>.nonec                sX   g | ]P}j d d|d  ddgd| d j| d ddd j|  d	d
qS )g      ?gQ?rU   g333333?g?z
Dimension r6   z0.5z%.0f [r  )r2  Zvalfmt)ZSliderr   rz   )rF   r?  )ry   pyplotrE   rH   rG  G  s   	zimshow.<locals>.<listcomp>c                s^   |t |    d<  d  x,t|| D ]\}}d|_|| d|_q.W j  d S )NrU   FT)r  r  set_datarx  ZeventsonZset_valcanvasZdraw)r@  slidersry   ctrlr  )r?  figurerB  rE   rH   	set_imageG  s    

zimshow.<locals>.set_imagec                sb   t t| } | d< | || kr$d S | |j| kr8d} n| dk rN|j| d } | ||< | d S )Nr6   rU   )r   r  rz   )r  r?  ry   r@  )r?  rI  rE   rH   
on_changed G  s    zimshow.<locals>.on_changedc                s   | j } d }t|dkr&|| n|dkrB|| d | n|dkr^|| d | n|dkr|t|jd kr|dn|d  d< n\|dkr|dkrt|jd n|d  d< n0|dkrԈ|j| d | n|d	krd| d S )
Nr6   r  r6  rU   r5  upZdownr6  home)rG   r]   rc   rz   )r  ry   r@  rG   r?  )r?  rJ  rE   rH   on_keypressed-G  s     $$zimshow.<locals>.on_keypressedZkey_press_eventc                s
    | |S )NrE   )r  r)  )rJ  rE   rH   r>  BG  r   zimshow.<locals>.<lambda>)5rs   r    ra  rz   r  r  r.   r_   rr   r  r\   r   r  rt   ru  rv  logrv   rK  ri  r   absoluteZiinfor  Zfinfor   modulesrcrH  rE  managerZwindowtitlerc   r  Zsubplots_adjustsubplotZset_facecolorr]   rW   r   Z
atleast_2dZcolorbarrB  Zget_cursor_dataZformat_cursor_datar  r  rw  ZdrawonZmpl_connectr}  rJ  )ry   r  r  r  r  r=  rd  r;  r<  rH  rS  r1  rT  Zmaxdimrg   r  r  ZdatamaxZdtminr<   rB  r   rF  ZsliderrM  r?  rG  rE   )	r?  r@  ry   rA  rH  rB  rJ  rC  rI  rH   r   E  sn   6



  
























	

r   c              C   s   t jd } |   dS )z)Block the GUI. For use as skimage plugin.zmatplotlib.pyplotN)r   rP  show)rC  rE   rE   rH   r5   GG  s    
r5   c              K   s>   ddl m}m} | }|  |  |jf | }|  |S )z4Return file name(s) from Tkinter's file open dialog.r6   )Tk
filedialog)tkinterrV  rW  Zwithdrawr   r   destroy)rg   rV  rW  rO  	filenamesrE   rE   rH   r   MG  s    r   c                 s  ddl } ddl}| t| j |jdddt dd}|j}|dd	d
dddd |ddddddd |ddddddd |dddddd |ddddd d |d!d"d#dd$d% |d&d'dd(d)d |d*d+ddd,d |d-d.ddd/d |d0d1ddd2d |d3d4ddd5d |d6d7d8dd9d: |d;d<d=dd> |	 \} d?
  |jrddl}yddlm} W n tk
r~   d}Y nX |j||jd@ dS  stdAtjdB  s|dC t fdDdEdFD rt   stdG dS  d  |js
tdHd?dIdJ t }yt |j dK}W nP tk
rt }	 z0|jrB tdL|	jj dM|	  t d W dd}	~	X Y nX |jst| |j!rdI|_"g }
|j#dkr|jstdNd?dIdJ dOdP }|$  y|j%dkr|j&|j%dQ|j'|j% dfg}
n|j(dkr|j(|j( }|j)dkr(|j)}nN|j*rrt+|j,dRkrrd}x0|j-D ] }|dS7 }t+|j,dRk rLP qLW nd}|j&|j(|dT||j(|j( j.|j(|j( fg}
nxt/|j(d|j# D ]\}}|j)dk rd}x0|j-D ] }|dS7 }t+|j,dUk rP qW nd}y*|
0|j&||dT||j.|j(| f W n^ tk
r }	 z>|
0d||j'df |jrd tdV1||	jj|	dWdX W dd}	~	X Y nX qW W nD tk
r }	 z$|jr t|	jj dM|	  W dd}	~	X Y nX |jst| |js<tdYdZdIdJ |$  tj2|t3|j4d[}t| t  t| t  |5  |
r|j#dkry"ddl6}|7d\ dd]l6m8} W n> tk
r }	 zt9d^|	jj dM|	  W dd}	~	X Y n8X x*|
D ] \}}}|dkrڐq|j:}|j;|j< }}|j=r&yt>?|||j=k }W n t@k
r$   Y nX |jArvy|jBd_ }|jBd` }W n tCk
r\   Y nX ||krv|j;|j< }}|r| da| da| }n| db| }dc}|jDddkrtE|jDjF}tG|||||jH|j=||jI|jJde	 qW |K  dS )fz*Tifffile command line usage main function.r6   Nzusage: %prog [options] pathz!Display image data in TIFF files.z%prog r  )usager  r  progz-pz--pager   r   r   zdisplay single page)destr  r  helpz-sz--seriesr   z%display series of pages of same shapez-lz--levelr   zdisplay pyramid level of seriesz--nomultifilenomultifile
store_trueFz*do not read OME series from multiple files)r]  actionr  r^  z	--noplotsnoplotsr   zmaximum number of plotsz
--interpolinterpolZINTERPOLzimage interpolation method)r]  metavarr  r^  z--dpir1  r,  zplot resolutionz--vminr;  zminimum value for colormappingz--vmaxr<  zmaximum value for colormappingz--debugdebugzraise exception on failuresz	--doctestdoctestzruns the docstring examplesz-vz--detailr  rP   )r]  r  r  z-qz--quietquiet)r]  ra  r  )ZoptionflagszSelect a TIFF file)rS  	filetypeszNo file specifiedc             3   s   | ]}| kV  qd S )NrE   )rF   r   )rt  rE   rH   rI   G  s    zmain.<locals>.<genexpr>z?*zNo files match the patternz
Reading TIFF header:T)r6  r  )r=   z

z: zReading image data: c             S   s   t dd | D S )Nc             s   s   | ]}|d k	r|V  qd S )NrE   )rF   r   rE   rE   rH   rI   G  s    z(main.<locals>.notnone.<locals>.<genexpr>)r  )r=  rE   rE   rH   notnoneG  s    zmain.<locals>.notnone)rG   l        rU   )r   r   l        z!
Series {} failed with {}: {}... r  )r6  zGenerating report:z   )r  ZTkAgg)rC  z<tifffile.main> rS  rT  r  z
 rT  )rC   )rS  r;  r<  r  r  r  r=  r1  )Lr!  optparser"  r   setLevelINFOOptionParserrB  
add_option
parse_argsr	  rf  Ztifffile.tifffiler  rm  testmodELLIPSISr   r   r  r'  rd  r^   r7  rg  r   r   r_  rv   re  r   r   exitr  Znorgbrb  r  r   re   rO   r   r   r2  r+   rz   r  r  r}  ri   r  r  r   r  r  
matplotlibZuserC  rq  r  r;  r<  r  rr   r  r_   r  r  r   r  rS  r:   r   r  rc  r1  rU  )r!  rj  rn  optsettingsrf  r  r+  rh   r   rj  ri  r   r   rG  r   r   r&  rs  rC  imgr   r  r;  r<  rS  r  rE   )rt  rH   mainYG  s   






$(
,


rw  strictc             C   sB   |dk	r|  ||S y|  d|S  tk
r<   |  d|S X dS )z)Return Unicode string from encoded bytes.Nzutf-8r  )rn  r  )r  rh  rV  rE   rE   rH   r  eH  s    r  r  c             C   s   t | tr| |S | S )z4Return bytes from Unicode string, else pass through.)r\   r]   r   )r   rh  rE   rE   rH   r  oH  s    r  __main__)NF)NNN)NNNr6   r6   r}   )NN)N)NFNNNN)NN)N)NNT)NN)N)NN)N)r   rU   N)r   rU   N)r   N)r6   N)N)T)NNN)N)N)N)rP   r   )F)NN)r  Nr6   )r   T)NN)N)r  )N)r6   )TN)r
  r  r   rP   N)F)r  r  T)r  NN)NN)NNN)NNNNNN)NNT)NNNr6   NNNNNNr,  NN)Nrx  )r  )r   rB  __all__r  r  r  r  r^   r{  r  ru  ra   r  r   r   r,  r<  rX   collections.abcr7   r8   concurrent.futuresr9   rr   r+  rv   r   r   r   r%   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r
   r  r   r   rw  r   r   r   r  r   rb  r  r  r  r  rc  r  r  r  r  r  r  r  r  r  ri  rU  r  r   r!  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  rk  r  r  rl  rc  r?  r  r  rm  r	  r  r  r  r  r  r  r  r  r5  r6  r  r  r  r  r  r  r9  rC  r7  r  r   rI  r	  rt  rs  r  r  r,   r.   r/   r1   r-   r  r  r  r!   r&   r0   r  r  r    r$   r  r(   r]  r+   r'   r  r  r  r  r   re  r3   r  r  r  r  r*   r  r#   r"   r)   r2   rq  r(  r   r   r   r   r5   r   rw  r  r  r4   rw   saver	   r   rr  rE   rE   rE   rH   <module>  sn  9
bF     K!               2                     N              o x     Ek _     >    y   qY@    B+                    K 
g':24 .
$f
YG%     94$HB-$%j<
2%"
 *"#0)K, 
	
#:M=;     M              C  
