Skip to content

Changelog

All notable changes to radiens-qc will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

no unreleased changes

[0.0.3] - 2026-10-12

Requires radiens-core 0.1.0 and a recent Radiens server.

Added

  • Figure functions, each returning one Figure: plot_site_maps, plot_channel_profiles, plot_metric_over_time, plot_signal_integrity, and plot_stability for a QualityReport; plot_raw_traces and plot_raw_spectra for raw signal; plot_event_raster for threshold crossings; plot_unit_footprints, plot_unit_yield, plot_unit_raster, and plot_unit_inventory for sorted units.
  • A figure registry: FIGURES, select(), fetch_figure_sources(), render(), and save_figures(), with RenderOptions. A figure whose source is not supplied is skipped, so the channel and recording levels can be drawn from a saved report directory.
  • fetch_raw_signal(): wideband and filtered excerpts at 10/50/90% of the recording, plus whole-file spectra. Recordings under 10 s raise ValueError.
  • fetch_events(): every threshold crossing from a detect-only spikes fileset the caller names.
  • fetch_units() and fetch_unit_waveforms(): the units from a sorted fileset the caller names, with SortedUnits.amplitudes_uv() measured from the mean waveforms.
  • check_crossings_fileset() and check_units_fileset() to validate a caller's fileset, and PER_CHANNEL_NEIGHBORS. The package never runs a sort itself.
  • compute_or_load_report(): loads a saved report when the dataset and detection match, or recomputes with force=True. report_cache_key() and cached_key() expose the key. window_sec, metrics, and channels are not in the key.
  • load_report(thresholds=...) regrades a saved report.
  • compute_report(channels=...): the ntv_idx values to analyze. Defaults to every channel.
  • QualityReport.noise_cutoff_uv(), ap_band_rms_uv(), crest_factor(), in_event_fraction(), depth_order(), and shank_ids().
  • event_mean_max_abs in DEFAULT_METRICS, and AMPLITUDE_METRIC.

Changed

  • Channels carry an integrity grade (ok/noisy/dead) and an events state (present/absent) instead of one SNR-driven quality tier. A channel with no detected events is no longer graded dead. Use integrity_counts() and event_counts() instead of quality_counts().
  • noisy flags a channel whose noise floor is an outlier against the rest of the probe. QualityThresholds replaces snr_good and snr_fair with noisy_mad_multiplier and noisy_scale_floor_frac, and gains ap_band_rms_max_uv.
  • compute_report() takes one detection=DetectionSettings(...) instead of dsp_params and event_threshold_sd, as do fetch_raw_signal(), fetch_events(), and fetch_figure_sources(). QualityReport.detection and RawSignal.detection record what was applied.
  • Renamed apply_kpi_preprocessing() to apply_detection_settings(), which returns what it applied; DEFAULT_EVENT_DSP to DEFAULT_DSP; and DEFAULT_EVENT_THRESHOLD_SD to DEFAULT_THRESHOLD_SD.
  • compute_report() selects the channels it analyzes on the datasource and leaves them selected. Previously the channel count depended on whatever was selected in the desktop app. It raises ValueError if the server returns a different channel set.
  • window_sec defaults to the dataset's native KPI packet duration instead of 10 s, and is rounded to a multiple of it. A trailing window under half width is dropped.
  • load_report() regrades the channel table instead of reading grades back from channels.csv.
  • save_report() writes the whole-recording readings to meta.json and no longer draws figures.
  • noise_scale_max_uv defaults to 20 µV instead of 15.

Removed

  • plot_report() and plot_report_panels(), and the figure, panels, and dpi arguments of save_report(). Use the individual figure functions or save_figures().
  • radiens_qc.compare.
  • screen_dataset(). Filter recordings before calling compute_report().
  • QualityReport.grade() and the grade key in meta.json.
  • QualityReport.rank_order and QualityReport.mean(). Use depth_order(), and summary_stats() for the mean.
  • SCHEMA_VERSION. load_report() no longer reads report directories from earlier versions.
  • time_series.csv. matrices.npz holds the same data.

Fixed

  • snr no longer depends on window_sec. It is now the mean event peak over the noise floor instead of the largest, so values are lower and a report may grade differently.

[0.0.2] - 2026-07-20

Fixed

  • documentation updates

[0.0.1] - 2026-07-20

First release.

Added

  • compute_report — screens a recording, applies read-time DSP, walks it in windows, and grades every channel. Accepts a local Path (linked idempotently) or an already-linked DatasetMetadata, so the package never needs to know where recordings are stored.
  • screen_dataset — cheap metadata checks (duration, placeholder probe, wall clock window) to skip junk recordings before paying for a KPI compute.
  • apply_kpi_preprocessing / resolve_dsp_params / amp_ports — read-time DSP configuration using radiens-native FlexDSPParams.
  • plot_report / plot_report_panels — pure figure builders returning matplotlib Figure objects.
  • save_report / load_report — the report-folder format, including schema_version and lossless matrices.npz.
  • radiens_qc.compare — cross-session comparison built from saved report folders (SessionSummary, ComparativeReport, load_session_summaries, plot_comparative_report, save_comparative_report).

Compatibility

  • load_report and load_session_summaries read pre-schema_version report folders, including ones that spell source as drive_path. Those load with empty matrices, which blanks the temporal panels rather than failing.