Compare runs Export
Figures Sensitivity Report

mouse_2609_150ms_control_iDS, Open-Source Low-Cost Cardiac Optical Mapping System: mouse_2609_150ms_control_iDS

200 × 200 px, 1,954 frames, 0.977 kHz, pixel size not stated, deposit checks: negative values

Run ee804172, 2026-10-28 20:47 UTC, protocol parameters v3, code 0d2391b, 4 workers, signature 4091a5ca, run view ee804172, 2 signatures of this recording

Not reportable: range check not passed, code clean, parameters unsigned, reviewer sign-off pending; 16 rules open

Parameters

% Mouse whole heart optical mapping (Luther lab), v3, read-only
% set by developer (not a domain scientist); provisional, REVIEW_NEEDED 16
baseline_frames  = 901;     % no baseline rule recorded for this run
pad_frames       = 500;     % 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 = 136
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
Whole recording0–1,954500–1,454[not measured]not statedrecording start → recording end

Frames at 1,954 total, 1.024 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 (admission (project lead); no comparison defined).

Metrics

MetricUnitWhole recordingPhysiological Range
Rhythm
Dominant frequencyHz 7.169 none cited
Rotors
Persistent rotorscount 9–609 none cited
Max concurrent persistent rotorscount 1–75 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: 7.169 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

Using provisional parameter set version 3 for protocol f65d786f-f194-4be2-88b8-10d3dd25d674, the provisional fixed criteria were applied with baseline_frames=901, spatial_sigma=1.0, spatial_truncate=4.0, pad_frames=500, rotor_threshold=0.9, rotor_erode_px=3, link_px=4.0, max_gap=5, min_cycles=1.0, pair_dist_px=3.0, paired_frac=0.5, and render_step=4. The recording has 1954 frames of 200 x 200 pixels in mat format; the frame rate is 977.0 Hz from the recording-row admission citing the paper methods quote that recordings were 200x200 pixels at 977 frames per second, and the pixel size is not available. The analysed frames are 500 to 1454, and the provisional segment definition is one whole_recording segment, labelled whole recording, from start_frame=0 to end_frame=1954, defined at admission with no detected or logged events.

Reportable values

MetricSegmentValueUnitStatus
persistent rotor tracksall9–609countunstable, not reportable
dominant freq (Hz)whole recording7.169Hzno cited range
persistent rotorswhole recording9–609countunstable, not reportable
singularity frames fractionwhole recording1fraction of framesno cited range
persistent rotor count maxwhole recording1–75countunstable, not reportable

physiology_ok: not decided (no cited range passed or failed); send back: False. Verdict: no cited-range physiology pass/fail can be assigned, and the ranges, the stability threshold of 0.25 x median, and the criteria are provisional; reportable descriptive outputs are singularity_frames_frac with range 0.9444444444444444 to 1.0 fraction of frames and dominant_freq_hz with range 6.145 to 7.169 Hz, while whole_recording.persistent_rotors and persistent_rotor_tracks are unstable at 9.0 to 609.0 and whole_recording.persistent_rotor_count_max is unstable at 1.0 to 75.0, so those counts are not reportable as single values; review the undocumented all-negative deposited values, low-confidence polarity, whole-frame mask, provisional SNR/processing thresholds, and tracker sensitivity of 80, 308, and 64 rotors, with mouse spiral-wave context from DOI 10.1371/journal.pcbi.1011660.

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_info, otsu_threshold, largest_component)
Tissue mask from, in order: (1) NaN in frame 0 when the recording has any NaN; (2) a mask or background-image variable shipped in the file whose shape matches the frame (binary as is, an intensity image thresholded with Otsu); (3) Otsu's threshold on the mean image, the class with more temporal signal as tissue, largest connected component kept; source, coverage and threshold recordedoptical 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
pipeline_check
worker/agents/pipeline.py (INSTRUCTIONS, validator)
The pipeline agent's hold/proceed decision from protocol mismatches and inspector anomalies; it chooses no parameteroptical mapping analystprovisional
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 metric varies from 9.0 to 609.0 across filter grid and tracker settings and is not reportable as a single count.warnanalysis
unstable:whole_recording.persistent_rotor_count_maxThe metric varies from 1.0 to 75.0 across filter grid and tracker settings and is not reportable as a single maximum count.warnanalysis
unstable:persistent_rotor_tracksThe metric varies from 9.0 to 609.0 across filter grid and tracker settings and is not reportable as a single track count.warnanalysis
Undocumented pre-deposit transformationThe deposited file appears transformed before deposit based on all-negative integer values, and the deposit metadata and paper text do not explain that transformation.warndata_inspector
Polarity confidenceMeasured polarity is not inverted, but confidence is low; use pipeline measurement-based orientation rather than assuming raw Di-4-ANEPPS fluorescence polarity.warndata_inspector
Whole-frame maskNo depositor mask exists and the generated mask may include background as tissue; replace or check the mask before spatial interpretation.warndata_inspector
SNR and processing thresholds are provisionalSNR and the flags used to infer prior processing come from provisional tool thresholds and methods, and temporal smoothing may inflate SNR.infodata_inspector
tracker count sensitivityStrict, default, and loose tracker settings returned 80, 308, and 64 persistent rotors, while the rule verdict agrees; this should be reviewed as sensitivity rather than taken as proof the qualitative finding is false.warnanalysis

Data and code availability

Recording10.5281/zenodo.5557829, cc-by-4.0, Rybashlykov Dmitry
Publication10.1371/journal.pone.0259174
Analysis code0d2391b04113d316716bce2e2f9ee6ec6728d5d3
Stored arraysruns/ee804172-2876-47fb-94df-d522ea5c6e03/frames/voltage.npy, runs/ee804172-2876-47fb-94df-d522ea5c6e03/frames/phase.npy, runs/ee804172-2876-47fb-94df-d522ea5c6e03/frames/maps.npz
Rundone
Review items25 open