Development and exploration#

CryoSwath production functions sometimes expose opt-in diagnostic hooks. These hooks are meant for development, improvement, exploration, introspection, validation, and, when something behaves unexpectedly, debugging.

The hook pattern keeps the numerical code quiet by default. Core routines do not import plotting libraries or external workflow helpers. Instead, callers can pass a small callback when they want to inspect intermediate state:

events = []

def capture_event(name, payload):
    events.append((name, payload))

filled = cryoswath.misc.interpolate_hypsometrically(
    ds,
    "_median",
    "_iqr",
    diagnostic_hook=capture_event,
)

The callback receives a stable event name and a payload with the objects that were already computed at that stage. For example, hypsometric interpolation can emit events such as hypsometry.model_preview and hypsometry.fit_fill_mask. Plotting helpers in cryoswath.test_plots.hypsometry can turn those payloads into quick-look figures.

Lab environment#

For interactive exploration with the optional snippets helpers, use the Pixi lab environment:

pixi install -e lab
pixi shell -e lab

The environment adds an IPython kernel and the snippets package. It does not install a notebook server; open notebooks from your editor or a Jupyter frontend of your choice.

If you manage environments with conda or mamba, create the environment there and install the lab extra with pip:

mamba create -n cryoswath-lab python=3.12
mamba activate cryoswath-lab
pip install "cryoswath[lab]"

Writing artifacts#

The optional snippets.debugging.Diagnostics helper is useful in external scripts and exploratory notebooks when you want selected plots or reports written to disk:

from snippets.debugging import Diagnostics
from cryoswath.test_plots import hypsometry

diagnostics = Diagnostics(
    enabled=True,
    outdir="debug/hypsometry",
    only={"hypsometry.fit_fill_mask"},
)

def write_diagnostic(name, payload):
    def write(path):
        result = hypsometry.plot_event(name, payload)
        fig = result if hasattr(result, "savefig") else result.figure
        fig.savefig(path / "plot.png", dpi=150, bbox_inches="tight")

    diagnostics.emit(name, write)

CryoSwath itself does not depend on snippets. This keeps production workflows dependency-light while still making rich introspection available to home-grown workflows.

Tutorial#

The packaged notebook tutorial__diagnostic_hooks.ipynb walks through the same workflow with synthetic data. Copy it into a project with:

cryoswath get-tutorials

Then open tutorials/tutorial__diagnostic_hooks.ipynb with the lab kernel or with any environment that has CryoSwath installed.