⚠ Under constructionThis page is live software still being built. Expect rough edges, and behavior that changes without notice.
Open a folderyour own recordings
Nothing is uploaded. Reading happens in this tab.
Assess coordinationno operating point
How much coordination is here, measured against a rate-matched null. Each ROI's own train is circularly shifted by its own random lag, which holds its rate and its burstiness and destroys only cross-ROI phase — so what survives is coordination beyond what the recording's rate explains.

K is a scan, not a choice. The floor for how many ROIs make an event moves the headline by an order of magnitude, so every K is shown and none is marked as the answer. Quoting one of these numbers means naming its K.

Baseline only. Coordination properties are not taken from a treatment — that is what the instrument is pointed at, and sourcing them from it assumes the answer. A recording with no declared regions is assessed whole, and it says so.
Confirm the eventsassess first
The machine proposes; you dispose. The assessment found moments where more ROIs fired together than its rate-matched null explains. Those are candidates, not findings — and every number the simulator is parameterised with is currently a median over candidates nobody looked at.

You are judging a sample, and that is deliberate. On this lab's own 84-recording folder there are 3,567 candidates at K=3 and still 641 at K=8, so nobody annotates them all. What a sample buys is an agreement rate: how much of what the machine proposed you believed. That rate scales the event frequency the simulator plants, and it is reported per K — so you read K off what you confirmed rather than picking it before looking.

At most a few per recording. One recording in this lab's folder carries 200 candidates where the median is 8. Uncapped, a sample spends your whole session on whichever recording is busiest and the agreement rate becomes a statement about that one slice.

Every verdict records what you were looking at — the time window, the ROI ordering, the stream — because a judgement is a property of the recording, the rendering and the observer together. A verdict without its view cannot be reproduced or disputed, and the file refuses to hold one.

"Can't tell" is a real answer. It is kept out of both sides of the agreement rate: a candidate you could not judge is evidence about the rendering, not about the candidate.
Simulate a folderno data needed
Baseline slices in this lab run 5.2–19.0 mHz per ROI, interquartile — and those are means. On an uneven background the typical ROI fires at about a fifth of the field's mean, so the two readings of this box are a factor of five apart and it has to say which it is.
Nothing here is a recording of anything. Event times are drawn from the model in bugarach.simulate, re-implemented for this page — same model, a different generator, so a seed reproduces in this browser and does not match Python's numbers.

The settings you land on are measured, not chosen. Rate, ROI count, participation and jitter come off 84 untreated slices, and every one of them used to be a guess that made coordination easier than it is — six ROIs with a third of a second of spread, not half the field firing together. The old guesses are on the switches, and worth a look.

The windows are labels, not effects. The statistics are identical inside and outside every one of them. Simulating a treatment would spend the effect the experiment exists to measure — so the drug is a name on the axis and nothing more.
Compare with the foldernothing simulated yet
Tune the settingssimulated only
The step that makes this a loop. The other three ask what is in a recording; this one asks whether the instrument reading it is any good. It sweeps one setting of each detector ticked above, holds the rest of their settings where the Detect step below has them, and scores every result against the events that were planted — so a number here is right or wrong rather than merely produced.

The tick list is this panel's own. Unticking a detector here does not remove it from what Detect runs, and vice versa: fitting an operating point and using one are separate decisions, and a sweep you skipped for cost is not a detector you stopped believing in.

Only on a folder this page invented, and that is the reason the simulate step exists. Your own recordings have no answer key: nobody knows which moments in them were coordinated, which is what the detector is for. Tune where the truth is known, then point the tuned instrument at the recordings where it is not.

A best value at the end of the range is not a best value. It is the sweep saying it stopped too early, and it is reported as that rather than as an answer — a boundary value has been published as a calibrated setting before. When it happens, that block offers to extend the grid past the end it hit and sweep again; the sweep range boxes above are the same thing done deliberately, before pressing Sweep.

Each detector has exactly one swept setting, and the range boxes do not change that. The other settings are held wherever the Detect step has them, so a sweep answers "what does this one knob do to these settings" — not "what is the best this detector can do". A grid that scores the same at every setting is that limit showing: the knob being swept is not what decides the answer, and no width of range will help.
Detect eventsRateDetect
The step above answers one question; this one produces the file. Every recording in the folder, every stream and every region the folder declared, with the detectors ticked above — one row per event per detector, with no consensus merging, because which detector fired is the information a merged row throws away. Until 2026-08-23 this ran all six whatever the tick list said, so the one control on the panel governed the picture and not the file.

A recording that produced nothing still appears. Not as a row — it has no events to write — but in the roster inside run.json. Absent rows are a finding and an absent recording is a bug, and a file where those two look alike cannot tell you which you are holding.

The sidecar is why this is usable in six months. Times alone do not say what produced them, so run.json carries the roster, the frame interval of each recording, and every detector's settings. It says null for the generator spec, the chosen K and the seeds when a folder came off disk rather than out of the simulate step — a question that was asked and had no answer, rather than one never asked.

These are detections, not events. The file records what six instruments called on your recordings at the settings currently set above. Nothing here has been scored against a known answer, because your recordings do not have one.

The loop, in the order you actually walk it. Assess a baseline → simulate from what you measured → compare the simulation with the recording → sweep a setting against the planted events → Save these settings → open your own folder → Load settings… → Detect. The two middle steps used to be a variable this page kept alive behind your back; they are a file now, and the file's name and its own rows say which data set it was fitted on. Opening a folder clears what was in the boxes, because a number fitted on one data set is not a fact about the next one.

A settings file names its stream, and will not be applied to another. The stream is chosen when the folder opens and one is in play at a time. Loading a file fitted on fast while slow is in play is refused with the reason, rather than quietly running a threshold on the signal it was not fitted for — FOUNDATIONS §9: coordination under TTX moves in opposite directions in the two streams, so this is a different answer and not a rougher one.
RateDetect asks how fast the population is firing. It flags moments when the pooled rate rises above its own local context — so a slice that fires steadily has no events, however tightly aligned it is.

Checked against the Python exactly. It draws no random numbers, so this browser copy is compared to the port the rest of the project cites at 1e-9 on every event it finds. A mistake here cannot pass as sampling noise.

The settings are what the project benches at, not what your preparation needs. Finding those is what the simulate step above is for: measure, simulate from what you measured, tune against planted events, then point the tuned instrument at everything.
Compare the detectors6 detectors

No recordings open yet.

A folder holds one .csv per recording with columns roi, time_sec and optionally stream; slices.csv and regions.csv are read for the frame interval and the treatment windows if they are there — the import contract has the whole of it.

A time_sec of NA means an ROI that was recorded and produced no event. Those ROIs are counted here, not dropped — they are the denominator of every per-ROI rate.

No folder to hand? The page will invent one — recordings written as that contract describes and read back through the same loader, so what you get is this page working rather than a picture of it.

First published 2026-08-13 · this version 2026-09-02 · identified by its own bytes rather than by a build stamp