masked_data_RG_80nM, Rat heart, ventricular fibrillation
128 × 80 px, 3,800 frames, 1 kHz, 112.5 µm/px, deposit checks: unit range, non integer, nan mask partial, temporal smoothing, spatial smoothing
Run 82fe7343, 2026-10-27 23:46 UTC, protocol parameters v1, code 905d5be (uncommitted changes), 9 workers, signature 3b8cc8b6, run view 82fe7343, 9 signatures of this recording
Not reportable: range check not passed, code uncommitted changes, parameters unsigned, reviewer sign-off pending; 15 rules open
Properties
| Deposit | 10.5281/zenodo.18319102, https://zenodo.org/records/18319102 |
| Publication | 10.1093/cvr/cvaa141 |
| Licence | CC-BY-4.0 (as stated: cc-by-4.0) |
| Authors | Verstraeten, Bjorn; Lootens, Sebastiaan |
| File | public/masked_data_RG_80nM.mat, mat, 293,204,250 bytes |
| sha256 | 9e30977de373f78d1b5d236bd100e46bb79c72152d3a7516b9c03c4849391076 |
| Frame rate | 1000 Hz, deposit metadata 10.5281/zenodo.18319102 |
| Pixel size | 112.5 µm, deposit metadata 10.5281/zenodo.18319102, midpoint of the stated 100-125 um; conduction velocities carry a +/-11% range from this alone |
| Polarity | upright, measured |
| Segments source | developer (no comparison defined) |
| Protocol | Rat whole heart optical mapping (Zenodo 18319102), rat, whole heart; parameters v1 set by developer (not a domain scientist): version 1: the library defaults as of commit 363372b; provisional, see protocol_params.py |
| Run | 82fe7343-d416-4536-b39e-19b7eca30443 |
| Started, finished | 2026-10-27 23:46 UTC, 2026-10-27 23:48 UTC |
| Code | 905d5bebbb29da7ad46cd5045db14330695037c3 (uncommitted changes) |
| Workers | 9 |
| Steps | load, deposit_checks, baseline_correct, polarity, spatial_filter(phase only), hilbert_phase, phase_singularities, track_and_pair, beats_apd_cv, sensitivity, render |
| Signature | 3b8cc8b6-ef45-4633-9365-0217c5c54720, 2026-10-27 23:48 UTC |
| Movie | runs/82fe7343-d416-4536-b39e-19b7eca30443/movie.mp4 |
| Lossless frames | runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/voltage.npy, runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/phase.npy, runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/maps.npz; shape 3400 × 128 × 80, <f4 |
Parameters
% Rat whole heart optical mapping (Zenodo 18319102), v1, read-only % set by developer (not a domain scientist); provisional, REVIEW_NEEDED 16 baseline_frames = 121; % >= 2 x slowest cycle (26, images): ok pad_frames = 200; % each side, outside the window spatial_sigma = 1.0; % px, Gaussian, phase only spatial_truncate = 4.0; % kernel radius, sigma lowpass = []; % none polarity = 1; % measured, skew of dV/dt rotor_threshold = 0.9; % turns, |winding| per plaquette rotor_erode_px = 3; % px from tissue edge ignored link_px = 4.0; % tracking, max step per frame max_gap = 5; % frames a track may vanish min_cycles = 1.0; % own rotations, min_frames = 25 pair_dist_px = 3.0; % opposite-charge pairing paired_frac = 0.5; % max paired fraction of a track render_step = 4; % movie only
Segments
| Segment | Defined | Analysed | Cycle, frames | Expected Rotors | Bounded By |
|---|---|---|---|---|---|
| Ventricular fibrillation (whole recording) | 0–3,800 | 200–3,600 | 26 (86% of pixels) | not stated | recording start → recording end |
Frames at 3,800 total, 1.0 ms per frame. Cycle from the MAP channel of the DAQ log (median interval) when one exists, else from per-pixel dominant frequency. Boundaries, expectations and the segment design are provisional (developer (no comparison defined)).
Metrics
| Metric | Unit | Ventricular fibrillation (whole recording) | Physiological Range |
|---|---|---|---|
| Rhythm | |||
| Dominant frequency | Hz | 40.294 | none cited |
| Rotors | |||
| Persistent rotors | count | 204–464 | none cited |
| Max concurrent persistent rotors | count | 9–21 | none cited |
| Frames with a singularity | fraction | 1.000 | none cited |
| Beats, where a global rhythm exists | |||
| Beats | count | 0 | none cited |
| Global amplitude ratio | ratio | 0.28 | gate ≥ 0.30 provisional |
| APD50 | ms | no global beat | none cited |
| APD90 | ms | no global beat | none cited |
| Conduction velocity | cm/s | no global beat | none cited |
Values at the run setting. Red: range across the sensitivity grid (12 baseline × sigma settings, 3 trackers) where the spread exceeds 25 % of the median; not reportable as a value. Beat metrics are not varied over the grid. Dominant frequency over the whole analysed window: 40.294 Hz. No global upstroke found (no beat-wise activation map, CV or APD for this segment).
| Criterion | Rule | Result |
|---|---|---|
| Design expectations | none stated for this recording's segments | no criterion to test; counts are descriptive provisional |
Report
The PDF carries the parameters as run, segments, metrics, criteria, reportable values, every provisional rule, the review items, the opening frame as camera, voltage and phase with the parameter footer, and the provenance block. The JSON carries the same plus the full stored metrics, sensitivity and critic records.
Methods
Recording Rat heart, ventricular fibrillation (RG 80 nM) (doi:10.5281/zenodo.18319102; 128x80 px, 3800 frames, 1000 Hz) was analysed over frames 200-3600. Deposit shows signs of prior processing (provisional): unit range, non integer, nan mask partial, temporal smoothing, spatial smoothing. Each pixel was baseline-corrected by subtracting a 121-frame centered moving average; NaN pixels were set to zero. Dye polarity (upright) was taken from the sign of the median per-pixel skew of dV/dt. For phase only, each frame was spatially filtered with a Gaussian (sigma 1.0 px, truncated at 4.0 sigma); no temporal low-pass was applied. Phase was the angle of the Hilbert transform with 200 frames of padding on each side. Phase singularities were plaquettes with |winding| > 0.9 turns at least 3 px inside the tissue edge; they were tracked across frames (same charge, <= 4.0 px per frame, gaps <= 5 frames), and a persistent rotor was a track lasting >= 25 frames (1 cycle(s) of the fastest segment) within 3.0 px of an opposite-charge singularity in no more than 50% of its frames. Sensitivity: baseline 150, 75, 38, 121 frames x sigma 0.5, 1.0, 2.0 px, and tracker variants. All thresholds and criteria are provisional pending review by a domain scientist.
Reportable values
| Metric | Segment | Value | Unit | Status |
|---|---|---|---|---|
| persistent rotor tracks | all | 204–464 | count | unstable, not reportable |
| dominant freq (Hz) | whole recording | 40.29 | Hz | no cited range |
| persistent rotors | whole recording | 204–464 | count | unstable, not reportable |
| singularity frames fraction | whole recording | 1 | fraction of frames | no cited range |
| persistent rotor count max | whole recording | 9–21 | count | unstable, not reportable |
physiology_ok: not decided (no cited range passed or failed); send back: False. Verdict: this signature has no physiology-range pass/fail verdict because the checked stable metrics have no cited ranges, and the provisional ranges, stability threshold and criteria are provisional. Reportable as descriptive outputs are singularity_frames_frac at 1.0 fraction of frames and dominant_freq_hz at 40.294 Hz; the persistent-rotor counts are unstable and not reportable as single values, with whole_recording.persistent_rotors and persistent_rotor_tracks spanning 204.0–464.0 and whole_recording.persistent_rotor_count_max spanning 9.0–21.0 across settings. Persistent-rotor interpretation needs methods review because a cited analysis of the same rat deposit warns that naive phase-singularity detections may include false positives at conduction blocks (DOI 10.1371/journal.pcbi.1013963); additionally, the strict/default/loose trackers found 250/303/450 counts, and the recording is preprocessed rather than raw camera data, with transformed measured polarity and preprocessing-dependent SNR noted by inspection.
Provisional rules
| Rule, Location | Description | Expert | Status |
|---|---|---|---|
| protocol_parameter_set worker/voltage/protocol_params.py (developer_defaults, set_params) | Each protocol's fixed, versioned analysis parameters (version 1 = developer defaults); no run or agent may deviate | optical mapping analyst | provisional |
| baseline_window_rule worker/voltage/baseline_rule.py (FACTOR, evaluate) | A run proceeds only if the protocol's baseline window is >= 2x the slowest segment's cycle, the cycle from the MAP channel when a DAQ log exists, else from per-pixel dominant frequency on linearly detrended pixels; otherwise the run is held by code | optical mapping analyst | provisional |
| filter_defaults worker/voltage/preprocess.py (Params) | Default baseline window (frames) and spatial Gaussian sigma/truncate for phase | optical mapping analyst (cardiac electrophysiology) | provisional |
| tissue_mask worker/voltage/io.py (tissue_mask) | Tissue = not NaN in frame 0 and nonzero temporal std | optical mapping analyst | provisional |
| polarity worker/voltage/preprocess.py (polarity) | Dye polarity from sign of median per-pixel skew of dV/dt | optical mapping analyst / voltage dye chemist | provisional |
| singularity_detection worker/voltage/preprocess.py (Params.rotor_threshold, rotor_erode_px) | Phase singularity = |winding| > threshold turns, >= erode px from tissue edge | computational cardiac electrophysiologist (phase mapping) | provisional |
| rotor_persistence worker/voltage/rotors.py (TrackParams) | Track linking distance/gap and minimum lifetime for a persistent rotor | computational cardiac electrophysiologist (phase mapping) | provisional |
| chirality_pairing worker/voltage/rotors.py (TrackParams.pair_dist_px, paired_frac) | Opposite-charge singularities within pair distance are a pair; tracks paired most of their life are excluded from rotors | computational cardiac electrophysiologist (phase mapping) | provisional |
| sensitivity_grid worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels) | Filter levels tested: spatial sigma and baseline window values | optical mapping analyst | provisional |
| analysis_window worker/voltage/runs.py (default_window) | Frames analysed: whole recording minus one filter pad at each end (unless the plan narrows it) | cardiac electrophysiologist familiar with the dataset | provisional |
| prior_processing_flags worker/voltage/inspect.py (prior_processing) | Thresholds for flagging depositor processing (normalization, masking, temporal/spatial smoothing) | imaging scientist (camera acquisition and noise) | provisional |
| physiology_reference_rates worker/voltage/physiology.py (RANGES, TOLERANCE_FRAC) | Cited physiological ranges (single-study values widened by a 25% tolerance), applied to segments by their expected rhythm; used by the critic and for frame-rate sanity checks | cardiac electrophysiologist per species | provisional |
| stability_rule worker/agents/critic.py (STABLE_FRAC, stability) | A metric is reportable only if its spread across all sensitivity settings is <= 25% of its median (zero spread when all values are 0); otherwise 'unstable, not reportable' | biostatistician + optical mapping analyst | provisional |
| persistence_threshold_variants worker/agents/critic.py (persistence_variants) | The persistent-rotor rule is run at two lifetimes, one measured cycle of the fastest segment and the paper's cited rotation period; both verdicts stored, disagreement flagged | computational cardiac electrophysiologist (phase mapping) | provisional |
| persistent_rotor_criterion worker/voltage/sensitivity.py (MIN_ROTORS_PRESENT, MAX_ROTORS_ABSENT) | Persistent-rotor finding holds if every 'present' segment has >= 1 persistent rotor and every 'absent' segment has none, at every setting | cardiac electrophysiologist | provisional |
Review items
| Topic | Detail | Severity | Reviewer |
|---|---|---|---|
| unstable:whole_recording.persistent_rotors | The persistent-rotor count varies over 204.0–464.0 across the filter grid and tracker variants, exceeding the provisional stability threshold and making the single count not reportable. | warn | domain scientist / methods reviewer |
| unstable:whole_recording.persistent_rotor_count_max | The maximum simultaneous persistent-rotor count varies over 9.0–21.0 across the filter grid and tracker variants, exceeding the provisional stability threshold and making the single count not reportable. | warn | domain scientist / methods reviewer |
| unstable:persistent_rotor_tracks | The persistent-rotor track count varies over 204.0–464.0 across the filter grid and tracker variants, exceeding the provisional stability threshold and making the single track count not reportable. | warn | domain scientist / methods reviewer |
| preprocessed deposit | The deposit is not raw camera data and is documented as background-subtracted, spatially binned, low-pass filtered, drift-removed, and normalized; analyses requiring raw fluorescence/counts or unfiltered noise statistics would be misleading. | warn | data provenance reviewer |
| polarity transformed relative to dye | RH237 normally dims on depolarization, but measured polarity is non-inverted with 7/7 blocks agreeing; using measured polarity for orientation should avoid activation-analysis errors, but this transformation should be documented. | warn | methods reviewer |
| SNR depends on preprocessing | Median SNR is high, but documented temporal filtering and detected temporal smoothing can inflate SNR by reducing apparent frame-to-frame noise. | info | methods reviewer |
| reference thresholds provisional | No frame-rate inference was needed because the deposit states 1 kHz, but automated processing flags and provisional rhythm/reference-rate tools are not yet domain-scientist reviewed. | info | domain scientist |
| naive phase singularity false positives | A cited analysis of the same rat deposit reports that naive phase-singularity approaches can create spurious rotational-driver detections at functional conduction blocks, so rotor counts and tracks should be interpreted cautiously. | warn | domain scientist / methods reviewer |
| tracker sensitivity | Strict, default, and loose trackers find 250, 303, and 450 persistent rotors respectively; the rule verdicts agree, but the count sensitivity reinforces that the rotor counts should not be reported as single values. | warn | methods reviewer |
Data and code availability
| Recording | 10.5281/zenodo.18319102, CC-BY-4.0, Verstraeten, Bjorn; Lootens, Sebastiaan |
| Publication | 10.1093/cvr/cvaa141 |
| Analysis code | 905d5bebbb29da7ad46cd5045db14330695037c3 (uncommitted changes) |
| Stored arrays | runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/voltage.npy, runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/phase.npy, runs/82fe7343-d416-4536-b39e-19b7eca30443/frames/maps.npz |