chris@schmid:~$
← ./blog

article

I Simulated a Fly's Escape Reflex on Its Real Wiring, Then Started Cutting Neurons

PythonNeuroscienceConnectomicsSimulation

Google and HHMI Janelia just shipped the largest, most complete nervous system ever mapped in an animal — one fruit fly, 166,700 neurons, 125 million synapses, brain to nerve cord, fully wired. Very “what if this is all a simulation” energy. So instead of reading the papers, I pulled the wires.

The circuit

Buried in that dataset (male-cns:v1.0, released September 2026) is the fly’s actual bullet-time reflex: two visual neuron types — LC4, which encodes how fast something is approaching, and LPLC2, which encodes how big it already looks — both synapsing directly onto a single giant fiber neuron that triggers the jump-and-flight escape response. It’s one of the best-characterized circuits in neuroscience (Ache et al. 2019, Current Biology), and now it’s fully reconstructed at the synapse level for both a male fly and, via the matching hemibrain:v1.2.1 dataset, a female one reconstructed almost a decade earlier.

I pulled the real connectivity for both sexes straight from neuPrint — not approximated:

male (male-cns:v1.0) female (hemibrain:v1.2.1)
LC4 neurons 126 71
LPLC2 neurons 185 85
Giant fiber 2 1
real synaptic connections 20,684 9,503

Running the wiring, not training a model

The simulator (sim/circuit.py) is a small leaky-integrate-and-fire network. Synapse counts between two real neurons become a normalized connection weight; LC4 and LPLC2 — which have no incoming synapses in this circuit — are treated as graded input sources, everything downstream is a standard spiking unit driven by that weighted input:

totals = raw.sum(axis=1, keepdims=True)
is_source = totals.flatten() == 0
totals[totals == 0] = 1.0
weights = (raw / totals) * SYNAPSE_GAIN

No training, no gradient descent, no learned parameters anywhere — just the source code of a real nervous system, executing.

The real question

Deleting an entire neuron type is a trivial result; of course a fly can’t dodge with no eyes. The actual question is how much of the population you can lose before it matters — so analysis/dose_response.py randomly silences a growing fraction of real LC4 or LPLC2 neurons (each one an individually-wired real cell, not a synthetic average) and measures escape probability across 15 random subsets × 30 predator speeds, for both sexes:

% of population silenced male LC4 male LPLC2 female LC4 female LPLC2
0% (intact) 88% 83% 100% 100%
5% 9% 10% 0% 7%
10% 1% 0% 0% 0%

The cliff, not a slope

Silencing 1 in 20 real neurons in either population collapses escape probability by 80–90%. By 1 in 10, it’s gone almost entirely — in both independently-reconstructed sexes, built from datasets a decade apart. Hundreds of millions of years turning this reflex into evolution’s own bullet-time, and the actual margin for error is “please don’t lose 1 neuron in 20.” There’s no rerouting, no graceful degradation, no moment where the circuit finds another path — the wiring is the program, and cutting it just stops the program from running.

I didn’t train anything. I executed code that already existed, in a working nervous system, and watched its dodge glitch out and fail to load.

Source: github.com/chris017/fly-connectome-escape-circuit