{
 "exported_at": "2026-10-28T23:53:13.717410+00:00",
 "exported_by": {
  "app": "quantetta-a web",
  "code": {
   "git_commit": "",
   "dirty": false
  }
 },
 "recording_short": "mouseventricle06062018_A_Cool_SR",
 "header": {
  "short": "mouseventricle06062018_A_Cool_SR",
  "label": "Mouse Whole Heart Optical Mapping Data: Mouse Whole Heart.zip/Mouse Whole Heart/06062018 A/mouseventricle06062018 A_Cool SR",
  "facts": "51 \u00d7 51 px, 5,000 frames, 1 kHz, 156 \u00b5m/px",
  "run_short": "59f54d2a",
  "run_when": "2026-10-28 19:02 UTC",
  "params_version": 3,
  "commit": "0aee293",
  "dirty": true,
  "workers": 4,
  "sig_short": "b65bf0ab",
  "run_status": "done",
  "protocol_name": "Mouse whole heart optical mapping (Luther lab)"
 },
 "parameters": "% Mouse whole heart optical mapping (Luther lab), v3, read-only\n% set by developer (not a domain scientist); provisional, REVIEW_NEEDED 16\nbaseline_frames  = 901;     % >= 2 x slowest cycle (7, images): ok\npad_frames       = 500;     % each side, outside the window\nspatial_sigma    = 1.0;     % px, Gaussian, phase only\nspatial_truncate = 4.0;     % kernel radius, sigma\nlowpass          = [];      % none\npolarity         = -1;      % measured, skew of dV/dt\nrotor_threshold  = 0.9;     % turns, |winding| per plaquette\nrotor_erode_px   = 3;       % px from tissue edge ignored\nlink_px          = 4.0;     % tracking, max step per frame\nmax_gap          = 5;       % frames a track may vanish\nmin_cycles       = 1.0;     % own rotations, min_frames = 154\npair_dist_px     = 3.0;     % opposite-charge pairing\npaired_frac      = 0.5;     % max paired fraction of a track\nrender_step      = 4;       % movie only",
 "segments": [
  {
   "name": "whole_recording",
   "label": "Whole recording",
   "short": "whole recording",
   "defined": "0\u20135,000",
   "analysed": "500\u20134,500",
   "analysed_range": [
    500,
    4500
   ],
   "start": 0,
   "end": 5000,
   "cycle": "7 (96% of pixels)",
   "expected": "not stated",
   "bounded": "recording start \u2192 recording end",
   "defined_by": "admission (project lead); no comparison defined",
   "citation": null,
   "provisional": true
  }
 ],
 "metrics": {
  "maps": {
   "activation": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/activation_map.png",
   "dominant_frequency": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/dominant_frequency_map.png"
  },
  "frames": 4000,
  "tracks": 1028,
  "cv_cm_s": 2.4573213635498754,
  "apd50_ms": 10.0,
  "apd90_ms": 47.0,
  "segments": {
   "whole_recording": {
    "beats": {
     "note": null,
     "beats": 26,
     "per_beat": [
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5123886845032555,
         3.696099530486204
        ],
        "plane_fit": {
         "speed_cm_s": 30.64081536609222,
         "direction_deg": -158.11519653772072,
         "speed_px_per_frame": 1.9641548311597579
        },
        "median_cm_s": 2.2564586509094737,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.09694799259636254,
         0.23692945708244897
        ],
        "median_px_per_frame": 0.14464478531470987
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          14.25
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          34.5,
          57.0
         ],
         "median": 46.0
        }
       },
       "window": [
        537,
        690
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          14.25
         ],
         "median": 9.0,
         "defined_frac": 0.8891118916206724
        },
        "apd90": {
         "iqr": [
          34.5,
          57.0
         ],
         "median": 46.0,
         "defined_frac": 0.8765679879578525
        }
       },
       "upstroke_frame": 567,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 119.0,
       "activation_spread_frames": 119.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5489984105731494,
         3.7253344046110692
        ],
        "plane_fit": {
         "speed_cm_s": 34.36933493950576,
         "direction_deg": -168.14304297059732,
         "speed_px_per_frame": 2.2031624961221645
        },
        "median_cm_s": 2.27124834326862,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.09929476990853522,
         0.23880348747506855
        ],
        "median_px_per_frame": 0.14559284251721924
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          34.0,
          58.0
         ],
         "median": 45.5
        }
       },
       "window": [
        690,
        847
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0,
         "defined_frac": 0.8961364776718515
        },
        "apd90": {
         "iqr": [
          34.0,
          58.0
         ],
         "median": 45.5,
         "defined_frac": 0.8830908178625189
        }
       },
       "upstroke_frame": 720,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 120.0,
       "activation_spread_frames": 120.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.645105754281498,
         4.221806492729704
        ],
        "plane_fit": {
         "speed_cm_s": 33.1309117754863,
         "direction_deg": -147.4458126868263,
         "speed_px_per_frame": 2.1237763958645064
        },
        "median_cm_s": 2.472172936643932,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10545549706932679,
         0.2706286213288272
        ],
        "median_px_per_frame": 0.15847262414384178
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          13.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          38.0,
          57.0
         ],
         "median": 47.0
        }
       },
       "window": [
        847,
        1000
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          13.0
         ],
         "median": 10.0,
         "defined_frac": 0.8966382338183643
        },
        "apd90": {
         "iqr": [
          38.0,
          57.0
         ],
         "median": 47.0,
         "defined_frac": 0.8830908178625189
        }
       },
       "upstroke_frame": 877,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 111.0,
       "activation_spread_frames": 111.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.55557240455925,
         3.847338357158346
        ],
        "plane_fit": {
         "speed_cm_s": 46.958847908435004,
         "direction_deg": -158.5407182736193,
         "speed_px_per_frame": 3.010182558233013
        },
        "median_cm_s": 2.356408168401166,
        "pixels_used": 1992,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.09971617977943911,
         0.24662425366399654
        ],
        "median_px_per_frame": 0.15105180566674142
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          31.0,
          58.0
         ],
         "median": 45.0
        }
       },
       "window": [
        1000,
        1154
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0,
         "defined_frac": 0.8755644756648269
        },
        "apd90": {
         "iqr": [
          31.0,
          58.0
         ],
         "median": 45.0,
         "defined_frac": 0.8595082789764175
        }
       },
       "upstroke_frame": 1030,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 117.0,
       "activation_spread_frames": 117.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6959457192060214,
         4.446621665885325
        ],
        "plane_fit": {
         "speed_cm_s": 25.269630307837236,
         "direction_deg": -147.05599587093278,
         "speed_px_per_frame": 1.6198480966562332
        },
        "median_cm_s": 2.5762788721185106,
        "pixels_used": 1992,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10871446917987317,
         0.2850398503772644
        ],
        "median_px_per_frame": 0.16514608154605837
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          36.0,
          59.0
         ],
         "median": 48.0
        }
       },
       "window": [
        1154,
        1309
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.902157551430005
        },
        "apd90": {
         "iqr": [
          36.0,
          59.0
         ],
         "median": 48.0,
         "defined_frac": 0.8815855494229804
        }
       },
       "upstroke_frame": 1184,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 113.39999999999999,
       "activation_spread_frames": 113.39999999999999
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5994501155004361,
         3.9922185721471144
        ],
        "plane_fit": {
         "speed_cm_s": 48.899727617353996,
         "direction_deg": -130.21996984591723,
         "speed_px_per_frame": 3.1345979241893582
        },
        "median_cm_s": 2.442469790455819,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10252885355772026,
         0.25591144693250734
        ],
        "median_px_per_frame": 0.15656857631127044
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          12.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          37.0,
          57.0
         ],
         "median": 47.0
        }
       },
       "window": [
        1309,
        1464
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          12.0
         ],
         "median": 9.0,
         "defined_frac": 0.8876066231811339
        },
        "apd90": {
         "iqr": [
          37.0,
          57.0
         ],
         "median": 47.0,
         "defined_frac": 0.8730556949322629
        }
       },
       "upstroke_frame": 1339,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 112.0,
       "activation_spread_frames": 112.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.7121851321438846,
         4.461470880545349
        ],
        "plane_fit": {
         "speed_cm_s": 41.444081484230026,
         "direction_deg": -132.25827135543247,
         "speed_px_per_frame": 2.6566718900147452
        },
        "median_cm_s": 2.5938085783490457,
        "pixels_used": 1987,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10975545718871055,
         0.28599172311188137
        ],
        "median_px_per_frame": 0.16626978066340037
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          36.0,
          57.0
         ],
         "median": 45.0
        }
       },
       "window": [
        1464,
        1618
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0,
         "defined_frac": 0.8971399899648771
        },
        "apd90": {
         "iqr": [
          36.0,
          57.0
         ],
         "median": 45.0,
         "defined_frac": 0.8835925740090316
        }
       },
       "upstroke_frame": 1494,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 109.0,
       "activation_spread_frames": 109.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.7067370724643527,
         4.0982881263612985
        ],
        "plane_fit": {
         "speed_cm_s": 30.850282017754605,
         "direction_deg": -145.05757583327477,
         "speed_px_per_frame": 1.9775821806252953
        },
        "median_cm_s": 2.484764032700617,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10940622259386877,
         0.26271077733085246
        ],
        "median_px_per_frame": 0.159279745685937
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          37.0,
          57.0
         ],
         "median": 47.0
        }
       },
       "window": [
        1618,
        1773
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.9136979427997993
        },
        "apd90": {
         "iqr": [
          37.0,
          57.0
         ],
         "median": 47.0,
         "defined_frac": 0.8936276969392875
        }
       },
       "upstroke_frame": 1648,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 112.39999999999986,
       "activation_spread_frames": 112.39999999999986
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5437013554415029,
         4.009109743449498
        ],
        "plane_fit": {
         "speed_cm_s": 32.02770878995818,
         "direction_deg": -151.13854155031228,
         "speed_px_per_frame": 2.05305825576655
        },
        "median_cm_s": 2.3308738111267866,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.09895521509240403,
         0.2569942143236858
        ],
        "median_px_per_frame": 0.14941498789274274
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          36.0,
          56.0
         ],
         "median": 47.0
        }
       },
       "window": [
        1773,
        1928
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.9001505268439538
        },
        "apd90": {
         "iqr": [
          36.0,
          56.0
         ],
         "median": 47.0,
         "defined_frac": 0.8886101354741596
        }
       },
       "upstroke_frame": 1803,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 121.0,
       "activation_spread_frames": 121.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6651699364327321,
         4.236235808644617
        ],
        "plane_fit": {
         "speed_cm_s": 55.08643820436544,
         "direction_deg": -146.66403283701445,
         "speed_px_per_frame": 3.5311819361772723
        },
        "median_cm_s": 2.5417549536773207,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10674166259184181,
         0.27155357747721903
        ],
        "median_px_per_frame": 0.1629330098511103
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          37.0,
          59.0
         ],
         "median": 48.0
        }
       },
       "window": [
        1928,
        2082
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0,
         "defined_frac": 0.9061716006021073
        },
        "apd90": {
         "iqr": [
          37.0,
          59.0
         ],
         "median": 48.0,
         "defined_frac": 0.8871048670346212
        }
       },
       "upstroke_frame": 1958,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 108.0,
       "activation_spread_frames": 108.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6119428135530436,
         4.0034163638255365
        ],
        "plane_fit": {
         "speed_cm_s": 45.06637899496159,
         "direction_deg": -134.9185819030966,
         "speed_px_per_frame": 2.888870448394974
        },
        "median_cm_s": 2.3799352479624,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10332966753545152,
         0.25662925409138054
        ],
        "median_px_per_frame": 0.15255995179246154
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          37.0,
          58.0
         ],
         "median": 48.0
        }
       },
       "window": [
        2082,
        2236
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.907175112895133
        },
        "apd90": {
         "iqr": [
          37.0,
          58.0
         ],
         "median": 48.0,
         "defined_frac": 0.8961364776718515
        }
       },
       "upstroke_frame": 2112,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 111.0,
       "activation_spread_frames": 111.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6983722787244269,
         4.0238602391006815
        ],
        "plane_fit": {
         "speed_cm_s": 51.733093653273336,
         "direction_deg": -130.4749279022434,
         "speed_px_per_frame": 3.316223952132906
        },
        "median_cm_s": 2.4269316850412688,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10887001786695044,
         0.25793975891671034
        ],
        "median_px_per_frame": 0.15557254391290185
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          16.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 46.0
        }
       },
       "window": [
        2236,
        2390
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          16.0
         ],
         "median": 10.0,
         "defined_frac": 0.8956347215253387
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 46.0,
         "defined_frac": 0.8855995985950827
        }
       },
       "upstroke_frame": 2266,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 116.0,
       "activation_spread_frames": 116.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.7472915970860348,
         4.778821692731815
        ],
        "plane_fit": {
         "speed_cm_s": 40.43958124137783,
         "direction_deg": -151.07527307782235,
         "speed_px_per_frame": 2.592280848806271
        },
        "median_cm_s": 2.678019395076696,
        "pixels_used": 1991,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.11200587160807915,
         0.30633472389306504
        ],
        "median_px_per_frame": 0.17166790994081385
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          36.0,
          56.0
         ],
         "median": 47.0
        }
       },
       "window": [
        2390,
        2545
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0,
         "defined_frac": 0.9091821374811841
        },
        "apd90": {
         "iqr": [
          36.0,
          56.0
         ],
         "median": 47.0,
         "defined_frac": 0.8946312092323131
        }
       },
       "upstroke_frame": 2420,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 118.0,
       "activation_spread_frames": 118.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5602380265876843,
         4.199135539918483
        ],
        "plane_fit": {
         "speed_cm_s": 35.08221625681394,
         "direction_deg": -128.65496296131607,
         "speed_px_per_frame": 2.2488600164624324
        },
        "median_cm_s": 2.4369257156726074,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10001525811459515,
         0.2691753551229797
        ],
        "median_px_per_frame": 0.1562131869020902
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          36.0,
          59.0
         ],
         "median": 49.0
        }
       },
       "window": [
        2545,
        2698
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0,
         "defined_frac": 0.8936276969392875
        },
        "apd90": {
         "iqr": [
          36.0,
          59.0
         ],
         "median": 49.0,
         "defined_frac": 0.8790767686904165
        }
       },
       "upstroke_frame": 2575,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 117.39999999999986,
       "activation_spread_frames": 117.39999999999986
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.586222320576645,
         3.820697089909258
        ],
        "plane_fit": {
         "speed_cm_s": 35.16364950836665,
         "direction_deg": -141.8054681668619,
         "speed_px_per_frame": 2.25408009669017
        },
        "median_cm_s": 2.2808650892705757,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10168091798568238,
         0.24491648012238834
        ],
        "median_px_per_frame": 0.14620930059426768
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 47.0
        }
       },
       "window": [
        2698,
        2853
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          14.0
         ],
         "median": 9.0,
         "defined_frac": 0.8956347215253387
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 47.0,
         "defined_frac": 0.8780732563973909
        }
       },
       "upstroke_frame": 2728,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 116.0,
       "activation_spread_frames": 116.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.731570388955738,
         5.247658878606681
        ],
        "plane_fit": {
         "speed_cm_s": 26.72339103764001,
         "direction_deg": -133.82415160964607,
         "speed_px_per_frame": 1.7130378870282057
        },
        "median_cm_s": 2.74601714437394,
        "pixels_used": 1992,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.11099810185613705,
         0.3363883896542744
        ],
        "median_px_per_frame": 0.1760267400239705
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          13.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          37.75,
          57.0
         ],
         "median": 48.0
        }
       },
       "window": [
        2853,
        3009
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          13.0
         ],
         "median": 9.0,
         "defined_frac": 0.8961364776718515
        },
        "apd90": {
         "iqr": [
          37.75,
          57.0
         ],
         "median": 48.0,
         "defined_frac": 0.8830908178625189
        }
       },
       "upstroke_frame": 2883,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 107.79999999999986,
       "activation_spread_frames": 107.79999999999986
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.614925596747169,
         4.147207342241835
        ],
        "plane_fit": {
         "speed_cm_s": 41.58745112413812,
         "direction_deg": -132.98023117191997,
         "speed_px_per_frame": 2.6658622515473156
        },
        "median_cm_s": 2.371519630981516,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10352087158635699,
         0.2658466245026817
        ],
        "median_px_per_frame": 0.1520204891654818
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          15.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          36.0,
          55.0
         ],
         "median": 46.0
        }
       },
       "window": [
        3009,
        3163
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          15.0
         ],
         "median": 9.0,
         "defined_frac": 0.8830908178625189
        },
        "apd90": {
         "iqr": [
          36.0,
          55.0
         ],
         "median": 46.0,
         "defined_frac": 0.8745609633718013
        }
       },
       "upstroke_frame": 3039,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 121.0,
       "activation_spread_frames": 121.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.7000807560977171,
         4.556852688061973
        ],
        "plane_fit": {
         "speed_cm_s": 38.202835852997566,
         "direction_deg": -132.67455619626907,
         "speed_px_per_frame": 2.44889973416651
        },
        "median_cm_s": 2.652747801085008,
        "pixels_used": 1992,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10897953564728956,
         0.2921059415424342
        ],
        "median_px_per_frame": 0.1700479359669877
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 47.0
        }
       },
       "window": [
        3163,
        3316
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0,
         "defined_frac": 0.8916206723532363
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 47.0,
         "defined_frac": 0.8810837932764677
        }
       },
       "upstroke_frame": 3193,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 116.0,
       "activation_spread_frames": 116.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.8238129223672146,
         5.42490206258492
        ],
        "plane_fit": {
         "speed_cm_s": 30.92398630343061,
         "direction_deg": -146.68291997845486,
         "speed_px_per_frame": 1.9823068143224751
        },
        "median_cm_s": 2.8474786663500664,
        "pixels_used": 1974,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.11691108476712914,
         0.34775013221698203
        ],
        "median_px_per_frame": 0.1825306837403889
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          39.0,
          58.0
         ],
         "median": 49.0
        }
       },
       "window": [
        3316,
        3470
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.9292523833416959
        },
        "apd90": {
         "iqr": [
          39.0,
          58.0
         ],
         "median": 49.0,
         "defined_frac": 0.91921726041144
        }
       },
       "upstroke_frame": 3346,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 103.0,
       "activation_spread_frames": 103.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5973867837472862,
         4.08355075399951
        ],
        "plane_fit": {
         "speed_cm_s": 25.937543353488195,
         "direction_deg": -152.26252011292536,
         "speed_px_per_frame": 1.6626630354800125
        },
        "median_cm_s": 2.4048683422096593,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10239658870174911,
         0.26176607397432755
        ],
        "median_px_per_frame": 0.15415822706472176
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          39.0,
          57.0
         ],
         "median": 47.0
        }
       },
       "window": [
        3470,
        3624
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0,
         "defined_frac": 0.902157551430005
        },
        "apd90": {
         "iqr": [
          39.0,
          57.0
         ],
         "median": 47.0,
         "defined_frac": 0.8906171600602107
        }
       },
       "upstroke_frame": 3500,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 119.0,
       "activation_spread_frames": 119.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6218013431975766,
         4.82170895063125
        ],
        "plane_fit": {
         "speed_cm_s": 29.899324948665175,
         "direction_deg": -140.2490912150109,
         "speed_px_per_frame": 1.9166233941452036
        },
        "median_cm_s": 2.5749653307435887,
        "pixels_used": 1991,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10396162456394722,
         0.3090839070917468
        ],
        "median_px_per_frame": 0.16506188017587106
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          37.0,
          56.0
         ],
         "median": 47.0
        }
       },
       "window": [
        3624,
        3778
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0,
         "defined_frac": 0.9212242849974912
        },
        "apd90": {
         "iqr": [
          37.0,
          56.0
         ],
         "median": 47.0,
         "defined_frac": 0.9091821374811841
        }
       },
       "upstroke_frame": 3654,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 103.39999999999986,
       "activation_spread_frames": 103.39999999999986
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.6595386572502449,
         4.782462347301183
        ],
        "plane_fit": {
         "speed_cm_s": 21.959063899686964,
         "direction_deg": -146.55047110333572,
         "speed_px_per_frame": 1.407632301261985
        },
        "median_cm_s": 2.5995791865014986,
        "pixels_used": 1989,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10638068315706697,
         0.3065680991859733
        ],
        "median_px_per_frame": 0.16663969144240376
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          38.0,
          56.0
         ],
         "median": 48.0
        }
       },
       "window": [
        3778,
        3932
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.8991470145509283
        },
        "apd90": {
         "iqr": [
          38.0,
          56.0
         ],
         "median": 48.0,
         "defined_frac": 0.8871048670346212
        }
       },
       "upstroke_frame": 3808,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 113.0,
       "activation_spread_frames": 113.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.676581871229069,
         4.481527842596693
        ],
        "plane_fit": {
         "speed_cm_s": 34.56339199833064,
         "direction_deg": -144.84766086379472,
         "speed_px_per_frame": 2.2156020511750407
        },
        "median_cm_s": 2.638208582078497,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10747319687365826,
         0.2872774258074803
        ],
        "median_px_per_frame": 0.1691159347486216
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          17.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          40.0,
          58.0
         ],
         "median": 49.0
        }
       },
       "window": [
        3932,
        4086
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          17.0
         ],
         "median": 10.0,
         "defined_frac": 0.8996487706974411
        },
        "apd90": {
         "iqr": [
          40.0,
          58.0
         ],
         "median": 49.0,
         "defined_frac": 0.8901154039136979
        }
       },
       "upstroke_frame": 3962,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 119.0,
       "activation_spread_frames": 119.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.5809327113379452,
         3.994701986576837
        ],
        "plane_fit": {
         "speed_cm_s": 30.51638818385464,
         "direction_deg": -126.84872476693717,
         "speed_px_per_frame": 1.956178729734272
        },
        "median_cm_s": 2.3129739883456217,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.10134184047038111,
         0.2560706401651819
        ],
        "median_px_per_frame": 0.14826756335548857
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          37.0,
          56.0
         ],
         "median": 48.0
        }
       },
       "window": [
        4086,
        4240
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          15.0
         ],
         "median": 10.0,
         "defined_frac": 0.902157551430005
        },
        "apd90": {
         "iqr": [
          37.0,
          56.0
         ],
         "median": 48.0,
         "defined_frac": 0.8926241846462619
        }
       },
       "upstroke_frame": 4116,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 119.0,
       "activation_spread_frames": 119.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         1.554232437944125,
         3.5423741845760306
        ],
        "plane_fit": {
         "speed_cm_s": 44.83333581046825,
         "direction_deg": -129.71505394171422,
         "speed_px_per_frame": 2.8739317827223236
        },
        "median_cm_s": 2.234920205815316,
        "pixels_used": 1993,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.09963028448359776,
         0.22707526824205324
        ],
        "median_px_per_frame": 0.14326411575739206
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 46.0
        }
       },
       "window": [
        4240,
        4394
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          7.0,
          13.0
         ],
         "median": 9.0,
         "defined_frac": 0.882589061716006
        },
        "apd90": {
         "iqr": [
          35.0,
          55.0
         ],
         "median": 46.0,
         "defined_frac": 0.8710486703462117
        }
       },
       "upstroke_frame": 4270,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 116.0,
       "activation_spread_frames": 116.0
      },
      {
       "cv": {
        "fps": 1000.0,
        "method": "1/|grad T| on a 1 px Gaussian-smoothed max-dV/dt activation map; finite differences",
        "iqr_cm_s": [
         3.243953477532139,
         9.68518946844246
        ],
        "plane_fit": {
         "speed_cm_s": 56.876337565820094,
         "direction_deg": -131.15717146254596,
         "speed_px_per_frame": 3.6459190747320576
        },
        "median_cm_s": 5.133969543045189,
        "pixels_used": 1991,
        "pixels_total": 1993,
        "pixel_size_um": 156.0,
        "iqr_px_per_frame": [
         0.2079457357392397,
         0.6208454787463115
        ],
        "median_px_per_frame": 0.32910061173366595
       },
       "apd_ms": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0
        },
        "apd90": {
         "iqr": [
          38.0,
          56.0
         ],
         "median": 46.0
        }
       },
       "window": [
        4394,
        4500
       ],
       "apd_frames": {
        "apd50": {
         "iqr": [
          8.0,
          14.0
         ],
         "median": 10.0,
         "defined_frac": 0.9312594079277471
        },
        "apd90": {
         "iqr": [
          38.0,
          56.0
         ],
         "median": 46.0,
         "defined_frac": 0.9247365780230807
        }
       },
       "upstroke_frame": 4424,
       "activation_coverage": 0.766243752402922,
       "activation_spread_ms": 72.0,
       "activation_spread_frames": 72.0
      }
     ],
     "cv_cm_s_median": 2.4573213635498754,
     "apd50_ms_median": 10.0,
     "apd90_ms_median": 47.0,
     "representative_beat": 0,
     "cv_px_per_frame_median": 0.1575206002275561,
     "global_amplitude_ratio": 0.7446381571988238
    },
    "frames": [
     500,
     4500
    ],
    "dominant_freq": 6.5,
    "persistent_rotors": 6,
    "singularity_count_max": 31,
    "singularity_count_mean": 0.44475,
    "singularity_frames_frac": 0.163,
    "persistent_rotor_count_max": 2,
    "persistent_rotor_durations": [
     {
      "end": 515,
      "core": [
       5.0,
       8.17
      ],
      "start": 500,
      "charge": -1,
      "rotations": 1.158,
      "lifetime_cycles": 0.1,
      "lifetime_frames": 16,
      "frames_in_segment": 16,
      "rotation_period_frames": 13.82
     },
     {
      "end": 515,
      "core": [
       4.17,
       9.17
      ],
      "start": 500,
      "charge": 1,
      "rotations": 1.158,
      "lifetime_cycles": 0.1,
      "lifetime_frames": 16,
      "frames_in_segment": 16,
      "rotation_period_frames": 13.82
     },
     {
      "end": 706,
      "core": [
       7.41,
       5.05
      ],
      "start": 683,
      "charge": 1,
      "rotations": 1.096,
      "lifetime_cycles": 0.16,
      "lifetime_frames": 24,
      "frames_in_segment": 24,
      "rotation_period_frames": 21.89
     },
     {
      "end": 1320,
      "core": [
       7.5,
       5.0
      ],
      "start": 1289,
      "charge": -1,
      "rotations": 1.113,
      "lifetime_cycles": 0.21,
      "lifetime_frames": 32,
      "frames_in_segment": 32,
      "rotation_period_frames": 28.76
     },
     {
      "end": 2868,
      "core": [
       3.83,
       6.0
      ],
      "start": 2850,
      "charge": -1,
      "rotations": 1.365,
      "lifetime_cycles": 0.12,
      "lifetime_frames": 19,
      "frames_in_segment": 19,
      "rotation_period_frames": 13.91
     },
     {
      "end": 3645,
      "core": [
       4.8,
       4.7
      ],
      "start": 3630,
      "charge": -1,
      "rotations": 1.103,
      "lifetime_cycles": 0.1,
      "lifetime_frames": 16,
      "frames_in_segment": 16,
      "rotation_period_frames": 14.51
     }
    ],
    "persistent_rotor_frames_frac": 0.02675
   }
  },
  "computed_on": {
   "amplitude_p99": "baseline-corrected",
   "dominant_freq": "baseline-corrected, median of per-pixel spectral peaks",
   "activation_apd_cv": "baseline-corrected display signal, per global beat",
   "singularities_and_rotors": "phase of spatially filtered signal"
  },
  "amplitude_p99": 577.9766235351562,
  "dominant_freq": 6.5,
  "mask_coverage": 0.766243752402922,
  "pixel_size_um": 156.0,
  "tissue_pixels": 1993,
  "min_rotor_frames": 154,
  "persistence_rule": "own_rotation",
  "dominant_freq_iqr": [
   6.5,
   6.5
  ],
  "persistent_rotors": 6,
  "dominant_freq_unit": "Hz",
  "singularity_count_max": 31,
  "singularity_count_mean": 0.44475,
  "paired_singularity_frac": 0.6644182124789207,
  "persistent_rotor_tracks": 6,
  "singularity_frames_frac": 0.163,
  "dominant_freq_tissue_mean": 6.5,
  "persistent_rotor_count_max": 2,
  "persistent_rotor_durations": [
   {
    "end": 515,
    "core": [
     5.0,
     8.17
    ],
    "start": 500,
    "charge": -1,
    "rotations": 1.158,
    "lifetime_cycles": 0.1,
    "lifetime_frames": 16,
    "frames_in_segment": 16,
    "rotation_period_frames": 13.82
   },
   {
    "end": 515,
    "core": [
     4.17,
     9.17
    ],
    "start": 500,
    "charge": 1,
    "rotations": 1.158,
    "lifetime_cycles": 0.1,
    "lifetime_frames": 16,
    "frames_in_segment": 16,
    "rotation_period_frames": 13.82
   },
   {
    "end": 706,
    "core": [
     7.41,
     5.05
    ],
    "start": 683,
    "charge": 1,
    "rotations": 1.096,
    "lifetime_cycles": 0.16,
    "lifetime_frames": 24,
    "frames_in_segment": 24,
    "rotation_period_frames": 21.89
   },
   {
    "end": 1320,
    "core": [
     7.5,
     5.0
    ],
    "start": 1289,
    "charge": -1,
    "rotations": 1.113,
    "lifetime_cycles": 0.21,
    "lifetime_frames": 32,
    "frames_in_segment": 32,
    "rotation_period_frames": 28.76
   },
   {
    "end": 2868,
    "core": [
     3.83,
     6.0
    ],
    "start": 2850,
    "charge": -1,
    "rotations": 1.365,
    "lifetime_cycles": 0.12,
    "lifetime_frames": 19,
    "frames_in_segment": 19,
    "rotation_period_frames": 13.91
   },
   {
    "end": 3645,
    "core": [
     4.8,
     4.7
    ],
    "start": 3630,
    "charge": -1,
    "rotations": 1.103,
    "lifetime_cycles": 0.1,
    "lifetime_frames": 16,
    "frames_in_segment": 16,
    "rotation_period_frames": 14.51
   }
  ],
  "persistent_rotor_lifetimes": [
   32,
   24,
   19,
   16,
   16,
   16
  ],
  "persistent_rotor_frames_frac": 0.02675
 },
 "reportable": {
  "persistent_rotor_tracks": {
   "unit": "count",
   "status": "unstable, not reportable",
   "settings": "sensitivity grid + trackers",
   "range_across_settings": [
    0.0,
    20.0
   ]
  },
  "whole_recording.dominant_freq_hz": {
   "unit": "Hz",
   "value": 6.5,
   "checked": "no_cited_range"
  },
  "whole_recording.persistent_rotors": {
   "unit": "count",
   "status": "unstable, not reportable",
   "settings": "sensitivity grid + trackers",
   "range_across_settings": [
    0.0,
    20.0
   ]
  },
  "whole_recording.singularity_frames_frac": {
   "unit": "fraction of frames",
   "status": "unstable, not reportable",
   "settings": "sensitivity grid + trackers",
   "range_across_settings": [
    0.02725,
    0.69475
   ]
  },
  "whole_recording.persistent_rotor_count_max": {
   "unit": "count",
   "status": "unstable, not reportable",
   "settings": "sensitivity grid + trackers",
   "range_across_settings": [
    0.0,
    3.0
   ]
  }
 },
 "physiology_ok": null,
 "sensitivity": {
  "grid": [
   {
    "sigma": "light",
    "baseline": "6x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 2,
      "singularity_count_max": 188,
      "singularity_count_mean": 12.012,
      "singularity_frames_frac": 0.68575,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 1934,
        "core": [
         4.0,
         16.5
        ],
        "start": 1920,
        "charge": -1,
        "rotations": 1.066,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 15,
        "frames_in_segment": 15,
        "rotation_period_frames": 14.07
       },
       {
        "end": 2860,
        "core": [
         5.17,
         4.0
        ],
        "start": 2851,
        "charge": -1,
        "rotations": 1.289,
        "lifetime_cycles": 0.06,
        "lifetime_frames": 10,
        "frames_in_segment": 10,
        "rotation_period_frames": 7.76
       }
      ],
      "persistent_rotor_frames_frac": 0.00625
     }
    },
    "spatial_sigma": 0.5,
    "is_run_setting": false,
    "baseline_frames": 924,
    "persistent_rotor_tracks": 2
   },
   {
    "sigma": "default",
    "baseline": "6x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 5,
      "singularity_count_max": 39,
      "singularity_count_mean": 0.51525,
      "singularity_frames_frac": 0.17375,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 709,
        "core": [
         7.42,
         5.08
        ],
        "start": 683,
        "charge": 1,
        "rotations": 1.451,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 27,
        "frames_in_segment": 27,
        "rotation_period_frames": 18.61
       },
       {
        "end": 1486,
        "core": [
         5.17,
         4.83
        ],
        "start": 1471,
        "charge": -1,
        "rotations": 1.433,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 11.16
       },
       {
        "end": 2868,
        "core": [
         5.2,
         5.4
        ],
        "start": 2847,
        "charge": -1,
        "rotations": 1.18,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 22,
        "frames_in_segment": 22,
        "rotation_period_frames": 18.64
       },
       {
        "end": 3645,
        "core": [
         5.06,
         3.94
        ],
        "start": 3625,
        "charge": -1,
        "rotations": 1.353,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 21,
        "frames_in_segment": 21,
        "rotation_period_frames": 15.52
       },
       {
        "end": 4107,
        "core": [
         7.25,
         4.12
        ],
        "start": 4081,
        "charge": -1,
        "rotations": 1.307,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 27,
        "frames_in_segment": 27,
        "rotation_period_frames": 20.65
       }
      ],
      "persistent_rotor_frames_frac": 0.02825
     }
    },
    "spatial_sigma": 1.0,
    "is_run_setting": false,
    "baseline_frames": 924,
    "persistent_rotor_tracks": 5
   },
   {
    "sigma": "heavier",
    "baseline": "6x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 3,
      "singularity_count_max": 5,
      "singularity_count_mean": 0.07775,
      "singularity_frames_frac": 0.057,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 1629,
        "core": [
         5.93,
         5.21
        ],
        "start": 1612,
        "charge": -1,
        "rotations": 1.115,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 16.15
       },
       {
        "end": 3798,
        "core": [
         4.5,
         4.5
        ],
        "start": 3784,
        "charge": 1,
        "rotations": 2.034,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 15,
        "frames_in_segment": 15,
        "rotation_period_frames": 7.38
       },
       {
        "end": 4095,
        "core": [
         5.5,
         4.9
        ],
        "start": 4085,
        "charge": -1,
        "rotations": 1.006,
        "lifetime_cycles": 0.07,
        "lifetime_frames": 11,
        "frames_in_segment": 11,
        "rotation_period_frames": 10.94
       }
      ],
      "persistent_rotor_frames_frac": 0.011
     }
    },
    "spatial_sigma": 2.0,
    "is_run_setting": false,
    "baseline_frames": 924,
    "persistent_rotor_tracks": 3
   },
   {
    "sigma": "light",
    "baseline": "3x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 3,
      "singularity_count_max": 207,
      "singularity_count_mean": 11.50125,
      "singularity_frames_frac": 0.69475,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 1128,
        "core": [
         3.86,
         6.14
        ],
        "start": 1102,
        "charge": 1,
        "rotations": 2.087,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 27,
        "frames_in_segment": 27,
        "rotation_period_frames": 12.94
       },
       {
        "end": 1717,
        "core": [
         3.7,
         6.4
        ],
        "start": 1694,
        "charge": -1,
        "rotations": 1.452,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 24,
        "frames_in_segment": 24,
        "rotation_period_frames": 16.53
       },
       {
        "end": 2815,
        "core": [
         4.2,
         14.4
        ],
        "start": 2785,
        "charge": 1,
        "rotations": 1.097,
        "lifetime_cycles": 0.2,
        "lifetime_frames": 31,
        "frames_in_segment": 31,
        "rotation_period_frames": 28.26
       }
      ],
      "persistent_rotor_frames_frac": 0.0205
     }
    },
    "spatial_sigma": 0.5,
    "is_run_setting": false,
    "baseline_frames": 462,
    "persistent_rotor_tracks": 3
   },
   {
    "sigma": "default",
    "baseline": "3x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 8,
      "singularity_count_max": 35,
      "singularity_count_mean": 0.44175,
      "singularity_frames_frac": 0.167,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 713,
        "core": [
         3.79,
         5.07
        ],
        "start": 694,
        "charge": 1,
        "rotations": 1.613,
        "lifetime_cycles": 0.13,
        "lifetime_frames": 20,
        "frames_in_segment": 20,
        "rotation_period_frames": 12.4
       },
       {
        "end": 1636,
        "core": [
         4.5,
         3.83
        ],
        "start": 1626,
        "charge": 1,
        "rotations": 1.144,
        "lifetime_cycles": 0.07,
        "lifetime_frames": 11,
        "frames_in_segment": 11,
        "rotation_period_frames": 9.61
       },
       {
        "end": 1945,
        "core": [
         4.5,
         7.12
        ],
        "start": 1923,
        "charge": -1,
        "rotations": 1.183,
        "lifetime_cycles": 0.15,
        "lifetime_frames": 23,
        "frames_in_segment": 23,
        "rotation_period_frames": 19.44
       },
       {
        "end": 2873,
        "core": [
         4.72,
         5.5
        ],
        "start": 2850,
        "charge": -1,
        "rotations": 1.62,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 24,
        "frames_in_segment": 24,
        "rotation_period_frames": 14.81
       },
       {
        "end": 3015,
        "core": [
         4.1,
         5.9
        ],
        "start": 3004,
        "charge": -1,
        "rotations": 1.183,
        "lifetime_cycles": 0.08,
        "lifetime_frames": 12,
        "frames_in_segment": 12,
        "rotation_period_frames": 10.14
       },
       {
        "end": 3645,
        "core": [
         4.88,
         4.38
        ],
        "start": 3625,
        "charge": -1,
        "rotations": 1.301,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 21,
        "frames_in_segment": 21,
        "rotation_period_frames": 16.14
       },
       {
        "end": 3801,
        "core": [
         6.7,
         3.9
        ],
        "start": 3784,
        "charge": 1,
        "rotations": 1.983,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 9.08
       },
       {
        "end": 4107,
        "core": [
         6.23,
         4.43
        ],
        "start": 4081,
        "charge": -1,
        "rotations": 1.064,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 27,
        "frames_in_segment": 27,
        "rotation_period_frames": 25.38
       }
      ],
      "persistent_rotor_frames_frac": 0.039
     }
    },
    "spatial_sigma": 1.0,
    "is_run_setting": false,
    "baseline_frames": 462,
    "persistent_rotor_tracks": 8
   },
   {
    "sigma": "heavier",
    "baseline": "3x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 2,
      "singularity_count_max": 4,
      "singularity_count_mean": 0.064,
      "singularity_frames_frac": 0.04925,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 3327,
        "core": [
         7.21,
         4.79
        ],
        "start": 3310,
        "charge": -1,
        "rotations": 1.08,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 16.67
       },
       {
        "end": 4095,
        "core": [
         5.5,
         5.3
        ],
        "start": 4085,
        "charge": -1,
        "rotations": 1.027,
        "lifetime_cycles": 0.07,
        "lifetime_frames": 11,
        "frames_in_segment": 11,
        "rotation_period_frames": 10.71
       }
      ],
      "persistent_rotor_frames_frac": 0.00725
     }
    },
    "spatial_sigma": 2.0,
    "is_run_setting": false,
    "baseline_frames": 462,
    "persistent_rotor_tracks": 2
   },
   {
    "sigma": "light",
    "baseline": "1.5x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 4,
      "singularity_count_max": 97,
      "singularity_count_mean": 3.7975,
      "singularity_frames_frac": 0.5535,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 1021,
        "core": [
         4.56,
         4.22
        ],
        "start": 995,
        "charge": 1,
        "rotations": 2.133,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 27,
        "frames_in_segment": 27,
        "rotation_period_frames": 12.66
       },
       {
        "end": 1394,
        "core": [
         4.4,
         4.5
        ],
        "start": 1359,
        "charge": -1,
        "rotations": 1.312,
        "lifetime_cycles": 0.23,
        "lifetime_frames": 36,
        "frames_in_segment": 36,
        "rotation_period_frames": 27.43
       },
       {
        "end": 2101,
        "core": [
         3.75,
         5.42
        ],
        "start": 2079,
        "charge": -1,
        "rotations": 2.14,
        "lifetime_cycles": 0.15,
        "lifetime_frames": 23,
        "frames_in_segment": 23,
        "rotation_period_frames": 10.75
       },
       {
        "end": 4253,
        "core": [
         3.79,
         5.79
        ],
        "start": 4235,
        "charge": -1,
        "rotations": 1.146,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 16.58
       }
      ],
      "persistent_rotor_frames_frac": 0.02625
     }
    },
    "spatial_sigma": 0.5,
    "is_run_setting": false,
    "baseline_frames": 231,
    "persistent_rotor_tracks": 4
   },
   {
    "sigma": "default",
    "baseline": "1.5x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 7,
      "singularity_count_max": 10,
      "singularity_count_mean": 0.18575,
      "singularity_frames_frac": 0.10675,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 866,
        "core": [
         5.17,
         4.67
        ],
        "start": 850,
        "charge": -1,
        "rotations": 1.598,
        "lifetime_cycles": 0.11,
        "lifetime_frames": 17,
        "frames_in_segment": 17,
        "rotation_period_frames": 10.64
       },
       {
        "end": 1024,
        "core": [
         3.75,
         4.0
        ],
        "start": 1013,
        "charge": 1,
        "rotations": 1.001,
        "lifetime_cycles": 0.08,
        "lifetime_frames": 12,
        "frames_in_segment": 12,
        "rotation_period_frames": 11.98
       },
       {
        "end": 2103,
        "core": [
         5.1,
         4.9
        ],
        "start": 2076,
        "charge": -1,
        "rotations": 2.114,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 28,
        "frames_in_segment": 28,
        "rotation_period_frames": 13.24
       },
       {
        "end": 2868,
        "core": [
         3.9,
         6.7
        ],
        "start": 2851,
        "charge": -1,
        "rotations": 1.01,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 17.82
       },
       {
        "end": 3336,
        "core": [
         4.5,
         5.0
        ],
        "start": 3319,
        "charge": 1,
        "rotations": 1.368,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 13.16
       },
       {
        "end": 3792,
        "core": [
         4.88,
         6.12
        ],
        "start": 3774,
        "charge": -1,
        "rotations": 1.786,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 10.64
       },
       {
        "end": 4407,
        "core": [
         4.2,
         5.8
        ],
        "start": 4390,
        "charge": -1,
        "rotations": 1.074,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 18,
        "frames_in_segment": 18,
        "rotation_period_frames": 16.77
       }
      ],
      "persistent_rotor_frames_frac": 0.0325
     }
    },
    "spatial_sigma": 1.0,
    "is_run_setting": false,
    "baseline_frames": 231,
    "persistent_rotor_tracks": 7
   },
   {
    "sigma": "heavier",
    "baseline": "1.5x_cycle",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 1,
      "singularity_count_max": 2,
      "singularity_count_mean": 0.03075,
      "singularity_frames_frac": 0.02725,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 860,
        "core": [
         5.9,
         4.1
        ],
        "start": 844,
        "charge": -1,
        "rotations": 1.04,
        "lifetime_cycles": 0.11,
        "lifetime_frames": 17,
        "frames_in_segment": 17,
        "rotation_period_frames": 16.34
       }
      ],
      "persistent_rotor_frames_frac": 0.00425
     }
    },
    "spatial_sigma": 2.0,
    "is_run_setting": false,
    "baseline_frames": 231,
    "persistent_rotor_tracks": 1
   },
   {
    "sigma": "light",
    "baseline": "run",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 3,
      "singularity_count_max": 188,
      "singularity_count_mean": 10.81,
      "singularity_frames_frac": 0.671,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 1383,
        "core": [
         4.75,
         3.62
        ],
        "start": 1359,
        "charge": -1,
        "rotations": 1.077,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 25,
        "frames_in_segment": 25,
        "rotation_period_frames": 23.21
       },
       {
        "end": 1937,
        "core": [
         4.1,
         8.5
        ],
        "start": 1921,
        "charge": 1,
        "rotations": 1.256,
        "lifetime_cycles": 0.11,
        "lifetime_frames": 17,
        "frames_in_segment": 17,
        "rotation_period_frames": 13.54
       },
       {
        "end": 2203,
        "core": [
         4.0,
         11.17
        ],
        "start": 2188,
        "charge": -1,
        "rotations": 1.025,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 15.61
       }
      ],
      "persistent_rotor_frames_frac": 0.0145
     }
    },
    "spatial_sigma": 0.5,
    "is_run_setting": false,
    "baseline_frames": 901,
    "persistent_rotor_tracks": 3
   },
   {
    "sigma": "default",
    "baseline": "run",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 6,
      "singularity_count_max": 31,
      "singularity_count_mean": 0.44475,
      "singularity_frames_frac": 0.163,
      "persistent_rotor_count_max": 2,
      "persistent_rotor_durations": [
       {
        "end": 515,
        "core": [
         5.0,
         8.17
        ],
        "start": 500,
        "charge": -1,
        "rotations": 1.158,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 13.82
       },
       {
        "end": 515,
        "core": [
         4.17,
         9.17
        ],
        "start": 500,
        "charge": 1,
        "rotations": 1.158,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 13.82
       },
       {
        "end": 706,
        "core": [
         7.41,
         5.05
        ],
        "start": 683,
        "charge": 1,
        "rotations": 1.096,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 24,
        "frames_in_segment": 24,
        "rotation_period_frames": 21.89
       },
       {
        "end": 1320,
        "core": [
         7.5,
         5.0
        ],
        "start": 1289,
        "charge": -1,
        "rotations": 1.113,
        "lifetime_cycles": 0.21,
        "lifetime_frames": 32,
        "frames_in_segment": 32,
        "rotation_period_frames": 28.76
       },
       {
        "end": 2868,
        "core": [
         3.83,
         6.0
        ],
        "start": 2850,
        "charge": -1,
        "rotations": 1.365,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 13.91
       },
       {
        "end": 3645,
        "core": [
         4.8,
         4.7
        ],
        "start": 3630,
        "charge": -1,
        "rotations": 1.103,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 14.51
       }
      ],
      "persistent_rotor_frames_frac": 0.02675
     }
    },
    "spatial_sigma": 1.0,
    "is_run_setting": true,
    "baseline_frames": 901,
    "persistent_rotor_tracks": 6
   },
   {
    "sigma": "heavier",
    "baseline": "run",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 3,
      "singularity_count_max": 4,
      "singularity_count_mean": 0.071,
      "singularity_frames_frac": 0.0545,
      "persistent_rotor_count_max": 1,
      "persistent_rotor_durations": [
       {
        "end": 551,
        "core": [
         6.12,
         7.25
        ],
        "start": 527,
        "charge": -1,
        "rotations": 1.631,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 25,
        "frames_in_segment": 25,
        "rotation_period_frames": 15.32
       },
       {
        "end": 3798,
        "core": [
         4.5,
         4.25
        ],
        "start": 3784,
        "charge": 1,
        "rotations": 2.018,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 15,
        "frames_in_segment": 15,
        "rotation_period_frames": 7.43
       },
       {
        "end": 4095,
        "core": [
         5.5,
         5.1
        ],
        "start": 4085,
        "charge": -1,
        "rotations": 1.083,
        "lifetime_cycles": 0.07,
        "lifetime_frames": 11,
        "frames_in_segment": 11,
        "rotation_period_frames": 10.15
       }
      ],
      "persistent_rotor_frames_frac": 0.01275
     }
    },
    "spatial_sigma": 2.0,
    "is_run_setting": false,
    "baseline_frames": 901,
    "persistent_rotor_tracks": 3
   }
  ],
  "fixed": {
   "expect": null,
   "window": [
    500,
    4500
   ],
   "polarity": -1,
   "segments": {
    "whole_recording": [
     500,
     4500
    ]
   },
   "rotor_erode_px": 3,
   "rotor_threshold": 0.9,
   "min_rotor_frames": 154
  },
  "holds": null,
  "status": "provisional",
  "varied": {
   "spatial_sigma": {
    "light": 0.5,
    "default": 1.0,
    "heavier": 2.0
   },
   "baseline_frames": {
    "run": 901,
    "3x_cycle": 462,
    "6x_cycle": 924,
    "1.5x_cycle": 231
   },
   "baseline_scaling": {
    "multiples": {
     "3x_cycle": 3.0,
     "6x_cycle": 6.0,
     "1.5x_cycle": 1.5
    },
    "reference_segment": "whole_recording",
    "segment_cycles_frames": {
     "whole_recording": 154
    },
    "reference_cycle_frames": 154,
    "window_over_cycle_per_segment": {
     "run": {
      "whole_recording": 5.85
     },
     "3x_cycle": {
      "whole_recording": 3.0
     },
     "6x_cycle": {
      "whole_recording": 6.0
     },
     "1.5x_cycle": {
      "whole_recording": 1.5
     }
    }
   },
   "tracker(link_px, max_gap)": {
    "loose": [
     6.0,
     10
    ],
    "strict": [
     2.0,
     1
    ],
    "default": [
     4.0,
     5
    ]
   }
  },
  "findings": null,
  "trackers": [
   {
    "link_px": 2.0,
    "max_gap": 1,
    "tracker": "strict",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 0,
      "singularity_count_max": 31,
      "singularity_count_mean": 0.44475,
      "singularity_frames_frac": 0.163,
      "persistent_rotor_count_max": 0,
      "persistent_rotor_durations": [],
      "persistent_rotor_frames_frac": 0.0
     }
    },
    "is_run_setting": false,
    "persistent_rotor_tracks": 0
   },
   {
    "link_px": 4.0,
    "max_gap": 5,
    "tracker": "default",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 6,
      "singularity_count_max": 31,
      "singularity_count_mean": 0.44475,
      "singularity_frames_frac": 0.163,
      "persistent_rotor_count_max": 2,
      "persistent_rotor_durations": [
       {
        "end": 515,
        "core": [
         5.0,
         8.17
        ],
        "start": 500,
        "charge": -1,
        "rotations": 1.158,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 13.82
       },
       {
        "end": 515,
        "core": [
         4.17,
         9.17
        ],
        "start": 500,
        "charge": 1,
        "rotations": 1.158,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 13.82
       },
       {
        "end": 706,
        "core": [
         7.41,
         5.05
        ],
        "start": 683,
        "charge": 1,
        "rotations": 1.096,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 24,
        "frames_in_segment": 24,
        "rotation_period_frames": 21.89
       },
       {
        "end": 1320,
        "core": [
         7.5,
         5.0
        ],
        "start": 1289,
        "charge": -1,
        "rotations": 1.113,
        "lifetime_cycles": 0.21,
        "lifetime_frames": 32,
        "frames_in_segment": 32,
        "rotation_period_frames": 28.76
       },
       {
        "end": 2868,
        "core": [
         3.83,
         6.0
        ],
        "start": 2850,
        "charge": -1,
        "rotations": 1.365,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 13.91
       },
       {
        "end": 3645,
        "core": [
         4.8,
         4.7
        ],
        "start": 3630,
        "charge": -1,
        "rotations": 1.103,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 14.51
       }
      ],
      "persistent_rotor_frames_frac": 0.02675
     }
    },
    "is_run_setting": true,
    "persistent_rotor_tracks": 6
   },
   {
    "link_px": 6.0,
    "max_gap": 10,
    "tracker": "loose",
    "findings": null,
    "segments": {
     "whole_recording": {
      "beats": null,
      "frames": [
       500,
       4500
      ],
      "dominant_freq": null,
      "persistent_rotors": 20,
      "singularity_count_max": 31,
      "singularity_count_mean": 0.44475,
      "singularity_frames_frac": 0.163,
      "persistent_rotor_count_max": 3,
      "persistent_rotor_durations": [
       {
        "end": 706,
        "core": [
         8.69,
         4.38
        ],
        "start": 643,
        "charge": 1,
        "rotations": 2.046,
        "lifetime_cycles": 0.42,
        "lifetime_frames": 64,
        "frames_in_segment": 64,
        "rotation_period_frames": 31.28
       },
       {
        "end": 862,
        "core": [
         7.0,
         4.75
        ],
        "start": 840,
        "charge": -1,
        "rotations": 1.531,
        "lifetime_cycles": 0.15,
        "lifetime_frames": 23,
        "frames_in_segment": 23,
        "rotation_period_frames": 15.02
       },
       {
        "end": 1021,
        "core": [
         7.0,
         4.7
        ],
        "start": 993,
        "charge": 1,
        "rotations": 1.157,
        "lifetime_cycles": 0.19,
        "lifetime_frames": 29,
        "frames_in_segment": 29,
        "rotation_period_frames": 25.07
       },
       {
        "end": 1175,
        "core": [
         4.12,
         6.62
        ],
        "start": 1151,
        "charge": 1,
        "rotations": 1.49,
        "lifetime_cycles": 0.16,
        "lifetime_frames": 25,
        "frames_in_segment": 25,
        "rotation_period_frames": 16.77
       },
       {
        "end": 1334,
        "core": [
         4.61,
         6.28
        ],
        "start": 1294,
        "charge": 1,
        "rotations": 1.621,
        "lifetime_cycles": 0.27,
        "lifetime_frames": 41,
        "frames_in_segment": 41,
        "rotation_period_frames": 25.3
       },
       {
        "end": 1479,
        "core": [
         5.5,
         5.5
        ],
        "start": 1457,
        "charge": -1,
        "rotations": 1.369,
        "lifetime_cycles": 0.15,
        "lifetime_frames": 23,
        "frames_in_segment": 23,
        "rotation_period_frames": 16.8
       },
       {
        "end": 1638,
        "core": [
         4.75,
         6.42
        ],
        "start": 1609,
        "charge": -1,
        "rotations": 1.899,
        "lifetime_cycles": 0.19,
        "lifetime_frames": 30,
        "frames_in_segment": 30,
        "rotation_period_frames": 15.8
       },
       {
        "end": 2103,
        "core": [
         7.06,
         3.94
        ],
        "start": 2076,
        "charge": -1,
        "rotations": 2.063,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 28,
        "frames_in_segment": 28,
        "rotation_period_frames": 13.57
       },
       {
        "end": 2100,
        "core": [
         5.83,
         6.0
        ],
        "start": 2080,
        "charge": -1,
        "rotations": 1.256,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 21,
        "frames_in_segment": 21,
        "rotation_period_frames": 16.72
       },
       {
        "end": 2414,
        "core": [
         5.64,
         6.21
        ],
        "start": 2340,
        "charge": 1,
        "rotations": 2.385,
        "lifetime_cycles": 0.49,
        "lifetime_frames": 75,
        "frames_in_segment": 75,
        "rotation_period_frames": 31.45
       },
       {
        "end": 2556,
        "core": [
         8.3,
         4.9
        ],
        "start": 2541,
        "charge": -1,
        "rotations": 1.023,
        "lifetime_cycles": 0.1,
        "lifetime_frames": 16,
        "frames_in_segment": 16,
        "rotation_period_frames": 15.64
       },
       {
        "end": 2874,
        "core": [
         5.0,
         5.17
        ],
        "start": 2847,
        "charge": 1,
        "rotations": 1.612,
        "lifetime_cycles": 0.18,
        "lifetime_frames": 28,
        "frames_in_segment": 28,
        "rotation_period_frames": 17.37
       },
       {
        "end": 2868,
        "core": [
         3.83,
         6.0
        ],
        "start": 2850,
        "charge": -1,
        "rotations": 1.365,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 13.91
       },
       {
        "end": 3332,
        "core": [
         5.06,
         6.61
        ],
        "start": 3307,
        "charge": 1,
        "rotations": 1.512,
        "lifetime_cycles": 0.17,
        "lifetime_frames": 26,
        "frames_in_segment": 26,
        "rotation_period_frames": 17.19
       },
       {
        "end": 3645,
        "core": [
         5.26,
         5.97
        ],
        "start": 3615,
        "charge": -1,
        "rotations": 1.165,
        "lifetime_cycles": 0.2,
        "lifetime_frames": 31,
        "frames_in_segment": 31,
        "rotation_period_frames": 26.61
       },
       {
        "end": 3639,
        "core": [
         4.0,
         9.5
        ],
        "start": 3618,
        "charge": 1,
        "rotations": 1.117,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 22,
        "frames_in_segment": 22,
        "rotation_period_frames": 19.7
       },
       {
        "end": 3639,
        "core": [
         4.0,
         10.0
        ],
        "start": 3618,
        "charge": -1,
        "rotations": 1.074,
        "lifetime_cycles": 0.14,
        "lifetime_frames": 22,
        "frames_in_segment": 22,
        "rotation_period_frames": 20.48
       },
       {
        "end": 3801,
        "core": [
         6.75,
         3.75
        ],
        "start": 3773,
        "charge": 1,
        "rotations": 2.654,
        "lifetime_cycles": 0.19,
        "lifetime_frames": 29,
        "frames_in_segment": 29,
        "rotation_period_frames": 10.93
       },
       {
        "end": 3948,
        "core": [
         7.38,
         3.88
        ],
        "start": 3930,
        "charge": -1,
        "rotations": 1.301,
        "lifetime_cycles": 0.12,
        "lifetime_frames": 19,
        "frames_in_segment": 19,
        "rotation_period_frames": 14.6
       },
       {
        "end": 4260,
        "core": [
         4.94,
         5.72
        ],
        "start": 4232,
        "charge": 1,
        "rotations": 1.424,
        "lifetime_cycles": 0.19,
        "lifetime_frames": 29,
        "frames_in_segment": 29,
        "rotation_period_frames": 20.36
       }
      ],
      "persistent_rotor_frames_frac": 0.129
     }
    },
    "is_run_setting": false,
    "persistent_rotor_tracks": 20
   }
  ]
 },
 "critic": {
  "code": {
   "dirty": true,
   "git_commit": "0aee29346248785f557664cd859ddeb50fecd3d5"
  },
  "agent": "critic",
  "model": "openai:gpt-5.5",
  "checks": {
   "checks": {
    "persistent_rotor_tracks": {
     "unit": "count",
     "range": null,
     "metric": "persistent_rotor_tracks",
     "stable": false,
     "status": "unstable_not_reportable",
     "segment": null,
     "spread_frac": 6.667,
     "value_at_run_setting": 6,
     "range_across_settings": [
      0.0,
      20.0
     ]
    },
    "whole_recording.dominant_freq_hz": {
     "unit": "Hz",
     "range": null,
     "metric": "dominant_freq_hz",
     "stable": true,
     "status": "no_cited_range",
     "segment": "whole_recording",
     "spread_frac": 0.0,
     "value_at_run_setting": 6.5,
     "range_across_settings": [
      6.5,
      6.5
     ]
    },
    "whole_recording.persistent_rotors": {
     "unit": "count",
     "range": null,
     "metric": "persistent_rotors",
     "stable": false,
     "status": "unstable_not_reportable",
     "segment": "whole_recording",
     "spread_frac": 6.667,
     "value_at_run_setting": 6,
     "range_across_settings": [
      0.0,
      20.0
     ]
    },
    "whole_recording.singularity_frames_frac": {
     "unit": "fraction of frames",
     "range": null,
     "metric": "singularity_frames_frac",
     "stable": false,
     "status": "unstable_not_reportable",
     "segment": "whole_recording",
     "spread_frac": 4.045,
     "value_at_run_setting": 0.163,
     "range_across_settings": [
      0.02725,
      0.69475
     ]
    },
    "whole_recording.persistent_rotor_count_max": {
     "unit": "count",
     "range": null,
     "metric": "persistent_rotor_count_max",
     "stable": false,
     "status": "unstable_not_reportable",
     "segment": "whole_recording",
     "spread_frac": 3.0,
     "value_at_run_setting": 2,
     "range_across_settings": [
      0.0,
      3.0
     ]
    }
   },
   "unstable": [
    "whole_recording.singularity_frames_frac",
    "whole_recording.persistent_rotors",
    "whole_recording.persistent_rotor_count_max",
    "persistent_rotor_tracks"
   ],
   "physiology_ok": null,
   "ranged_checks": []
  },
  "ranges": [
   {
    "id": "mouse_spiral_rotation_hz",
    "low": 18.75,
    "high": 20.0,
    "unit": "Hz",
    "scope": "one optical mapping recording in the same study (spiral wave before and during illumination); not a population range",
    "metric": "dominant_freq_hz",
    "source": {
     "ref": "10.1371/journal.pcbi.1011660",
     "quotes": [
      "rotational frequency of \u2248 20 Hz before illumination",
      "the frequency of the arrhythmia decreases to \u2248 18\\.75 Hz"
     ],
     "passages": [
      " is shown in Fig 3B. It shows that the arrhythmia consists of a single spiral wave with a stationary core dynamic and a rotational frequency of \u2248 20 Hz before illumination. During a single global optical pulse with a PL of 5000 ms and an LI of 3.21 \u03bcW/mm2, the frequency of the arrhythmia de",
      "ncy of \u2248 20 Hz before illumination. During a single global optical pulse with a PL of 5000 ms and an LI of 3.21 \u03bcW/mm2, the frequency of the arrhythmia decreases to \u2248 18.75 Hz. It is important to note that the frequency reverses its original value of \u2248 20 Hz when the light is turned off. Fig 3C"
     ]
    },
    "status": "provisional",
    "tissue": "whole_heart",
    "species": "mouse",
    "applies_to": {
     "segment_expected_persistent_rotors": "present"
    },
    "checked_low": 14.0625,
    "checked_high": 25.0,
    "tolerance_frac": 0.25
   }
  ],
  "run_id": "59f54d2a-663b-4591-befa-75a5fcb08c8e",
  "status": "provisional",
  "verdict": {
   "send_back": true,
   "critic_notes": "Verdict: do not report this signature as it stands. Reportable only descriptively is the stable dominant frequency of 6.5 Hz, which has no cited range in the checks; the unstable, not-reportable findings are singularity_frames_frac 0.02725\u20130.69475, persistent_rotors 0.0\u201320.0, persistent_rotor_count_max 0.0\u20133.0, and persistent_rotor_tracks 0.0\u201320.0. Persistent-rotor threshold variants are not applicable because there are no segment expectations; strict/default/loose trackers found 0/6/20 persistent rotors, so track review is needed even though the tool's rule-verdict agreement flag is true. The frame rate documentation block, rhythm-assumption warning, tissue/chamber metadata conflict, unavailable publication/deposit text, and whole-frame mask should be reviewed before timing-dependent or chamber-specific interpretation. Context for mouse spiral rotation is limited to DOI 10.1371/journal.pcbi.1011660, which reports approximately 20 Hz before illumination and 18.75 Hz during illumination; the ranges, the stability threshold, and the criteria used here are provisional.",
   "review_items": [
    {
     "topic": "unstable:whole_recording.singularity_frames_frac",
     "detail": "Sensitivity grid range is 0.02725 to 0.69475; unstable metrics are not reportable as single values under the provisional stability rule.",
     "severity": "warn",
     "reviewer_type": "analysis"
    },
    {
     "topic": "unstable:whole_recording.persistent_rotors",
     "detail": "Sensitivity/tracker range is 0.0 to 20.0; review phase-singularity detections and tracks before reporting rotor burden.",
     "severity": "warn",
     "reviewer_type": "analysis"
    },
    {
     "topic": "unstable:whole_recording.persistent_rotor_count_max",
     "detail": "Sensitivity/tracker range is 0.0 to 3.0; maximum concurrent rotor count is not reportable without review.",
     "severity": "warn",
     "reviewer_type": "analysis"
    },
    {
     "topic": "unstable:persistent_rotor_tracks",
     "detail": "Track count range is 0.0 to 20.0; tracker sensitivity should be reviewed and not interpreted as proof the finding is false.",
     "severity": "warn",
     "reviewer_type": "analysis"
    },
    {
     "topic": "Frame rate not documented",
     "detail": "No frame rate was documented on the recording row, deposit metadata could not be fetched, publication text fetch failed, and no acquisition log is present; timing-dependent analysis should treat the frame rate as uncertain.",
     "severity": "block",
     "reviewer_type": "inspector"
    },
    {
     "topic": "Rhythm assumption is provisional",
     "detail": "Frame-rate inference assumes mouse spiral rotation using provisional reference rates that have not been domain-scientist reviewed.",
     "severity": "warn",
     "reviewer_type": "inspector"
    },
    {
     "topic": "Tissue/chamber metadata conflict",
     "detail": "The overview identifies mouse atrium while the file path says mouseventricle06062018 A_Cool SR; chamber-specific interpretation may be misleading until resolved.",
     "severity": "warn",
     "reviewer_type": "inspector"
    },
    {
     "topic": "Publication/deposit text unavailable",
     "detail": "Deposit metadata and linked paper text were unavailable to the tool, so preprocessing documentation, dye identity, and acquisition details could not be verified from text.",
     "severity": "warn",
     "reviewer_type": "inspector"
    },
    {
     "topic": "Mask covers entire frame",
     "detail": "The mask covers the full frame based only on nonzero temporal standard deviation; non-tissue background could affect whole-frame measurements.",
     "severity": "info",
     "reviewer_type": "inspector"
    },
    {
     "topic": "Tracker sensitivity",
     "detail": "Strict/default/loose tracking yielded 0/6/20 persistent rotors in the whole recording; this disagreement in counts requires track review but is not by itself a reason to call the finding false.",
     "severity": "warn",
     "reviewer_type": "analysis"
    }
   ],
   "tracker_note": "Strict, default, and loose tracking found 0, 6, and 20 persistent rotors in the whole recording, respectively. The tool's rule-verdict agreement flag is true, but the counts are tracker-sensitive and should be reviewed rather than used as a pass/fail reason.",
   "physiology_ok": null,
   "metric_judgments": [
    {
     "note": "This fraction is not reportable as a single value because it varies across the filter grid from 0.02725 to 0.69475, exceeding the provisional stability criterion; review segmentation, masking, polarity/baseline handling, and phase-singularity detection before using it.",
     "metric": "whole_recording.singularity_frames_frac",
     "status": "unstable_not_reportable"
    },
    {
     "note": "The persistent-rotor count is not reportable as a single value because it varies from 0.0 to 20.0 across the filter grid plus tracker variants; this is especially important in light of the mouse spiral-wave context in DOI 10.1371/journal.pcbi.1011660, which describes a single spiral wave with a stationary core, so rotor counts should be manually reviewed rather than accepted automatically.",
     "metric": "whole_recording.persistent_rotors",
     "status": "unstable_not_reportable"
    },
    {
     "note": "The maximum concurrent persistent-rotor count is not reportable as a single value because it varies from 0.0 to 3.0 across filter and tracker settings; review the tracks and phase-singularity detections before interpreting multiplicity.",
     "metric": "whole_recording.persistent_rotor_count_max",
     "status": "unstable_not_reportable"
    },
    {
     "note": "The dominant frequency is stable across tested baseline windows at 6.5 Hz, but there is no applicable cited range for this recording/segment in the checks, so it can only be reported descriptively and not as within or outside expected physiology.",
     "metric": "whole_recording.dominant_freq_hz",
     "status": "no_cited_range"
    },
    {
     "note": "The track-level persistent-rotor finding is not reportable as a single value because it varies from 0.0 to 20.0 across filter and tracker settings; this should be treated as a sensitivity/review finding, not a definitive rotor burden.",
     "metric": "persistent_rotor_tracks",
     "status": "unstable_not_reportable"
    }
   ],
   "send_back_reason": "Do not report this signature as it stands: all rotor/phase-singularity metrics are unstable and not reportable as single values, and the inspector raises a block-level frame-rate documentation concern affecting timing-dependent interpretation.",
   "persistence_threshold_note": "Persistent-rotor duration-threshold variants are not applicable: the measured-cycle rule had no segment expectations to test, the paper-rotation-period rule also had no segment expectations, and the agreement flag is null."
  },
  "passages": {
   "mouse_spiral_rotation_period": {
    "ref": "10.1371/journal.pcbi.1011660",
    "note": "At 1000 frames/s, 20 Hz is a 50-frame rotation; the illuminated value of 18.75 Hz would be 53 frames.",
    "quotes": [
     "rotational frequency of \u2248 20 Hz before illumination"
    ],
    "status": "provisional",
    "passages": [
     " is shown in Fig 3B. It shows that the arrhythmia consists of a single spiral wave with a stationary core dynamic and a rotational frequency of \u2248 20 Hz before illumination. During a single global optical pulse with a PL of 5000 ms and an LI of 3.21 \u03bcW/mm2, the frequency of the arrhythmia de"
    ],
    "applies_to": {
     "species": "mouse"
    },
    "rotation_hz": 20.0
   }
  },
  "trackers": {
   "note": "disagreement is reported as a review item, not folded into the pass/fail",
   "agree": true,
   "trackers": [
    {
     "link_px": 2.0,
     "max_gap": 1,
     "tracker": "strict",
     "is_run_setting": false,
     "persistent_rotors_by_segment": {
      "whole_recording": 0
     }
    },
    {
     "link_px": 4.0,
     "max_gap": 5,
     "tracker": "default",
     "is_run_setting": true,
     "persistent_rotors_by_segment": {
      "whole_recording": 6
     }
    },
    {
     "link_px": 6.0,
     "max_gap": 10,
     "tracker": "loose",
     "is_run_setting": false,
     "persistent_rotors_by_segment": {
      "whole_recording": 20
     }
    }
   ]
  },
  "stability": {
   "persistent_rotor_tracks": {
    "max": 20.0,
    "min": 0.0,
    "median": 3.0,
    "stable": false,
    "settings": 15,
    "spread_frac": 6.667,
    "values_grid": [
     2,
     5,
     3,
     3,
     8,
     2,
     4,
     7,
     1,
     3,
     6,
     3
    ],
    "varied_over": "filter grid + trackers",
    "values_trackers": [
     0,
     6,
     20
    ]
   },
   "whole_recording.dominant_freq_hz": {
    "max": 6.5,
    "min": 6.5,
    "median": 6.5,
    "stable": true,
    "settings": 4,
    "spread_frac": 0.0,
    "varied_over": "baseline windows",
    "values_by_baseline": {
     "231": 6.5,
     "462": 6.5,
     "901": 6.5,
     "924": 6.5
    }
   },
   "whole_recording.persistent_rotors": {
    "max": 20.0,
    "min": 0.0,
    "median": 3.0,
    "stable": false,
    "settings": 15,
    "spread_frac": 6.667,
    "values_grid": [
     2,
     5,
     3,
     3,
     8,
     2,
     4,
     7,
     1,
     3,
     6,
     3
    ],
    "varied_over": "filter grid + trackers",
    "values_trackers": [
     0,
     6,
     20
    ]
   },
   "whole_recording.singularity_frames_frac": {
    "max": 0.69475,
    "min": 0.02725,
    "median": 0.165,
    "stable": false,
    "settings": 12,
    "spread_frac": 4.045,
    "values_grid": [
     0.68575,
     0.17375,
     0.057,
     0.69475,
     0.167,
     0.04925,
     0.5535,
     0.10675,
     0.02725,
     0.671,
     0.163,
     0.0545
    ],
    "varied_over": "filter grid"
   },
   "whole_recording.persistent_rotor_present": {
    "stable": false,
    "values_grid": [
     true,
     true,
     true,
     true,
     true,
     true,
     true,
     true,
     true,
     true,
     true,
     true
    ],
    "varied_over": "filter grid + trackers",
    "values_trackers": [
     false,
     true,
     true
    ],
    "stable_across_filters": true,
    "stable_across_trackers": false
   },
   "whole_recording.persistent_rotor_count_max": {
    "max": 3.0,
    "min": 0.0,
    "median": 1.0,
    "stable": false,
    "settings": 15,
    "spread_frac": 3.0,
    "values_grid": [
     1,
     1,
     1,
     1,
     1,
     1,
     1,
     1,
     1,
     1,
     2,
     1
    ],
    "varied_over": "filter grid + trackers",
    "values_trackers": [
     0,
     2,
     3
    ]
   }
  },
  "reviewed_at": "2026-10-28T19:06:30.231221+00:00",
  "recording_id": "ca67ef56-963e-4640-ab6d-c71eda5fa96b",
  "signature_id": "b65bf0ab-0e52-4c93-8182-b8211c4efb27",
  "prompt_version": "critic-v1",
  "criteria_status": {
   "note": null,
   "rules": [
    {
     "id": "physiology_reference_rates",
     "expert": "cardiac electrophysiologist per species",
     "status": "provisional",
     "values": {
      "ranges": [
       "mouse_spiral_rotation_hz"
      ],
      "tolerance_frac": 0.25,
      "segment_rhythm_rule": "expected persistent rotors 'present' -> spiral arrhythmia"
     },
     "decision": null,
     "location": "worker/voltage/physiology.py (RANGES, TOLERANCE_FRAC)",
     "reviewed": false,
     "reviewer": null,
     "description": "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",
     "reviewed_at": null
    },
    {
     "id": "stability_rule",
     "expert": "biostatistician + optical mapping analyst",
     "status": "provisional",
     "values": {
      "unstable": [
       "whole_recording.singularity_frames_frac",
       "whole_recording.persistent_rotors",
       "whole_recording.persistent_rotor_count_max",
       "persistent_rotor_tracks"
      ],
      "stable_frac": 0.25
     },
     "decision": null,
     "location": "worker/agents/critic.py (STABLE_FRAC, stability)",
     "reviewed": false,
     "reviewer": null,
     "description": "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'",
     "reviewed_at": null
    },
    {
     "id": "persistence_threshold_variants",
     "expert": "computational cardiac electrophysiologist (phase mapping)",
     "status": "provisional",
     "values": {
      "measured_cycle": 154,
      "paper_rotation": null
     },
     "decision": null,
     "location": "worker/agents/critic.py (persistence_variants)",
     "reviewed": false,
     "reviewer": null,
     "description": "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",
     "reviewed_at": null
    },
    {
     "id": "persistent_rotor_criterion",
     "expert": "cardiac electrophysiologist",
     "status": "provisional",
     "values": {
      "max_absent": 0,
      "min_present": 1
     },
     "decision": null,
     "location": "worker/voltage/sensitivity.py (MIN_ROTORS_PRESENT, MAX_ROTORS_ABSENT)",
     "reviewed": false,
     "reviewer": null,
     "description": "Persistent-rotor finding holds if every 'present' segment has >= 1 persistent rotor and every 'absent' segment has none, at every setting",
     "reviewed_at": null
    },
    {
     "id": "sensitivity_grid",
     "expert": "optical mapping analyst",
     "status": "provisional",
     "values": {
      "spatial_sigma": {
       "light": 0.5,
       "default": 1.0,
       "heavier": 2.0
      },
      "baseline_frames": {
       "run": 901,
       "3x_cycle": 462,
       "6x_cycle": 924,
       "1.5x_cycle": 231
      },
      "baseline_scaling": {
       "multiples": {
        "3x_cycle": 3.0,
        "6x_cycle": 6.0,
        "1.5x_cycle": 1.5
       },
       "reference_segment": "whole_recording",
       "segment_cycles_frames": {
        "whole_recording": 154
       },
       "reference_cycle_frames": 154,
       "window_over_cycle_per_segment": {
        "run": {
         "whole_recording": 5.85
        },
        "3x_cycle": {
         "whole_recording": 3.0
        },
        "6x_cycle": {
         "whole_recording": 6.0
        },
        "1.5x_cycle": {
         "whole_recording": 1.5
        }
       }
      },
      "tracker(link_px, max_gap)": {
       "loose": [
        6.0,
        10
       ],
       "strict": [
        2.0,
        1
       ],
       "default": [
        4.0,
        5
       ]
      }
     },
     "decision": null,
     "location": "worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels)",
     "reviewed": false,
     "reviewer": null,
     "description": "Filter levels tested: spatial sigma and baseline window values",
     "reviewed_at": null
    }
   ],
   "status": "provisional",
   "all_reviewed": false,
   "superseded_by_run": null
  },
  "persistence_variants": {
   "agree": null,
   "measured_cycle": {
    "basis": "one dominant cycle of the fastest segment at the run setting",
    "reason": "no segment expectations, so the rule has nothing to test",
    "applicable": false,
    "min_frames": 154
   },
   "paper_rotation": {
    "reason": "no segment expectations",
    "applicable": false
   }
  },
  "required_review_topics": [
   "unstable:whole_recording.singularity_frames_frac",
   "unstable:whole_recording.persistent_rotors",
   "unstable:whole_recording.persistent_rotor_count_max",
   "unstable:persistent_rotor_tracks"
  ]
 },
 "criteria": [
  {
   "criterion": "Design expectations",
   "rule": "none stated for this recording's segments",
   "result": "no criterion to test; counts are descriptive",
   "provisional": true
  }
 ],
 "report": {
  "methods": "Using provisional parameter set version 3 for protocol f65d786f-f194-4be2-88b8-10d3dd25d674, the provisional 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 frame rate was 1000.0 Hz from the admitted paper-methods source, and the pixel size was 156.0 \u00b5m from the same source. The recording contained 5000 frames of 51 \u00d7 51 pixels, and the analysed frames were 500 to 4500. The provisional segment definition was a single whole_recording segment spanning frames 0 to 5000.",
  "rules": [
   {
    "id": "protocol_parameter_set",
    "description": "Each protocol's fixed, versioned analysis parameters (version 1 = developer defaults); no run or agent may deviate",
    "expert": "optical mapping analyst",
    "status": "provisional",
    "location": "worker/voltage/protocol_params.py (developer_defaults, set_params)",
    "values": {
     "set_by": "developer (not a domain scientist)",
     "protocol": "Mouse whole heart optical mapping (Luther lab)",
     "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
     "params_version": 3
    }
   },
   {
    "id": "baseline_window_rule",
    "description": "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",
    "expert": "optical mapping analyst",
    "status": "provisional",
    "location": "worker/voltage/baseline_rule.py (FACTOR, evaluate)",
    "values": {
     "ok": true,
     "factor": 2.0,
     "source": "per-pixel dominant frequency (images)",
     "required_min_frames": 14,
     "slowest_cycle_frames": 7
    }
   },
   {
    "id": "filter_defaults",
    "description": "Default baseline window (frames) and spatial Gaussian sigma/truncate for phase",
    "expert": "optical mapping analyst (cardiac electrophysiology)",
    "status": "provisional",
    "location": "worker/voltage/preprocess.py (Params)",
    "values": {
     "lowpass": null,
     "spatial_sigma": 1.0,
     "baseline_frames": 901,
     "spatial_truncate": 4.0
    }
   },
   {
    "id": "tissue_mask",
    "description": "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 recorded",
    "expert": "optical mapping analyst",
    "status": "provisional",
    "location": "worker/voltage/io.py (tissue_mask_info, otsu_threshold, largest_component)",
    "values": {
     "rule": "Otsu threshold 1.81e+04 on the mean image, class above with more temporal signal, largest connected component",
     "side": "above",
     "source": "otsu_mean_image",
     "coverage": 0.766243752402922,
     "variable": null,
     "threshold": 18097.535643577576,
     "tissue_pixels": 1993
    }
   },
   {
    "id": "polarity",
    "description": "Dye polarity from sign of median per-pixel skew of dV/dt",
    "expert": "optical mapping analyst / voltage dye chemist",
    "status": "provisional",
    "location": "worker/voltage/preprocess.py (polarity)",
    "values": {
     "method": "median skew of dV/dt",
     "result": -1
    }
   },
   {
    "id": "singularity_detection",
    "description": "Phase singularity = |winding| > threshold turns, >= erode px from tissue edge",
    "expert": "computational cardiac electrophysiologist (phase mapping)",
    "status": "provisional",
    "location": "worker/voltage/preprocess.py (Params.rotor_threshold, rotor_erode_px)",
    "values": {
     "rotor_erode_px": 3,
     "rotor_threshold": 0.9
    }
   },
   {
    "id": "rotor_persistence",
    "description": "Track linking distance/gap and minimum lifetime for a persistent rotor",
    "expert": "computational cardiac electrophysiologist (phase mapping)",
    "status": "provisional",
    "location": "worker/voltage/rotors.py (TrackParams)",
    "values": {
     "link_px": 4.0,
     "max_gap": 5,
     "min_cycles": 1.0,
     "min_frames": 154
    }
   },
   {
    "id": "chirality_pairing",
    "description": "Opposite-charge singularities within pair distance are a pair; tracks paired most of their life are excluded from rotors",
    "expert": "computational cardiac electrophysiologist (phase mapping)",
    "status": "provisional",
    "location": "worker/voltage/rotors.py (TrackParams.pair_dist_px, paired_frac)",
    "values": {
     "paired_frac": 0.5,
     "pair_dist_px": 3.0
    }
   },
   {
    "id": "sensitivity_grid",
    "description": "Filter levels tested: spatial sigma and baseline window values",
    "expert": "optical mapping analyst",
    "status": "provisional",
    "location": "worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels)",
    "values": {
     "sigmas": {
      "light": 0.5,
      "default": 1.0,
      "heavier": 2.0
     },
     "trackers": {
      "loose": [
       6.0,
       10
      ],
      "strict": [
       2.0,
       1
      ],
      "default": [
       4.0,
       5
      ]
     },
     "baselines": {
      "run": 901,
      "3x_cycle": 462,
      "6x_cycle": 924,
      "1.5x_cycle": 231
     }
    }
   },
   {
    "id": "analysis_window",
    "description": "Frames analysed: whole recording minus one filter pad at each end (unless the plan narrows it)",
    "expert": "cardiac electrophysiologist familiar with the dataset",
    "status": "provisional",
    "location": "worker/voltage/runs.py (default_window)",
    "values": {
     "f0": 500,
     "f1": 4500
    }
   },
   {
    "id": "prior_processing_flags",
    "description": "Thresholds for flagging depositor processing (normalization, masking, temporal/spatial smoothing)",
    "expert": "imaging scientist (camera acquisition and noise)",
    "status": "provisional",
    "location": "worker/voltage/inspect.py (prior_processing)",
    "values": {
     "flags": [],
     "thresholds": {
      "int_frac": 0.5,
      "neg_frac": 0.01,
      "dv_autocorr": 0.5,
      "neighbour_corr": 0.8
     }
    }
   },
   {
    "id": "pipeline_check",
    "description": "The pipeline agent's hold/proceed decision from protocol mismatches and inspector anomalies; it chooses no parameter",
    "expert": "optical mapping analyst",
    "status": "provisional",
    "location": "worker/agents/pipeline.py (INSTRUCTIONS, validator)",
    "values": {
     "model": "openai:gpt-5.5",
     "proceed": true,
     "anomalies": [
      "Frame rate not documented",
      "Rhythm assumption is provisional",
      "Tissue/chamber metadata conflict",
      "Publication/deposit text unavailable",
      "Baseline-window rule"
     ],
     "mismatches": []
    }
   },
   {
    "id": "physiology_reference_rates",
    "description": "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",
    "expert": "cardiac electrophysiologist per species",
    "status": "provisional",
    "location": "worker/voltage/physiology.py (RANGES, TOLERANCE_FRAC)",
    "values": {
     "ranges": [
      "mouse_spiral_rotation_hz"
     ],
     "tolerance_frac": 0.25,
     "segment_rhythm_rule": "expected persistent rotors 'present' -> spiral arrhythmia"
    }
   },
   {
    "id": "stability_rule",
    "description": "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'",
    "expert": "biostatistician + optical mapping analyst",
    "status": "provisional",
    "location": "worker/agents/critic.py (STABLE_FRAC, stability)",
    "values": {
     "unstable": [
      "whole_recording.singularity_frames_frac",
      "whole_recording.persistent_rotors",
      "whole_recording.persistent_rotor_count_max",
      "persistent_rotor_tracks"
     ],
     "stable_frac": 0.25
    }
   },
   {
    "id": "persistence_threshold_variants",
    "description": "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",
    "expert": "computational cardiac electrophysiologist (phase mapping)",
    "status": "provisional",
    "location": "worker/agents/critic.py (persistence_variants)",
    "values": {
     "measured_cycle": 154,
     "paper_rotation": null
    }
   },
   {
    "id": "persistent_rotor_criterion",
    "description": "Persistent-rotor finding holds if every 'present' segment has >= 1 persistent rotor and every 'absent' segment has none, at every setting",
    "expert": "cardiac electrophysiologist",
    "status": "provisional",
    "location": "worker/voltage/sensitivity.py (MIN_ROTORS_PRESENT, MAX_ROTORS_ABSENT)",
    "values": {
     "max_absent": 0,
     "min_present": 1
    }
   }
  ],
  "review_items": [
   {
    "topic": "unstable:whole_recording.singularity_frames_frac",
    "detail": "Sensitivity grid range is 0.02725 to 0.69475; unstable metrics are not reportable as single values under the provisional stability rule.",
    "severity": "warn",
    "reviewer": "analysis"
   },
   {
    "topic": "unstable:whole_recording.persistent_rotors",
    "detail": "Sensitivity/tracker range is 0.0 to 20.0; review phase-singularity detections and tracks before reporting rotor burden.",
    "severity": "warn",
    "reviewer": "analysis"
   },
   {
    "topic": "unstable:whole_recording.persistent_rotor_count_max",
    "detail": "Sensitivity/tracker range is 0.0 to 3.0; maximum concurrent rotor count is not reportable without review.",
    "severity": "warn",
    "reviewer": "analysis"
   },
   {
    "topic": "unstable:persistent_rotor_tracks",
    "detail": "Track count range is 0.0 to 20.0; tracker sensitivity should be reviewed and not interpreted as proof the finding is false.",
    "severity": "warn",
    "reviewer": "analysis"
   },
   {
    "topic": "Frame rate not documented",
    "detail": "No frame rate was documented on the recording row, deposit metadata could not be fetched, publication text fetch failed, and no acquisition log is present; timing-dependent analysis should treat the frame rate as uncertain.",
    "severity": "block",
    "reviewer": "inspector"
   },
   {
    "topic": "Rhythm assumption is provisional",
    "detail": "Frame-rate inference assumes mouse spiral rotation using provisional reference rates that have not been domain-scientist reviewed.",
    "severity": "warn",
    "reviewer": "inspector"
   },
   {
    "topic": "Tissue/chamber metadata conflict",
    "detail": "The overview identifies mouse atrium while the file path says mouseventricle06062018 A_Cool SR; chamber-specific interpretation may be misleading until resolved.",
    "severity": "warn",
    "reviewer": "inspector"
   },
   {
    "topic": "Publication/deposit text unavailable",
    "detail": "Deposit metadata and linked paper text were unavailable to the tool, so preprocessing documentation, dye identity, and acquisition details could not be verified from text.",
    "severity": "warn",
    "reviewer": "inspector"
   },
   {
    "topic": "Mask covers entire frame",
    "detail": "The mask covers the full frame based only on nonzero temporal standard deviation; non-tissue background could affect whole-frame measurements.",
    "severity": "info",
    "reviewer": "inspector"
   },
   {
    "topic": "Tracker sensitivity",
    "detail": "Strict/default/loose tracking yielded 0/6/20 persistent rotors in the whole recording; this disagreement in counts requires track review but is not by itself a reason to call the finding false.",
    "severity": "warn",
    "reviewer": "analysis"
   }
  ],
  "reportable": [
   {
    "metric": "persistent rotor tracks",
    "segment": "all",
    "value": "0\u201320",
    "unit": "count",
    "status": "unstable, not reportable"
   },
   {
    "metric": "dominant freq (Hz)",
    "segment": "whole recording",
    "value": "6.5",
    "unit": "Hz",
    "status": "no cited range"
   },
   {
    "metric": "persistent rotors",
    "segment": "whole recording",
    "value": "0\u201320",
    "unit": "count",
    "status": "unstable, not reportable"
   },
   {
    "metric": "singularity frames fraction",
    "segment": "whole recording",
    "value": "0.0272\u20130.695",
    "unit": "fraction of frames",
    "status": "unstable, not reportable"
   },
   {
    "metric": "persistent rotor count max",
    "segment": "whole recording",
    "value": "0\u20133",
    "unit": "count",
    "status": "unstable, not reportable"
   }
  ],
  "verdict": {
   "physiology_ok": null,
   "send_back": true,
   "notes": "Verdict: do not report this signature as it stands. Reportable only descriptively is the stable dominant frequency of 6.5 Hz, which has no cited range in the checks; the unstable, not-reportable findings are singularity_frames_frac 0.02725\u20130.69475, persistent_rotors 0.0\u201320.0, persistent_rotor_count_max 0.0\u20133.0, and persistent_rotor_tracks 0.0\u201320.0. Persistent-rotor threshold variants are not applicable because there are no segment expectations; strict/default/loose trackers found 0/6/20 persistent rotors, so track review is needed even though the tool's rule-verdict agreement flag is true. The frame rate documentation block, rhythm-assumption warning, tissue/chamber metadata conflict, unavailable publication/deposit text, and whole-frame mask should be reviewed before timing-dependent or chamber-specific interpretation. Context for mouse spiral rotation is limited to DOI 10.1371/journal.pcbi.1011660, which reports approximately 20 Hz before illumination and 18.75 Hz during illumination; the ranges, the stability threshold, and the criteria used here are provisional."
  },
  "provenance": {
   "recording": {
    "id": "ca67ef56-963e-4640-ab6d-c71eda5fa96b",
    "label": "Mouse Whole Heart Optical Mapping Data: Mouse Whole Heart.zip/Mouse Whole Heart/06062018 A/mouseventricle06062018 A_Cool SR",
    "source": "admission",
    "source_ref": "10.6084/m9.figshare.17158742.v1",
    "publication_ref": "10.1038/s41597-022-01253-1",
    "storage_path": "uploads/public/5a7107e9/Mouse_Whole_Heart.zip/Mouse_Whole_Heart/06062018_A/mouseventricle06062018_A_Cool_SR.mat",
    "format": "mat",
    "sha256": "fb2553a4d17c46915a90b8441e6dc956e5d75b982263cc7432493a2fb223a658",
    "size_bytes": 25125468,
    "license": "CC0",
    "attribution": "Ming Lei",
    "rights_source": {
     "ref": "10.6084/m9.figshare.17158742.v1",
     "kind": "deposit_metadata",
     "admitted_by": "project lead",
     "license_as_stated": "CC0"
    },
    "frame_rate_hz": 1000.0,
    "frame_rate_source": {
     "by": "project lead",
     "ref": "10.1038/s41597-022-01253-1",
     "kind": "admission",
     "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
     "source": "paper_methods"
    },
    "pixel_size_um": 156.0,
    "pixel_size_source": {
     "by": "project lead",
     "ref": "10.1038/s41597-022-01253-1",
     "kind": "admission",
     "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
     "source": "paper_methods"
    },
    "frames": 5000,
    "height": 51,
    "width": 51,
    "inverted": true
   },
   "protocol": {
    "id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
    "name": "Mouse whole heart optical mapping (Luther lab)",
    "species": "mouse",
    "tissue": "whole_heart",
    "params_version": 3,
    "params_set_by": "developer (not a domain scientist)",
    "params_note": "version 3: baseline 901 frames = 2.1 x the 433-frame (2.31 Hz) post-termination cycle resolved under v2; v2's 641 frames was 1.48 cycles, on the 1.5-cycle line, and the pipeline check held one run and passed another on the same inputs. pad 500 >= half the window. Provisional (REVIEW_NEEDED item 16)."
   },
   "run": {
    "id": "59f54d2a-663b-4591-befa-75a5fcb08c8e",
    "status": "done",
    "started_at": "2026-10-28T19:02:24.037137+00:00",
    "finished_at": "2026-10-28T19:06:30.967587+00:00",
    "code": {
     "dirty": true,
     "git_commit": "0aee29346248785f557664cd859ddeb50fecd3d5"
    },
    "workers": 4,
    "steps": [
     "load",
     "deposit_checks",
     "baseline_correct",
     "polarity",
     "spatial_filter(phase only)",
     "hilbert_phase",
     "phase_singularities",
     "track_and_pair",
     "beats_apd_cv",
     "sensitivity",
     "render"
    ],
    "protocol_params": {
     "params": {
      "link_px": 4.0,
      "max_gap": 5,
      "min_cycles": 1.0,
      "pad_frames": 500,
      "paired_frac": 0.5,
      "render_step": 4,
      "pair_dist_px": 3.0,
      "spatial_sigma": 1.0,
      "rotor_erode_px": 3,
      "baseline_frames": 901,
      "rotor_threshold": 0.9,
      "spatial_truncate": 4.0
     },
     "version": 3,
     "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674"
    },
    "baseline_rule": {
     "ok": true,
     "ratio": 128.714,
     "cycles": {
      "whole_recording": {
       "n_frames": 5000,
       "cycle_frames": 7,
       "pixels_agreeing_frac": 0.960863020572002,
       "pixels_with_rhythm_frac": 1.0,
       "interval_quartiles_frames": [
        7.0,
        7.0,
        8.0
       ]
      }
     },
     "factor": 2.0,
     "reason": null,
     "source": "per-pixel dominant frequency (images)",
     "status": "provisional",
     "baseline_frames": 901,
     "slowest_segment": "whole_recording",
     "required_min_frames": 14,
     "slowest_cycle_frames": 7
    },
    "deposit_checks": {
     "flags": [],
     "status": "provisional",
     "measures": {
      "max": 34801.0,
      "min": 2759.0,
      "frames_used": 2000,
      "integer_frac": 1.0,
      "negative_frac": 0.0,
      "frames_with_nan": 0,
      "dv_lag1_autocorr_median": -0.40831490873031046,
      "neighbour_dv_corr_median": 0.2584978711413811
     },
     "processed_before_deposit": false
    },
    "pipeline_check": {
     "model": "openai:gpt-5.5",
     "proceed": true,
     "anomalies": [
      {
       "topic": "Frame rate not documented",
       "severity": "info",
       "effect_on_analysis": "The inspector could not document the frame rate from the sources available to it and inferred a low-confidence range, but the admitted recording facts give 1000.0 Hz from the paper methods; the fixed frame-based pipeline can therefore use the admitted frame rate for timing statements."
      },
      {
       "topic": "Rhythm assumption is provisional",
       "severity": "warn",
       "effect_on_analysis": "The inspector's physiology-based frame-rate inference depended on provisional mouse spiral-rotation rates; because an admitted 1000.0 Hz frame rate is available, this does not set the acquisition timing for the pipeline, but it remains a caution against using the inference as evidence about physiology."
      },
      {
       "topic": "Tissue/chamber metadata conflict",
       "severity": "warn",
       "effect_on_analysis": "The protocol is for mouse whole-heart optical mapping, while the inspector reports an overview label of atrium and a path containing mouseventricle; this does not change the fixed analysis parameters, but chamber-specific interpretation should not be made unless the metadata conflict is resolved."
      },
      {
       "topic": "Publication/deposit text unavailable",
       "severity": "warn",
       "effect_on_analysis": "The inspector could not verify preprocessing, dye identity, or acquisition details from deposit/publication text; the admitted recording facts nevertheless provide the frame rate and pixel size from the paper methods, so the remaining effect is uncertainty about undocumented acquisition or preprocessing details."
      },
      {
       "topic": "Baseline-window rule",
       "severity": "info",
       "effect_on_analysis": "The coded baseline-window rule passed for this recording; by policy this rule is reported only as information and is not escalated."
      }
     ],
     "rationale": "The fixed protocol is broadly appropriate for this recording because the admitted facts identify a 5000-frame, 51 \u00d7 51 mouse optical-mapping recording from the Mouse Whole Heart data set, with a documented 1000.0 Hz sampling rate and 156.0 \u00b5m pixel size from the paper methods, and there are no recording facts that contradict the protocol parameters. The main limitations are interpretive rather than parameter-breaking: the inspector reports chamber metadata conflict, unavailable publication/deposit text in its own source checks, full-frame masking, strong slow baseline drift, and inverted deposited polarity. These issues should be disclosed, but they do not require changing the fixed frame-based protocol parameters or holding the run as long as results are not overinterpreted by chamber or undocumented preprocessing assumptions.",
     "mismatches": [],
     "hold_reason": null,
     "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
     "methods_text": "Using provisional parameter set version 3 for protocol f65d786f-f194-4be2-88b8-10d3dd25d674, the provisional 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 frame rate was 1000.0 Hz from the admitted paper-methods source, and the pixel size was 156.0 \u00b5m from the same source. The recording contained 5000 frames of 51 \u00d7 51 pixels, and the analysed frames were 500 to 4500. The provisional segment definition was a single whole_recording segment spanning frames 0 to 5000.",
     "recording_id": "ca67ef56-963e-4640-ab6d-c71eda5fa96b",
     "params_version": 3,
     "prompt_version": "pipeline-v2"
    }
   },
   "signature": {
    "id": "b65bf0ab-0e52-4c93-8182-b8211c4efb27",
    "created_at": "2026-10-28T19:05:41.720942+00:00",
    "movie_path": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/movie.mp4",
    "frames": {
     "f0": 500,
     "f1": 4500,
     "maps": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/maps.npz",
     "dtype": "<f4",
     "phase": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/phase.npy",
     "shape": [
      4000,
      51,
      51
     ],
     "sha256": {
      "maps": "fb9059c39f38b7aeede061662431bea4bd43f09c79a929887f629050993fc756",
      "phase": "8e406d872ea7d93b9596db5698f41801e7c91ae49fcf5642618373f545723133",
      "voltage": "f2aa755dba726e3f24408d60f969cc3ab4932c625ff8dfe4d45e9c96f1531bbf"
     },
     "voltage": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/voltage.npy",
     "map_keys": [
      "activation:whole_recording",
      "dominant_frequency:whole_recording",
      "dominant_frequency:window",
      "mask"
     ],
     "map_units": {
      "mask": "tissue mask, source otsu_mean_image",
      "dominant_frequency:window": "Hz",
      "activation:whole_recording": "ms",
      "dominant_frequency:whole_recording": "Hz"
     }
    },
    "filter_params": {
     "mask": "not NaN in frame 0 and nonzero temporal std",
     "render": {
      "step": 4,
      "palettes": {
       "phase": "twilight",
       "camera": "gray",
       "voltage": "gray"
      },
      "interpolation": "nearest"
     },
     "window": {
      "f0": 500,
      "f1": 4500,
      "segments": [
       {
        "name": "whole_recording",
        "label": "whole recording",
        "defined": [
         0,
         5000
        ],
        "analysed": [
         500,
         4500
        ],
        "citation": null,
        "defined_by": "admission (project lead); no comparison defined",
        "segment_id": "773b82a4-0632-45d3-8716-136bff9bef57",
        "end_event_id": null,
        "start_event_id": null,
        "expected_persistent_rotors": null
       }
      ],
      "illumination": null,
      "frame_rate_hz": 1000.0,
      "frame_rate_source": {
       "by": "project lead",
       "ref": "10.1038/s41597-022-01253-1",
       "kind": "admission",
       "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
       "source": "paper_methods"
      },
      "segment_cycles_frames": {
       "whole_recording": 154
      }
     },
     "lowpass": null,
     "polarity": -1,
     "tracking": {
      "link_px": 4.0,
      "max_gap": 5,
      "min_cycles": 1.0,
      "min_frames": 154,
      "paired_frac": 0.5,
      "pair_dist_px": 3.0
     },
     "pad_frames": 500,
     "phase_method": "angle of scipy.signal.hilbert along time, on spatially filtered signal",
     "spatial_sigma": 1.0,
     "rotor_erode_px": 3,
     "spatial_method": "scipy.ndimage.gaussian_filter per frame, mode=reflect; NaN set to 0 before filtering, non-tissue zeroed after",
     "baseline_frames": 901,
     "baseline_method": "scipy.ndimage.uniform_filter1d, mode=reflect, subtracted per pixel",
     "polarity_method": "sign of median per-pixel skew of dV/dt on baseline-corrected signal",
     "rotor_threshold": 0.9,
     "spatial_truncate": 4.0,
     "spatial_applies_to": "phase/activation only; displayed voltage is baseline-corrected only"
    },
    "criteria_status": {
     "note": null,
     "rules": [
      {
       "id": "protocol_parameter_set",
       "expert": "optical mapping analyst",
       "status": "provisional",
       "values": {
        "set_by": "developer (not a domain scientist)",
        "protocol": "Mouse whole heart optical mapping (Luther lab)",
        "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
        "params_version": 3
       },
       "decision": null,
       "location": "worker/voltage/protocol_params.py (developer_defaults, set_params)",
       "reviewed": false,
       "reviewer": null,
       "description": "Each protocol's fixed, versioned analysis parameters (version 1 = developer defaults); no run or agent may deviate",
       "reviewed_at": null
      },
      {
       "id": "baseline_window_rule",
       "expert": "optical mapping analyst",
       "status": "provisional",
       "values": {
        "ok": true,
        "factor": 2.0,
        "source": "per-pixel dominant frequency (images)",
        "required_min_frames": 14,
        "slowest_cycle_frames": 7
       },
       "decision": null,
       "location": "worker/voltage/baseline_rule.py (FACTOR, evaluate)",
       "reviewed": false,
       "reviewer": null,
       "description": "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",
       "reviewed_at": null
      },
      {
       "id": "filter_defaults",
       "expert": "optical mapping analyst (cardiac electrophysiology)",
       "status": "provisional",
       "values": {
        "lowpass": null,
        "spatial_sigma": 1.0,
        "baseline_frames": 901,
        "spatial_truncate": 4.0
       },
       "decision": null,
       "location": "worker/voltage/preprocess.py (Params)",
       "reviewed": false,
       "reviewer": null,
       "description": "Default baseline window (frames) and spatial Gaussian sigma/truncate for phase",
       "reviewed_at": null
      },
      {
       "id": "tissue_mask",
       "expert": "optical mapping analyst",
       "status": "provisional",
       "values": {
        "rule": "Otsu threshold 1.81e+04 on the mean image, class above with more temporal signal, largest connected component",
        "side": "above",
        "source": "otsu_mean_image",
        "coverage": 0.766243752402922,
        "variable": null,
        "threshold": 18097.535643577576,
        "tissue_pixels": 1993
       },
       "decision": null,
       "location": "worker/voltage/io.py (tissue_mask_info, otsu_threshold, largest_component)",
       "reviewed": false,
       "reviewer": null,
       "description": "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 recorded",
       "reviewed_at": null
      },
      {
       "id": "polarity",
       "expert": "optical mapping analyst / voltage dye chemist",
       "status": "provisional",
       "values": {
        "method": "median skew of dV/dt",
        "result": -1
       },
       "decision": null,
       "location": "worker/voltage/preprocess.py (polarity)",
       "reviewed": false,
       "reviewer": null,
       "description": "Dye polarity from sign of median per-pixel skew of dV/dt",
       "reviewed_at": null
      },
      {
       "id": "singularity_detection",
       "expert": "computational cardiac electrophysiologist (phase mapping)",
       "status": "provisional",
       "values": {
        "rotor_erode_px": 3,
        "rotor_threshold": 0.9
       },
       "decision": null,
       "location": "worker/voltage/preprocess.py (Params.rotor_threshold, rotor_erode_px)",
       "reviewed": false,
       "reviewer": null,
       "description": "Phase singularity = |winding| > threshold turns, >= erode px from tissue edge",
       "reviewed_at": null
      },
      {
       "id": "rotor_persistence",
       "expert": "computational cardiac electrophysiologist (phase mapping)",
       "status": "provisional",
       "values": {
        "link_px": 4.0,
        "max_gap": 5,
        "min_cycles": 1.0,
        "min_frames": 154
       },
       "decision": null,
       "location": "worker/voltage/rotors.py (TrackParams)",
       "reviewed": false,
       "reviewer": null,
       "description": "Track linking distance/gap and minimum lifetime for a persistent rotor",
       "reviewed_at": null
      },
      {
       "id": "chirality_pairing",
       "expert": "computational cardiac electrophysiologist (phase mapping)",
       "status": "provisional",
       "values": {
        "paired_frac": 0.5,
        "pair_dist_px": 3.0
       },
       "decision": null,
       "location": "worker/voltage/rotors.py (TrackParams.pair_dist_px, paired_frac)",
       "reviewed": false,
       "reviewer": null,
       "description": "Opposite-charge singularities within pair distance are a pair; tracks paired most of their life are excluded from rotors",
       "reviewed_at": null
      },
      {
       "id": "sensitivity_grid",
       "expert": "optical mapping analyst",
       "status": "provisional",
       "values": {
        "sigmas": {
         "light": 0.5,
         "default": 1.0,
         "heavier": 2.0
        },
        "trackers": {
         "loose": [
          6.0,
          10
         ],
         "strict": [
          2.0,
          1
         ],
         "default": [
          4.0,
          5
         ]
        },
        "baselines": {
         "run": 901,
         "3x_cycle": 462,
         "6x_cycle": 924,
         "1.5x_cycle": 231
        }
       },
       "decision": null,
       "location": "worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels)",
       "reviewed": false,
       "reviewer": null,
       "description": "Filter levels tested: spatial sigma and baseline window values",
       "reviewed_at": null
      },
      {
       "id": "analysis_window",
       "expert": "cardiac electrophysiologist familiar with the dataset",
       "status": "provisional",
       "values": {
        "f0": 500,
        "f1": 4500
       },
       "decision": null,
       "location": "worker/voltage/runs.py (default_window)",
       "reviewed": false,
       "reviewer": null,
       "description": "Frames analysed: whole recording minus one filter pad at each end (unless the plan narrows it)",
       "reviewed_at": null
      },
      {
       "id": "prior_processing_flags",
       "expert": "imaging scientist (camera acquisition and noise)",
       "status": "provisional",
       "values": {
        "flags": [],
        "thresholds": {
         "int_frac": 0.5,
         "neg_frac": 0.01,
         "dv_autocorr": 0.5,
         "neighbour_corr": 0.8
        }
       },
       "decision": null,
       "location": "worker/voltage/inspect.py (prior_processing)",
       "reviewed": false,
       "reviewer": null,
       "description": "Thresholds for flagging depositor processing (normalization, masking, temporal/spatial smoothing)",
       "reviewed_at": null
      },
      {
       "id": "pipeline_check",
       "expert": "optical mapping analyst",
       "status": "provisional",
       "values": {
        "model": "openai:gpt-5.5",
        "proceed": true,
        "anomalies": [
         "Frame rate not documented",
         "Rhythm assumption is provisional",
         "Tissue/chamber metadata conflict",
         "Publication/deposit text unavailable",
         "Baseline-window rule"
        ],
        "mismatches": []
       },
       "decision": null,
       "location": "worker/agents/pipeline.py (INSTRUCTIONS, validator)",
       "reviewed": false,
       "reviewer": null,
       "description": "The pipeline agent's hold/proceed decision from protocol mismatches and inspector anomalies; it chooses no parameter",
       "reviewed_at": null
      },
      {
       "id": "physiology_reference_rates",
       "expert": "cardiac electrophysiologist per species",
       "status": "provisional",
       "values": {
        "ranges": [
         "mouse_spiral_rotation_hz"
        ],
        "tolerance_frac": 0.25,
        "segment_rhythm_rule": "expected persistent rotors 'present' -> spiral arrhythmia"
       },
       "decision": null,
       "location": "worker/voltage/physiology.py (RANGES, TOLERANCE_FRAC)",
       "reviewed": false,
       "reviewer": null,
       "description": "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",
       "reviewed_at": null
      },
      {
       "id": "stability_rule",
       "expert": "biostatistician + optical mapping analyst",
       "status": "provisional",
       "values": {
        "unstable": [
         "whole_recording.singularity_frames_frac",
         "whole_recording.persistent_rotors",
         "whole_recording.persistent_rotor_count_max",
         "persistent_rotor_tracks"
        ],
        "stable_frac": 0.25
       },
       "decision": null,
       "location": "worker/agents/critic.py (STABLE_FRAC, stability)",
       "reviewed": false,
       "reviewer": null,
       "description": "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'",
       "reviewed_at": null
      },
      {
       "id": "persistence_threshold_variants",
       "expert": "computational cardiac electrophysiologist (phase mapping)",
       "status": "provisional",
       "values": {
        "measured_cycle": 154,
        "paper_rotation": null
       },
       "decision": null,
       "location": "worker/agents/critic.py (persistence_variants)",
       "reviewed": false,
       "reviewer": null,
       "description": "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",
       "reviewed_at": null
      },
      {
       "id": "persistent_rotor_criterion",
       "expert": "cardiac electrophysiologist",
       "status": "provisional",
       "values": {
        "max_absent": 0,
        "min_present": 1
       },
       "decision": null,
       "location": "worker/voltage/sensitivity.py (MIN_ROTORS_PRESENT, MAX_ROTORS_ABSENT)",
       "reviewed": false,
       "reviewer": null,
       "description": "Persistent-rotor finding holds if every 'present' segment has >= 1 persistent rotor and every 'absent' segment has none, at every setting",
       "reviewed_at": null
      }
     ],
     "status": "provisional",
     "all_reviewed": false,
     "superseded_by_run": null
    }
   },
   "segments": [
    {
     "id": "773b82a4-0632-45d3-8716-136bff9bef57",
     "position": 1,
     "name": "whole_recording",
     "label": "whole recording",
     "start_frame": 0,
     "end_frame": 5000,
     "expected_persistent_rotors": null,
     "definition": "whole recording; no events detected or logged at admission",
     "defined_by": "admission (project lead); no comparison defined",
     "citation": null,
     "evidence": {},
     "provisional": true
    }
   ],
   "events": []
  }
 },
 "provenance": {
  "recording": {
   "id": "ca67ef56-963e-4640-ab6d-c71eda5fa96b",
   "label": "Mouse Whole Heart Optical Mapping Data: Mouse Whole Heart.zip/Mouse Whole Heart/06062018 A/mouseventricle06062018 A_Cool SR",
   "source": "admission",
   "source_ref": "10.6084/m9.figshare.17158742.v1",
   "publication_ref": "10.1038/s41597-022-01253-1",
   "storage_path": "uploads/public/5a7107e9/Mouse_Whole_Heart.zip/Mouse_Whole_Heart/06062018_A/mouseventricle06062018_A_Cool_SR.mat",
   "format": "mat",
   "sha256": "fb2553a4d17c46915a90b8441e6dc956e5d75b982263cc7432493a2fb223a658",
   "size_bytes": 25125468,
   "license": "CC0",
   "attribution": "Ming Lei",
   "rights_source": {
    "ref": "10.6084/m9.figshare.17158742.v1",
    "kind": "deposit_metadata",
    "admitted_by": "project lead",
    "license_as_stated": "CC0"
   },
   "frame_rate_hz": 1000.0,
   "frame_rate_source": {
    "by": "project lead",
    "ref": "10.1038/s41597-022-01253-1",
    "kind": "admission",
    "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
    "source": "paper_methods"
   },
   "pixel_size_um": 156.0,
   "pixel_size_source": {
    "by": "project lead",
    "ref": "10.1038/s41597-022-01253-1",
    "kind": "admission",
    "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
    "source": "paper_methods"
   },
   "frames": 5000,
   "height": 51,
   "width": 51,
   "inverted": true
  },
  "protocol": {
   "id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
   "name": "Mouse whole heart optical mapping (Luther lab)",
   "species": "mouse",
   "tissue": "whole_heart",
   "params_version": 3,
   "params_set_by": "developer (not a domain scientist)",
   "params_note": "version 3: baseline 901 frames = 2.1 x the 433-frame (2.31 Hz) post-termination cycle resolved under v2; v2's 641 frames was 1.48 cycles, on the 1.5-cycle line, and the pipeline check held one run and passed another on the same inputs. pad 500 >= half the window. Provisional (REVIEW_NEEDED item 16)."
  },
  "run": {
   "id": "59f54d2a-663b-4591-befa-75a5fcb08c8e",
   "status": "done",
   "started_at": "2026-10-28T19:02:24.037137+00:00",
   "finished_at": "2026-10-28T19:06:30.967587+00:00",
   "code": {
    "dirty": true,
    "git_commit": "0aee29346248785f557664cd859ddeb50fecd3d5"
   },
   "workers": 4,
   "steps": [
    "load",
    "deposit_checks",
    "baseline_correct",
    "polarity",
    "spatial_filter(phase only)",
    "hilbert_phase",
    "phase_singularities",
    "track_and_pair",
    "beats_apd_cv",
    "sensitivity",
    "render"
   ],
   "protocol_params": {
    "params": {
     "link_px": 4.0,
     "max_gap": 5,
     "min_cycles": 1.0,
     "pad_frames": 500,
     "paired_frac": 0.5,
     "render_step": 4,
     "pair_dist_px": 3.0,
     "spatial_sigma": 1.0,
     "rotor_erode_px": 3,
     "baseline_frames": 901,
     "rotor_threshold": 0.9,
     "spatial_truncate": 4.0
    },
    "version": 3,
    "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674"
   },
   "baseline_rule": {
    "ok": true,
    "ratio": 128.714,
    "cycles": {
     "whole_recording": {
      "n_frames": 5000,
      "cycle_frames": 7,
      "pixels_agreeing_frac": 0.960863020572002,
      "pixels_with_rhythm_frac": 1.0,
      "interval_quartiles_frames": [
       7.0,
       7.0,
       8.0
      ]
     }
    },
    "factor": 2.0,
    "reason": null,
    "source": "per-pixel dominant frequency (images)",
    "status": "provisional",
    "baseline_frames": 901,
    "slowest_segment": "whole_recording",
    "required_min_frames": 14,
    "slowest_cycle_frames": 7
   },
   "deposit_checks": {
    "flags": [],
    "status": "provisional",
    "measures": {
     "max": 34801.0,
     "min": 2759.0,
     "frames_used": 2000,
     "integer_frac": 1.0,
     "negative_frac": 0.0,
     "frames_with_nan": 0,
     "dv_lag1_autocorr_median": -0.40831490873031046,
     "neighbour_dv_corr_median": 0.2584978711413811
    },
    "processed_before_deposit": false
   },
   "pipeline_check": {
    "model": "openai:gpt-5.5",
    "proceed": true,
    "anomalies": [
     {
      "topic": "Frame rate not documented",
      "severity": "info",
      "effect_on_analysis": "The inspector could not document the frame rate from the sources available to it and inferred a low-confidence range, but the admitted recording facts give 1000.0 Hz from the paper methods; the fixed frame-based pipeline can therefore use the admitted frame rate for timing statements."
     },
     {
      "topic": "Rhythm assumption is provisional",
      "severity": "warn",
      "effect_on_analysis": "The inspector's physiology-based frame-rate inference depended on provisional mouse spiral-rotation rates; because an admitted 1000.0 Hz frame rate is available, this does not set the acquisition timing for the pipeline, but it remains a caution against using the inference as evidence about physiology."
     },
     {
      "topic": "Tissue/chamber metadata conflict",
      "severity": "warn",
      "effect_on_analysis": "The protocol is for mouse whole-heart optical mapping, while the inspector reports an overview label of atrium and a path containing mouseventricle; this does not change the fixed analysis parameters, but chamber-specific interpretation should not be made unless the metadata conflict is resolved."
     },
     {
      "topic": "Publication/deposit text unavailable",
      "severity": "warn",
      "effect_on_analysis": "The inspector could not verify preprocessing, dye identity, or acquisition details from deposit/publication text; the admitted recording facts nevertheless provide the frame rate and pixel size from the paper methods, so the remaining effect is uncertainty about undocumented acquisition or preprocessing details."
     },
     {
      "topic": "Baseline-window rule",
      "severity": "info",
      "effect_on_analysis": "The coded baseline-window rule passed for this recording; by policy this rule is reported only as information and is not escalated."
     }
    ],
    "rationale": "The fixed protocol is broadly appropriate for this recording because the admitted facts identify a 5000-frame, 51 \u00d7 51 mouse optical-mapping recording from the Mouse Whole Heart data set, with a documented 1000.0 Hz sampling rate and 156.0 \u00b5m pixel size from the paper methods, and there are no recording facts that contradict the protocol parameters. The main limitations are interpretive rather than parameter-breaking: the inspector reports chamber metadata conflict, unavailable publication/deposit text in its own source checks, full-frame masking, strong slow baseline drift, and inverted deposited polarity. These issues should be disclosed, but they do not require changing the fixed frame-based protocol parameters or holding the run as long as results are not overinterpreted by chamber or undocumented preprocessing assumptions.",
    "mismatches": [],
    "hold_reason": null,
    "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
    "methods_text": "Using provisional parameter set version 3 for protocol f65d786f-f194-4be2-88b8-10d3dd25d674, the provisional 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 frame rate was 1000.0 Hz from the admitted paper-methods source, and the pixel size was 156.0 \u00b5m from the same source. The recording contained 5000 frames of 51 \u00d7 51 pixels, and the analysed frames were 500 to 4500. The provisional segment definition was a single whole_recording segment spanning frames 0 to 5000.",
    "recording_id": "ca67ef56-963e-4640-ab6d-c71eda5fa96b",
    "params_version": 3,
    "prompt_version": "pipeline-v2"
   }
  },
  "signature": {
   "id": "b65bf0ab-0e52-4c93-8182-b8211c4efb27",
   "created_at": "2026-10-28T19:05:41.720942+00:00",
   "movie_path": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/movie.mp4",
   "frames": {
    "f0": 500,
    "f1": 4500,
    "maps": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/maps.npz",
    "dtype": "<f4",
    "phase": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/phase.npy",
    "shape": [
     4000,
     51,
     51
    ],
    "sha256": {
     "maps": "fb9059c39f38b7aeede061662431bea4bd43f09c79a929887f629050993fc756",
     "phase": "8e406d872ea7d93b9596db5698f41801e7c91ae49fcf5642618373f545723133",
     "voltage": "f2aa755dba726e3f24408d60f969cc3ab4932c625ff8dfe4d45e9c96f1531bbf"
    },
    "voltage": "runs/59f54d2a-663b-4591-befa-75a5fcb08c8e/frames/voltage.npy",
    "map_keys": [
     "activation:whole_recording",
     "dominant_frequency:whole_recording",
     "dominant_frequency:window",
     "mask"
    ],
    "map_units": {
     "mask": "tissue mask, source otsu_mean_image",
     "dominant_frequency:window": "Hz",
     "activation:whole_recording": "ms",
     "dominant_frequency:whole_recording": "Hz"
    }
   },
   "filter_params": {
    "mask": "not NaN in frame 0 and nonzero temporal std",
    "render": {
     "step": 4,
     "palettes": {
      "phase": "twilight",
      "camera": "gray",
      "voltage": "gray"
     },
     "interpolation": "nearest"
    },
    "window": {
     "f0": 500,
     "f1": 4500,
     "segments": [
      {
       "name": "whole_recording",
       "label": "whole recording",
       "defined": [
        0,
        5000
       ],
       "analysed": [
        500,
        4500
       ],
       "citation": null,
       "defined_by": "admission (project lead); no comparison defined",
       "segment_id": "773b82a4-0632-45d3-8716-136bff9bef57",
       "end_event_id": null,
       "start_event_id": null,
       "expected_persistent_rotors": null
      }
     ],
     "illumination": null,
     "frame_rate_hz": 1000.0,
     "frame_rate_source": {
      "by": "project lead",
      "ref": "10.1038/s41597-022-01253-1",
      "kind": "admission",
      "quote": "Emission photons were imaged by Evolve Delta 512 \u00d7 512 pixel EMCCD cameras (1000 Hz sampling rate, 51 \u00d7 51 pixels, 156 \u00b5m/pixel).",
      "source": "paper_methods"
     },
     "segment_cycles_frames": {
      "whole_recording": 154
     }
    },
    "lowpass": null,
    "polarity": -1,
    "tracking": {
     "link_px": 4.0,
     "max_gap": 5,
     "min_cycles": 1.0,
     "min_frames": 154,
     "paired_frac": 0.5,
     "pair_dist_px": 3.0
    },
    "pad_frames": 500,
    "phase_method": "angle of scipy.signal.hilbert along time, on spatially filtered signal",
    "spatial_sigma": 1.0,
    "rotor_erode_px": 3,
    "spatial_method": "scipy.ndimage.gaussian_filter per frame, mode=reflect; NaN set to 0 before filtering, non-tissue zeroed after",
    "baseline_frames": 901,
    "baseline_method": "scipy.ndimage.uniform_filter1d, mode=reflect, subtracted per pixel",
    "polarity_method": "sign of median per-pixel skew of dV/dt on baseline-corrected signal",
    "rotor_threshold": 0.9,
    "spatial_truncate": 4.0,
    "spatial_applies_to": "phase/activation only; displayed voltage is baseline-corrected only"
   },
   "criteria_status": {
    "note": null,
    "rules": [
     {
      "id": "protocol_parameter_set",
      "expert": "optical mapping analyst",
      "status": "provisional",
      "values": {
       "set_by": "developer (not a domain scientist)",
       "protocol": "Mouse whole heart optical mapping (Luther lab)",
       "protocol_id": "f65d786f-f194-4be2-88b8-10d3dd25d674",
       "params_version": 3
      },
      "decision": null,
      "location": "worker/voltage/protocol_params.py (developer_defaults, set_params)",
      "reviewed": false,
      "reviewer": null,
      "description": "Each protocol's fixed, versioned analysis parameters (version 1 = developer defaults); no run or agent may deviate",
      "reviewed_at": null
     },
     {
      "id": "baseline_window_rule",
      "expert": "optical mapping analyst",
      "status": "provisional",
      "values": {
       "ok": true,
       "factor": 2.0,
       "source": "per-pixel dominant frequency (images)",
       "required_min_frames": 14,
       "slowest_cycle_frames": 7
      },
      "decision": null,
      "location": "worker/voltage/baseline_rule.py (FACTOR, evaluate)",
      "reviewed": false,
      "reviewer": null,
      "description": "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",
      "reviewed_at": null
     },
     {
      "id": "filter_defaults",
      "expert": "optical mapping analyst (cardiac electrophysiology)",
      "status": "provisional",
      "values": {
       "lowpass": null,
       "spatial_sigma": 1.0,
       "baseline_frames": 901,
       "spatial_truncate": 4.0
      },
      "decision": null,
      "location": "worker/voltage/preprocess.py (Params)",
      "reviewed": false,
      "reviewer": null,
      "description": "Default baseline window (frames) and spatial Gaussian sigma/truncate for phase",
      "reviewed_at": null
     },
     {
      "id": "tissue_mask",
      "expert": "optical mapping analyst",
      "status": "provisional",
      "values": {
       "rule": "Otsu threshold 1.81e+04 on the mean image, class above with more temporal signal, largest connected component",
       "side": "above",
       "source": "otsu_mean_image",
       "coverage": 0.766243752402922,
       "variable": null,
       "threshold": 18097.535643577576,
       "tissue_pixels": 1993
      },
      "decision": null,
      "location": "worker/voltage/io.py (tissue_mask_info, otsu_threshold, largest_component)",
      "reviewed": false,
      "reviewer": null,
      "description": "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 recorded",
      "reviewed_at": null
     },
     {
      "id": "polarity",
      "expert": "optical mapping analyst / voltage dye chemist",
      "status": "provisional",
      "values": {
       "method": "median skew of dV/dt",
       "result": -1
      },
      "decision": null,
      "location": "worker/voltage/preprocess.py (polarity)",
      "reviewed": false,
      "reviewer": null,
      "description": "Dye polarity from sign of median per-pixel skew of dV/dt",
      "reviewed_at": null
     },
     {
      "id": "singularity_detection",
      "expert": "computational cardiac electrophysiologist (phase mapping)",
      "status": "provisional",
      "values": {
       "rotor_erode_px": 3,
       "rotor_threshold": 0.9
      },
      "decision": null,
      "location": "worker/voltage/preprocess.py (Params.rotor_threshold, rotor_erode_px)",
      "reviewed": false,
      "reviewer": null,
      "description": "Phase singularity = |winding| > threshold turns, >= erode px from tissue edge",
      "reviewed_at": null
     },
     {
      "id": "rotor_persistence",
      "expert": "computational cardiac electrophysiologist (phase mapping)",
      "status": "provisional",
      "values": {
       "link_px": 4.0,
       "max_gap": 5,
       "min_cycles": 1.0,
       "min_frames": 154
      },
      "decision": null,
      "location": "worker/voltage/rotors.py (TrackParams)",
      "reviewed": false,
      "reviewer": null,
      "description": "Track linking distance/gap and minimum lifetime for a persistent rotor",
      "reviewed_at": null
     },
     {
      "id": "chirality_pairing",
      "expert": "computational cardiac electrophysiologist (phase mapping)",
      "status": "provisional",
      "values": {
       "paired_frac": 0.5,
       "pair_dist_px": 3.0
      },
      "decision": null,
      "location": "worker/voltage/rotors.py (TrackParams.pair_dist_px, paired_frac)",
      "reviewed": false,
      "reviewer": null,
      "description": "Opposite-charge singularities within pair distance are a pair; tracks paired most of their life are excluded from rotors",
      "reviewed_at": null
     },
     {
      "id": "sensitivity_grid",
      "expert": "optical mapping analyst",
      "status": "provisional",
      "values": {
       "sigmas": {
        "light": 0.5,
        "default": 1.0,
        "heavier": 2.0
       },
       "trackers": {
        "loose": [
         6.0,
         10
        ],
        "strict": [
         2.0,
         1
        ],
        "default": [
         4.0,
         5
        ]
       },
       "baselines": {
        "run": 901,
        "3x_cycle": 462,
        "6x_cycle": 924,
        "1.5x_cycle": 231
       }
      },
      "decision": null,
      "location": "worker/voltage/sensitivity.py (SIGMAS, BASELINE_MULTIPLES, baseline_levels)",
      "reviewed": false,
      "reviewer": null,
      "description": "Filter levels tested: spatial sigma and baseline window values",
      "reviewed_at": null
     },
     {
      "id": "analysis_window",
      "expert": "cardiac electrophysiologist familiar with the dataset",
      "status": "provisional",
      "values": {
       "f0": 500,
       "f1": 4500
      },
      "decision": null,
      "location": "worker/voltage/runs.py (default_window)",
      "reviewed": false,
      "reviewer": null,
      "description": "Frames analysed: whole recording minus one filter pad at each end (unless the plan narrows it)",
      "reviewed_at": null
     },
     {
      "id": "prior_processing_flags",
      "expert": "imaging scientist (camera acquisition and noise)",
      "status": "provisional",
      "values": {
       "flags": [],
       "thresholds": {
        "int_frac": 0.5,
        "neg_frac": 0.01,
        "dv_autocorr": 0.5,
        "neighbour_corr": 0.8
       }
      },
      "decision": null,
      "location": "worker/voltage/inspect.py (prior_processing)",
      "reviewed": false,
      "reviewer": null,
      "description": "Thresholds for flagging depositor processing (normalization, masking, temporal/spatial smoothing)",
      "reviewed_at": null
     },
     {
      "id": "pipeline_check",
      "expert": "optical mapping analyst",
      "status": "provisional",
      "values": {
       "model": "openai:gpt-5.5",
       "proceed": true,
       "anomalies": [
        "Frame rate not documented",
        "Rhythm assumption is provisional",
        "Tissue/chamber metadata conflict",
        "Publication/deposit text unavailable",
        "Baseline-window rule"
       ],
       "mismatches": []
      },
      "decision": null,
      "location": "worker/agents/pipeline.py (INSTRUCTIONS, validator)",
      "reviewed": false,
      "reviewer": null,
      "description": "The pipeline agent's hold/proceed decision from protocol mismatches and inspector anomalies; it chooses no parameter",
      "reviewed_at": null
     },
     {
      "id": "physiology_reference_rates",
      "expert": "cardiac electrophysiologist per species",
      "status": "provisional",
      "values": {
       "ranges": [
        "mouse_spiral_rotation_hz"
       ],
       "tolerance_frac": 0.25,
       "segment_rhythm_rule": "expected persistent rotors 'present' -> spiral arrhythmia"
      },
      "decision": null,
      "location": "worker/voltage/physiology.py (RANGES, TOLERANCE_FRAC)",
      "reviewed": false,
      "reviewer": null,
      "description": "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",
      "reviewed_at": null
     },
     {
      "id": "stability_rule",
      "expert": "biostatistician + optical mapping analyst",
      "status": "provisional",
      "values": {
       "unstable": [
        "whole_recording.singularity_frames_frac",
        "whole_recording.persistent_rotors",
        "whole_recording.persistent_rotor_count_max",
        "persistent_rotor_tracks"
       ],
       "stable_frac": 0.25
      },
      "decision": null,
      "location": "worker/agents/critic.py (STABLE_FRAC, stability)",
      "reviewed": false,
      "reviewer": null,
      "description": "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'",
      "reviewed_at": null
     },
     {
      "id": "persistence_threshold_variants",
      "expert": "computational cardiac electrophysiologist (phase mapping)",
      "status": "provisional",
      "values": {
       "measured_cycle": 154,
       "paper_rotation": null
      },
      "decision": null,
      "location": "worker/agents/critic.py (persistence_variants)",
      "reviewed": false,
      "reviewer": null,
      "description": "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",
      "reviewed_at": null
     },
     {
      "id": "persistent_rotor_criterion",
      "expert": "cardiac electrophysiologist",
      "status": "provisional",
      "values": {
       "max_absent": 0,
       "min_present": 1
      },
      "decision": null,
      "location": "worker/voltage/sensitivity.py (MIN_ROTORS_PRESENT, MAX_ROTORS_ABSENT)",
      "reviewed": false,
      "reviewer": null,
      "description": "Persistent-rotor finding holds if every 'present' segment has >= 1 persistent rotor and every 'absent' segment has none, at every setting",
      "reviewed_at": null
     }
    ],
    "status": "provisional",
    "all_reviewed": false,
    "superseded_by_run": null
   }
  },
  "segments": [
   {
    "id": "773b82a4-0632-45d3-8716-136bff9bef57",
    "position": 1,
    "name": "whole_recording",
    "label": "whole recording",
    "start_frame": 0,
    "end_frame": 5000,
    "expected_persistent_rotors": null,
    "definition": "whole recording; no events detected or logged at admission",
    "defined_by": "admission (project lead); no comparison defined",
    "citation": null,
    "evidence": {},
    "provisional": true
   }
  ],
  "events": []
 }
}