You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit d9bc62c
Browse filesBrowse the repository at this point in the historyBrowse files
Bold Export sub-headers, rename toggles to "About", drop 3 redundant ones
Export section now has <h4> headers (Trial summary / Event detail /
Project file) instead of three unlabeled blocks run together.
"What does this mean?" / "What do these mean?" -> "About" on all 17
info-toggle/threshold-help disclosures, her direct call.
Audited every one-liner + toggle pair for whether the full version
actually said more than the short one, not just the same thing with
extra words. Three didn't: the tracking-failure-strip blurb, the
background-median explanation, and the event-detail export line. Each
collapsed to a single line - the fuller, more complete phrasing kept,
the short one dropped, per her instruction to prefer the more complete
version when they're redundant rather than default to the shorter one.
75/75 tests pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
<pclass="subtitle">The route the mouse took, colored dark to yellow as the trial goes on - click a point to seek the video there.</p>
798
798
<detailsclass="info-toggle">
799
-
<summary>What does this mean?</summary>
799
+
<summary>About</summary>
800
800
<pclass="subtitle">Trajectory from trial start to the end of the recording, colored by 8 equal bands of elapsed time (viridis - perceptually uniform, colorblind-safe, and survives greyscale printing; banded rather than a smooth blend so neighboring time periods stay visually distinct). The bands are a fixed, even split of time, not a detected behavioral phase - a color change marks a clock boundary, not an event. Click a point to seek the video there. Failed-tracking frames break the line rather than bridging it - a gap is never silently interpolated.</p>
<pclass="subtitle">How much time was spent where on the platform, not the route taken - click a cell to seek the video there.</p>
815
815
<detailsclass="info-toggle">
816
-
<summary>What does this mean?</summary>
816
+
<summary>About</summary>
817
817
<pclass="subtitle">Occupancy over the platform, trial start to end of recording - how much time was spent where, not the route taken (see Path for that). Colored in the same 8 equal bins as Path, but here the bins are by visit density, not time. Click a cell to seek the video to the first frame that landed there.</p>
<pclass="subtitle">One row per hole, one mark per visit, left to right in time - click a mark to seek the video there.</p>
832
832
<detailsclass="info-toggle">
833
-
<summary>What does this mean?</summary>
833
+
<summary>About</summary>
834
834
<pclass="subtitle">One row per hole, target hole marked with a star (not color alone), trial start to end of recording left to right. Each mark is a real hole-visit, shaped by type (poke/entry/thigmotaxis) so meaning never depends on color alone. Click a mark, or focus the raster and use arrow keys plus Enter, to seek the video there - this tab, unlike Path and Heat map, is fully keyboard-operable.</p>
835
835
</details>
836
836
<divid="rasterWrap" role="listbox" aria-label="Hole-visit raster, arrow keys to move, Enter to seek" tabindex="0"></div>
@@ -876,7 +876,7 @@ <h2>Videos</h2>
876
876
<divid="trackSection" hidden>
877
877
<pclass="subtitle">Finds the mouse in each frame by comparing it against the empty-platform background, and marks a frame failed rather than guessing when it can't.</p>
878
878
<detailsclass="info-toggle">
879
-
<summary>What does this mean?</summary>
879
+
<summary>About</summary>
880
880
<pclass="subtitle">Background subtraction against the median, gated to the confirmed platform circle and a plausible size range. The largest matching blob wins each frame. A frame with no valid blob is marked failed, never guessed.</p>
881
881
</details>
882
882
@@ -886,7 +886,7 @@ <h2>Videos</h2>
886
886
<label>Max blob area (px) <inputtype="number" id="trackMaxAreaInput" value="1500" min="1"></label>
887
887
</div>
888
888
<detailsclass="threshold-help">
889
-
<summary>What do these mean?</summary>
889
+
<summary>About</summary>
890
890
<dl>
891
891
<dt>Mask threshold</dt>
892
892
<dd>How different from the empty-platform background a pixel has to be before it counts as mouse. Lower values pick up more of the animal but also shadows and lighting drift; higher values lose the animal in dimmer frames. The default of 30 tracked all three test clips despite very different lighting between the three rigs, which is the only evidence there is - no other value has been tested, and the 1-255 range is the arithmetic limit of an 8-bit image, not a tested range.</dd>
<pclass="subtitle">A timeline of where tracking failed across the whole video - click anywhere to jump there.</p>
912
-
<detailsclass="info-toggle">
913
-
<summary>What does this mean?</summary>
914
-
<pclass="subtitle">Where failures happened, not just how many - the whole video, start to end. Click anywhere to jump there.</p>
915
-
</details>
911
+
<pclass="subtitle">Where failures happened, not just how many - the whole video, start to end. Click anywhere to jump there.</p>
916
912
<canvasid="trackFailureStrip" width="640" height="24" aria-label="Tracking failure timeline: green is tracked, red is failed, across the whole video"></canvas>
917
913
</div>
918
914
<pclass="subtitle" id="trackScrubHint" hidden>Scrub the frame viewer above - green crosshair = tracked, red X = failed frame.</p>
@@ -923,7 +919,7 @@ <h2>Videos</h2>
923
919
<h3>Measures</h3>
924
920
<pclass="subtitle">Click a measure's name to see what it means and how it's calculated.</p>
925
921
<detailsclass="info-toggle">
926
-
<summary>What does this mean?</summary>
922
+
<summary>About</summary>
927
923
<pclass="subtitle">Click a measure's name for its definition and how it's calculated. A row marked <strong>audited</strong> was changed by a human-review override above - re-click "Compute measures" after changing one to recalculate.</p>
<pclass="subtitle">Which search pattern this trial matches - spatial, serial, or random - or UNCLEAR when no single pattern fits.</p>
942
938
<detailsclass="info-toggle">
943
-
<summary>What does this mean?</summary>
939
+
<summary>About</summary>
944
940
<pclass="subtitle">Spatial (direct) / serial / random. The definitions of the three strategies come from Gawel et al. 2019 (Table 1, citing O'Leary & Brown), including the "at most 1-2 holes adjacent to the target" limit that decides Direct - those are the literature's, not invented here. The 0-1 scores and the two bars that gate them are this project's own, and are described in the threshold notes below. A verdict requires exactly one categorical pattern to match; otherwise it's <strong>UNCLEAR</strong> and all three scores are shown for you to audit against the hole sequence, rather than forcing a guess.</p>
945
941
</details>
946
942
<divid="classifierControls">
947
943
<label>Serial bar <inputtype="number" id="classifierSerialBarInput" value="0.6" min="0" max="1" step="0.05"></label>
948
944
<label>Random bar <inputtype="number" id="classifierRandomBarInput" value="0.5" min="0" max="1" step="0.05"></label>
949
945
<detailsclass="threshold-help">
950
-
<summary>What do these mean?</summary>
946
+
<summary>About</summary>
951
947
<dl>
952
948
<dt>Serial bar / Random bar</dt>
953
949
<dd>A trial is called serial or random only if its respective score clears this bar. Unlike the strategy definitions themselves, these two numbers are not from the literature - <code>serialScore</code> and <code>randomScore</code> are this project's own 0-1 metrics (adjacency and direction consistency; platform-centre crossings), and the defaults of 0.6 and 0.5 are locally-set cutoffs on them. They were set from the shape of the literature's categories rather than calibrated, on the explicit reasoning that three test clips cannot calibrate a classifier. No value other than the defaults has been tested, and moving them is not a way to resolve an UNCLEAR verdict: a verdict also requires a categorical pattern match, so a score clearing its bar is necessary but not sufficient.</dd>
@@ -959,9 +955,11 @@ <h3>Search strategy</h3>
959
955
<divid="classifierResult" hidden></div>
960
956
961
957
<h3>Export</h3>
958
+
959
+
<h4>Trial summary</h4>
962
960
<pclass="subtitle">One spreadsheet row for this trial, with every measure, the search-strategy verdict, and the thresholds that produced them.</p>
963
961
<detailsclass="info-toggle">
964
-
<summary>What does this mean?</summary>
962
+
<summary>About</summary>
965
963
<pclass="subtitle">One tidy row for this trial: every measure above, the search-strategy verdict, the thresholds that produced them, and the tool version - opens directly in Excel, no legend needed. "Video file" is always included, so every exported row stays traceable on its own.</p>
966
964
</details>
967
965
<labelid="exportLabelAuditedLabel"><inputtype="checkbox" id="exportLabelAuditedInput" checked> Label audited values (adds "(audited)" to a measure's value when a human correction changed it)</label>
<pclass="subtitle">Not spreadsheet data - a reloadable copy of this trial's own work, to resume later without re-tracking.</p>
986
983
<pclass="subtitle" id="saveProjectFileHint" hidden>Save a portable <code>_AUDITED.bmp.json</code> file with everything except the video itself (which stays wherever it already lives) - open it later, on any computer, to resume without re-tracking. Save it in the same folder as the video, next to it - the name makes it obvious at a glance, to you or anyone else, that this trial's already been done.</p>
<pclass="subtitle">Builds a picture of the empty platform by taking the median of frames sampled across the video.</p>
1001
-
<detailsclass="info-toggle">
1002
-
<summary>What does this mean?</summary>
1003
-
<pclass="subtitle">The maze is static and the mouse moves, so the per-pixel median across evenly-sampled frames gives a clean empty-platform image.</p>
1004
-
</details>
997
+
<pclass="subtitle">The maze is static and the mouse moves, so the per-pixel median across evenly-sampled frames gives a clean empty-platform image.</p>
<pclass="subtitle">Finds the platform circle and the roughly 20 holes around its rim automatically - you confirm them on the next screen.</p>
1027
1020
<detailsclass="info-toggle">
1028
-
<summary>What does this mean?</summary>
1021
+
<summary>About</summary>
1029
1022
<pclass="subtitle">Hough circles on the background: one big circle for the platform, ~20 small ones on its rim for the holes, indexed in ring order by angle.</p>
<pclass="subtitle">Fix any circle that's wrong by dragging it, then click the escape hole to mark it as the target.</p>
1054
1047
<detailsclass="info-toggle">
1055
-
<summary>What does this mean?</summary>
1048
+
<summary>About</summary>
1056
1049
<pclass="subtitle">Drag a circle's edge to resize it, drag its middle to move it. Click a hole (no drag) to mark it as the target - or use the dropdown below if clicking precisely is awkward on a small screen.</p>
1057
1050
</details>
1058
1051
<divid="roiKeyboardNudge">
@@ -1130,7 +1123,7 @@ <h3>Confirm & adjust</h3>
1130
1123
</div>
1131
1124
<pclass="subtitle">How many trials this animal has already done - a label for your records, never used in any calculation.</p>
1132
1125
<detailsclass="info-toggle">
1133
-
<summary>What does this mean?</summary>
1126
+
<summary>About</summary>
1134
1127
<pclass="subtitle">Prior trials completed is a human-entered label only - it's never read by the tracker, event detector, or classifier. It just rides along with this trial's numbers into the exported spreadsheet, so a researcher reading it later has context (e.g. "trial 1 of 5, still wandering" reads differently than "trial 9, still wandering").</p>
1135
1128
</details>
1136
1129
</div>
@@ -1152,12 +1145,12 @@ <h3>Confirm & adjust</h3>
1152
1145
<divid="eventsQcSection" hidden>
1153
1146
<pclass="subtitle">Finds hole visits from pixel change at each hole, then labels each one an entry or a poke.</p>
1154
1147
<detailsclass="info-toggle">
1155
-
<summary>What does this mean?</summary>
1148
+
<summary>About</summary>
1156
1149
<pclass="subtitle">Per-hole pixel-change signal, duration-gated. An <strong>entry</strong> is the signal plus the mouse's own tracked blob going invalid right after; a <strong>poke</strong> is the signal plus the mouse's speed dropping to at-or-below its own trial's median. Low-confidence candidates are shown, not hidden - disagreement gets flagged, not silently resolved.</p>
1157
1150
</details>
1158
1151
<pclass="subtitle">Your corrections come back when you resume, except after re-detecting with different thresholds, which clears them.</p>
1159
1152
<detailsclass="info-toggle">
1160
-
<summary>What does this mean?</summary>
1153
+
<summary>About</summary>
1161
1154
<pclass="subtitle"><strong>Human review survives a reload:</strong> a correction here or on the search-strategy verdict below persists and comes back after resuming a session, or after loading a saved project file. Re-detecting events with DIFFERENT thresholds still clears overrides on purpose - frame ranges may have shifted, so a stale override would be misleading, not just outdated. See KNOWN_LIMITATIONS.md for what's still missing (a free-text note per override, a timestamped audit log).</p>
1162
1155
</details>
1163
1156
@@ -1169,7 +1162,7 @@ <h3>Confirm & adjust</h3>
<dd>How much of a hole's centre has to change from the background before that frame counts as a candidate visit. Lower values catch more brief or partial investigations along with more noise; higher values miss real ones. The default of 0.30 sits close to real signal levels - a confirmed continuous investigation in test50 dipped to 0.257 partway through, which is why the reengage rule below exists - so raising it should be expected to fragment real visits into several reported ones. Only the default has been tested against the three clips.</dd>
@@ -1206,7 +1199,7 @@ <h3>Confirm & adjust</h3>
<pclass="subtitle">Two visits to the same hole count as one unless the mouse fully disengaged in between.</p>
1208
1201
<detailsclass="info-toggle">
1209
-
<summary>What does this mean?</summary>
1202
+
<summary>About</summary>
1210
1203
<pclass="subtitle">Two events at the same hole are merged into one visit when the raw center-density signal between them never drops close to baseline (reengage fraction x min center density) - a brief dip under the qualifying threshold doesn't end a visit, but a real return to baseline does. See DECISIONS.md 2026-09-04. Feeds the search-strategy classifier's visit sequence and the errors/perseverative-errors measure - not shown elsewhere yet.</p>
0 commit comments