Skip to main content

smappy

Python implementation of the SMAP single-molecule fitting pipeline: camera conversion, filtering, peak finding, ROI cutting, maximum-likelihood fitting with a Gaussian or experimental (cubic-spline) PSF, and streaming output to HDF5. Reads SMAP _3Dcal.mat calibration files, Micro-Manager TIFF stacks and NDTiff datasets (pycro-manager).

See NOTES.md for the design decisions and open questions.

Install

pip install smappy-smlm[viewer]

The distribution is smappy-smlm because smappy on PyPI is an unrelated package; the import name is smappy either way. From a checkout:

/usr/bin/python3 -m venv .venv                 # native arm64 on Apple silicon
.venv/bin/python -m pip install ".[viewer]"

That builds the C++ extensions and installs the smappy-fit, smappy-live, smappy-view and smappy-drift commands. For work on smappy itself, -e and pytest instead; scripts/*.py run from a checkout without installing anything.

Use

import smappy

locs = smappy.fit(data, out="OUT.h5",
                  camera={"conversion": 6.7, "offset": 400,
                          "pixelsize_um": 0.127},
                  calibration="..._3dcal.mat")
smappy.view("OUT.h5")

data is a path to an acquisition, an image source, an array of frames, or any iterable of (first_frame, block) -- so images already in memory need no file. A path may be a Micro-Manager TIFF series or an NDTiff dataset directory; which one it is follows from what is there, and nothing above open_stack has to know. camera is a dict of the fields, a CameraMetadata or the path of a YAML config, and overrides whatever the image metadata says; calibration is a _3dcal.mat, and without one the fit is Gaussian and there is no z. The table is returned whether or not it is also written; collect=False streams to the file alone, for an acquisition too long to hold in memory.

smappy.fit only assembles the stages, and they are equally available on their own -- this is the same fit written out:

from smappy.io.tiff import open_stack, camera_metadata
from smappy.io.calibration import load_spline_calibration
from smappy.detect import DoGFilter, DynamicCutoff, PeakFinder
from smappy.psf import SplinePSF
from smappy.pipeline import FitSettings, fit_stack

source = open_stack("...MMStack_Default.ome.tif")
camera = camera_metadata(source, overrides={"conversion": 6.7, "offset": 400,
                                            "pixelsize_um": 0.127})
model = SplinePSF(load_spline_calibration("..._3dcal.mat"))
finder = PeakFinder(DoGFilter(1.2), DynamicCutoff(1.7))

locs, engine = fit_stack(source.frames(chunk=200), camera, finder, model,
                         FitSettings(roisize=13, output_unit="nm"))

To render an image from a localization table:

from smappy.filter import LocFilter
from smappy.render import (FieldOfView, RenderSettings, DisplaySettings,
                            render_locs)

keep = LocFilter(locs, loc_precision_nm=(None, 20), logl_rel=(-2, 0))
fov = FieldOfView.around(locs["x_nm"], locs["y_nm"], pixelsize=10.0)
image = render_locs(locs, fov, RenderSettings(mode="precision"), select=keep)
rgb = DisplaySettings(lut="hot", gamma=0.7).apply(image)

mode is "hist", "gauss" (one sigma for all) or "precision" (sigma from the localization precision, the default in SMAP). Set color_field to colour by z or any other column instead of by density. Rendering and display are separate on purpose: contrast, gamma and the colour map change without re-rendering.

To merge localizations of the same emitter across consecutive frames:

from smappy.group import group, GroupSettings

grouped, group_index = group(locs, GroupSettings(dx=50.0, dt=1))

grouped carries the same columns, combined by SMAP's per-column rules (positions weighted by precision, z by its own error, photons summed and their errors added in quadrature, precisions added in inverse quadrature), plus n_in_group.

To look at the result:

smappy.view(locs)                # a table, or the path of a saved file

The image and the controls open as two windows. The image window holds nothing but the image, so it can be resized to whatever the screen allows -- any shape, filled edge to edge: a wide window shows more x rather than putting bands beside a square image, and pixels stay square throughout. Since the rendered pixel size follows the canvas, a larger window is a finer image, not a scaled-up one. Closing it closes both; closing the controls leaves the image alone.

Scroll or pinch to zoom about the cursor, +/- to zoom about the centre, drag to pan, r to reset. Panning and zooming re-render as they go, so a gesture fills in what it exposes instead of dragging a stale image around. Type a minimum and maximum to filter on localization precision, z, PSF size, relative log-likelihood and frame; an empty box means "no bound", and the data range is shown beside each row. A window opens with a precision cut at 25 nm, relative log-likelihood above -1.5 and z within +-500 nm; each is written into its box, so what has been filtered out is visible rather than hidden in a default. The "grouped" box switches to the grouped table, which is built on first use and keeps its own filter; "additive" switches field colouring to SMAP's composite, where overlapping colours add (red over cyan saturates to white).

"colour by" selects a plain intensity image or one coded by z, frame, localization precision or photons, with the range typed into the "colour" row (empty ends fall back to the data's own). The range is always explicit, so the same z means the same colour at every zoom and after every block of a live fit; the LUT follows the choice -- hot for intensity, turbo for a coded field. Needs matplotlib (pip install matplotlib).

Or from the command line:

smappy-fit DATA OUT.h5 \
    --camera camera.yaml --cal CAL_3dcal.mat --units nm

The camera is stated in a YAML config (examples/camera_evolve512.yaml) or directly on the command line -- --pixelsize 0.127 --conversion 6.7 --offset 400 does the same thing without a file, and either overrides what the image metadata says. A lab that keeps a SMAP *_cameras.mat can pass it with --cameras for the conversion and the per-camera metadata rules, but nothing requires one. In Python the same layers are camera_metadata(source, presets, overrides), where overrides is a CameraMetadata, a dict or a YAML path and wins over everything else.

NDTiff

pycro-manager writes NDTiff: a directory with an NDTiff.index and one or more *NDTiffStack*.tif. The index is a flat table giving, per image, the file and the byte offset of its pixels, so images are read by seeking and the TIFF page chain is never walked: opening costs about 7 us per frame against the ~120 us a page walk takes, so a 46 k-frame dataset is ready in 0.3 s rather than 5 s. open_stack returns an NDTiffSource for such a directory and an ImageSource for a Micro-Manager series; everything downstream is the same.

The reader is a port of SMAP's MATLAB loader (shared/imageloaders/), including the parts that are not in any specification: the index table is zero-padded, the bytes per pixel are more reliably derived from where the metadata starts than from the declared pixel type, and an interrupted acquisition leaves records describing images that were never written -- those are dropped rather than read as noise.

That last rule is also what makes a growing dataset safe to read: a record is used only once the bytes it points at are there. Following an acquisition is therefore just re-reading the index, with none of the care a growing TIFF page chain needs, and live_fit.py takes an NDTiff directory exactly as it takes a TIFF.

Drift correction

Sample drift is estimated with COMET, which maximises the overlap of localizations between time windows -- no fiducials, no reference structure. It is an optional dependency; the source is vendored:

.venv/bin/python -m pip install -e externaltools/Comet/Python_interface

smappy-drift OUT.h5 \
    --filter loc_precision_nm - 20 --filter logl_rel -2 - \
    --frames-per-window 500 --max-drift 300 --plot

The drift is estimated from the localizations that pass the --filter ranges -- the same limits the viewer takes -- and then subtracted from all of them, including the ones the filter hides: a filter is a view, the correction is a coordinate change. The result is written as OUT_driftc.h5, an ordinary localization file the viewer opens unchanged, with the drift curve kept in a /drift group.

From Python:

from smappy.drift import DriftSettings, correct_drift, save_drift_corrected

keep = LocFilter(locs, loc_precision_nm=(None, 20), logl_rel=(-2, None))
corrected, drift = correct_drift(locs, DriftSettings(segmentation_var=500),
                                 select=keep)
save_drift_corrected("OUT_driftc.h5", corrected, drift)

drift.drift[f] is (dx, dy, dz) in nm for frame f, and drift.plot() draws it. z drift is estimated whenever the table has z_nm; DriftSettings(use_z= False) keeps it lateral.

Nearly all the time is the optimizer, which evaluates a cost over every neighbour pair a few hundred times: 1:17 for 410 k localizations and 314 M pairs on the CPU backend (46 k frames, 92 time windows), down from 13 minutes -- see NOTES.md for the measurements, the noise floor they are judged against, and what did not help.

--group estimates from grouped localizations instead, one per blink: 314 M -> 21 M pairs and the whole correction takes 5 s, agreeing with the full estimate to about 1 nm (median) while being twice as noisy per window, which costs a few percent of resolution.

--spline --group is the best estimator measured so far: the drift is fitted as a cubic B-spline in time (no time windows, no interpolation afterwards) from grouped localizations. 4 s on the clathrin dataset against 2:33 for free per-window vectors, 0.6-0.7 nm noise per axis against 1.9-5.2, and a better image out of sample. --knot-frames sets how finely it can bend; the default (2000) is the better all-round choice, and finer settings buy a better-resolved transient at the start of an acquisition at the cost of spurious wiggle where the density has bleached away -- see NOTES.md.

--rcc estimates the drift by redundant cross-correlation instead -- an independent method (ported from SMAP's finddriftfeature), useful as a second opinion. On the clathrin dataset, with both estimating from grouped localizations and at matched smoothing, the two agree to 1.2 / 1.7 / 1.6 nm rms in x / y / z -- the level of their own noise (0.6-0.9 nm each).

--two-stage runs the grouped pass first and then an ungrouped one over a 30 nm radius, which is ~9x faster than the single pass for ~99% of the improvement -- and, because the fine pass is bounded by its own radius, it cannot produce the runaway time window the single pass occasionally does.

Filter before estimating, and include a z cut: without one the axial drift follows the out-of-focus tail (z_err_nm has a 95th percentile of 108 nm). --filter logl_rel -2 - --filter loc_precision_nm - 15 --filter z_nm -300 300 is a reasonable set for a 3D dataset.

Online: fit while the microscope writes

smappy-live DATA OUT.h5 --camera camera.yaml \
    --cal CAL_3dcal.mat --update 3 --timeout 30

DATA is the growing Micro-Manager TIFF, or the directory it is being written into; it does not have to exist yet. The window opens as soon as the first frames appear and takes in new localizations every --update seconds; the fit ends --timeout seconds after the last frame is written, which is how an acquisition stops. OUT.h5 is written throughout and is the result.

Everything the offline viewer offers works while this runs -- zoom, pan, the filter boxes, contrast, grouping -- and an update changes none of them: new localizations appear inside the view being looked at, under the bounds already typed. The frame comes from the camera field of view, so the image does not rescale as data arrives. Grouping cannot be extended, so the grouped table is marked stale and rebuilt when it is next asked for.

From Python:

from smappy.live import LiveSettings, live_view

live_view(directory, camera, finder, model, FitSettings(output_unit="nm"),
          output="OUT.h5", live=LiveSettings(update_seconds=3.0))

LiveFit is the same thing without a window: it runs the pipeline in a thread and queues finished blocks, for a different front end or a headless run.

Frames that are never written to a file

A control program may have the images already -- pycro-manager hands each one to a callback, a camera API returns them from a buffer. QueueSource is the same ImageSource interface for that: the producer pushes, the pipeline reads.

source = smappy.queue_source(shape=(512, 512))

source.push(image)               # from the acquisition thread, or a hook
source.close()                   # the acquisition ended

smappy.live_view(source, camera, finder, model, settings, output="OUT.h5")

Frames are numbered as they are pushed; push(image, first_frame=n) states the acquisition's own number instead, and a gap in the numbering ends a block rather than being papered over. maxsize bounds the queue for a producer that can outrun the fit, which then waits -- the only honest answer when the alternative is growing until memory runs out.

The lower level is there too: drive LocalizationEngine directly and push(frames) returns localizations once enough ROIs have accumulated, flush() forces a partial block. Nothing asks how many frames there will be.

Reading the result while it is still being fitted

on_block(locs) is called with each finished block as it comes out, which is what a control loop needs -- the localizations per frame are a measure of the blinking density, and the density is what the activation laser is there to hold steady:

def density(locs):
    frames = locs["frame"]
    per_frame = len(locs) / (frames.max() - frames.min() + 1)
    ...                          # act on it

smappy.fit(data, out="OUT.h5", camera=camera, calibration=cal,
           chunk=25, on_block=density)

chunk sets how often that happens, because a block is fitted at the end of a chunk of frames: 25 frames at 100 ms is a reading every 2.5 s. Smaller chunks cost a little throughput and buy a shorter loop. On a real dSTORM acquisition this reads 109, 107, 105, 104, 103, 98, 92, 93 localizations per frame over the first 200 frames -- the density decaying as the dye bleaches, which is the signal to act on.

progress(engine) is the cheaper hook: it gives the running counts, including stats["candidates"], the detected spots. That number needs no fit at all, so it is available sooner and is the better control signal when the point is density rather than positions.

A window is not the only output

show and live_view open a matplotlib window and want the main thread, which a program with its own event loop cannot give them. Two ways round it:

smappy.save_image(locs, "image.png", pixelsize=10.0)   # no window at all

save_image takes a table or a saved file, and the same RenderSettings, DisplaySettings and filter the viewer takes, so what it writes is what the viewer would show. It needs Pillow.

For a window, run smappy-view FILE as a separate process. And LiveFit is live_view without a window: the fit in a thread, finished blocks on a queue, for a front end of your own.

Scripts

script what it checks
check_calibration.py spline coefficients against the bead stack in the same file
check_stack.py what the image metadata provides, and what is missing
check_detection.py filtering, peak finding and ROI cutting on real frames
check_fit.py spline fits on real data, with and without the mirror flip
fit_dataset.py the whole pipeline, to HDF5 (smappy-fit)
view_locs.py opens the viewer on a saved localization file (smappy-view)
drift_correct.py drift-corrects a saved file with COMET (smappy-drift)

Tests

SMAPPY_TEST_CAL=/path/to/_3dcal.mat PYTHONPATH=src .venv/bin/python -m pytest tests/

Metadata

Release files for smappy-smlm 0.1.0

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

Source distribution (sdist)

Source distribution for smappy-smlm 0.1.0
File Size Uploaded
smappy_smlm-0.1.0.tar.gz 159.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for smappy-smlm 0.1.0
File
smappy_smlm-0.1.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
smappy_smlm-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
smappy_smlm-0.1.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
smappy_smlm-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.13+ x86-64 Details
smappy_smlm-0.1.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
smappy_smlm-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
smappy_smlm-0.1.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
smappy_smlm-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.13+ x86-64 Details
smappy_smlm-0.1.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
smappy_smlm-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
smappy_smlm-0.1.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
smappy_smlm-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.9+ x86-64 Details
smappy_smlm-0.1.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
smappy_smlm-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
smappy_smlm-0.1.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
smappy_smlm-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.9+ x86-64 Details
smappy_smlm-0.1.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
smappy_smlm-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
smappy_smlm-0.1.0-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details
smappy_smlm-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.9+ x86-64 Details

Total release size: 8.9 MB

Release files / smappy_smlm-0.1.0.tar.gz

Download URL smappy_smlm-0.1.0.tar.gz
Size 159.1 kB
Tags Source
SHA-256 checksum
How to use checksums
189f9e07d30602803766a46570c0f8094dbb1b9777ea00dc7c01623e6f0eb065
BLAKE2b-256 checksum
How to use checksums
1e6ac2f18d7ff05b82fe9dd41da2a2e21a03c3d46c8c25d77d12d49ef3806706
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp313-cp313-win_amd64.whl

Download URL smappy_smlm-0.1.0-cp313-cp313-win_amd64.whl
Size 586.8 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
eb452eef39141d35d7dd0ec3dc58fc91a66dbbe29186ba050c52965f3c7df06b
BLAKE2b-256 checksum
How to use checksums
535723f8f0b5554c64973dabdd11851ee00ca0aeb48db09cdcbde716d184f60e
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL smappy_smlm-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 440.9 kB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b2c53e289954ec8c4f0a426538e0827701e6f4dee33688a0e4533f5a5e0a9e9d
BLAKE2b-256 checksum
How to use checksums
dd90480411c9b27e57c320be567d8443f1bebe467e0cdfdf2ad7f134ddfd0a6c
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL smappy_smlm-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Size 365.5 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
136a3afed91fba411d2a884f0612a460b7c9803cad247b8a7ec39677485385aa
BLAKE2b-256 checksum
How to use checksums
198061ddd08871afc2fa23ac780ae8d667f954bf2ef3e748201adced0e0b48dc
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl

Download URL smappy_smlm-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl
Size 378.9 kB
Tags CPython 3.13 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
37ecbc38af483a42566c65ee9e5c24ac344bf4182e81b60eb5e7feeb8146b8b2
BLAKE2b-256 checksum
How to use checksums
e4bad7e80fdbcab57f471c8e97df53fa9a926b7ee81f985a0fc4d2595a113396
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp312-cp312-win_amd64.whl

Download URL smappy_smlm-0.1.0-cp312-cp312-win_amd64.whl
Size 586.8 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
22f2dfb7de6cfe97148587a1db1cd88fb15d7abeec2a1e55285c3c7b2084dbc0
BLAKE2b-256 checksum
How to use checksums
e6c2fbe761f1b1e39f87a64741b8dc4d33bcb1fd34ec278651deb311e1e1d5e7
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL smappy_smlm-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 440.6 kB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b5d94a7daf06c09bfda5181e6ced587cf77c689210f7da78bbc3926ebee4be4d
BLAKE2b-256 checksum
How to use checksums
2f93b64a39f17df1595fe1e079cdb83cc714974536532b6c3d4dbf737941a23c
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL smappy_smlm-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Size 365.4 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
251177611b5d0278c94e31ba70a99fb68bce8258713f4e9b38f2f0422d5ed881
BLAKE2b-256 checksum
How to use checksums
54900585d6963b7d889f79ea70d7d9c016a109e1da258cc1715fcb0266ee9b61
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl

Download URL smappy_smlm-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl
Size 378.7 kB
Tags CPython 3.12 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
70bb93f9921344566d423c23702b596309f7392015067530c6ebbe45cbdd4402
BLAKE2b-256 checksum
How to use checksums
e65e358ec7a0fbfb4dad41f0565b90ecf40cce21ed7e18c433b87dea821d13d4
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp311-cp311-win_amd64.whl

Download URL smappy_smlm-0.1.0-cp311-cp311-win_amd64.whl
Size 579.1 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
77cfb3a37faafbab80206cf57e03144434ff78242c9195f002705982fa7c9328
BLAKE2b-256 checksum
How to use checksums
c7b35f296ab97a6f10d8234638129482fdd15c195dfaf5456786614eb0ed8e32
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL smappy_smlm-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 434.1 kB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1ac52981978a8df71f627e886b7d7b800bb27a4fab2251b63cd5b5fc550a0685
BLAKE2b-256 checksum
How to use checksums
fc6e1718302e109113d9aef3aa690ce5677cd9c12061b86cfb8e658b128aaaf6
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL smappy_smlm-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Size 360.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f0fa819b06328e022bf7ff68d2a5716829856ce76384c81707663e7a89d5debc
BLAKE2b-256 checksum
How to use checksums
abeb5b25436703038ed3970f55c0f4caa56153a7b04ca62097456682eb58c2ea
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl

Download URL smappy_smlm-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl
Size 372.4 kB
Tags CPython 3.11 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
0c4bf2ab54488dac275eaadf0d82a6b7d6407a836db683ce9e56bfaec68335ac
BLAKE2b-256 checksum
How to use checksums
84b5c3440f9b192b3ceda21ff334639f2a9df18881dcc9fbc1ce1a76eacd6872
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp310-cp310-win_amd64.whl

Download URL smappy_smlm-0.1.0-cp310-cp310-win_amd64.whl
Size 577.6 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
953283ae3e23ac4afedcec774ad44d7b7289ab0213c103ece81fee8bdc9fe6ef
BLAKE2b-256 checksum
How to use checksums
85be2f3836ab9deafc84ded5138a7faedd8248adf1c7a393d085fba4baa6c3fc
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL smappy_smlm-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 430.9 kB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0c5126c90230c34c5a9464b400b4fe7dac356f0cc46b673afefc83a98c516e5d
BLAKE2b-256 checksum
How to use checksums
0a2ce99709346d5171389f55da71d74da2e6d88b2ed494479e6ed2b7cdca2f71
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL smappy_smlm-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Size 356.9 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7b98f59cef5bac3276b50faba777bd7379739b0d374f1f9dedc8514deb555d42
BLAKE2b-256 checksum
How to use checksums
85e47780490f9e81484b054fe968ba3fe32f950cf55f46fca75379ebe8867a27
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl

Download URL smappy_smlm-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl
Size 368.4 kB
Tags CPython 3.10 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
15e946a1ee24c80b99b77da5cd1e563955680ebecb836006924cd39a1568d597
BLAKE2b-256 checksum
How to use checksums
0c31bae35e29c56fc96144b435b82b6026097986a6d57282f34d938c2f7de9c5
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp39-cp39-win_amd64.whl

Download URL smappy_smlm-0.1.0-cp39-cp39-win_amd64.whl
Size 578.8 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
e694ebca72c752fef454d862ff0c9309b227823a8e0750144af3a8affc0bbdce
BLAKE2b-256 checksum
How to use checksums
f28eed88cf1c51c2d0beecf874b8c40798f3be5189c75da3f3e112c5895aa9bb
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL smappy_smlm-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 431.5 kB
Tags CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0a841758466c8e3ef9a0f898797045a554af1e0165ce8d37d64f7ef1da5dfceb
BLAKE2b-256 checksum
How to use checksums
4e179120a0ca84f14c0923ab9696d11b0e70d3d556bb8a97ad39671790eb3d3e
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp39-cp39-macosx_11_0_arm64.whl

Download URL smappy_smlm-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
Size 357.2 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a688b9d42a72e8b7b5cced5f58a2c293e605033b35e10fa21357a94a54c7e25d
BLAKE2b-256 checksum
How to use checksums
afc08b7d083cdd788ab23072ae6372bccb4e815e9ede4a606701e95bdc5a4c86
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 Sep 1, 2026.

Transparency log

Release files / smappy_smlm-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl

Download URL smappy_smlm-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl
Size 368.6 kB
Tags CPython 3.9 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
dd1de693eaafec27b5361b9cbcaac3fadd026dfcb045eb51d38e394deaa208c4
BLAKE2b-256 checksum
How to use checksums
cccbe513831fed0d39acd540249782faa7e9fef60b1f8aaf216d873c93433a9f
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 Sep 1, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.1

21 release files

0.4.0

21 release files

0.2.0

21 release files

This release

0.1.0 This release

21 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