mrc
Type-safe MRC-2014 file format reader/writer for Rust
A high-performance, memory-efficient library for reading and writing MRC (Medical Research Council) format files used in cryo-electron microscopy and structural biology.
Note: This crate is under active development. While most features are functional, occasional API changes are possible. Contributions welcome — please report issues and share your ideas!
Installation
[]
= "0.2"
Quick Start
use ;
// Read (auto-detects compression; handles common microscope quirks
// like NVERSION=0 and "MAP\0" automatically)
let reader = open?;
for slice in reader..slices
// Write — always call .finalize() or the header will be incomplete
let mut writer = create
.shape
.
.finish?;
writer.write_block?;
writer.finalize?;
Full Documentation
See docs.rs/mrc for the complete API reference, including: (For API docs, see APIs.md.)
- Reading files —
Reader,MmapReader, compressed I/O, permissive mode, decompression bomb protection (256 GiB limit, configurable) - Writing files —
Writer,MmapWriter,GzipWriter,Bzip2Writer - Iterators — slices, slabs, tiles, volumes,
auto-conversion via
reader.convert::<T>().slices()etc. - Full-volume reads —
read_volume::<T>(),read_volume_u8(), auto-conversion viareader.convert::<T>().read_volume() - Data modes —
Modeenum and compile-timeVoxeltrait, including Packed4Bit read/write viaslices_u8/write_u4_block - Headers —
Header,HeaderBuilder, validation, endianness - FEI extended headers — typed
Fei1Metadata/Fei2Metadataparsing - Error handling —
ErrorandHeaderValidationError - Validation —
validate_full/validate_reader/ValidationReport - Real-world workflows — tilt series, FEI metadata, volume stacks
- Troubleshooting — common errors and how to fix them
CLI Tools
| Binary | Description |
|---|---|
mrc-validate |
Comprehensive file validation (header, stats, NaN/Inf scan) |
mrc-header |
Human-readable header inspection with semantic interpretation |
mrc-invert |
Contrast inversion (v → −v) with updated header statistics |
Migrating from v0.1
| v0.1 | v0.2 |
|---|---|
MrcView::new(data) |
Reader::open(path) / open(path) |
MrcFile::create(path, header) |
create(path).shape(dims).mode::<T>().finish() |
MrcView::view::<f32>() |
reader.slices::<f32>() |
MrcViewMut |
Writer + VoxelBlock<T> |
MrcMmap |
MmapReader / MmapWriter |
v0.2 adds SIMD acceleration, parallel encoding, type conversion iterators, compression support, unified reader API, and FEI extended header parsing.
Roadmap
v0.2.x — Core + SIMD + FEI (current)
- Complete MRC-2014 format support
- Iterator-centric API (slices, slabs, tiles)
- Type-safe I/O with compile-time mode checking
- SIMD acceleration (AVX2, NEON) — i8→f32, i16→f32, u16→f32
- Memory-mapped I/O and parallel encoding
- All data types (modes 0–4, 6, 12, 101)
- Compression support (gzip, bzip2)
- FEI1/FEI2 extended header parsing
- Header statistics computation and validation
- Permissive mode and volume stack support
- Decompression bomb protection (configurable 256 GiB limit)
v0.3.x — Extended Features
- Extended header parsing for CCP4, MRCO, SERI, AGAR formats
- Dedicated benchmark suite
License
MIT — see LICENSE.
Acknowledgments
- CCP-EM for the MRC-2014 specification
- EMDB for providing real-world test data
- Cryo-EM community for invaluable feedback