A Python toolkit for multi-modal holographic systems and cellular analysis.
Project description
iivs-lib
A Python toolkit for multi-modal holographic systems and cellular analysis.
📦 Installation
Requires Python 3.13 or newer.
# With uv (recommended)
uv add iivs-lib
# With pip
pip install iivs-lib
Image I/O ships by default: imagecodecs (to decode the LZW-compressed Koala
Image/*.tif uint8 previews) is a core dependency — handling image-like
microscope data is this library's primary job. The only extra is [torch],
which adds PyTorch for iivs.dhm.analysis.pytorch — tensor-in / tensor-out
OPD / dry-mass twins with autograd (uv add "iivs-lib[torch]").
🚀 Quick start
from iivs.dhm.data.phase import PhaseBinFolder, PhaseUnit
from iivs.dhm.analysis import DryMassCalculator
# Lazily open a phase acquisition (a folder of numbered .bin frames).
phase = PhaseBinFolder("scan/Phase/Float/Bin", target_unit=PhaseUnit.RADIANS)
phase.frame_shape # (H, W), shared across frames
img = phase[0] # first frame as a float32 array (decoded on access)
# Per-frame dry mass over a segmented cell:
calc = DryMassCalculator(pixel_size=phase.header.pixel_size)
mass_pg = calc.calc_from_phase(img, mask=cell_mask)
🧩 Modules
Each package ships a detailed README in the source tree — the endpoints,
examples, and the inherited sequence interface:
hologram,
phase,
intensity,
data (overview
and timestamp),
analysis.
iivs.dhm.data
Readers, writers, and lazy sequences for Lyncée Tec Koala acquisition data (validated end-to-end against a real Koala acquisition — every format, the sequences, and the round trips between them).
hologram— uint8 holograms:.tifviaload_hologram_tif/save_hologram_tifwithHologramTifFolder/HologramTifList; a single multi-frame.rawviaHologramRawFile(a lazynp.memmap),read_hologram_raw_header/save_hologram_raw; header-less.npyframes viaHologramNpyFolder.phase— float32.binphase images:load_phase_bin/save_phase_bin/read_phase_bin_header, the typedPhaseBinHeaderandPhaseUnit, andconvert_phase_unit; folder/list sequencesPhaseBinFolder/PhaseBinList. The same quantitative phase from Koala'sFloat/Txtexport viaload_phase_txt,PhaseTxtFolder/PhaseTxtList. The uint8Image/*.tifdisplay previews (not quantitative) viaPhaseTifFolder/PhaseTifList. Header-less.npyframes viaPhaseNpyFolder(pixel_size/unit/height_scalepassed to the constructor;numpy.load, pickle disabled).intensity— float32.binintensity reconstructions (exported alongside phase):load_intensity_bin/save_intensity_bin/read_intensity_bin_header, the typedIntensityBinHeader, and folder/list sequencesIntensityBinFolder/IntensityBinList; plus theFloat/Txttwinsload_intensity_txt,IntensityTxtFolder/IntensityTxtList, the uint8Image/*.tifpreviewsIntensityTifFolder/IntensityTifList, and header-less.npyframes viaIntensityNpyFolder(pixel_sizepassed in). The phase and intensity.binformats share thecommon.KoalaBinHeaderbase.timestamp— per-frame acquisition timing: theTimestamprecord,TimestampsTxtFile(Koalatimestamps.txt), andTimestampsFixedFPS(synthesized from a frame rate).
phase and intensity also expose suffix-dispatch entry points that pick
the format by a path's extension — load_phase / read_phase_header /
save_phase, phase_list / phase_folder (and the intensity twins) — plus
save_phase_folder / save_intensity_folder to write any (e.g. a kaparoo-
composed) image sequence to a numbered folder. load_phase / load_intensity
take return_header (the header is None for the header-less .npy).
A timelapse module opens a whole Koala acquisition from its root folder:
KoalaTimelapse composes the per-modality PhaseGroup / IntensityGroup (each
picking its Float/{Bin,Txt} format), the holograms, timestamps.txt, and
phbounds.txt display bounds, with lazy access, frame-count consistency checks
(is_consistent), and content validate. search_timelapses finds every
acquisition under a root; KOALA_TIMELAPSE_TREE describes the layout for
hierarchy.validate.
Every sequence is a kaparoo.data.sequences.DataSequence, so it indexes,
slices, and iterates lazily; same-shape sources also expose frame_shape by
mixing in iivs.common.data.FrameShapedMixin (so a uniform source is its
<Modality>FloatSequence / <Modality>ImageSequence plus that mixin). For
phase and intensity the quantitative float32 sources are
<Modality>FloatSequence and the uint8 Image/*.tif previews are
<Modality>ImageSequence, both under the <Modality>Sequence base.
Numbered-folder sequences share the KoalaFrameFolder discovery/validation
base in iivs.dhm.data.koala, and validate their arrays via iivs.common.data's
validate_float32_array / validate_uint8_array.
iivs.dhm.analysis
Physical quantities derived from phase, each via an engine object that precomputes its conversion factor (with one-shot function conveniences):
opd— optical path difference (OPD = phase * wavelength / (2*pi), in nm).OPDConverter(convert_to_opd/convert_to_phase, scaleopd_scale);phase_to_opd/opd_to_phase.drymass— dry mass (pg) via the Barer relation.DryMassCalculator(calc_from_opd/calc_from_phaseover a background-corrected map, optionally masked by a boolean or integer-label region; scaledrymass_scale) delegates its masked sum to theiivs.common.dataSumreduction;calc_drymass/calc_drymass_from_phaseare the one-shots.
The wavelength and alpha defaults come from
iivs.dhm.constants, the lab's microscope settings —
shared by analysis and data, and belonging to neither. Override per experiment
when the setup differs.
Using with PyTorch (autograd)
The convert_* / calc_* methods operate on NumPy arrays. Install the
iivs-lib[torch] extra for iivs.dhm.analysis.pytorch — tensor-in / tensor-out
twins that keep the input tensor's device, dtype, and autograd graph (the
calibration scalars are shared with the NumPy engines). The Torch
OpticalPathDifference / DryMass are pure pointwise nn.Modules (so they fit
nn.Sequential / torch.compile); masking and reduction are the separate
iivs.common.data.pytorch reductions, which the calc_* one-shots compose:
from iivs.dhm.analysis.pytorch.opd import phase_to_opd
from iivs.dhm.analysis.pytorch.drymass import calc_drymass_from_phase
opd = phase_to_opd(phase, wavelength=666e-9) # Tensor (CPU/GPU), grad kept
mass = calc_drymass_from_phase(phase, pixel_size=px, mask=cell) # Tensor, grad kept
Or, without the dependency, multiply by the cached scale factors (plain floats) with native ops yourself:
opd = phase * conv.opd_scale # phase: Tensor -> OPD (nm), grad kept
mass = opd[mask].sum() * calc.drymass_scale # OPD -> dry mass (pg), grad kept
iivs.common.data
Technique-agnostic data primitives — nothing here knows what a hologram is, so a
future technique can build on them without importing dhm.
ArrayFileList[U]— the dtype-generic base every file-backed sequence extends, withFrameShapedMixinmarking the same-shape sources andValueRangeMixinadding a cachedvalue_range()over all frames.load_float32_npy/save_float32_npyand theuint8pair, plusread_npy_shape/write_npy— header-less.npyI/O, keyed by dtype (which is all that varies) rather than by modality. Pickle is disabled, so an object array cannot be written and one written elsewhere is refused rather than unpickled.validate_float32_array/validate_uint8_arrayand their widerfloat/uintforms — dtype + shape + non-finite checks, withon_nonfinite("ignore"/"warn"/"raise") the policy every loader and saver in the library threads through.Sum/Mean/Norm/Variance/Std— masked region reductions: reduce a(..., H, W)map over the regions of a mask (a boolean image or stack, or an integer label image; regions may overlap), withregion_stack/apply_maskthe shared primitives. A Torch twin iniivs.common.data.pytorchmirrors them as autograd-friendlynn.Modules.Timestamp/TimestampSequence/TimestampsFixedFPS— per-frame timing, which any time-lapse acquisition has; the Koalatimestamps.txtreader implements this interface fromdhm.
iivs.common.visualization
Technique-agnostic display helpers, shared across every modality.
auto_rescale— ImageJ-style auto-contrast (Enhance Contrast + Normalize): clipssaturated% of pixels via NaN-safe percentile bounds, stretches ontoout_range(or the dtype's full span), and casts back to the input dtype. Works on any numeric image or stack, so phase / intensity / hologram share it.
📋 TODO
See TODO.md for tracked open items.
📜 Changelog
See CHANGELOG.md for the version history.
🙏 Acknowledgements
The file formats read and written by iivs.dhm.data are
Lyncée Tec's proprietary Koala formats. The .bin
format — Koala's float32 binary container, shared by the phase and intensity
reconstructions — was cross-checked against their reference implementation,
pyKoalaUtils (MIT). iivs-lib is
an independent reimplementation and contains no code from it.
⚖️ License
This project is distributed under the terms of the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iivs_lib-0.2.0.tar.gz.
File metadata
- Download URL: iivs_lib-0.2.0.tar.gz
- Upload date:
- Size: 85.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd49051e0587ee4454bf551d9b96e6570d1da3046545a6f5e84d9b626133a496
|
|
| MD5 |
08e519c524cecb2de56fbdc4d7b8f2d3
|
|
| BLAKE2b-256 |
eebe7b38b38195c07c4cf4a102a481d474b0465069883fd817a55c6162f06216
|
Provenance
The following attestation bundles were made for iivs_lib-0.2.0.tar.gz:
Publisher:
publish.yml on iivs-lab/iivs-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iivs_lib-0.2.0.tar.gz -
Subject digest:
bd49051e0587ee4454bf551d9b96e6570d1da3046545a6f5e84d9b626133a496 - Sigstore transparency entry: 2202184335
- Sigstore integration time:
-
Permalink:
iivs-lab/iivs-lib@47b5105201976a11d04df5ccc77d3c51c366632f -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/iivs-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@47b5105201976a11d04df5ccc77d3c51c366632f -
Trigger Event:
push
-
Statement type:
File details
Details for the file iivs_lib-0.2.0-py3-none-any.whl.
File metadata
- Download URL: iivs_lib-0.2.0-py3-none-any.whl
- Upload date:
- Size: 120.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1acb96487619b687ae1a4fbfef64c016a864b06d23602d823360194891aa096f
|
|
| MD5 |
aa6db8d4451dffde7b50cb2d8a34e89e
|
|
| BLAKE2b-256 |
089c95e0b982a583ae4c2de1f7650b175cb4d171f64b6843e23d791e2c7abd37
|
Provenance
The following attestation bundles were made for iivs_lib-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on iivs-lab/iivs-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iivs_lib-0.2.0-py3-none-any.whl -
Subject digest:
1acb96487619b687ae1a4fbfef64c016a864b06d23602d823360194891aa096f - Sigstore transparency entry: 2202184657
- Sigstore integration time:
-
Permalink:
iivs-lab/iivs-lib@47b5105201976a11d04df5ccc77d3c51c366632f -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/iivs-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@47b5105201976a11d04df5ccc77d3c51c366632f -
Trigger Event:
push
-
Statement type: