Show3DSlices#
Linked top and arbitrary-angle side cuts through a 3D volume. See the Show3DSlices tutorial.
Viewer UI#
Show3DSlices takes the shared show_title and show_scale_bar names at
construction; show_controls, controls_collapsed and show_crosshair are
synced traits set after construction, as the browser controls do. The
saved-state scale-bar trait is show_scale_bar. See
Viewer UI controls.
Reference#
- class quantem.widget.show3dslices.Show3DSlices(*args: t.Any, **kwargs: t.Any)#
Bases:
StateFileMixin,HtmlExportMixin,AnyWidgetLinked top-slice and oblique vertical-slice viewer for 3D volumes.
- Parameters:
data (array_like or Dataset3d) –
(slices, rows, cols)volume,(panel, slices, rows, cols)panels, or pages:(page, panel, slices, rows, cols), or(page, slices, rows, cols)together withpage_labels. ADataset3dsupplies title, sampling and units.title (str) – Title above the viewer.
panel_titles (sequence of str, optional) – One title per panel (or per panel slot for pages).
page_labels (sequence of str, optional) – One label per page. Page switching keeps the slice geometry, zoom and display settings so depths compare directly.
show_title (bool) – Show the title row.
cmap (str) – Colormap for every panel.
sampling (float or (slice, row, col), optional) – Voxel sampling for the scale bars, paired with
units.units (str or sequence of str, optional) – Unit of
sampling("A"or"nm"); one value applies to every axis. Angstrom when omitted.show_scale_bar (bool) – Draw calibrated scale bars when a sampling is known.
slice_stretch (float) – Display stretch of the depth axis, 1 to 50, for volumes with far fewer slices than lateral pixels.
panel_width_px (int) – Display width per panel in CSS pixels; 0 uses the frontend default.
show_fft (bool) – Show the power spectrum of the active plane.
fft_window (bool) – Hann-window each plane before its FFT to suppress edge streaks.
smooth (bool) – Bilinear interpolation when the canvas enlarges a slice. Default False paints every data pixel as a sharp block (nearest neighbour).
auto_contrast (bool) – Percentile contrast (
image_vmin_pcttoimage_vmax_pct); long-tailed phase histograms are crushed by the raw min/max. Applies only whilevminandvmaxare both None.vmin (float, optional) – Manual contrast limits, used exactly as given: setting either one turns Auto off for the display, so the window is never narrowed to percentiles.
vmax (float, optional) – Manual contrast limits, used exactly as given: setting either one turns Auto off for the display, so the window is never narrowed to percentiles.
image_vmin_pct (float) – Percentiles for the automatic contrast window.
image_vmax_pct (float) – Percentiles for the automatic contrast window.
slice_alignment ({"off", "auto", "manual"}) – Display-only global post-alignment.
"auto"estimates one row/col shift per slice from adjacent-slice registration; the raw volume is never modified.dim_labels (list of str, optional) – Names of axes 0, 1, 2; default
["slice", "row", "col"].offline (bool) – Pack the volume as uint8 against its global range (256 levels) for small standalone HTML, and print one line saying so;
Falsekeeps exact float32 in the browser.
Flatten the volume to
(panel, slices, rows, cols)float32 and send it with the display traits in one sync.- estimate_slice_alignment(*, panel: int | None = None, apply: bool = True, force: bool = False) dict#
Fit one global row/col display shift per slice for a panel.
See
alignment.estimate_global_slice_alignmentfor the method. The estimate is cached per panel so the Align toggle in the browser does not re-register the stack on every raw/aligned switch;forcerecomputes. Withapplythe slopes are written torow_shift_px_per_slice/col_shift_px_per_sliceandslice_alignmentbecomes"auto".
- reset_slice_alignment() Self#
Turn off post-alignment and discard the cached estimates.
- state_dict() dict#
JSON-serializable snapshot of every user-tunable trait (no pixels).
- load_state_dict(state: dict | str | Path) None#
Apply a
state_dictsnapshot, its envelope or asavefile onto this widget’s volume.Page topology comes from the data, so
n_pages/panels_per_pageare not part of the state and labels of the wrong length are dropped.vmin/vmaxare cleared first so either bound can land regardless of the current limits. A file of anotherschemaor an unknown key raises before anything is applied.
- free() None#
Release the volume and its synced bytes.
del widgetalone does not free memory: traitlets observers pin the widget’s refcount. Playback is stopped first so the browser’s animation loop tears down before the buffer it reads goes away. Idempotent.
- export_html(path: str | Path | None = None, *, title: str | None = None, encoding: str = 'full') Path#
Write a standalone HTML viewer that opens with no kernel and no network.
encoding="full"embeds the exact float32 volume;"uint8"packs it against the global range for a file about a quarter the size. The default path is the kernel cwd with the title, volume shape and encoding in the name.
Interactive controls#
Control |
Trait |
Expected effect |
|---|---|---|
Page slider / play |
|
Switches or plays comparable volumes while preserving the same slice geometry and view state |
Panel menu |
|
Selects one panel slot within the active page |
Crosshair drag |
|
Moves the cut position; all panels update together |
Oblique line drag |
|
Drag either endpoint to rotate/resize the side cut, or drag the line body to translate the whole cut freely in row/col while staying inside the top slice |
Oblique angle |
|
Rotates the oblique cut plane |
Colormap dropdown |
|
Recolors all panels |
Contrast min / max |
|
The display window, used exactly as given; while either is set, Auto is off and its switch is disabled |
Auto-contrast toggle |
|
Re-fits the 2/98 percentile range of the volume; only when |
Log-scale toggle |
|
Log intensity mapping |
Smooth toggle |
|
Off by default: each voxel of a slice is drawn as a sharp block (nearest neighbour). On: bilinear interpolation where the canvas enlarges a slice. Display only |
Slice alignment |
|
Open Advanced and enable Slice alignment. The first enable estimates one global row/col shift per slice automatically; later raw/aligned toggles reuse the cached estimate and aligned display volume. The sliders refine the cached result without modifying the raw volume. |
FFT toggle |
|
Panels show power spectra |
Z-stretch |
|
Depth axis scaled for anisotropic voxels |
Scale bar toggle |
|
Calibrated bar shows/hides |
Export button |
|
Writes a standalone HTML viewer (exact / quantized) |
Automatic slice alignment (quantem.widget.show3dslices.alignment) high-pass
filters adjacent reconstructed slices with a Gaussian sigma capped at 12
pixels, then refines each translation on a 20x local matrix-DFT grid. The 12-pixel scale is an empirical preprocessing setting,
not a physical microscope parameter. The subpixel method follows
Guizar-Sicairos, Thurman, and Fienup (2008), DOI 10.1364/OL.33.000156.
The resulting row/col trajectory is reduced to one global linear shift per
slice. This is reversible display post-processing; it does not add sample tilt
to the ptychographic forward model or modify the reconstructed volume.
Compare volumes with pages#
Pass a 4D stack plus page_labels when every page contains one volume. The
same top slice, side cut, oblique angle, zoom, contrast, and playback settings
remain active as the page changes:
# Shape: page, depth, rows, cols
w = Show3DSlices(
np.stack([raw_volume, aligned_volume]),
page_labels=["raw", "aligned"],
panel_titles=["object phase"],
)
Use a 5D array when each page has the same small panel set:
# Shape: page, panel, depth, rows, cols
w = Show3DSlices(
comparison_5d,
page_labels=["single-slice", "multislice"],
panel_titles=["object", "absolute error"],
)
Set page_idx to switch pages from Python. A 4D array without page_labels
is a multi-panel volume, as before.