Skip to main content

mesc-io

tests PyPI

Read Femtonics .mesc two-photon recordings in Python — the frames in the units the native reader shows, every unit's metadata, an export, a write-back, and a viewer that draws ROIs and computes their dF/F.

the viewer on a synthetic recording: four spots, three of them blinking, their dF/F below

Install

pip install mesc-io
pip install "mesc-io[tiff,imagej]"     # + TIFF export, ImageJ ROI export

Needs Python 3.9 or newer, numpy and h5py; nothing else for reading and viewing. Motion correction (mesc-io register) is an extra, [register], and pulls in Suite2p 0.14.

Python

from mesc_io import MescFile

with MescFile("recording.mesc") as f:
    for u in f.units():
        print(u.path, u.shape, u.frame_rate_hz, u.pixel_size_um)

    frames = f.read("MUnit_0", channel=0)              # reader units, float64
    frames = f.read("MUnit_0", reader_units=False)     # the stored integers
    for block in f.iter_frames("MUnit_0", block=500):  # bigger than memory
        ...

read refuses over 4 GB by default (max_gb=None to override). A unit name that matches in more than one session is refused, not resolved to the first; MSession_1/MUnit_0 always works.

Command line

mesc-io info      recording.mesc                            # units, rates, pixel sizes
mesc-io check     recording.mesc                            # what the file disagrees with itself about
mesc-io export    recording.mesc MUnit_0 u0.h5              # or u0.tif — a Fiji hyperstack
mesc-io export    recording.mesc all out_folder --tiff      # every unit, one .tif each
mesc-io writeback recording.mesc out.mesc MUnit_0 u0.h5     # processed frames back in
mesc-io view      recording.mesc                            # the recording in a browser

info and check take --json.

Opening a recording in Fiji

Fiji has no reader for .mesc (Bio-Formats lists none for Femtonics). export … .tif writes what Fiji opens with File ▸ Open as a calibrated hyperstack: every channel (--channel N for one), in composite mode with each channel in its own colour and display range; the frame interval for a recording or the slice spacing for a z-stack; x and y pixel sizes in µm; and the unit's comment, the units and each channel's conversion under Image ▸ Show Info. Values are in reader units (float32), as the native reader shows them; --stored-units keeps the file's integers. Frames are streamed, so a unit larger than memory exports too.

Motion correction

mesc-io register recording.mesc recording_MC.mesc          # one reference per unit
mesc-io preset save soma --block-size 128 --max-shift-nr 5 # name a set of settings
mesc-io register recording.mesc out.mesc --preset soma     # use it; a flag still wins

Needs pip install "mesc-io[register]". The defaults are the calcium-imaging pipeline's own correction; z-stacks and units too short to register are skipped and said so. Groups, presets, where they are kept and how to share them: docs/registration.md.

The viewer

mesc-io view opens the recording in a private browser window: units on the left with a thumbnail each and the unit's own metadata (rate, pixel size, the stage position and the position from the zero set on the rig); the image in the middle — scrub it, average a window of N frames, zoom into a place by dragging a box; ROIs on the right (spot, rectangle, polygon; drag to move, type a size); every ROI's time course along the bottom, raw or dF/F by our pipeline's method (mesc_io.dff, numpy only, held against the pipeline's functions in the tests), stacked or overlaid, zoomed by dragging a box. ROIs belong to the unit they were drawn on and are saved as you go, in one folder, ~/mesc-viewer/, never beside the raw file; so is the view itself, so reopening the file puts you back where you were. A z-stack is shown in slices and microns, with a max projection, a 3D view you can turn (MIP, semi-transparent, or coloured by depth) and XYZ orthogonal views through one crosshair. With overlay on, a two-channel stack is shown in both: green and magenta, each channel through its own window and with its own floor, white where both are bright (depth colouring stays one channel). In 3D, point marks the brightest voxel under a click (numbered, with its µm position, slice and each channel's value; also shown in XYZ), measure gives the distance between two points in µm — shift+click goes on into a path, an axon's length — box clips the stack to six limits and slab draws only a thickness around the current slice, as MIP.

ruler (beside the ROI tools) measures in µm between two clicks on the image; PNG saves what is on screen for a figure — the image at whole pixels with the ROIs, the ruler, a scale bar and a caption, or the 3D view — and png beside csv the traces.

The picture is drawn in fixed limits: by default the display window the recording was saved with on the rig (the file's own LUT, typically 0–2000 in reader units), the same for every frame, so a frame that is dimmer looks dimmer — bleaching, a change of laser power or a field drifting out of focus show while you scrub. Type other limits per unit and channel (they live in the view, never in the file; file brings the saved ones back), or switch to auto %, which stretches the recording on percentiles of the whole unit — one window for every frame, so scrubbing does not flicker. Each channel has a palette: its colour from the file, a single colour, or one of 25 of Fabio Crameri's perceptually uniform Scientific colour maps (batlow, oslo, lajolla, vik, roma, …). Overlay puts all channels in one picture, each through its own limits and colour.

Layout and decisions: docs/viewer_design.md.

To try it without a recording, make one:

python tools/make_synthetic.py            # writes synthetic_view.mesc: 3 units, 4 spots, 3 of them blinking
mesc-io view synthetic_view.mesc

Development

pip install -e ".[tiff,dev]"
pytest

The package lives under src/, so tests run against the installed copy. CI runs the suite on Python 3.9, 3.12 and 3.13 on Linux, macOS and Windows, plus one job with Suite2p for the registration tests; the browser checks (tests/*_real_chrome.js) run in a real Chrome and are not part of pytest.

Acknowledgements

F. Kamari, for the idea. Claude Code, for the debugging.

Licence

MIT — see LICENSE.

The viewer's colour maps include Fabio Crameri's Scientific colour maps (v8.0, MIT, © 2020 Fabio Crameri; licence). If a figure made with them goes into a paper, cite: Crameri, F. (2018). Scientific colour maps. Zenodo. https://doi.org/10.5281/zenodo.1243862

Metadata

Release files for mesc-io 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mesc-io 0.4.2
File Size Uploaded Provenance Actions
mesc_io-0.4.2.tar.gz 192.2 kB With provenance Details for mesc_io-0.4.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for mesc-io 0.4.2
File Interpreter ABI Platform Actions
mesc_io-0.4.2-py3-none-any.whl Python 3 none any Details for mesc_io-0.4.2-py3-none-any.whl

Total release size: 350.0 kB

Release files / mesc_io-0.4.2.tar.gz

Download URL mesc_io-0.4.2.tar.gz
Size 192.2 kB
Tags Source
SHA-256 checksum
How to use checksums
14694f6147fa6a5bd475d6ff85466de8048fb9d1232efa339b2d252813ae0a85
BLAKE2b-256 checksum
How to use checksums
e234fef02fa756a8371fd5ede59960004681b9046364a06301f1e7739763f8a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / mesc_io-0.4.2-py3-none-any.whl

Download URL mesc_io-0.4.2-py3-none-any.whl
Size 157.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2cd581e025739491f65340198c5bd8715971ba8ecfb2cb8a0b78ef995b997619
BLAKE2b-256 checksum
How to use checksums
8b3414b746da3a69c8f78d9e74defb430383eb0a07c39d8a23ebeb9e54d292bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for mesc-io 0.4.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for mesc_io-0.4.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.4.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page