Skip to content

A calibration can reach the recordings it was derived from, which is the point of the loop - #507

Merged
syncytium2 merged 1 commit into
mainfrom
detect-reads-a-settings-file
Sep 9, 2026
Merged

A calibration can reach the recordings it was derived from, which is the point of the loop#507
syncytium2 merged 1 commit into
mainfrom
detect-reads-a-settings-file

Conversation

@syncytium2

Copy link
Copy Markdown
Owner

Tony, told that the six ran the pilot folder at shipped operating points while the bake-off
had calibrated them on simulated data derived from that same cohort: "that is the whole
point of the pipeline"
.

  • bugarach detect --settings <detector_settings.csv> applies a calibration.
  • tools/settings_from_bakeoff.py writes one out of a bake-off.

The format was already shared and nobody had noticed

emit.read_detector_settings has parsed the browser's file and this module's file since it
was written — its docstring says why, in terms: "two writers produce this file … and a file
only one of them can parse is a second dialect of one table."
What was missing was any
caller on the way in. So this is plumbing, not a new format, and it works in both
directions from the first commit.

What it was hiding

Measured on the pilot APV+CNQX+GZ folder, at the calibration derived from that cohort's own
simulated data:

detector shipped calibrated
rate+context 195 calls 370 +90 %
locust 500 1023 +105 %
LoCo 256 282 +10 %

That is the distance between the instrument the bench scored and the instrument that ran.

Three refusals, and they are findings

Only three of the six calibrate cleanly on that cohort. CoactDetect and binned SCE are
refused because their folds disagreed — a mean over a knob grid is not a knob anyone ran.
SPIKE-synch is refused because every fold landed on the end of its grid, which
bench.pick_operating_point already treats as a search that stopped too early. Each is named
and left out, because a file carrying shipped values for the uncalibrated detectors would
read as a calibration of all six.

Four rules in the reader

A file supplies a knob and not the microscopegrid_dt and imaging_rate_hz are
recomputed from the recording after the override, so a file fitted on another rig cannot
impose that rig's frame interval. fitted_* rows are provenance and reach run.json rather
than a detector, where they would be a TypeError. A bad file is refused before the folder
is walked, not on recording 84 of 85. And the three nested ports refuse a per-stream
divergence by name — they read the whole recording in one RNG sequence, so there is no
seam at which one stream's value could apply.

The round-trip test earned its place immediately: it failed on the first run because detect
writes grid_dt and imaging_rate_hz into its own settings file, so the file this module
wrote would not load back into it.

Full suite green: 2220 passed, 46 skipped, 1 xfailed. docs/pipeline.md's blocker list
is down from two to one — model persistence is next.

🤖 Generated with Claude Code

…the point of the loop

Tony, on being told the six ran the real folder at shipped operating points while the
bake-off had calibrated them on simulated data from that same cohort: *"that is the whole
point of the pipeline"*.

`bugarach detect --settings <detector_settings.csv>` applies a calibration, and
`tools/settings_from_bakeoff.py` writes one out of a bake-off.

THE FORMAT WAS ALREADY SHARED AND NOBODY HAD NOTICED. `emit.read_detector_settings` has
parsed the browser's file and this module's file since it was written -- its docstring says
why, in terms: "two writers produce this file ... and a file only one of them can parse is a
second dialect of one table". What was missing was any caller on the way IN. So this is four
columns of plumbing, not a new format, and it works both directions from the first commit.

WHAT IT WAS HIDING, measured on the pilot APV+CNQX+GZ folder. At the calibration derived
from that cohort's own simulated data, rate+context makes 90% more calls than at its shipped
point, locust 105% more, LoCo 10% more. That is the distance between the instrument the
bench scored and the instrument that ran, and until now it could not be crossed from the
command line.

THREE REFUSALS, AND THEY ARE FINDINGS. Only three of the six calibrate cleanly on that
cohort. CoactDetect and binned SCE are refused because their folds disagreed -- a mean over a
knob grid is not a knob anyone ran. SPIKE-synch is refused because every fold landed on the
END of its grid, which bench.pick_operating_point already treats as a search that stopped
too early. The emitter names each and leaves them out, because a file carrying shipped values
for the uncalibrated detectors would read as a calibration of all six.

FOUR RULES IN THE READER, each because the alternative fails quietly. A file supplies a knob
and not the microscope, so grid_dt and imaging_rate_hz are recomputed from the recording
AFTER the override and skipped on the way in -- a file fitted on another rig cannot impose
that rig's frame interval. The fitted_ rows are provenance and reach run.json rather than a
detector, where they would be a TypeError. An unknown detector, an unknown parameter or an
uncoercible value is refused before the folder is walked, not on recording 84 of 85. And the
three nested ports refuse a per-stream divergence by name: they read the whole recording in
one RNG sequence, so there is no seam at which one stream's value could apply.

The round-trip test earned its place immediately: it failed on the first run because
detect writes grid_dt and imaging_rate_hz into its own settings file, so the file this
module wrote would not load back into it.

Also renamed the local settings dict to used_settings. It shadowed the new parameter and
worked only by statement order.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@syncytium2
syncytium2 merged commit 2305626 into main Sep 9, 2026
3 checks passed
@syncytium2
syncytium2 deleted the detect-reads-a-settings-file branch September 9, 2026 03:49
syncytium2 added a commit that referenced this pull request Sep 9, 2026
…pend what #507-509 bought (#512)

The full senktide (29) and TTX (38) cohorts, artifact-excluded, assessed at K = 10% of
each recording's ROI population floored at 3, simulated from their own baseline,
calibrated and trained on 72 held-out simulated recordings, detected at that calibration
with those trained models, and drawn as 24 pages -- twelve detectors x two treatments,
four group facets x two streams each.

Everything derived from the recordings is in the darkroom, per FOUNDATIONS §5. This
handoff is the pointer and carries no such number; the run record beside the artifacts
carries all of them.

WHAT IS DIFFERENT FROM THE PILOT is most of what mattered. Both of pipeline.md's blockers
closed yesterday and this run is the first to spend them: the six ran at a calibration
derived from this cohort's own simulated data rather than at shipped operating points, and
all six learned models ran from checkpoints in a separate process from training. Two more
things the pilot could not do: background heterogeneity was FITTED from the folder rather
than inherited -- eighty-four baselines where the pilot had six -- and the input was the
producer's artifact-excluded export rather than a folder nobody had scanned.

WHAT IT COST TO GET THERE is in #511: the newest export had been on disk six days with no
file in this repo naming it, K as a percentage had no floor, derive_spec could only work at
one absolute K, and the figure had no group facets and clipped its own fourth column.

THE EDGE-OF-GRID ASYMMETRY is filed rather than left in a transcript. `tube` is the best
learned model on this cohort and its deployed threshold sits at the top of the searched
grid. The coded branch treats that as a refusal in terms -- "an optimum at the edge is not
an optimum, it is the search telling you it stopped too early" -- and the learned branch
warns and ships. The todo does not assume which side is right: for a probability threshold
an edge may mean the model separates cleanly, and there is one measurement that tells the
two apart. Nobody has run it.

THE FIREFLIES NOTE IS MARKED AS A DRAFT AND MUST NOT BE SENT. It is addressed to another
team, which makes it a document deliverable, and it has not been reviewed or released.

Co-authored-by: richard defazio <defazio@umich.edu>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants