LC output strength: Currier and Clandinin's input fraction¶
Introduction¶
Question¶
Which partners of an LC type are strong when strength is the share of the partner's input that the type supplies, as Currier and Clandinin define it?
Background¶
lc_output_strength_definitions compares strengths that count synapses: the heaviest connection from one cell of the type, and the sum over the cells of the type. Currier and Clandinin (2025) test how well the connectome predicts the visual responses of 91 cell types of the medulla. They call a connection strong by the share of the postsynaptic partner's input that it supplies, not by a count of synapses:
We began by calling a connection ‘‘strong’’ when it accounted for 5% or more of the postsynaptic partner’s total input (i.e., input fraction [%in] > 5%)
— Currier and Clandinin 2025, p. 4375 · PDF p. 4375 · 10.1016/j.cell.2025.05.007
They adopt it for a reason they cite from earlier studies:
Prior studies have determined that input fraction is a more reliable measure of connection strength than raw synapse counts
— Currier and Clandinin 2025, p. 4374 · PDF p. 4374 · 10.1016/j.cell.2025.05.007
They also place it against the usual cutoff on a count of synapses:
Many recent connectome analyses have established 5–10 synapses (or ⁓1% input fractions) as a ‘‘cutoff’’ for excluding the brain’s numerous weak connections.
— Currier and Clandinin 2025, p. 4378 · PDF p. 4378 · 10.1016/j.cell.2025.05.007
They call that cutoff conservative (p. 4378).
This notebook takes their rule and adjusts it to the partners of the four LC types:
- The paper's units are pairs of cell types, with the fraction averaged over the cells of the postsynaptic type (Methods, Figure S6). Here a unit is a type and one partner cell, because the project's strengths are per partner cell.
- The paper takes the connections of a male optic lobe connectome (Methods). Here the input of a partner is the sum of the weights of every connection onto it in the stored FlyWire connections, whichever cell it comes from.
- The paper's cutoff is
STRONG_FRACTION= 5%, and it tests 2% and 10%. This notebook uses the same three. - The paper's "strong input dominant" model predicts a response, and there is no response to predict here, so it is not used.
Expectations¶
- If every partner received the same input, the input fraction would be the sum of synapses over a constant, and the partners strong by input fraction would be the partners with the most synapses from the type. Partners differ in how much input they receive, so a partner with little input is strong with few synapses and a partner with much input needs many. The partners strong by input fraction and those strong by the heaviest connection (at
STRONG_SYN= 10 synapses) overlap, and each set has members the other lacks. - For the same reason, the synapses a partner needs to be strong by input fraction are not one number: they differ from partner to partner.
Load data¶
census = load_census()
sides = load_visual_types().select("root_id", "side")
proofread_ids = load_proofread_ids()
cells = cells_of_types(census, sides, TYPES_OF_INTEREST)
connections = with_pre_type(
load_connections_of([_id for _ids in cells.values() for _id in _ids]),
cells,
)
connections
| pre_pt_root_id | post_pt_root_id | weight | pre_type |
|---|---|---|---|
| i64 | i64 | i64 | str |
| 720575940603578848 | 720575940381391499 | 1 | "LC11" |
| 720575940603578848 | 720575940381415307 | 1 | "LC11" |
| 720575940603578848 | 720575940381421195 | 1 | "LC11" |
| 720575940603578848 | 720575940381425291 | 1 | "LC11" |
| 720575940603578848 | 720575940381433227 | 1 | "LC11" |
| … | … | … | … |
| 720575940659229057 | 720575940649865718 | 1 | "LC11" |
| 720575940659229057 | 720575940650149753 | 2 | "LC11" |
| 720575940659229057 | 720575940651404278 | 2 | "LC11" |
| 720575940659229057 | 720575940653346038 | 2 | "LC11" |
| 720575940659229057 | 720575940661134465 | 1 | "LC11" |
The input fraction of each partner¶
For a type \(T\) and a partner cell \(j\), let \(w(i \to j)\) be the number of synapses from cell \(i\) to \(j\). The input fraction of \(j\) from \(T\) is the synapses that the cells of \(T\) send to \(j\) over all the synapses that \(j\) receives, from any cell \(k\) that connects to it:
The numerator is \(s_{\mathrm{sum}}\) of the parent notebook, the column synapses. with_input_fraction adds the denominator as input and the ratio as input_fraction. A partner is strong when \(f(T \to j)\) is at least STRONG_FRACTION. The table keeps the proofread partners that are not LC cells, as the parent notebook does. The column s is the heaviest single connection, \(s_{\mathrm{max}}\).
_partners = labeled_partners(
connections, census, proofread_ids, lateral_pattern=config.LATERAL
)
_inputs = load_connections_of(_partners["partner"].to_list(), end="post")
proofread_partners = proofread_nonlateral(
with_input_fraction(_partners, _inputs)
)
proofread_partners
| type | partner | s | source | synapses | cells | partner_type | proofread | lateral | input | input_fraction |
|---|---|---|---|---|---|---|---|---|---|---|
| str | i64 | i64 | i64 | i64 | u32 | str | bool | bool | i64 | f64 |
| "LC10a" | 720575940602964140 | 1 | 720575940630500394 | 2 | 2 | "SAD007" | true | false | 324 | 0.006173 |
| "LC10a" | 720575940604016608 | 1 | 720575940622950663 | 1 | 1 | "LPLC1" | true | false | 2386 | 0.000419 |
| "LC10a" | 720575940604030176 | 1 | 720575940625442306 | 1 | 1 | "LTe48" | true | false | 1945 | 0.000514 |
| "LC10a" | 720575940604121004 | 1 | 720575940626505349 | 1 | 1 | "LLPC1" | true | false | 731 | 0.001368 |
| "LC10a" | 720575940604188384 | 1 | 720575940628687354 | 1 | 1 | "Tm5c" | true | false | 218 | 0.004587 |
| … | … | … | … | … | … | … | … | … | … | … |
| "LC9" | 720575940660758401 | 1 | 720575940605318880 | 1 | 1 | "Li08" | true | false | 445 | 0.002247 |
| "LC9" | 720575940661134465 | 2 | 720575940612627106 | 4 | 3 | "Li06" | true | false | 591 | 0.006768 |
| "LC9" | 720575940661244033 | 2 | 720575940624740185 | 2 | 1 | "TmY15" | true | false | 1009 | 0.001982 |
| "LC9" | 720575940661318017 | 2 | 720575940617836117 | 5 | 3 | "LLPC3" | true | false | 772 | 0.006477 |
| "LC9" | 720575940661327745 | 1 | 720575940610230738 | 1 | 1 | "LTe09" | true | false | 366 | 0.002732 |
Strong by either rule¶
The table counts, for each type, the partners that are strong by input fraction (STRONG_FRACTION), by the heaviest connection (STRONG_SYN), by both, and by one only.
_by_fraction = pl.col("input_fraction") >= STRONG_FRACTION
_by_weight = pl.col("s") >= STRONG_SYN
strong_counts = proofread_partners.group_by(
"type", maintain_order=True
).agg(
partners=pl.len(),
median_input=pl.col("input").median(),
by_fraction=_by_fraction.sum(),
by_s_max=_by_weight.sum(),
both=(_by_fraction & _by_weight).sum(),
fraction_only=(_by_fraction & ~_by_weight).sum(),
s_max_only=(~_by_fraction & _by_weight).sum(),
)
strong_counts
| type | partners | median_input | by_fraction | by_s_max | both | fraction_only | s_max_only |
|---|---|---|---|---|---|---|---|
| str | u32 | f64 | u32 | u32 | u32 | u32 | u32 |
| "LC10a" | 1733 | 778.0 | 106 | 85 | 67 | 39 | 18 |
| "LC11" | 3127 | 633.0 | 126 | 132 | 75 | 51 | 57 |
| "LC16" | 2113 | 704.0 | 57 | 35 | 28 | 29 | 7 |
| "LC9" | 2727 | 708.0 | 75 | 85 | 61 | 14 | 24 |
Each panel draws the partners of one type by the synapses the type sends them and the synapses they receive. The solid line is STRONG_FRACTION and the dashed lines the other cutoffs, so the partners above the solid line are strong by input fraction (in the color of the type) and the rest are gray. A ring marks a partner that is strong by the heaviest connection. A partner with more input sits further right, so the same number of synapses is a smaller fraction of it.
figure = input_fraction_figure(
proofread_partners,
TYPES_OF_INTEREST,
cutoff_fraction=STRONG_FRACTION,
cutoff_weight=STRONG_SYN,
)
figure.savefig(figure_path("lc_input_fraction.png"), dpi=150)
figure

Synapses at each cutoff¶
A cutoff on the input fraction asks for a different number of synapses from each partner. For each cutoff, the table gives the strong partners of each type and the median and the smallest number of synapses the type sends them.
_rows = [
proofread_partners.filter(pl.col("input_fraction") >= _cutoff)
.group_by("type", maintain_order=True)
.agg(
cutoff=pl.lit(_cutoff),
strong_partners=pl.len(),
median_synapses=pl.col("synapses").median(),
fewest_synapses=pl.col("synapses").min(),
)
for _cutoff in FRACTION_CUTOFFS
]
synapses_at_cutoff = pl.concat(_rows).sort("type", "cutoff")
synapses_at_cutoff
| type | cutoff | strong_partners | median_synapses | fewest_synapses |
|---|---|---|---|---|
| str | f64 | u32 | f64 | i64 |
| "LC10a" | 0.02 | 146 | 103.5 | 1 |
| "LC10a" | 0.05 | 106 | 166.5 | 11 |
| "LC10a" | 0.1 | 74 | 262.0 | 14 |
| "LC11" | 0.02 | 274 | 34.5 | 3 |
| "LC11" | 0.05 | 126 | 154.5 | 10 |
| … | … | … | … | … |
| "LC16" | 0.05 | 57 | 208.0 | 21 |
| "LC16" | 0.1 | 41 | 302.0 | 90 |
| "LC9" | 0.02 | 122 | 161.0 | 1 |
| "LC9" | 0.05 | 75 | 244.0 | 4 |
| "LC9" | 0.1 | 48 | 319.5 | 38 |
Discussion¶
Expectation 1: the two sets overlap, and each has members the other lacks. Every type has partners strong by both rules and partners strong by one only (Strong by either rule). The partners strong by input fraction only number 14 (LC9) to 51 (LC11), and those strong by the heaviest connection only number 7 (LC16) to 57 (LC11). The figure shows the cause. A partner with little input is strong by input fraction with few synapses from the type, at the left of each panel. A partner with much input can have a heavy connection and still receive a small share of its input from the type, so it is ringed and below the solid line.
Expectation 2: the synapses a strong partner receives differ. At STRONG_FRACTION, the fewest synapses a strong partner receives from the type ranges from 4 (LC9) to 21 (LC16), and the median ranges from 154.5 (LC11) to 244.0 (LC9). Raising the cutoff raises both (Synapses at each cutoff). A cutoff on the input fraction is therefore not a cutoff on synapses in disguise: a partner with little input can pass it with a handful of synapses.
Limitations¶
- The input of a partner is the sum of the weights of the stored connections onto it. It is not checked against a count of the partner's postsynapses, which the paper's input fraction divides by.
- The fraction is taken per partner cell. The paper averages it over the cells of the postsynaptic type, so a type whose cells differ in input could be strong in one form and not the other.
- The table keeps proofread partners that are not LC cells. The effect of that choice is shown for the synapse-count strengths in the parent notebook and is not repeated here.
- The paper supports the cutoff with the responses of medulla neurons. Nothing here tests that a partner strong by input fraction is functionally special in the central brain.
Open questions¶
- Does the input fraction change the verdict of
lc_pathwayson convergence? Test: repeat its overlap of strong partners with the strong sets from this notebook at each cutoff. The question is refuted if the verdict is the same at all three. - Do the paper's type-level fractions pick the same partners as the per-cell fractions? Test: average the input fraction over the cells of each partner type and compare the strong sets. The question is refuted if the sets are the same.