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 0ff9236f, 2026-10-28 15:51 UTC, protocol parameters v1, code 5a90b5f (uncommitted changes), 9 workers, signature 2ed01b48, run view 0ff9236f
Not reportable: range check not passed, code uncommitted changes, parameters unsigned, reviewer sign-off pending; 16 rules open
Properties
| Deposit | upload test, duplicate of 10.5281/zenodo.18319102 |
| Publication | 10.1093/cvr/cvaa141 |
| Licence | CC-BY-4.0 (as stated: CC-BY-4.0) |
| Authors | Verstraeten, Bjorn; Lootens, Sebastiaan |
| File | uploads/public/9e30977de373f78d/masked_data_RG_80nM.mat, mat, 293,204,250 bytes |
| sha256 | 9e30977de373f78d1b5d236bd100e46bb79c72152d3a7516b9c03c4849391076 |
| Frame rate | 1000.0 Hz, upload form upload test, duplicate of 10.5281/zenodo.18319102 |
| Pixel size | 112.5 µm, upload form upload test, duplicate of 10.5281/zenodo.18319102 |
| Polarity | upright, measured |
| Segments source | project lead (upload form; 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 | 0ff9236f-c34a-47ba-98dd-89140428ed16 |
| Started, finished | 2026-10-28 15:51 UTC, 2026-10-28 15:54 UTC |
| Code | 5a90b5ff307a9a1dcaafd4e9a272edfe638dd641 (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 | 2ed01b48-85e8-4e7d-bd5d-fff819580b0c, 2026-10-28 15:54 UTC |
| Movie | runs/0ff9236f-c34a-47ba-98dd-89140428ed16/movie.mp4 |
| Lossless frames | runs/0ff9236f-c34a-47ba-98dd-89140428ed16/frames/voltage.npy, runs/0ff9236f-c34a-47ba-98dd-89140428ed16/frames/phase.npy, runs/0ff9236f-c34a-47ba-98dd-89140428ed16/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 (project lead (upload form; 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
Using provisional parameter set version 1 for protocol a0059cf5-fbde-4942-a18f-399ebe70e9ff, the analysis uses baseline_frames 121, spatial_sigma 1.0, spatial_truncate 4.0, pad_frames 200, 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 frame rate is 1000.0 Hz from the upload form by project lead for the upload test duplicate of 10.5281/zenodo.18319102, quoting the deposit description as sampling rate of 1 kHz; the pixel size is 112.5 µm from the same upload-form source, quoting approximately 100–125 µm with the midpoint used. The analysed window is frames 200–3600, and the provisional segment definition is whole_recording, labelled ventricular fibrillation (whole recording), from start_frame 0 to end_frame 3800, defined by the upload form with no events detected or logged at upload. The parameter set, the segment definitions and the criteria are provisional.
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: the signature has no cited range-checked physiology verdict, because physiology_ok is null and the available range checks either have no cited range or are unstable; the descriptive metrics that may be reported are singularity_frames_frac at 1.0 and dominant_freq_hz at 40.294, while whole_recording.persistent_rotors and persistent_rotor_tracks are unstable and must be described only as 204.0 to 464.0 across settings, and whole_recording.persistent_rotor_count_max only as 9.0 to 21.0 across settings. Tracker sensitivity also needs review because strict, default, and loose tracking give 250, 303, and 450 persistent rotors, although the rule verdicts agree; expert review should also account for the rat optical-mapping context in DOI 10.1371/journal.pcbi.1013963, which warns that naive phase-singularity methods can yield false positives at conduction blocks. The ranges, the stability threshold and the criteria are provisional, and review should include pre-deposit processing, polarity/sign, mask convention, duration relative to paper methods, and provisional tool thresholds.
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 |
| pipeline_check worker/agents/pipeline.py (INSTRUCTIONS, validator) | The pipeline agent's hold/proceed decision from protocol mismatches and inspector anomalies; it chooses no parameter | optical mapping analyst | 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 | Persistent rotor count varies across filter-grid and tracker settings, with a range across settings of 204.0 to 464.0, so it is not reportable as a single value. | warn | domain scientist / methods reviewer |
| unstable:whole_recording.persistent_rotor_count_max | Maximum concurrent persistent rotor count varies across filter-grid and tracker settings, with a range across settings of 9.0 to 21.0, so it is not reportable as a single value. | warn | domain scientist / methods reviewer |
| unstable:persistent_rotor_tracks | Persistent rotor tracks vary across filter-grid and tracker settings, with a range across settings of 204.0 to 464.0, so the track count is not reportable as a single value. | warn | domain scientist / methods reviewer |
| tracker variants | Strict, default, and loose tracking give different persistent-rotor counts for the whole_recording segment, while the rule verdicts agree; this is a sensitivity-review issue, not a reason to call the finding false. | warn | methods reviewer |
| pre-deposit processing | Prior-processing flags indicate unit-range data, non-integer values, temporal smoothing, and spatial smoothing; analyses should treat this as preprocessed rather than raw camera-count data. | warn | data curator / methods reviewer |
| polarity/sign | Measured polarity is non-inverted even though RH237 normally dims on depolarization; the sign appears flipped before deposit but is consistent across measured blocks. | warn | data curator |
| mask convention | Only frame 0 has the NaN mask, so downstream analysis must use the measured or depositor mask rather than treating all finite later-frame pixels as tissue. | warn | data curator / pipeline reviewer |
| duration relative to paper methods | The linked paper describes longer general acquisitions, but this uploaded file should be interpreted using its actual frame count and on-record frame rate. | info | data curator |
| provisional tool thresholds | Conclusions from prior-processing flags, SNR caveats, rhythm detection, reference-rate machinery, stability threshold, cited ranges, and criteria are provisional and need domain-scientist review. | info | domain scientist |
Data and code availability
| Recording | upload test, duplicate of 10.5281/zenodo.18319102, CC-BY-4.0, Verstraeten, Bjorn; Lootens, Sebastiaan |
| Publication | 10.1093/cvr/cvaa141 |
| Analysis code | 5a90b5ff307a9a1dcaafd4e9a272edfe638dd641 (uncommitted changes) |
| Stored arrays | runs/0ff9236f-c34a-47ba-98dd-89140428ed16/frames/voltage.npy, runs/0ff9236f-c34a-47ba-98dd-89140428ed16/frames/phase.npy, runs/0ff9236f-c34a-47ba-98dd-89140428ed16/frames/maps.npz |