1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
MRCZ Specification
==================
In general MRCZ follows the CCPEM MRC2014 standard as outlined here:
http://www.ccpem.ac.uk/mrc_format/mrc2014.php
Please note we count bytes starting from ``0``. CCP-EM counts bytes starting
from ``1``.
Required deviations from CCPEM MRC2014 standard
-----------------------------------------------
1. **Word 4 (@ byte 16)**: The **MODE** parameter is now the sum of the MRC2014
**MODE** plus the ``blosc`` compression used * 1000.
The compressor enumeration is::
{ 0:None, 1:'blosclz', 2:'lz4', 3:'lz4hc', 4:'snappy', 5:'zlib', 6:'zstd' }
Unpacking is generally performed as follows::
mrcMode = numpy.mod(mrczMode, 1000)
compressor = numpy.floor_divide(mrczMode, 1000)
In practice any **MODE** > 1000 indicates the use of a compression codec.
``blosc`` will discover the actual codec used itself.
2. In the case where ``compressor != None``, starting at byte 1024 (or 1024 +
**EXTRA** if the extended header is used) a ``c-blosc`` header is found. The
``c-blosc`` header format specification may be found here:
https://github.com/Blosc/c-blosc/blob/master/README_HEADER.rst
``blosc`` is limited to ``2**31`` bytes per chunk. Chunking for compression is
accomplished by compressing each slice/frame in the z-axis with a separate
call to ``blosc.compress()``. Therefore the data section consists of **NZ**
structs of ``c-blosc`` headers followed by the packed bytes for the associated
slice/frame.
Optional deviations from CCPEM MRC2014 standard
-----------------------------------------------
1. **Word 33 (@ byte 132)**: Accelerating voltage in keV, float-32 format.
**Deprecated**.
2. **Word 34 (@ byte 136)**: Spherical aberration in mm, float-32 format.
**Deprecated**.
3. **Word 35 (@ byte 140)**: Detector gain in e^-/DN, defaults to 1.0.
**Deprecated**.
4. **Word 36-37 (@ byte 14)**: Size of compressed data in bytes stored as a 64-bit
integer, including ``blosc`` headers. Present for convenience only.
5. **Word 57 (@ byte 224)**: The ascii-encoded identifier label 'MRCZ<version>'.
For example, ``b'MRCZ0.3.1'.
Failure to include any of these variables will not result in an exception.
JSON extended meta-data
^^^^^^^^^^^^^^^^^^^^^^^
When the keyword argument ``meta`` is used with ``writeMRC`` and
``asyncWriteMRC`` the passed dictionary will be converted to UTF-8 encoded JSON
and written into the extended header. This is indicated by the ascii-encoded
bytes ``'json'`` written into the **EXTTYP** variable of the MRC2014 header. The
length of the encoded JSON metadata is stored in the **EXTRA** variable of the
MRC2014 header.
*Note*: ``python-rapidjson`` is preferred but the standard library ``json``
module is used as a fallback.
|