Compare runs Export
Dataset Figures Sensitivity Report

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 e41d035d, 2026-10-27 23:43 UTC, protocol parameters v1, code 905d5be (uncommitted changes), None workers, signature 4f9dfa16, run view e41d035d, 9 signatures of this recording

Not reportable: range check not passed, code uncommitted changes, parameters unsigned, reviewer sign-off pending; 15 rules open

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

SegmentDefinedAnalysedCycle, framesExpected RotorsBounded By
Ventricular fibrillation (whole recording)0–3,800200–3,60026 (86% of pixels)not statedrecording 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

MetricUnitVentricular fibrillation (whole recording)Physiological Range
Rhythm
Dominant frequencyHz 40.294 none cited
Rotors
Persistent rotorscount 204–464 none cited
Max concurrent persistent rotorscount 9–21 none cited
Frames with a singularityfraction 1.000 none cited
Beats, where a global rhythm exists
Beatscount 0 none cited
Global amplitude ratioratio 0.28 gate ≥ 0.30 provisional
APD50ms no global beat none cited
APD90ms no global beat none cited
Conduction velocitycm/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).

CriterionRuleResult
Design expectationsnone stated for this recording's segmentsno 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

MetricSegmentValueUnitStatus
persistent rotor tracksall204–464countunstable, not reportable
dominant freq (Hz)whole recording40.29Hzno cited range
persistent rotorswhole recording204–464countunstable, not reportable
singularity frames fractionwhole recording1fraction of framesno cited range
persistent rotor count maxwhole recording9–21countunstable, not reportable

physiology_ok: not decided (no cited range passed or failed); send back: False. Verdict: descriptive reporting is allowed, but physiology_ok is not computable because there are no cited physiology ranges for the stable checked metrics; the stable reportable descriptors are singularity_frames_frac 1.0 and dominant_freq_hz 40.294 Hz, while persistent_rotors and persistent_rotor_tracks are unstable and should be reported only as 204.0–464.0, and persistent_rotor_count_max only as 9.0–21.0, not as single values. Tracker variants found 250, 303, and 450 persistent rotors, with the rule verdicts agreeing, and persistence-threshold variants were not applicable because there were no segment expectations. Review is needed for the preprocessed deposit, polarity transformed relative to dye, SNR dependence on preprocessing, provisional reference thresholds, and the risk of false phase singularities in this same rat deposit discussed in DOI 10.1371/journal.pcbi.1013963. The ranges, the stability threshold of 0.25 x median, and the criteria are provisional.

Provisional rules

Rule, LocationDescriptionExpertStatus
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 deviateoptical mapping analystprovisional
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 codeoptical mapping analystprovisional
filter_defaults
worker/voltage/preprocess.py (Params)
Default baseline window (frames) and spatial Gaussian sigma/truncate for phaseoptical mapping analyst (cardiac electrophysiology)provisional
tissue_mask
worker/voltage/io.py (tissue_mask)
Tissue = not NaN in frame 0 and nonzero temporal stdoptical mapping analystprovisional
polarity
worker/voltage/preprocess.py (polarity)
Dye polarity from sign of median per-pixel skew of dV/dtoptical mapping analyst / voltage dye chemistprovisional
singularity_detection
worker/voltage/preprocess.py (Params.rotor_threshold, rotor_erode_px)
Phase singularity = |winding| > threshold turns, >= erode px from tissue edgecomputational cardiac electrophysiologist (phase mapping)provisional
rotor_persistence
worker/voltage/rotors.py (TrackParams)
Track linking distance/gap and minimum lifetime for a persistent rotorcomputational 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 rotorscomputational cardiac electrophysiologist (phase mapping)provisional
sensitivity_grid
worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels)
Filter levels tested: spatial sigma and baseline window valuesoptical mapping analystprovisional
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 datasetprovisional
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 checkscardiac electrophysiologist per speciesprovisional
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 analystprovisional
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 flaggedcomputational 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 settingcardiac electrophysiologistprovisional

Review items

TopicDetailSeverityReviewer
unstable:whole_recording.persistent_rotorsThe count varied across filter and tracker settings from 204.0 to 464.0, exceeding the provisional stability criterion, so it should not be reported as a single run-setting value.warnanalysis/qc
unstable:whole_recording.persistent_rotor_count_maxThe maximum simultaneous count varied from 9.0 to 21.0 across filter and tracker settings, exceeding the provisional stability criterion, so it should not be reported as a single run-setting value.warnanalysis/qc
unstable:persistent_rotor_tracksPersistent-rotor tracks varied from 204.0 to 464.0 across filter and tracker settings, exceeding the provisional stability criterion, so track count should not be reported as a single value.warnanalysis/qc
preprocessed depositThe 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.warndata provenance
polarity transformed relative to dyeMeasured polarity is consistently non-inverted despite RH237 normally dimming on depolarization; orienting from measured polarity is acceptable, but the transformed sign should be documented.warndata provenance
SNR depends on preprocessingMedian SNR is high, but documented temporal filtering and detected temporal smoothing can inflate apparent SNR by reducing frame-to-frame noise.infodata provenance
reference thresholds provisionalThe frame rate was taken from the deposit at 1000 Hz, but automated processing flags and provisional rhythm/reference-rate tools should be treated as not yet domain-scientist reviewed.infomethodology
false phase singularitiesA context paper for the same rat deposit warns that naive phase-singularity approaches can produce spurious rotational drivers at conduction blocks, which is directly relevant to persistent-rotor counts and tracks.warndomain/scientific

Data and code availability

Recording10.5281/zenodo.18319102, CC-BY-4.0, Verstraeten, Bjorn; Lootens, Sebastiaan
Publication10.1093/cvr/cvaa141
Analysis code905d5bebbb29da7ad46cd5045db14330695037c3 (uncommitted changes)
Stored arrays[not stored]
Rundone
Review items24 open