Skip to main content

npcomp — lossless compression and backup for SpikeGLX Neuropixels data

npcomp is a minimal CLI wrapper around mtscomp, the IBL lossless compressor for raw Neuropixels data (about 3x compression):

  • compress: losslessly compress SpikeGLX .bin files into .cbin + .ch (mtscomp's built-in byte-per-byte verification runs automatically);
  • restore: decompress .cbin + .ch back to .bin (also automatically verified); --dest mirrors the whole backup back;
  • status: report compression state, space already saved, estimated savings and time;
  • backup mode (--dest): mirror a whole folder into a destination; .bin files are compressed, everything else (including empty directories) is copied and verified.

Chinese version: README_ZH.md.

Installation

From PyPI:

pip install npcomp

From source (current development workflow):

conda create -n mtscomp python=3.10 -y
conda activate mtscomp
cd <path-to-repo>
pip install -e .

Add the Scripts folder of the conda environment (e.g. <conda-env>\Scripts, where npcomp.exe lives) to your user PATH, then open a new terminal and run npcomp directly.

Quick start

# Report compression status
npcomp status <path-to-session>

# Compress in place (.bin -> .cbin + .ch, originals kept)
npcomp compress <path-to-session>

# Mirror backup to a destination: .bin compressed, everything else copied & verified
npcomp compress <path-to-session> --dest <backup-dir>

# Same backup, but run .bin compression through a fast scratch disk (e.g. NVMe)
npcomp compress <path-to-session> --dest <backup-dir> --scratch <fast-disk-dir>

# Delete source .bin only after a successful, verified compression (this run only)
npcomp compress <path-to-session> --dest <backup-dir> --delete

# Restore (in place by default; --dest mirrors the backup back)
npcomp restore <backup-dir>
npcomp restore <backup-dir> --dest <restore-dir>

Command reference

npcomp compress <folder> [--dest DIR] [--scratch DIR] [--dry-run] [--delete] [--cpus N] [--chunk SEC] [--force] [--yes] [--quiet]

  • Recursively scans <folder> and only processes .bin files that have a valid SpikeGLX .meta sibling (containing nSavedChans plus imSampRate/niSampRate); covers ap/lf/nidq and leaves every other .bin untouched.
  • Parameters are read from the .meta: channel count from nSavedChans; sample rate from imSampRate (ap), imSampRate/12 (lf), or niSampRate (nidq); data type is fixed to int16.
  • Defaults: 1-second chunks, all CPU cores, verification always on.
  • Without --dest: writes X.cbin + X.ch next to the source; existing pairs are skipped, --force recompresses.
  • With --dest: mirror-backup mode — .bin files are compressed into the destination, everything else is copied and byte-verified (directory structure included). Identical existing files are skipped; differing ones prompt (--yes accepts all, --force redoes everything).
  • With --scratch (requires --dest): raw .bin files are first copied to a fast scratch directory (e.g. an NVMe SSD), compressed there, and the verified .cbin/.ch are copied back to the destination. This can be much faster when the destination is a slow disk. Scratch files are removed after each file; the scratch directory must be empty before a run (npcomp refuses otherwise) and should stay dedicated to npcomp.
  • --delete: delete the source .bin only for files successfully compressed and verified in this run.
  • --dry-run: print the plan (compress/copy/delete) without touching anything.
  • If the destination already contains data (e.g. a previous run interrupted by power loss), you are prompted first; non-interactive runs require --yes.

npcomp restore <folder> [--dest DIR] [--overwrite] [--delete] [--dry-run] [--quiet]

  • Recursively finds every X.cbin + X.ch pair and decompresses it to X.bin (mtscomp verifies each decompression byte-for-byte).
  • Restores in place by default; existing .bin files are skipped unless --overwrite is given.
  • With --dest: full mirror restore — pairs are decompressed and everything else is copied back byte-verified (directory structure included). Existing files are kept; --overwrite replaces differing ones.
  • The compressed X.cbin + X.ch pair is kept by default; only an explicit --delete removes it after a successful restore (and only pairs successfully restored in this run; skipped pairs are kept).
  • A missing .meta only produces a warning — it is not needed for byte-level decompression, but downstream tools need it.

npcomp status <folder> [--ratio F] [--throughput MBS]

  • Reports per-file state (raw-only / both / compressed-only / incomplete, plus +tmp for leftovers) and sizes.
  • Compressed files use actual sizes for the saved-space figure; uncompressed files are estimated with the default compression ratio 3.0 (--ratio) and throughput 88 MB/s (--throughput).
  • Status is based on file existence and size only; it does not validate file contents.

Safety design

  • Lossless + automatic verification: compression and decompression both run a byte-per-byte check; failures raise errors and clean up temp files, so no half-written output survives.
  • Atomic rename: data is written to *.tmp and renamed into place only after verification; leftover .tmp files are cleaned automatically on the next run (only npcomp's own files — unrelated tmp files are never touched). Source .bin files are never touched by a failed run.
  • Conservative deletion: only an explicit --delete removes source .bin files, and only those successfully compressed and verified in this run.
  • Backup verification: in --dest mode every copied file is byte-verified after copying; .npcomp_manifest.json in the destination records the SHA-256 of every source file (plus the .cbin/.ch hashes for recordings), so re-runs skip unchanged content and detect same-name/different-content or tampered files.
  • Restore verification: restore --dest copies non-recording files back with the same byte verification, so the restored tree mirrors the backup.
  • Space check before writing: compress estimates the output size (raw size / 3 plus a small per-file overhead) and refuses to start when the target drive — or the scratch drive, against the largest single file — lacks room. If a disk still fills up mid-run, the run aborts immediately instead of failing file by file.
  • Two-step rename caveat: .cbin and .ch are each renamed into place in separate steps; a power loss in between can leave a mismatched pair. The next compress run detects this via the manifest and prompts to recompress (self-healing).
  • Keep the trio: after backup, keep X.cbin + X.ch + X.meta together. Losing .ch makes decompression impossible; losing .meta makes the restored data unusable by downstream tools.

License

This project is licensed under the BSD 3-Clause License.

Metadata

Release files for npcomp 0.1.1

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

Source distribution (sdist)

Source distribution for npcomp 0.1.1
File Size Uploaded
npcomp-0.1.1.tar.gz 23.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for npcomp 0.1.1
File Interpreter ABI Platform
npcomp-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 40.9 kB

Release files / npcomp-0.1.1.tar.gz

Download URL npcomp-0.1.1.tar.gz
Size 23.2 kB
Tags Source
SHA-256 checksum
How to use checksums
fb5ae08d1c625ef8c5bde72eef4c1fc4e0e8bdae3bdcd9f081383e532888eb33
BLAKE2b-256 checksum
How to use checksums
efa744b3bbecadc3719011ea32d1385657da1c14d0810b0c8997d82eae5884b6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 7, 2026.

Transparency log

Release files / npcomp-0.1.1-py3-none-any.whl

Download URL npcomp-0.1.1-py3-none-any.whl
Size 17.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ccfcce6972d64f8d08d64b4e4f7c79d762794b34e1e40d045b0df20057feb60f
BLAKE2b-256 checksum
How to use checksums
2346888c9161676c835265036a8dd301cbb8a34040e158d60adff92b338f9662
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 7, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

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