Skip to content

Athenaeum v0.2.0-beta.9

Beta 9 adds a chart view to the Analysis tab and rewrites how the FWHM auto-suggestion handles units. No schema migration, no settings cleanup needed.

The old fullscreen “Charts” modal is gone. In its place, the Analysis tab has a Table | Chart toggle in the toolbar that swaps the frame list for a configurable grid of small-multiple scatter charts. Both views share the same displayedFrames (filtered by the left tree), the same selection set, and the same rejection thresholds — so you can lasso a cluster of bad frames on the chart and immediately send them to Blink or Blackhole from the existing toolbar.

What’s in the chart view:

  • Configurable metric grid. Pick from FWHM, HFR, eccentricity, SNR (median + frame), SNR weight, PSF signal, stars detected, background, noise, trail R², and Moffat β. The choice is persisted per-user and survives across sessions and frame sets.
  • Drag to zoom the time axis — and zooming any one chart syncs the X-range across every chart in the grid. The drag overlay clamps to the plot area, so you can’t accidentally select past the chart edges.
  • Shift+drag for box-brush selection with smart-toggle semantics: if any enclosed point is unselected, the brush selects them all; if all are already selected, the brush deselects.
  • Click a point to toggle that single frame. Selection highlights cross-fade across all charts in the grid because they all read the same selection set.
  • Threshold lines. When you set a rejection threshold (FWHM, eccentricity, frame SNR, SNR weight) the corresponding chart cell draws a dashed red reference line at the cut-off, with a or arrow indicating which side gets rejected. Points that fail the threshold render in red regardless of selection state.
  • Persistent Reset Zoom button next to the Metrics chips, disabled when no chart is zoomed, single-click to reset every chart at once.
  • Hover tooltips render through a portal so they can never trigger scrollbars on a parent container — earlier prototypes had the tooltip bouncing the whole grid when a dot near an edge was hovered.

The Table view, the rejection bar, the px ↔ arcsec toggle, the CSV export, and the Analyze / Re-Analyze buttons all keep working unchanged.

When a frame set finishes analysis, Athenaeum auto-fills the FWHM rejection threshold with a suggested value derived from the data. That feature has had a steady stream of unit-handling bugs since the px ↔ arcsec toggle and the per-user “Default FWHM unit” setting landed. Beta 9 rewrites it with a single principle: all internal math is in pixels; convert only at the input/output boundary. The result is fewer moving parts and no more inconsistent values between the initial auto-fill and the Reset button.

What the auto-suggestion actually computes

Section titled “What the auto-suggestion actually computes”

The threshold is median + 3 × max(MAD, 0.1 × median) over the frames currently displayed. MAD is the median absolute deviation from the median — a robust outlier detector that’s not pulled around by a few wildly bad frames. The 0.1 × median floor keeps very tight distributions (good seeing, well-tracked rig) from collapsing the threshold onto the median, which would reject roughly half of the frames. In practice this gives a sensible “reject the worst tail” cut-off for both wide-field undersampled rigs and finely-sampled ones.

The math runs purely in pixel-space. Whatever unit the toolbar is currently displaying — px or arcsec — is applied as a single multiplication when the value is written into the threshold field. So the value Reset shows is now guaranteed to match the value the initial auto-fill wrote.

In dev builds, toggling the px ↔ arcsec button on a frame set with a real plate scale produced a value that was off by exactly plateScale² — for an M42 set with plate scale 1.7312 arcsec/px, toggling away from a 5.85” threshold gave 1.95 px instead of the correct 3.38 px. The root cause was a React StrictMode footgun: the toggle handler called setThresholds from inside the setUseArcsec state updater. StrictMode invokes state updaters twice in development to detect impure code, so setThresholds got queued twice; the second queued updater saw the result of the first and divided by plateScale a second time. Lifting the setThresholds call out of the nested updater fixes it. (Production builds didn’t double-invoke and so didn’t hit this — but the dev experience was confusing enough that users couldn’t trust the displayed values.)

Saved Default FWHM is now stored with its unit

Section titled “Saved Default FWHM is now stored with its unit”

The saved Default FWHM value (Settings → Default Rejection Thresholds) is now persisted together with the unit it was entered in ({fwhm: "5.5", fwhm_unit: "arcsec"}). Previously the value and the “FWHM unit” preference were two independent settings, so changing the unit preference silently reinterpreted any saved number. The new shape leaves no ambiguity, and “Load defaults” converts the saved value to whatever unit the toolbar is currently displaying (instead of yanking the px/” toggle to match the saved unit). Existing legacy saves migrate transparently on the next save.

Beta builds are available for Windows, macOS (Apple Silicon + Intel), and Linux. Head to the Download page and grab the platform you need.

The “beta” symlink at https://artfrom.space/builds/beta/ always points to the latest beta build; use the version-specific link https://artfrom.space/builds/v0.2.0-beta.9/ if you want this exact release pinned.