Skip to content

v0.8.0

Choose a tag to compare

@physwkim physwkim released this 29 Oct 02:57
· 33 commits to main since this release

Changed

  • tomoxide-gui now depends on rsplot / rsdm =0.5.5 (was =0.5.2).
    rsdm 0.5.5 builds against epics-rs 0.24 — the same version as the GUI's
    live-test epics-pva-rs dev-dependency — so the dependency tree unifies on
    one epics-pva-rs copy again (0.7.0 carried a 0.21 + 0.24 pair). rsplot moves
    in lockstep because rsdm 0.5.5 requires rsplot ^0.5.5; the jump also picks
    up rsplot 0.5.3's VolumeRaycaster rendering fixes (thickness cue,
    faint-voxel hue) for the XANES 3-D view.
  • Every tilt↔phi conversion goes through geometry::lamino_phi /
    lamino_tilt_deg.
    The CPU lamino path spelled it d/180·π, which differs
    by 1 ULP from d·π/180 at 298 of 1801 tenth-degree tilts; it now takes the
    latter, as the CLI, GUI and CUDA sites already did.

Added

  • tomoxide::align::PreppedStack — the one alignment driver. Loads and
    preps the stack once, then runs the rings estimate, the tilt-flow estimate,
    the centre probe sweep and the tilt scan on it (align::grid builds the
    sweep candidates). tomoxide align and the GUI each carried their own copy;
    both now drive this one.
  • recon::tilt_flow::estimate_tilt_flow — the laminography tilt with no
    reconstruction.
    Fits the vertical flow between projections a few steps apart
    to a plane whose slope is the tilt and whose zero is the axis column. On the
    261003 step scan (bin 2, 20° nominal) it reads 19.40 ± 1.46°, every pair
    matching the Python original it ports.
  • recon::center::register_shift, find_center_rings_from_mean,
    focus_by_z.
    register_shift is the phase-correlation registration
    find_center_pc runs, exposed for the 0°-vs-360° drift check.
    find_center_rings_from_mean runs the rings estimate on a mean projection
    already in hand or on a band of its rows; find_center_rings delegates to it.
    focus_by_z is the one bulk slice_focus scorer, which the tilt scan and
    the centre sweep now share.
  • Geometry::valid_fov — per slice, the radius every projection saw. Off
    the middle of a laminography volume a voxel leaves the detector for part of
    the orbit, and the slice there is no longer the sample's.
  • prep_band and PrepOptions::row_separable; Config::stripe_method /
    phase_method.
    prep_band preps a detector-row band as the whole stack is
    prepped, widening the read by the phase kernel's margin. row_separable says
    whether a prep may be run chunk by chunk. The two Config methods are the one
    method-name parser for the CLI and the GUI, so the GUI now accepts every case
    and the vo_all / vo_sort spellings the CLI did.

Fixed

  • find_center_rings and find_center_sift read half a pixel right. Both
    register an image against its left–right flip, which mirrors about column
    (n − 1)/2, but converted the shift about n/2. They now use (n − 1)/2,
    the axis find_center_pc and find_center_vo already use. A synthetic
    bullseye now reads its own column (was +0.50); the aligned pouch scan reads
    397.00 against a known 396 (was 397.50). tomocupy's SIFT formula n//2 − shift/2 carries the same half pixel on even widths and is not copied.
  • Fourier laminography (recon::lamino, CUDA Fourierrec) came out flipped
    in y
    against Linerec, FBP and the volume it was projected from. The USFFT
    divker kept tomocupy's n1−ty−1 row, which matches tomocupy's own y-flipped
    linerec; tomoxide's linerec is not flipped. The row is now ty, so
    lamino_project at zero tilt equals the parallel projection and Fourierrec
    volumes are the y-flip of earlier ones and of tomocupy's.
  • Fourier laminography filtered its projections with its own ramp, a plain
    linear |f| on a 2·detw edge pad, while tomocupy's LamFourierRec uses its
    FBP filter: the _wint quadrature ramp on 4·detw. Every backend now builds
    the lamino filter from make_fbp_filter (RampShape::Wint), and Pearson
    against tomocupy on the 261003 scan (parzen) rose from 0.9975 to 0.99996
    8×-binned and from 0.99933 to 0.999998 2×-binned. --filter none is now no
    filter, as for every other method, rather than the bare ramp.
  • tomoxide recon with phase retrieval took the row-chunked paths, the
    CUDA/wgpu streaming pipeline and the multi-GPU shard, which refuse phase
    retrieval because a 2D phase filter couples rows. A plan that is not
    row_separable now takes the whole-volume path, and recon_steps refuses it
    as it does chain and --lamino_angle.
  • --start_row bands truncated the Paganin kernel at their edges. The band
    was read as bare rows z0..z1 before phase retrieval (relative error 0.25 at
    the edge rows of a 400..600 band); it now preps through prep_band.