Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@

<div class="wrap">
<section class="hero">
<p class="eyebrow">Version 5.1.1 — available now</p>
<p class="eyebrow">Version 5.2.0 — available now</p>

<div class="hero-head">
<img class="hero-logo" src="/assets/icon-512.png" alt="" width="512" height="512">
Expand All @@ -148,7 +148,7 @@ <h1 class="wordmark">mac<em>4D</em>STEM</h1>
<a class="get-btn" href="https://github.com/mac4DSTEM/mac4DSTEM/releases/latest/download/mac4DSTEM.dmg">
<span aria-hidden="true">↓</span> Download for macOS
</a>
<p class="get-meta">Version 5.1.1 · 17.7 MB · signed and notarized</p>
<p class="get-meta">Version 5.2.0 · 17.7 MB · signed and notarized</p>
</div>

<ul class="specs">
Expand Down Expand Up @@ -362,7 +362,7 @@ <h3>Version 5.1 complete</h3>
</li>
<li data-state="done">
<h3>Download</h3>
<p>Version 5.1.1 is <a href="https://github.com/mac4DSTEM/mac4DSTEM/releases/latest/download/mac4DSTEM.dmg">available as a signed, notarized disk image</a>. Open it and drag mac4DSTEM to your Applications folder — it launches without a security warning, and needs nothing else installed.</p>
<p>Version 5.2.0 is <a href="https://github.com/mac4DSTEM/mac4DSTEM/releases/latest/download/mac4DSTEM.dmg">available as a signed, notarized disk image</a>. Open it and drag mac4DSTEM to your Applications folder — it launches without a security warning, and needs nothing else installed.</p>
</li>
<li data-state="done">
<h3>Source release</h3>
Expand Down Expand Up @@ -418,7 +418,7 @@ <h2 id="contact-h">Enquiries, issue reports, and collaboration</h2>
"url": "https://mac4dstem.com/",
"applicationCategory": "ScientificApplication",
"operatingSystem": "macOS 26 or later, Apple silicon",
"softwareVersion": "5.1.1",
"softwareVersion": "5.2.0",
"downloadUrl": "https://github.com/mac4DSTEM/mac4DSTEM/releases/latest/download/mac4DSTEM.dmg",
"fileSize": "17.7 MB",
"license": "https://www.gnu.org/licenses/gpl-3.0.html",
Expand Down
4 changes: 2 additions & 2 deletions suite/benchmarks.html
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ <h4>Results</h4>
<p>Sizes: quantification small 8 x 8, typical 256 x 256 (3 elements), large 1024 x 1024; thickness small 8 x 8, typical 64 x 64 (2048 channels), large 256 x 256. <strong>Large: not measured yet</strong> (<code>large</code> in the size list adds it).</p>
<h4>Backend decision per function (CPU float64 reference, Metal float32 where size pays)</h4>
<div class="tablewrap"><table><thead><tr><th>function</th><th>decision</th><th>why</th></tr></thead><tbody><tr><td>quantification maps, all methods (the Python column converts to weight percent only; Swift returns both)</td><td>CPU only (parallel over pixels since 0.8.0)</td><td>9 to 40 ms for 65 536 pixels; per pixel the work is 10 to 500 ns of arithmetic, so a Metal dispatch pays only above about 1e6 pixels; the break-even is <strong>not measured</strong> (the large size is not measured yet). Not a work item until a large-size run shows a slow large image</td></tr><tr><td>t/lambda log ratio, fixed threshold</td><td>CPU only; <strong>slower than Python on the typical size</strong> (0.49x), first in <code>docs/parity.md</code> (known limits)</td><td>single-threaded scalar passes against NumPy&#x27;s vectorised axis sums</td></tr><tr><td>t/lambda log ratio, estimated threshold</td><td>CPU only</td><td>5x faster than Python at the typical size (Python&#x27;s per-pixel Savitzky-Golay search dominates)</td></tr><tr><td>EDX line fit, auto ID, EELS background fit, edge quantification</td><td>not benchmarked in 0.8.0</td><td>need a Velox spectrum image or a planted EELS image on both sides; listed in <code>docs/parity.md</code> (known limits)</td></tr></tbody></table></div>
<h2 id="cubokit">CuboKit 0.10.0</h2>
<p><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/blob/0.10.0/docs/benchmarks.md">Full file and method</a></p>
<h2 id="cubokit">CuboKit 0.11.0</h2>
<p><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/blob/0.11.0/docs/benchmarks.md">Full file and method</a></p>
<p>Kit against py4DSTEM, same inputs, Float32 cubes, one run of <code>tools/benchmarks</code> on 2026-10-21. Harness: <code>Tests/CuboVirtualTests/BenchmarkHarness.swift</code> (Swift, built with <code>swift test -c release</code>, skipped unless <code>CUBOKIT_BENCH_DIR</code> is set) and <code>tools/benchmarks/bench.py</code> (the py4DSTEM side and the merge). Both read the same <code>.npy</code> cubes. Best of five after one warm-up; cells are best / median (spread = slowest - best) in milliseconds; &quot;CPU vs py4DSTEM&quot; is py4DSTEM&#x27;s best divided by the kit CPU&#x27;s best (above 1 the kit is faster). The cubes are held in memory (<code>MemoryCube</code>; <code>DataCube(data=ndarray)</code>). The Metal columns copy each tile to the GPU on every call; the <code>_resident</code> rows hold the cube in a <code>ResidentCube</code> (one Metal buffer) first.</p>
<p>Sizes (scan rows x columns x detector rows x columns): small 32x32x32x32 (1.0 M values), mid 64x64x32x32 (4.2 M), typical 100x100x64x64 (41.9 M, 168 MB). The large size (330x330x64x64, 1.8 GB) and the Bragg, strain, DPC, parallax and ptychography functions are not measured yet. The machine was shared during the run (load average 5 to 11 from other builds), so the spreads are wider than on a quiet Mac.</p>
<p>Re-run from a fresh clone of the kit, on a quiet Mac, one benchmark at a time (the typical cube is 168 MB on disk and in memory):</p>
Expand Down
4 changes: 2 additions & 2 deletions suite/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ <h1>The macEM suite</h1>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/ImagoKit">ImagoKit</a></td><td>Image numerics: FFT, profiles, filters, alignment, measurement, segmentation.</td><td>NumPy, SciPy, scikit-image</td><td>0.9.1</td><td>36 of 93</td><td><a class="u-link" href="https://mac4dstem.github.io/ImagoKit/documentation/">API</a></td></tr>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/DiffractoKit">DiffractoKit</a></td><td>Crystallography, diffraction geometry, ring and ellipse fits, indexing, orientation and ACOM.</td><td>pymatgen, py4DSTEM, orix</td><td>0.12.0</td><td>22 of 148</td><td><a class="u-link" href="https://mac4dstem.github.io/DiffractoKit/documentation/">API</a></td></tr>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/SpectroKit">SpectroKit</a></td><td>EDX quantification and EELS thickness, background and edges.</td><td>HyperSpy, exSpy</td><td>0.13.2</td><td>58 of 100</td><td><a class="u-link" href="https://mac4dstem.github.io/SpectroKit/documentation/">API</a></td></tr>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit">CuboKit</a></td><td>The 4D-STEM library: virtual imaging, centre of mass, DPC, strain, Bragg disks, parallax, ptychography.</td><td>py4DSTEM</td><td>0.10.0</td><td>135 of 215</td><td><a class="u-link" href="https://mac4dstem.github.io/CuboKit/documentation/">API</a></td></tr>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit">CuboKit</a></td><td>The 4D-STEM library: virtual imaging, centre of mass, DPC, strain, Bragg disks, parallax, ptychography.</td><td>py4DSTEM</td><td>0.11.0</td><td>135 of 215</td><td><a class="u-link" href="https://mac4dstem.github.io/CuboKit/documentation/">API</a></td></tr>
<tr><td><a class="u-link" href="https://github.com/mac4DSTEM/SimulatoKit">SimulatoKit</a></td><td>Multislice TEM/STEM simulation: potentials, frozen phonons, scans, detectors, CTF.</td><td>abTEM</td><td>0.5.0</td><td>38 of 129</td><td><a class="u-link" href="https://mac4dstem.github.io/SimulatoKit/documentation/">API</a></td></tr>
</tbody></table></div>
<p>Beside the kits, <a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI">MacEMUI</a> 0.5.0 holds the apps' shared window, controls and Metal image view. It has no Python reference.</p>
<p>Beside the kits, <a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI">MacEMUI</a> 0.5.1 holds the apps' shared window, controls and Metal image view. It has no Python reference.</p>
<p>"Parity: present of rows" counts the functions of the reference package that the kit has and has tested against it; each kit's <code>docs/parity.md</code> lists every function with its state and tolerance. See <a class="u-link" href="/suite/benchmarks.html">benchmarks</a> and <a class="u-link" href="/suite/releases.html">releases</a>.</p>
<p>Apps: <a class="u-link" href="/">mac4DSTEM</a> (4D-STEM) and <a class="u-link" href="/mactem/">macTEM</a> (TEM images, spectroscopy and diffraction).</p>
</article>
Expand Down
4 changes: 2 additions & 2 deletions suite/releases.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ <h1>Releases</h1>
<tr><td>ImagoKit</td><td>0.9.1</td><td>2026-11-01</td><td><a class="u-link" href="https://github.com/mac4DSTEM/ImagoKit/releases/tag/0.9.1">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/ImagoKit/blob/0.9.1/CHANGELOG.md">changelog</a></td></tr>
<tr><td>DiffractoKit</td><td>0.12.0</td><td>2026-11-01</td><td><a class="u-link" href="https://github.com/mac4DSTEM/DiffractoKit/releases/tag/0.12.0">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/DiffractoKit/blob/0.12.0/CHANGELOG.md">changelog</a></td></tr>
<tr><td>SpectroKit</td><td>0.13.2</td><td>2026-11-01</td><td><a class="u-link" href="https://github.com/mac4DSTEM/SpectroKit/releases/tag/0.13.2">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/SpectroKit/blob/0.13.2/CHANGELOG.md">changelog</a></td></tr>
<tr><td>CuboKit</td><td>0.10.0</td><td>2026-11-01</td><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/releases/tag/0.10.0">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/blob/0.10.0/CHANGELOG.md">changelog</a></td></tr>
<tr><td>CuboKit</td><td>0.11.0</td><td>2026-11-05</td><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/releases/tag/0.11.0">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/CuboKit/blob/0.11.0/CHANGELOG.md">changelog</a></td></tr>
<tr><td>SimulatoKit</td><td>0.5.0</td><td>2026-10-31</td><td><a class="u-link" href="https://github.com/mac4DSTEM/SimulatoKit/releases/tag/0.5.0">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/SimulatoKit/blob/0.5.0/CHANGELOG.md">changelog</a></td></tr>
<tr><td>MacEMUI</td><td>0.5.0</td><td>2026-11-01</td><td><a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI/releases/tag/0.5.0">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI/blob/0.5.0/CHANGELOG.md">changelog</a></td></tr>
<tr><td>MacEMUI</td><td>0.5.1</td><td>2026-11-05</td><td><a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI/releases/tag/0.5.1">tag</a></td><td><a class="u-link" href="https://github.com/mac4DSTEM/MacEMUI/blob/0.5.1/CHANGELOG.md">changelog</a></td></tr>
</tbody></table></div>
<p>The apps: <a class="u-link" href="https://github.com/mac4DSTEM/mac4DSTEM/releases">mac4DSTEM releases</a> and <a class="u-link" href="https://github.com/mac4DSTEM/macTEM/releases">macTEM releases</a> on GitHub.</p>
</article>
Expand Down
7 changes: 6 additions & 1 deletion tools/check_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,12 @@ def check_releases():
for app, rel in APPS.items():
r = latest(app)
ver = r["tag_name"].lstrip("v")
dmg = next(a for a in r["assets"] if a["name"] == f"{app}.dmg")
dmg = next((a for a in r["assets"] if a["name"] == f"{app}.dmg"), None)
if dmg is None:
errors.append(f"{rel}: the latest {app} release {r['tag_name']} has no {app}.dmg, so the page's "
f"releases/latest/download/{app}.dmg link is a 404: build it with tools/release.sh "
"on that tag and attach it")
continue
size = f"{dmg['size'] / 1e6:.1f} MB"
text = (ROOT / rel).read_text()
for stated in sorted(set(re.findall(r"Version (\d+\.\d+\.\d+)", text))):
Expand Down
Loading