Reproducing Li, Daie, Svoboda and Druckmann (2016) from dandiset 000011¶
Paper. Li N, Daie K, Svoboda K, Druckmann S (2016). Robust neuronal dynamics in premotor cortex
during motor planning. Nature 532, 459-464.
doi:10.1038/nature17643. The claims file
(claims/000011/10.1038-nature17643.yaml) was written from the HHMI author manuscript in PubMed
Central (PMC5081260): main text, Methods and the legends of Figures 1 to 6 and Extended Data
Figures 1 to 10. The Corrigendum (doi:10.1038/nature18623) was not read.
Dandiset. DANDI:000011, version 0.220126.1907. The paper cites no DANDI version (its data statement points to CRCNS, doi:10.6080/K0RB72JW), so the most recent published version is pinned. It is the only published version. The draft lists the same 92 assets with the same total size (32,435,325,542 bytes); its metadata was modified later (2026-02-12), which the analysis does not use.
What the dandiset holds (shown in the data check below). 91 extracellular files of 19 mice and one empty behaviour file. 58 sessions of 12 mice are the control-mouse recordings of the paper (experiment 1, unilateral photoinhibition, 20 sessions of 4 mice; experiments 2 and 3, bilateral photoinhibition, 38 sessions of 7 and 3 mice). 33 sessions of 7 other mice have no photostimulus record; their subjects and delay match the callosotomy experiment. The behavioural photoinhibition experiments without recordings, the photoactivation mice and the untrained mice used to map photoinhibition are not in the dandiset.
| claim | tested or blocked |
|---|---|
| unit-classification | tested |
| selective-fraction | tested |
| fig1d-late-delay-ipsilateral-bias | blocked: data_missing |
| fig1d-earlier-photoinhibition-minimal | blocked: data_missing |
| ed3-behaviour-recovery-interval | blocked: data_missing |
| ed4-return-to-trajectory | tested |
| fig1f-spike-rate-recovery | tested |
| fig1g-selectivity-recovery | tested |
| ed5-photoactivation-recovery | blocked: data_missing |
| ed5-photoactivation-rate-changes | blocked: data_missing |
| ed2b-silencing-strength | tested |
| ed2d-spatial-extent | blocked: data_missing |
| ed2e-no-rebound | tested |
| fig2b-unilateral-performance | blocked: data_missing |
| fig2b-bilateral-performance | blocked: data_missing |
| ed6a-bilateral-inconsistent-bias | tested |
| fig2-recordings-recovery | tested |
| fig2e-selectivity-recovery-times | tested |
| ed7-larger-photoinhibition | tested |
| ed7e-roc-larger-photoinhibition | tested |
| cd-stable-over-epochs | tested |
| cd-captures-selectivity | tested |
| fig3c-cd-recovery-roc | tested |
| ed8-roc-during-photoinhibition | tested |
| fig3c-cd-predicts-movement | tested |
| fig3d-persistent-mode | tested |
| fig3e-ramping-mode | tested |
| fig4-bilateral-cd-predicts-movement | tested |
| ed6b-session-bias-predicted | tested |
| ed9f-reaction-time | blocked: data_missing (analysis run) |
| ed9c-cd-window-robust | tested |
| fig5b-callosotomy-control-performance | blocked: data_missing |
| fig5b-callosotomy-unilateral-sensitivity | blocked: metadata_insufficient |
| ed10-callosotomy-preparatory-activity | blocked: metadata_insufficient |
| fig5-callosotomy-no-recovery | blocked: metadata_insufficient |
| fig5f-callosotomy-cd-reduced | blocked: metadata_insufficient |
| ed1-monolithic-models-fail | tested (simulation) |
| fig6-modular-models-recover | tested (simulation) |
Readings. Where the claims file lists readings of a detail, each is run, and a claim is
reproduced when it holds under one of them, as its criterion says. Ten questions were asked about
details the claims file did not give (questions/000011.yaml). A reader answered them on
2026-10-21: the paper gives none of them, and the claims file now names readings for each. For most,
the readings are method details whose outcomes must agree, else the claim is blocked as
methods_underspecified: lick-early trials dropped (K1) or kept (K2) in every neural analysis; the
spike counts that set a neuron's preferred trial type (D1 the whole trial, D2 the delay epoch, D3
each bin), the time that labels a bin (L1 its centre, L2 its end) and how far the search for
recovery runs (E1 to the go cue, E2 to 1.6 s after it); the selection test and bin of ed4 (s1, s2,
t1, t2); the Fisher table of ed6a (f1, f2); the trials whose average cd-captures-selectivity
decomposes (v1, v2); the sign of the ramping mode (g1, g2); the noise and step of the modular
attractor (n1, n2, h1, h2); and the lick threshold of ed9f. Two answers fix a reading: trials are
counted per condition for convention D (N1) and for convention A (T1), and counting per condition
and trial type (N2, T2) is shown as a variant. Each section says what its answer changed.
First verification round. A verifier reviewed the attempt on 2026-10-21. In reply, the notebook
adds the outputs it asked for (upsampled spike widths, the size of the lick-early artefact under
K2, per-neuron trial counts and epoch selectivity of the included populations, per-session ROC of
modes 2 and 4, raw lick-trace summaries and example traces, raw levels above the experiment-2
baseline, experiment-3 behaviour and the ed9f test on experiment 3, and the ed10 counts on all
trials), and three outcomes changed: selective-fraction and ed2b-silencing-strength are not
reproduced (partial before), and cd-stable-over-epochs is blocked as methods_underspecified
(reproduced before), as the trials that give w are not fixed. Three new questions were asked
(questions/000011.yaml).
import os
os.environ.setdefault("OMP_NUM_THREADS", "1")
os.environ.setdefault("OPENBLAS_NUM_THREADS", "1")
import itertools
import time
import warnings
import h5py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import remfile
from scipy import stats
import li2016 as L
pd.set_option("display.width", 220)
pd.set_option("display.max_columns", 40)
pd.set_option("display.max_rows", 300)
warnings.filterwarnings("ignore", category=RuntimeWarning)
# LOAD: stream every file of the pinned version (trials, units, photostimulus record)
started = time.time()
assets, results = L.load_all()
S, U = L.assemble(results)
print(f"loaded {len(results)} extracellular files of dandiset {L.DANDISET} version {L.VERSION} in {time.time() - started:.0f} s")
loaded 91 extracellular files of dandiset 000011 version 0.220126.1907 in 140 s
Data check¶
print("Assets in the version:", len(assets))
print(assets.assign(kind=np.where(assets.path.str.contains("ecephys"), "behavior+ecephys+ogen", "behavior only"))
.groupby("kind").size().to_string())
# The one behaviour-only file: list everything it holds besides the format specification
beh = assets[~assets.path.str.contains("ecephys")].iloc[0]
with h5py.File(remfile.File(L.s3_url(beh.asset_id)), "r") as f:
items = []
f.visititems(lambda n, o: items.append((n, getattr(o, "shape", None))) if not n.startswith("specifications") else None)
print(f"\n{beh.path}: {len(items)} objects outside /specifications")
for n, sh in items:
print(" ", n, sh if sh is not None else "(group)")
Assets in the version: 92 kind behavior only 1 behavior+ecephys+ogen 91
sub-255200/sub-255200_ses-20140910_behavior.nwb: 25 objects outside /specifications acquisition (group) acquisition/BehavioralEvents (group) analysis (group) file_create_date (1,) general (group) general/experiment_description () general/experimenter (1,) general/institution () general/keywords (5,) general/related_publications (1,) general/subject (group) general/subject/description () general/subject/genotype () general/subject/sex () general/subject/species () general/subject/subject_id () general/virus () identifier () processing (group) session_description () session_start_time () stimulus (group) stimulus/presentation (group) stimulus/templates (group) timestamps_reference_time ()
ses = pd.DataFrame([{"sid": s["sid"], "subject": s["subject"], "genotype": "VGAT" if "VGAT" in s["genotype"] else "PV x ReaChR",
"experiment": s["exp"], "trials": len(s["trials"]),
"behaving_trials": int(s["trials"].behaving.sum()),
"units": int((U.sid == s["sid"]).sum()), "sites": ",".join(s["meta"]["sites"]),
"trials_overlapping": s["meta"]["trials_overlapping"]} for s in S.values()])
by_subject = ses.groupby(["subject", "genotype"]).agg(sessions=("sid", "size"), experiments=("experiment", lambda x: ",".join(sorted(set(x)))),
units=("units", "sum")).reset_index()
print(by_subject.to_string(index=False))
grp = ses.assign(group=np.where(ses.experiment == "no_photostim_record", "no photostimulus record", "control mice"))
print("\nSessions, mice and units by group:")
print(grp.groupby("group").agg(sessions=("sid", "size"), mice=("subject", "nunique"), units=("units", "sum")).to_string())
print("\nSessions by experiment:")
print(ses.groupby("experiment").agg(sessions=("sid", "size"), mice=("subject", "nunique"), units=("units", "sum")).to_string())
print("\nGenotypes of the control mice:", grp[grp.group == "control mice"].groupby("genotype").subject.nunique().to_dict())
print("Genotypes of the mice without a photostimulus record:", grp[grp.group != "control mice"].groupby("genotype").subject.nunique().to_dict())
print("\nPaper (Methods): 58 sessions (20 unilateral, 38 bilateral) of 12 mice (5 VGAT, 7 PV x ReaChR);"
" callosotomy 7 mice (6 VGAT, 1 PV x ReaChR); Extended Data Fig. 2b: experiment 1 from 6 mice,"
" experiment 2 from 7, experiment 3 from 3.")
subject genotype sessions experiments units
255200 PV x ReaChR 7 exp1,exp1_unlabelled 81
255201 PV x ReaChR 6 exp1,exp2 110
255203 PV x ReaChR 5 exp1 97
257636 VGAT 5 exp3 43
257637 VGAT 3 exp2 51
257772 PV x ReaChR 6 exp1,exp2 117
258250 VGAT 4 exp2 61
263808 PV x ReaChR 6 exp2 130
263810 PV x ReaChR 6 exp2 97
264411 VGAT 3 exp2 46
270337 PV x ReaChR 3 exp3 73
270340 VGAT 5 no_photostim_record 63
273657 VGAT 4 exp3 73
278733 VGAT 6 no_photostim_record 151
291063 VGAT 4 no_photostim_record 36
291064 VGAT 4 no_photostim_record 58
297634 PV x ReaChR 5 no_photostim_record 73
298738 VGAT 5 no_photostim_record 138
298740 VGAT 4 no_photostim_record 45
Sessions, mice and units by group:
sessions mice units
group
control mice 58 12 979
no photostimulus record 33 7 564
Sessions by experiment:
sessions mice units
experiment
exp1 17 4 273
exp1_unlabelled 3 1 47
exp2 26 7 470
exp3 12 3 189
no_photostim_record 33 7 564
Genotypes of the control mice: {'PV x ReaChR': 7, 'VGAT': 5}
Genotypes of the mice without a photostimulus record: {'PV x ReaChR': 1, 'VGAT': 6}
Paper (Methods): 58 sessions (20 unilateral, 38 bilateral) of 12 mice (5 VGAT, 7 PV x ReaChR); callosotomy 7 mice (6 VGAT, 1 PV x ReaChR); Extended Data Fig. 2b: experiment 1 from 6 mice, experiment 2 from 7, experiment 3 from 3.
The subjects split in two groups. 12 mice (5 VGAT-ChR2-EYFP, 7 PV x ReaChR) with 58 sessions are the control mice of the paper: their counts match the Methods. The 33 sessions of the 7 other mice (6 VGAT, 1 PV x ReaChR) have no photostimulus record at all; the genotype counts and the 1.7 s delay match the callosotomy experiment, but no file says these mice were callosotomised (the subject description holds only the JAX strains). Experiment 1 holds 4 mice here, where Extended Data Fig. 2b gives 6. Three experiment-1 sessions of mouse 255200 have no photostimulus record either. The behaviour-only file holds only metadata.
rows = []
for s in S.values():
tr = s["trials"]
b = tr[tr.behaving]
ne = b[~b.early_lick]
rows.append({"experiment": s["exp"], "sid": s["sid"], "behaving": len(b), "early_lick": int(b.early_lick.sum()),
"sample_s_median": np.median(ne.delay - ne["sample"]) if len(ne) else np.nan,
"delay_s_median": np.median(ne.go - ne.delay) if len(ne) else np.nan,
"delay_off_nominal_noearly": int((abs((ne.go - ne.delay) - np.median(ne.go - ne.delay)) > 0.05).sum()) if len(ne) else 0,
"delay_off_nominal_early": int((abs((b[b.early_lick].go - b[b.early_lick].delay) - np.median(ne.go - ne.delay)) > 0.05).sum()) if len(ne) else 0,
**{o: int((b.outcome == o).sum()) for o in ["hit", "miss", "ignore"]},
"non_performing": int((tr.outcome == "non-performing").sum()),
"trials_overlapping": s["meta"]["trials_overlapping"]})
tt = pd.DataFrame(rows)
print("Behaving trials (sample, delay and go events and an outcome); session 258250_20141202 is set to none (below).")
print(tt.groupby("experiment").agg(sessions=("sid", "size"), behaving=("behaving", "sum"), early_lick=("early_lick", "sum"),
hit=("hit", "sum"), miss=("miss", "sum"), ignore=("ignore", "sum"), non_performing=("non_performing", "sum"),
sample_s=("sample_s_median", lambda x: f"{x.min():.2f}-{x.max():.2f}"),
delay_s=("delay_s_median", lambda x: f"{x.min():.2f}-{x.max():.2f}"),
off_nominal_noearly=("delay_off_nominal_noearly", "sum"),
off_nominal_early=("delay_off_nominal_early", "sum")).to_string())
print("\nSessions whose trials overlap in time:")
print(tt[tt.trials_overlapping > 0][["sid", "trials_overlapping"]].to_string(index=False))
bad = S["258250_20141202"]["trials"]
print("\n258250_20141202, trial ids in time order (first 30 behaving or not):", bad.trial_id.values[:30].tolist())
print("task and protocol values over all files:", sorted(set(np.concatenate([s["trials"].task.unique() for s in S.values()]))),
sorted(set(np.concatenate([s["trials"].protocol.unique() for s in S.values()]))))
Behaving trials (sample, delay and go events and an outcome); session 258250_20141202 is set to none (below).
sessions behaving early_lick hit miss ignore non_performing sample_s delay_s off_nominal_noearly off_nominal_early
experiment
exp1 17 4461 787 3453 925 83 990 1.30-1.30 1.30-1.30 0 214
exp1_unlabelled 3 830 78 618 203 9 134 1.30-1.30 1.30-1.30 0 4
exp2 26 6744 1467 4757 1908 79 1240 1.30-1.30 1.70-1.70 0 454
exp3 12 3236 410 2454 732 50 484 1.30-1.30 1.70-1.70 0 115
no_photostim_record 33 7306 1388 4800 2288 218 2633 1.30-1.30 1.70-1.70 0 302
Sessions whose trials overlap in time:
sid trials_overlapping
255200_20140910 1
255200_20140913 2
258250_20141202 98
258250_20141202, trial ids in time order (first 30 behaving or not): [1, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133]
task and protocol values over all files: ['audio delay'] [np.int32(1)]
In every session the sample epoch (pole onset to delay onset) lasts 1.3 s and the delay 1.3 s (experiment 1) or 1.7 s (experiments 2, 3 and the sessions without a photostimulus record), as the Methods say, in trials without an early lick. In early-lick trials the delay restarts, so their delay differs from the nominal one. Session 258250_20141202 holds two interleaved sequences of trial ids whose times overlap (98 overlapping pairs), so its trial events cannot be assigned to trials; it is left out of every trial-based analysis and its units are counted only. Two sessions of mouse 255200 have one or two overlapping pairs and are kept. The trial table has no column for the photostimulus: conditions are read from the laser record below.
ps = []
for s in S.values():
m = s["meta"]
if not m["sites"]:
continue
tr = s["trials"]
ps.append({"sid": s["sid"], "experiment": s["exp"], "events": m["ps_events"], "events_without_time": m["ps_events_nan_time"],
"laser_chunks": sum(m[f"chunks_{x}"] for x in m["sites"]),
"chunks_outside_trials": sum(m[f"chunks_outside_{x}"] for x in m["sites"]),
"chunk_trials_without_event": int((tr.ps_site.notna() & tr.ps_on.isna()).sum()),
"of_them_behaving": int((tr.ps_site.notna() & tr.ps_on.isna() & tr.behaving).sum()),
"event_trials_without_chunk": int((tr.ps_site.isna() & tr.ps_on.notna()).sum()),
"samples_per_chunk": {x: m[f"samples_{x}"] / m[f"chunks_{x}"] for x in m["sites"]}})
ps = pd.DataFrame(ps)
print(ps.drop(columns="samples_per_chunk").groupby("experiment").sum(numeric_only=True).to_string())
print("Samples per laser chunk (all sites, all sessions):", sorted(set(v for d in ps.samples_per_chunk for v in d.values())))
print("Sessions with event trials lacking a laser chunk:", ps[ps.event_trials_without_chunk > 0][["sid", "event_trials_without_chunk"]].values.tolist())
shape = []
for s in S.values():
for k, v in s["meta"].items():
if k.startswith("shape_"):
shape.append({"experiment": s["exp"], "site": k[6:], "mean_mW": round(v[0], 2), "cv": round(v[1], 2)})
shape = pd.DataFrame(shape)
print("\nLaser power 0.1-0.5 s after onset (mW) in the first trial of each site and session:")
print(shape.groupby(["experiment", "site"]).agg(sessions=("cv", "size"), mean_mW=("mean_mW", lambda x: f"{x.min()}-{x.max()}"),
cv=("cv", lambda x: f"{x.min()}-{x.max()}")).to_string())
allt = pd.concat([s["trials"].assign(experiment=s["exp"], sid=s["sid"]) for s in S.values() if s["meta"]["sites"]], ignore_index=True)
light = allt[allt.ps_on.notna()]
print("\nPeak power of photostimulus events (mW), counts:", np.histogram(light.ps_power, bins=[0, 1, 2.5, 3.5, 5, 7, 11, 14])[0].tolist(),
"for bins [0, 1, 2.5, 3.5, 5, 7, 11, 14]")
events events_without_time laser_chunks chunks_outside_trials chunk_trials_without_event of_them_behaving event_trials_without_chunk
experiment
exp1 1985 162 1985 0 162 0 0
exp2 2898 157 2881 0 168 0 17
exp3 1329 80 1329 0 80 0 0
Samples per laser chunk (all sites, all sessions): [50000.0]
Sessions with event trials lacking a laser chunk: [['258250_20141202', 8], ['263810_20150121', 9]]
Laser power 0.1-0.5 s after onset (mW) in the first trial of each site and session:
sessions mean_mW cv
experiment site
exp1 left 17 1.34-1.35 1.04-1.05
exp2 bilateral 26 12.55-12.67 0.0-0.02
left 26 1.53-1.55 0.96-0.97
right 26 1.53-1.55 0.96-0.97
exp3 bilateral 12 3.11-3.21 0.0-0.05
left 12 1.53-6.33 0.0-0.97
right 12 1.53-6.33 0.0-0.97
Peak power of photostimulus events (mW), counts: [77, 0, 417, 3661, 418, 0, 1220] for bins [0, 1, 2.5, 3.5, 5, 7, 11, 14]
The photostimulus of a trial is recorded twice: as photostim_start_time and
photostim_stop_time events (the event value is the peak power, mW) and as 5 s chunks of the laser
power and AOM traces (10 kHz, 50,000 samples per chunk), one chunk per photostimulus trial, in one
series per site (left, right, bilateral). The chunks give the site; the events give the time. The
two agree trial by trial: every event with a time has a chunk except in two sessions, and the
chunks without an event fall in non-performing trials. Event values below 1 mW (77 events) are
kept apart as no_light. The traces separate the protocols of the Methods: a 40 Hz sinusoid of
1.5 mW average for one spot, and a constant power of 1.5 mW per spot when the beam is scanned
(3.1 mW for one spot per side, 6.1 mW for four spots on one side, 12.6 mW for four spots per
side). Experiment 2 sessions use one spot left or right and eight spots bilaterally; experiment 3
sessions use two spots bilaterally (one per side) and four spots left or right, or one spot left
or right in 6 of its 12 sessions.
lab = allt[allt.behaving & ~allt.early_lick]
print("Behaving trials without an early lick, by experiment and condition:")
print(pd.crosstab(lab.cond, lab.experiment).to_string())
lp = lab[lab.ps_on.notna() & ~lab.cond.isin(["no_light", "ps_unknown"])]
print("\nLight onset and offset re go cue (s), and duration, by condition (trials without an early lick):")
print(lp.groupby(["experiment", "cond"]).agg(n=("ps_on", "size"), onset=("ps_on_re_go", lambda x: f"{x.min():.3f} to {x.max():.3f}"),
offset=("ps_off_re_go", lambda x: f"{x.min():.3f} to {x.max():.3f}"),
duration=("ps_off", lambda x: "")).drop(columns="duration").to_string())
print("Light duration (s), all conditions:", np.unique(np.round(lp.ps_off - lp.ps_on, 3)).tolist())
print("Onset re delay onset (s) in experiments 2 and 3:", np.unique(np.round((lp.ps_on - lp.delay)[lp.experiment != 'exp1'], 3)).tolist())
print("Fraction of behaving trials with light, per session (control sessions):",
allt[allt.behaving].groupby("sid").apply(lambda d: (~d.cond.isin(["control"])).mean()).describe().round(2).to_dict())
Behaving trials without an early lick, by experiment and condition:
experiment exp1 exp2 exp3
cond
bilateral2 0 0 435
bilateral8 0 958 0
control 2159 3216 1703
early_delay 497 0 0
late_delay 527 0 0
left1 0 549 167
left4 0 0 195
ps_unknown 0 5 0
right1 0 549 156
right4 0 0 170
sample 491 0 0
Light onset and offset re go cue (s), and duration, by condition (trials without an early lick):
n onset offset
experiment cond
exp1 early_delay 497 -1.300 to -1.300 -0.800 to -0.800
late_delay 527 -0.800 to -0.800 -0.300 to -0.300
sample 491 -2.100 to -2.100 -1.600 to -1.600
exp2 bilateral8 958 -1.700 to -1.700 -0.900 to -0.900
left1 549 -1.700 to -1.700 -0.900 to -0.900
right1 549 -1.700 to -1.700 -0.900 to -0.900
exp3 bilateral2 435 -1.700 to -1.700 -0.900 to -0.900
left1 167 -1.700 to -1.700 -0.900 to -0.900
left4 195 -1.700 to -1.700 -0.900 to -0.900
right1 156 -1.700 to -1.700 -0.900 to -0.900
right4 170 -1.700 to -1.700 -0.900 to -0.900
Light duration (s), all conditions: [0.5, 0.8]
Onset re delay onset (s) in experiments 2 and 3: [0.0, 0.001]
Fraction of behaving trials with light, per session (control sessions): {'count': 54.0, 'mean': 0.4, 'std': 0.03, 'min': 0.34, '25%': 0.37, '50%': 0.4, '75%': 0.42, 'max': 0.52}
Experiment 1 holds three conditions, 0.5 s of light ending 1.6 s (sample), 0.8 s (early delay) and 0.3 s (late delay) before the go cue. This settles the naming question of the claims file (convention T): the recorded "late delay" condition ends 0.3 s before the go cue (the Methods' naming); the condition ending at the go cue (the Results' "late delay" of Fig. 1d) is not in the recordings. Experiments 2 and 3 have 0.8 s of light from delay onset. The stop event is 0.5 s or 0.8 s after the start event, so it marks the end of the ramp, the offset the claims file uses.
# Event time against the light in the trace: two sessions read in full
for sid in ["255200_20140913", "263808_20150121"]:
s = S[sid]; tr = s["trials"]
aid = assets[assets.path == s["path"]].asset_id.iloc[0]
rows = []
with h5py.File(remfile.File(L.s3_url(aid)), "r") as f:
for site in s["meta"]["sites"]:
g = f[f"/stimulus/presentation/{site} ALM_laser_power"]
d, ts = g["data"][:], g["timestamps"][:]
for r in tr[(tr.ps_site == site) & tr.ps_on.notna() & tr.behaving].itertuples():
c = int(r.ps_chunk); seg = d[c * 50000:(c + 1) * 50000]; t = ts[c * 50000:(c + 1) * 50000]
on = np.where(seg > 0.5)[0]
rows.append({"early_lick": r.early_lick, "event_minus_light_ms": (r.ps_on - t[on[0]]) * 1000 if len(on) else np.nan,
"delay_event_minus_light_ms": (r.delay - t[on[0]]) * 1000 if len(on) else np.nan})
df = pd.DataFrame(rows)
df["mismatch"] = df.event_minus_light_ms.abs() > 20
print(sid, "trials:", len(df))
print(df.groupby("early_lick").agg(n=("mismatch", "size"), mismatch=("mismatch", "sum"),
event_minus_light_ms=("event_minus_light_ms", lambda x: f"{x.min():.0f} to {x.max():.0f}")).to_string())
255200_20140913 trials: 153
n mismatch event_minus_light_ms
early_lick
False 140 0 -5 to -4
True 13 5 -5 to 1276
263808_20150121 trials: 88
n mismatch event_minus_light_ms
early_lick
False 60 0 -5 to 0
True 28 15 -5 to 1587
In trials without an early lick the photostimulus event and the light in the trace agree to within 5 ms. In early-lick trials of these two sessions the event is logged up to about 1.6 s (1587 ms) after the light, at the restarted delay, so in those trials the event times do not mark the light. This is one reason the readings below that keep early-lick trials are kept apart.
# Size of the lick-early artefact (verifier's request). Under K2 lick-early trials enter with their
# events at their logged times (claims file, convention K). Per condition: how many lick-early trials
# K2 adds (behaving, correct or incorrect), and where the light seen in the laser trace falls against
# the logged go cue and the logged photostimulus event. Every lick-early photostimulus trial of the
# labelled sessions is read (one 5 s trace chunk per trial).
t0 = time.time()
k2rows = []
for sid, s in S.items():
if s["exp"] not in ("exp1", "exp2", "exp3"):
continue
tr = s["trials"]
keep = L.trial_mask(tr, "keep")
e = tr[keep & tr.early_lick.values & tr.ps_site.notna().values & tr.ps_on.notna().values & ~tr.cond.isin(["no_light", "ps_unknown", "control"]).values]
for c, n in pd.Series(tr.cond[keep]).value_counts().items():
k2rows.append({"experiment": s["exp"], "sid": sid, "cond": c, "kind": "count", "trials_K2": int(n),
"early_K2": int((keep & tr.early_lick.values & (tr.cond == c).values).sum())})
if len(e):
aid = assets[assets.path == s["path"]].asset_id.iloc[0]
lt = L.light_onsets(aid, e)
for r, x in zip(e.itertuples(), lt):
k2rows.append({"experiment": s["exp"], "sid": sid, "cond": r.cond, "kind": "light",
"light_re_go": x - r.go, "event_re_go": r.ps_on - r.go, "event_minus_light": r.ps_on - x})
k2t = pd.DataFrame(k2rows)
cnt = k2t[k2t.kind == "count"].groupby(["experiment", "cond"])[["trials_K2", "early_K2"]].sum()
cnt["early_fraction"] = (cnt.early_K2 / cnt.trials_K2).round(3)
lt = k2t[k2t.kind == "light"]
q = lt.groupby(["experiment", "cond"]).agg(
read=("light_re_go", "size"), light_found=("light_re_go", lambda x: int(x.notna().sum())),
light_re_go=("light_re_go", lambda x: f"{x.min():.2f} / {x.median():.2f} / {x.max():.2f}"),
event_re_go=("event_re_go", lambda x: f"{x.min():.2f} / {x.median():.2f} / {x.max():.2f}"),
event_after_light_over_0_1s=("event_minus_light", lambda x: int((x > 0.1).sum())),
event_minus_light_median_s=("event_minus_light", "median"))
q = q.join(cnt.trials_K2)
q["displaced_fraction_of_condition"] = q.event_after_light_over_0_1s / q.trials_K2
print(f"read in {time.time() - t0:.0f} s")
print("Trials per condition under K2 (behaving, correct or incorrect) and the lick-early trials among them:")
print(cnt.to_string())
print("\nLick-early photostimulus trials: light onset and logged event re the logged go cue (s; min / median / max),")
print("and how many have the event more than 0.1 s after the light:")
print(q.round(3).to_string())
print("Lick-early photostimulus trials read:", len(lt), "; with the event more than 0.1 s after the light:", int((lt.event_minus_light > 0.1).sum()),
"; earliest light re the logged go cue (s):", round(lt.light_re_go.min(), 2))
read in 98 s
Trials per condition under K2 (behaving, correct or incorrect) and the lick-early trials among them:
trials_K2 early_K2 early_fraction
experiment cond
exp1 control 2594.0 473.0 0.182
early_delay 583.0 95.0 0.163
late_delay 605.0 91.0 0.150
no_light 18.0 18.0 1.000
sample 578.0 98.0 0.170
exp2 bilateral8 1190.0 240.0 0.202
control 4046.0 867.0 0.214
left1 690.0 151.0 0.219
no_light 55.0 55.0 1.000
ps_unknown 9.0 4.0 0.444
right1 675.0 134.0 0.199
exp3 bilateral2 475.0 46.0 0.097
control 1952.0 280.0 0.143
left1 177.0 13.0 0.073
left4 222.0 29.0 0.131
no_light 1.0 1.0 1.000
right1 166.0 11.0 0.066
right4 193.0 23.0 0.119
Lick-early photostimulus trials: light onset and logged event re the logged go cue (s; min / median / max),
and how many have the event more than 0.1 s after the light:
read light_found light_re_go event_re_go event_after_light_over_0_1s event_minus_light_median_s trials_K2 displaced_fraction_of_condition
experiment cond
exp1 early_delay 95 95 -5.75 / -1.30 / -1.29 -1.30 / -1.30 / -1.30 22 -0.005 583.0 0.038
late_delay 91 91 -2.82 / -0.79 / -0.79 -0.80 / -0.80 / -0.80 16 -0.005 605.0 0.026
sample 98 98 -9.13 / -2.79 / -2.16 -2.10 / -2.10 / -2.10 90 0.693 578.0 0.156
exp2 bilateral8 240 240 -10.11 / -1.70 / -1.70 -1.70 / -1.70 / -1.70 89 0.000 1190.0 0.075
left1 151 151 -5.32 / -1.69 / -1.69 -1.70 / -1.70 / -1.70 45 -0.005 690.0 0.065
right1 134 134 -6.80 / -1.70 / -1.69 -1.70 / -1.70 / -1.70 48 -0.005 675.0 0.071
exp3 bilateral2 46 46 -3.33 / -1.70 / -1.70 -1.70 / -1.70 / -1.70 8 -0.000 475.0 0.017
left1 13 13 -5.45 / -1.70 / -1.69 -1.70 / -1.70 / -1.70 5 -0.005 177.0 0.028
left4 29 29 -3.26 / -1.70 / -1.70 -1.70 / -1.70 / -1.70 3 -0.000 222.0 0.014
right1 11 11 -3.33 / -1.70 / -1.69 -1.70 / -1.70 / -1.70 5 -0.005 166.0 0.030
right4 23 23 -3.72 / -1.70 / -1.70 -1.70 / -1.70 / -1.70 8 0.000 193.0 0.041
Lick-early photostimulus trials read: 931 ; with the event more than 0.1 s after the light: 339 ; earliest light re the logged go cue (s): -10.11
Under K2 the lick-early trials are 15% to 22% of the trials of each condition in experiments 1
and 2, and 7% to 14% in experiment 3. In most of them the light falls where the logged events put
it, but in some it came earlier, before one or more restarts of the delay (light as early as 10 s
before the logged go cue). Those trials, in which the logged photostimulus event lies more than
0.1 s after the light, are 16% of the sample-epoch condition of experiment 1, 3% to 4% of its other
two conditions, 6.5% to 7.5% of each photoinhibition condition of experiment 2 and 1% to 4% in
experiment 3 (displaced_fraction_of_condition). In those trials the windows aligned to the
logged events miss the light, so K2 mixes trials without photoinhibition into the photoinhibition
averages. The K2 readings are run as the claims file defines them (events at their logged times);
the claims whose outcome depends on K2 say so. A question asks the reader whether K2 should align
those trials to the light in the trace.
ctl_units = U[U.exp != "no_photostim_record"]
print("Units in control mice:", len(ctl_units), "; without a photostimulus record:", int((U.exp == "no_photostim_record").sum()))
print("\nWidth class (trough to peak of waveform_mean, Methods thresholds) against the files' cell_type:")
print(pd.crosstab(U.cls, U.cell_type).to_string())
print("\nTrough-to-peak widths (ms) and counts, control mice:")
w = ctl_units.width_ms.round(3).value_counts().sort_index()
print(w.to_string())
print("\nWaveform samples:", sorted(set(len(x) for x in U.waveform)), "; sampling rate (Hz):", sorted(set(U.fs)),
"; Methods: 19531.25 Hz")
print("Waveform_mean range (stated unit not given in the file):", f"{np.min([x.min() for x in U.waveform]):.2e} to {np.max([x.max() for x in U.waveform]):.2e}")
print("Unit quality values:", U.quality.value_counts().to_dict())
print("Units whose spike times are not in time order in the file:", {s["sid"]: s["meta"]["units_unsorted"] for s in S.values() if s["meta"]["units_unsorted"]},
"; sessions whose trials are not in time order:", {s["sid"]: s["meta"]["trials_unsorted"] for s in S.values() if s["meta"]["trials_unsorted"]})
outside = []
for u in U.itertuples():
obs = u.obs
inside = np.zeros(len(u.spikes), bool)
for a, b in obs:
inside |= (u.spikes >= a) & (u.spikes <= b)
outside.append((~inside).mean())
print("Fraction of spikes outside the unit's observation intervals: max", f"{max(outside):.4f}")
obs_frac = [o[S[s]["trials"].behaving.values].mean() for o, s in zip(U.observed, U.sid) if S[s]["trials"].behaving.any()]
print("Fraction of behaving trials in which a unit is observed: median", f"{np.median(obs_frac):.2f}", "min", f"{np.min(obs_frac):.2f}")
print("Mean firing rate over observation intervals (Hz), control mice:",
pd.Series([len(sp) / max(np.sum(o[:, 1] - o[:, 0]), 1e-9) for sp, o in zip(ctl_units.spikes, ctl_units.obs)]).describe().round(2).to_dict())
Units in control mice: 979 ; without a photostimulus record: 564
Width class (trough to peak of waveform_mean, Methods thresholds) against the files' cell_type:
cell_type FS Pyr
cls
FS 89 0
intermediate 45 0
pyr 0 1409
Trough-to-peak widths (ms) and counts, control mice:
width_ms
0.154 19
0.205 7
0.256 46
0.307 2
0.358 15
0.461 10
0.512 6
0.563 46
0.614 173
0.666 485
0.717 3
0.768 25
0.819 20
0.870 49
0.922 73
Waveform samples: [29, 37, 38] ; sampling rate (Hz): [19531.25] ; Methods: 19531.25 Hz
Waveform_mean range (stated unit not given in the file): -8.45e-04 to 2.16e-04
Unit quality values: {'good': 1543}
Units whose spike times are not in time order in the file: {'255200_20140913': 9, '258250_20141202': 18, '278733_20150530': 1} ; sessions whose trials are not in time order: {'255200_20140913': 1, '258250_20141202': 1}
Fraction of spikes outside the unit's observation intervals: max 0.0333
Fraction of behaving trials in which a unit is observed: median 1.00 min 0.89
Mean firing rate over observation intervals (Hz), control mice: {'count': 979.0, 'mean': 3.4, 'std': 3.99, 'min': 0.02, '25%': 0.93, '50%': 2.11, '75%': 4.52, 'max': 47.39}
The files' cell_type labels follow the same thresholds as the Methods (every unit wider than
0.45 ms is Pyr), except that the units of intermediate width are labelled FS (45 in all; the 15
in the control mice are all 0.358 ms wide). At 19531.25 Hz the width takes discrete values 0.051 ms apart; none falls on a threshold.
In 28 units of 3 sessions the spike times are not in time order (the files store them in trial
order, and two of these sessions have trials out of time order); they are sorted here. A few spikes
(at most 3.3% of a unit's) fall outside the unit's observation intervals.
# Clock check 1: spikes against the photostimulus record. Population rate in the light window
# (onset to offset minus ramp) over the control rate in the same window, and the same with the
# window shifted 1.5 s later (after the light).
rows = []
for sid, s in S.items():
if s["exp"] not in ("exp1", "exp2", "exp3") or s["meta"]["trials_overlapping"]:
continue
tr = s["trials"]; m = L.trial_mask(tr, "drop")
uu = U[(U.sid == sid) & (U.cls == "pyr")]
ipsi = {"exp1": ["sample", "early_delay", "late_delay"], "exp2": ["left1"], "exp3": ["left4", "bilateral2"]}[s["exp"]]
for c in ipsi:
p = m & (tr.cond == c).values; k = m & (tr.cond == "control").values
if p.sum() < 3:
continue
on, off = np.median(tr.ps_on_re_go[p]), np.median(tr.ps_off_re_go[p]) - (0.1 if s["exp"] == "exp1" else 0.2)
for shift in (0.0, 1.5):
a = sum(L.counts_in(u.spikes, tr.go.values[p], on + shift, off + shift).mean() for u in uu.itertuples())
b = sum(L.counts_in(u.spikes, tr.go.values[k], on + shift, off + shift).mean() for u in uu.itertuples())
rows.append({"sid": sid, "experiment": s["exp"], "cond": c, "shift_s": shift, "ratio": a / b if b else np.nan})
clk = pd.DataFrame(rows)
print("Population rate, photoinhibition over control, in the light window and 1.5 s later (sessions):")
print(clk.groupby(["experiment", "cond", "shift_s"]).ratio.describe()[["count", "min", "50%", "max"]].round(2).to_string())
Population rate, photoinhibition over control, in the light window and 1.5 s later (sessions):
count min 50% max
experiment cond shift_s
exp1 early_delay 0.0 16.0 0.02 0.04 0.12
1.5 16.0 0.68 1.04 1.51
late_delay 0.0 16.0 0.02 0.04 0.23
1.5 16.0 0.87 1.09 1.71
sample 0.0 16.0 0.01 0.04 0.24
1.5 16.0 0.91 1.04 1.27
exp2 left1 0.0 25.0 0.00 0.05 0.70
1.5 25.0 0.46 0.97 1.30
exp3 bilateral2 0.0 12.0 0.01 0.03 1.26
1.5 12.0 0.69 0.94 1.34
left4 0.0 6.0 0.01 0.03 0.08
1.5 6.0 0.70 1.03 1.25
# Clock check 2: trial type against spikes. Fraction of putative pyramidal units whose delay-epoch
# counts differ between lick left and lick right control trials (t-test, p < 0.05), with the true
# trial types and with the trial types of the next trial (a shift that breaks the link).
rows = []
for sid, s in S.items():
if s["meta"]["trials_overlapping"] or s["exp"] == "no_photostim_record" and False:
continue
tr = s["trials"]; m = L.trial_mask(tr, "drop", ("hit",)) & tr.cond.isin(["control", "unlabelled"]).values
if m.sum() < 20:
continue
t = tr[m]; right = (t.instruction == "right").values
shifted = np.roll(right, 1)
uu = U[(U.sid == sid) & (U.cls == "pyr")]
for u in uu.itertuples():
ok = u.observed[m]
c = L.counts_in(u.spikes, t.go.values, (t.delay - t.go).values, np.zeros(len(t)))
rows.append({"sid": sid, "experiment": s["exp"], "true": L.ttest(c[ok & right], c[ok & ~right]) < 0.05,
"shifted": L.ttest(c[ok & shifted], c[ok & ~shifted]) < 0.05})
dec = pd.DataFrame(rows)
print("Fraction of units selective in the delay epoch, true against shifted trial types:")
print(dec.groupby("experiment")[["true", "shifted"]].mean().round(3).assign(units=dec.groupby("experiment").size()).to_string())
Fraction of units selective in the delay epoch, true against shifted trial types:
true shifted units
experiment
exp1 0.297 0.067 239
exp1_unlabelled 0.333 0.233 30
exp2 0.389 0.058 411
exp3 0.345 0.088 171
no_photostim_record 0.295 0.090 498
# Sessions without a photostimulus record: per-trial population rate in the window where the light
# falls in the other sessions (experiment 1: the three windows; otherwise delay onset + 0.0-0.6 s),
# over the session median. Trials below 0.3 are counted; the same count 1.5 s later is the reference.
rows = []
for sid, s in S.items():
if s["exp"] not in ("no_photostim_record", "exp1_unlabelled"):
continue
tr = s["trials"]; m = L.trial_mask(tr, "drop", ("hit", "miss", "ignore"))
t = tr[m]
uu = U[(U.sid == sid)]
if len(t) < 10 or len(uu) == 0:
rows.append({"sid": sid, "experiment": s["exp"], "trials": len(t)}); continue
if s["exp"] == "exp1_unlabelled":
wins = [(-2.1, -1.7), (-1.3, -0.9), (-0.8, -0.4)]
else:
wins = [(-1.7, -1.1)]
out = {"sid": sid, "experiment": s["exp"], "trials": len(t), "units": len(uu)}
for shift, name in ((0.0, "silenced"), (1.5, "silenced_1.5s_later")):
low = np.zeros(len(t), bool)
for a, b in wins:
pop = sum(L.counts_in(u.spikes, t.go.values, a + shift, b + shift) for u in uu.itertuples())
med = np.median(pop)
low |= pop < 0.3 * med if med > 0 else np.zeros(len(t), bool)
out[name] = round(low.mean(), 2)
rows.append(out)
unl = pd.DataFrame(rows)
print(unl.to_string(index=False))
print("\nMedian over sessions of the fraction of trials below 30% of the session median, in the light window and 1.5 s later:")
print(unl.groupby("experiment")[["silenced", "silenced_1.5s_later"]].median().to_string())
print("Sessions where the fraction in the light window exceeds the one 1.5 s later by 0.1 or more:",
int(((unl.silenced - unl["silenced_1.5s_later"]) >= 0.1).sum()), "of", int(unl.silenced.notna().sum()))
sid experiment trials units silenced silenced_1.5s_later
255200_20140910 exp1_unlabelled 222 15.0 0.00 0.03
255200_20140911 exp1_unlabelled 280 13.0 0.41 0.25
255200_20140912 exp1_unlabelled 250 19.0 0.02 0.08
270340_20150618 no_photostim_record 0 NaN NaN NaN
270340_20150619 no_photostim_record 199 24.0 0.04 0.01
270340_20150620 no_photostim_record 93 14.0 0.12 0.00
270340_20150621 no_photostim_record 122 4.0 0.39 0.19
270340_20150623 no_photostim_record 272 9.0 0.13 0.04
278733_20150528 no_photostim_record 241 29.0 0.01 0.01
278733_20150530 no_photostim_record 292 49.0 0.09 0.01
278733_20150531 no_photostim_record 222 5.0 0.35 0.10
278733_20150601 no_photostim_record 173 28.0 0.01 0.01
278733_20150602 no_photostim_record 275 15.0 0.26 0.06
278733_20150603 no_photostim_record 207 25.0 0.29 0.01
291063_20150902 no_photostim_record 217 13.0 0.26 0.01
291063_20150904 no_photostim_record 208 14.0 0.22 0.02
291063_20150906 no_photostim_record 91 5.0 0.34 0.16
291063_20150907 no_photostim_record 189 4.0 0.39 0.12
291064_20150906 no_photostim_record 201 24.0 0.01 0.01
291064_20150907 no_photostim_record 13 10.0 0.38 0.00
291064_20150908 no_photostim_record 329 17.0 0.27 0.05
291064_20150909 no_photostim_record 104 7.0 0.34 0.02
297634_20150907 no_photostim_record 212 22.0 0.05 0.03
297634_20150908 no_photostim_record 162 9.0 0.02 0.02
297634_20150909 no_photostim_record 243 16.0 0.27 0.10
297634_20150910 no_photostim_record 129 11.0 0.29 0.12
297634_20150911 no_photostim_record 150 15.0 0.05 0.02
298738_20150724 no_photostim_record 223 28.0 0.27 0.01
298738_20150725 no_photostim_record 178 33.0 0.30 0.01
298738_20150727 no_photostim_record 169 22.0 0.02 0.01
298738_20150728 no_photostim_record 153 29.0 0.29 0.00
298738_20150729 no_photostim_record 118 26.0 0.15 0.03
298740_20150723 no_photostim_record 147 20.0 0.12 0.01
298740_20150724 no_photostim_record 216 8.0 0.29 0.06
298740_20150726 no_photostim_record 238 10.0 0.23 0.08
298740_20150729 no_photostim_record 132 7.0 0.36 0.05
Median over sessions of the fraction of trials below 30% of the session median, in the light window and 1.5 s later:
silenced silenced_1.5s_later
experiment
exp1_unlabelled 0.02 0.08
no_photostim_record 0.26 0.02
Sessions where the fraction in the light window exceeds the one 1.5 s later by 0.1 or more: 23 of 35
The clock checks hold for the 54 sessions with a photostimulus record. In each ipsilateral condition the population rate in the light window has a median over sessions of 0.03 to 0.05 of the control rate (one experiment-2 session reaches 0.70, and one experiment-3 session 1.26 under bilateral light), and 1.5 s later the median is 0.94 to 1.09, so the spikes, the trial events and the photostimulus record share one clock. Delay-epoch selectivity is found in 0.30 to 0.39 of units with the true trial types against 0.06 to 0.09 with those of the next trial, in every group except the three unlabelled experiment-1 sessions (0.33 against 0.23, 30 units).
In most sessions without a photostimulus record, a fraction of trials (up to about 0.4) have their population rate fall below 30% of the session median in the light window of the other sessions, far more than 1.5 s later. These sessions therefore contain photoinhibition trials that no file labels (in a few sessions no such trials appear in this window, so their light, if any, fell elsewhere). Their control trials cannot be told from their photoinhibition trials, so no analysis of them that needs control trials or conditions can be run.
unit-classification¶
1012 single units were recorded in left ALM during behaviour in 58 sessions (20 unilateral, 38 bilateral experiment sessions); by spike width 72 were fast-spiking, 890 putative pyramidal, and 50 intermediate and excluded.
Criterion: width is the trough-to-peak interval of the mean waveform; units and sessions of the control mice only. Reproduced when all values are within tolerance.
ctl = U[U.exp.isin(["exp1", "exp1_unlabelled", "exp2", "exp3"])]
expected = {"single units": (1012, 101.2), "recording sessions": (58, 5.8), "fast-spiking units": (72, 7.2),
"putative pyramidal units": (890, 89), "intermediate units": (50, 5)}
measured = {"single units": len(ctl), "recording sessions": ctl.sid.nunique(), "fast-spiking units": int((ctl.cls == "FS").sum()),
"putative pyramidal units": int((ctl.cls == "pyr").sum()), "intermediate units": int((ctl.cls == "intermediate").sum())}
uc = pd.DataFrame([{"quantity": k, "paper": v[0], "tolerance": v[1], "measured": measured[k],
"within": abs(measured[k] - v[0]) <= v[1]} for k, v in expected.items()])
print(uc.to_string(index=False))
print("\nSessions: unilateral (experiment 1)", ctl[ctl.exp.str.startswith("exp1")].sid.nunique(),
"; bilateral (experiments 2 and 3)", ctl[ctl.exp.isin(["exp2", "exp3"])].sid.nunique())
print("Units by mouse and class:")
print(pd.crosstab(ctl.subject, ctl.cls, margins=True).to_string())
cal = U[U.exp == "no_photostim_record"]
print("\nCounted apart, mice without a photostimulus record:", len(cal), "units,", cal.sid.nunique(), "sessions;",
cal.cls.value_counts().to_dict())
print("Units missing against the paper's 1012:", 1012 - len(ctl), "; intermediate units missing against its 50:", 50 - measured["intermediate units"])
# Variant (verifier's request): widths from waveforms interpolated to 10 times the stored rate (cubic
# spline), to see whether the 19.5 kHz sampling explains the few intermediate units. The criterion's
# measure is the stored-rate width above.
ctl = ctl.assign(width_up_ms=[L.spike_width_upsampled_ms(w, fs) for w, fs in zip(ctl.waveform, ctl.fs)])
ctl["cls_up"] = np.where(ctl.width_up_ms < L.FS_MAX_MS, "FS", np.where(ctl.width_up_ms > L.PYR_MIN_MS, "pyr", "intermediate"))
print("\nVariant, upsampled widths: class counts", ctl.cls_up.value_counts().to_dict(), "(paper FS 72, pyramidal 890, intermediate 50)")
print("Stored-rate class against upsampled class:")
print(pd.crosstab(ctl.cls, ctl.cls_up).to_string())
print("Upsampled widths (ms) of control-mouse units, counts in 0.05 ms bins from 0.20 to 0.60:",
np.histogram(ctl.width_up_ms, bins=np.round(np.arange(0.2, 0.6001, 0.05), 2))[0].tolist(),
"; below 0.20:", int((ctl.width_up_ms < 0.2).sum()), "; above 0.60:", int((ctl.width_up_ms > 0.6).sum()))
quantity paper tolerance measured within
single units 1012 101.2 979 True
recording sessions 58 5.8 58 True
fast-spiking units 72 7.2 74 True
putative pyramidal units 890 89.0 890 True
intermediate units 50 5.0 15 False
Sessions: unilateral (experiment 1) 20 ; bilateral (experiments 2 and 3) 38
Units by mouse and class:
cls FS intermediate pyr All
subject
255200 7 0 74 81
255201 13 0 97 110
255203 7 0 90 97
257636 0 5 38 43
257637 4 0 47 51
257772 13 0 104 117
258250 6 0 55 61
263808 10 0 120 130
263810 9 0 88 97
264411 2 0 44 46
270337 1 6 66 73
273657 2 4 67 73
All 74 15 890 979
Counted apart, mice without a photostimulus record: 564 units, 33 sessions; {'pyr': 519, 'intermediate': 30, 'FS': 15}
Units missing against the paper's 1012: 33 ; intermediate units missing against its 50: 35
Variant, upsampled widths: class counts {'pyr': 889, 'FS': 79, 'intermediate': 11} (paper FS 72, pyramidal 890, intermediate 50)
Stored-rate class against upsampled class:
cls_up FS intermediate pyr
cls
FS 74 0 0
intermediate 5 10 0
pyr 0 1 889
Upsampled widths (ms) of control-mouse units, counts in 0.05 ms bins from 0.20 to 0.60: [2, 45, 7, 10, 1, 12, 3, 76] ; below 0.20: 25 ; above 0.60: 798
Result: partially reproduced. The control mice hold 979 units in 58 sessions (20 unilateral, 38 bilateral), with 74 fast-spiking and 890 putative pyramidal units, all within tolerance; 890 is the paper's number exactly. Only 15 units have intermediate widths, against 50: the dandiset holds 33 units fewer than the paper's 1012, about the number of intermediate units missing (35), so the intermediate units were probably left out of the deposit.
With widths from waveforms interpolated to ten times the stored rate (a variant), 11 units are intermediate, 79 fast-spiking and 889 putative pyramidal, so the 19.5 kHz sampling does not explain the shortfall of intermediate units. The criterion defines no partial outcome; four of its five values hold, so the outcome is partial by the rule given in the Summary.
selective-fraction¶
Most putative pyramidal neurons distinguished trial types (634 of 890); 176 in the sample epoch, 337 in the delay epoch and 493 in the response epoch.
Criterion: convention S on the putative pyramidal neurons, control trials; reproduced when all four counts are within tolerance under one combination of readings: response epoch 1.3 s (R1) or 1.5 s (R2) after the go cue; correct trials (O1) or correct and incorrect (O2); Student's or Welch's t-test. Lick-early trials are dropped (K1) or kept (K2); the answer (convention K) found the paper silent, so the outcome must hold under both. The 44 putative pyramidal units of the three experiment-1 sessions without a photostimulus record have no identifiable control trials; they are left out, and shown as a variant with all their trials.
pyr_ctl = ctl[ctl.cls == "pyr"]
pyr_lab = pyr_ctl[pyr_ctl.exp.isin(["exp1", "exp2", "exp3"])]
SEL, sel_rows, tests = {}, [], {}
for early in ("drop", "keep"):
SEL[early] = {}
for r in L.S_READINGS:
st = L.selectivity_tests(pyr_lab, S, r["response"], r["outcomes"], early, r["equal_var"])
tests[(early, L.s_key(r))] = st
sig = st[["sample", "delay", "response"]] < 0.05
SEL[early][L.s_key(r)] = set(st.uid[sig.any(axis=1)])
sel_rows.append({"early_lick": early, "reading": L.s_key(r), "tested": len(st),
"untestable": int(st[["sample", "delay", "response"]].isna().any(axis=1).sum()),
"any": int(sig.any(axis=1).sum()), "sample": int(sig["sample"].sum()),
"delay": int(sig.delay.sum()), "response": int(sig.response.sum())})
sf = pd.DataFrame(sel_rows)
exp_sf = {"any": (634, 63.4), "sample": (176, 17.6), "delay": (337, 33.7), "response": (493, 49.3)}
for k, (v, tol) in exp_sf.items():
sf[k + "_ok"] = (sf[k] - v).abs() <= tol
sf["all_four"] = sf[[k + "_ok" for k in exp_sf]].all(axis=1)
print("Putative pyramidal units with labelled trials:", len(pyr_lab), "of", len(pyr_ctl))
print(sf.to_string(index=False))
print("\nCombinations with all four within tolerance:", int(sf.all_four.sum()), "of", len(sf))
sf["n_within"] = sf[[k + "_ok" for k in exp_sf]].sum(axis=1)
print("Most counts within tolerance in one reading, per lick-early reading:", sf.groupby("early_lick").n_within.max().to_dict(),
"; readings with three of four:", sf[sf.n_within == 3][["early_lick", "reading"]].values.tolist())
print("Largest sample-epoch count:", sf["sample"].max(), "; tolerance band", 176 - 17.6, "to", 176 + 17.6)
Putative pyramidal units with labelled trials: 846 of 890
early_lick reading tested untestable any sample delay response any_ok sample_ok delay_ok response_ok all_four
drop R1-O1-student 846 16 563 156 292 445 False False False True False
drop R1-O1-welch 846 16 563 153 294 446 False False False True False
drop R1-O2-student 846 16 508 135 248 367 False False False False False
drop R1-O2-welch 846 16 507 135 255 362 False False False False False
drop R2-O1-student 846 16 565 156 292 442 False False False False False
drop R2-O1-welch 846 16 565 153 294 445 False False False True False
drop R2-O2-student 846 16 511 135 248 374 False False False False False
drop R2-O2-welch 846 16 513 135 255 370 False False False False False
keep R1-O1-student 846 16 588 148 315 464 True False True True False
keep R1-O1-welch 846 16 575 149 320 453 True False True True False
keep R1-O2-student 846 16 532 132 266 393 False False False False False
keep R1-O2-welch 846 16 528 134 264 388 False False False False False
keep R2-O1-student 846 16 582 148 315 456 True False True True False
keep R2-O1-welch 846 16 582 149 320 454 True False True True False
keep R2-O2-student 846 16 527 132 266 387 False False False False False
keep R2-O2-welch 846 16 525 134 264 387 False False False False False
Combinations with all four within tolerance: 0 of 16
Most counts within tolerance in one reading, per lick-early reading: {'drop': 1, 'keep': 3} ; readings with three of four: [['keep', 'R1-O1-student'], ['keep', 'R1-O1-welch'], ['keep', 'R2-O1-student'], ['keep', 'R2-O1-welch']]
Largest sample-epoch count: 156 ; tolerance band 158.4 to 193.6
# Variant: the 44 units of the three unlabelled sessions added, with all their trials as control
rows = []
for early in ("drop", "keep"):
for r in L.S_READINGS:
st = L.selectivity_tests(pyr_ctl, S, r["response"], r["outcomes"], early, r["equal_var"], conds=("control", "unlabelled"))
sig = st[["sample", "delay", "response"]] < 0.05
row = {"early_lick": early, "reading": L.s_key(r), "any": int(sig.any(axis=1).sum()), "sample": int(sig["sample"].sum()),
"delay": int(sig.delay.sum()), "response": int(sig.response.sum())}
row["all_four"] = all(abs(row[k] - v) <= tol for k, (v, tol) in exp_sf.items())
rows.append(row)
sfv = pd.DataFrame(rows)
print("Variant with the 44 units of the unlabelled sessions (all their trials):")
print(sfv.to_string(index=False))
print("By mouse, reading R1-O1-student, lick-early dropped (labelled sessions):")
st = tests[("drop", "R1-O1-student")].merge(pyr_lab[["uid", "subject"]], on="uid")
print(st.assign(sel=(st[["sample", "delay", "response"]] < 0.05).any(axis=1)).groupby("subject").sel.agg(["sum", "size"]).T.to_string())
Variant with the 44 units of the unlabelled sessions (all their trials):
early_lick reading any sample delay response all_four
drop R1-O1-student 592 165 307 464 True
drop R1-O1-welch 592 162 309 465 True
drop R1-O2-student 533 143 260 382 False
drop R1-O2-welch 532 143 266 377 False
drop R2-O1-student 593 165 307 462 True
drop R2-O1-welch 593 162 309 465 True
drop R2-O2-student 537 143 260 391 False
drop R2-O2-welch 539 143 266 387 False
keep R1-O1-student 619 157 332 483 False
keep R1-O1-welch 606 157 337 472 False
keep R1-O2-student 560 142 280 409 False
keep R1-O2-welch 556 144 278 404 False
keep R2-O1-student 611 157 332 475 False
keep R2-O1-welch 611 157 337 473 False
keep R2-O2-student 555 142 280 403 False
keep R2-O2-welch 553 144 278 403 False
By mouse, reading R1-O1-student, lick-early dropped (labelled sessions):
subject 255200 255201 255203 257636 257637 257772 258250 263808 263810 264411 270337 273657
sum 26 72 43 24 39 79 29 72 61 27 54 37
size 30 97 90 38 47 104 55 120 88 44 66 67
Result: not reproduced. On the 846 putative pyramidal units whose control trials can be identified, no combination of readings brings all four counts within tolerance. With lick-early trials dropped (K1) only the response-epoch count reaches its band (445 or 446 under three readings with correct trials only); the counts in any epoch (at most 565, band 571 to 697), in the sample epoch (at most 156, band 158 to 194) and in the delay epoch (at most 294, band 303 to 371) fall short. With lick-early trials kept (K2) three of four reach their bands under the four readings with correct trials only (any epoch 575 to 588, delay 315 to 320, response 453 to 464), and the sample count does not (at most 149). The outcome must be the one K1 and K2 both give, and under K1 only one of the four counts holds, so the claim is not reproduced (the first round gave partial; the rule is in the Summary). Most units are selective all the same (563 of 846 with K1, R1 and correct trials). With the 44 units of the three unlabelled sessions added on all their trials, which include photoinhibition trials and so are not the control trials the criterion names, all four counts are within tolerance with correct trials and K1 (592, 165, 307 and 464 with R1 and Student's test) and under no reading with K2.
Behaviour during the recordings (variant for blocked claims)¶
fig1d-late-delay-ipsilateral-bias, fig1d-earlier-photoinhibition-minimal, ed3-behaviour-recovery-interval and the two fig2b claims rest on the paper's behavioural photoinhibition experiments (5 and 13 mice, photoinhibition on 25% of trials, conditions not in the recordings such as light ending at the go cue, 1.3 s photoinhibition and four-spot unilateral photoinhibition). Those sessions are not in the dandiset, so the claims are blocked. The behaviour recorded during the electrophysiology sessions is shown here for reference only; it is a different set of sessions and does not decide an outcome.
def perf(tr, cond, side=None, ignore_as_error=False):
m = tr.behaving & ~tr.early_lick & (tr.cond == cond)
if not ignore_as_error:
m &= tr.outcome.isin(["hit", "miss"])
if side:
m &= tr.instruction == side
t = tr[m]
return (t.outcome == "hit").mean() if len(t) else np.nan, len(t)
rows = []
for s in S.values():
if s["exp"] not in ("exp1", "exp2"):
continue
for c in ["control", "sample", "early_delay", "late_delay", "left1", "right1", "bilateral8"]:
p, n = perf(s["trials"], c)
pr, _ = perf(s["trials"], c, "right")
if n:
rows.append({"experiment": s["exp"], "subject": s["subject"], "cond": c, "perf": p, "perf_right": pr, "n": n})
bp = pd.DataFrame(rows)
mouse = bp.groupby(["experiment", "subject", "cond"]).apply(lambda d: pd.Series({"perf": np.average(d.perf, weights=d.n), "perf_right": np.nanmean(d.perf_right)})).reset_index()
for exp, conds in [("exp1", ["sample", "early_delay", "late_delay"]), ("exp2", ["left1", "right1", "bilateral8"])]:
m = mouse[mouse.experiment == exp].pivot(index="subject", columns="cond", values="perf")
print(f"{exp}: performance per mouse (fraction correct, lick-early excluded)")
print(m.round(3).to_string())
for c in conds:
tp = stats.ttest_rel(m[c], m["control"]).pvalue
ti = stats.ttest_ind(m[c], m["control"]).pvalue
print(f" {c}: mean {m[c].mean():.3f} against control {m['control'].mean():.3f}; paired p = {tp:.3g}, unpaired p = {ti:.3g}")
# Experiment 3 behaviour per mouse (verifier's request; reference only), and one-spot unilateral
# photoinhibition with the two hemispheres pooled per mouse (trials of left1 and right1 together).
rows = []
for s in S.values():
if s["exp"] not in ("exp2", "exp3"):
continue
tr = s["trials"]
for c in ["control", "left1", "right1", "left4", "right4", "bilateral2", "bilateral8", "one spot pooled"]:
cc = ["left1", "right1"] if c == "one spot pooled" else [c]
m = tr.behaving & ~tr.early_lick & tr.cond.isin(cc) & tr.outcome.isin(["hit", "miss"])
if m.sum():
rows.append({"experiment": s["exp"], "subject": s["subject"], "cond": c, "hits": int((tr.outcome[m] == "hit").sum()), "n": int(m.sum())})
bq = pd.DataFrame(rows).groupby(["experiment", "subject", "cond"])[["hits", "n"]].sum().reset_index()
bq["perf"] = bq.hits / bq.n
for exp in ("exp3", "exp2"):
m = bq[bq.experiment == exp].pivot(index="subject", columns="cond", values="perf")
nn = bq[bq.experiment == exp].groupby("cond").n.sum().to_dict()
print(f"\n{exp}: performance per mouse (trials pooled over sessions, lick-early excluded); trials per condition {nn}")
print(m.round(3).to_string())
for c in [x for x in m.columns if x != "control"]:
d = m[[c, "control"]].dropna()
if len(d) >= 2:
print(f" {c}: mean {d[c].mean():.3f} against control {d['control'].mean():.3f} over {len(d)} mice; "
f"paired p = {stats.ttest_rel(d[c], d['control']).pvalue:.3g}, unpaired p = {stats.ttest_ind(d[c], d['control']).pvalue:.3g}")
print("\nPaper (Fig. 2b, 13 mice of the behavioural cohort): one spot 70.3%, four spots 67.7%, bilateral two spots 58.0%, eight spots 51.4%.")
exp1: performance per mouse (fraction correct, lick-early excluded)
cond control early_delay late_delay sample
subject
255200 0.808 0.738 0.809 0.783
255201 0.851 0.835 0.810 0.909
255203 0.742 0.600 0.708 0.690
257772 0.795 0.806 0.669 0.822
sample: mean 0.801 against control 0.799; paired p = 0.932, unpaired p = 0.965
early_delay: mean 0.745 against control 0.799; paired p = 0.205, unpaired p = 0.375
late_delay: mean 0.749 against control 0.799; paired p = 0.158, unpaired p = 0.279
exp2: performance per mouse (fraction correct, lick-early excluded)
cond bilateral8 control left1 right1
subject
255201 0.721 0.812 0.887 0.763
257637 0.554 0.778 0.738 0.745
257772 0.655 0.791 0.655 0.679
258250 0.511 0.734 0.714 0.789
263808 0.530 0.753 0.706 0.720
263810 0.553 0.785 0.631 0.684
264411 0.533 0.760 0.592 0.704
left1: mean 0.703 against control 0.773; paired p = 0.0786, unpaired p = 0.0868
right1: mean 0.726 against control 0.773; paired p = 0.0637, unpaired p = 0.026
bilateral8: mean 0.580 against control 0.773; paired p = 0.000102, unpaired p = 4.34e-05
exp3: performance per mouse (trials pooled over sessions, lick-early excluded); trials per condition {'bilateral2': 429, 'control': 1672, 'left1': 164, 'left4': 193, 'one spot pooled': 319, 'right1': 155, 'right4': 170}
cond bilateral2 control left1 left4 one spot pooled right1 right4
subject
257636 0.593 0.772 0.776 0.716 0.735 0.688 0.797
270337 0.758 0.837 0.717 0.781 0.743 0.767 0.881
273657 0.622 0.775 0.500 0.770 0.636 0.833 0.812
bilateral2: mean 0.658 against control 0.795 over 3 mice; paired p = 0.0448, unpaired p = 0.0674
left1: mean 0.664 against control 0.795 over 3 mice; paired p = 0.249, unpaired p = 0.207
left4: mean 0.756 against control 0.795 over 3 mice; paired p = 0.147, unpaired p = 0.253
one spot pooled: mean 0.705 against control 0.795 over 3 mice; paired p = 0.0921, unpaired p = 0.0891
right1: mean 0.763 against control 0.795 over 3 mice; paired p = 0.552, unpaired p = 0.533
right4: mean 0.830 against control 0.795 over 3 mice; paired p = 0.0254, unpaired p = 0.354
exp2: performance per mouse (trials pooled over sessions, lick-early excluded); trials per condition {'bilateral8': 950, 'control': 3179, 'left1': 539, 'one spot pooled': 1080, 'right1': 541}
cond bilateral8 control left1 one spot pooled right1
subject
255201 0.721 0.812 0.887 0.835 0.763
257637 0.554 0.778 0.738 0.741 0.745
257772 0.655 0.791 0.655 0.669 0.679
258250 0.511 0.734 0.714 0.752 0.789
263808 0.530 0.753 0.706 0.713 0.720
263810 0.553 0.785 0.631 0.659 0.684
264411 0.533 0.760 0.592 0.640 0.704
bilateral8: mean 0.580 against control 0.773 over 7 mice; paired p = 0.000102, unpaired p = 4.34e-05
left1: mean 0.703 against control 0.773 over 7 mice; paired p = 0.0786, unpaired p = 0.0868
one spot pooled: mean 0.716 against control 0.773 over 7 mice; paired p = 0.0587, unpaired p = 0.0575
right1: mean 0.726 against control 0.773 over 7 mice; paired p = 0.0637, unpaired p = 0.026
Paper (Fig. 2b, 13 mice of the behavioural cohort): one spot 70.3%, four spots 67.7%, bilateral two spots 58.0%, eight spots 51.4%.
ed4-return-to-trajectory¶
Neurons whose spike rates decreased during the delay epoch also recovered after unilateral photoinhibition, returning to the time-matched control trajectory and not decaying to the end-point rate.
Criterion: experiment 1; neurons with a significant decrease of the spike count in the last 400 ms of the delay against the first 400 ms (two-tailed t-test, p < 0.05, trial types pooled); rates normalised to the neuron's mean rate; for each condition the RMS between photoinhibition offset and the go cue of the perturbed minus time-matched control rate and of the perturbed rate minus the control rate at the end of the delay; readings (a) one value per neuron averaged over conditions and trial types, (b) one per neuron, condition and trial type; reproduced when the time-matched RMS is smaller by a paired t-test with p < 0.001 under a reading. Answered 2026-10-21 as not given by the paper: the selection test paired (s1) or unpaired (s2), the bin of the rate time course 200 ms (t1) or 400 ms (t2), and lick-early trials dropped (K1) or kept (K2); the outcome must hold under all, and the count of 27 is reported against each. Neurons are the putative pyramidal neurons (convention U); trials are correct and incorrect ones; the mean rate is over control trials from sample onset to 1.3 s after the go cue.
OFF1 = {"sample": -1.6, "early_delay": -0.8, "late_delay": -0.3}
e1 = U[(U.exp == "exp1") & (U.cls == "pyr")]
ed4_rows, ed4_detail = [], {}
for early in ("drop", "keep"):
for paired in (True, False):
chosen = []
for u in e1.itertuples():
tr = S[u.sid]["trials"]
m = L.trial_mask(tr, early) & (tr.cond == "control").values & u.observed
t = tr[m]
a = L.counts_in(u.spikes, t.go.values, (t.delay - t.go).values, (t.delay - t.go).values + 0.4)
b = L.counts_in(u.spikes, t.go.values, -0.4, 0.0)
if len(t) < 3:
continue
p = stats.ttest_rel(b, a).pvalue if paired else stats.ttest_ind(b, a).pvalue
if p < 0.05 and b.mean() < a.mean():
chosen.append(u.uid)
for w in (0.2, 0.4):
sub = e1[e1.uid.isin(chosen)]
rm = L.rate_matrices(sub, S, w, early)
tl = L.labels(w, "centre")
j_end = int(np.argmin(abs(L.GRID_END - 0.0))) # window ending at the go cue
per = []
for uid, d in rm.items():
ctrl = d["cond"] == "control"
so = d["so"][ctrl]
n_all = L.counts_in(d["spikes"], d["go"][ctrl], so, np.full(ctrl.sum(), 1.3))
mean_rate = n_all.sum() / np.sum(1.3 - so)
if mean_rate <= 0:
continue
for c, off in OFF1.items():
win = (tl > off) & (tl <= 0)
for side in (True, False):
pm = (d["cond"] == c) & (d["right"] == side)
cm = ctrl & (d["right"] == side)
if pm.sum() < 1 or cm.sum() < 1:
continue
rp = d["rate"][pm].mean(0) / mean_rate
rc = d["rate"][cm].mean(0) / mean_rate
per.append({"uid": uid, "cond": c, "right": side,
"rms_matched": np.sqrt(np.mean((rp[win] - rc[win]) ** 2)),
"rms_endpoint": np.sqrt(np.mean((rp[win] - rc[j_end]) ** 2))})
per = pd.DataFrame(per)
ed4_detail[(early, paired, w)] = per
avg = per.groupby("uid")[["rms_matched", "rms_endpoint"]].mean()
ta = stats.ttest_rel(avg.rms_matched, avg.rms_endpoint)
tb = stats.ttest_rel(per.rms_matched, per.rms_endpoint)
ed4_rows.append({"early_lick": early, "selection_test": "paired" if paired else "unpaired", "bin_s": w,
"neurons": len(chosen), "mice": sub.subject.nunique(),
"a_matched": avg.rms_matched.mean(), "a_endpoint": avg.rms_endpoint.mean(), "a_t": ta.statistic, "a_p": ta.pvalue,
"b_n": len(per), "b_matched": per.rms_matched.mean(), "b_endpoint": per.rms_endpoint.mean(), "b_t": tb.statistic, "b_p": tb.pvalue})
ed4 = pd.DataFrame(ed4_rows)
ed4["holds_a"] = (ed4.a_p < 0.001) & (ed4.a_matched < ed4.a_endpoint)
ed4["holds_b"] = (ed4.b_p < 0.001) & (ed4.b_matched < ed4.b_endpoint)
print(ed4.round(4).to_string(index=False))
print("\nPaper: 27 neurons from 6 mice (tolerance 2.7), paired t-test p < 0.001.")
early_lick selection_test bin_s neurons mice a_matched a_endpoint a_t a_p b_n b_matched b_endpoint b_t b_p holds_a holds_b
drop paired 0.2 55 4 0.5220 0.5091 0.6740 0.5032 330 0.5220 0.5091 0.9221 0.3571 False False
drop paired 0.4 55 4 0.4456 0.4460 -0.0254 0.9798 330 0.4456 0.4460 -0.0309 0.9754 False False
drop unpaired 0.2 47 4 0.5078 0.4994 0.3977 0.6927 282 0.5078 0.4994 0.5384 0.5907 False False
drop unpaired 0.4 47 4 0.4297 0.4340 -0.2340 0.8160 282 0.4297 0.4340 -0.2794 0.7802 False False
keep paired 0.2 67 4 0.5147 0.5153 -0.0345 0.9725 402 0.5147 0.5153 -0.0450 0.9642 False False
keep paired 0.4 67 4 0.4400 0.4519 -0.7637 0.4477 402 0.4400 0.4519 -0.9646 0.3353 False False
keep unpaired 0.2 58 4 0.5223 0.5263 -0.2156 0.8301 348 0.5223 0.5263 -0.2790 0.7804 False False
keep unpaired 0.4 58 4 0.4454 0.4599 -0.8355 0.4069 348 0.4454 0.4599 -1.0457 0.2964 False False
Paper: 27 neurons from 6 mice (tolerance 2.7), paired t-test p < 0.001.
Result: not reproduced. The selection finds 47 to 67 putative pyramidal neurons with a significant delay-epoch decrease, from 4 mice (paper 27 from 6). Under no reading is the RMS of the difference from the time-matched control smaller than the RMS of the difference from the end-point rate: the two are within 0.02 of each other in every row (paired p 0.41 to 0.98 with one value per neuron, 0.30 to 0.98 with one value per neuron, condition and trial type). This holds under all eight combinations of s1, s2, t1, t2, K1 and K2 that the answer requires, so the outcome is unchanged.
fig1f-spike-rate-recovery¶
Within 400 ms after unilateral photoinhibition, spike rates became indistinguishable from control in 90% of neurons; 10% retained a sustained change.
Criterion: convention R on putative pyramidal neurons of experiment 1, per condition; the fraction of neurons with a significant change (p < 0.01) in the 400 ms window at 400 ms after photoinhibition offset; readings (a) each of the three conditions, (b) the three pooled; window labelled by its end (W1) or centre (W2); neurons below 1 spike/s or with fewer than 3 trials excluded (X1) or not (X2). Reproduced when the fraction is within 0.09 to 0.11 under one combination. Lick-early trials dropped (K1) or kept (K2); answered 2026-10-21 as not given by the paper, the outcome must hold under both.
f1_rows = []
for early in ("drop", "keep"):
for X in ("X1", "X2"):
res_c = {}
for c, off in OFF1.items():
P, info = L.rate_change_tests(e1, S, c, 0.4, early, min_rate=1 if X == "X1" else None, min_trials=3 if X == "X1" else None)
res_c[c] = (P, info)
for lab in ("end", "centre"):
tl = L.labels(0.4, lab)
tot_sig = tot_n = 0
row = {"early_lick": early, "exclusion": X, "label": "W1 end" if lab == "end" else "W2 centre"}
for c, off in OFF1.items():
P, info = res_c[c]
inc = info.included.values & ~np.isnan(P).all(1)
j = int(np.argmin(abs(tl - (off + 0.4))))
sig = P[inc, j] < 0.01
row[f"n_{c}"] = int(inc.sum()); row[f"frac_{c}"] = sig.mean()
jd = int(np.argmin(abs(tl - off)))
row[f"during_{c}"] = (P[inc, jd] < 0.01).mean()
tot_sig += sig.sum(); tot_n += inc.sum()
row["frac_pooled"] = tot_sig / tot_n
f1_rows.append(row)
f1 = pd.DataFrame(f1_rows)
f1["a_each_within"] = f1[[f"frac_{c}" for c in OFF1]].sub(0.1).abs().le(0.01 + 1e-12).all(axis=1)
f1["b_pooled_within"] = (f1.frac_pooled - 0.1).abs() <= 0.01 + 1e-12
print(f1.round(3).to_string(index=False))
print("\nPaper: n = 168, 168, 175 neurons; fraction 0.10 (tolerance 0.01). 'during_' is the fraction at the window labelled at offset.")
early_lick exclusion label n_sample frac_sample during_sample n_early_delay frac_early_delay during_early_delay n_late_delay frac_late_delay during_late_delay frac_pooled a_each_within b_pooled_within
drop X1 W1 end 172 0.157 0.692 172 0.203 0.698 172 0.122 0.698 0.161 False False
drop X1 W2 centre 172 0.122 0.407 172 0.134 0.483 172 0.093 0.453 0.116 False False
drop X2 W1 end 248 0.121 0.496 248 0.153 0.488 248 0.101 0.488 0.125 False False
drop X2 W2 centre 248 0.105 0.282 248 0.113 0.347 248 0.085 0.323 0.101 False True
keep X1 W1 end 170 0.159 0.665 170 0.200 0.712 170 0.135 0.724 0.165 False False
keep X1 W2 centre 170 0.129 0.371 170 0.124 0.465 170 0.082 0.476 0.112 False False
keep X2 W1 end 248 0.129 0.476 248 0.149 0.504 248 0.109 0.504 0.129 False False
keep X2 W2 centre 248 0.109 0.266 248 0.105 0.327 248 0.077 0.327 0.097 False True
Paper: n = 168, 168, 175 neurons; fraction 0.10 (tolerance 0.01). 'during_' is the fraction at the window labelled at offset.
Result: reproduced. With windows labelled by their centre and no exclusion (W2, X2), the pooled fraction of neurons with a significant change 400 ms after offset is 0.101 with lick-early trials dropped and 0.097 with them kept, both within 0.09 to 0.11, so it holds under K1 and K2 as the answer requires. The per-condition fractions under that reading are 0.105, 0.113 and 0.085 (dropped), so reading (a) does not hold; with the exclusion (X1) 170 to 172 neurons are tested per condition (paper 168 to 175) and the pooled fraction is 0.112 to 0.165. During the light 27% to 72% of neurons are significant, depending on the window label. The passing reading is the one without the exclusion, and it tests 248 neurons per condition, against the paper's 168 to 175; the reading with the exclusion (X1) comes close to the paper's counts (170 to 172) and fails. The criterion allows either, so the outcome is reproduced, but it rests on the reading whose neuron count differs from the paper's.
fig1g-selectivity-recovery¶
After unilateral photoinhibition ALM neurons recovered more than 80% of their control selectivity within about 0.5 s; recovery times were 373 ms (sample), 510 ms (early delay) and 327 ms (late delay).
Criterion: convention D on experiment 1 (selective neurons tested on more than 3 trials in every
condition; preferred trial type from 10 random control trials, redrawn 20 times and averaged;
selectivity on correct and incorrect trials grouped by instruction); recovery time is the first
window after photoinhibition offset where the population selectivity on photoinhibition trials
reaches 80% of the time-matched control selectivity; bins of 200 ms (B1) or 400 ms (B2) in 50 ms
steps. Reproduced when all three times are within the paper's s.e.m. under one bin reading;
partially for two of three. The selective neurons are those of selective-fraction under each of
its readings. Answered 2026-10-21, none given by the paper: lick-early trials (K1 dropped, K2
kept); the window of the preference counts (D1 whole trial, D2 delay epoch, D3 each bin); the label
of a bin (L1 centre, L2 end); the end of the search (E1 the go cue, E2 1.6 s after it, the end of
the windows; the paper's late-delay time of 327 ms after an offset 0.3 s before the go cue falls
after the go cue). The outcome is the one all of them give, else methods_underspecified. Trials
are counted per condition (N1, the legend's words); per condition and trial type (N2) is a variant.
The measured time is that of the population of all included neurons; the bootstrap (200 resamples
of neurons) mean and s.d. are shown beside it.
t0 = time.time()
rec1 = pd.concat([L.recovery_readings(e1, S, OFF1, SEL[early], early)[0] for early in ("drop", "keep")], ignore_index=True)
rec1 = rec1.rename(columns={"early": "early_lick"})
exp1g = {"sample": (373, 260), "early_delay": (510, 218), "late_delay": (327, 112)}
for c, (v, tol) in exp1g.items():
rec1[c + "_ok"] = (rec1[c] - v).abs() <= tol
rec1["n_ok"] = (rec1.n - 55).abs() <= 5.5
rec1["times_ok"] = rec1[[c + "_ok" for c in exp1g]].sum(axis=1)
print(f"{len(rec1)} reading combinations in {time.time() - t0:.0f} s")
print("pref: trial = D1, delay = D2, bin = D3; label: centre = L1, end = L2; search: E1 to the go cue, E2 to 1.6 s after it.")
print("Trials counted per condition (N1, decides the outcome):")
show = ["early_lick", "pref", "label", "search", "bin", "S", "n", "sample", "early_delay", "late_delay", "sample_boot", "sample_sd",
"early_delay_boot", "early_delay_sd", "late_delay_boot", "late_delay_sd", "times_ok"]
print(rec1[rec1.trials_rule == "per condition"][show].round(0).to_string(index=False))
768 reading combinations in 85 s
pref: trial = D1, delay = D2, bin = D3; label: centre = L1, end = L2; search: E1 to the go cue, E2 to 1.6 s after it.
Trials counted per condition (N1, decides the outcome):
early_lick pref label search bin S n sample early_delay late_delay sample_boot sample_sd early_delay_boot early_delay_sd late_delay_boot late_delay_sd times_ok
drop trial centre E1 0.0 R1-O1-student 162 300.0 450.0 300.0 406.0 236.0 327.0 169.0 256.0 51.0 3
drop trial centre E2 0.0 R1-O1-student 162 300.0 450.0 300.0 406.0 236.0 475.0 377.0 329.0 118.0 3
drop trial end E1 0.0 R1-O1-student 162 400.0 550.0 NaN 506.0 236.0 416.0 155.0 280.0 31.0 2
drop trial end E2 0.0 R1-O1-student 162 400.0 550.0 400.0 506.0 236.0 575.0 377.0 429.0 118.0 3
drop trial centre E1 0.0 R1-O1-welch 162 300.0 450.0 300.0 397.0 212.0 354.0 184.0 273.0 38.0 3
drop trial centre E2 0.0 R1-O1-welch 162 300.0 450.0 300.0 406.0 245.0 533.0 392.0 334.0 107.0 3
drop trial end E1 0.0 R1-O1-welch 162 400.0 550.0 NaN 497.0 212.0 436.0 166.0 297.0 12.0 2
drop trial end E2 0.0 R1-O1-welch 162 400.0 550.0 400.0 506.0 245.0 633.0 392.0 434.0 107.0 3
drop trial centre E1 0.0 R1-O2-student 138 300.0 450.0 300.0 336.0 191.0 448.0 155.0 276.0 43.0 3
drop trial centre E2 0.0 R1-O2-student 138 300.0 450.0 300.0 336.0 191.0 577.0 325.0 362.0 119.0 3
drop trial end E1 0.0 R1-O2-student 138 400.0 550.0 NaN 436.0 191.0 511.0 119.0 275.0 25.0 2
drop trial end E2 0.0 R1-O2-student 138 400.0 550.0 400.0 436.0 191.0 677.0 325.0 462.0 119.0 3
drop trial centre E1 0.0 R1-O2-welch 138 300.0 750.0 300.0 394.0 245.0 465.0 172.0 282.0 41.0 2
drop trial centre E2 0.0 R1-O2-welch 138 300.0 750.0 300.0 394.0 245.0 658.0 407.0 365.0 111.0 2
drop trial end E1 0.0 R1-O2-welch 138 400.0 NaN NaN 494.0 245.0 527.0 145.0 275.0 25.0 1
drop trial end E2 0.0 R1-O2-welch 138 400.0 850.0 400.0 494.0 245.0 758.0 407.0 465.0 111.0 2
drop trial centre E1 0.0 R2-O1-student 161 300.0 450.0 300.0 386.0 216.0 386.0 153.0 251.0 52.0 3
drop trial centre E2 0.0 R2-O1-student 161 300.0 450.0 300.0 386.0 216.0 531.0 356.0 318.0 104.0 3
drop trial end E1 0.0 R2-O1-student 161 400.0 550.0 NaN 486.0 216.0 476.0 143.0 285.0 31.0 2
drop trial end E2 0.0 R2-O1-student 161 400.0 550.0 400.0 486.0 216.0 631.0 356.0 418.0 104.0 3
drop trial centre E1 0.0 R2-O1-welch 161 300.0 450.0 300.0 420.0 228.0 359.0 179.0 262.0 45.0 3
drop trial centre E2 0.0 R2-O1-welch 161 300.0 450.0 300.0 428.0 257.0 541.0 389.0 326.0 118.0 3
drop trial end E1 0.0 R2-O1-welch 161 400.0 550.0 NaN 520.0 228.0 438.0 159.0 274.0 46.0 2
drop trial end E2 0.0 R2-O1-welch 161 400.0 550.0 400.0 528.0 257.0 641.0 389.0 425.0 120.0 3
drop trial centre E1 0.0 R2-O2-student 139 300.0 450.0 300.0 370.0 227.0 436.0 169.0 269.0 49.0 3
drop trial centre E2 0.0 R2-O2-student 139 300.0 450.0 300.0 370.0 227.0 613.0 373.0 352.0 132.0 3
drop trial end E1 0.0 R2-O2-student 139 400.0 550.0 NaN 470.0 227.0 503.0 141.0 272.0 35.0 2
drop trial end E2 0.0 R2-O2-student 139 400.0 550.0 400.0 470.0 227.0 713.0 373.0 452.0 132.0 3
drop trial centre E1 0.0 R2-O2-welch 140 300.0 750.0 300.0 386.0 230.0 466.0 184.0 278.0 41.0 2
drop trial centre E2 0.0 R2-O2-welch 140 300.0 750.0 300.0 409.0 296.0 653.0 383.0 344.0 112.0 2
drop trial end E1 0.0 R2-O2-welch 140 400.0 NaN NaN 486.0 230.0 504.0 140.0 291.0 20.0 1
drop trial end E2 0.0 R2-O2-welch 140 400.0 850.0 400.0 509.0 296.0 753.0 383.0 444.0 112.0 2
drop delay centre E1 0.0 R1-O1-student 162 200.0 250.0 300.0 289.0 152.0 271.0 123.0 282.0 31.0 2
drop delay centre E2 0.0 R1-O1-student 162 200.0 250.0 300.0 289.0 152.0 350.0 285.0 296.0 49.0 2
drop delay end E1 0.0 R1-O1-student 162 300.0 350.0 NaN 388.0 152.0 366.0 113.0 290.0 20.0 2
drop delay end E2 0.0 R1-O1-student 162 300.0 350.0 400.0 388.0 152.0 450.0 285.0 396.0 49.0 3
drop delay centre E1 0.0 R1-O1-welch 162 200.0 250.0 300.0 283.0 136.0 275.0 139.0 283.0 30.0 2
drop delay centre E2 0.0 R1-O1-welch 162 200.0 250.0 300.0 283.0 136.0 368.0 332.0 296.0 43.0 2
drop delay end E1 0.0 R1-O1-welch 162 300.0 350.0 NaN 383.0 136.0 361.0 114.0 295.0 15.0 2
drop delay end E2 0.0 R1-O1-welch 162 300.0 350.0 400.0 383.0 136.0 468.0 332.0 396.0 43.0 3
drop delay centre E1 0.0 R1-O2-student 138 300.0 300.0 300.0 279.0 128.0 297.0 140.0 272.0 38.0 3
drop delay centre E2 0.0 R1-O2-student 138 300.0 300.0 300.0 279.0 128.0 349.0 249.0 281.0 47.0 3
drop delay end E1 0.0 R1-O2-student 138 400.0 400.0 NaN 379.0 128.0 382.0 113.0 296.0 14.0 2
drop delay end E2 0.0 R1-O2-student 138 400.0 400.0 400.0 379.0 128.0 449.0 249.0 381.0 47.0 3
drop delay centre E1 0.0 R1-O2-welch 138 300.0 300.0 300.0 299.0 132.0 289.0 141.0 275.0 36.0 3
drop delay centre E2 0.0 R1-O2-welch 138 300.0 300.0 300.0 299.0 132.0 341.0 256.0 287.0 49.0 3
drop delay end E1 0.0 R1-O2-welch 138 400.0 400.0 NaN 399.0 132.0 371.0 109.0 295.0 15.0 2
drop delay end E2 0.0 R1-O2-welch 138 400.0 400.0 400.0 399.0 132.0 441.0 256.0 387.0 49.0 3
drop delay centre E1 0.0 R2-O1-student 161 250.0 250.0 300.0 275.0 138.0 283.0 121.0 281.0 33.0 2
drop delay centre E2 0.0 R2-O1-student 161 250.0 250.0 300.0 275.0 138.0 388.0 331.0 289.0 43.0 2
drop delay end E1 0.0 R2-O1-student 161 350.0 350.0 NaN 375.0 138.0 377.0 110.0 293.0 17.0 2
drop delay end E2 0.0 R2-O1-student 161 350.0 350.0 400.0 375.0 138.0 488.0 331.0 389.0 43.0 3
drop delay centre E1 0.0 R2-O1-welch 161 200.0 250.0 300.0 280.0 148.0 268.0 142.0 283.0 29.0 2
drop delay centre E2 0.0 R2-O1-welch 161 200.0 250.0 300.0 280.0 148.0 357.0 317.0 290.0 38.0 2
drop delay end E1 0.0 R2-O1-welch 161 300.0 350.0 NaN 380.0 148.0 354.0 117.0 294.0 17.0 2
drop delay end E2 0.0 R2-O1-welch 161 300.0 350.0 400.0 380.0 148.0 457.0 317.0 390.0 38.0 3
drop delay centre E1 0.0 R2-O2-student 139 300.0 250.0 300.0 271.0 133.0 268.0 109.0 272.0 37.0 2
drop delay centre E2 0.0 R2-O2-student 139 300.0 250.0 300.0 271.0 133.0 336.0 261.0 275.0 42.0 2
drop delay end E1 0.0 R2-O2-student 139 400.0 350.0 NaN 370.0 134.0 363.0 97.0 290.0 20.0 2
drop delay end E2 0.0 R2-O2-student 139 400.0 350.0 400.0 370.0 134.0 436.0 261.0 375.0 42.0 3
drop delay centre E1 0.0 R2-O2-welch 140 300.0 250.0 300.0 270.0 136.0 288.0 144.0 277.0 32.0 2
drop delay centre E2 0.0 R2-O2-welch 140 300.0 250.0 300.0 270.0 136.0 363.0 298.0 282.0 37.0 2
drop delay end E1 0.0 R2-O2-welch 140 400.0 350.0 NaN 369.0 136.0 364.0 99.0 283.0 24.0 2
drop delay end E2 0.0 R2-O2-welch 140 400.0 350.0 400.0 369.0 136.0 463.0 298.0 382.0 37.0 3
drop bin centre E1 0.0 R1-O1-student 162 450.0 250.0 300.0 310.0 208.0 248.0 142.0 295.0 22.0 2
drop bin centre E2 0.0 R1-O1-student 162 450.0 250.0 300.0 310.0 208.0 285.0 230.0 342.0 81.0 2
drop bin end E1 0.0 R1-O1-student 162 550.0 350.0 NaN 410.0 208.0 343.0 133.0 288.0 22.0 2
drop bin end E2 0.0 R1-O1-student 162 550.0 350.0 400.0 410.0 208.0 385.0 230.0 442.0 81.0 3
drop bin centre E1 0.0 R1-O1-welch 162 450.0 350.0 300.0 345.0 203.0 273.0 182.0 297.0 13.0 3
drop bin centre E2 0.0 R1-O1-welch 162 450.0 350.0 300.0 345.0 203.0 348.0 304.0 358.0 109.0 3
drop bin end E1 0.0 R1-O1-welch 162 550.0 450.0 NaN 445.0 203.0 344.0 140.0 300.0 0.0 2
drop bin end E2 0.0 R1-O1-welch 162 550.0 450.0 400.0 445.0 203.0 448.0 304.0 458.0 109.0 3
drop bin centre E1 0.0 R1-O2-student 138 300.0 350.0 NaN 330.0 169.0 302.0 177.0 296.0 16.0 2
drop bin centre E2 0.0 R1-O2-student 138 300.0 350.0 350.0 330.0 169.0 324.0 224.0 395.0 117.0 3
drop bin end E1 0.0 R1-O2-student 138 400.0 450.0 NaN 430.0 169.0 371.0 135.0 300.0 0.0 2
drop bin end E2 0.0 R1-O2-student 138 400.0 450.0 450.0 430.0 169.0 424.0 224.0 495.0 117.0 2
drop bin centre E1 0.0 R1-O2-welch 138 450.0 250.0 NaN 377.0 217.0 268.0 158.0 298.0 13.0 1
drop bin centre E2 0.0 R1-O2-welch 138 450.0 250.0 350.0 377.0 217.0 292.0 216.0 379.0 101.0 2
drop bin end E1 0.0 R1-O2-welch 138 550.0 350.0 NaN 477.0 217.0 347.0 123.0 300.0 0.0 2
drop bin end E2 0.0 R1-O2-welch 138 550.0 350.0 450.0 477.0 217.0 392.0 216.0 479.0 101.0 2
drop bin centre E1 0.0 R2-O1-student 161 400.0 250.0 300.0 297.0 185.0 265.0 152.0 295.0 21.0 2
drop bin centre E2 0.0 R2-O1-student 161 400.0 250.0 300.0 297.0 185.0 310.0 242.0 340.0 99.0 2
drop bin end E1 0.0 R2-O1-student 161 500.0 350.0 NaN 396.0 186.0 356.0 140.0 288.0 22.0 2
drop bin end E2 0.0 R2-O1-student 161 500.0 350.0 400.0 396.0 186.0 410.0 243.0 440.0 99.0 3
drop bin centre E1 0.0 R2-O1-welch 161 450.0 250.0 300.0 340.0 199.0 255.0 169.0 296.0 15.0 2
drop bin centre E2 0.0 R2-O1-welch 161 450.0 250.0 300.0 340.0 199.0 313.0 282.0 356.0 134.0 2
drop bin end E1 0.0 R2-O1-welch 161 550.0 350.0 NaN 440.0 200.0 335.0 138.0 300.0 0.0 2
drop bin end E2 0.0 R2-O1-welch 161 550.0 350.0 400.0 440.0 200.0 413.0 282.0 456.0 134.0 3
drop bin centre E1 0.0 R2-O2-student 139 300.0 250.0 300.0 314.0 177.0 270.0 151.0 290.0 27.0 2
drop bin centre E2 0.0 R2-O2-student 139 300.0 250.0 300.0 314.0 177.0 318.0 249.0 366.0 117.0 2
drop bin end E1 0.0 R2-O2-student 139 400.0 350.0 NaN 414.0 177.0 359.0 134.0 290.0 20.0 2
drop bin end E2 0.0 R2-O2-student 139 400.0 350.0 400.0 414.0 177.0 418.0 249.0 466.0 117.0 3
drop bin centre E1 0.0 R2-O2-welch 140 300.0 200.0 300.0 337.0 202.0 245.0 142.0 296.0 16.0 2
drop bin centre E2 0.0 R2-O2-welch 140 300.0 200.0 300.0 337.0 202.0 274.0 220.0 351.0 106.0 2
drop bin end E1 0.0 R2-O2-welch 140 400.0 300.0 NaN 437.0 202.0 334.0 122.0 300.0 0.0 2
drop bin end E2 0.0 R2-O2-welch 140 400.0 300.0 400.0 437.0 202.0 374.0 220.0 451.0 106.0 3
drop trial centre E1 0.0 R1-O1-student 162 400.0 NaN NaN 518.0 263.0 366.0 149.0 265.0 38.0 1
drop trial centre E2 0.0 R1-O1-student 162 400.0 1200.0 350.0 518.0 263.0 638.0 427.0 372.0 178.0 2
drop trial end E1 0.0 R1-O1-student 162 600.0 NaN NaN 718.0 263.0 550.0 133.0 NaN NaN 1
drop trial end E2 0.0 R1-O1-student 162 600.0 1400.0 550.0 718.0 263.0 838.0 427.0 572.0 178.0 1
drop trial centre E1 0.0 R1-O1-welch 162 400.0 650.0 NaN 504.0 242.0 384.0 155.0 268.0 34.0 2
drop trial centre E2 0.0 R1-O1-welch 162 400.0 650.0 350.0 512.0 271.0 724.0 455.0 391.0 184.0 3
drop trial end E1 0.0 R1-O1-welch 162 600.0 NaN NaN 704.0 242.0 556.0 130.0 NaN NaN 1
drop trial end E2 0.0 R1-O1-welch 162 600.0 850.0 550.0 712.0 271.0 924.0 455.0 591.0 184.0 1
drop trial centre E1 0.0 R1-O2-student 138 400.0 650.0 NaN 461.0 272.0 456.0 133.0 265.0 36.0 2
drop trial centre E2 0.0 R1-O2-student 138 400.0 650.0 350.0 476.0 305.0 720.0 390.0 422.0 193.0 3
drop trial end E1 0.0 R1-O2-student 138 600.0 NaN NaN 661.0 272.0 630.0 115.0 NaN NaN 1
drop trial end E2 0.0 R1-O2-student 138 600.0 850.0 550.0 676.0 305.0 920.0 390.0 622.0 193.0 1
drop trial centre E1 0.0 R1-O2-welch 138 400.0 650.0 NaN 523.0 298.0 464.0 134.0 267.0 36.0 2
drop trial centre E2 0.0 R1-O2-welch 138 400.0 650.0 350.0 575.0 400.0 768.0 407.0 423.0 196.0 3
drop trial end E1 0.0 R1-O2-welch 138 600.0 NaN NaN 723.0 298.0 632.0 116.0 NaN NaN 1
drop trial end E2 0.0 R1-O2-welch 138 600.0 850.0 550.0 775.0 400.0 968.0 407.0 623.0 196.0 1
drop trial centre E1 0.0 R2-O1-student 161 400.0 650.0 NaN 494.0 249.0 427.0 144.0 267.0 39.0 2
drop trial centre E2 0.0 R2-O1-student 161 400.0 650.0 350.0 508.0 283.0 715.0 425.0 366.0 165.0 3
drop trial end E1 0.0 R2-O1-student 161 600.0 NaN NaN 694.0 249.0 599.0 124.0 NaN NaN 1
drop trial end E2 0.0 R2-O1-student 161 600.0 850.0 550.0 708.0 283.0 915.0 425.0 566.0 165.0 1
drop trial centre E1 0.0 R2-O1-welch 161 400.0 NaN NaN 539.0 250.0 370.0 147.0 264.0 40.0 1
drop trial centre E2 0.0 R2-O1-welch 161 400.0 1300.0 350.0 553.0 288.0 740.0 461.0 382.0 189.0 2
drop trial end E1 0.0 R2-O1-welch 161 600.0 NaN NaN 739.0 250.0 556.0 137.0 NaN NaN 1
drop trial end E2 0.0 R2-O1-welch 161 600.0 1500.0 550.0 753.0 288.0 940.0 461.0 582.0 189.0 1
drop trial centre E1 0.0 R2-O2-student 139 400.0 650.0 NaN 478.0 271.0 431.0 138.0 263.0 38.0 2
drop trial centre E2 0.0 R2-O2-student 139 400.0 650.0 350.0 524.0 374.0 780.0 436.0 411.0 223.0 3
drop trial end E1 0.0 R2-O2-student 139 600.0 NaN NaN 678.0 271.0 608.0 123.0 NaN NaN 1
drop trial end E2 0.0 R2-O2-student 139 600.0 850.0 550.0 724.0 374.0 980.0 436.0 611.0 223.0 1
drop trial centre E1 0.0 R2-O2-welch 140 400.0 NaN NaN 524.0 288.0 447.0 140.0 271.0 34.0 1
drop trial centre E2 0.0 R2-O2-welch 140 400.0 1300.0 350.0 576.0 395.0 786.0 426.0 377.0 157.0 2
drop trial end E1 0.0 R2-O2-welch 140 600.0 NaN NaN 724.0 288.0 624.0 126.0 NaN NaN 1
drop trial end E2 0.0 R2-O2-welch 140 600.0 1500.0 550.0 776.0 395.0 986.0 426.0 577.0 157.0 1
drop delay centre E1 0.0 R1-O1-student 162 300.0 300.0 300.0 343.0 163.0 299.0 120.0 273.0 34.0 3
drop delay centre E2 0.0 R1-O1-student 162 300.0 300.0 300.0 343.0 163.0 476.0 399.0 319.0 60.0 3
drop delay end E1 0.0 R1-O1-student 162 500.0 500.0 NaN 542.0 163.0 478.0 76.0 NaN NaN 2
drop delay end E2 0.0 R1-O1-student 162 500.0 500.0 500.0 542.0 163.0 676.0 399.0 519.0 60.0 2
drop delay centre E1 0.0 R1-O1-welch 162 300.0 300.0 300.0 351.0 165.0 295.0 115.0 274.0 32.0 3
drop delay centre E2 0.0 R1-O1-welch 162 300.0 300.0 300.0 351.0 165.0 480.0 397.0 324.0 56.0 3
drop delay end E1 0.0 R1-O1-welch 162 500.0 500.0 NaN 551.0 165.0 480.0 86.0 NaN NaN 2
drop delay end E2 0.0 R1-O1-welch 162 500.0 500.0 500.0 551.0 165.0 680.0 397.0 524.0 56.0 2
drop delay centre E1 0.0 R1-O2-student 138 350.0 350.0 300.0 322.0 147.0 324.0 131.0 265.0 32.0 3
drop delay centre E2 0.0 R1-O2-student 138 350.0 350.0 300.0 322.0 147.0 436.0 321.0 306.0 60.0 3
drop delay end E1 0.0 R1-O2-student 138 550.0 550.0 NaN 522.0 147.0 503.0 102.0 NaN NaN 2
drop delay end E2 0.0 R1-O2-student 138 550.0 550.0 500.0 522.0 147.0 636.0 321.0 506.0 60.0 2
drop delay centre E1 0.0 R1-O2-welch 138 350.0 350.0 300.0 337.0 139.0 322.0 133.0 265.0 34.0 3
drop delay centre E2 0.0 R1-O2-welch 138 350.0 350.0 300.0 337.0 139.0 457.0 338.0 311.0 64.0 3
drop delay end E1 0.0 R1-O2-welch 138 550.0 550.0 NaN 537.0 139.0 501.0 105.0 NaN NaN 2
drop delay end E2 0.0 R1-O2-welch 138 550.0 550.0 500.0 537.0 139.0 657.0 338.0 511.0 64.0 2
drop delay centre E1 0.0 R2-O1-student 161 300.0 300.0 300.0 320.0 156.0 315.0 118.0 274.0 32.0 3
drop delay centre E2 0.0 R2-O1-student 161 300.0 300.0 300.0 320.0 156.0 514.0 417.0 312.0 55.0 3
drop delay end E1 0.0 R2-O1-student 161 500.0 500.0 NaN 520.0 156.0 501.0 97.0 NaN NaN 2
drop delay end E2 0.0 R2-O1-student 161 500.0 500.0 500.0 520.0 156.0 714.0 417.0 512.0 55.0 2
drop delay centre E1 0.0 R2-O1-welch 161 300.0 300.0 300.0 330.0 158.0 282.0 108.0 273.0 32.0 3
drop delay centre E2 0.0 R2-O1-welch 161 300.0 300.0 300.0 330.0 158.0 516.0 437.0 309.0 51.0 3
drop delay end E1 0.0 R2-O1-welch 161 500.0 500.0 NaN 530.0 158.0 479.0 104.0 NaN NaN 2
drop delay end E2 0.0 R2-O1-welch 161 500.0 500.0 500.0 530.0 158.0 716.0 437.0 509.0 51.0 2
drop delay centre E1 0.0 R2-O2-student 139 300.0 300.0 300.0 305.0 138.0 302.0 109.0 263.0 33.0 3
drop delay centre E2 0.0 R2-O2-student 139 300.0 300.0 300.0 305.0 138.0 451.0 359.0 293.0 56.0 3
drop delay end E1 0.0 R2-O2-student 139 500.0 500.0 NaN 504.0 141.0 488.0 81.0 NaN NaN 2
drop delay end E2 0.0 R2-O2-student 139 500.0 500.0 500.0 504.0 141.0 651.0 359.0 493.0 56.0 2
drop delay centre E1 0.0 R2-O2-welch 140 300.0 300.0 300.0 306.0 140.0 309.0 123.0 269.0 34.0 3
drop delay centre E2 0.0 R2-O2-welch 140 300.0 300.0 300.0 306.0 140.0 463.0 369.0 296.0 55.0 3
drop delay end E1 0.0 R2-O2-welch 140 500.0 500.0 NaN 506.0 141.0 489.0 91.0 NaN NaN 2
drop delay end E2 0.0 R2-O2-welch 140 500.0 500.0 500.0 506.0 141.0 663.0 369.0 496.0 55.0 2
drop bin centre E1 0.0 R1-O1-student 162 400.0 550.0 NaN 444.0 193.0 358.0 147.0 288.0 21.0 2
drop bin centre E2 0.0 R1-O1-student 162 400.0 550.0 350.0 444.0 193.0 503.0 350.0 398.0 181.0 3
drop bin end E1 0.0 R1-O1-student 162 600.0 750.0 NaN 644.0 193.0 536.0 127.0 NaN NaN 1
drop bin end E2 0.0 R1-O1-student 162 600.0 750.0 550.0 644.0 193.0 703.0 350.0 598.0 181.0 1
drop bin centre E1 0.0 R1-O1-welch 162 450.0 600.0 NaN 470.0 190.0 362.0 151.0 293.0 17.0 2
drop bin centre E2 0.0 R1-O1-welch 162 450.0 600.0 400.0 470.0 190.0 590.0 391.0 432.0 186.0 3
drop bin end E1 0.0 R1-O1-welch 162 650.0 800.0 NaN 670.0 190.0 544.0 135.0 NaN NaN 0
drop bin end E2 0.0 R1-O1-welch 162 650.0 800.0 600.0 670.0 190.0 790.0 391.0 632.0 186.0 0
drop bin centre E1 0.0 R1-O2-student 138 400.0 600.0 NaN 402.0 169.0 402.0 164.0 286.0 25.0 2
drop bin centre E2 0.0 R1-O2-student 138 400.0 600.0 400.0 402.0 169.0 527.0 332.0 460.0 212.0 3
drop bin end E1 0.0 R1-O2-student 138 600.0 800.0 NaN 602.0 169.0 563.0 140.0 NaN NaN 1
drop bin end E2 0.0 R1-O2-student 138 600.0 800.0 600.0 602.0 169.0 727.0 332.0 660.0 212.0 1
drop bin centre E1 0.0 R1-O2-welch 138 450.0 600.0 NaN 465.0 200.0 392.0 161.0 288.0 22.0 2
drop bin centre E2 0.0 R1-O2-welch 138 450.0 600.0 400.0 465.0 200.0 566.0 383.0 428.0 160.0 3
drop bin end E1 0.0 R1-O2-welch 138 650.0 800.0 NaN 665.0 200.0 567.0 145.0 NaN NaN 0
drop bin end E2 0.0 R1-O2-welch 138 650.0 800.0 600.0 665.0 200.0 766.0 383.0 628.0 160.0 0
drop bin centre E1 0.0 R2-O1-student 161 400.0 550.0 NaN 421.0 183.0 377.0 150.0 289.0 22.0 2
drop bin centre E2 0.0 R2-O1-student 161 400.0 550.0 400.0 421.0 183.0 549.0 384.0 439.0 223.0 3
drop bin end E1 0.0 R2-O1-student 161 600.0 750.0 NaN 621.0 183.0 560.0 138.0 NaN NaN 1
drop bin end E2 0.0 R2-O1-student 161 600.0 750.0 600.0 621.0 183.0 749.0 384.0 639.0 223.0 1
drop bin centre E1 0.0 R2-O1-welch 161 450.0 550.0 NaN 442.0 178.0 365.0 158.0 293.0 17.0 2
drop bin centre E2 0.0 R2-O1-welch 161 450.0 550.0 400.0 442.0 178.0 607.0 424.0 459.0 271.0 3
drop bin end E1 0.0 R2-O1-welch 161 650.0 750.0 NaN 642.0 178.0 547.0 144.0 NaN NaN 0
drop bin end E2 0.0 R2-O1-welch 161 650.0 750.0 600.0 642.0 178.0 807.0 424.0 659.0 271.0 0
drop bin centre E1 0.0 R2-O2-student 139 400.0 450.0 NaN 401.0 173.0 364.0 153.0 277.0 28.0 2
drop bin centre E2 0.0 R2-O2-student 139 400.0 450.0 350.0 409.0 204.0 541.0 368.0 420.0 191.0 3
drop bin end E1 0.0 R2-O2-student 139 600.0 650.0 NaN 601.0 173.0 539.0 130.0 NaN NaN 2
drop bin end E2 0.0 R2-O2-student 139 600.0 650.0 550.0 609.0 204.0 741.0 368.0 620.0 191.0 2
drop bin centre E1 0.0 R2-O2-welch 140 450.0 450.0 NaN 440.0 183.0 365.0 155.0 291.0 21.0 2
drop bin centre E2 0.0 R2-O2-welch 140 450.0 450.0 350.0 440.0 183.0 530.0 356.0 383.0 134.0 3
drop bin end E1 0.0 R2-O2-welch 140 650.0 650.0 NaN 640.0 183.0 540.0 135.0 NaN NaN 1
drop bin end E2 0.0 R2-O2-welch 140 650.0 650.0 550.0 640.0 183.0 730.0 356.0 583.0 134.0 1
keep trial centre E1 0.0 R1-O1-student 173 150.0 650.0 NaN 132.0 46.0 566.0 152.0 248.0 60.0 2
keep trial centre E2 0.0 R1-O1-student 173 150.0 650.0 400.0 132.0 46.0 621.0 218.0 358.0 86.0 3
keep trial end E1 0.0 R1-O1-student 173 250.0 750.0 NaN 232.0 47.0 659.0 150.0 262.0 41.0 1
keep trial end E2 0.0 R1-O1-student 173 250.0 750.0 500.0 232.0 47.0 721.0 218.0 458.0 86.0 1
keep trial centre E1 0.0 R1-O1-welch 170 100.0 650.0 NaN 125.0 48.0 571.0 147.0 259.0 49.0 1
keep trial centre E2 0.0 R1-O1-welch 170 100.0 650.0 350.0 125.0 48.0 670.0 254.0 352.0 83.0 2
keep trial end E1 0.0 R1-O1-welch 170 200.0 750.0 NaN 225.0 49.0 663.0 145.0 281.0 30.0 1
keep trial end E2 0.0 R1-O1-welch 170 200.0 750.0 450.0 225.0 49.0 770.0 254.0 452.0 83.0 1
keep trial centre E1 0.0 R1-O2-student 142 150.0 750.0 NaN 153.0 73.0 597.0 171.0 250.0 62.0 1
keep trial centre E2 0.0 R1-O2-student 142 150.0 750.0 350.0 153.0 73.0 820.0 314.0 338.0 82.0 2
keep trial end E1 0.0 R1-O2-student 142 250.0 NaN NaN 253.0 73.0 641.0 165.0 253.0 31.0 1
keep trial end E2 0.0 R1-O2-student 142 250.0 850.0 450.0 253.0 73.0 920.0 314.0 438.0 82.0 1
keep trial centre E1 0.0 R1-O2-welch 142 150.0 750.0 NaN 161.0 71.0 592.0 183.0 251.0 63.0 1
keep trial centre E2 0.0 R1-O2-welch 142 150.0 750.0 350.0 161.0 71.0 800.0 319.0 336.0 81.0 2
keep trial end E1 0.0 R1-O2-welch 142 250.0 NaN NaN 261.0 71.0 634.0 180.0 250.0 29.0 1
keep trial end E2 0.0 R1-O2-welch 142 250.0 850.0 450.0 261.0 71.0 900.0 319.0 436.0 81.0 1
keep trial centre E1 0.0 R2-O1-student 170 150.0 650.0 NaN 137.0 44.0 543.0 177.0 242.0 53.0 2
keep trial centre E2 0.0 R2-O1-student 170 150.0 650.0 400.0 137.0 44.0 631.0 269.0 369.0 84.0 3
keep trial end E1 0.0 R2-O1-student 170 250.0 750.0 NaN 237.0 46.0 627.0 173.0 287.0 22.0 1
keep trial end E2 0.0 R2-O1-student 170 250.0 750.0 500.0 237.0 46.0 731.0 269.0 469.0 84.0 1
keep trial centre E1 0.0 R2-O1-welch 171 150.0 650.0 NaN 139.0 52.0 528.0 186.0 222.0 70.0 2
keep trial centre E2 0.0 R2-O1-welch 171 150.0 650.0 400.0 139.0 52.0 618.0 287.0 355.0 92.0 3
keep trial end E1 0.0 R2-O1-welch 171 250.0 750.0 NaN 238.0 53.0 615.0 181.0 265.0 40.0 1
keep trial end E2 0.0 R2-O1-welch 171 250.0 750.0 500.0 238.0 53.0 718.0 287.0 455.0 92.0 1
keep trial centre E1 0.0 R2-O2-student 140 150.0 700.0 NaN 150.0 61.0 617.0 177.0 241.0 62.0 2
keep trial centre E2 0.0 R2-O2-student 140 150.0 700.0 350.0 150.0 61.0 747.0 282.0 322.0 84.0 3
keep trial end E1 0.0 R2-O2-student 140 250.0 800.0 NaN 250.0 61.0 668.0 181.0 254.0 39.0 1
keep trial end E2 0.0 R2-O2-student 140 250.0 800.0 450.0 250.0 61.0 847.0 282.0 422.0 84.0 1
keep trial centre E1 0.0 R2-O2-welch 140 150.0 700.0 NaN 163.0 71.0 586.0 202.0 239.0 63.0 2
keep trial centre E2 0.0 R2-O2-welch 140 150.0 700.0 350.0 163.0 71.0 718.0 301.0 321.0 86.0 3
keep trial end E1 0.0 R2-O2-welch 140 250.0 800.0 NaN 263.0 71.0 641.0 204.0 252.0 30.0 1
keep trial end E2 0.0 R2-O2-welch 140 250.0 800.0 450.0 263.0 71.0 818.0 301.0 421.0 86.0 1
keep delay centre E1 0.0 R1-O1-student 173 100.0 700.0 300.0 116.0 39.0 358.0 190.0 267.0 44.0 2
keep delay centre E2 0.0 R1-O1-student 173 100.0 700.0 300.0 116.0 39.0 444.0 284.0 278.0 57.0 2
keep delay end E1 0.0 R1-O1-student 173 200.0 800.0 NaN 216.0 41.0 451.0 184.0 294.0 17.0 1
keep delay end E2 0.0 R1-O1-student 173 200.0 800.0 400.0 216.0 41.0 544.0 284.0 378.0 57.0 2
keep delay centre E1 0.0 R1-O1-welch 170 100.0 700.0 300.0 125.0 36.0 385.0 211.0 268.0 44.0 2
keep delay centre E2 0.0 R1-O1-welch 170 100.0 700.0 300.0 125.0 36.0 516.0 347.0 279.0 57.0 2
keep delay end E1 0.0 R1-O1-welch 170 200.0 800.0 NaN 225.0 37.0 463.0 194.0 288.0 21.0 1
keep delay end E2 0.0 R1-O1-welch 170 200.0 800.0 400.0 225.0 37.0 616.0 347.0 379.0 57.0 2
keep delay centre E1 0.0 R1-O2-student 142 150.0 NaN 300.0 146.0 45.0 365.0 217.0 270.0 44.0 2
keep delay centre E2 0.0 R1-O2-student 142 150.0 850.0 300.0 146.0 45.0 557.0 368.0 280.0 50.0 2
keep delay end E1 0.0 R1-O2-student 142 250.0 NaN NaN 246.0 45.0 425.0 184.0 287.0 22.0 1
keep delay end E2 0.0 R1-O2-student 142 250.0 950.0 400.0 246.0 45.0 657.0 368.0 380.0 50.0 2
keep delay centre E1 0.0 R1-O2-welch 142 150.0 NaN 300.0 148.0 41.0 360.0 216.0 271.0 43.0 2
keep delay centre E2 0.0 R1-O2-welch 142 150.0 850.0 300.0 148.0 41.0 563.0 371.0 280.0 49.0 2
keep delay end E1 0.0 R1-O2-welch 142 250.0 NaN NaN 248.0 41.0 426.0 190.0 288.0 21.0 1
keep delay end E2 0.0 R1-O2-welch 142 250.0 950.0 400.0 248.0 41.0 663.0 371.0 380.0 49.0 2
keep delay centre E1 0.0 R2-O1-student 170 100.0 700.0 300.0 126.0 37.0 368.0 200.0 273.0 42.0 2
keep delay centre E2 0.0 R2-O1-student 170 100.0 700.0 300.0 126.0 37.0 488.0 330.0 287.0 57.0 2
keep delay end E1 0.0 R2-O1-student 170 200.0 800.0 NaN 225.0 39.0 447.0 182.0 289.0 21.0 1
keep delay end E2 0.0 R2-O1-student 170 200.0 800.0 400.0 225.0 39.0 588.0 330.0 387.0 57.0 2
keep delay centre E1 0.0 R2-O1-welch 171 100.0 700.0 300.0 122.0 33.0 353.0 199.0 271.0 43.0 2
keep delay centre E2 0.0 R2-O1-welch 171 100.0 700.0 300.0 122.0 33.0 491.0 352.0 281.0 52.0 2
keep delay end E1 0.0 R2-O1-welch 171 200.0 800.0 NaN 221.0 35.0 425.0 171.0 293.0 18.0 1
keep delay end E2 0.0 R2-O1-welch 171 200.0 800.0 400.0 221.0 35.0 591.0 352.0 381.0 52.0 2
keep delay centre E1 0.0 R2-O2-student 140 150.0 NaN 300.0 140.0 45.0 367.0 227.0 268.0 44.0 2
keep delay centre E2 0.0 R2-O2-student 140 150.0 1000.0 300.0 140.0 45.0 604.0 400.0 278.0 53.0 2
keep delay end E1 0.0 R2-O2-student 140 250.0 NaN NaN 240.0 45.0 408.0 178.0 282.0 24.0 1
keep delay end E2 0.0 R2-O2-student 140 250.0 1100.0 400.0 240.0 45.0 704.0 400.0 378.0 53.0 2
keep delay centre E1 0.0 R2-O2-welch 140 150.0 NaN 300.0 141.0 45.0 355.0 227.0 268.0 44.0 2
keep delay centre E2 0.0 R2-O2-welch 140 150.0 1050.0 300.0 141.0 45.0 599.0 403.0 277.0 53.0 2
keep delay end E1 0.0 R2-O2-welch 140 250.0 NaN NaN 241.0 45.0 395.0 175.0 280.0 24.0 1
keep delay end E2 0.0 R2-O2-welch 140 250.0 1150.0 400.0 241.0 45.0 699.0 403.0 377.0 53.0 2
keep bin centre E1 0.0 R1-O1-student 173 200.0 250.0 300.0 156.0 79.0 317.0 166.0 284.0 41.0 2
keep bin centre E2 0.0 R1-O1-student 173 200.0 250.0 300.0 156.0 79.0 323.0 178.0 329.0 78.0 2
keep bin end E1 0.0 R1-O1-student 173 300.0 350.0 NaN 254.0 81.0 397.0 138.0 250.0 0.0 2
keep bin end E2 0.0 R1-O1-student 173 300.0 350.0 400.0 254.0 81.0 423.0 178.0 429.0 78.0 3
keep bin centre E1 0.0 R1-O1-welch 170 200.0 250.0 300.0 158.0 74.0 308.0 163.0 287.0 41.0 2
keep bin centre E2 0.0 R1-O1-welch 170 200.0 250.0 300.0 158.0 74.0 337.0 216.0 338.0 84.0 2
keep bin end E1 0.0 R1-O1-welch 170 300.0 350.0 NaN 256.0 79.0 390.0 136.0 250.0 0.0 2
keep bin end E2 0.0 R1-O1-welch 170 300.0 350.0 400.0 256.0 79.0 437.0 216.0 438.0 84.0 3
keep bin centre E1 0.0 R1-O2-student 142 200.0 250.0 NaN 193.0 93.0 269.0 172.0 287.0 38.0 1
keep bin centre E2 0.0 R1-O2-student 142 200.0 250.0 350.0 193.0 93.0 330.0 274.0 363.0 72.0 2
keep bin end E1 0.0 R1-O2-student 142 300.0 350.0 NaN 293.0 93.0 340.0 126.0 250.0 0.0 2
keep bin end E2 0.0 R1-O2-student 142 300.0 350.0 450.0 293.0 93.0 430.0 274.0 463.0 72.0 2
keep bin centre E1 0.0 R1-O2-welch 142 200.0 250.0 NaN 225.0 100.0 273.0 174.0 290.0 33.0 1
keep bin centre E2 0.0 R1-O2-welch 142 200.0 250.0 350.0 225.0 100.0 334.0 276.0 363.0 71.0 2
keep bin end E1 0.0 R1-O2-welch 142 300.0 350.0 NaN 325.0 100.0 347.0 136.0 250.0 0.0 2
keep bin end E2 0.0 R1-O2-welch 142 300.0 350.0 450.0 325.0 100.0 434.0 276.0 463.0 71.0 2
keep bin centre E1 0.0 R2-O1-student 170 200.0 250.0 300.0 178.0 84.0 280.0 131.0 289.0 33.0 2
keep bin centre E2 0.0 R2-O1-student 170 200.0 250.0 300.0 178.0 84.0 303.0 186.0 353.0 84.0 2
keep bin end E1 0.0 R2-O1-student 170 300.0 350.0 NaN 274.0 87.0 372.0 115.0 250.0 0.0 2
keep bin end E2 0.0 R2-O1-student 170 300.0 350.0 400.0 274.0 87.0 403.0 186.0 453.0 84.0 3
keep bin centre E1 0.0 R2-O1-welch 171 200.0 250.0 300.0 163.0 81.0 283.0 136.0 286.0 41.0 2
keep bin centre E2 0.0 R2-O1-welch 171 200.0 250.0 300.0 163.0 81.0 304.0 189.0 336.0 75.0 2
keep bin end E1 0.0 R2-O1-welch 171 300.0 350.0 NaN 262.0 82.0 373.0 116.0 255.0 15.0 2
keep bin end E2 0.0 R2-O1-welch 171 300.0 350.0 400.0 262.0 82.0 404.0 189.0 436.0 75.0 3
keep bin centre E1 0.0 R2-O2-student 140 200.0 250.0 NaN 192.0 110.0 303.0 188.0 282.0 48.0 1
keep bin centre E2 0.0 R2-O2-student 140 200.0 250.0 350.0 192.0 110.0 372.0 288.0 338.0 80.0 2
keep bin end E1 0.0 R2-O2-student 140 300.0 350.0 NaN 292.0 110.0 379.0 159.0 240.0 30.0 2
keep bin end E2 0.0 R2-O2-student 140 300.0 350.0 450.0 292.0 110.0 472.0 288.0 438.0 80.0 2
keep bin centre E1 0.0 R2-O2-welch 140 200.0 250.0 300.0 224.0 113.0 306.0 192.0 288.0 40.0 2
keep bin centre E2 0.0 R2-O2-welch 140 200.0 250.0 300.0 224.0 113.0 381.0 299.0 340.0 75.0 2
keep bin end E1 0.0 R2-O2-welch 140 300.0 350.0 NaN 324.0 113.0 387.0 172.0 243.0 17.0 2
keep bin end E2 0.0 R2-O2-welch 140 300.0 350.0 400.0 324.0 113.0 481.0 299.0 440.0 75.0 3
keep trial centre E1 0.0 R1-O1-student 173 150.0 650.0 NaN 150.0 64.0 584.0 131.0 275.0 34.0 2
keep trial centre E2 0.0 R1-O1-student 173 150.0 650.0 350.0 150.0 64.0 754.0 276.0 351.0 66.0 3
keep trial end E1 0.0 R1-O1-student 173 350.0 NaN NaN 349.0 67.0 713.0 107.0 NaN NaN 1
keep trial end E2 0.0 R1-O1-student 173 350.0 850.0 550.0 349.0 67.0 954.0 276.0 551.0 66.0 1
keep trial centre E1 0.0 R1-O1-welch 170 150.0 750.0 NaN 149.0 63.0 600.0 134.0 271.0 32.0 1
keep trial centre E2 0.0 R1-O1-welch 170 150.0 750.0 350.0 149.0 63.0 806.0 297.0 349.0 68.0 2
keep trial end E1 0.0 R1-O1-welch 170 350.0 NaN NaN 347.0 69.0 705.0 109.0 NaN NaN 1
keep trial end E2 0.0 R1-O1-welch 170 350.0 950.0 550.0 347.0 69.0 1006.0 297.0 549.0 68.0 1
keep trial centre E1 0.0 R1-O2-student 142 200.0 NaN NaN 206.0 137.0 594.0 127.0 268.0 34.0 1
keep trial centre E2 0.0 R1-O2-student 142 200.0 1200.0 350.0 206.0 137.0 987.0 309.0 336.0 68.0 2
keep trial end E1 0.0 R1-O2-student 142 400.0 NaN NaN 405.0 138.0 724.0 114.0 NaN NaN 1
keep trial end E2 0.0 R1-O2-student 142 400.0 1400.0 550.0 405.0 138.0 1187.0 309.0 536.0 68.0 1
keep trial centre E1 0.0 R1-O2-welch 142 200.0 NaN NaN 220.0 144.0 581.0 136.0 269.0 34.0 1
keep trial centre E2 0.0 R1-O2-welch 142 200.0 1200.0 350.0 220.0 144.0 990.0 319.0 334.0 68.0 2
keep trial end E1 0.0 R1-O2-welch 142 400.0 NaN NaN 420.0 144.0 711.0 128.0 NaN NaN 1
keep trial end E2 0.0 R1-O2-welch 142 400.0 1400.0 550.0 420.0 144.0 1190.0 319.0 534.0 68.0 1
keep trial centre E1 0.0 R2-O1-student 170 150.0 700.0 NaN 156.0 56.0 590.0 129.0 280.0 28.0 2
keep trial centre E2 0.0 R2-O1-student 170 150.0 700.0 350.0 173.0 178.0 794.0 307.0 362.0 114.0 3
keep trial end E1 0.0 R2-O1-student 170 350.0 NaN NaN 354.0 61.0 711.0 109.0 NaN NaN 1
keep trial end E2 0.0 R2-O1-student 170 350.0 900.0 550.0 371.0 179.0 994.0 307.0 562.0 114.0 1
keep trial centre E1 0.0 R2-O1-welch 171 150.0 700.0 NaN 157.0 56.0 578.0 142.0 272.0 39.0 2
keep trial centre E2 0.0 R2-O1-welch 171 150.0 700.0 350.0 157.0 56.0 780.0 311.0 344.0 68.0 3
keep trial end E1 0.0 R2-O1-welch 171 350.0 NaN NaN 356.0 58.0 695.0 116.0 NaN NaN 1
keep trial end E2 0.0 R2-O1-welch 171 350.0 900.0 550.0 356.0 58.0 980.0 311.0 544.0 68.0 1
keep trial centre E1 0.0 R2-O2-student 140 200.0 NaN NaN 202.0 119.0 613.0 150.0 266.0 33.0 1
keep trial centre E2 0.0 R2-O2-student 140 200.0 1150.0 350.0 202.0 119.0 953.0 307.0 325.0 70.0 2
keep trial end E1 0.0 R2-O2-student 140 400.0 NaN NaN 401.0 121.0 697.0 133.0 NaN NaN 1
keep trial end E2 0.0 R2-O2-student 140 400.0 1350.0 550.0 401.0 121.0 1153.0 307.0 525.0 70.0 1
keep trial centre E1 0.0 R2-O2-welch 140 200.0 NaN NaN 219.0 128.0 605.0 161.0 265.0 33.0 1
keep trial centre E2 0.0 R2-O2-welch 140 200.0 1200.0 350.0 219.0 128.0 953.0 319.0 326.0 71.0 2
keep trial end E1 0.0 R2-O2-welch 140 400.0 NaN NaN 418.0 129.0 676.0 146.0 NaN NaN 1
keep trial end E2 0.0 R2-O2-welch 140 400.0 1400.0 550.0 418.0 129.0 1153.0 319.0 526.0 71.0 1
keep delay centre E1 0.0 R1-O1-student 173 100.0 750.0 300.0 109.0 55.0 470.0 205.0 262.0 31.0 1
keep delay centre E2 0.0 R1-O1-student 173 100.0 750.0 300.0 109.0 55.0 647.0 329.0 320.0 150.0 1
keep delay end E1 0.0 R1-O1-student 173 300.0 NaN NaN 302.0 67.0 546.0 125.0 NaN NaN 1
keep delay end E2 0.0 R1-O1-student 173 300.0 950.0 500.0 302.0 67.0 847.0 329.0 520.0 150.0 1
keep delay centre E1 0.0 R1-O1-welch 170 100.0 750.0 300.0 122.0 53.0 478.0 202.0 265.0 33.0 1
keep delay centre E2 0.0 R1-O1-welch 170 100.0 750.0 300.0 122.0 53.0 691.0 350.0 305.0 60.0 1
keep delay end E1 0.0 R1-O1-welch 170 300.0 NaN NaN 319.0 59.0 557.0 140.0 NaN NaN 1
keep delay end E2 0.0 R1-O1-welch 170 300.0 950.0 500.0 319.0 59.0 891.0 350.0 505.0 60.0 1
keep delay centre E1 0.0 R1-O2-student 142 150.0 NaN 250.0 161.0 58.0 462.0 215.0 254.0 33.0 2
keep delay centre E2 0.0 R1-O2-student 142 150.0 900.0 250.0 161.0 58.0 750.0 358.0 301.0 63.0 2
keep delay end E1 0.0 R1-O2-student 142 350.0 NaN NaN 361.0 58.0 524.0 146.0 NaN NaN 1
keep delay end E2 0.0 R1-O2-student 142 350.0 1100.0 450.0 361.0 58.0 950.0 358.0 501.0 63.0 1
keep delay centre E1 0.0 R1-O2-welch 142 150.0 NaN 250.0 164.0 57.0 452.0 213.0 257.0 34.0 2
keep delay centre E2 0.0 R1-O2-welch 142 150.0 950.0 250.0 164.0 57.0 754.0 361.0 297.0 60.0 2
keep delay end E1 0.0 R1-O2-welch 142 350.0 NaN NaN 364.0 57.0 527.0 150.0 NaN NaN 1
keep delay end E2 0.0 R1-O2-welch 142 350.0 1150.0 450.0 364.0 57.0 954.0 361.0 497.0 60.0 1
keep delay centre E1 0.0 R2-O1-student 170 100.0 750.0 300.0 123.0 53.0 452.0 201.0 261.0 30.0 1
keep delay centre E2 0.0 R2-O1-student 170 100.0 750.0 300.0 123.0 53.0 661.0 352.0 317.0 62.0 1
keep delay end E1 0.0 R2-O1-student 170 300.0 NaN NaN 318.0 64.0 551.0 137.0 NaN NaN 1
keep delay end E2 0.0 R2-O1-student 170 300.0 950.0 500.0 318.0 64.0 861.0 352.0 517.0 62.0 1
keep delay centre E1 0.0 R2-O1-welch 171 100.0 750.0 300.0 120.0 55.0 428.0 202.0 257.0 32.0 1
keep delay centre E2 0.0 R2-O1-welch 171 100.0 750.0 300.0 120.0 55.0 668.0 381.0 303.0 62.0 1
keep delay end E1 0.0 R2-O1-welch 171 300.0 NaN NaN 318.0 60.0 532.0 125.0 NaN NaN 1
keep delay end E2 0.0 R2-O1-welch 171 300.0 950.0 500.0 318.0 60.0 868.0 381.0 503.0 62.0 1
keep delay centre E1 0.0 R2-O2-student 140 150.0 NaN 250.0 151.0 61.0 479.0 215.0 255.0 31.0 2
keep delay centre E2 0.0 R2-O2-student 140 150.0 950.0 250.0 151.0 61.0 835.0 351.0 294.0 63.0 2
keep delay end E1 0.0 R2-O2-student 140 350.0 NaN NaN 349.0 66.0 535.0 134.0 NaN NaN 1
keep delay end E2 0.0 R2-O2-student 140 350.0 1150.0 450.0 349.0 66.0 1035.0 351.0 494.0 63.0 1
keep delay centre E1 0.0 R2-O2-welch 140 150.0 NaN 250.0 154.0 61.0 473.0 222.0 256.0 34.0 2
keep delay centre E2 0.0 R2-O2-welch 140 150.0 950.0 250.0 154.0 61.0 828.0 361.0 292.0 62.0 2
keep delay end E1 0.0 R2-O2-welch 140 350.0 NaN NaN 352.0 65.0 522.0 134.0 NaN NaN 1
keep delay end E2 0.0 R2-O2-welch 140 350.0 1150.0 450.0 352.0 65.0 1028.0 361.0 492.0 62.0 1
keep bin centre E1 0.0 R1-O1-student 173 200.0 650.0 NaN 189.0 70.0 404.0 172.0 277.0 27.0 2
keep bin centre E2 0.0 R1-O1-student 173 200.0 650.0 350.0 189.0 70.0 517.0 312.0 362.0 132.0 3
keep bin end E1 0.0 R1-O1-student 173 400.0 NaN NaN 386.0 76.0 550.0 128.0 NaN NaN 1
keep bin end E2 0.0 R1-O1-student 173 400.0 850.0 550.0 386.0 76.0 717.0 312.0 562.0 132.0 1
keep bin centre E1 0.0 R1-O1-welch 170 200.0 650.0 NaN 174.0 73.0 405.0 176.0 274.0 30.0 2
keep bin centre E2 0.0 R1-O1-welch 170 200.0 650.0 400.0 174.0 73.0 569.0 348.0 363.0 101.0 3
keep bin end E1 0.0 R1-O1-welch 170 400.0 NaN NaN 369.0 83.0 555.0 140.0 NaN NaN 1
keep bin end E2 0.0 R1-O1-welch 170 400.0 850.0 600.0 369.0 83.0 769.0 348.0 563.0 101.0 1
keep bin centre E1 0.0 R1-O2-student 142 200.0 NaN NaN 224.0 72.0 371.0 169.0 268.0 30.0 1
keep bin centre E2 0.0 R1-O2-student 142 200.0 1150.0 400.0 224.0 72.0 658.0 442.0 381.0 121.0 2
keep bin end E1 0.0 R1-O2-student 142 400.0 NaN NaN 422.0 78.0 536.0 141.0 NaN NaN 1
keep bin end E2 0.0 R1-O2-student 142 400.0 1350.0 600.0 422.0 78.0 858.0 442.0 581.0 121.0 1
keep bin centre E1 0.0 R1-O2-welch 142 250.0 NaN NaN 254.0 87.0 380.0 167.0 271.0 26.0 1
keep bin centre E2 0.0 R1-O2-welch 142 250.0 1150.0 400.0 254.0 87.0 664.0 439.0 387.0 118.0 2
keep bin end E1 0.0 R1-O2-welch 142 450.0 NaN NaN 454.0 87.0 544.0 141.0 NaN NaN 1
keep bin end E2 0.0 R1-O2-welch 142 450.0 1350.0 600.0 454.0 87.0 864.0 439.0 587.0 118.0 1
keep bin centre E1 0.0 R2-O1-student 170 200.0 650.0 NaN 191.0 69.0 392.0 184.0 281.0 26.0 2
keep bin centre E2 0.0 R2-O1-student 170 200.0 650.0 400.0 191.0 69.0 517.0 323.0 383.0 123.0 3
keep bin end E1 0.0 R2-O1-student 170 400.0 NaN NaN 390.0 73.0 530.0 126.0 NaN NaN 1
keep bin end E2 0.0 R2-O1-student 170 400.0 850.0 600.0 390.0 73.0 717.0 323.0 583.0 123.0 1
keep bin centre E1 0.0 R2-O1-welch 171 200.0 650.0 NaN 184.0 67.0 368.0 167.0 282.0 25.0 2
keep bin centre E2 0.0 R2-O1-welch 171 200.0 650.0 400.0 184.0 67.0 536.0 363.0 362.0 90.0 3
keep bin end E1 0.0 R2-O1-welch 171 400.0 NaN NaN 382.0 71.0 520.0 115.0 NaN NaN 1
keep bin end E2 0.0 R2-O1-welch 171 400.0 850.0 600.0 382.0 71.0 736.0 363.0 562.0 90.0 1
keep bin centre E1 0.0 R2-O2-student 140 250.0 NaN NaN 239.0 86.0 456.0 202.0 273.0 31.0 1
keep bin centre E2 0.0 R2-O2-student 140 250.0 1150.0 350.0 239.0 86.0 682.0 377.0 364.0 135.0 2
keep bin end E1 0.0 R2-O2-student 140 450.0 NaN NaN 439.0 86.0 546.0 141.0 NaN NaN 1
keep bin end E2 0.0 R2-O2-student 140 450.0 1350.0 550.0 439.0 86.0 882.0 377.0 564.0 135.0 1
keep bin centre E1 0.0 R2-O2-welch 140 250.0 NaN NaN 266.0 89.0 471.0 203.0 270.0 30.0 1
keep bin centre E2 0.0 R2-O2-welch 140 250.0 1150.0 350.0 266.0 89.0 690.0 371.0 368.0 137.0 2
keep bin end E1 0.0 R2-O2-welch 140 450.0 NaN NaN 466.0 89.0 552.0 146.0 NaN NaN 1
keep bin end E2 0.0 R2-O2-welch 140 450.0 1350.0 550.0 466.0 89.0 890.0 371.0 568.0 137.0 1
def outcome_1g(d):
return "reproduced" if (d.times_ok == 3).any() else "partially" if (d.times_ok == 2).any() else "not"
g = rec1.groupby(["trials_rule", "early_lick", "pref", "label", "search"])
summary1g = g.apply(lambda d: pd.Series({"combos": len(d), "all_three": int((d.times_ok == 3).sum()), "two": int((d.times_ok == 2).sum()),
"n_range": f"{d.n.min()}-{d.n.max()}", "outcome_here": outcome_1g(d)})).reset_index()
print("Per combination of the method details (K, D, L, E); any S reading and bin reading (B1, B2) may match:")
print(summary1g[summary1g.trials_rule == "per condition"].drop(columns="trials_rule").to_string(index=False))
for rule in ("per condition", "per type"):
oc = summary1g[summary1g.trials_rule == rule].outcome_here.value_counts().to_dict()
print(f"\nOutcomes over the {int((summary1g.trials_rule == rule).sum())} method combinations, trials {rule}"
f" ({'N1, decides' if rule == 'per condition' else 'N2, variant'}): {oc}")
print("Included neurons, N1:", rec1[rec1.trials_rule == "per condition"].n.min(), "to", rec1[rec1.trials_rule == "per condition"].n.max(),
"; N2:", rec1[rec1.trials_rule == "per type"].n.min(), "to", rec1[rec1.trials_rule == "per type"].n.max(), "; paper 55 (tolerance 5.5)")
Per combination of the method details (K, D, L, E); any S reading and bin reading (B1, B2) may match:
early_lick pref label search combos all_three two n_range outcome_here
drop bin centre E1 16 1 14 138-162 reproduced
drop bin centre E2 16 10 6 138-162 reproduced
drop bin end E1 16 0 9 138-162 partially
drop bin end E2 16 6 3 138-162 reproduced
drop delay centre E1 16 10 6 138-162 reproduced
drop delay centre E2 16 10 6 138-162 reproduced
drop delay end E1 16 0 16 138-162 partially
drop delay end E2 16 8 8 138-162 reproduced
drop trial centre E1 16 6 7 138-162 reproduced
drop trial centre E2 16 11 5 138-162 reproduced
drop trial end E1 16 0 6 138-162 partially
drop trial end E2 16 6 2 138-162 reproduced
keep bin centre E1 16 0 9 140-173 partially
keep bin centre E2 16 4 12 140-173 reproduced
keep bin end E1 16 0 8 140-173 partially
keep bin end E2 16 5 3 140-173 reproduced
keep delay centre E1 16 0 12 140-173 partially
keep delay centre E2 16 0 12 140-173 partially
keep delay end E1 16 0 0 140-173 not
keep delay end E2 16 0 8 140-173 partially
keep trial centre E1 16 0 8 140-173 partially
keep trial centre E2 16 8 8 140-173 reproduced
keep trial end E1 16 0 0 140-173 not
keep trial end E2 16 0 0 140-173 not
Outcomes over the 24 method combinations, trials per condition (N1, decides): {'reproduced': 12, 'partially': 9, 'not': 3}
Outcomes over the 24 method combinations, trials per type (N2, variant): {'partially': 12, 'reproduced': 11, 'not': 1}
Included neurons, N1: 138 to 173 ; N2: 132 to 167 ; paper 55 (tolerance 5.5)
# Population sizes (verifier's request, reference only). For the included neurons of convention D
# (selective under reading R1-O1-student, more than 3 trials in every condition, N1), the fewest trials
# a neuron has in any condition, and the epochs in which it is selective. This does not change the
# selection, which the claims file fixes; it shows which further selections would bring the counts
# near the paper's 55, 143 and 40.
def included_neurons(units, conds, early, skey="R1-O1-student"):
st = tests[(early, skey)].set_index("uid")
rows = []
for u in units[units.uid.isin(SEL[early][skey])].itertuples():
tr = S[u.sid]["trials"]
m = L.trial_mask(tr, early) & u.observed
right = (tr.instruction == "right").values
n = {}
ok = True
for c in ("control",) + tuple(conds):
mc = m & (tr.cond == c).values
n[c] = int(mc.sum())
ok &= mc.sum() > 3 and (mc & right).sum() > 0 and (mc & ~right).sum() > 0
if ok:
p = st.loc[u.uid]
rows.append({"uid": u.uid, "subject": u.subject, "min_trials": min(n.values()),
"min_trials_per_type": min(min(int((m & (tr.cond == c).values & right).sum()), int((m & (tr.cond == c).values & ~right).sum()))
for c in ("control",) + tuple(conds)),
"sample": p["sample"] < 0.05, "delay": p["delay"] < 0.05, "response": p["response"] < 0.05})
return pd.DataFrame(rows)
prow = []
for name, units_, conds, paper in (("exp1 (fig1g)", e1, list(OFF1), 55), ("exp2 (fig2e)", U[(U.exp == "exp2") & (U.cls == "pyr")], ["left1", "right1", "bilateral8"], 143),
("exp3 (ed7)", U[(U.exp == "exp3") & (U.cls == "pyr")], ["left4", "right4", "bilateral2"], 40)):
for early in ("drop", "keep"):
d = included_neurons(units_, conds, early)
prow.append({"experiment": name, "early_lick": early, "paper": paper, "included": len(d), "mice": d.subject.nunique(),
"min_trials_q10_q50_q90": "/".join(str(int(x)) for x in d.min_trials.quantile([0.1, 0.5, 0.9])),
"min_trials_gt_10": int((d.min_trials > 10).sum()), "min_trials_gt_20": int((d.min_trials > 20).sum()),
"per_type_gt_3": int((d.min_trials_per_type > 3).sum()), "per_type_gt_5": int((d.min_trials_per_type > 5).sum()),
"sel_sample": int(d["sample"].sum()), "sel_delay": int(d.delay.sum()), "sel_response": int(d.response.sum()),
"delay_only": int((d.delay & ~d["sample"] & ~d.response).sum()), "sample_or_delay": int((d["sample"] | d.delay).sum()),
"sample_and_delay": int((d["sample"] & d.delay).sum())})
print(pd.DataFrame(prow).to_string(index=False))
experiment early_lick paper included mice min_trials_q10_q50_q90 min_trials_gt_10 min_trials_gt_20 per_type_gt_3 per_type_gt_5 sel_sample sel_delay sel_response delay_only sample_or_delay sample_and_delay exp1 (fig1g) drop 55 162 4 11/27/36 155 118 155 138 50 73 127 15 95 28 exp1 (fig1g) keep 55 173 4 16/34/41 167 136 167 167 47 90 136 18 105 32 exp2 (fig2e) drop 143 286 7 11/18/27 265 113 242 218 83 160 231 27 195 48 exp2 (fig2e) keep 143 293 7 16/25/30 292 206 292 271 77 164 236 35 198 43 exp3 (ed7) drop 40 58 3 19/24/32 58 46 58 58 13 34 41 13 39 8 exp3 (ed7) keep 40 61 3 24/28/33 61 61 61 61 12 38 43 15 40 10
Result: blocked (methods_underspecified). The answer confirmed that the paper gives none of the details asked about, and the claims file now requires one outcome over all of them (K1, K2; D1 to D3; L1, L2; E1, E2), with trials counted per condition (N1). They give different outcomes: of the 24 combinations, 12 have readings with all three recovery times within tolerance, 9 have readings with two and 3 have none. With lick-early trials dropped, all three are within tolerance under every combination whose search runs past the go cue (E2), and under E1 with centre labels; E1 with end labels reaches two. With lick-early trials kept, three combinations reach none (end labels with whole-trial preference under E1 and E2, and with delay-epoch preference under E1). Counting trials per condition and trial type (N2, a variant) gives 11 combinations with all three, 12 with two and 1 with none. Every reading includes 138 to 173 neurons, against the paper's 55.
Under E1 with end labels the late-delay time is never found (NaN in all 96 readings): no bin up to the go cue reaches 80% of control. The paper's 327 ms falls 27 ms after the go cue for this condition (offset 0.3 s before it), so a search ending at the go cue can give at most 300 ms, which is inside the tolerance (215 to 439 ms); a question asks the reader whether E1 is meant for this condition. Population sizes (reference only): of the 162 neurons included with K1 (R1-O1-Student), the fewest trials in any condition has a median of 27 (10th percentile 11); 118 have more than 20 trials in every condition, 73 are selective in the delay epoch, 95 in the sample or delay epoch and 15 in the delay epoch only. None of these selections gives the paper's 55, and the same holds for experiment 2 (286 included, 160 delay-selective, 113 with more than 20 trials; paper 143) and experiment 3 (58, 34, 46; paper 40).
ed2b-silencing-strength¶
Ipsilateral and bilateral photoinhibition reduced the activity of putative pyramidal neurons by more than 90%, similarly in VGAT-ChR2-EYFP and PV x ReaChR mice; contralateral photoinhibition had little effect on the average rate.
Criterion: per neuron (mean rate at least 1 spike/s), the rate during photoinhibition over the control rate in the same window; window (a) the whole photostimulus before the ramp, (b) the last 400 ms of photoinhibition. Reproduced when the mean normalised rate is below 0.1 for ipsilateral photoinhibition in both mouse lines (experiment 2) and for bilateral photoinhibition, and contralateral photoinhibition leaves it above 0.8. Judged on experiment 2; experiments 1 and 3 are shown. Neurons need 2 trials in the condition and in control (a standard choice); trials are correct and incorrect ones; lick-early trials dropped (K1) or kept (K2), answered 2026-10-21 as not given by the paper, so the outcome must hold under both.
CONDS = {"exp1": {"sample": "ipsilateral", "early_delay": "ipsilateral", "late_delay": "ipsilateral"},
"exp2": {"left1": "ipsilateral", "right1": "contralateral", "bilateral8": "bilateral"},
"exp3": {"left4": "ipsilateral", "right4": "contralateral", "bilateral2": "bilateral"}}
RAMP = {"exp1": 0.1, "exp2": 0.2, "exp3": 0.2}
rows = []
for early in ("drop", "keep"):
for exp, cmap in CONDS.items():
uu = U[(U.exp == exp) & (U.cls == "pyr")]
for u in uu.itertuples():
tr = S[u.sid]["trials"]
m = L.trial_mask(tr, early) & u.observed
k = m & (tr.cond == "control").values
so = (tr["sample"] - tr.go).values[k]
n_all = L.counts_in(u.spikes, tr.go.values[k], so, np.full(k.sum(), 1.3))
mean_rate = n_all.sum() / np.sum(1.3 - so) if k.sum() else 0
if mean_rate < 1:
continue
for c, kind in cmap.items():
p = m & (tr.cond == c).values
if p.sum() < 2 or k.sum() < 2:
continue
on, off = np.median(tr.ps_on_re_go.values[p & ~tr.early_lick.values]), np.median(tr.ps_off_re_go.values[p & ~tr.early_lick.values])
for wname, (a, b) in {"a": (on, off - RAMP[exp]), "b": (off - 0.4, off)}.items():
cp = L.counts_in(u.spikes, tr.go.values[p], a, b).mean()
cc = L.counts_in(u.spikes, tr.go.values[k], a, b).mean()
rows.append({"early_lick": early, "experiment": exp, "cond": c, "kind": kind, "window": wname,
"genotype": u.genotype, "uid": u.uid, "norm": cp / cc if cc > 0 else np.nan})
nr = pd.DataFrame(rows)
tab = nr.groupby(["early_lick", "window", "experiment", "cond", "kind"]).norm.agg(["size", "mean", "sem"]).round(3)
print(tab.to_string())
print("\nExperiment 2, ipsilateral, by mouse line:")
print(nr[(nr.experiment == "exp2") & (nr.kind == "ipsilateral")].groupby(["early_lick", "window", "genotype"]).norm.agg(["size", "mean", "sem"]).round(3).to_string())
print("\nLegend counts: experiment 1 n = 117, 110, 109; experiment 2 n = 300, 294, 301; experiment 3 n = 52, 52, 102;"
" experiment 2 ipsilateral 94 VGAT and 201 PV neurons.")
judge = []
for (early, wname), d in nr[nr.experiment == "exp2"].groupby(["early_lick", "window"]):
ip = d[d.kind == "ipsilateral"].groupby("genotype").norm.mean()
judge.append({"early_lick": early, "window": wname, "ipsi_VGAT": ip.get("VGAT"), "ipsi_PV": ip.get("PV"),
"bilateral": d[d.kind == "bilateral"].norm.mean(), "contralateral": d[d.kind == "contralateral"].norm.mean()})
judge = pd.DataFrame(judge)
judge["holds"] = (judge.ipsi_VGAT < 0.1) & (judge.ipsi_PV < 0.1) & (judge.bilateral < 0.1) & (judge.contralateral > 0.8)
print("\n", judge.round(3).to_string(index=False))
size mean sem
early_lick window experiment cond kind
drop a exp1 early_delay ipsilateral 172 0.071 0.023
late_delay ipsilateral 172 0.098 0.048
sample ipsilateral 172 0.062 0.014
exp2 bilateral8 bilateral 299 0.077 0.014
left1 ipsilateral 299 0.089 0.021
right1 contralateral 299 0.935 0.037
exp3 bilateral2 bilateral 109 0.083 0.036
left4 ipsilateral 55 0.039 0.013
right4 contralateral 55 1.169 0.218
b exp1 early_delay ipsilateral 172 0.042 0.015
late_delay ipsilateral 172 0.048 0.023
sample ipsilateral 172 0.037 0.013
exp2 bilateral8 bilateral 299 0.097 0.020
left1 ipsilateral 299 0.098 0.023
right1 contralateral 299 1.001 0.044
exp3 bilateral2 bilateral 109 0.133 0.028
left4 ipsilateral 55 0.144 0.052
right4 contralateral 55 1.355 0.280
keep a exp1 early_delay ipsilateral 170 0.148 0.024
late_delay ipsilateral 170 0.108 0.032
sample ipsilateral 170 0.202 0.019
exp2 bilateral8 bilateral 296 0.169 0.019
left1 ipsilateral 296 0.183 0.022
right1 contralateral 296 1.007 0.038
exp3 bilateral2 bilateral 110 0.102 0.036
left4 ipsilateral 57 0.061 0.013
right4 contralateral 57 1.139 0.199
b exp1 early_delay ipsilateral 170 0.121 0.019
late_delay ipsilateral 170 0.085 0.020
sample ipsilateral 170 0.183 0.017
exp2 bilateral8 bilateral 296 0.196 0.024
left1 ipsilateral 296 0.204 0.025
right1 contralateral 296 1.035 0.040
exp3 bilateral2 bilateral 110 0.151 0.028
left4 ipsilateral 57 0.170 0.047
right4 contralateral 57 1.303 0.237
Experiment 2, ipsilateral, by mouse line:
size mean sem
early_lick window genotype
drop a PV 209 0.052 0.012
VGAT 90 0.177 0.062
b PV 209 0.035 0.012
VGAT 90 0.245 0.071
keep a PV 207 0.140 0.015
VGAT 89 0.282 0.063
b PV 207 0.139 0.017
VGAT 89 0.356 0.070
Legend counts: experiment 1 n = 117, 110, 109; experiment 2 n = 300, 294, 301; experiment 3 n = 52, 52, 102; experiment 2 ipsilateral 94 VGAT and 201 PV neurons.
early_lick window ipsi_VGAT ipsi_PV bilateral contralateral holds
drop a 0.177 0.052 0.077 0.935 False
drop b 0.245 0.035 0.097 1.001 False
keep a 0.282 0.140 0.169 1.007 False
keep b 0.356 0.139 0.196 1.035 False
Result: not reproduced. Photoinhibition silences most activity, but not by more than 90% in every case. With lick-early trials dropped (K1), the normalised rate in experiment 2 is 0.077 to 0.097 for bilateral and 0.94 to 1.00 for contralateral photoinhibition, and 0.035 to 0.052 for ipsilateral photoinhibition in PV x ReaChR mice, but 0.177 to 0.245 in VGAT-ChR2-EYFP mice: three of the four parts hold. With lick-early trials kept (K2) only the contralateral part holds (1.01 to 1.04); ipsilateral photoinhibition leaves 0.139 to 0.140 (PV) and 0.282 to 0.356 (VGAT), and bilateral 0.169 to 0.196. The outcome must be the one K1 and K2 both give, and under K2 one part of four holds, so the claim is not reproduced (the first round gave partial; the rule is in the Summary). Part of the K2 rise comes from lick-early trials whose light falls before its logged time, 6.5% to 7.5% of the experiment-2 photoinhibition trials (data check), which enter the photoinhibition average without light in the window. Experiment 1 gives 0.037 to 0.098 (K1). Neuron counts are 172, 299 and 55 to 110 per condition, against 109 to 117, 294 to 301 and 52 to 102. Neurons need 2 trials in the condition and in control, a standard choice.
ed2e-no-rebound¶
No rebound excitation was detected on average after photoinhibition offset; a small fraction of neurons showed rebound, balanced by weak sustained inhibition in a larger fraction.
Criterion: experiment 2, photoinhibition 0.8 s at delay onset, lick right trials only, the six 400 ms windows of the legend; per neuron control against photoinhibition by two-tailed t-test, p < 0.01. Reproduced when, in the first 400 ms and 400 to 800 ms after photoinhibition (ipsilateral), the population mean rate is not higher than control (paired t-test across neurons, p > 0.05, a reading) and fewer neurons have a significant increase than a significant decrease. Neurons: putative pyramidal with at least 2 lick right trials in each condition (a standard choice); lick-early trials dropped (K1) or kept (K2), answered 2026-10-21 as not given by the paper, so the outcome must hold under both.
WIN = {"last 400 ms sample": (-2.1, -1.7), "first 400 ms light": (-1.7, -1.3), "last 400 ms light": (-1.3, -0.9),
"first 400 ms after": (-0.9, -0.5), "400-800 ms after": (-0.5, -0.1), "first 400 ms response": (0.0, 0.4)}
e2 = U[(U.exp == "exp2") & (U.cls == "pyr")]
rows = []
for early in ("drop", "keep"):
for c in ("left1", "right1", "bilateral8"):
for u in e2.itertuples():
tr = S[u.sid]["trials"]
m = L.trial_mask(tr, early) & u.observed & (tr.instruction == "right").values
k, p = m & (tr.cond == "control").values, m & (tr.cond == c).values
if k.sum() < 2 or p.sum() < 2:
continue
for wn, (a, b) in WIN.items():
cc = L.counts_in(u.spikes, tr.go.values[k], a, b) / (b - a)
cp = L.counts_in(u.spikes, tr.go.values[p], a, b) / (b - a)
pv = L.ttest(cp, cc)
rows.append({"early_lick": early, "cond": c, "window": wn, "uid": u.uid, "ctrl": cc.mean(), "pi": cp.mean(),
"up": pv < 0.01 and cp.mean() > cc.mean(), "down": pv < 0.01 and cp.mean() < cc.mean()})
rb = pd.DataFrame(rows)
def summ(d):
t = stats.ttest_rel(d.pi, d.ctrl)
return pd.Series({"neurons": len(d), "ctrl_mean": d.ctrl.mean(), "pi_mean": d.pi.mean(), "paired_t": t.statistic, "paired_p": t.pvalue,
"n_up": int(d.up.sum()), "n_down": int(d.down.sum())})
rbs = rb.groupby(["early_lick", "cond", "window"], sort=False).apply(summ).reset_index()
print(rbs.round(4).to_string(index=False))
j = rbs[(rbs.cond == "left1") & rbs.window.isin(["first 400 ms after", "400-800 ms after"])].copy()
j["not_higher"] = ~((j.pi_mean > j.ctrl_mean) & (j.paired_p < 0.05))
j["up_lt_down"] = j.n_up < j.n_down
print("\nJudged windows (ipsilateral):")
print(j[["early_lick", "window", "pi_mean", "ctrl_mean", "paired_p", "n_up", "n_down", "not_higher", "up_lt_down"]].round(4).to_string(index=False))
early_lick cond window neurons ctrl_mean pi_mean paired_t paired_p n_up n_down
drop left1 last 400 ms sample 411.0 3.1525 3.0484 -1.6548 0.0987 5.0 0.0
drop left1 first 400 ms light 411.0 3.4538 0.3657 -13.8726 0.0000 4.0 103.0
drop left1 last 400 ms light 411.0 3.2668 0.3020 -14.0727 0.0000 3.0 100.0
drop left1 first 400 ms after 411.0 3.2364 3.2208 -0.0893 0.9289 27.0 7.0
drop left1 400-800 ms after 411.0 3.2137 3.3832 1.2255 0.2211 30.0 3.0
drop left1 first 400 ms response 411.0 3.2649 3.4238 1.6667 0.0963 14.0 2.0
drop right1 last 400 ms sample 411.0 3.1525 3.1451 -0.0833 0.9337 11.0 1.0
drop right1 first 400 ms light 411.0 3.4538 3.0319 -3.9279 0.0001 10.0 7.0
drop right1 last 400 ms light 411.0 3.2668 2.9214 -2.6536 0.0083 15.0 11.0
drop right1 first 400 ms after 411.0 3.2364 3.2942 0.4719 0.6372 22.0 3.0
drop right1 400-800 ms after 411.0 3.2137 3.1824 -0.2949 0.7683 10.0 1.0
drop right1 first 400 ms response 411.0 3.2649 3.2597 -0.0574 0.9542 6.0 2.0
drop bilateral8 last 400 ms sample 411.0 3.1525 3.1234 -0.5157 0.6064 2.0 0.0
drop bilateral8 first 400 ms light 411.0 3.4538 0.2824 -14.4506 0.0000 2.0 169.0
drop bilateral8 last 400 ms light 411.0 3.2668 0.2086 -14.5664 0.0000 1.0 160.0
drop bilateral8 first 400 ms after 411.0 3.2364 3.6794 1.9540 0.0514 66.0 26.0
drop bilateral8 400-800 ms after 411.0 3.2137 3.8442 3.1362 0.0018 71.0 19.0
drop bilateral8 first 400 ms response 411.0 3.2649 3.5657 1.9928 0.0469 52.0 19.0
keep left1 last 400 ms sample 411.0 3.1367 3.0354 -1.5782 0.1153 7.0 0.0
keep left1 first 400 ms light 411.0 3.4000 0.4593 -13.9076 0.0000 5.0 122.0
keep left1 last 400 ms light 411.0 3.2054 0.4400 -13.7006 0.0000 6.0 111.0
keep left1 first 400 ms after 411.0 3.1401 3.2010 0.3860 0.6997 31.0 10.0
keep left1 400-800 ms after 411.0 3.0731 3.3142 1.8808 0.0607 31.0 4.0
keep left1 first 400 ms response 411.0 3.1017 3.3940 3.3163 0.0010 16.0 1.0
keep right1 last 400 ms sample 411.0 3.1367 3.1793 0.5989 0.5496 9.0 1.0
keep right1 first 400 ms light 411.0 3.4000 3.1002 -3.0462 0.0025 9.0 7.0
keep right1 last 400 ms light 411.0 3.2054 2.9377 -2.2306 0.0262 16.0 11.0
keep right1 first 400 ms after 411.0 3.1401 3.3255 1.6843 0.0929 26.0 1.0
keep right1 400-800 ms after 411.0 3.0731 3.1657 0.9468 0.3443 11.0 1.0
keep right1 first 400 ms response 411.0 3.1017 3.1650 0.7624 0.4462 11.0 2.0
keep bilateral8 last 400 ms sample 411.0 3.1367 3.0407 -1.8185 0.0697 2.0 1.0
keep bilateral8 first 400 ms light 411.0 3.4000 0.4703 -13.9209 0.0000 3.0 167.0
keep bilateral8 last 400 ms light 411.0 3.2054 0.4496 -13.8023 0.0000 2.0 154.0
keep bilateral8 first 400 ms after 411.0 3.1401 3.6934 2.5533 0.0110 78.0 28.0
keep bilateral8 400-800 ms after 411.0 3.0731 3.7827 3.7847 0.0002 80.0 22.0
keep bilateral8 first 400 ms response 411.0 3.1017 3.4363 2.4656 0.0141 56.0 17.0
Judged windows (ipsilateral):
early_lick window pi_mean ctrl_mean paired_p n_up n_down not_higher up_lt_down
drop first 400 ms after 3.2208 3.2364 0.9289 27.0 7.0 True False
drop 400-800 ms after 3.3832 3.2137 0.2211 30.0 3.0 True False
keep first 400 ms after 3.2010 3.1401 0.6997 31.0 10.0 True False
keep 400-800 ms after 3.3142 3.0731 0.0607 31.0 4.0 True False
Result: not reproduced. After ipsilateral photoinhibition the population mean rate is not higher than control in either window (paired p 0.93 and 0.22 with lick-early trials dropped, 0.70 and 0.06 kept), but more neurons show a significant increase than a significant decrease: 27 against 7 in the first 400 ms and 30 against 3 in 400 to 800 ms (dropped; 31 against 10 and 31 against 4 kept), the reverse of the legend's balance. After bilateral photoinhibition the population mean rises (3.84 against 3.21 spikes/s, p = 0.002, in 400 to 800 ms). The counts fail under K1 and K2 alike, so the answer leaves the outcome unchanged.
ed6a-bilateral-inconsistent-bias¶
Bilateral photoinhibition biased movements inconsistently across mice and sessions, toward lick left in some and lick right in others.
Criterion: per session of the bilateral experiment, bias = (lick right minus lick left performance) under bilateral photoinhibition minus the same in control; reproduced when, among sessions with a bias significant by Fisher's exact test (p < 0.05), both signs occur, in at least two mice. Which 2 x 2 table enters Fisher's test was answered 2026-10-21 as not given by the paper; readings (f1, printed as p_i) bilateral trials, trial type by correct; (f2, printed as p_ii) licked side by condition (control against bilateral); the outcome must hold under both. Experiment 2 sessions (bilateral photoinhibition of four spots per side); performance excludes lick-early trials (convention P) and no-response trials (shown with them counted as errors as a variant). Experiment 3 (one spot per side) is shown as a variant.
def session_bias(tr, bil, ignore_as_error=False):
outs = ("hit", "miss", "ignore") if ignore_as_error else ("hit", "miss")
m = tr.behaving & ~tr.early_lick & tr.outcome.isin(outs)
out = {}
for c in ("control", bil):
t = tr[m & (tr.cond == c)]
r, l = t[t.instruction == "right"], t[t.instruction == "left"]
out[c] = dict(pr=(r.outcome == "hit").mean(), pl=(l.outcome == "hit").mean(),
rh=int((r.outcome == "hit").sum()), rn=len(r), lh=int((l.outcome == "hit").sum()), ln=len(l),
lick_right=int(((t.instruction == "right") & (t.outcome == "hit")).sum() + ((t.instruction == "left") & (t.outcome != "hit")).sum()),
n=len(t))
b, c = out[bil], out["control"]
bias = (b["pr"] - b["pl"]) - (c["pr"] - c["pl"])
p_i = stats.fisher_exact([[b["rh"], b["rn"] - b["rh"]], [b["lh"], b["ln"] - b["lh"]]]).pvalue
p_ii = stats.fisher_exact([[b["lick_right"], b["n"] - b["lick_right"]], [c["lick_right"], c["n"] - c["lick_right"]]]).pvalue
return bias, p_i, p_ii, b["n"]
rows = []
for s in S.values():
for exp, bil in (("exp2", "bilateral8"), ("exp3", "bilateral2")):
if s["exp"] != exp or not s["trials"].behaving.any():
continue
for ign in (False, True):
bias, p_i, p_ii, n = session_bias(s["trials"], bil, ign)
rows.append({"experiment": exp, "sid": s["sid"], "subject": s["subject"], "ignore_as_error": ign, "bilateral_trials": n,
"bias": bias, "p_i": p_i, "p_ii": p_ii})
b6 = pd.DataFrame(rows)
BIAS = b6[(b6.experiment == "exp2") & ~b6.ignore_as_error].set_index("sid")
print(b6[~b6.ignore_as_error].round(4).to_string(index=False))
for (exp, ign), d in b6.groupby(["experiment", "ignore_as_error"]):
for col in ("p_i", "p_ii"):
sig = d[d[col] < 0.05]
pos, neg = sig[sig.bias > 0], sig[sig.bias < 0]
print(f"{exp}, no-response as error {ign}, Fisher reading {col}: {len(sig)} significant sessions; "
f"lick right bias {len(pos)} sessions in {pos.subject.nunique()} mice, lick left bias {len(neg)} sessions in {neg.subject.nunique()} mice; "
f"both signs, in at least two mice in all: {len(pos) > 0 and len(neg) > 0 and sig.subject.nunique() >= 2}; "
f"each sign in at least two mice: {pos.subject.nunique() >= 2 and neg.subject.nunique() >= 2}")
experiment sid subject ignore_as_error bilateral_trials bias p_i p_ii
exp2 255201_20141121 255201 False 27 0.4478 0.2566 0.0354
exp2 255201_20141123 255201 False 34 0.6756 0.0012 0.0004
exp3 257636_20150330 257636 False 21 -0.3378 0.0318 0.2021
exp3 257636_20150331 257636 False 28 -0.4171 0.2530 0.1034
exp3 257636_20150401 257636 False 27 -0.2273 0.4495 0.3965
exp3 257636_20150403 257636 False 39 -0.2624 0.2003 0.2794
exp3 257636_20150404 257636 False 30 -0.3061 1.0000 0.6839
exp2 257637_20141222 257637 False 27 0.8779 0.0000 0.0000
exp2 257637_20141223 257637 False 30 0.6742 0.0005 0.0007
exp2 257637_20141224 257637 False 55 0.7277 0.0000 0.0000
exp2 257772_20141121 257772 False 33 -0.1206 0.6951 0.2564
exp2 257772_20141123 257772 False 51 0.3197 0.5780 0.0718
exp2 258250_20141201 258250 False 32 -0.4908 0.0017 0.0013
exp2 258250_20141203 258250 False 29 0.3998 0.6999 0.2036
exp2 258250_20141205 258250 False 27 0.2436 1.0000 1.0000
exp2 263808_20150121 263808 False 33 -0.7145 0.0000 0.0000
exp2 263808_20150122 263808 False 24 -0.5570 0.0007 0.0033
exp2 263808_20150123 263808 False 33 0.0374 0.4905 0.8420
exp2 263808_20150124 263808 False 34 -0.0624 0.2278 0.3100
exp2 263808_20150125 263808 False 29 0.0766 0.2723 0.5277
exp2 263808_20150126 263808 False 30 0.1602 1.0000 0.4189
exp2 263810_20150121 263810 False 54 0.0365 0.5857 0.7564
exp2 263810_20150122 263810 False 54 0.0809 0.7926 0.7535
exp2 263810_20150123 263810 False 35 0.2650 0.0060 0.0308
exp2 263810_20150124 263810 False 50 -0.1178 0.3926 0.6333
exp2 263810_20150125 263810 False 61 0.5106 0.0000 0.0004
exp2 263810_20150126 263810 False 48 -0.5115 0.0081 0.0024
exp2 264411_20141222 264411 False 41 0.4195 0.0296 0.0203
exp2 264411_20141223 264411 False 23 0.3074 0.4136 0.2462
exp2 264411_20141224 264411 False 56 -0.5294 0.0000 0.0005
exp3 270337_20150303 270337 False 62 0.4934 0.0003 0.0000
exp3 270337_20150304 270337 False 48 0.4945 0.0062 0.0005
exp3 270337_20150306 270337 False 47 0.0925 0.1930 0.1850
exp3 273657_20150321 273657 False 34 -0.2121 0.1005 0.1216
exp3 273657_20150322 273657 False 33 0.1003 0.3005 0.8455
exp3 273657_20150323 273657 False 24 -0.1013 1.0000 0.3725
exp3 273657_20150325 273657 False 36 0.0750 0.4998 0.8487
exp2, no-response as error False, Fisher reading p_i: 12 significant sessions; lick right bias 7 sessions in 4 mice, lick left bias 5 sessions in 4 mice; both signs, in at least two mice in all: True; each sign in at least two mice: True
exp2, no-response as error False, Fisher reading p_ii: 13 significant sessions; lick right bias 8 sessions in 4 mice, lick left bias 5 sessions in 4 mice; both signs, in at least two mice in all: True; each sign in at least two mice: True
exp2, no-response as error True, Fisher reading p_i: 12 significant sessions; lick right bias 7 sessions in 4 mice, lick left bias 5 sessions in 4 mice; both signs, in at least two mice in all: True; each sign in at least two mice: True
exp2, no-response as error True, Fisher reading p_ii: 13 significant sessions; lick right bias 8 sessions in 4 mice, lick left bias 5 sessions in 4 mice; both signs, in at least two mice in all: True; each sign in at least two mice: True
exp3, no-response as error False, Fisher reading p_i: 3 significant sessions; lick right bias 2 sessions in 1 mice, lick left bias 1 sessions in 1 mice; both signs, in at least two mice in all: True; each sign in at least two mice: False
exp3, no-response as error False, Fisher reading p_ii: 2 significant sessions; lick right bias 2 sessions in 1 mice, lick left bias 0 sessions in 0 mice; both signs, in at least two mice in all: False; each sign in at least two mice: False
exp3, no-response as error True, Fisher reading p_i: 3 significant sessions; lick right bias 2 sessions in 1 mice, lick left bias 1 sessions in 1 mice; both signs, in at least two mice in all: True; each sign in at least two mice: False
exp3, no-response as error True, Fisher reading p_ii: 2 significant sessions; lick right bias 2 sessions in 1 mice, lick left bias 0 sessions in 0 mice; both signs, in at least two mice in all: False; each sign in at least two mice: False
Result: reproduced. In experiment 2, 12 sessions (Fisher reading f1) or 13 (f2) have a significant bias; 7 or 8 of them are biased toward lick right, in 4 mice, and 5 toward lick left, in 4 mice, with no-response trials left out or counted as errors. Both signs therefore occur, each in at least two mice. It holds under f1 and f2, as the answer requires. Experiment 3 (one spot per side) shows few significant sessions (2 or 3).
fig2e-selectivity-recovery-times¶
Selectivity recovered to 80% of control 538 ms after ipsilateral and 192 ms after contralateral photoinhibition, and did not recover after bilateral photoinhibition.
Criterion: convention D on experiment 2 (ipsilateral one spot, contralateral one spot, bilateral four spots per side; light 0.8 s from delay onset, offset 0.9 s before the go cue). Bilateral, no recovery means photoinhibition selectivity below 80% of control up to the go cue. Reproduced when both times are within tolerance and bilateral does not recover, under one bin reading. The method details answered 2026-10-21 (K, D, L, E) are run as for fig1g, and the outcome must be the same under all; trials per condition (N1) decide, per condition and trial type (N2) is a variant.
OFF2 = {"left1": -0.9, "right1": -0.9, "bilateral8": -0.9}
t0 = time.time()
rec2, courses2 = {}, {}
for early in ("drop", "keep"):
rec2[early], courses2[early] = L.recovery_readings(e2, S, OFF2, SEL[early], early, no_recovery=("bilateral8",))
rec2 = pd.concat(rec2.values(), ignore_index=True).rename(columns={"early": "early_lick"})
rec2["ipsi_ok"] = (rec2.left1 - 538).abs() <= 178
rec2["contra_ok"] = (rec2.right1 - 192).abs() <= 114
rec2["bilateral_no_recovery"] = ~rec2.bilateral8_recovers_by_go
rec2["holds"] = rec2.ipsi_ok & rec2.contra_ok & rec2.bilateral_no_recovery
print(f"{len(rec2)} reading combinations in {time.time() - t0:.0f} s")
print("Trials counted per condition (N1, decides the outcome):")
print(rec2[rec2.trials_rule == "per condition"][["early_lick", "pref", "label", "search", "bin", "S", "n", "left1", "left1_boot", "left1_sd",
"right1", "right1_boot", "right1_sd", "bilateral8_max_ratio_to_go", "holds"]].round(2).to_string(index=False))
768 reading combinations in 122 s
Trials counted per condition (N1, decides the outcome):
early_lick pref label search bin S n left1 left1_boot left1_sd right1 right1_boot right1_sd bilateral8_max_ratio_to_go holds
drop trial centre E1 0.2 R1-O1-student 286 NaN 625.00 138.89 500.0 372.68 238.49 0.27 False
drop trial centre E2 0.2 R1-O1-student 286 1250.0 1098.74 246.05 500.0 432.00 300.92 0.27 False
drop trial end E1 0.2 R1-O1-student 286 NaN 668.75 91.07 600.0 411.31 214.41 0.27 False
drop trial end E2 0.2 R1-O1-student 286 1350.0 1198.74 246.05 600.0 517.75 316.82 0.27 False
drop trial centre E1 0.2 R1-O1-welch 284 NaN 690.00 152.97 500.0 369.17 247.95 0.28 False
drop trial centre E2 0.2 R1-O1-welch 284 1250.0 1121.25 247.16 500.0 439.25 316.70 0.28 False
drop trial end E1 0.2 R1-O1-welch 284 NaN 683.33 102.74 600.0 416.07 226.93 0.28 False
drop trial end E2 0.2 R1-O1-welch 284 1350.0 1221.25 247.16 600.0 523.75 326.34 0.28 False
drop trial centre E1 0.2 R1-O2-student 260 NaN 638.57 138.92 750.0 386.03 262.93 0.26 False
drop trial centre E2 0.2 R1-O2-student 260 1250.0 1072.50 264.52 750.0 457.00 324.62 0.26 False
drop trial end E1 0.2 R1-O2-student 260 NaN 665.38 71.75 850.0 422.67 227.66 0.26 False
drop trial end E2 0.2 R1-O2-student 260 1350.0 1172.50 264.52 850.0 550.25 333.45 0.26 False
drop trial centre E1 0.2 R1-O2-welch 260 NaN 672.06 149.60 750.0 381.25 244.14 0.26 False
drop trial centre E2 0.2 R1-O2-welch 260 1250.0 1084.17 248.29 750.0 493.25 342.19 0.26 False
drop trial end E1 0.2 R1-O2-welch 260 NaN 659.52 54.81 850.0 437.58 224.44 0.26 False
drop trial end E2 0.2 R1-O2-welch 260 1350.0 1184.17 248.29 850.0 585.50 350.09 0.26 False
drop trial centre E1 0.2 R2-O1-student 289 NaN 623.86 153.92 500.0 385.75 226.91 0.27 False
drop trial centre E2 0.2 R2-O1-student 289 1250.0 1059.60 274.80 500.0 457.75 302.00 0.27 False
drop trial end E1 0.2 R2-O1-student 289 NaN 637.50 71.81 600.0 425.15 211.98 0.27 False
drop trial end E2 0.2 R2-O1-student 289 1350.0 1159.60 274.80 600.0 535.25 318.78 0.27 False
drop trial centre E1 0.2 R2-O1-welch 286 NaN 658.14 140.57 500.0 349.15 234.91 0.28 False
drop trial centre E2 0.2 R2-O1-welch 286 1250.0 1084.09 276.73 500.0 435.50 323.29 0.28 False
drop trial end E1 0.2 R2-O1-welch 286 NaN 682.26 81.86 600.0 399.70 217.91 0.28 False
drop trial end E2 0.2 R2-O1-welch 286 1350.0 1184.09 276.73 600.0 521.25 337.69 0.28 False
drop trial centre E1 0.2 R2-O2-student 264 NaN 648.89 139.24 750.0 349.70 244.23 0.26 False
drop trial centre E2 0.2 R2-O2-student 264 1250.0 1061.56 267.58 750.0 477.00 351.49 0.26 False
drop trial end E1 0.2 R2-O2-student 264 NaN 688.57 91.87 850.0 386.09 205.65 0.26 False
drop trial end E2 0.2 R2-O2-student 264 1350.0 1161.56 267.58 850.0 562.00 360.22 0.26 False
drop trial centre E1 0.2 R2-O2-welch 264 NaN 644.87 145.35 750.0 401.67 254.18 0.26 False
drop trial centre E2 0.2 R2-O2-welch 264 1250.0 1069.25 269.20 750.0 468.00 313.89 0.26 False
drop trial end E1 0.2 R2-O2-welch 264 NaN 672.41 88.65 850.0 439.57 228.99 0.26 False
drop trial end E2 0.2 R2-O2-welch 264 1350.0 1169.25 269.20 850.0 557.50 326.37 0.26 False
drop delay centre E1 0.2 R1-O1-student 286 NaN 550.53 113.34 500.0 439.53 232.17 0.29 False
drop delay centre E2 0.2 R1-O1-student 286 1350.0 924.48 429.90 500.0 539.20 338.44 0.29 False
drop delay end E1 0.2 R1-O1-student 286 NaN 625.86 75.38 600.0 486.31 214.19 0.29 False
drop delay end E2 0.2 R1-O1-student 286 1450.0 1024.48 429.90 600.0 629.90 349.84 0.29 False
drop delay centre E1 0.2 R1-O1-welch 284 NaN 585.56 135.04 500.0 462.22 231.28 0.30 False
drop delay centre E2 0.2 R1-O1-welch 284 1350.0 917.97 373.09 500.0 533.50 313.57 0.30 False
drop delay end E1 0.2 R1-O1-welch 284 NaN 628.38 61.56 600.0 499.07 208.33 0.30 False
drop delay end E2 0.2 R1-O1-welch 284 1450.0 1017.97 373.09 600.0 622.50 326.41 0.30 False
drop delay centre E1 0.2 R1-O2-student 260 NaN 539.89 101.73 900.0 443.29 257.24 0.27 False
drop delay centre E2 0.2 R1-O2-student 260 1000.0 858.55 375.67 900.0 580.00 384.32 0.27 False
drop delay end E1 0.2 R1-O2-student 260 NaN 618.18 60.39 NaN 482.88 231.10 0.27 False
drop delay end E2 0.2 R1-O2-student 260 1100.0 958.55 375.67 1000.0 674.75 391.57 0.27 False
drop delay centre E1 0.2 R1-O2-welch 260 NaN 541.40 100.97 900.0 438.92 235.03 0.27 False
drop delay centre E2 0.2 R1-O2-welch 260 1000.0 874.74 375.31 900.0 594.97 374.33 0.27 False
drop delay end E1 0.2 R1-O2-welch 260 NaN 615.70 47.16 NaN 485.92 199.77 0.27 False
drop delay end E2 0.2 R1-O2-welch 260 1100.0 974.74 375.31 1000.0 692.21 378.08 0.27 False
drop delay centre E1 0.2 R2-O1-student 289 NaN 559.43 127.22 750.0 473.56 224.74 0.30 False
drop delay centre E2 0.2 R2-O1-student 289 1350.0 872.66 416.36 750.0 567.75 328.33 0.30 False
drop delay end E1 0.2 R2-O1-student 289 NaN 621.81 75.64 850.0 510.65 204.94 0.30 False
drop delay end E2 0.2 R2-O1-student 289 1450.0 972.66 416.36 850.0 656.75 341.31 0.30 False
drop delay centre E1 0.2 R2-O1-welch 286 NaN 562.67 125.46 750.0 430.35 221.96 0.31 False
drop delay centre E2 0.2 R2-O1-welch 286 1350.0 959.52 393.55 750.0 530.75 332.14 0.31 False
drop delay end E1 0.2 R2-O1-welch 286 NaN 628.36 81.14 850.0 477.67 199.66 0.31 False
drop delay end E2 0.2 R2-O1-welch 286 1450.0 1059.52 393.55 850.0 620.25 343.08 0.31 False
drop delay centre E1 0.2 R2-O2-student 264 NaN 544.00 112.09 900.0 486.42 253.97 0.27 False
drop delay centre E2 0.2 R2-O2-student 264 1000.0 834.92 354.04 900.0 656.28 381.77 0.27 False
drop delay end E1 0.2 R2-O2-student 264 NaN 616.85 66.46 NaN 492.00 216.19 0.27 False
drop delay end E2 0.2 R2-O2-student 264 1100.0 934.92 354.04 1000.0 747.74 392.94 0.27 False
drop delay centre E1 0.2 R2-O2-welch 264 NaN 552.20 106.11 750.0 452.40 239.69 0.27 False
drop delay centre E2 0.2 R2-O2-welch 264 1000.0 891.71 395.81 750.0 573.50 355.03 0.27 False
drop delay end E1 0.2 R2-O2-welch 264 NaN 622.89 50.48 850.0 486.49 207.10 0.27 False
drop delay end E2 0.2 R2-O2-welch 264 1100.0 991.71 395.81 850.0 666.25 364.59 0.27 False
drop bin centre E1 0.2 R1-O1-student 286 NaN 547.17 56.98 450.0 380.41 155.99 0.29 False
drop bin centre E2 0.2 R1-O1-student 286 1200.0 1023.60 334.65 450.0 399.75 189.44 0.29 False
drop bin end E1 0.2 R1-O1-student 286 NaN 641.35 38.88 550.0 460.32 144.34 0.29 False
drop bin end E2 0.2 R1-O1-student 286 1300.0 1123.60 334.65 550.0 493.25 197.02 0.29 False
drop bin centre E1 0.2 R1-O1-welch 284 NaN 530.00 73.99 400.0 382.99 162.01 0.29 False
drop bin centre E2 0.2 R1-O1-welch 284 1200.0 1093.72 370.76 400.0 392.50 178.31 0.29 False
drop bin end E1 0.2 R1-O1-welch 284 NaN 630.00 73.99 500.0 466.23 140.02 0.29 False
drop bin end E2 0.2 R1-O1-welch 284 1300.0 1193.72 370.76 500.0 491.50 180.22 0.29 False
drop bin centre E1 0.2 R1-O2-student 260 NaN 540.38 65.81 500.0 422.82 167.42 0.29 False
drop bin centre E2 0.2 R1-O2-student 260 1200.0 1048.50 349.39 500.0 438.75 193.68 0.29 False
drop bin end E1 0.2 R1-O2-student 260 NaN 633.33 42.78 600.0 497.84 133.44 0.28 False
drop bin end E2 0.2 R1-O2-student 260 1300.0 1148.50 349.39 600.0 538.50 194.21 0.28 False
drop bin centre E1 0.2 R1-O2-welch 260 NaN 547.83 52.77 450.0 420.11 170.88 0.29 False
drop bin centre E2 0.2 R1-O2-welch 260 1200.0 1012.56 398.51 450.0 453.75 217.42 0.29 False
drop bin end E1 0.2 R1-O2-welch 260 NaN 643.38 38.26 550.0 485.80 119.17 0.27 False
drop bin end E2 0.2 R1-O2-welch 260 1300.0 1112.56 398.51 550.0 553.75 217.42 0.27 False
drop bin centre E1 0.2 R2-O1-student 289 NaN 530.36 73.61 400.0 410.32 151.93 0.30 False
drop bin centre E2 0.2 R2-O1-student 289 1200.0 1010.05 330.64 400.0 444.75 205.82 0.30 False
drop bin end E1 0.2 R2-O1-student 289 NaN 630.36 73.61 500.0 480.83 120.56 0.30 False
drop bin end E2 0.2 R2-O1-student 289 1300.0 1110.05 330.64 500.0 539.50 211.75 0.30 False
drop bin centre E1 0.2 R2-O1-welch 286 NaN 540.24 82.06 400.0 386.98 142.66 0.30 False
drop bin centre E2 0.2 R2-O1-welch 286 1200.0 1082.32 345.45 400.0 415.00 196.66 0.30 False
drop bin end E1 0.2 R2-O1-welch 286 NaN 632.50 66.66 500.0 466.22 127.85 0.30 False
drop bin end E2 0.2 R2-O1-welch 286 1300.0 1182.32 345.45 500.0 504.50 197.94 0.30 False
drop bin centre E1 0.2 R2-O2-student 264 NaN 538.81 63.38 500.0 438.44 159.77 0.29 False
drop bin centre E2 0.2 R2-O2-student 264 1200.0 1013.64 397.30 500.0 480.25 217.42 0.29 False
drop bin end E1 0.2 R2-O2-student 264 NaN 634.09 50.87 600.0 510.00 122.12 0.27 False
drop bin end E2 0.2 R2-O2-student 264 1300.0 1113.64 397.30 600.0 579.50 219.04 0.27 False
drop bin centre E1 0.2 R2-O2-welch 264 NaN 534.09 87.54 450.0 424.33 171.68 0.28 False
drop bin centre E2 0.2 R2-O2-welch 264 1200.0 1015.00 401.56 450.0 463.50 223.59 0.28 False
drop bin end E1 0.2 R2-O2-welch 264 NaN 624.22 68.46 550.0 489.94 122.94 0.27 False
drop bin end E2 0.2 R2-O2-welch 264 1300.0 1115.00 401.56 550.0 563.25 224.08 0.27 False
drop trial centre E1 0.4 R1-O1-student 286 NaN 746.15 149.95 750.0 496.73 265.91 0.27 False
drop trial centre E2 0.4 R1-O1-student 286 1200.0 1170.05 178.31 750.0 628.25 334.83 0.27 False
drop trial end E1 0.4 R1-O1-student 286 NaN 800.00 76.38 NaN 544.50 223.33 0.23 False
drop trial end E2 0.4 R1-O1-student 286 1400.0 1370.05 178.31 950.0 815.50 352.47 0.23 False
drop trial centre E1 0.4 R1-O1-welch 284 NaN 800.00 134.37 750.0 474.64 260.94 0.27 False
drop trial centre E2 0.4 R1-O1-welch 284 1200.0 1172.31 195.93 750.0 645.00 341.76 0.27 False
drop trial end E1 0.4 R1-O1-welch 284 NaN 816.67 55.28 NaN 541.26 221.80 0.24 False
drop trial end E2 0.4 R1-O1-welch 284 1400.0 1372.31 195.93 950.0 837.50 356.50 0.24 False
drop trial centre E1 0.4 R1-O2-student 260 NaN 794.12 125.89 750.0 456.07 267.36 0.26 False
drop trial centre E2 0.4 R1-O2-student 260 1200.0 1167.01 228.83 750.0 635.00 354.96 0.26 False
drop trial end E1 0.4 R1-O2-student 260 NaN 833.33 37.27 NaN 505.88 240.84 0.22 False
drop trial end E2 0.4 R1-O2-student 260 1400.0 1367.01 228.83 950.0 821.50 378.57 0.22 False
drop trial centre E1 0.4 R1-O2-welch 260 NaN 867.65 66.29 750.0 517.73 257.18 0.26 False
drop trial centre E2 0.4 R1-O2-welch 260 1200.0 1178.83 204.47 750.0 680.50 334.13 0.26 False
drop trial end E1 0.4 R1-O2-welch 260 NaN 850.00 0.00 NaN 544.27 223.71 0.22 False
drop trial end E2 0.4 R1-O2-welch 260 1400.0 1378.83 204.47 950.0 861.00 358.23 0.22 False
drop trial centre E1 0.4 R2-O1-student 289 NaN 736.11 154.39 750.0 495.45 259.83 0.27 False
drop trial centre E2 0.4 R2-O1-student 289 1200.0 1151.03 193.31 750.0 624.50 331.25 0.27 False
drop trial end E1 0.4 R2-O1-student 289 NaN 781.25 78.81 NaN 542.92 221.21 0.23 False
drop trial end E2 0.4 R2-O1-student 289 1400.0 1351.03 193.31 950.0 806.25 355.03 0.23 False
drop trial centre E1 0.4 R2-O1-welch 286 NaN 744.44 111.67 750.0 424.83 258.82 0.27 False
drop trial centre E2 0.4 R2-O1-welch 286 1200.0 1171.50 211.25 750.0 594.00 361.30 0.27 False
drop trial end E1 0.4 R2-O1-welch 286 NaN 866.67 23.57 NaN 515.00 215.50 0.24 False
drop trial end E2 0.4 R2-O1-welch 286 1400.0 1371.50 211.25 950.0 782.50 377.62 0.24 False
drop trial centre E1 0.4 R2-O2-student 264 NaN 810.87 103.16 750.0 484.58 274.91 0.26 False
drop trial centre E2 0.4 R2-O2-student 264 1200.0 1160.10 206.89 750.0 709.75 350.60 0.26 False
drop trial end E1 0.4 R2-O2-student 264 NaN 858.33 18.63 NaN 504.76 226.86 0.23 False
drop trial end E2 0.4 R2-O2-student 264 1400.0 1360.10 206.89 950.0 894.75 374.68 0.23 False
drop trial centre E1 0.4 R2-O2-welch 264 NaN 768.18 138.62 750.0 468.18 256.83 0.26 False
drop trial centre E2 0.4 R2-O2-welch 264 1200.0 1161.34 222.22 750.0 631.75 341.18 0.26 False
drop trial end E1 0.4 R2-O2-welch 264 NaN 806.25 76.80 NaN 534.09 235.09 0.22 False
drop trial end E2 0.4 R2-O2-welch 264 1400.0 1361.34 222.22 950.0 813.75 366.91 0.22 False
drop delay centre E1 0.4 R1-O1-student 286 NaN 666.13 169.86 850.0 497.20 234.38 0.26 False
drop delay centre E2 0.4 R1-O1-student 286 1400.0 1045.89 382.11 850.0 777.27 441.69 0.26 False
drop delay end E1 0.4 R1-O1-student 286 NaN 766.67 102.74 NaN 579.17 207.87 0.26 False
drop delay end E2 0.4 R1-O1-student 286 1600.0 1245.89 382.11 1050.0 963.89 456.65 0.26 False
drop delay centre E1 0.4 R1-O1-welch 284 NaN 666.98 158.69 850.0 496.77 217.37 0.26 False
drop delay centre E2 0.4 R1-O1-welch 284 1400.0 1091.82 362.83 850.0 771.32 421.11 0.26 False
drop delay end E1 0.4 R1-O1-welch 284 NaN 775.68 85.91 NaN 605.61 166.73 0.26 False
drop delay end E2 0.4 R1-O1-welch 284 1600.0 1291.82 362.83 1050.0 968.53 425.58 0.26 False
drop delay centre E1 0.4 R1-O2-student 260 NaN 649.02 182.17 NaN 463.18 228.40 0.26 False
drop delay centre E2 0.4 R1-O2-student 260 1400.0 1062.58 370.41 1100.0 819.50 452.63 0.26 False
drop delay end E1 0.4 R1-O2-student 260 NaN 733.82 96.04 NaN 537.65 194.47 0.24 False
drop delay end E2 0.4 R1-O2-student 260 1600.0 1262.58 370.41 1300.0 1006.25 470.48 0.24 False
drop delay centre E1 0.4 R1-O2-welch 260 NaN 697.27 173.31 NaN 477.45 219.14 0.26 False
drop delay centre E2 0.4 R1-O2-welch 260 1400.0 1074.20 368.53 1100.0 836.99 421.52 0.26 False
drop delay end E1 0.4 R1-O2-welch 260 NaN 758.06 90.78 NaN 560.24 191.03 0.24 False
drop delay end E2 0.4 R1-O2-welch 260 1600.0 1274.20 368.53 1300.0 1019.13 443.87 0.24 False
drop delay centre E1 0.4 R2-O1-student 289 NaN 633.04 152.74 850.0 511.07 224.06 0.27 False
drop delay centre E2 0.4 R2-O1-student 289 1400.0 1062.94 380.18 850.0 744.95 389.28 0.27 False
drop delay end E1 0.4 R2-O1-student 289 NaN 767.05 94.11 NaN 595.50 186.16 0.26 False
drop delay end E2 0.4 R2-O1-student 289 1600.0 1262.94 380.18 1050.0 934.85 403.17 0.26 False
drop delay centre E1 0.4 R2-O1-welch 286 NaN 638.78 179.93 850.0 476.67 228.02 0.27 False
drop delay centre E2 0.4 R2-O1-welch 286 1400.0 1065.26 360.97 850.0 734.17 433.27 0.27 False
drop delay end E1 0.4 R2-O1-welch 286 NaN 737.88 120.62 NaN 588.74 189.20 0.27 False
drop delay end E2 0.4 R2-O1-welch 286 1600.0 1265.26 360.97 1050.0 928.39 442.14 0.27 False
drop delay centre E1 0.4 R2-O2-student 264 NaN 648.28 180.27 NaN 480.98 244.60 0.26 False
drop delay centre E2 0.4 R2-O2-student 264 1400.0 1029.11 348.56 1100.0 860.91 410.36 0.26 False
drop delay end E1 0.4 R2-O2-student 264 NaN 738.75 91.16 NaN 552.86 218.91 0.24 False
drop delay end E2 0.4 R2-O2-student 264 1600.0 1229.11 348.56 1300.0 1052.79 426.92 0.24 False
drop delay centre E1 0.4 R2-O2-welch 264 NaN 674.55 149.20 NaN 465.57 222.97 0.26 False
drop delay centre E2 0.4 R2-O2-welch 264 1400.0 1063.31 375.42 1100.0 755.56 423.93 0.26 False
drop delay end E1 0.4 R2-O2-welch 264 NaN 786.84 80.85 NaN 574.50 196.40 0.24 False
drop delay end E2 0.4 R2-O2-welch 264 1600.0 1263.31 375.42 1300.0 947.22 436.56 0.24 False
drop bin centre E1 0.4 R1-O1-student 286 NaN 596.15 88.71 500.0 458.48 219.27 0.28 False
drop bin centre E2 0.4 R1-O1-student 286 1200.0 1200.26 257.45 500.0 562.25 302.18 0.28 False
drop bin end E1 0.4 R1-O1-student 286 NaN 796.15 88.71 700.0 566.67 133.95 0.26 False
drop bin end E2 0.4 R1-O1-student 286 1400.0 1400.26 257.45 700.0 762.00 302.62 0.26 False
drop bin centre E1 0.4 R1-O1-welch 284 NaN 582.14 72.23 500.0 436.59 200.16 0.28 False
drop bin centre E2 0.4 R1-O1-welch 284 1200.0 1205.56 297.45 500.0 543.00 291.93 0.28 False
drop bin end E1 0.4 R1-O1-welch 284 NaN 782.14 72.23 700.0 573.24 137.85 0.26 False
drop bin end E2 0.4 R1-O1-welch 284 1400.0 1405.56 297.45 700.0 741.75 294.23 0.26 False
drop bin centre E1 0.4 R1-O2-student 260 NaN 609.09 49.17 850.0 479.69 205.95 0.29 False
drop bin centre E2 0.4 R1-O2-student 260 1200.0 1166.32 282.19 850.0 590.75 290.43 0.29 False
drop bin end E1 0.4 R1-O2-student 260 NaN 809.09 49.17 NaN 599.61 144.34 0.24 False
drop bin end E2 0.4 R1-O2-student 260 1400.0 1366.32 282.19 1050.0 790.00 292.02 0.24 False
drop bin centre E1 0.4 R1-O2-welch 260 NaN 600.00 53.16 500.0 470.39 211.62 0.29 False
drop bin centre E2 0.4 R1-O2-welch 260 1200.0 1188.74 337.90 500.0 605.75 304.93 0.29 False
drop bin end E1 0.4 R1-O2-welch 260 NaN 800.00 53.16 700.0 583.47 127.27 0.24 False
drop bin end E2 0.4 R1-O2-welch 260 1400.0 1388.74 337.90 700.0 804.75 306.90 0.24 False
drop bin centre E1 0.4 R2-O1-student 289 NaN 580.00 73.14 500.0 454.19 194.49 0.29 False
drop bin centre E2 0.4 R2-O1-student 289 1200.0 1166.84 272.09 500.0 551.75 284.14 0.29 False
drop bin end E1 0.4 R2-O1-student 289 NaN 780.00 73.14 700.0 582.98 139.89 0.27 False
drop bin end E2 0.4 R2-O1-student 289 1400.0 1366.84 272.09 700.0 748.00 290.12 0.27 False
drop bin centre E1 0.4 R2-O1-welch 286 NaN 579.17 105.00 500.0 437.43 197.42 0.29 False
drop bin centre E2 0.4 R2-O1-welch 286 1200.0 1204.15 267.22 500.0 538.00 291.21 0.29 False
drop bin end E1 0.4 R2-O1-welch 286 NaN 779.17 105.00 700.0 573.61 133.46 0.27 False
drop bin end E2 0.4 R2-O1-welch 286 1400.0 1404.15 267.22 700.0 737.00 293.23 0.27 False
drop bin centre E1 0.4 R2-O2-student 264 NaN 583.93 83.51 850.0 516.89 234.16 0.29 False
drop bin centre E2 0.4 R2-O2-student 264 1200.0 1168.13 339.09 850.0 641.00 299.49 0.29 False
drop bin end E1 0.4 R2-O2-student 264 NaN 783.93 83.51 NaN 590.91 159.29 0.23 False
drop bin end E2 0.4 R2-O2-student 264 1400.0 1368.13 339.09 1050.0 838.00 306.07 0.23 False
drop bin centre E1 0.4 R2-O2-welch 264 NaN 592.86 69.07 850.0 477.19 221.21 0.29 False
drop bin centre E2 0.4 R2-O2-welch 264 1200.0 1133.96 286.15 850.0 586.75 297.17 0.29 False
drop bin end E1 0.4 R2-O2-welch 264 NaN 792.86 69.07 NaN 580.71 136.76 0.23 False
drop bin end E2 0.4 R2-O2-welch 264 1400.0 1333.96 286.15 1050.0 785.75 299.18 0.23 False
keep trial centre E1 0.2 R1-O1-student 293 NaN 833.78 58.19 200.0 270.96 150.01 0.29 False
keep trial centre E2 0.2 R1-O1-student 293 1250.0 1165.33 234.21 200.0 278.75 168.26 0.29 False
keep trial end E1 0.2 R1-O1-student 293 NaN 856.25 84.55 300.0 366.75 146.79 0.29 False
keep trial end E2 0.2 R1-O1-student 293 1350.0 1265.33 234.21 300.0 377.50 170.20 0.29 False
keep trial centre E1 0.2 R1-O1-welch 285 NaN 807.32 100.95 200.0 282.25 144.82 0.29 False
keep trial centre E2 0.2 R1-O1-welch 285 1300.0 1181.91 238.71 200.0 282.25 144.82 0.29 False
keep trial end E1 0.2 R1-O1-welch 285 NaN 777.27 119.40 300.0 379.40 139.46 0.29 False
keep trial end E2 0.2 R1-O1-welch 285 1400.0 1281.91 238.71 300.0 382.25 144.82 0.29 False
keep trial centre E1 0.2 R1-O2-student 272 NaN 756.41 155.74 200.0 314.07 170.58 0.29 False
keep trial centre E2 0.2 R1-O2-student 272 1300.0 1209.69 306.70 200.0 318.00 178.96 0.29 False
keep trial end E1 0.2 R1-O2-student 272 NaN 675.00 125.00 300.0 407.87 162.71 0.29 False
keep trial end E2 0.2 R1-O2-student 272 1400.0 1309.69 306.70 300.0 417.50 179.84 0.29 False
keep trial centre E1 0.2 R1-O2-welch 268 NaN 758.54 150.97 400.0 317.93 157.13 0.29 False
keep trial centre E2 0.2 R1-O2-welch 268 1300.0 1204.21 312.35 400.0 326.25 176.98 0.29 False
keep trial end E1 0.2 R1-O2-welch 268 NaN 678.57 131.90 500.0 412.18 156.35 0.29 False
keep trial end E2 0.2 R1-O2-welch 268 1400.0 1304.21 312.35 500.0 423.25 180.13 0.29 False
keep trial centre E1 0.2 R2-O1-student 293 NaN 829.76 85.26 200.0 271.25 146.32 0.29 False
keep trial centre E2 0.2 R2-O1-student 293 1250.0 1163.01 212.96 200.0 271.25 146.32 0.29 False
keep trial end E1 0.2 R2-O1-student 293 NaN 766.67 134.37 300.0 363.89 137.88 0.29 False
keep trial end E2 0.2 R2-O1-student 293 1350.0 1263.01 212.96 300.0 369.75 149.07 0.29 False
keep trial centre E1 0.2 R2-O1-welch 290 NaN 797.37 109.39 200.0 275.26 142.72 0.29 False
keep trial centre E2 0.2 R2-O1-welch 290 1250.0 1163.20 227.72 200.0 290.50 177.30 0.29 False
keep trial end E1 0.2 R2-O1-welch 290 NaN 754.55 109.66 300.0 374.74 143.70 0.29 False
keep trial end E2 0.2 R2-O1-welch 290 1350.0 1263.20 227.72 300.0 390.00 178.12 0.29 False
keep trial centre E1 0.2 R2-O2-student 272 NaN 721.88 188.31 200.0 303.79 156.50 0.29 False
keep trial centre E2 0.2 R2-O2-student 272 1300.0 1185.64 279.70 200.0 312.50 178.24 0.29 False
keep trial end E1 0.2 R2-O2-student 272 NaN 673.33 184.27 300.0 399.75 153.84 0.29 False
keep trial end E2 0.2 R2-O2-student 272 1400.0 1285.64 279.70 300.0 411.25 179.89 0.29 False
keep trial centre E1 0.2 R2-O2-welch 269 NaN 786.67 121.06 200.0 317.25 170.85 0.29 False
keep trial centre E2 0.2 R2-O2-welch 269 1300.0 1235.28 289.16 200.0 317.25 170.85 0.29 False
keep trial end E1 0.2 R2-O2-welch 269 NaN 727.78 110.83 300.0 410.86 164.83 0.29 False
keep trial end E2 0.2 R2-O2-welch 269 1400.0 1335.28 289.16 300.0 416.25 172.55 0.29 False
keep delay centre E1 0.2 R1-O1-student 293 NaN 745.36 136.80 350.0 349.23 131.80 0.33 False
keep delay centre E2 0.2 R1-O1-student 293 2300.0 1053.29 469.17 350.0 372.25 200.98 0.33 False
keep delay end E1 0.2 R1-O1-student 293 NaN 718.18 107.71 450.0 444.04 122.17 0.33 False
keep delay end E2 0.2 R1-O1-student 293 2400.0 1153.29 469.17 450.0 472.25 200.98 0.33 False
keep delay centre E1 0.2 R1-O1-welch 285 NaN 768.50 134.47 350.0 356.12 150.38 0.32 False
keep delay centre E2 0.2 R1-O1-welch 285 2300.0 1056.86 437.80 350.0 371.75 186.25 0.32 False
keep delay end E1 0.2 R1-O1-welch 285 NaN 727.03 130.28 450.0 445.05 130.66 0.32 False
keep delay end E2 0.2 R1-O1-welch 285 2400.0 1156.86 437.80 450.0 471.75 186.25 0.32 False
keep delay centre E1 0.2 R1-O2-student 272 NaN 733.12 144.90 400.0 402.07 175.86 0.31 False
keep delay centre E2 0.2 R1-O2-student 272 2300.0 1121.34 494.92 400.0 429.75 227.38 0.31 False
keep delay end E1 0.2 R1-O2-student 272 NaN 711.25 109.82 500.0 492.11 168.71 0.31 False
keep delay end E2 0.2 R1-O2-student 272 2400.0 1221.34 494.92 500.0 527.75 229.82 0.31 False
keep delay centre E1 0.2 R1-O2-welch 268 NaN 730.77 144.39 400.0 384.47 157.06 0.32 False
keep delay centre E2 0.2 R1-O2-welch 268 2300.0 1179.35 545.24 400.0 419.00 216.88 0.32 False
keep delay end E1 0.2 R1-O2-welch 268 NaN 727.38 124.50 500.0 483.16 160.12 0.32 False
keep delay end E2 0.2 R1-O2-welch 268 2400.0 1279.35 545.24 500.0 517.75 219.20 0.32 False
keep delay centre E1 0.2 R2-O1-student 293 NaN 759.62 130.10 350.0 350.00 149.12 0.33 False
keep delay centre E2 0.2 R2-O1-student 293 NaN 1045.66 440.67 350.0 353.00 154.65 0.33 False
keep delay end E1 0.2 R2-O1-student 293 NaN 735.23 114.60 450.0 437.95 133.09 0.33 False
keep delay end E2 0.2 R2-O1-student 293 NaN 1145.66 440.67 450.0 451.75 157.27 0.33 False
keep delay centre E1 0.2 R2-O1-welch 290 NaN 727.96 140.56 350.0 330.67 135.65 0.33 False
keep delay centre E2 0.2 R2-O1-welch 290 NaN 1070.71 478.36 350.0 353.75 189.40 0.33 False
keep delay end E1 0.2 R2-O1-welch 290 NaN 721.00 109.13 450.0 425.26 125.52 0.33 False
keep delay end E2 0.2 R2-O1-welch 290 NaN 1170.71 478.36 450.0 453.75 189.40 0.33 False
keep delay centre E1 0.2 R2-O2-student 272 NaN 724.18 159.04 350.0 387.63 169.68 0.32 False
keep delay centre E2 0.2 R2-O2-student 272 2300.0 1105.92 519.10 350.0 412.25 219.91 0.32 False
keep delay end E1 0.2 R2-O2-student 272 NaN 710.42 143.24 450.0 474.87 152.37 0.32 False
keep delay end E2 0.2 R2-O2-student 272 2400.0 1205.92 519.10 450.0 512.25 219.91 0.32 False
keep delay centre E1 0.2 R2-O2-welch 269 NaN 748.33 134.46 350.0 392.05 169.54 0.32 False
keep delay centre E2 0.2 R2-O2-welch 269 2300.0 1165.50 550.47 350.0 410.50 204.79 0.32 False
keep delay end E1 0.2 R2-O2-welch 269 NaN 709.21 96.56 450.0 479.21 153.30 0.32 False
keep delay end E2 0.2 R2-O2-welch 269 2400.0 1265.50 550.47 450.0 510.25 205.26 0.32 False
keep bin centre E1 0.2 R1-O1-student 293 NaN 625.68 133.37 350.0 353.65 121.03 0.33 False
keep bin centre E2 0.2 R1-O1-student 293 1200.0 1111.00 277.95 350.0 381.50 181.27 0.33 False
keep bin end E1 0.2 R1-O1-student 293 NaN 670.00 73.71 450.0 446.58 110.51 0.33 False
keep bin end E2 0.2 R1-O1-student 293 1300.0 1211.00 277.95 450.0 480.25 183.02 0.33 False
keep bin centre E1 0.2 R1-O1-welch 285 NaN 612.50 156.51 350.0 341.75 106.65 0.33 False
keep bin centre E2 0.2 R1-O1-welch 285 1200.0 1116.25 281.11 350.0 362.25 157.20 0.33 False
keep bin end E1 0.2 R1-O1-welch 285 NaN 627.78 61.36 450.0 441.49 107.42 0.33 False
keep bin end E2 0.2 R1-O1-welch 285 1300.0 1216.25 281.11 450.0 462.00 157.74 0.33 False
keep bin centre E1 0.2 R1-O2-student 272 NaN 696.43 182.70 400.0 398.91 148.54 0.33 False
keep bin centre E2 0.2 R1-O2-student 272 1200.0 1199.24 307.38 400.0 454.00 235.18 0.33 False
keep bin end E1 0.2 R1-O2-student 272 NaN 607.69 70.29 500.0 478.09 125.97 0.33 False
keep bin end E2 0.2 R1-O2-student 272 1300.0 1299.24 307.38 500.0 550.50 239.63 0.33 False
keep bin centre E1 0.2 R1-O2-welch 268 NaN 662.00 165.09 450.0 397.04 127.02 0.33 False
keep bin centre E2 0.2 R1-O2-welch 268 1250.0 1234.52 336.07 450.0 444.00 210.75 0.33 False
keep bin end E1 0.2 R1-O2-welch 268 NaN 673.53 124.99 550.0 488.32 124.07 0.33 False
keep bin end E2 0.2 R1-O2-welch 268 1350.0 1334.52 336.07 550.0 541.00 215.51 0.33 False
keep bin centre E1 0.2 R2-O1-student 293 NaN 645.59 156.42 350.0 356.89 108.17 0.33 False
keep bin centre E2 0.2 R2-O1-student 293 1200.0 1100.25 246.56 350.0 369.75 139.99 0.33 False
keep bin end E1 0.2 R2-O1-student 293 NaN 654.17 77.62 450.0 452.05 105.96 0.33 False
keep bin end E2 0.2 R2-O1-student 293 1300.0 1200.25 246.56 450.0 467.75 143.61 0.33 False
keep bin centre E1 0.2 R2-O1-welch 290 NaN 616.22 141.92 350.0 342.60 102.06 0.33 False
keep bin centre E2 0.2 R2-O1-welch 290 1200.0 1095.00 264.95 350.0 357.25 144.08 0.33 False
keep bin end E1 0.2 R2-O1-welch 290 NaN 648.28 64.97 450.0 435.64 101.77 0.33 False
keep bin end E2 0.2 R2-O1-welch 290 1300.0 1195.00 264.95 450.0 453.25 149.51 0.33 False
keep bin centre E1 0.2 R2-O2-student 272 NaN 579.63 197.32 400.0 383.06 133.73 0.33 False
keep bin centre E2 0.2 R2-O2-student 272 1250.0 1170.20 308.17 400.0 442.50 233.65 0.33 False
keep bin end E1 0.2 R2-O2-student 272 NaN 602.38 152.34 500.0 476.80 124.54 0.33 False
keep bin end E2 0.2 R2-O2-student 272 1350.0 1270.20 308.17 500.0 542.00 234.60 0.33 False
keep bin centre E1 0.2 R2-O2-welch 269 NaN 628.00 163.76 400.0 398.31 135.22 0.33 False
keep bin centre E2 0.2 R2-O2-welch 269 1250.0 1202.76 320.30 400.0 471.50 244.62 0.33 False
keep bin end E1 0.2 R2-O2-welch 269 NaN 620.59 57.03 500.0 489.71 119.20 0.33 False
keep bin end E2 0.2 R2-O2-welch 269 1350.0 1302.76 320.30 500.0 571.50 244.62 0.33 False
keep trial centre E1 0.4 R1-O1-student 293 NaN 850.00 67.08 300.0 322.66 151.71 0.27 False
keep trial centre E2 0.4 R1-O1-student 293 1300.0 1270.83 175.99 300.0 353.25 212.49 0.27 False
keep trial end E1 0.4 R1-O1-student 293 NaN NaN NaN 500.0 502.70 130.46 0.27 False
keep trial end E2 0.4 R1-O1-student 293 1500.0 1470.83 175.99 500.0 551.00 216.62 0.27 False
keep trial centre E1 0.4 R1-O1-welch 285 NaN 821.43 79.54 300.0 342.45 139.97 0.27 False
keep trial centre E2 0.4 R1-O1-welch 285 1300.0 1285.26 195.93 300.0 372.50 201.97 0.27 False
keep trial end E1 0.4 R1-O1-welch 285 NaN 900.00 0.00 500.0 525.68 111.76 0.27 False
keep trial end E2 0.4 R1-O1-welch 285 1500.0 1485.26 195.93 500.0 572.50 201.97 0.27 False
keep trial centre E1 0.4 R1-O2-student 272 NaN 727.78 141.64 300.0 368.09 159.60 0.26 False
keep trial centre E2 0.4 R1-O2-student 272 1350.0 1300.82 228.11 300.0 411.25 230.62 0.26 False
keep trial end E1 0.4 R1-O2-student 272 NaN 812.50 124.37 500.0 549.44 145.20 0.26 False
keep trial end E2 0.4 R1-O2-student 272 1550.0 1500.82 228.11 500.0 609.75 233.44 0.26 False
keep trial centre E1 0.4 R1-O2-welch 268 NaN 779.17 66.01 300.0 372.16 147.94 0.26 False
keep trial centre E2 0.4 R1-O2-welch 268 1350.0 1305.68 224.17 300.0 423.00 229.45 0.26 False
keep trial end E1 0.4 R1-O2-welch 268 NaN 850.00 0.00 500.0 554.97 154.77 0.26 False
keep trial end E2 0.4 R1-O2-welch 268 1550.0 1505.68 224.17 500.0 615.00 240.73 0.26 False
keep trial centre E1 0.4 R2-O1-student 293 NaN 750.00 60.30 300.0 317.53 148.28 0.27 False
keep trial centre E2 0.4 R2-O1-student 293 1300.0 1233.78 178.17 300.0 338.75 189.57 0.27 False
keep trial end E1 0.4 R2-O1-student 293 NaN 883.33 23.57 500.0 502.12 139.14 0.27 False
keep trial end E2 0.4 R2-O1-student 293 1500.0 1433.78 178.17 500.0 535.50 196.00 0.27 False
keep trial centre E1 0.4 R2-O1-welch 290 NaN 766.67 84.98 300.0 331.09 147.67 0.27 False
keep trial centre E2 0.4 R2-O1-welch 290 1300.0 1263.56 210.34 300.0 357.00 199.50 0.27 False
keep trial end E1 0.4 R2-O1-welch 290 NaN 875.00 25.00 500.0 515.51 131.43 0.27 False
keep trial end E2 0.4 R2-O1-welch 290 1500.0 1463.56 210.34 500.0 555.50 202.35 0.27 False
keep trial centre E1 0.4 R2-O2-student 272 NaN 705.00 103.56 300.0 378.12 161.26 0.26 False
keep trial centre E2 0.4 R2-O2-student 272 1350.0 1273.64 204.56 300.0 404.02 209.23 0.26 False
keep trial end E1 0.4 R2-O2-student 272 NaN 820.00 67.82 500.0 555.46 142.09 0.26 False
keep trial end E2 0.4 R2-O2-student 272 1550.0 1473.64 204.56 500.0 601.51 213.19 0.26 False
keep trial centre E1 0.4 R2-O2-welch 269 NaN 761.11 31.43 300.0 387.82 180.44 0.26 False
keep trial centre E2 0.4 R2-O2-welch 269 1350.0 1298.11 229.12 300.0 411.50 217.01 0.26 False
keep trial end E1 0.4 R2-O2-welch 269 NaN NaN NaN 500.0 546.57 138.83 0.26 False
keep trial end E2 0.4 R2-O2-welch 269 1550.0 1498.11 229.12 500.0 610.50 219.12 0.26 False
keep delay centre E1 0.4 R1-O1-student 293 NaN 735.87 81.87 400.0 382.54 131.08 0.30 False
keep delay centre E2 0.4 R1-O1-student 293 NaN 1155.24 460.90 400.0 429.40 244.60 0.30 False
keep delay end E1 0.4 R1-O1-student 293 NaN 850.00 38.35 600.0 563.61 102.31 0.30 False
keep delay end E2 0.4 R1-O1-student 293 NaN 1355.24 460.90 600.0 629.40 244.60 0.30 False
keep delay centre E1 0.4 R1-O1-welch 285 NaN 750.00 122.47 400.0 380.00 130.61 0.30 False
keep delay centre E2 0.4 R1-O1-welch 285 NaN 1216.81 425.12 400.0 438.19 250.37 0.30 False
keep delay end E1 0.4 R1-O1-welch 285 NaN 811.54 90.20 600.0 563.76 103.28 0.30 False
keep delay end E2 0.4 R1-O1-welch 285 NaN 1416.81 425.12 600.0 638.19 250.37 0.30 False
keep delay centre E1 0.4 R1-O2-student 272 NaN 709.72 112.31 450.0 429.55 160.63 0.29 False
keep delay centre E2 0.4 R1-O2-student 272 NaN 1328.44 523.81 450.0 525.75 308.42 0.29 False
keep delay end E1 0.4 R1-O2-student 272 NaN 784.62 71.75 650.0 592.50 132.78 0.29 False
keep delay end E2 0.4 R1-O2-student 272 NaN 1528.44 523.81 650.0 723.00 311.96 0.29 False
keep delay centre E1 0.4 R1-O2-welch 268 NaN 709.46 110.79 450.0 431.74 164.52 0.30 False
keep delay centre E2 0.4 R1-O2-welch 268 NaN 1319.90 556.44 450.0 523.00 316.06 0.30 False
keep delay end E1 0.4 R1-O2-welch 268 NaN 792.31 95.77 650.0 587.19 147.50 0.30 False
keep delay end E2 0.4 R1-O2-welch 268 NaN 1519.90 556.44 650.0 717.00 325.13 0.30 False
keep delay centre E1 0.4 R2-O1-student 293 NaN 725.00 116.37 400.0 383.77 147.31 0.30 False
keep delay centre E2 0.4 R2-O1-student 293 NaN 1127.78 416.29 400.0 419.75 221.80 0.30 False
keep delay end E1 0.4 R2-O1-student 293 NaN 826.47 76.92 600.0 558.06 123.17 0.30 False
keep delay end E2 0.4 R2-O1-student 293 NaN 1327.78 416.29 600.0 617.75 225.99 0.30 False
keep delay centre E1 0.4 R2-O1-welch 290 NaN 733.00 85.80 400.0 371.84 144.67 0.30 False
keep delay centre E2 0.4 R2-O1-welch 290 NaN 1148.57 466.37 400.0 415.00 238.17 0.30 False
keep delay end E1 0.4 R2-O1-welch 290 NaN 850.00 41.83 600.0 554.12 119.62 0.30 False
keep delay end E2 0.4 R2-O1-welch 290 NaN 1348.57 466.37 600.0 615.00 238.17 0.30 False
keep delay centre E1 0.4 R2-O2-student 272 NaN 685.53 142.77 400.0 425.27 159.22 0.30 False
keep delay centre E2 0.4 R2-O2-student 272 NaN 1356.42 591.11 400.0 495.00 273.59 0.30 False
keep delay end E1 0.4 R2-O2-student 272 NaN 761.76 118.23 600.0 589.70 119.15 0.30 False
keep delay end E2 0.4 R2-O2-student 272 NaN 1556.42 591.11 600.0 695.00 273.59 0.30 False
keep delay centre E1 0.4 R2-O2-welch 269 NaN 742.19 79.16 400.0 434.78 170.71 0.30 False
keep delay centre E2 0.4 R2-O2-welch 269 NaN 1386.06 516.81 400.0 502.51 301.74 0.30 False
keep delay end E1 0.4 R2-O2-welch 269 NaN 831.25 34.80 600.0 584.06 116.11 0.30 False
keep delay end E2 0.4 R2-O2-welch 269 NaN 1586.06 516.81 600.0 702.51 301.74 0.30 False
keep bin centre E1 0.4 R1-O1-student 293 NaN 726.92 46.47 400.0 373.80 116.35 0.30 False
keep bin centre E2 0.4 R1-O1-student 293 1200.0 1226.33 242.24 400.0 417.75 202.29 0.30 False
keep bin end E1 0.4 R1-O1-student 293 NaN 850.00 40.82 600.0 564.95 108.51 0.30 False
keep bin end E2 0.4 R1-O1-student 293 1400.0 1426.33 242.24 600.0 616.00 205.23 0.30 False
keep bin centre E1 0.4 R1-O1-welch 285 NaN 693.75 68.18 400.0 381.79 110.86 0.29 False
keep bin centre E2 0.4 R1-O1-welch 285 1200.0 1232.11 262.97 400.0 435.25 210.94 0.29 False
keep bin end E1 0.4 R1-O1-welch 285 NaN 821.43 36.42 600.0 568.23 111.37 0.29 False
keep bin end E2 0.4 R1-O1-welch 285 1400.0 1432.11 262.97 600.0 628.50 217.46 0.29 False
keep bin centre E1 0.4 R1-O2-student 272 NaN 700.00 86.60 500.0 434.20 150.08 0.29 False
keep bin centre E2 0.4 R1-O2-student 272 1250.0 1306.18 311.13 500.0 515.75 253.95 0.29 False
keep bin end E1 0.4 R1-O2-student 272 NaN 750.00 0.00 700.0 600.00 129.22 0.29 False
keep bin end E2 0.4 R1-O2-student 272 1450.0 1506.18 311.13 700.0 710.50 262.37 0.29 False
keep bin centre E1 0.4 R1-O2-welch 268 NaN 703.85 77.12 500.0 435.00 126.36 0.29 False
keep bin centre E2 0.4 R1-O2-welch 268 1300.0 1323.16 318.10 500.0 521.00 236.56 0.29 False
keep bin end E1 0.4 R1-O2-welch 268 NaN 800.00 61.24 700.0 615.24 137.64 0.29 False
keep bin end E2 0.4 R1-O2-welch 268 1500.0 1523.16 318.10 700.0 714.25 249.67 0.29 False
keep bin centre E1 0.4 R2-O1-student 293 NaN 700.00 86.60 400.0 379.84 109.61 0.29 False
keep bin centre E2 0.4 R2-O1-student 293 1200.0 1187.96 221.99 400.0 409.00 172.10 0.29 False
keep bin end E1 0.4 R2-O1-student 293 NaN 790.00 80.00 600.0 568.88 113.58 0.29 False
keep bin end E2 0.4 R2-O1-student 293 1400.0 1387.96 221.99 600.0 604.25 180.82 0.29 False
keep bin centre E1 0.4 R2-O1-welch 290 NaN 696.88 81.91 400.0 373.14 116.73 0.29 False
keep bin centre E2 0.4 R2-O1-welch 290 1200.0 1192.37 218.50 400.0 411.50 189.78 0.29 False
keep bin end E1 0.4 R2-O1-welch 290 NaN 808.33 73.12 600.0 559.24 121.23 0.29 False
keep bin end E2 0.4 R2-O1-welch 290 1400.0 1392.37 218.50 600.0 606.25 200.31 0.29 False
keep bin centre E1 0.4 R2-O2-student 272 NaN 680.77 143.50 500.0 412.08 130.72 0.29 False
keep bin centre E2 0.4 R2-O2-student 272 1250.0 1272.93 294.63 500.0 481.75 234.58 0.29 False
keep bin end E1 0.4 R2-O2-student 272 NaN 650.00 141.42 700.0 597.97 118.54 0.29 False
keep bin end E2 0.4 R2-O2-student 272 1450.0 1472.93 294.63 700.0 680.50 237.27 0.29 False
keep bin centre E1 0.4 R2-O2-welch 269 NaN 725.00 43.30 500.0 450.58 150.58 0.29 False
keep bin centre E2 0.4 R2-O2-welch 269 1300.0 1336.72 348.09 500.0 529.75 241.51 0.29 False
keep bin end E1 0.4 R2-O2-welch 269 NaN 850.00 0.00 700.0 612.10 125.23 0.29 False
keep bin end E2 0.4 R2-O2-welch 269 1500.0 1536.72 348.09 700.0 725.50 249.55 0.29 False
s2e = rec2.groupby(["trials_rule", "early_lick", "pref", "label", "search"]).apply(
lambda d: pd.Series({"combos": len(d), "holds": int(d.holds.sum()), "ipsi_ok": int(d.ipsi_ok.sum()), "contra_ok": int(d.contra_ok.sum()),
"bilateral_no_recovery": int(d.bilateral_no_recovery.sum()), "n_range": f"{d.n.min()}-{d.n.max()}",
"left1_ms": f"{d.left1.min():.0f}-{d.left1.max():.0f}", "left1_nan": int(d.left1.isna().sum()),
"right1_ms": f"{d.right1.min():.0f}-{d.right1.max():.0f}"})).reset_index()
s2e["outcome_here"] = np.where(s2e.holds > 0, "reproduced", "not")
print(s2e[s2e.trials_rule == "per condition"].drop(columns="trials_rule").to_string(index=False))
for rule in ("per condition", "per type"):
print(f"Outcomes over the method combinations, trials {rule}:", s2e[s2e.trials_rule == rule].outcome_here.value_counts().to_dict())
d1 = rec2[rec2.trials_rule == "per condition"]
print("\nN1: ipsilateral time", d1.left1.min(), "to", d1.left1.max(), "ms (no recovery in", int(d1.left1.isna().sum()), "of", len(d1),
"); contralateral", d1.right1.min(), "to", d1.right1.max(), "ms; bilateral below 80% up to the go cue in",
int(d1.bilateral_no_recovery.sum()), "of", len(d1))
print("Included neurons, N1:", d1.n.min(), "to", d1.n.max(), "; N2:", rec2[rec2.trials_rule == "per type"].n.min(), "to",
rec2[rec2.trials_rule == "per type"].n.max(), "; paper 143 (tolerance 14.3)")
early_lick pref label search combos holds ipsi_ok contra_ok bilateral_no_recovery n_range left1_ms left1_nan right1_ms outcome_here
drop bin centre E1 16 0 0 0 16 260-289 nan-nan 16 400-850 not
drop bin centre E2 16 0 0 0 16 260-289 1200-1200 0 400-850 not
drop bin end E1 16 0 0 0 16 260-289 nan-nan 16 500-700 not
drop bin end E2 16 0 0 0 16 260-289 1300-1400 0 500-1050 not
drop delay centre E1 16 0 0 0 16 260-289 nan-nan 16 500-900 not
drop delay centre E2 16 0 0 0 16 260-289 1000-1400 0 500-1100 not
drop delay end E1 16 0 0 0 16 260-289 nan-nan 16 600-850 not
drop delay end E2 16 0 0 0 16 260-289 1100-1600 0 600-1300 not
drop trial centre E1 16 0 0 0 16 260-289 nan-nan 16 500-750 not
drop trial centre E2 16 0 0 0 16 260-289 1200-1250 0 500-750 not
drop trial end E1 16 0 0 0 16 260-289 nan-nan 16 600-850 not
drop trial end E2 16 0 0 0 16 260-289 1350-1400 0 600-950 not
keep bin centre E1 16 0 0 0 16 268-293 nan-nan 16 350-500 not
keep bin centre E2 16 0 0 0 16 268-293 1200-1300 0 350-500 not
keep bin end E1 16 0 0 0 16 268-293 nan-nan 16 450-700 not
keep bin end E2 16 0 0 0 16 268-293 1300-1500 0 450-700 not
keep delay centre E1 16 0 0 0 16 268-293 nan-nan 16 350-450 not
keep delay centre E2 16 0 0 0 16 268-293 2300-2300 10 350-450 not
keep delay end E1 16 0 0 0 16 268-293 nan-nan 16 450-650 not
keep delay end E2 16 0 0 0 16 268-293 2400-2400 10 450-650 not
keep trial centre E1 16 0 0 15 16 268-293 nan-nan 16 200-400 not
keep trial centre E2 16 0 0 15 16 268-293 1250-1350 0 200-400 not
keep trial end E1 16 0 0 7 16 268-293 nan-nan 16 300-500 not
keep trial end E2 16 0 0 7 16 268-293 1350-1550 0 300-500 not
Outcomes over the method combinations, trials per condition: {'not': 24}
Outcomes over the method combinations, trials per type: {'not': 24}
N1: ipsilateral time 1000.0 to 2400.0 ms (no recovery in 212 of 384 ); contralateral 200.00000000000006 to 1300.0 ms; bilateral below 80% up to the go cue in 384 of 384
Included neurons, N1: 260 to 293 ; N2: 221 to 292 ; paper 143 (tolerance 14.3)
Result: not reproduced. Under all 24 combinations of the method details (K1, K2; D1 to D3; L1, L2; E1, E2), with trials per condition (N1), no reading puts both times within tolerance, so the outcome is the same under all and the answers leave it unchanged. With the search past the go cue (E2), ipsilateral selectivity reaches 80% of control 1000 to 2400 ms after offset, after the go cue, or not at all (20 of 192 readings); with the search ending at the go cue (E1) it never does. The paper gives 538 ms. Contralateral selectivity reaches 80% of control 200 to 1300 ms after offset (paper 192 ms), within tolerance under some readings. Bilateral selectivity stays below 80% of control up to the go cue under all 384 readings. 260 to 293 neurons are included with trials per condition (221 to 292 per condition and trial type), against the paper's 143.
fig2-recordings-recovery¶
After ipsilateral (one spot) photoinhibition spike rate (more than 90%) and selectivity (more than 80%) recovered within 600 ms; contralateral photoinhibition hardly affected activity; after bilateral photoinhibition spike rates recovered on average but selectivity did not.
Criterion: experiment 2, at 600 ms after photoinhibition offset (0.3 s before the go cue). Spike rate recovery (a) fewer than 10% of neurons with a significant change (convention R), (b) population mean rate at least 90% of control. Selectivity (convention D) at least 80% of control. Contralateral: fewer than 10% of neurons significant in every window during and after photoinhibition. Bilateral: rate recovered as in (a) or (b), and selectivity below 80% of control at the go cue. Reproduced when all hold under one combination of the claim's readings (R: W1, W2, X1, X2; D: bins and the S readings). The method details answered 2026-10-21 (K1, K2; D1 to D3; L1, L2) must give the same outcome; trials are counted per condition (N1). The search end (E) does not enter, as no recovery time is read.
R2 = {}
for early in ("drop", "keep"):
for X in ("X1", "X2"):
for c in OFF2:
R2[(early, X, c)] = L.rate_change_tests(e2, S, c, 0.4, early, min_rate=1 if X == "X1" else None, min_trials=3 if X == "X1" else None)
rate_rows = []
for (early, X, c), (P, info) in R2.items():
inc = info.included.values & ~np.isnan(P).all(1)
for lab in ("end", "centre"):
tl = L.labels(0.4, lab)
j = int(np.argmin(abs(tl - (-0.9 + 0.6))))
during_after = (tl >= -1.7 + 0.2) & (tl <= 0) if lab == "centre" else (tl >= -1.7 + 0.4) & (tl <= 0)
frac_t = np.nanmean(P[inc] < 0.01, axis=0)
rate_rows.append({"early_lick": early, "exclusion": X, "cond": c, "label": lab, "n": int(inc.sum()),
"frac_sig_600ms": frac_t[j], "max_frac_sig_during_after": frac_t[during_after].max()})
rr = pd.DataFrame(rate_rows)
# population mean rate at 600 ms after offset, photoinhibition over control (same windows)
pop_rows = []
for early in ("drop", "keep"):
for lab in ("end", "centre"):
tl = L.labels(0.4, lab); j = int(np.argmin(abs(tl - (-0.3))))
for c in OFF2:
num = den = 0.0
for u in e2.itertuples():
tr = S[u.sid]["trials"]; m = L.trial_mask(tr, early) & u.observed
k, p = m & (tr.cond == "control").values, m & (tr.cond == c).values
if k.sum() < 2 or p.sum() < 2:
continue
e = L.GRID_END[j]
num += L.counts_in(u.spikes, tr.go.values[p], e - 0.4, e).mean(); den += L.counts_in(u.spikes, tr.go.values[k], e - 0.4, e).mean()
pop_rows.append({"early_lick": early, "label": lab, "cond": c, "pop_rate_ratio_600ms": num / den})
pr = pd.DataFrame(pop_rows)
print(rr.round(3).to_string(index=False))
print(pr.round(3).to_string(index=False))
early_lick exclusion cond label n frac_sig_600ms max_frac_sig_during_after
drop X1 left1 end 299 0.084 0.639
drop X1 left1 centre 299 0.080 0.639
drop X1 right1 end 299 0.064 0.177
drop X1 right1 centre 299 0.043 0.177
drop X1 bilateral8 end 299 0.355 0.816
drop X1 bilateral8 centre 299 0.324 0.816
drop X2 left1 end 411 0.088 0.467
drop X2 left1 centre 411 0.083 0.467
drop X2 right1 end 411 0.071 0.153
drop X2 right1 centre 411 0.039 0.153
drop X2 bilateral8 end 411 0.314 0.630
drop X2 bilateral8 centre 411 0.290 0.630
keep X1 left1 end 296 0.095 0.645
keep X1 left1 centre 296 0.095 0.645
keep X1 right1 end 296 0.078 0.189
keep X1 right1 centre 296 0.078 0.189
keep X1 bilateral8 end 296 0.378 0.807
keep X1 bilateral8 centre 296 0.345 0.807
keep X2 left1 end 411 0.100 0.477
keep X2 left1 centre 411 0.100 0.477
keep X2 right1 end 411 0.083 0.158
keep X2 right1 centre 411 0.063 0.158
keep X2 bilateral8 end 411 0.333 0.628
keep X2 bilateral8 centre 411 0.314 0.628
early_lick label cond pop_rate_ratio_600ms
drop end left1 1.026
drop end right1 1.024
drop end bilateral8 1.196
drop centre left1 1.003
drop centre right1 1.011
drop centre bilateral8 1.164
keep end left1 1.054
keep end right1 1.063
keep end bilateral8 1.227
keep centre left1 1.037
keep centre right1 1.048
keep centre bilateral8 1.200
# selectivity ratio (photoinhibition over control) at 600 ms after offset and at the go cue
sel_rows = []
for early in ("drop", "keep"):
for key, (tl, cm) in courses2[early].items():
w, pw, pt, sk, lab = key
j600 = int(np.argmin(abs(tl - (-0.3)))); jgo = int(np.argmin(abs(tl - 0.0)))
sel_rows.append({"early_lick": early, "bin": w, "pref": pw, "trials_rule": "per type" if pt else "per condition", "S": sk, "label": lab,
"ipsi_sel_ratio_600ms": cm["left1"][j600] / cm["control"][j600],
"bilateral_sel_ratio_go": cm["bilateral8"][jgo] / cm["control"][jgo]})
sr = pd.DataFrame(sel_rows)
# rate parts: claim readings W (window label of convention R) and X; selectivity parts: claim readings B and S,
# method details K, D and L (the label of the selectivity bins), N1 deciding
rate_parts = []
for early in ("drop", "keep"):
for W in ("end", "centre"):
for X in ("X1", "X2"):
r = rr[(rr.early_lick == early) & (rr.label == W) & (rr.exclusion == X)].set_index("cond")
p = pr[(pr.early_lick == early) & (pr.label == W)].set_index("cond")
rate_parts.append({"early_lick": early, "W": W, "X": X,
"ipsi_rate": (r.loc["left1", "frac_sig_600ms"] < 0.10) or (p.loc["left1", "pop_rate_ratio_600ms"] >= 0.9),
"bilateral_rate": (r.loc["bilateral8", "frac_sig_600ms"] < 0.10) or (p.loc["bilateral8", "pop_rate_ratio_600ms"] >= 0.9),
"contra_hardly_affected": r.loc["right1", "max_frac_sig_during_after"] < 0.10})
rate_parts = pd.DataFrame(rate_parts)
print(rate_parts.to_string(index=False))
out = []
for rule in ("per condition", "per type"):
for (early, pw, lab), d in sr[sr.trials_rule == rule].groupby(["early_lick", "pref", "label"]):
rp = rate_parts[rate_parts.early_lick == early]
rates_all = (rp.ipsi_rate & rp.bilateral_rate & rp.contra_hardly_affected).any()
sel_ok = (d.ipsi_sel_ratio_600ms >= 0.8) & (d.bilateral_sel_ratio_go < 0.8)
parts = {"ipsi_rate": rp.ipsi_rate.any(), "bilateral_rate": rp.bilateral_rate.any(), "contra": rp.contra_hardly_affected.any(),
"ipsi_sel": (d.ipsi_sel_ratio_600ms >= 0.8).any(), "bilateral_sel": (d.bilateral_sel_ratio_go < 0.8).any()}
holds = bool(rates_all and sel_ok.any())
out.append({"trials_rule": rule, "early_lick": early, "pref": pw, "label": lab, **parts,
"ipsi_sel_ratio_600ms": f"{d.ipsi_sel_ratio_600ms.min():.2f}-{d.ipsi_sel_ratio_600ms.max():.2f}",
"bilateral_sel_ratio_go": f"{d.bilateral_sel_ratio_go.min():.2f}-{d.bilateral_sel_ratio_go.max():.2f}",
"outcome_here": "reproduced" if holds else "partially" if any(parts.values()) else "not"})
o2 = pd.DataFrame(out)
print(o2[o2.trials_rule == "per condition"].drop(columns="trials_rule").to_string(index=False))
for rule in ("per condition", "per type"):
print(f"Outcomes over the method combinations (K, D, L), trials {rule}:", o2[o2.trials_rule == rule].outcome_here.value_counts().to_dict())
s1 = sr[sr.trials_rule == "per condition"]
print("\nN1: ipsilateral selectivity ratio at 600 ms", s1.ipsi_sel_ratio_600ms.min().round(2), "to", s1.ipsi_sel_ratio_600ms.max().round(2),
"; bilateral selectivity ratio at the go cue", s1.bilateral_sel_ratio_go.min().round(2), "to", s1.bilateral_sel_ratio_go.max().round(2))
early_lick W X ipsi_rate bilateral_rate contra_hardly_affected
drop end X1 True True False
drop end X2 True True False
drop centre X1 True True False
drop centre X2 True True False
keep end X1 True True False
keep end X2 True True False
keep centre X1 True True False
keep centre X2 True True False
early_lick pref label ipsi_rate bilateral_rate contra ipsi_sel bilateral_sel ipsi_sel_ratio_600ms bilateral_sel_ratio_go outcome_here
drop bin centre True True False False True 0.62-0.70 0.28-0.29 partially
drop bin end True True False False True 0.53-0.67 0.23-0.30 partially
drop delay centre True True False False True 0.67-0.71 0.22-0.27 partially
drop delay end True True False False True 0.59-0.72 0.22-0.27 partially
drop trial centre True True False False True 0.57-0.62 0.24-0.27 partially
drop trial end True True False False True 0.50-0.60 0.22-0.27 partially
keep bin centre True True False False True 0.53-0.62 0.26-0.33 partially
keep bin end True True False False True 0.45-0.67 0.26-0.31 partially
keep delay centre True True False False True 0.62-0.65 0.26-0.28 partially
keep delay end True True False False True 0.50-0.63 0.25-0.28 partially
keep trial centre True True False False True 0.53-0.59 0.25-0.27 partially
keep trial end True True False False True 0.46-0.55 0.26-0.28 partially
Outcomes over the method combinations (K, D, L), trials per condition: {'partially': 12}
Outcomes over the method combinations (K, D, L), trials per type: {'partially': 12}
N1: ipsilateral selectivity ratio at 600 ms 0.45 to 0.72 ; bilateral selectivity ratio at the go cue 0.22 to 0.33
Result: partially reproduced. The outcome is the same under all 12 combinations of the method details now required (K1, K2; D1 to D3; L1, L2), with trials per condition. Spike rates recover: 600 ms after offset 8% to 10% of neurons differ from control after ipsilateral photoinhibition, and the population rate is 1.00 to 1.05 of control (1.16 to 1.23 after bilateral photoinhibition). Selectivity after bilateral photoinhibition stays low, 0.22 to 0.33 of control at the go cue. Two parts fail under every combination: ipsilateral selectivity at 600 ms is 0.45 to 0.72 of control, not 0.8 or more; and contralateral photoinhibition changes the rate of 15% to 19% of neurons in some window during or after the light, not fewer than 10%.
Activity space (convention A)¶
The claims on the coding direction use the sessions of the bilateral experiment with more than 5 neurons recorded simultaneously for more than 5 trials per condition (control, ipsilateral, contralateral, bilateral). Here the neurons are putative pyramidal (convention U), observed in every analysis trial, with the training set a random half (H1) or third (H2) of the correct control trials (the claims file's readings). The ipsilateral trials used to build modes 2 and 3 are split with the same fraction. One random split per session (seeded by the session) is used; the spread over 10 seeds is shown as a variant. Answered 2026-10-21: the paper states no selection beyond its rule, so the rule is followed as written, with trials counted per condition (T1) for the outcome and per condition and trial type (T2) as a variant, and the session and neuron counts are reported against the paper's 16 sessions with 6 to 20 neurons (mean 11). Lick-early trials are dropped (K1) or kept (K2), and the outcome must hold under both.
CONDS_A = ["control", "left1", "right1", "bilateral8"]
A = {}
t0 = time.time()
for per_type in (False, True):
for early in ("drop", "keep"):
sess = L.a_sessions(U, S, "exp2", CONDS_A, early, per_type)
for frac, hname in ((0.5, "H1"), (1 / 3, "H2")):
res = {}
for sid, uids in sess.items():
X, t = L.session_counts(U, S, sid, uids, early)
rng = np.random.default_rng(int(sid.replace("_", "")) % 2 ** 32)
res[sid] = L.activity_session(X, t, frac, CONDS_A, "left1", rng)
A[("per type" if per_type else "per condition", early, hname)] = res
print(f"convention A on {len(A)} readings in {time.time() - t0:.0f} s")
cnt = pd.DataFrame([{"trials_rule": k[0], "early_lick": k[1], "H": k[2], "sessions": len(v), "mice": len({s.split('_')[0] for s in v}),
"neurons_min": min(r["n_neurons"] for r in v.values()), "neurons_max": max(r["n_neurons"] for r in v.values()),
"neurons_mean": np.mean([r["n_neurons"] for r in v.values()])} for k, v in A.items()])
print(cnt.round(1).to_string(index=False))
print("trials_rule: per condition = T1 (decides), per type = T2 (variant). Paper: 16 sessions of 7 mice, 6-20 neurons (mean 11).")
def by_k(df, col, extra=()):
"""Whether `col` holds under some claim reading (H, and `extra`), per lick-early reading, trials per condition (T1)."""
d = df[df.trials_rule == "per condition"]
return d.groupby("early_lick")[col].any().to_dict()
convention A on 8 readings in 16 s
trials_rule early_lick H sessions mice neurons_min neurons_max neurons_mean
per condition drop H1 24 7 6 37 17.0
per condition drop H2 24 7 6 37 17.0
per condition keep H1 24 7 6 37 17.0
per condition keep H2 24 7 6 37 17.0
per type drop H1 19 7 7 25 15.6
per type drop H2 19 7 7 25 15.6
per type keep H1 23 7 6 28 16.1
per type keep H2 23 7 6 28 16.1
trials_rule: per condition = T1 (decides), per type = T2 (variant). Paper: 16 sessions of 7 mice, 6-20 neurons (mean 11).
cd-stable-over-epochs¶
The direction of the lick right minus lick left difference vector was stable over the sample and delay epochs (correlation 0.61 between late sample and late delay).
Criterion: late sample and late delay are the last 400 ms window of each epoch; Pearson correlation
of the two w vectors per session, mean over the sessions; reproduced when within the paper's s.e.m.
(0.56 to 0.66). Convention A says that w comes from correct control trials and that cd, the
average of w, uses a subset of them; which trials give the w whose correlation is reported is not
fixed. Both are run, all correct control trials and the training subset (H1 or H2) that builds cd,
and the outcome is the one both give, else methods_underspecified (asked as a question after the
first verification round).
rows = []
for k, v in A.items():
for which in ("all", "train"):
x = np.array([r[f"w_corr_{which}"] for r in v.values()])
rows.append({"trials_rule": k[0], "early_lick": k[1], "H": k[2], "w_trials": which, "sessions": len(x),
"mean": x.mean(), "sem": x.std(ddof=1) / np.sqrt(len(x)), "within": abs(x.mean() - 0.61) <= 0.05})
cs = pd.DataFrame(rows)
print(cs.round(3).to_string(index=False))
print("\nw_trials: all = every correct control trial, train = the training subset that builds cd; neither is fixed by the claims file.")
for which in ("all", "train"):
print(f"Within 0.56 to 0.66 under some H reading, T1, w from {which}, per K reading:", by_k(cs[cs.w_trials == which], "within"))
print("Per session, w from all correct control trials against the training subset (T1, K1, H1):")
v = A[("per condition", "drop", "H1")]
print(pd.DataFrame([{"sid": s, "neurons": r["n_neurons"], "w_corr_all": r["w_corr_all"], "w_corr_train": r["w_corr_train"]} for s, r in v.items()]).round(3).to_string(index=False))
trials_rule early_lick H w_trials sessions mean sem within
per condition drop H1 all 24 0.563 0.057 True
per condition drop H1 train 24 0.534 0.052 False
per condition drop H2 all 24 0.563 0.057 True
per condition drop H2 train 24 0.554 0.048 False
per condition keep H1 all 24 0.588 0.061 True
per condition keep H1 train 24 0.537 0.069 False
per condition keep H2 all 24 0.588 0.061 True
per condition keep H2 train 24 0.553 0.050 False
per type drop H1 all 19 0.559 0.065 False
per type drop H1 train 19 0.508 0.061 False
per type drop H2 all 19 0.559 0.065 False
per type drop H2 train 19 0.550 0.055 False
per type keep H1 all 23 0.580 0.063 True
per type keep H1 train 23 0.524 0.071 False
per type keep H2 all 23 0.580 0.063 True
per type keep H2 train 23 0.552 0.052 False
w_trials: all = every correct control trial, train = the training subset that builds cd; neither is fixed by the claims file.
Within 0.56 to 0.66 under some H reading, T1, w from all, per K reading: {'drop': True, 'keep': True}
Within 0.56 to 0.66 under some H reading, T1, w from train, per K reading: {'drop': False, 'keep': False}
Per session, w from all correct control trials against the training subset (T1, K1, H1):
sid neurons w_corr_all w_corr_train
255201_20141121 16 -0.095 0.062
255201_20141123 22 0.024 0.030
257637_20141222 19 0.419 0.352
257637_20141223 14 0.684 0.439
257637_20141224 14 0.802 0.704
257772_20141121 25 0.466 0.560
257772_20141123 10 0.948 0.804
258250_20141201 19 0.395 0.102
258250_20141203 13 0.651 0.703
258250_20141205 7 0.657 0.358
263808_20150121 37 0.734 0.710
263808_20150122 28 0.719 0.689
263808_20150123 9 0.185 0.569
263808_20150124 27 0.860 0.888
263808_20150125 13 0.444 0.394
263808_20150126 6 0.125 0.496
263810_20150121 22 0.623 0.622
263810_20150122 14 0.504 0.673
263810_20150123 11 0.792 0.535
263810_20150124 10 0.833 0.828
263810_20150125 15 0.925 0.872
263810_20150126 16 0.517 0.167
264411_20141222 20 0.736 0.780
264411_20141224 21 0.565 0.486
Result: blocked (methods_underspecified). With w from all correct control trials the mean correlation between late sample and late delay w is 0.563 (lick-early trials dropped) and 0.588 (kept) over 24 sessions, within 0.56 to 0.66. With w from the training subset that builds cd it is 0.534 (H1) or 0.554 (H2) dropped and 0.537 or 0.553 kept, below 0.56. The claims file does not say which trials give w, and the two readings give different outcomes, so the claim is blocked (the first round gave reproduced, from the first reading alone). Counting trials per trial type (T2, a variant) gives 0.559 (dropped) and 0.580 (kept) with all trials. The sessions follow the rule as written (T1, 24 sessions with 6 to 37 neurons, mean 17, against the paper's 16 with 6 to 20, mean 11).
fig3c-cd-recovery-roc¶
Along cd, trajectories recovered after ipsilateral photoinhibition (ROC 0.73 against 0.76 in control) and were little changed by contralateral photoinhibition (0.74), but were permanently altered by bilateral photoinhibition (0.58).
Criterion: convention A; ROC of cd'x between lick right and lick left trials in the last 400 ms of the delay, per session, mean over sessions. Reproduced when all four are within the paper's s.e.m. under H1 or H2; partially when control, ipsilateral and bilateral are and their order holds.
EXP3C = {"control": (0.76, 0.03), "left1": (0.73, 0.02), "right1": (0.74, 0.03), "bilateral8": (0.58, 0.03)}
rows = []
for k, v in A.items():
roc = pd.DataFrame([r["roc_go"] for r in v.values()])
row = {"trials_rule": k[0], "early_lick": k[1], "H": k[2], "sessions": len(roc)}
for c in CONDS_A:
row[c] = roc[c].mean(); row[c + "_sem"] = roc[c].sem()
row[c + "_ok"] = abs(roc[c].mean() - EXP3C[c][0]) <= EXP3C[c][1]
row["all_four"] = all(row[c + "_ok"] for c in CONDS_A)
row["partial"] = row["control_ok"] and row["left1_ok"] and row["bilateral8_ok"] and row["control"] >= row["left1"] > row["bilateral8"]
rows.append(row)
r3c = pd.DataFrame(rows)
print(r3c.round(3).to_string(index=False))
print("\nT1, per K reading: all four within", by_k(r3c, "all_four"), "; partial rule", by_k(r3c, "partial"))
# variant: spread over 10 random splits for one reading
k0 = ("per condition", "drop", "H1")
sp = []
for seed in range(10):
vals = []
for sid, uids in L.a_sessions(U, S, "exp2", CONDS_A, "drop", False).items():
X, t = L.session_counts(U, S, sid, uids, "drop")
r = L.activity_session(X, t, 0.5, CONDS_A, "left1", np.random.default_rng(1000 + seed + int(sid.replace("_", "")) % 2 ** 20))
vals.append(r["roc_go"])
sp.append(pd.DataFrame(vals).mean())
sp = pd.DataFrame(sp)
print("\nVariant, 10 random splits (per condition, lick-early dropped, H1): mean ROC per split, range")
print(sp.agg(["min", "max"]).round(3).to_string())
trials_rule early_lick H sessions control control_sem control_ok left1 left1_sem left1_ok right1 right1_sem right1_ok bilateral8 bilateral8_sem bilateral8_ok all_four partial
per condition drop H1 24 0.656 0.023 False 0.652 0.051 False 0.683 0.028 False 0.558 0.021 True False False
per condition drop H2 24 0.677 0.021 False 0.641 0.039 False 0.672 0.028 False 0.559 0.026 True False False
per condition keep H1 24 0.649 0.020 False 0.631 0.044 False 0.704 0.025 False 0.558 0.020 True False False
per condition keep H2 24 0.652 0.022 False 0.642 0.034 False 0.677 0.034 False 0.558 0.017 True False False
per type drop H1 19 0.652 0.027 False 0.661 0.044 False 0.687 0.035 False 0.577 0.020 True False False
per type drop H2 19 0.669 0.025 False 0.666 0.040 False 0.673 0.036 False 0.571 0.026 True False False
per type keep H1 23 0.652 0.021 False 0.619 0.044 False 0.701 0.026 False 0.561 0.020 True False False
per type keep H2 23 0.654 0.023 False 0.641 0.035 False 0.671 0.036 False 0.563 0.017 True False False
T1, per K reading: all four within {'drop': False, 'keep': False} ; partial rule {'drop': False, 'keep': False}
Variant, 10 random splits (per condition, lick-early dropped, H1): mean ROC per split, range
control left1 right1 bilateral8
min 0.641 0.652 0.665 0.542
max 0.686 0.719 0.726 0.567
Result: not reproduced. The bilateral value is within tolerance under every reading (0.558 to 0.559 with trials per condition), but the control ROC is 0.649 to 0.677, below the paper's 0.76 by more than its s.e.m., and the ipsilateral (0.631 to 0.652) and contralateral (0.672 to 0.704) values are also below theirs. The order holds: ipsilateral and contralateral are close to control, and bilateral is lowest. Over 10 random training splits the control mean ranges 0.641 to 0.686. The analysis uses 24 sessions with 6 to 37 neurons, where the paper used 16 with 6 to 20; the answer confirms the rule as written (T1) is the one to follow. The outcome is the same under K1 and K2.
ed8-roc-during-photoinhibition¶
During photoinhibition trajectory separation along cd fell to 0.54 (ipsilateral), 0.64 (contralateral) and 0.54 (bilateral), against 0.72 in control.
Criterion: convention A with cd'x in a window during photoinhibition: (a) the last 400 ms before the ramp, (b) the 400 ms window centred on the photostimulus, (c) the mean over the photostimulus. With 0.8 s of light from delay onset and a 0.2 s ramp, (a) and (b) are the same window (0.2 to 0.6 s after delay onset). Reproduced when all four are within tolerance under a reading.
EXP8 = {"control": (0.72, 0.02), "left1": (0.54, 0.03), "right1": (0.64, 0.03), "bilateral8": (0.54, 0.01)}
rows = []
for k, v in A.items():
for wname, key in (("a/b", "roc_light_ab"), ("c", "roc_light_c")):
roc = pd.DataFrame([r[key] for r in v.values()])
row = {"trials_rule": k[0], "early_lick": k[1], "H": k[2], "window": wname}
for c in CONDS_A:
row[c] = roc[c].mean(); row[c + "_ok"] = abs(roc[c].mean() - EXP8[c][0]) <= EXP8[c][1]
row["all_four"] = all(row[c + "_ok"] for c in CONDS_A)
rows.append(row)
r8 = pd.DataFrame(rows)
print(r8.round(3).to_string(index=False))
r8["n_within"] = r8[[c + "_ok" for c in CONDS_A]].sum(axis=1)
r8["all_below_control"] = (r8[["left1", "right1", "bilateral8"]].lt(r8.control, axis=0)).all(axis=1)
print("\nT1, per K reading: all four within", by_k(r8, "all_four"), "; most values within under a reading",
r8[r8.trials_rule == "per condition"].groupby("early_lick").n_within.max().to_dict(),
"; every perturbed value below control under every reading", r8[r8.trials_rule == "per condition"].groupby("early_lick").all_below_control.all().to_dict())
trials_rule early_lick H window control control_ok left1 left1_ok right1 right1_ok bilateral8 bilateral8_ok all_four
per condition drop H1 a/b 0.676 False 0.519 True 0.613 True 0.484 False False
per condition drop H1 c 0.685 False 0.546 True 0.626 True 0.535 True False
per condition drop H2 a/b 0.675 False 0.491 False 0.616 True 0.497 False False
per condition drop H2 c 0.684 False 0.576 False 0.628 True 0.548 True False
per condition keep H1 a/b 0.656 False 0.534 True 0.631 True 0.489 False False
per condition keep H1 c 0.663 False 0.578 False 0.637 True 0.529 False False
per condition keep H2 a/b 0.649 False 0.552 True 0.590 False 0.504 False False
per condition keep H2 c 0.657 False 0.578 False 0.594 False 0.530 False False
per type drop H1 a/b 0.662 False 0.521 True 0.629 True 0.485 False False
per type drop H1 c 0.668 False 0.556 True 0.632 True 0.523 False False
per type drop H2 a/b 0.652 False 0.509 False 0.631 True 0.497 False False
per type drop H2 c 0.659 False 0.567 True 0.631 True 0.537 True False
per type keep H1 a/b 0.651 False 0.531 True 0.643 True 0.492 False False
per type keep H1 c 0.658 False 0.570 False 0.649 True 0.525 False False
per type keep H2 a/b 0.644 False 0.564 True 0.601 False 0.507 False False
per type keep H2 c 0.651 False 0.586 False 0.605 False 0.525 False False
T1, per K reading: all four within {'drop': False, 'keep': False} ; most values within under a reading {'drop': 3, 'keep': 2} ; every perturbed value below control under every reading {'drop': True, 'keep': True}
Result: partially reproduced. During the light, separation along cd falls below control in every condition: control 0.649 to 0.685, ipsilateral 0.49 to 0.58, contralateral 0.59 to 0.64, bilateral 0.48 to 0.55 (trials per condition). Under reading (c) with lick-early trials dropped and H1, the ipsilateral (0.546), contralateral (0.626) and bilateral (0.535) values are within tolerance, but the control value is below 0.70 under every reading, so no reading has all four. With lick-early trials kept at most two are within (ipsilateral 0.534 and contralateral 0.631, window a/b, H1). Under K1 and K2 every perturbed value is below control under every reading, so the effect holds in part under both. The criterion defines no partial outcome; at least half of the four values hold under K1 (three) and K2 (two), so the outcome is partial by the rule given in the Summary.
cd-captures-selectivity¶
Projection on cd captured 65.6% of population selectivity and 36.4% of task-related activity variance over the sample and delay epochs; modes 1 to 5 together captured 98.5% of variance and 95.8% of selectivity.
Criterion: selectivity is the RMS of the trial-averaged lick right minus lick left rate over neurons and time in the sample and delay epochs; variance the RMS of the baseline-subtracted trial-averaged activity; captured fraction (a) RMS ratio or (b) its square; baseline (a) the pre-sample period (the 400 ms window before sample onset), (b) the mean over the trial. Reproduced when the cd values are within tolerance under a reading; the mode 1-5 values must hold for a full reproduction, else partial. Answered 2026-10-21 as not given by the paper: which trials give the trial-averaged activity, (v1) the correct control trials of the training set, from which cd and the modes are built, or (v2) all correct control trials; the outcome must hold under both, and under K1 and K2. Sessions follow convention A's rule (T1).
rows = []
for k, v in A.items():
for base in ("pre-sample", "trial mean"):
if base == "pre-sample":
res = [r for r in v.values() if r["captured"] is not None]
else:
res = []
for sid in v:
uids = L.a_sessions(U, S, "exp2", CONDS_A, k[1], k[0] == "per type")[sid]
X, t = L.session_counts(U, S, sid, uids, k[1])
rng = np.random.default_rng(int(sid.replace("_", "")) % 2 ** 32)
r_ = L.activity_session(X, t, 0.5 if k[2] == "H1" else 1 / 3, CONDS_A, "left1", rng, baseline="trial mean")
if r_["captured"] is not None:
res.append(r_)
for vname, key in (("v1 training", "captured"), ("v2 all correct", "captured_v2")):
cap = pd.DataFrame([r[key] for r in res])
for ratio in ("RMS", "squared"):
pw = 1 if ratio == "RMS" else 2
m = (cap ** pw).mean() * 100
rows.append({"trials_rule": k[0], "early_lick": k[1], "H": k[2], "trials": vname, "baseline": base, "ratio": ratio,
"sessions": len(cap), "sel_cd": m.sel_cd, "var_cd": m.var_cd, "sel_15": m.sel_15, "var_15": m.var_15})
cap = pd.DataFrame(rows)
cap["cd_ok"] = ((cap.sel_cd - 65.6).abs() <= 5.1) & ((cap.var_cd - 36.4).abs() <= 6.3)
cap["modes_ok"] = ((cap.var_15 - 98.5).abs() <= 0.5) & ((cap.sel_15 - 95.8).abs() <= 1.2)
cap["full"] = cap.cd_ok & cap.modes_ok
print(cap.round(1).to_string(index=False))
t1 = cap[cap.trials_rule == "per condition"]
print("\nT1, per K and v reading: cd values within under some reading, and with the mode values as well:")
print(t1.groupby(["early_lick", "trials"]).agg(cd_ok=("cd_ok", "any"), full=("full", "any"),
sel_cd=("sel_cd", lambda x: f"{x.min():.1f}-{x.max():.1f}"), var_cd=("var_cd", lambda x: f"{x.min():.1f}-{x.max():.1f}"),
sel_15=("sel_15", lambda x: f"{x.min():.1f}-{x.max():.1f}"), var_15=("var_15", lambda x: f"{x.min():.1f}-{x.max():.1f}")).to_string())
trials_rule early_lick H trials baseline ratio sessions sel_cd var_cd sel_15 var_15 cd_ok modes_ok full
per condition drop H1 v1 training pre-sample RMS 24 87.000000 59.099998 96.099998 97.800003 False False False
per condition drop H1 v1 training pre-sample squared 24 76.500000 37.500000 92.400002 95.699997 False False False
per condition drop H1 v2 all correct pre-sample RMS 24 85.800003 59.000000 95.699997 97.300003 False False False
per condition drop H1 v2 all correct pre-sample squared 24 74.400002 37.700001 91.599998 94.800003 False False False
per condition drop H1 v1 training trial mean RMS 24 87.000000 69.199997 96.900002 96.800003 False False False
per condition drop H1 v1 training trial mean squared 24 76.500000 49.599998 94.000000 93.699997 False False False
per condition drop H1 v2 all correct trial mean RMS 24 85.800003 68.199997 96.099998 96.500000 False False False
per condition drop H1 v2 all correct trial mean squared 24 74.400002 48.500000 92.500000 93.199997 False False False
per condition drop H2 v1 training pre-sample RMS 21 85.599998 60.200001 95.000000 97.099998 False False False
per condition drop H2 v1 training pre-sample squared 21 73.699997 38.400002 90.400002 94.300003 False False False
per condition drop H2 v2 all correct pre-sample RMS 21 80.699997 56.299999 94.000000 96.699997 False False False
per condition drop H2 v2 all correct pre-sample squared 21 66.199997 34.599998 88.599998 93.599998 True False False
per condition drop H2 v1 training trial mean RMS 21 85.599998 67.599998 96.099998 95.900002 False False False
per condition drop H2 v1 training trial mean squared 21 73.699997 47.299999 92.400002 92.000000 False False False
per condition drop H2 v2 all correct trial mean RMS 21 80.699997 63.700001 94.900002 95.599998 False False False
per condition drop H2 v2 all correct trial mean squared 21 66.199997 43.200001 90.199997 91.500000 False False False
per condition keep H1 v1 training pre-sample RMS 24 88.000000 65.300003 95.900002 97.900002 False False False
per condition keep H1 v1 training pre-sample squared 24 78.199997 44.799999 92.000000 95.900002 False False False
per condition keep H1 v2 all correct pre-sample RMS 24 85.500000 63.500000 95.500000 97.599998 False False False
per condition keep H1 v2 all correct pre-sample squared 24 74.500000 42.700001 91.400002 95.199997 False False False
per condition keep H1 v1 training trial mean RMS 24 88.000000 71.699997 96.599998 97.000000 False False False
per condition keep H1 v1 training trial mean squared 24 78.199997 53.099998 93.500000 94.099998 False False False
per condition keep H1 v2 all correct trial mean RMS 24 85.500000 70.199997 96.000000 96.699997 False False False
per condition keep H1 v2 all correct trial mean squared 24 74.500000 51.400002 92.199997 93.599998 False False False
per condition keep H2 v1 training pre-sample RMS 21 86.099998 61.400002 95.699997 97.599998 False False False
per condition keep H2 v1 training pre-sample squared 21 74.900002 41.099998 91.699997 95.300003 False False False
per condition keep H2 v2 all correct pre-sample RMS 21 80.699997 59.500000 94.900002 97.099998 False False False
per condition keep H2 v2 all correct pre-sample squared 21 67.599998 39.500000 90.199997 94.300003 True False False
per condition keep H2 v1 training trial mean RMS 21 86.099998 70.400002 96.099998 96.199997 False False False
per condition keep H2 v1 training trial mean squared 21 74.900002 51.799999 92.400002 92.599998 False False False
per condition keep H2 v2 all correct trial mean RMS 21 80.699997 67.099998 95.000000 96.099998 False False False
per condition keep H2 v2 all correct trial mean squared 21 67.599998 47.900002 90.400002 92.400002 False False False
per type drop H1 v1 training pre-sample RMS 19 86.699997 57.000000 95.900002 97.900002 False False False
per type drop H1 v1 training pre-sample squared 19 75.900002 35.099998 92.000000 95.900002 False False False
per type drop H1 v2 all correct pre-sample RMS 19 85.599998 57.299999 95.500000 97.500000 False False False
per type drop H1 v2 all correct pre-sample squared 19 74.199997 35.900002 91.300003 95.000000 False False False
per type drop H1 v1 training trial mean RMS 19 86.699997 67.500000 96.800003 96.900002 False False False
per type drop H1 v1 training trial mean squared 19 75.900002 47.400002 93.800003 93.900002 False False False
per type drop H1 v2 all correct trial mean RMS 19 85.599998 66.800003 95.900002 96.500000 False False False
per type drop H1 v2 all correct trial mean squared 19 74.199997 46.799999 92.099998 93.199997 False False False
per type drop H2 v1 training pre-sample RMS 17 86.000000 60.000000 95.099998 97.500000 False False False
per type drop H2 v1 training pre-sample squared 17 74.400002 38.500000 90.699997 95.000000 False False False
per type drop H2 v2 all correct pre-sample RMS 17 80.199997 55.500000 93.800003 96.800003 False False False
per type drop H2 v2 all correct pre-sample squared 17 65.699997 34.299999 88.300003 93.800003 True False False
per type drop H2 v1 training trial mean RMS 17 86.000000 67.400002 96.300003 96.300003 False False False
per type drop H2 v1 training trial mean squared 17 74.400002 47.299999 92.699997 92.800003 False False False
per type drop H2 v2 all correct trial mean RMS 17 80.199997 62.599998 94.800003 95.699997 False False False
per type drop H2 v2 all correct trial mean squared 17 65.699997 42.400002 90.099998 91.699997 True False False
per type keep H1 v1 training pre-sample RMS 23 87.699997 65.000000 95.800003 98.000000 False False False
per type keep H1 v1 training pre-sample squared 23 77.900002 44.500000 92.000000 96.000000 False False False
per type keep H1 v2 all correct pre-sample RMS 23 85.199997 63.299999 95.500000 97.699997 False False False
per type keep H1 v2 all correct pre-sample squared 23 74.000000 42.500000 91.400002 95.400002 False False False
per type keep H1 v1 training trial mean RMS 23 87.699997 71.199997 96.599998 97.000000 False False False
per type keep H1 v1 training trial mean squared 23 77.900002 52.500000 93.400002 94.199997 False False False
per type keep H1 v2 all correct trial mean RMS 23 85.199997 69.699997 95.900002 96.800003 False False False
per type keep H1 v2 all correct trial mean squared 23 74.000000 50.599998 92.199997 93.699997 False False False
per type keep H2 v1 training pre-sample RMS 20 85.900002 61.500000 95.900002 97.699997 False False False
per type keep H2 v1 training pre-sample squared 20 74.699997 41.299999 92.099998 95.500000 False False False
per type keep H2 v2 all correct pre-sample RMS 20 80.300003 59.200001 95.000000 97.199997 False False False
per type keep H2 v2 all correct pre-sample squared 20 67.099998 39.299999 90.300003 94.500000 True False False
per type keep H2 v1 training trial mean RMS 20 85.900002 70.199997 96.199997 96.400002 False False False
per type keep H2 v1 training trial mean squared 20 74.699997 51.700001 92.599998 92.900002 False False False
per type keep H2 v2 all correct trial mean RMS 20 80.300003 66.500000 95.000000 96.300003 False False False
per type keep H2 v2 all correct trial mean squared 20 67.099998 47.200001 90.400002 92.699997 False False False
T1, per K and v reading: cd values within under some reading, and with the mode values as well:
cd_ok full sel_cd var_cd sel_15 var_15
early_lick trials
drop v1 training False False 73.7-87.0 37.5-69.2 90.4-96.9 92.0-97.8
v2 all correct True False 66.2-85.8 34.6-68.2 88.6-96.1 91.5-97.3
keep v1 training False False 74.9-88.0 41.1-71.7 91.7-96.6 92.6-97.9
v2 all correct True False 67.6-85.5 39.5-70.2 90.2-96.0 92.4-97.6
Result: blocked (methods_underspecified). The answer gives no rule for which trials' average is decomposed, and the claims file now requires the outcome under both readings; they differ. Under v1 (the training trials, the reading run before the answer) cd captures 73.7% to 88.0% of the selectivity with trials per condition, outside 65.6 +/- 5.1 under every reading, so the claim is not reproduced. Under v2 (all correct control trials), with H2, squared ratios and the pre-sample baseline, cd captures 66.2% of the selectivity and 34.6% of the variance with lick-early trials dropped (67.6% and 39.5% kept), both within tolerance, while modes 1 to 5 capture 88.6% to 96.1% of the selectivity and 91.5% to 97.6% of the variance, outside 95.8 +/- 1.2 and 98.5 +/- 0.5, so v2 is partial. Under H1, v2 gives 74.4% or more of the selectivity. The captured fractions are measured on trial averages that include the trials used to build cd and the modes (all of them under v1, part of them under v2), so they are in-sample; the claims file names no held-out reading, and none is run.
fig3c-cd-predicts-movement and fig4-bilateral-cd-predicts-movement¶
Activity along cd predicts the upcoming movement trial by trial; deviations toward the lick right trajectory predict more lick right responses, and vice versa. (fig3c)
Even after bilateral photoinhibition destroys average selectivity, single-trial activity along cd predicts the upcoming movement. (fig4)
Criterion: for each session the decision boundary on the training control trials; for each held-out control and perturbation trial the distance of cd'x from the boundary in the last 400 ms before the go cue; trials pooled over sessions. Reproduced, for control and ipsilateral trials (fig3c) or for bilateral trials (fig4), when the fraction of trials whose lick falls on the side of the boundary is above 0.5 by a one-sided binomial test at p < 0.05, and lick right performance rises and lick left performance falls with distance (Spearman correlation over bins of 4 of the right sign). Bins hold at least one trial; bins with at least 5 trials are shown as a variant.
def predicts(trials, cond, min_bin=1):
d = trials[trials.cond == cond]
pred = (d.d > 0) == d.licked_right
k, n = int(pred.sum()), len(d)
pb = stats.binomtest(k, n, 0.5, alternative="greater").pvalue
d = d.assign(bin=np.floor(d.d / 4) * 4 + 2)
out = {"n": n, "frac_pred": k / n, "binom_p": pb}
for side, name in ((True, "right"), (False, "left")):
g = d[d.right == side].groupby("bin").hit.agg(["mean", "size"])
g = g[g["size"] >= min_bin]
rho = stats.spearmanr(g.index, g["mean"]) if len(g) > 2 else None
out[f"rho_{name}"] = rho.statistic if rho else np.nan; out[f"p_{name}"] = rho.pvalue if rho else np.nan
out[f"bins_{name}"] = len(g)
out["holds"] = (pb < 0.05) and out["rho_right"] > 0 and out["rho_left"] < 0
return out
rows = []
for k, v in A.items():
trials = pd.concat([r["trials"] for r in v.values()], ignore_index=True)
for c in CONDS_A:
for mb in (1, 5):
rows.append({"trials_rule": k[0], "early_lick": k[1], "H": k[2], "cond": c, "min_trials_per_bin": mb, **predicts(trials, c, mb)})
pm = pd.DataFrame(rows)
print(pm.round(4).to_string(index=False))
print("\nT1, minimum 1 trial per bin, per K reading: control and ipsilateral hold (fig3c)",
by_k(pm[(pm.min_trials_per_bin == 1)].groupby(["trials_rule", "early_lick", "H"]).apply(
lambda d: d[d.cond.isin(["control", "left1"])].holds.all()).rename("h").reset_index(), "h"),
"; bilateral holds (fig4)", by_k(pm[(pm.min_trials_per_bin == 1) & (pm.cond == "bilateral8")], "holds"))
trials_rule early_lick H cond min_trials_per_bin n frac_pred binom_p rho_right p_right bins_right rho_left p_left bins_left holds
per condition drop H1 control 1 1890 0.6862 0.0 0.7882 0.0040 11 -0.9772 0.0000 12 True
per condition drop H1 control 5 1890 0.6862 0.0 0.8667 0.0025 9 -0.9636 0.0000 10 True
per condition drop H1 left1 1 261 0.6628 0.0 0.3660 0.3726 8 -0.9531 0.0001 9 True
per condition drop H1 left1 5 261 0.6628 0.0 0.7714 0.0724 6 -1.0000 0.0000 4 True
per condition drop H1 right1 1 533 0.6717 0.0 0.9397 0.0000 12 -0.8493 0.0019 10 True
per condition drop H1 right1 5 533 0.6717 0.0 0.8286 0.0416 6 -0.9000 0.0374 5 True
per condition drop H1 bilateral8 1 926 0.6371 0.0 0.9878 0.0000 10 -0.9315 0.0000 11 True
per condition drop H1 bilateral8 5 926 0.6371 0.0 1.0000 0.0000 7 -0.9286 0.0025 7 True
per condition drop H2 control 1 2287 0.6891 0.0 0.9366 0.0000 12 -0.9876 0.0000 13 True
per condition drop H2 control 5 2287 0.6891 0.0 0.8667 0.0025 9 -0.9848 0.0000 10 True
per condition drop H2 left1 1 348 0.6810 0.0 0.2755 0.5091 8 -0.9789 0.0000 9 True
per condition drop H2 left1 5 348 0.6810 0.0 0.4000 0.5046 5 -0.9856 0.0003 6 True
per condition drop H2 right1 1 533 0.6435 0.0 0.9175 0.0001 11 -0.8651 0.0012 10 True
per condition drop H2 right1 5 533 0.6435 0.0 0.7500 0.0522 7 -0.6429 0.1194 7 True
per condition drop H2 bilateral8 1 926 0.6220 0.0 0.9633 0.0000 10 -0.9886 0.0000 11 True
per condition drop H2 bilateral8 5 926 0.6220 0.0 1.0000 0.0000 5 -1.0000 0.0000 7 True
per condition keep H1 control 1 2404 0.6722 0.0 0.6942 0.0085 13 -0.7624 0.0015 14 True
per condition keep H1 control 5 2404 0.6722 0.0 0.7212 0.0186 10 -1.0000 0.0000 9 True
per condition keep H1 left1 1 335 0.6657 0.0 0.9940 0.0000 8 -0.9661 0.0000 10 True
per condition keep H1 left1 5 335 0.6657 0.0 1.0000 0.0000 5 -0.9856 0.0003 6 True
per condition keep H1 right1 1 665 0.6842 0.0 0.8413 0.0003 13 -0.9750 0.0000 13 True
per condition keep H1 right1 5 665 0.6842 0.0 0.9286 0.0025 7 -0.9550 0.0008 7 True
per condition keep H1 bilateral8 1 1139 0.6049 0.0 0.8441 0.0011 11 -0.9771 0.0000 12 True
per condition keep H1 bilateral8 5 1139 0.6049 0.0 0.9643 0.0005 7 -0.9286 0.0025 7 True
per condition keep H2 control 1 2895 0.6729 0.0 0.8441 0.0006 12 -0.9613 0.0000 14 True
per condition keep H2 control 5 2895 0.6729 0.0 0.7833 0.0125 9 -0.9605 0.0000 10 True
per condition keep H2 left1 1 448 0.6339 0.0 0.5389 0.1681 8 -0.9847 0.0000 10 True
per condition keep H2 left1 5 448 0.6339 0.0 1.0000 0.0000 6 -0.9910 0.0000 7 True
per condition keep H2 right1 1 665 0.6782 0.0 0.8944 0.0001 12 -0.8950 0.0001 12 True
per condition keep H2 right1 5 665 0.6782 0.0 0.5357 0.2152 7 -0.7207 0.0676 7 True
per condition keep H2 bilateral8 1 1139 0.6216 0.0 0.9755 0.0000 10 -0.9788 0.0000 12 True
per condition keep H2 bilateral8 5 1139 0.6216 0.0 0.9643 0.0005 7 -0.9643 0.0005 7 True
per type drop H1 control 1 1598 0.6846 0.0 0.7790 0.0047 11 -0.9912 0.0000 12 True
per type drop H1 control 5 1598 0.6846 0.0 0.8500 0.0037 9 -0.9879 0.0000 10 True
per type drop H1 left1 1 228 0.6711 0.0 0.3660 0.3726 8 -0.9531 0.0001 9 True
per type drop H1 left1 5 228 0.6711 0.0 0.7714 0.0724 6 -1.0000 0.0000 4 True
per type drop H1 right1 1 462 0.6710 0.0 0.9212 0.0001 11 -0.8493 0.0019 10 True
per type drop H1 right1 5 462 0.6710 0.0 0.8286 0.0416 6 -0.8000 0.2000 4 True
per type drop H1 bilateral8 1 777 0.6152 0.0 0.9755 0.0000 10 -0.9452 0.0000 11 True
per type drop H1 bilateral8 5 777 0.6152 0.0 1.0000 0.0000 6 -0.9643 0.0005 7 True
per type drop H2 control 1 1935 0.6868 0.0 0.9366 0.0000 12 -0.9876 0.0000 13 True
per type drop H2 control 5 1935 0.6868 0.0 0.8667 0.0025 9 -0.9833 0.0000 9 True
per type drop H2 left1 1 303 0.6733 0.0 0.2755 0.5091 8 -0.9789 0.0000 9 True
per type drop H2 left1 5 303 0.6733 0.0 0.4000 0.5046 5 -0.9856 0.0003 6 True
per type drop H2 right1 1 462 0.6342 0.0 0.9019 0.0004 10 -0.8285 0.0058 9 True
per type drop H2 right1 5 462 0.6342 0.0 0.7857 0.0362 7 -0.6429 0.1194 7 True
per type drop H2 bilateral8 1 777 0.5997 0.0 0.9724 0.0000 10 -0.9794 0.0000 11 True
per type drop H2 bilateral8 5 777 0.5997 0.0 1.0000 0.0000 5 -0.9643 0.0005 7 True
per type keep H1 control 1 2311 0.6716 0.0 0.6777 0.0109 13 -0.7624 0.0015 14 True
per type keep H1 control 5 2311 0.6716 0.0 0.6848 0.0289 10 -1.0000 0.0000 9 True
per type keep H1 left1 1 327 0.6667 0.0 0.9940 0.0000 8 -0.9661 0.0000 10 True
per type keep H1 left1 5 327 0.6667 0.0 1.0000 0.0000 5 -0.9856 0.0003 6 True
per type keep H1 right1 1 642 0.6838 0.0 0.8413 0.0003 13 -0.9623 0.0000 13 True
per type keep H1 right1 5 642 0.6838 0.0 0.9286 0.0025 7 -0.8729 0.0103 7 True
per type keep H1 bilateral8 1 1096 0.5931 0.0 0.8441 0.0011 11 -0.9771 0.0000 12 True
per type keep H1 bilateral8 5 1096 0.5931 0.0 0.9643 0.0005 7 -0.9286 0.0025 7 True
per type keep H2 control 1 2786 0.6726 0.0 0.8441 0.0006 12 -0.9613 0.0000 14 True
per type keep H2 control 5 2786 0.6726 0.0 0.7833 0.0125 9 -0.9605 0.0000 10 True
per type keep H2 left1 1 437 0.6339 0.0 0.5389 0.1681 8 -0.9847 0.0000 10 True
per type keep H2 left1 5 437 0.6339 0.0 1.0000 0.0000 6 -0.9910 0.0000 7 True
per type keep H2 right1 1 642 0.6760 0.0 0.8944 0.0001 12 -0.8756 0.0002 12 True
per type keep H2 right1 5 642 0.6760 0.0 0.5357 0.2152 7 -0.6429 0.1194 7 True
per type keep H2 bilateral8 1 1096 0.6104 0.0 0.9755 0.0000 10 -0.9788 0.0000 12 True
per type keep H2 bilateral8 5 1096 0.6104 0.0 0.9643 0.0005 7 -0.9643 0.0005 7 True
T1, minimum 1 trial per bin, per K reading: control and ipsilateral hold (fig3c) {'drop': True, 'keep': True} ; bilateral holds (fig4) {'drop': True, 'keep': True}
Result: fig3c-cd-predicts-movement reproduced; fig4-bilateral-cd-predicts-movement reproduced. The side of the decision boundary predicts the lick in 67% to 69% of held-out control trials (1890 to 2895 trials) and 63% to 68% of ipsilateral trials (261 to 448), and in 59% to 64% of bilateral trials (777 to 1139); every binomial p is below 1e-6. Lick right performance rises with the distance from the boundary (Spearman rho +0.28 to +0.99 for control and ipsilateral trials, +0.84 to +1.00 for bilateral ones), and lick left performance falls (rho -0.76 to -1.00), under every reading, with bins of at least one or at least 5 trials. Both hold under K1 and K2 with the rule as written (T1), as the answers require.
fig3d-persistent-mode and fig3e-ramping-mode¶
A persistent mode, built to capture the sustained effect of ipsilateral perturbation, stays altered past movement onset but neither discriminates trial type nor predicts behaviour on control trials. (fig3d)
A ramping mode capturing most remaining variance shows non-selective ramping in the delay epoch, does not predict behaviour, and is resistant to unilateral and bilateral perturbation. (fig3e)
Criteria: mode 2 is the difference of mean response vectors, ipsilateral perturbed minus control lick right correct trials, at the go cue; mode 4 the first SVD eigenvector of the baseline-subtracted PSTH matrix (sample and delay epochs) made orthogonal to modes 1 to 3. fig3d is reproduced when the session mean ROC between lick right and lick left control trials is within 2 bootstrap s.e.m. of 0.5, the fraction predicted is not above 0.5 by the one-sided binomial test, and the ipsilateral minus control difference at the go cue is outside 2 s.e.m. of zero. fig3e is reproduced when the control projection rises over the delay (positive in the session mean), its ROC and fraction predicted fail the tests of fig3d, and the perturbed minus control difference at the go cue is within 2 bootstrap s.e.m. of zero for ipsilateral, contralateral and bilateral trials. Answered 2026-10-21: the ipsilateral trials that build modes 2 and 3 are split like the control trials, so projected ipsilateral trials are ones not used to build them, as done here. The sign of mode 4 is not given; readings (g1) the mode oriented to a positive weight sum, ramping judged by a positive change over the delay; (g2) each session's mode oriented so that the control projection at the go cue exceeds that at delay onset, ramping judged by the size of the change against 2 bootstrap s.e.m., with ROC and the go-cue differences following the orientation. The outcome must hold under both, and under K1 and K2 (T1). The bootstrap is over sessions (1000 resamples).
def boot_sem(x, n=1000, seed=0):
rng = np.random.default_rng(seed); x = np.asarray(x, float)
return np.std([rng.choice(x, len(x)).mean() for _ in range(n)])
rows = []
for k, v0 in A.items():
v = {sid: r for sid, r in v0.items() if r["m2"] is not None}
for mode in ("m2", "m4"):
roc = np.array([r[mode]["roc"] for r in v.values()])
k_ok = sum(r[mode]["n_correct_pred"] for r in v.values()); n_all = sum(r[mode]["n_pred"] for r in v.values())
row = {"trials_rule": k[0], "early_lick": k[1], "H": k[2], "mode": mode, "sessions": len(v), "dropped": len(v0) - len(v),
"roc": roc.mean(), "roc_2sem": 2 * boot_sem(roc),
"frac_pred": k_ok / n_all, "binom_p": stats.binomtest(k_ok, n_all, 0.5, alternative="greater").pvalue}
row["roc_near_half"] = abs(row["roc"] - 0.5) <= row["roc_2sem"]
for c in ("left1", "right1", "bilateral8"):
dg = np.array([r[mode]["diff_go"][c] for r in v.values()])
row[f"diff_{c}"] = dg.mean(); row[f"diff_{c}_2sem"] = 2 * boot_sem(dg)
rise = np.array([r[mode]["rise_delay"] for r in v.values()])
row["rise_delay"] = rise.mean(); row["rise_2sem"] = 2 * boot_sem(rise)
rows.append(row)
md = pd.DataFrame(rows)
print(md.round(3).to_string(index=False))
m2 = md[md["mode"] == "m2"].copy()
m2["holds_3d"] = m2.roc_near_half & (m2.binom_p >= 0.05) & (m2.diff_left1.abs() > m2.diff_left1_2sem)
m4 = md[md["mode"] == "m4"].copy()
m4["holds_3e"] = (m4.rise_delay > 0) & m4.roc_near_half & (m4.binom_p >= 0.05) & \
np.all([m4[f"diff_{c}"].abs() <= m4[f"diff_{c}_2sem"] for c in ("left1", "right1", "bilateral8")], axis=0)
print("\nfig3d:"); print(m2[["trials_rule", "early_lick", "H", "roc", "roc_2sem", "frac_pred", "binom_p", "diff_left1", "diff_left1_2sem", "holds_3d"]].round(3).to_string(index=False))
print("\nfig3e:"); print(m4[["trials_rule", "early_lick", "H", "rise_delay", "rise_2sem", "roc", "roc_2sem", "frac_pred", "binom_p",
"diff_left1", "diff_left1_2sem", "diff_right1", "diff_right1_2sem", "diff_bilateral8", "diff_bilateral8_2sem", "holds_3e"]].round(3).to_string(index=False))
# Reading g2 for mode 4: per session, the mode oriented so that the control projection rises from delay onset to the go
# cue; ramping judged by the size of that change against 2 bootstrap s.e.m. ROC, the go-cue differences and the
# predictions follow the orientation (ROC becomes 1 - ROC and differences change sign where the mode is flipped; the
# fraction predicted does not depend on the sign).
rows = []
for k, v0 in A.items():
v = {sid: r for sid, r in v0.items() if r["m4"] is not None}
sgn = np.array([1.0 if r["m4"]["rise_delay"] >= 0 else -1.0 for r in v.values()])
rise = np.array([abs(r["m4"]["rise_delay"]) for r in v.values()])
roc = np.array([r["m4"]["roc"] if s > 0 else 1 - r["m4"]["roc"] for s, r in zip(sgn, v.values())])
row = {"trials_rule": k[0], "early_lick": k[1], "H": k[2], "sessions": len(v), "flipped": int((sgn < 0).sum()),
"rise_delay": rise.mean(), "rise_2sem": 2 * boot_sem(rise), "roc": roc.mean(), "roc_2sem": 2 * boot_sem(roc)}
for c in ("left1", "right1", "bilateral8"):
dg = sgn * np.array([r["m4"]["diff_go"][c] for r in v.values()])
row[f"diff_{c}"] = dg.mean(); row[f"diff_{c}_2sem"] = 2 * boot_sem(dg)
row["frac_pred"] = m4.set_index(["trials_rule", "early_lick", "H"]).loc[k, "frac_pred"]
row["binom_p"] = m4.set_index(["trials_rule", "early_lick", "H"]).loc[k, "binom_p"]
rows.append(row)
m4g2 = pd.DataFrame(rows)
m4g2["ramps"] = m4g2.rise_delay > m4g2.rise_2sem
m4g2["roc_near_half"] = (m4g2.roc - 0.5).abs() <= m4g2.roc_2sem
m4g2["holds_3e"] = m4g2.ramps & m4g2.roc_near_half & (m4g2.binom_p >= 0.05) & \
np.all([m4g2[f"diff_{c}"].abs() <= m4g2[f"diff_{c}_2sem"] for c in ("left1", "right1", "bilateral8")], axis=0)
print("\nfig3e, reading g2:"); print(m4g2.round(3).to_string(index=False))
print("\nT1, per K reading: fig3d holds", by_k(m2, "holds_3d"), "; fig3e holds under g1", by_k(m4, "holds_3e"), "and under g2", by_k(m4g2, "holds_3e"))
print("fig3e parts, T1: predicts above chance (binomial p < 0.05) under every reading",
bool((m4[m4.trials_rule == "per condition"].binom_p < 0.05).all()), "; g1 rise positive", by_k(m4.assign(r=m4.rise_delay > 0), "r"),
"; g2 ramps beyond 2 s.e.m.", by_k(m4g2, "ramps"))
# Per-session ROC of modes 2 and 4 on held-out control trials (verifier's request), T1, with |ROC - 0.5|.
# Mode 4 is shown as oriented by g1 (positive weight sum); under g2 a flipped session has 1 - ROC, and
# |ROC - 0.5| is the same.
ps = []
for k, v0 in A.items():
if k[0] != "per condition":
continue
for sid, r in v0.items():
if r["m2"] is None:
continue
ps.append({"early_lick": k[1], "H": k[2], "sid": sid, "neurons": r["n_neurons"], "roc_m2": r["m2"]["roc"], "roc_m4": r["m4"]["roc"]})
ps = pd.DataFrame(ps)
ps["abs_m2"] = (ps.roc_m2 - 0.5).abs(); ps["abs_m4"] = (ps.roc_m4 - 0.5).abs()
print(ps.pivot(index="sid", columns=["early_lick", "H"], values=["roc_m2", "roc_m4"]).round(3).to_string())
print("\nMean |ROC - 0.5| over sessions, with 2 bootstrap s.e.m.; for reference the cd ROC at the go cue on the same sessions:")
for (e_, h_), d in ps.groupby(["early_lick", "H"]):
cd_roc = np.array([r["roc_go"]["control"] for s_, r in A[("per condition", e_, h_)].items() if s_ in set(d.sid)])
print(f" {e_}, {h_}: mode 2 {d.abs_m2.mean():.3f} (2 s.e.m. {2 * boot_sem(d.abs_m2):.3f}); mode 4 {d.abs_m4.mean():.3f} "
f"(2 s.e.m. {2 * boot_sem(d.abs_m4):.3f}); cd |ROC - 0.5| {np.mean(np.abs(cd_roc - 0.5)):.3f}; sessions {len(d)}")
trials_rule early_lick H mode sessions dropped roc roc_2sem frac_pred binom_p roc_near_half diff_left1 diff_left1_2sem diff_right1 diff_right1_2sem diff_bilateral8 diff_bilateral8_2sem rise_delay rise_2sem
per condition drop H1 m2 24 0 0.474 0.057 0.617 0.0 True 1.260 0.568 0.442 0.457 1.498 0.921 -1.527 1.120
per condition drop H1 m4 24 0 0.493 0.042 0.549 0.0 True -0.221 0.284 -0.020 0.386 0.240 0.722 -0.373 0.789
per condition drop H2 m2 21 3 0.408 0.043 0.615 0.0 False 1.077 0.614 0.620 0.513 1.696 0.859 -1.020 1.408
per condition drop H2 m4 21 3 0.485 0.053 0.563 0.0 True -0.044 0.284 0.192 0.380 0.615 0.668 0.112 0.834
per condition keep H1 m2 24 0 0.430 0.041 0.610 0.0 False 1.754 0.656 0.673 0.648 2.051 0.841 -1.269 1.115
per condition keep H1 m4 24 0 0.506 0.031 0.550 0.0 True 0.106 0.316 0.344 0.400 0.439 0.642 -0.006 0.814
per condition keep H2 m2 21 3 0.470 0.050 0.590 0.0 True 1.222 0.604 0.736 0.542 1.512 0.911 -1.190 1.238
per condition keep H2 m4 21 3 0.450 0.040 0.582 0.0 False 0.202 0.279 -0.060 0.357 -0.073 0.628 -0.730 0.651
per type drop H1 m2 19 0 0.465 0.067 0.618 0.0 True 1.238 0.610 0.333 0.459 1.255 1.035 -1.401 1.360
per type drop H1 m4 19 0 0.489 0.047 0.551 0.0 True -0.353 0.294 0.013 0.460 0.240 0.773 -0.171 0.966
per type drop H2 m2 17 2 0.406 0.047 0.613 0.0 False 1.113 0.541 0.351 0.444 1.775 0.973 -0.877 1.635
per type drop H2 m4 17 2 0.467 0.055 0.556 0.0 True -0.058 0.356 0.179 0.450 0.611 0.752 0.079 0.808
per type keep H1 m2 23 0 0.424 0.042 0.610 0.0 False 1.681 0.683 0.480 0.523 1.874 0.808 -1.182 1.159
per type keep H1 m4 23 0 0.507 0.032 0.551 0.0 True 0.084 0.327 0.325 0.420 0.388 0.658 0.055 0.851
per type keep H2 m2 20 3 0.468 0.052 0.589 0.0 True 1.161 0.605 0.541 0.394 1.317 0.878 -1.114 1.278
per type keep H2 m4 20 3 0.452 0.041 0.579 0.0 False 0.191 0.287 -0.096 0.376 -0.152 0.639 -0.696 0.676
fig3d:
trials_rule early_lick H roc roc_2sem frac_pred binom_p diff_left1 diff_left1_2sem holds_3d
per condition drop H1 0.474 0.057 0.617 0.0 1.260 0.568 False
per condition drop H2 0.408 0.043 0.615 0.0 1.077 0.614 False
per condition keep H1 0.430 0.041 0.610 0.0 1.754 0.656 False
per condition keep H2 0.470 0.050 0.590 0.0 1.222 0.604 False
per type drop H1 0.465 0.067 0.618 0.0 1.238 0.610 False
per type drop H2 0.406 0.047 0.613 0.0 1.113 0.541 False
per type keep H1 0.424 0.042 0.610 0.0 1.681 0.683 False
per type keep H2 0.468 0.052 0.589 0.0 1.161 0.605 False
fig3e:
trials_rule early_lick H rise_delay rise_2sem roc roc_2sem frac_pred binom_p diff_left1 diff_left1_2sem diff_right1 diff_right1_2sem diff_bilateral8 diff_bilateral8_2sem holds_3e
per condition drop H1 -0.373 0.789 0.493 0.042 0.549 0.0 -0.221 0.284 -0.020 0.386 0.240 0.722 False
per condition drop H2 0.112 0.834 0.485 0.053 0.563 0.0 -0.044 0.284 0.192 0.380 0.615 0.668 False
per condition keep H1 -0.006 0.814 0.506 0.031 0.550 0.0 0.106 0.316 0.344 0.400 0.439 0.642 False
per condition keep H2 -0.730 0.651 0.450 0.040 0.582 0.0 0.202 0.279 -0.060 0.357 -0.073 0.628 False
per type drop H1 -0.171 0.966 0.489 0.047 0.551 0.0 -0.353 0.294 0.013 0.460 0.240 0.773 False
per type drop H2 0.079 0.808 0.467 0.055 0.556 0.0 -0.058 0.356 0.179 0.450 0.611 0.752 False
per type keep H1 0.055 0.851 0.507 0.032 0.551 0.0 0.084 0.327 0.325 0.420 0.388 0.658 False
per type keep H2 -0.696 0.676 0.452 0.041 0.579 0.0 0.191 0.287 -0.096 0.376 -0.152 0.639 False
fig3e, reading g2:
trials_rule early_lick H sessions flipped rise_delay rise_2sem roc roc_2sem diff_left1 diff_left1_2sem diff_right1 diff_right1_2sem diff_bilateral8 diff_bilateral8_2sem frac_pred binom_p ramps roc_near_half holds_3e
per condition drop H1 24 13 1.555 0.473 0.472 0.042 0.017 0.284 0.241 0.352 -0.010 0.696 0.549 0.0 True True False
per condition drop H2 21 12 1.507 0.476 0.490 0.054 0.050 0.291 0.093 0.372 0.254 0.689 0.563 0.0 True True False
per condition keep H1 24 13 1.511 0.528 0.504 0.032 -0.193 0.315 0.062 0.426 -0.144 0.652 0.550 0.0 True True False
per condition keep H2 21 15 1.255 0.510 0.533 0.044 -0.108 0.275 0.018 0.344 0.107 0.623 0.582 0.0 True True False
per type drop H1 19 10 1.564 0.561 0.473 0.047 0.156 0.343 0.320 0.420 0.378 0.732 0.551 0.0 True True False
per type drop H2 17 9 1.420 0.460 0.495 0.058 0.039 0.348 0.196 0.431 0.590 0.750 0.556 0.0 True True False
per type keep H1 23 12 1.516 0.550 0.503 0.033 -0.175 0.324 0.098 0.448 -0.079 0.678 0.551 0.0 True True False
per type keep H2 20 14 1.248 0.502 0.530 0.045 -0.093 0.307 0.052 0.367 0.187 0.641 0.579 0.0 True True False
T1, per K reading: fig3d holds {'drop': False, 'keep': False} ; fig3e holds under g1 {'drop': False, 'keep': False} and under g2 {'drop': False, 'keep': False}
fig3e parts, T1: predicts above chance (binomial p < 0.05) under every reading True ; g1 rise positive {'drop': True, 'keep': False} ; g2 ramps beyond 2 s.e.m. {'drop': True, 'keep': True}
roc_m2 roc_m4
early_lick drop keep drop keep
H H1 H2 H1 H2 H1 H2 H1 H2
sid
255201_20141121 0.424 0.373 0.371 0.406 0.413 0.502 0.538 0.441
255201_20141123 0.393 0.321 0.650 0.197 0.307 0.365 0.413 0.446
257637_20141222 0.540 NaN 0.534 0.547 0.485 NaN 0.488 0.443
257637_20141223 0.420 0.429 0.493 0.441 0.646 0.393 0.453 0.383
257637_20141224 0.826 0.291 0.275 0.730 0.467 0.464 0.419 0.518
257772_20141121 0.320 0.233 0.414 0.301 0.620 0.356 0.654 0.303
257772_20141123 0.716 0.290 0.331 0.437 0.369 0.324 0.549 0.652
258250_20141201 0.440 0.426 0.419 0.528 0.560 0.439 0.515 0.420
258250_20141203 0.439 0.603 0.357 0.351 0.402 0.488 0.533 0.537
258250_20141205 0.331 0.391 0.331 0.623 0.423 0.500 0.346 0.357
263808_20150121 0.543 0.422 0.557 0.493 0.421 0.383 0.490 0.409
263808_20150122 0.370 0.416 0.251 NaN 0.632 0.692 0.608 NaN
263808_20150123 0.644 0.519 0.506 0.528 0.506 0.337 0.487 0.480
263808_20150124 0.770 NaN 0.385 0.612 0.380 NaN 0.590 0.531
263808_20150125 0.352 0.245 0.466 0.509 0.551 0.562 0.576 0.415
263808_20150126 0.509 0.585 0.460 0.434 0.556 0.615 0.449 0.358
263810_20150121 0.387 0.332 0.412 0.364 0.676 0.733 0.592 0.308
263810_20150122 0.353 NaN 0.320 NaN 0.621 NaN 0.387 NaN
263810_20150123 0.592 0.549 0.554 NaN 0.493 0.418 0.502 NaN
263810_20150124 0.579 0.494 0.572 0.487 0.380 0.419 0.409 0.559
263810_20150125 0.343 0.336 0.340 0.347 0.460 0.399 0.559 0.548
263810_20150126 0.264 0.431 0.362 0.471 0.359 0.480 0.610 0.328
264411_20141222 0.399 0.392 0.399 0.550 0.618 0.621 0.518 0.524
264411_20141224 0.427 0.495 0.560 0.507 0.494 0.699 0.462 0.497
Mean |ROC - 0.5| over sessions, with 2 bootstrap s.e.m.; for reference the cd ROC at the go cue on the same sessions:
drop, H1: mode 2 0.127 (2 s.e.m. 0.031); mode 4 0.089 (2 s.e.m. 0.021); cd |ROC - 0.5| 0.164; sessions 24
drop, H2: mode 2 0.116 (2 s.e.m. 0.032); mode 4 0.103 (2 s.e.m. 0.028); cd |ROC - 0.5| 0.181; sessions 21
keep, H1: mode 2 0.106 (2 s.e.m. 0.026); mode 4 0.064 (2 s.e.m. 0.017); cd |ROC - 0.5| 0.154; sessions 24
keep, H2: mode 2 0.091 (2 s.e.m. 0.033); mode 4 0.085 (2 s.e.m. 0.025); cd |ROC - 0.5| 0.169; sessions 21
Result: fig3d-persistent-mode not reproduced; fig3e-ramping-mode not reproduced. The answer confirmed the split of the ipsilateral trials used here, and both outcomes are the same under K1 and K2, and for fig3e under g1 and g2. The persistent mode is altered by ipsilateral photoinhibition up to the go cue (difference 1.08 to 1.75, more than its 2 s.e.m. of 0.57 to 0.66), but it predicts the lick on control trials above chance (59% to 62% of trials, binomial p below 1e-6) under every reading, and under two of four readings with trials per condition its ROC (0.408, 0.430) is further than 2 s.e.m. from 0.5. The ramping mode is resistant to all three perturbations under the rule as written (T1): the differences are within 2 s.e.m. under every reading and either orientation. Under the T2 variant with lick-early trials dropped, H1 and g1, the ipsilateral difference (-0.353) is beyond its 2 s.e.m. (0.294). Under g1 its change over the delay is -0.73 to +0.11, positive under one of four readings, and its ROC is near 0.5 under three of four; under g2 the change is 1.26 to 1.56 against 2 s.e.m. of 0.47 to 0.53, so it ramps, and its ROC is near 0.5 under all four. Under both it predicts the lick in 55% to 58% of control trials, above chance (p below 1e-6), so it fails the claim.
Per session (T1), the mean of |ROC - 0.5| on held-out control trials is 0.091 to 0.127 for the persistent mode and 0.064 to 0.103 for the ramping mode, against 0.154 to 0.181 for cd on the same sessions. A session-mean ROC near 0.5 therefore partly reflects separation of opposite sign in different sessions; the binomial test of the fraction predicted, which does not depend on the sign, fails both claims under every reading.
ed6b-session-bias-predicted¶
In each session the behavioural bias after bilateral photoinhibition followed the side of the control trajectory that the perturbed cd trajectory ended closer to.
Criterion: per session with bilateral photoinhibition, the mean cd'x of bilateral trials at the go cue relative to the decision boundary (convention A), and the behavioural bias of ed6a-bilateral-inconsistent-bias; reproduced when the signs agree in a majority of sessions, above chance by a one-sided binomial test at p < 0.05.
rows = []
for k, v in A.items():
agree = []
for sid, r in v.items():
tb = r["trials"]; side = tb[tb.cond == "bilateral8"].d.mean()
agree.append({"sid": sid, "side": side, "bias": BIAS.loc[sid, "bias"], "agree": np.sign(side) == np.sign(BIAS.loc[sid, "bias"])})
ag = pd.DataFrame(agree)
kk = int(ag.agree.sum())
rows.append({"trials_rule": k[0], "early_lick": k[1], "H": k[2], "sessions": len(ag), "agree": kk,
"binom_p": stats.binomtest(kk, len(ag), 0.5, alternative="greater").pvalue})
b6b = pd.DataFrame(rows)
b6b["holds"] = (b6b.agree > b6b.sessions / 2) & (b6b.binom_p < 0.05)
print(b6b.round(4).to_string(index=False))
print("T1, per K reading:", by_k(b6b, "holds"))
print("\nPer session, one reading (per condition, lick-early dropped, H1):")
print(pd.DataFrame([{"sid": s, "side": r["trials"][r["trials"].cond == "bilateral8"].d.mean(),
"bias": BIAS.loc[s, "bias"]} for s, r in A[("per condition", "drop", "H1")].items()]).round(3).to_string(index=False))
trials_rule early_lick H sessions agree binom_p holds
per condition drop H1 24 15 0.1537 False
per condition drop H2 24 15 0.1537 False
per condition keep H1 24 13 0.4194 False
per condition keep H2 24 14 0.2706 False
per type drop H1 19 12 0.1796 False
per type drop H2 19 11 0.3238 False
per type keep H1 23 12 0.5000 False
per type keep H2 23 13 0.3388 False
T1, per K reading: {'drop': False, 'keep': False}
Per session, one reading (per condition, lick-early dropped, H1):
sid side bias
255201_20141121 3.698 0.448
255201_20141123 1.290 0.676
257637_20141222 1.653 0.878
257637_20141223 -0.275 0.674
257637_20141224 -0.545 0.728
257772_20141121 -6.042 -0.121
257772_20141123 -2.655 0.320
258250_20141201 -1.684 -0.491
258250_20141203 0.653 0.400
258250_20141205 -1.096 0.244
263808_20150121 -5.614 -0.714
263808_20150122 -8.646 -0.557
263808_20150123 -0.196 0.037
263808_20150124 -1.348 -0.062
263808_20150125 -0.480 0.077
263808_20150126 -1.087 0.160
263810_20150121 0.730 0.037
263810_20150122 1.168 0.081
263810_20150123 2.957 0.265
263810_20150124 -1.430 -0.118
263810_20150125 -2.971 0.511
263810_20150126 -3.977 -0.511
264411_20141222 -0.842 0.420
264411_20141224 -0.747 -0.529
Result: not reproduced. The side of the boundary at which the bilateral trials end agrees in sign with the behavioural bias in 11 to 15 of 19 to 24 sessions, not above chance (one-sided binomial p 0.15 to 0.50) under any reading. The legend's five example sessions are not identified here. With the rule as written (T1) it is 13 to 15 of 24 sessions (p 0.15 to 0.42), not above chance under K1 or K2, so the answers leave the outcome unchanged.
ed9f-reaction-time¶
Reaction times were faster on trials whose cd trajectory was far from the decision boundary at the go cue.
Criterion: convention A; reaction time is the first lick after the go cue, relative to the session
mean; distance is the absolute distance of cd'x from the boundary at the go cue; lick right and lick
left trials pooled; readings (a) control trials, (b) all trials. Reproduced when the Spearman
correlation between distance and reaction time is negative with p < 0.05. Answered 2026-10-21: the
paper does not say how a lick is detected; the files hold no lick times, only lick_trace, an
analogue signal ("the animal's tongue movement when licking") in 5 s chunks at 10 kHz. The outcome
stands only if it is the same over the thresholds tried, else methods_underspecified. The
thresholds tried here, all choices over a range: the raw signal rising above 0.10, 0.12 or 0.14
(level), above the pre-go baseline mean plus 0.01, 0.02 or 0.05 (rise), and above the baseline mean
plus 3, 5, 10 or 20 baseline standard deviations (sd). The baseline is the 300 ms before the go cue,
and the lick is searched up to 1.4 s after it (the chunk ends 1.43 s after the go cue in most
trials). Projected trials are the held-out trials of convention A; a trial without a detected lick
under a rule leaves that rule's test.
# lick_trace windows around the go cue for every trial of the convention A sessions
t0 = time.time()
RULES = {"level 0.10": ("level", 0.10), "level 0.12": ("level", 0.12), "level 0.14": ("level", 0.14),
"level 0.16": ("level", 0.16), "level 0.20": ("level", 0.20), "level 0.25": ("level", 0.25),
"rise 0.01": ("rise", 0.01), "rise 0.02": ("rise", 0.02), "rise 0.05": ("rise", 0.05),
"sd 3": ("sd", 3), "sd 5": ("sd", 5), "sd 10": ("sd", 10), "sd 20": ("sd", 20)}
LK, lk_rows = {}, []
for sid in sorted(set().union(*[set(v) for v in A.values()])):
s = S[sid]; tr = s["trials"]
aid = assets[assets.path == s["path"]].asset_id.iloc[0]
df, info = L.lick_onsets(aid, tr.go.values, RULES)
df["go"] = tr.go.values; df["outcome"] = tr.outcome.values; df["early_lick"] = tr.early_lick.values
LK[sid] = df
h = df[df.read & (df.outcome == "hit") & ~df.early_lick]
lk_rows.append({"sid": sid, "chunks": info["chunks"], "nonuniform_chunks": info["chunks_nonuniform"],
"behaving": int(tr.behaving.sum()), "read": int((df.read & tr.behaving.values).sum()),
"baseline": h.baseline.median(), "max_after_go": h.max_after.median(),
**{f"hit_detected_{r}": (h[r].notna().mean() if len(h) else np.nan) for r in ("level 0.12", "rise 0.02", "sd 5", "sd 20")},
"median_rt_ms_sd5": h["sd 5"].median() * 1000})
lk = pd.DataFrame(lk_rows)
print(f"lick_trace windows read for {len(lk)} sessions in {time.time() - t0:.0f} s")
print(lk.round(3).to_string(index=False))
print("\nSessions where a lick is detected (sd 5) on more than half of correct trials without an early lick:",
int((lk["hit_detected_sd 5"] > 0.5).sum()), "of", len(lk))
# Does the trace carry licks? Detection on correct trials (the mouse licked) against no-response trials (it did not),
# pooled over the sessions, and the same for the first session (by id) of each other group of the dandiset.
def lick_contrast(df):
ok = df.read & ~df.early_lick
h, n = df[ok & (df.outcome == "hit")], df[ok & (df.outcome == "ignore")]
return {"hit_trials": len(h), "no_response_trials": len(n), "max_minus_baseline_hit_median": (h.max_after - h.baseline).median(),
**{f"{r}": f"{h[r].notna().mean():.2f}/{n[r].notna().mean() if len(n) else np.nan:.2f}" for r in RULES}}
print("\nFraction of trials with a detected lick, correct / no-response (trials without an early lick):")
print("convention A sessions:", lick_contrast(pd.concat(LK.values(), ignore_index=True)))
ref = []
for exp in ("exp1", "exp3", "no_photostim_record"):
sid = sorted(k for k, s_ in S.items() if s_["exp"] == exp and s_["trials"].behaving.any())[0]
tr = S[sid]["trials"]
df, _ = L.lick_onsets(assets[assets.path == S[sid]["path"]].asset_id.iloc[0], tr.go.values, RULES)
df["outcome"] = tr.outcome.values; df["early_lick"] = tr.early_lick.values
ref.append({"group": exp, "sid": sid, **lick_contrast(df)})
print(pd.DataFrame(ref).round(4).to_string(index=False))
lick_trace windows read for 24 sessions in 127 s
sid chunks nonuniform_chunks behaving read baseline max_after_go hit_detected_level 0.12 hit_detected_rise 0.02 hit_detected_sd 5 hit_detected_sd 20 median_rt_ms_sd5
255201_20141121 269 0 246 233 0.192 0.194 0.0 0.0 0.060 0.000 149.30
255201_20141123 251 0 209 190 0.192 0.194 0.0 0.0 0.038 0.006 119.95
257637_20141222 289 0 254 174 0.179 0.180 0.0 0.0 0.000 0.000 NaN
257637_20141223 243 0 182 156 0.178 0.180 0.0 0.0 0.000 0.000 NaN
257637_20141224 307 0 284 243 0.178 0.180 0.0 0.0 0.000 0.000 NaN
257772_20141121 387 0 338 274 0.191 0.193 0.0 0.0 0.076 0.000 166.80
257772_20141123 340 0 314 255 0.190 0.192 0.0 0.0 0.087 0.005 150.20
258250_20141201 321 0 263 195 0.191 0.193 0.0 0.0 0.022 0.007 117.80
258250_20141203 289 0 258 186 0.190 0.192 0.0 0.0 0.083 0.025 151.60
258250_20141205 289 0 264 185 0.184 0.186 0.0 0.0 0.015 0.007 118.80
263808_20150121 359 0 232 155 0.176 0.178 0.0 0.0 0.000 0.000 NaN
263808_20150122 287 0 191 118 0.176 0.178 0.0 0.0 0.000 0.000 NaN
263808_20150123 317 0 276 175 0.177 0.179 0.0 0.0 0.000 0.000 NaN
263808_20150124 288 0 269 156 0.176 0.177 0.0 0.0 0.000 0.000 NaN
263808_20150125 260 0 241 158 0.175 0.176 0.0 0.0 0.000 0.000 NaN
263808_20150126 300 0 248 183 0.176 0.178 0.0 0.0 0.000 0.000 NaN
263810_20150121 345 0 343 271 0.166 0.167 0.0 0.0 0.000 0.000 NaN
263810_20150122 367 0 308 277 0.178 0.180 0.0 0.0 0.000 0.000 NaN
263810_20150123 242 0 218 183 0.178 0.180 0.0 0.0 0.000 0.000 NaN
263810_20150124 376 0 320 298 0.178 0.180 0.0 0.0 0.000 0.000 NaN
263810_20150125 378 0 357 345 0.177 0.178 0.0 0.0 0.067 0.000 159.60
263810_20150126 314 0 245 233 0.178 0.180 0.0 0.0 0.000 0.000 NaN
264411_20141222 364 0 305 235 0.179 0.182 0.0 0.0 0.000 0.000 NaN
264411_20141224 393 0 353 256 0.179 0.181 0.0 0.0 0.000 0.000 NaN
Sessions where a lick is detected (sd 5) on more than half of correct trials without an early lick: 0 of 24
Fraction of trials with a detected lick, correct / no-response (trials without an early lick):
convention A sessions: {'hit_trials': 3660, 'no_response_trials': 61, 'max_minus_baseline_hit_median': np.float64(0.0018936075498259958), 'level 0.10': '0.00/0.00', 'level 0.12': '0.00/0.00', 'level 0.14': '0.05/0.03', 'level 0.16': '0.37/0.56', 'level 0.20': '0.00/0.00', 'level 0.25': '0.00/0.00', 'rise 0.01': '0.00/0.00', 'rise 0.02': '0.00/0.00', 'rise 0.05': '0.00/0.00', 'sd 3': '0.59/0.38', 'sd 5': '0.02/0.00', 'sd 10': '0.00/0.00', 'sd 20': '0.00/0.00'}
group sid hit_trials no_response_trials max_minus_baseline_hit_median level 0.10 level 0.12 level 0.14 level 0.16 level 0.20 level 0.25 rise 0.01 rise 0.02 rise 0.05 sd 3 sd 5 sd 10 sd 20
exp1 255200_20140913 129 0 0.0025 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.00/nan 0.37/nan 0.00/nan 0.00/nan 0.00/nan
exp3 257636_20150330 103 7 0.0631 1.00/0.86 1.00/0.29 0.87/0.00 0.49/0.00 0.00/0.00 0.00/0.00 1.00/0.57 1.00/0.43 0.73/0.00 1.00/1.00 1.00/1.00 1.00/0.86 1.00/0.57
no_photostim_record 270340_20150619 125 1 0.0227 0.00/0.00 0.00/0.00 1.00/1.00 1.00/0.00 0.00/0.00 0.00/0.00 1.00/0.00 0.74/0.00 0.00/0.00 1.00/0.00 1.00/0.00 0.98/0.00 0.10/0.00
rows = []
for k, v in A.items():
tt = []
for sid, r in v.items():
tb = r["trials"].merge(LK[sid].drop(columns=["outcome", "early_lick"]), on="go", how="left")
tb["sid"] = sid
tt.append(tb)
tt = pd.concat(tt, ignore_index=True)
for reading, sel in (("a control", tt.cond == "control"), ("b all", tt.cond.notna())):
for rule in RULES:
d = tt[sel & tt[rule].notna()].copy()
d["rt_rel"] = d[rule] - d.groupby("sid")[rule].transform("mean")
rho = stats.spearmanr(d.d.abs(), d.rt_rel) if len(d) > 2 else None
rows.append({"trials_rule": k[0], "early_lick": k[1], "H": k[2], "trials": reading, "rule": rule,
"n": len(d), "sessions": d.sid.nunique(), "median_rt_ms": d[rule].median() * 1000,
"rho": rho.statistic if rho else np.nan, "p": rho.pvalue if rho else np.nan})
rt = pd.DataFrame(rows)
rt["holds"] = (rt.rho < 0) & (rt.p < 0.05)
print(rt[rt.trials_rule == "per condition"].round(4).to_string(index=False))
j9 = rt[rt.trials_rule == "per condition"].groupby(["early_lick", "rule"]).holds.any().unstack(0)
print("\nT1: holds under some reading (a or b, H1 or H2), per threshold and K reading:")
print(j9.to_string())
print("Thresholds and K readings under which it holds:", int(j9.values.sum()), "of", j9.size)
print("T2 (variant):", rt[rt.trials_rule == "per type"].groupby("early_lick").holds.mean().round(2).to_dict(), "fraction of rows holding")
print("rho range, T1:", rt[rt.trials_rule == "per condition"].rho.min().round(3), "to", rt[rt.trials_rule == "per condition"].rho.max().round(3))
trials_rule early_lick H trials rule n sessions median_rt_ms rho p holds
per condition drop H1 a control level 0.10 0 0 NaN NaN NaN False
per condition drop H1 a control level 0.12 0 0 NaN NaN NaN False
per condition drop H1 a control level 0.14 106 1 28.10 0.2214 0.0226 False
per condition drop H1 a control level 0.16 731 12 28.50 -0.0546 0.1401 False
per condition drop H1 a control level 0.20 3 2 123.30 -1.0000 0.0000 True
per condition drop H1 a control level 0.25 0 0 NaN NaN NaN False
per condition drop H1 a control rise 0.01 4 3 233.70 -0.6325 0.3675 False
per condition drop H1 a control rise 0.02 0 0 NaN NaN NaN False
per condition drop H1 a control rise 0.05 0 0 NaN NaN NaN False
per condition drop H1 a control sd 3 1096 15 107.05 0.0179 0.5543 False
per condition drop H1 a control sd 5 80 8 218.20 -0.0721 0.5250 False
per condition drop H1 a control sd 10 9 6 123.30 -0.5594 0.1173 False
per condition drop H1 a control sd 20 3 2 123.30 -1.0000 0.0000 True
per condition drop H1 b all level 0.10 0 0 NaN NaN NaN False
per condition drop H1 b all level 0.12 0 0 NaN NaN NaN False
per condition drop H1 b all level 0.14 190 1 28.10 0.1791 0.0134 False
per condition drop H1 b all level 0.16 1367 12 28.50 -0.0012 0.9654 False
per condition drop H1 b all level 0.20 7 5 123.30 0.2594 0.5742 False
per condition drop H1 b all level 0.25 0 0 NaN NaN NaN False
per condition drop H1 b all rise 0.01 9 8 124.10 -0.5477 0.1269 False
per condition drop H1 b all rise 0.02 0 0 NaN NaN NaN False
per condition drop H1 b all rise 0.05 0 0 NaN NaN NaN False
per condition drop H1 b all sd 3 2131 16 110.10 0.0194 0.3713 False
per condition drop H1 b all sd 5 143 10 196.60 0.1255 0.1353 False
per condition drop H1 b all sd 10 19 9 123.40 0.0264 0.9147 False
per condition drop H1 b all sd 20 8 7 123.70 -0.6547 0.0781 False
per condition drop H2 a control level 0.10 0 0 NaN NaN NaN False
per condition drop H2 a control level 0.12 0 0 NaN NaN NaN False
per condition drop H2 a control level 0.14 127 1 28.10 0.1130 0.2058 False
per condition drop H2 a control level 0.16 881 11 28.50 -0.0131 0.6978 False
per condition drop H2 a control level 0.20 6 4 121.05 0.0304 0.9545 False
per condition drop H2 a control level 0.25 0 0 NaN NaN NaN False
per condition drop H2 a control rise 0.01 7 5 122.30 -0.0591 0.8998 False
per condition drop H2 a control rise 0.02 0 0 NaN NaN NaN False
per condition drop H2 a control rise 0.05 0 0 NaN NaN NaN False
per condition drop H2 a control sd 3 1323 15 108.30 0.0111 0.6875 False
per condition drop H2 a control sd 5 83 8 199.20 0.0151 0.8921 False
per condition drop H2 a control sd 10 14 7 122.10 -0.1876 0.5206 False
per condition drop H2 a control sd 20 7 4 122.10 -0.1081 0.8175 False
per condition drop H2 b all level 0.10 0 0 NaN NaN NaN False
per condition drop H2 b all level 0.12 0 0 NaN NaN NaN False
per condition drop H2 b all level 0.14 215 1 28.10 0.0865 0.2063 False
per condition drop H2 b all level 0.16 1545 11 28.50 0.0240 0.3464 False
per condition drop H2 b all level 0.20 11 6 121.60 -0.2466 0.4648 False
per condition drop H2 b all level 0.25 0 0 NaN NaN NaN False
per condition drop H2 b all rise 0.01 13 9 122.30 0.0777 0.8009 False
per condition drop H2 b all rise 0.02 0 0 NaN NaN NaN False
per condition drop H2 b all rise 0.05 0 0 NaN NaN NaN False
per condition drop H2 b all sd 3 2413 16 110.60 -0.0079 0.6980 False
per condition drop H2 b all sd 5 152 10 194.85 0.0952 0.2433 False
per condition drop H2 b all sd 10 25 10 122.10 0.0038 0.9854 False
per condition drop H2 b all sd 20 13 8 122.10 0.0678 0.8258 False
per condition keep H1 a control level 0.10 0 0 NaN NaN NaN False
per condition keep H1 a control level 0.12 0 0 NaN NaN NaN False
per condition keep H1 a control level 0.14 103 1 28.10 0.1740 0.0788 False
per condition keep H1 a control level 0.16 730 12 28.50 0.0442 0.2330 False
per condition keep H1 a control level 0.20 5 4 119.80 -0.6708 0.2152 False
per condition keep H1 a control level 0.25 0 0 NaN NaN NaN False
per condition keep H1 a control rise 0.01 6 5 121.55 -0.5071 0.3046 False
per condition keep H1 a control rise 0.02 0 0 NaN NaN NaN False
per condition keep H1 a control rise 0.05 0 0 NaN NaN NaN False
per condition keep H1 a control sd 3 1101 15 108.80 0.0186 0.5368 False
per condition keep H1 a control sd 5 83 8 216.60 -0.0422 0.7048 False
per condition keep H1 a control sd 10 11 7 122.10 -0.3595 0.2776 False
per condition keep H1 a control sd 20 5 4 119.80 -0.6708 0.2152 False
per condition keep H1 b all level 0.10 0 0 NaN NaN NaN False
per condition keep H1 b all level 0.12 0 0 NaN NaN NaN False
per condition keep H1 b all level 0.14 187 1 28.10 0.1105 0.1322 False
per condition keep H1 b all level 0.16 1371 12 28.50 0.0396 0.1429 False
per condition keep H1 b all level 0.20 9 6 121.60 -0.4700 0.2017 False
per condition keep H1 b all level 0.25 0 0 NaN NaN NaN False
per condition keep H1 b all rise 0.01 11 9 123.30 -0.4162 0.2029 False
per condition keep H1 b all rise 0.02 0 0 NaN NaN NaN False
per condition keep H1 b all rise 0.05 0 0 NaN NaN NaN False
per condition keep H1 b all sd 3 2132 16 111.80 0.0106 0.6240 False
per condition keep H1 b all sd 5 146 10 196.40 0.0345 0.6795 False
per condition keep H1 b all sd 10 22 10 123.05 -0.3804 0.0807 False
per condition keep H1 b all sd 20 10 8 121.55 -0.4399 0.2033 False
per condition keep H2 a control level 0.10 0 0 NaN NaN NaN False
per condition keep H2 a control level 0.12 0 0 NaN NaN NaN False
per condition keep H2 a control level 0.14 128 1 28.10 0.1201 0.1770 False
per condition keep H2 a control level 0.16 886 12 28.50 -0.0286 0.3950 False
per condition keep H2 a control level 0.20 4 3 121.55 -0.9487 0.0513 False
per condition keep H2 a control level 0.25 0 0 NaN NaN NaN False
per condition keep H2 a control rise 0.01 5 4 123.30 -0.8944 0.0405 True
per condition keep H2 a control rise 0.02 0 0 NaN NaN NaN False
per condition keep H2 a control rise 0.05 0 0 NaN NaN NaN False
per condition keep H2 a control sd 3 1319 15 106.70 0.0167 0.5441 False
per condition keep H2 a control sd 5 86 8 200.05 -0.0559 0.6090 False
per condition keep H2 a control sd 10 10 7 118.80 -0.6753 0.0321 True
per condition keep H2 a control sd 20 4 3 121.55 -0.9487 0.0513 False
per condition keep H2 b all level 0.10 0 0 NaN NaN NaN False
per condition keep H2 b all level 0.12 0 0 NaN NaN NaN False
per condition keep H2 b all level 0.14 214 1 28.10 0.0947 0.1673 False
per condition keep H2 b all level 0.16 1552 12 28.50 -0.0008 0.9752 False
per condition keep H2 b all level 0.20 8 6 122.45 -0.8456 0.0082 True
per condition keep H2 b all level 0.25 0 0 NaN NaN NaN False
per condition keep H2 b all rise 0.01 9 7 124.10 -0.6436 0.0614 False
per condition keep H2 b all rise 0.02 0 0 NaN NaN NaN False
per condition keep H2 b all rise 0.05 0 0 NaN NaN NaN False
per condition keep H2 b all sd 3 2413 16 109.70 -0.0156 0.4446 False
per condition keep H2 b all sd 5 154 9 194.85 0.1804 0.0251 False
per condition keep H2 b all sd 10 20 9 123.05 -0.2279 0.3338 False
per condition keep H2 b all sd 20 8 6 123.70 -0.6274 0.0959 False
T1: holds under some reading (a or b, H1 or H2), per threshold and K reading:
early_lick drop keep
rule
level 0.10 False False
level 0.12 False False
level 0.14 False False
level 0.16 False False
level 0.20 True True
level 0.25 False False
rise 0.01 False True
rise 0.02 False False
rise 0.05 False False
sd 10 False True
sd 20 True False
sd 3 False False
sd 5 False False
Thresholds and K readings under which it holds: 5 of 26
T2 (variant): {'drop': 0.06, 'keep': 0.06} fraction of rows holding
rho range, T1: -1.0 to 0.259
# Raw lick_trace (verifier's request): per session, the pre-go baseline and the rise after the go cue
# on correct and on no-response trials, for every convention A session (experiment 2) and the
# reference sessions; then example windows of four correct trials from two experiment-2 and two
# experiment-3 sessions.
def trace_summary(df, sid, group):
ok = df.read & ~df.early_lick
h, n = df[ok & (df.outcome == "hit")], df[ok & (df.outcome == "ignore")]
r = {"group": group, "sid": sid, "hit": len(h), "no_response": len(n), "baseline_median": h.baseline.median(),
"baseline_sd_median": h.baseline_sd.median()}
for name, d in (("hit", h), ("noresp", n)):
rise = d.max_after - d.baseline
r[f"rise_{name}_q50_q90_q99"] = "/".join(f"{x:.4f}" for x in rise.quantile([0.5, 0.9, 0.99])) if len(d) else ""
return r
ex3 = sorted(k for k, s_ in S.items() if s_["exp"] == "exp3" and s_["trials"].behaving.any())
LK3 = {}
for sid in ex3:
tr = S[sid]["trials"]
df, _ = L.lick_onsets(assets[assets.path == S[sid]["path"]].asset_id.iloc[0], tr.go.values, RULES)
df["go"] = tr.go.values; df["outcome"] = tr.outcome.values; df["early_lick"] = tr.early_lick.values
LK3[sid] = df
summ_rows = [trace_summary(df, sid, "exp2 (convention A)") for sid, df in LK.items()] + [trace_summary(df, sid, "exp3") for sid, df in LK3.items()]
print(pd.DataFrame(summ_rows).round(4).to_string(index=False))
fig, axes = plt.subplots(1, 4, figsize=(14, 2.6), sharey=False)
tt_ = np.arange(-0.3, 1.4, 1e-4)[:17000]
for ax, sid in zip(axes, sorted(LK)[:2] + ex3[:2]):
tr = S[sid]["trials"]
g = tr[(tr.outcome == "hit") & ~tr.early_lick & tr.behaving].go.values[:4]
ws = L.lick_windows(assets[assets.path == S[sid]["path"]].asset_id.iloc[0], g)
for k_, w_ in enumerate(ws):
if w_ is None:
continue
ax.plot(tt_[:len(w_)], w_, lw=0.6)
print(f"{sid} ({S[sid]['exp']}), correct trial {k_}: baseline {w_[:3000].mean():.4f}, min {w_.min():.4f}, max {w_.max():.4f},"
f" max after go minus baseline {w_[3000:].max() - w_[:3000].mean():.4f}")
ax.axvline(0, color="k", lw=0.5); ax.set_title(f"{sid} ({S[sid]['exp']})", fontsize=8); ax.set_xlabel("s from go cue")
axes[0].set_ylabel("lick_trace (a.u.)")
plt.tight_layout(); plt.show()
print("Every plotted sample is inside its axis (each panel's y range is set from its data).")
group sid hit no_response baseline_median baseline_sd_median rise_hit_q50_q90_q99 rise_noresp_q50_q90_q99
exp2 (convention A) 255201_20141121 182 0 0.1920 0.0005 0.0019/0.0023/0.0037
exp2 (convention A) 255201_20141123 158 0 0.1925 0.0004 0.0018/0.0020/0.0041
exp2 (convention A) 257637_20141222 134 1 0.1788 0.0005 0.0017/0.0019/0.0021 0.0015/0.0015/0.0015
exp2 (convention A) 257637_20141223 100 0 0.1778 0.0007 0.0021/0.0022/0.0024
exp2 (convention A) 257637_20141224 181 0 0.1781 0.0006 0.0022/0.0025/0.0028
exp2 (convention A) 257772_20141121 197 10 0.1912 0.0005 0.0019/0.0022/0.0028 0.0018/0.0021/0.0021
exp2 (convention A) 257772_20141123 183 3 0.1899 0.0005 0.0020/0.0023/0.0036 0.0021/0.0021/0.0022
exp2 (convention A) 258250_20141201 136 0 0.1908 0.0005 0.0020/0.0021/0.0069
exp2 (convention A) 258250_20141203 121 5 0.1899 0.0005 0.0021/0.0025/0.0159 0.0021/0.0023/0.0024
exp2 (convention A) 258250_20141205 137 0 0.1844 0.0005 0.0017/0.0020/0.0056
exp2 (convention A) 263808_20150121 97 7 0.1764 0.0025 0.0018/0.0020/0.0023 0.0019/0.0020/0.0020
exp2 (convention A) 263808_20150122 77 2 0.1763 0.0025 0.0019/0.0023/0.0025 0.0019/0.0019/0.0019
exp2 (convention A) 263808_20150123 119 2 0.1768 0.0025 0.0021/0.0024/0.0026 0.0019/0.0020/0.0020
exp2 (convention A) 263808_20150124 123 0 0.1757 0.0024 0.0017/0.0027/0.0041
exp2 (convention A) 263808_20150125 112 1 0.1748 0.0024 0.0017/0.0019/0.0021 0.0018/0.0018/0.0018
exp2 (convention A) 263808_20150126 125 0 0.1763 0.0024 0.0016/0.0018/0.0019
exp2 (convention A) 263810_20150121 181 2 0.1661 0.0022 0.0013/0.0015/0.0016 0.0013/0.0013/0.0013
exp2 (convention A) 263810_20150122 159 18 0.1778 0.0024 0.0020/0.0022/0.0024 0.0019/0.0021/0.0023
exp2 (convention A) 263810_20150123 145 1 0.1783 0.0025 0.0020/0.0023/0.0026 0.0018/0.0018/0.0018
exp2 (convention A) 263810_20150124 210 4 0.1783 0.0006 0.0019/0.0022/0.0024 0.0017/0.0019/0.0020
exp2 (convention A) 263810_20150125 253 3 0.1769 0.0003 0.0013/0.0016/0.0018 0.0013/0.0015/0.0015
exp2 (convention A) 263810_20150126 183 1 0.1780 0.0024 0.0019/0.0021/0.0023 0.0021/0.0021/0.0021
exp2 (convention A) 264411_20141222 167 0 0.1794 0.0006 0.0021/0.0024/0.0026
exp2 (convention A) 264411_20141224 180 1 0.1787 0.0007 0.0020/0.0023/0.0026 0.0019/0.0019/0.0019
exp3 257636_20150330 103 7 0.0970 0.0006 0.0631/0.0818/0.0827 0.0121/0.0319/0.0358
exp3 257636_20150331 182 4 0.1083 0.0006 0.0485/0.0651/0.0690 0.0135/0.0166/0.0170
exp3 257636_20150401 147 1 0.1108 0.0005 0.0463/0.0575/0.0644 0.0129/0.0129/0.0129
exp3 257636_20150403 191 4 0.1103 0.0005 0.0452/0.0593/0.0666 0.0065/0.0104/0.0118
exp3 257636_20150404 173 2 0.1120 0.0005 0.0483/0.0613/0.0652 0.0213/0.0240/0.0247
exp3 270337_20150303 262 7 0.1280 0.0006 0.0385/0.0439/0.0454 0.0025/0.0029/0.0029
exp3 270337_20150304 203 1 0.1055 0.0005 0.0673/0.0751/0.0764 0.0017/0.0017/0.0017
exp3 270337_20150306 246 4 0.1145 0.0005 0.0591/0.0625/0.0629 0.0023/0.0033/0.0035
exp3 273657_20150321 152 4 0.1263 0.0007 0.0462/0.0472/0.0476 0.0035/0.0066/0.0078
exp3 273657_20150322 180 4 0.1256 0.0006 0.0474/0.0484/0.0488 0.0019/0.0047/0.0057
exp3 273657_20150323 152 1 0.1033 0.0008 0.0717/0.0725/0.0731 0.0042/0.0042/0.0042
exp3 273657_20150325 136 4 0.1090 0.0007 0.0651/0.0665/0.0671 0.0025/0.0033/0.0033
255201_20141121 (exp2), correct trial 0: baseline 0.1917, min 0.1893, max 0.1941, max after go minus baseline 0.0024 255201_20141121 (exp2), correct trial 1: baseline 0.1917, min 0.1893, max 0.1938, max after go minus baseline 0.0021 255201_20141121 (exp2), correct trial 2: baseline 0.1916, min 0.1893, max 0.1935, max after go minus baseline 0.0019 255201_20141121 (exp2), correct trial 3: baseline 0.1917, min 0.1893, max 0.1938, max after go minus baseline 0.0021
255201_20141123 (exp2), correct trial 0: baseline 0.1922, min 0.1899, max 0.1944, max after go minus baseline 0.0016 255201_20141123 (exp2), correct trial 1: baseline 0.1921, min 0.1896, max 0.1941, max after go minus baseline 0.0013 255201_20141123 (exp2), correct trial 2: baseline 0.1921, min 0.1899, max 0.1938, max after go minus baseline 0.0014 255201_20141123 (exp2), correct trial 3: baseline 0.1923, min 0.1896, max 0.1941, max after go minus baseline 0.0015
257636_20150330 (exp3), correct trial 0: baseline 0.0969, min 0.0948, max 0.1767, max after go minus baseline 0.0798 257636_20150330 (exp3), correct trial 1: baseline 0.0962, min 0.0945, max 0.1328, max after go minus baseline 0.0366 257636_20150330 (exp3), correct trial 2: baseline 0.0951, min 0.0938, max 0.1664, max after go minus baseline 0.0713 257636_20150330 (exp3), correct trial 3: baseline 0.0964, min 0.0945, max 0.1619, max after go minus baseline 0.0655
257636_20150331 (exp3), correct trial 0: baseline 0.1079, min 0.1061, max 0.1696, max after go minus baseline 0.0617 257636_20150331 (exp3), correct trial 1: baseline 0.1077, min 0.1057, max 0.1438, max after go minus baseline 0.0361 257636_20150331 (exp3), correct trial 2: baseline 0.1082, min 0.1064, max 0.1680, max after go minus baseline 0.0598 257636_20150331 (exp3), correct trial 3: baseline 0.1087, min 0.1061, max 0.1683, max after go minus baseline 0.0596
Every plotted sample is inside its axis (each panel's y range is set from its data).
# Variant (verifier's suggestion; reference only, the claim's sessions are those of experiment 2):
# the same test on experiment 3, whose lick trace carries licks. Convention A on the experiment-3
# sessions (more than 5 neurons with more than 5 trials in each of control, left4, right4 and
# bilateral2), cd and boundary as for ed7e, reaction time from the trace under every rule.
rows = []
for early in ("drop", "keep"):
sess3 = L.a_sessions(U, S, "exp3", ["control", "left4", "right4", "bilateral2"], early, False)
for frac, hname in ((0.5, "H1"), (1 / 3, "H2")):
tt = []
for sid, uids in sess3.items():
X, t = L.session_counts(U, S, sid, uids, early)
r = L.activity_session(X, t, frac, ["control", "left4", "right4", "bilateral2"], "left4", np.random.default_rng(int(sid.replace("_", "")) % 2 ** 32))
tb = r["trials"].merge(LK3[sid].drop(columns=["outcome", "early_lick"]), on="go", how="left"); tb["sid"] = sid
tt.append(tb)
tt = pd.concat(tt, ignore_index=True)
for reading, sel in (("a control", tt.cond == "control"), ("b all", tt.cond.notna())):
for rule in RULES:
d = tt[sel & tt[rule].notna()].copy()
d["rt_rel"] = d[rule] - d.groupby("sid")[rule].transform("mean")
rho = stats.spearmanr(d.d.abs(), d.rt_rel) if len(d) > 2 else None
rows.append({"early_lick": early, "H": hname, "trials": reading, "rule": rule, "sessions": d.sid.nunique(), "n": len(d),
"median_rt_ms": d[rule].median() * 1000, "rho": rho.statistic if rho else np.nan, "p": rho.pvalue if rho else np.nan})
rt3 = pd.DataFrame(rows)
rt3["holds"] = (rt3.rho < 0) & (rt3.p < 0.05)
print(rt3.round(4).to_string(index=False))
j3 = rt3.groupby(["early_lick", "rule"]).holds.any().unstack(0)
print("\nExperiment 3: holds under some reading (a or b, H1 or H2), per threshold and K reading:")
print(j3.to_string())
print("Thresholds and K readings under which it holds:", int(j3.values.sum()), "of", j3.size, "; rho range", rt3.rho.min().round(3), "to", rt3.rho.max().round(3))
early_lick H trials rule sessions n median_rt_ms rho p holds
drop H1 a control level 0.10 2 37 814.70 0.1721 0.3084 False
drop H1 a control level 0.12 6 348 81.45 -0.0719 0.1811 False
drop H1 a control level 0.14 6 468 188.30 -0.0113 0.8076 False
drop H1 a control level 0.16 6 307 337.20 0.0728 0.2031 False
drop H1 a control level 0.20 0 0 NaN NaN NaN False
drop H1 a control level 0.25 0 0 NaN NaN NaN False
drop H1 a control rise 0.01 6 488 102.35 -0.0324 0.4758 False
drop H1 a control rise 0.02 6 475 120.00 -0.0064 0.8888 False
drop H1 a control rise 0.05 4 180 430.50 -0.0195 0.7948 False
drop H1 a control sd 3 6 506 49.00 -0.0674 0.1299 False
drop H1 a control sd 5 6 499 80.90 -0.1087 0.0151 True
drop H1 a control sd 10 6 491 91.30 -0.1024 0.0232 True
drop H1 a control sd 20 6 483 107.00 -0.0444 0.3299 False
drop H1 b all level 0.10 2 64 667.80 0.1563 0.2175 False
drop H1 b all level 0.12 6 669 80.90 -0.0933 0.0158 True
drop H1 b all level 0.14 6 898 187.70 -0.0494 0.1394 False
drop H1 b all level 0.16 6 614 415.30 -0.0289 0.4740 False
drop H1 b all level 0.20 0 0 NaN NaN NaN False
drop H1 b all level 0.25 0 0 NaN NaN NaN False
drop H1 b all rise 0.01 6 935 103.50 -0.1164 0.0004 True
drop H1 b all rise 0.02 6 916 122.95 -0.0606 0.0670 False
drop H1 b all rise 0.05 4 365 491.30 0.0351 0.5040 False
drop H1 b all sd 3 6 965 49.50 -0.1296 0.0001 True
drop H1 b all sd 5 6 953 81.20 -0.1623 0.0000 True
drop H1 b all sd 10 6 942 91.50 -0.1570 0.0000 True
drop H1 b all sd 20 6 930 105.90 -0.1033 0.0016 True
drop H2 a control level 0.10 2 42 758.20 0.0532 0.7377 False
drop H2 a control level 0.12 6 425 80.60 -0.1892 0.0001 True
drop H2 a control level 0.14 6 575 186.00 -0.1242 0.0029 True
drop H2 a control level 0.16 6 391 324.50 -0.0464 0.3606 False
drop H2 a control level 0.20 0 0 NaN NaN NaN False
drop H2 a control level 0.25 0 0 NaN NaN NaN False
drop H2 a control rise 0.01 6 597 100.20 -0.1651 0.0001 True
drop H2 a control rise 0.02 6 582 115.80 -0.1472 0.0004 True
drop H2 a control rise 0.05 4 237 453.90 -0.0330 0.6130 False
drop H2 a control sd 3 6 616 50.80 -0.0634 0.1160 False
drop H2 a control sd 5 6 609 79.90 -0.1974 0.0000 True
drop H2 a control sd 10 6 600 90.65 -0.2051 0.0000 True
drop H2 a control sd 20 6 591 102.40 -0.1757 0.0000 True
drop H2 b all level 0.10 2 72 667.80 0.0422 0.7249 False
drop H2 b all level 0.12 6 766 80.40 -0.1721 0.0000 True
drop H2 b all level 0.14 6 1031 186.80 -0.1230 0.0001 True
drop H2 b all level 0.16 6 716 410.35 -0.0779 0.0372 True
drop H2 b all level 0.20 0 0 NaN NaN NaN False
drop H2 b all level 0.25 0 0 NaN NaN NaN False
drop H2 b all rise 0.01 6 1070 100.75 -0.1832 0.0000 True
drop H2 b all rise 0.02 6 1049 118.10 -0.1366 0.0000 True
drop H2 b all rise 0.05 4 434 518.70 0.0274 0.5689 False
drop H2 b all sd 3 6 1105 50.50 -0.0966 0.0013 True
drop H2 b all sd 5 6 1091 80.50 -0.1881 0.0000 True
drop H2 b all sd 10 6 1077 90.40 -0.2036 0.0000 True
drop H2 b all sd 20 6 1064 102.75 -0.1715 0.0000 True
keep H1 a control level 0.10 2 36 678.55 0.0075 0.9655 False
keep H1 a control level 0.12 6 349 82.20 -0.0958 0.0737 False
keep H1 a control level 0.14 6 465 190.40 -0.1526 0.0010 True
keep H1 a control level 0.16 6 310 328.95 -0.0802 0.1587 False
keep H1 a control level 0.20 0 0 NaN NaN NaN False
keep H1 a control level 0.25 0 0 NaN NaN NaN False
keep H1 a control rise 0.01 6 486 102.65 -0.1216 0.0073 True
keep H1 a control rise 0.02 6 472 120.45 -0.1418 0.0020 True
keep H1 a control rise 0.05 4 188 420.85 0.0119 0.8714 False
keep H1 a control sd 3 6 504 49.45 -0.1393 0.0017 True
keep H1 a control sd 5 6 496 81.60 -0.2328 0.0000 True
keep H1 a control sd 10 6 488 93.75 -0.2125 0.0000 True
keep H1 a control sd 20 6 480 106.65 -0.1627 0.0003 True
keep H1 b all level 0.10 2 64 640.10 -0.0113 0.9296 False
keep H1 b all level 0.12 6 672 80.90 -0.1088 0.0047 True
keep H1 b all level 0.14 6 897 188.70 -0.1149 0.0006 True
keep H1 b all level 0.16 6 620 416.05 -0.0721 0.0730 False
keep H1 b all level 0.20 0 0 NaN NaN NaN False
keep H1 b all level 0.25 0 0 NaN NaN NaN False
keep H1 b all rise 0.01 6 935 102.90 -0.1421 0.0000 True
keep H1 b all rise 0.02 6 915 122.80 -0.1165 0.0004 True
keep H1 b all rise 0.05 4 373 501.10 0.0765 0.1402 False
keep H1 b all sd 3 6 967 49.20 -0.1675 0.0000 True
keep H1 b all sd 5 6 952 81.50 -0.2307 0.0000 True
keep H1 b all sd 10 6 941 92.90 -0.1967 0.0000 True
keep H1 b all sd 20 6 929 105.00 -0.1592 0.0000 True
keep H2 a control level 0.10 2 43 814.70 0.0843 0.5911 False
keep H2 a control level 0.12 6 423 81.20 -0.0811 0.0958 False
keep H2 a control level 0.14 6 578 187.35 -0.1780 0.0000 True
keep H2 a control level 0.16 6 387 339.20 -0.0968 0.0570 False
keep H2 a control level 0.20 0 0 NaN NaN NaN False
keep H2 a control level 0.25 0 0 NaN NaN NaN False
keep H2 a control rise 0.01 6 600 102.00 -0.1908 0.0000 True
keep H2 a control rise 0.02 6 585 115.90 -0.1703 0.0000 True
keep H2 a control rise 0.05 4 225 447.00 0.0164 0.8066 False
keep H2 a control sd 3 6 619 49.10 -0.1432 0.0003 True
keep H2 a control sd 5 6 611 80.90 -0.2522 0.0000 True
keep H2 a control sd 10 6 602 91.55 -0.2562 0.0000 True
keep H2 a control sd 20 6 594 103.80 -0.2014 0.0000 True
keep H2 b all level 0.10 2 73 680.20 0.1071 0.3672 False
keep H2 b all level 0.12 6 765 80.60 -0.1115 0.0020 True
keep H2 b all level 0.14 6 1037 187.60 -0.1604 0.0000 True
keep H2 b all level 0.16 6 714 416.75 -0.1149 0.0021 True
keep H2 b all level 0.20 0 0 NaN NaN NaN False
keep H2 b all level 0.25 0 0 NaN NaN NaN False
keep H2 b all rise 0.01 6 1077 102.10 -0.1816 0.0000 True
keep H2 b all rise 0.02 6 1056 120.50 -0.1516 0.0000 True
keep H2 b all rise 0.05 4 421 518.40 0.0364 0.4558 False
keep H2 b all sd 3 6 1110 49.45 -0.1464 0.0000 True
keep H2 b all sd 5 6 1096 81.30 -0.2433 0.0000 True
keep H2 b all sd 10 6 1083 91.60 -0.2301 0.0000 True
keep H2 b all sd 20 6 1071 104.00 -0.1821 0.0000 True
Experiment 3: holds under some reading (a or b, H1 or H2), per threshold and K reading:
early_lick drop keep
rule
level 0.10 False False
level 0.12 True True
level 0.14 True True
level 0.16 True True
level 0.20 False False
level 0.25 False False
rise 0.01 True True
rise 0.02 True True
rise 0.05 False False
sd 10 True True
sd 20 True True
sd 3 True True
sd 5 True True
Thresholds and K readings under which it holds: 18 of 26 ; rho range -0.256 to 0.172
Result: blocked (data_missing). The answer let the claim be tested over a range of lick
thresholds, and the test shows that the lick trace of these sessions holds no licks. In the 24
experiment-2 sessions of convention A the trace sits at a baseline of 0.166 to 0.193 and its median
rise after the go cue on correct trials, where the mouse licked, is 0.0013 to 0.0022 per session
(99th percentile at most 0.0159), the same as on no-response trials (0.0013 to 0.0021); the example
traces show the same. After the first verification round, raw levels of 0.16, 0.20 and 0.25 were
added, since the levels 0.10 to 0.14 lie below the baseline of these sessions. Pooled over 3660
correct and 61 no-response trials, no rule finds a lick on correct trials more often than on
no-response trials (level 0.16, 0.37 against 0.56; 3 s.d., 0.59 against 0.38; level 0.14, 0.05
against 0.03; every other rule 0.02 or less), and no session has a lick detected (5 s.d.) on more
than half of its correct trials. The correlation holds under 5 of the 26 combinations of threshold
and lick-early reading, on 3 to 10 trials, so by the claims file's rule the outcome would also be
methods_underspecified. In experiment 3 the trace carries licks: the median rise on correct
trials is 0.0385 to 0.0717 per session, against 0.0017 to 0.0213 on no-response trials. As a
variant on those 6 sessions (a different experiment from the claim's), the correlation is negative
with p < 0.05 under 18 of the 26 combinations; it fails for the levels that lie near or above the
trace (0.10, 0.20, 0.25) and for a rise of 0.05, and its rho ranges from -0.256 to 0.172. The lick
times the claim needs are not in the dandiset for the claim's sessions.
ed9c-cd-window-robust¶
The recovery along cd after unilateral perturbation does not depend on the window used to compute cd (first or last 400 ms of the delay epoch).
Criterion: as fig3c-cd-recovery-roc with cd from the first or the last 400 ms of the delay epoch; reproduced when, for both windows, the ipsilateral ROC at the end of the delay is within 0.05 of the control ROC and the bilateral ROC is lower than the ipsilateral. A 400 ms window inside a 400 ms period is a single window, so cd is w of that window.
rows = []
for per_type in (False, True):
for early in ("drop", "keep"):
sess = L.a_sessions(U, S, "exp2", CONDS_A, early, per_type)
for frac, hname in ((0.5, "H1"), (1 / 3, "H2")):
for wname, win in (("first 400 ms", (-1.7, -1.3)), ("last 400 ms", (-0.4, 0.0))):
roc = []
for sid, uids in sess.items():
X, t = L.session_counts(U, S, sid, uids, early)
rng = np.random.default_rng(int(sid.replace("_", "")) % 2 ** 32)
roc.append(L.activity_session(X, t, frac, CONDS_A, "left1", rng, cd_window=win)["roc_go"])
roc = pd.DataFrame(roc).mean()
rows.append({"trials_rule": "per type" if per_type else "per condition", "early_lick": early, "H": hname, "cd_window": wname,
**roc.to_dict()})
r9c = pd.DataFrame(rows)
r9c["holds"] = ((r9c.left1 - r9c.control).abs() <= 0.05) & (r9c.bilateral8 < r9c.left1)
print(r9c.round(3).to_string(index=False))
print(r9c.groupby(["trials_rule", "early_lick", "H"]).holds.all().to_string())
hk = r9c.groupby(["trials_rule", "early_lick", "H"]).holds.all().rename("both_windows").reset_index()
print("\nT1, per K reading, both windows hold under some H reading:", by_k(hk, "both_windows"))
trials_rule early_lick H cd_window control left1 right1 bilateral8 holds
per condition drop H1 first 400 ms 0.642 0.653 0.639 0.556 True
per condition drop H1 last 400 ms 0.670 0.652 0.690 0.580 True
per condition drop H2 first 400 ms 0.641 0.610 0.635 0.549 True
per condition drop H2 last 400 ms 0.697 0.656 0.683 0.581 True
per condition keep H1 first 400 ms 0.633 0.574 0.650 0.560 False
per condition keep H1 last 400 ms 0.658 0.658 0.711 0.586 True
per condition keep H2 first 400 ms 0.630 0.606 0.646 0.554 True
per condition keep H2 last 400 ms 0.661 0.660 0.686 0.581 True
per type drop H1 first 400 ms 0.640 0.665 0.640 0.582 True
per type drop H1 last 400 ms 0.665 0.650 0.697 0.600 True
per type drop H2 first 400 ms 0.627 0.626 0.635 0.558 True
per type drop H2 last 400 ms 0.693 0.672 0.691 0.592 True
per type keep H1 first 400 ms 0.635 0.563 0.645 0.565 False
per type keep H1 last 400 ms 0.661 0.643 0.709 0.590 True
per type keep H2 first 400 ms 0.631 0.607 0.639 0.558 True
per type keep H2 last 400 ms 0.661 0.656 0.682 0.578 True
trials_rule early_lick H
per condition drop H1 True
H2 True
keep H1 False
H2 True
per type drop H1 True
H2 True
keep H1 False
H2 True
T1, per K reading, both windows hold under some H reading: {'drop': True, 'keep': True}
Result: reproduced. With cd from the first or the last 400 ms of the delay, the ipsilateral ROC is within 0.05 of the control ROC and the bilateral ROC is below the ipsilateral one under H1 and H2 with lick-early trials dropped, and under H2 with them kept (under H1 kept, the ipsilateral ROC with the first window is 0.059 to 0.072 below control). The criterion allows either H reading, so the claim holds under both lick-early readings, as the answer on K requires, with the rule as written (T1).
ed7e-roc-larger-photoinhibition¶
Trajectory separation along cd at the end of the delay was 0.80 in control, 0.64 after ipsilateral and 0.68 after contralateral four-spot photoinhibition, and 0.54 after bilateral one-spot photoinhibition.
Criterion: convention A on experiment 3 sessions with more than 5 simultaneously recorded neurons tested on more than 3 trials per condition (control, ipsilateral four spots, contralateral four spots, bilateral one spot per side). Tolerances are the legend's s.e.m. (the bilateral 0.8 read as 0.08). Reproduced when all four are within tolerance under H1 or H2.
CONDS_7 = ["control", "left4", "right4", "bilateral2"]
EXP7E = {"control": (0.80, 0.08), "left4": (0.64, 0.10), "right4": (0.68, 0.15), "bilateral2": (0.54, 0.08)}
rows, A7 = [], {}
for early in ("drop", "keep"):
sess = L.a_sessions(U, S, "exp3", CONDS_7, early, False, min_trials=3)
for frac, hname in ((0.5, "H1"), (1 / 3, "H2")):
res = {}
for sid, uids in sess.items():
X, t = L.session_counts(U, S, sid, uids, early)
res[sid] = L.activity_session(X, t, frac, CONDS_7, "left4", np.random.default_rng(int(sid.replace("_", "")) % 2 ** 32))
A7[(early, hname)] = res
roc = pd.DataFrame([r["roc_go"] for r in res.values()])
row = {"early_lick": early, "H": hname, "sessions": len(roc), "mice": len({s.split('_')[0] for s in res}),
"neurons": f"{min(r['n_neurons'] for r in res.values())}-{max(r['n_neurons'] for r in res.values())}"}
for c in CONDS_7:
row[c] = roc[c].mean(); row[c + "_sem"] = roc[c].sem(); row[c + "_ok"] = abs(roc[c].mean() - EXP7E[c][0]) <= EXP7E[c][1]
row["all_four"] = all(row[c + "_ok"] for c in CONDS_7)
rows.append(row)
r7e = pd.DataFrame(rows)
print(r7e.round(3).to_string(index=False))
early_lick H sessions mice neurons control control_sem control_ok left4 left4_sem left4_ok right4 right4_sem right4_ok bilateral2 bilateral2_sem bilateral2_ok all_four
drop H1 6 3 6-23 0.689 0.058 False 0.607 0.071 True 0.698 0.061 True 0.615 0.053 True False
drop H2 6 3 6-23 0.686 0.069 False 0.672 0.087 True 0.691 0.065 True 0.616 0.063 True False
keep H1 6 3 6-23 0.685 0.063 False 0.604 0.088 True 0.697 0.056 True 0.646 0.062 False False
keep H2 6 3 6-23 0.680 0.052 False 0.643 0.072 True 0.709 0.058 True 0.665 0.043 False False
Result: partially reproduced. The answer on lick-early trials requires the outcome under K1 and K2, and it is partial under both. Over 6 sessions of 3 mice (6 to 23 neurons), the ipsilateral (0.60 to 0.67) and contralateral (0.69 to 0.71) four-spot values are within tolerance, and the bilateral one-spot value (0.615 to 0.616) is within it with lick-early trials dropped (0.646 to 0.665 kept, outside). The control ROC (0.680 to 0.689) is below the paper's 0.80 by more than its s.e.m., so no reading has all four; bilateral separation is lower than ipsilateral only under K1 with H2 (0.616 against 0.672). The criterion defines no partial outcome; three of the four values hold under K1 and two under K2, so the outcome is partial by the rule given in the Summary.
ed7-larger-photoinhibition¶
Bilateral photoinhibition with one spot per side changed selectivity more persistently than unilateral photoinhibition with four spots; selectivity recovered to 80% of control 490 ms after ipsilateral and 235 ms after contralateral four-spot photoinhibition, and did not recover after bilateral one-spot photoinhibition; recovery after unilateral photoinhibition was less robust with larger photoinhibition.
Criterion: convention D on experiment 3. Reproduced when both times are within tolerance, bilateral one-spot selectivity stays below 80% of control at the end of the delay, and the selectivity change at the go cue is larger (more negative) after bilateral one-spot than after ipsilateral four-spot photoinhibition; "less robust with size" is judged by the ipsilateral four-spot ROC at the end of the delay (ed7e) lower than the ipsilateral one-spot ROC (fig3c), by sign. The method details answered 2026-10-21 (K, D, L, E) are run as for fig1g, and the outcome must be the same under all; trials are counted per condition (N1).
OFF3 = {"left4": -0.9, "right4": -0.9, "bilateral2": -0.9}
e3 = U[(U.exp == "exp3") & (U.cls == "pyr")]
rec3, courses3 = {}, {}
for early in ("drop", "keep"):
rec3[early], courses3[early] = L.recovery_readings(e3, S, OFF3, SEL[early], early, no_recovery=("bilateral2",), per_types=(False,))
rec3 = pd.concat(rec3.values(), ignore_index=True).rename(columns={"early": "early_lick"})
dsel = []
for early in ("drop", "keep"):
for key, (tl, cm) in courses3[early].items():
jgo = int(np.argmin(abs(tl - 0.0)))
dsel.append({"early_lick": early, "bin": key[0], "pref": key[1], "S": key[3], "label": key[4],
"dsel_go_bilateral2": cm["bilateral2"][jgo] - cm["control"][jgo], "dsel_go_left4": cm["left4"][jgo] - cm["control"][jgo]})
rec3 = rec3.merge(pd.DataFrame(dsel), on=["early_lick", "bin", "pref", "S", "label"])
rec3["ipsi_ok"] = (rec3.left4 - 490).abs() <= 280
rec3["contra_ok"] = (rec3.right4 - 235).abs() <= 156
rec3["n_ok"] = (rec3.n - 40).abs() <= 4
rec3["bil_no_recovery"] = ~rec3.bilateral2_recovers_by_go
rec3["bil_larger_change"] = rec3.dsel_go_bilateral2 < rec3.dsel_go_left4
rec3["holds_D"] = rec3.ipsi_ok & rec3.contra_ok & rec3.bil_no_recovery & rec3.bil_larger_change
print(rec3[["early_lick", "pref", "label", "search", "bin", "S", "n", "left4", "left4_boot", "left4_sd", "right4", "right4_boot", "right4_sd",
"bilateral2", "bilateral2_max_ratio_to_go", "dsel_go_bilateral2", "dsel_go_left4", "holds_D"]].round(2).to_string(index=False))
roc_cmp = []
for early in ("drop", "keep"):
for h in ("H1", "H2"):
r4 = r7e[(r7e.early_lick == early) & (r7e.H == h)].left4.iloc[0]
r1 = r3c[(r3c.trials_rule == "per condition") & (r3c.early_lick == early) & (r3c.H == h)].left1.iloc[0]
roc_cmp.append({"early_lick": early, "H": h, "roc_ipsi_4_spots": r4, "roc_ipsi_1_spot": r1, "less_robust": r4 < r1})
roc_cmp = pd.DataFrame(roc_cmp)
print("\n", roc_cmp.round(3).to_string(index=False))
s7 = rec3.groupby(["early_lick", "pref", "label", "search"]).agg(
sum=("holds_D", "sum"), size=("holds_D", "size"), left4_ms=("left4", lambda x: f"{x.min():.0f}-{x.max():.0f}"),
right4_ms=("right4", lambda x: f"{x.min():.0f}-{x.max():.0f}"), ipsi_ok=("ipsi_ok", "sum"), contra_ok=("contra_ok", "sum"),
bil_no_recovery=("bil_no_recovery", "sum"), bil_larger_change=("bil_larger_change", "sum")).reset_index()
s7 = s7.merge(roc_cmp.groupby("early_lick").less_robust.any().reset_index(), on="early_lick")
s7["holds"] = (s7["sum"] > 0) & s7.less_robust
s7["outcome_here"] = np.where(s7.holds, "reproduced", "not")
print("\n", s7.to_string(index=False))
print("Outcomes over the method combinations (K, D, L, E):", s7.outcome_here.value_counts().to_dict())
print("Included neurons:", rec3.n.min(), "to", rec3.n.max(), "; paper 40 (tolerance 4)")
early_lick pref label search bin S n left4 left4_boot left4_sd right4 right4_boot right4_sd bilateral2 bilateral2_max_ratio_to_go dsel_go_bilateral2 dsel_go_left4 holds_D
drop trial centre E1 0.2 R1-O1-student 58 700.0 654.57 93.87 300.0 253.00 133.29 NaN 0.75 -0.46 -0.04 True
drop trial centre E2 0.2 R1-O1-student 58 700.0 659.00 99.84 300.0 253.00 133.29 1350.0 0.75 -0.46 -0.04 True
drop trial end E1 0.2 R1-O1-student 58 800.0 753.32 92.45 400.0 327.50 158.80 NaN 0.75 -0.38 0.01 False
drop trial end E2 0.2 R1-O1-student 58 800.0 759.00 99.84 400.0 327.50 158.80 1450.0 0.75 -0.38 0.01 False
drop trial centre E1 0.2 R1-O1-welch 59 700.0 644.82 117.61 300.0 254.00 159.56 NaN 0.76 -0.46 -0.04 True
drop trial centre E2 0.2 R1-O1-welch 59 700.0 661.00 149.60 300.0 254.00 159.56 1350.0 0.76 -0.46 -0.04 True
drop trial end E1 0.2 R1-O1-welch 59 800.0 741.62 119.59 400.0 315.23 165.40 NaN 0.76 -0.37 0.01 False
drop trial end E2 0.2 R1-O1-welch 59 800.0 760.25 152.50 400.0 324.75 181.38 1450.0 0.76 -0.37 0.01 False
drop trial centre E1 0.2 R1-O2-student 59 700.0 651.79 115.62 300.0 250.25 147.35 NaN 0.76 -0.46 -0.05 True
drop trial centre E2 0.2 R1-O2-student 59 700.0 660.25 126.03 300.0 250.25 147.35 1350.0 0.76 -0.46 -0.05 True
drop trial end E1 0.2 R1-O2-student 59 800.0 748.96 114.83 400.0 323.00 171.67 NaN 0.76 -0.38 0.00 False
drop trial end E2 0.2 R1-O2-student 59 800.0 760.00 127.28 400.0 323.00 171.67 1450.0 0.76 -0.38 0.00 False
drop trial centre E1 0.2 R1-O2-welch 59 700.0 651.79 115.62 300.0 250.25 147.35 NaN 0.76 -0.46 -0.05 True
drop trial centre E2 0.2 R1-O2-welch 59 700.0 660.25 126.03 300.0 250.25 147.35 1350.0 0.76 -0.46 -0.05 True
drop trial end E1 0.2 R1-O2-welch 59 800.0 748.96 114.83 400.0 323.00 171.67 NaN 0.76 -0.38 0.00 False
drop trial end E2 0.2 R1-O2-welch 59 800.0 760.00 127.28 400.0 323.00 171.67 1450.0 0.76 -0.38 0.00 False
drop trial centre E1 0.2 R2-O1-student 58 700.0 638.52 145.98 300.0 255.28 157.11 NaN 0.75 -0.46 -0.04 True
drop trial centre E2 0.2 R2-O1-student 58 700.0 648.50 164.99 300.0 259.25 166.44 1350.0 0.75 -0.46 -0.04 True
drop trial end E1 0.2 R2-O1-student 58 800.0 737.44 145.56 400.0 321.21 176.47 NaN 0.75 -0.38 0.01 False
drop trial end E2 0.2 R2-O1-student 58 800.0 748.50 164.99 400.0 328.50 190.23 1450.0 0.75 -0.38 0.01 False
drop trial centre E1 0.2 R2-O1-welch 60 700.0 637.56 150.56 300.0 257.75 157.57 NaN 0.76 -0.45 -0.04 True
drop trial centre E2 0.2 R2-O1-welch 60 700.0 655.00 186.21 300.0 257.75 157.57 1350.0 0.76 -0.45 -0.04 True
drop trial end E1 0.2 R2-O1-welch 60 800.0 733.68 148.49 400.0 320.81 165.86 NaN 0.76 -0.37 0.01 False
drop trial end E2 0.2 R2-O1-welch 60 800.0 755.00 186.21 400.0 330.25 181.51 1450.0 0.76 -0.37 0.01 False
drop trial centre E1 0.2 R2-O2-student 58 700.0 635.60 129.50 300.0 231.41 145.90 NaN 0.76 -0.47 -0.05 True
drop trial centre E2 0.2 R2-O2-student 58 700.0 658.00 169.30 300.0 235.25 155.31 1350.0 0.76 -0.47 -0.05 True
drop trial end E1 0.2 R2-O2-student 58 800.0 733.95 129.65 400.0 308.54 166.25 NaN 0.76 -0.39 0.00 False
drop trial end E2 0.2 R2-O2-student 58 800.0 757.75 170.23 400.0 312.50 174.98 1450.0 0.76 -0.39 0.00 False
drop trial centre E1 0.2 R2-O2-welch 59 700.0 651.79 115.62 300.0 250.25 147.35 NaN 0.76 -0.46 -0.05 True
drop trial centre E2 0.2 R2-O2-welch 59 700.0 660.25 126.03 300.0 250.25 147.35 1350.0 0.76 -0.46 -0.05 True
drop trial end E1 0.2 R2-O2-welch 59 800.0 748.96 114.83 400.0 323.00 171.67 NaN 0.76 -0.38 0.00 False
drop trial end E2 0.2 R2-O2-welch 59 800.0 760.00 127.28 400.0 323.00 171.67 1450.0 0.76 -0.38 0.00 False
drop delay centre E1 0.2 R1-O1-student 58 650.0 653.55 68.06 350.0 231.00 149.63 NaN 0.76 -0.42 0.02 True
drop delay centre E2 0.2 R1-O1-student 58 650.0 658.00 76.56 350.0 231.00 149.63 1350.0 0.76 -0.42 0.02 True
drop delay end E1 0.2 R1-O1-student 58 750.0 751.03 63.64 450.0 274.25 183.03 NaN 0.76 -0.39 0.00 False
drop delay end E2 0.2 R1-O1-student 58 750.0 758.00 76.56 450.0 274.25 183.03 1450.0 0.76 -0.39 0.00 False
drop delay centre E1 0.2 R1-O1-welch 59 650.0 649.48 87.64 350.0 244.50 173.26 NaN 0.76 -0.41 0.02 True
drop delay centre E2 0.2 R1-O1-welch 59 650.0 662.50 121.94 350.0 244.50 173.26 1350.0 0.76 -0.41 0.02 True
drop delay end E1 0.2 R1-O1-welch 59 750.0 744.21 80.58 450.0 260.20 181.12 NaN 0.76 -0.38 0.00 False
drop delay end E2 0.2 R1-O1-welch 59 750.0 762.50 121.94 450.0 274.00 203.65 1450.0 0.76 -0.38 0.00 False
drop delay centre E1 0.2 R1-O2-student 59 650.0 639.34 106.34 350.0 230.50 154.42 NaN 0.76 -0.41 0.02 True
drop delay centre E2 0.2 R1-O2-student 59 650.0 645.98 129.49 350.0 230.50 154.42 1350.0 0.76 -0.41 0.02 True
drop delay end E1 0.2 R1-O2-student 59 750.0 735.31 102.06 450.0 248.00 187.67 NaN 0.76 -0.39 -0.01 False
drop delay end E2 0.2 R1-O2-student 59 750.0 745.98 129.49 450.0 248.00 187.67 1450.0 0.76 -0.39 -0.01 False
drop delay centre E1 0.2 R1-O2-welch 59 650.0 639.34 106.34 350.0 230.50 154.42 NaN 0.76 -0.41 0.02 True
drop delay centre E2 0.2 R1-O2-welch 59 650.0 645.98 129.49 350.0 230.50 154.42 1350.0 0.76 -0.41 0.02 True
drop delay end E1 0.2 R1-O2-welch 59 750.0 735.31 102.06 450.0 248.00 187.67 NaN 0.76 -0.39 -0.01 False
drop delay end E2 0.2 R1-O2-welch 59 750.0 745.98 129.49 450.0 248.00 187.67 1450.0 0.76 -0.39 -0.01 False
drop delay centre E1 0.2 R2-O1-student 58 650.0 642.56 97.84 350.0 233.42 171.68 NaN 0.76 -0.41 0.02 True
drop delay centre E2 0.2 R2-O1-student 58 650.0 650.50 108.63 350.0 237.75 181.83 1350.0 0.76 -0.41 0.02 True
drop delay end E1 0.2 R2-O1-student 58 750.0 739.90 94.75 450.0 274.49 189.35 NaN 0.76 -0.39 -0.01 False
drop delay end E2 0.2 R2-O1-student 58 750.0 750.50 108.63 450.0 289.25 214.59 1450.0 0.76 -0.39 -0.01 False
drop delay centre E1 0.2 R2-O1-welch 60 650.0 645.31 108.75 350.0 227.00 164.23 NaN 0.76 -0.40 0.02 True
drop delay centre E2 0.2 R2-O1-welch 60 650.0 666.50 169.12 350.0 227.00 164.23 1350.0 0.76 -0.40 0.02 True
drop delay end E1 0.2 R2-O1-welch 60 750.0 741.53 105.32 450.0 264.14 185.19 NaN 0.76 -0.37 -0.00 False
drop delay end E2 0.2 R2-O1-welch 60 750.0 766.50 169.12 450.0 271.00 196.49 1450.0 0.76 -0.37 -0.00 False
drop delay centre E1 0.2 R2-O2-student 58 650.0 629.74 106.40 350.0 217.25 166.18 NaN 0.76 -0.42 0.02 True
drop delay centre E2 0.2 R2-O2-student 58 650.0 640.50 129.46 350.0 217.25 166.18 1350.0 0.76 -0.42 0.02 True
drop delay end E1 0.2 R2-O2-student 58 750.0 728.35 104.88 450.0 240.20 186.46 NaN 0.76 -0.39 -0.01 False
drop delay end E2 0.2 R2-O2-student 58 750.0 740.50 129.46 450.0 244.00 193.56 1450.0 0.76 -0.39 -0.01 False
drop delay centre E1 0.2 R2-O2-welch 59 650.0 639.34 106.34 350.0 230.50 154.42 NaN 0.76 -0.41 0.02 True
drop delay centre E2 0.2 R2-O2-welch 59 650.0 645.98 129.49 350.0 230.50 154.42 1350.0 0.76 -0.41 0.02 True
drop delay end E1 0.2 R2-O2-welch 59 750.0 735.31 102.06 450.0 248.00 187.67 NaN 0.76 -0.39 -0.01 False
drop delay end E2 0.2 R2-O2-welch 59 750.0 745.98 129.49 450.0 248.00 187.67 1450.0 0.76 -0.39 -0.01 False
drop bin centre E1 0.2 R1-O1-student 58 650.0 641.71 105.59 50.0 138.00 124.42 550.0 0.84 -0.42 -0.09 False
drop bin centre E2 0.2 R1-O1-student 58 650.0 643.75 109.19 50.0 138.00 124.42 550.0 0.84 -0.42 -0.09 False
drop bin end E1 0.2 R1-O1-student 58 750.0 740.45 112.13 150.0 154.25 139.98 650.0 0.84 -0.32 0.06 False
drop bin end E2 0.2 R1-O1-student 58 750.0 742.50 115.52 150.0 154.25 139.98 650.0 0.84 -0.32 0.06 False
drop bin centre E1 0.2 R1-O1-welch 59 650.0 624.87 122.62 50.0 142.25 138.12 550.0 0.84 -0.43 -0.09 False
drop bin centre E2 0.2 R1-O1-welch 59 650.0 634.25 135.42 50.0 142.25 138.12 550.0 0.84 -0.43 -0.09 False
drop bin end E1 0.2 R1-O1-welch 59 750.0 724.87 122.62 150.0 157.54 150.10 650.0 0.84 -0.30 0.06 False
drop bin end E2 0.2 R1-O1-welch 59 750.0 734.25 135.42 150.0 161.50 159.82 650.0 0.84 -0.30 0.06 False
drop bin centre E1 0.2 R1-O2-student 59 650.0 629.40 114.53 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin centre E2 0.2 R1-O2-student 59 650.0 631.75 118.97 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin end E1 0.2 R1-O2-student 59 750.0 728.89 117.26 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop bin end E2 0.2 R1-O2-student 59 750.0 731.25 121.60 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop bin centre E1 0.2 R1-O2-welch 59 650.0 629.40 114.53 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin centre E2 0.2 R1-O2-welch 59 650.0 631.75 118.97 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin end E1 0.2 R1-O2-welch 59 750.0 728.89 117.26 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop bin end E2 0.2 R1-O2-welch 59 750.0 731.25 121.60 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop bin centre E1 0.2 R2-O1-student 58 650.0 621.07 142.58 50.0 153.77 141.86 550.0 0.84 -0.42 -0.09 False
drop bin centre E2 0.2 R2-O1-student 58 650.0 627.50 151.80 50.0 158.50 156.45 550.0 0.84 -0.42 -0.09 False
drop bin end E1 0.2 R2-O1-student 58 750.0 721.07 142.58 150.0 163.57 159.12 650.0 0.84 -0.31 0.06 False
drop bin end E2 0.2 R2-O1-student 58 750.0 727.50 151.80 150.0 168.75 174.75 650.0 0.84 -0.31 0.06 False
drop bin centre E1 0.2 R2-O1-welch 60 650.0 623.97 133.76 50.0 131.25 118.26 550.0 0.84 -0.42 -0.09 False
drop bin centre E2 0.2 R2-O1-welch 60 650.0 639.25 158.97 50.0 131.25 118.26 550.0 0.84 -0.42 -0.09 False
drop bin end E1 0.2 R2-O1-welch 60 750.0 723.97 133.76 150.0 157.50 142.54 650.0 0.84 -0.29 0.05 False
drop bin end E2 0.2 R2-O1-welch 60 750.0 739.25 158.97 150.0 157.50 142.54 650.0 0.84 -0.29 0.05 False
drop bin centre E1 0.2 R2-O2-student 58 650.0 618.53 125.24 50.0 117.25 111.42 550.0 0.86 -0.41 -0.10 False
drop bin centre E2 0.2 R2-O2-student 58 650.0 627.00 142.46 50.0 117.25 111.42 550.0 0.86 -0.41 -0.10 False
drop bin end E1 0.2 R2-O2-student 58 750.0 718.27 126.44 150.0 154.25 130.94 650.0 0.86 -0.27 0.05 False
drop bin end E2 0.2 R2-O2-student 58 750.0 726.75 143.52 150.0 154.25 130.94 650.0 0.86 -0.27 0.05 False
drop bin centre E1 0.2 R2-O2-welch 59 650.0 629.40 114.53 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin centre E2 0.2 R2-O2-welch 59 650.0 631.75 118.97 50.0 108.75 109.82 550.0 0.87 -0.41 -0.10 False
drop bin end E1 0.2 R2-O2-welch 59 750.0 728.89 117.26 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop bin end E2 0.2 R2-O2-welch 59 750.0 731.25 121.60 150.0 152.25 129.06 650.0 0.87 -0.27 0.05 False
drop trial centre E1 0.4 R1-O1-student 58 700.0 675.51 86.53 250.0 277.53 154.11 NaN 0.74 -0.46 0.08 True
drop trial centre E2 0.4 R1-O1-student 58 700.0 688.94 147.01 250.0 284.50 168.33 1450.0 0.74 -0.46 0.08 True
drop trial end E1 0.4 R1-O1-student 58 900.0 838.89 55.19 450.0 465.99 163.44 NaN 0.74 -0.34 -0.17 False
drop trial end E2 0.4 R1-O1-student 58 900.0 888.94 147.01 450.0 476.00 181.52 1650.0 0.74 -0.34 -0.17 False
drop trial centre E1 0.4 R1-O1-welch 59 700.0 675.13 97.13 250.0 289.29 170.20 NaN 0.75 -0.45 0.08 True
drop trial centre E2 0.4 R1-O1-welch 59 700.0 694.47 156.42 250.0 302.75 193.08 1450.0 0.75 -0.45 0.08 True
drop trial end E1 0.4 R1-O1-welch 59 900.0 829.43 67.39 450.0 470.31 157.55 NaN 0.75 -0.33 -0.16 False
drop trial end E2 0.4 R1-O1-welch 59 900.0 894.47 156.42 450.0 496.75 201.62 1650.0 0.75 -0.33 -0.16 False
drop trial centre E1 0.4 R1-O2-student 59 700.0 684.97 99.26 250.0 290.10 176.45 NaN 0.75 -0.45 0.08 True
drop trial centre E2 0.4 R1-O2-student 59 700.0 700.51 140.25 250.0 300.50 194.36 1450.0 0.75 -0.45 0.08 True
drop trial end E1 0.4 R1-O2-student 59 900.0 836.33 67.80 450.0 472.16 175.27 NaN 0.75 -0.34 -0.16 False
drop trial end E2 0.4 R1-O2-student 59 900.0 900.51 140.25 450.0 492.00 206.42 1650.0 0.75 -0.34 -0.16 False
drop trial centre E1 0.4 R1-O2-welch 59 700.0 684.97 99.26 250.0 290.10 176.45 NaN 0.75 -0.45 0.08 True
drop trial centre E2 0.4 R1-O2-welch 59 700.0 700.51 140.25 250.0 300.50 194.36 1450.0 0.75 -0.45 0.08 True
drop trial end E1 0.4 R1-O2-welch 59 900.0 836.33 67.80 450.0 472.16 175.27 NaN 0.75 -0.34 -0.16 False
drop trial end E2 0.4 R1-O2-welch 59 900.0 900.51 140.25 450.0 492.00 206.42 1650.0 0.75 -0.34 -0.16 False
drop trial centre E1 0.4 R2-O1-student 58 700.0 690.11 95.18 250.0 295.38 177.46 NaN 0.75 -0.46 0.08 True
drop trial centre E2 0.4 R2-O1-student 58 700.0 736.68 226.64 250.0 312.50 205.29 1450.0 0.75 -0.46 0.08 True
drop trial end E1 0.4 R2-O1-student 58 900.0 840.48 72.30 450.0 472.92 182.49 NaN 0.75 -0.34 -0.17 False
drop trial end E2 0.4 R2-O1-student 58 900.0 936.68 226.64 450.0 499.75 222.18 1650.0 0.75 -0.34 -0.17 False
drop trial centre E1 0.4 R2-O1-welch 60 700.0 682.63 108.28 250.0 301.02 173.28 NaN 0.75 -0.44 0.08 True
drop trial centre E2 0.4 R2-O1-welch 60 700.0 706.57 178.04 250.0 311.00 190.08 1450.0 0.75 -0.44 0.08 True
drop trial end E1 0.4 R2-O1-welch 60 900.0 831.82 87.96 450.0 485.57 171.03 NaN 0.75 -0.33 -0.16 False
drop trial end E2 0.4 R2-O1-welch 60 900.0 906.57 178.04 450.0 504.75 200.85 1650.0 0.75 -0.33 -0.16 False
drop trial centre E1 0.4 R2-O2-student 58 700.0 668.35 116.33 250.0 273.50 169.70 NaN 0.75 -0.46 0.08 True
drop trial centre E2 0.4 R2-O2-student 58 700.0 709.34 228.30 250.0 273.50 169.70 1450.0 0.75 -0.46 0.08 True
drop trial end E1 0.4 R2-O2-student 58 900.0 828.62 100.47 450.0 454.55 180.08 NaN 0.75 -0.34 -0.17 False
drop trial end E2 0.4 R2-O2-student 58 900.0 909.34 228.30 450.0 460.75 189.53 1650.0 0.75 -0.34 -0.17 False
drop trial centre E1 0.4 R2-O2-welch 59 700.0 684.97 99.26 250.0 290.10 176.45 NaN 0.75 -0.45 0.08 True
drop trial centre E2 0.4 R2-O2-welch 59 700.0 700.51 140.25 250.0 300.50 194.36 1450.0 0.75 -0.45 0.08 True
drop trial end E1 0.4 R2-O2-welch 59 900.0 836.33 67.80 450.0 472.16 175.27 NaN 0.75 -0.34 -0.16 False
drop trial end E2 0.4 R2-O2-welch 59 900.0 900.51 140.25 450.0 492.00 206.42 1650.0 0.75 -0.34 -0.16 False
drop delay centre E1 0.4 R1-O1-student 58 650.0 670.20 88.60 250.0 266.00 176.55 NaN 0.74 -0.40 0.14 True
drop delay centre E2 0.4 R1-O1-student 58 650.0 675.88 119.13 250.0 266.00 176.55 NaN 0.74 -0.40 0.14 True
drop delay end E1 0.4 R1-O1-student 58 850.0 829.14 51.90 450.0 424.62 188.75 NaN 0.74 -0.34 -0.16 False
drop delay end E2 0.4 R1-O1-student 58 850.0 875.88 119.13 450.0 438.50 205.59 NaN 0.74 -0.34 -0.16 False
drop delay centre E1 0.4 R1-O1-welch 59 650.0 671.17 92.57 250.0 258.72 176.00 NaN 0.74 -0.39 0.14 True
drop delay centre E2 0.4 R1-O1-welch 59 650.0 675.38 109.52 250.0 276.50 206.27 NaN 0.74 -0.39 0.14 True
drop delay end E1 0.4 R1-O1-welch 59 850.0 825.34 51.43 450.0 439.49 201.74 NaN 0.74 -0.33 -0.15 False
drop delay end E2 0.4 R1-O1-welch 59 850.0 875.38 109.52 450.0 457.75 229.57 NaN 0.74 -0.33 -0.15 False
drop delay centre E1 0.4 R1-O2-student 59 650.0 664.80 99.54 250.0 259.44 195.09 NaN 0.74 -0.39 0.14 True
drop delay centre E2 0.4 R1-O2-student 59 650.0 670.56 127.93 250.0 274.25 219.32 NaN 0.74 -0.39 0.14 True
drop delay end E1 0.4 R1-O2-student 59 850.0 816.55 69.64 450.0 417.62 217.86 NaN 0.74 -0.33 -0.15 False
drop delay end E2 0.4 R1-O2-student 59 850.0 870.56 127.93 450.0 443.25 253.16 NaN 0.74 -0.33 -0.15 False
drop delay centre E1 0.4 R1-O2-welch 59 650.0 664.80 99.54 250.0 259.44 195.09 NaN 0.74 -0.39 0.14 True
drop delay centre E2 0.4 R1-O2-welch 59 650.0 670.56 127.93 250.0 274.25 219.32 NaN 0.74 -0.39 0.14 True
drop delay end E1 0.4 R1-O2-welch 59 850.0 816.55 69.64 450.0 417.62 217.86 NaN 0.74 -0.33 -0.15 False
drop delay end E2 0.4 R1-O2-welch 59 850.0 870.56 127.93 450.0 443.25 253.16 NaN 0.74 -0.33 -0.15 False
drop delay centre E1 0.4 R2-O1-student 58 650.0 676.04 84.93 250.0 284.18 202.99 NaN 0.74 -0.40 0.14 True
drop delay centre E2 0.4 R2-O1-student 58 650.0 688.21 132.78 250.0 298.00 223.04 NaN 0.74 -0.40 0.14 True
drop delay end E1 0.4 R2-O1-student 58 850.0 833.21 57.72 450.0 441.36 212.17 NaN 0.74 -0.34 -0.16 False
drop delay end E2 0.4 R2-O1-student 58 850.0 888.21 132.78 450.0 472.25 251.68 NaN 0.74 -0.34 -0.16 False
drop delay centre E1 0.4 R2-O1-welch 60 650.0 667.71 100.25 250.0 280.30 192.58 NaN 0.74 -0.38 0.13 True
drop delay centre E2 0.4 R2-O1-welch 60 650.0 677.44 129.01 250.0 287.50 204.56 NaN 0.74 -0.38 0.13 True
drop delay end E1 0.4 R2-O1-welch 60 850.0 821.22 73.69 450.0 439.38 203.35 NaN 0.74 -0.32 -0.15 False
drop delay end E2 0.4 R2-O1-welch 60 850.0 877.44 129.01 450.0 462.75 234.73 NaN 0.74 -0.32 -0.15 False
drop delay centre E1 0.4 R2-O2-student 58 650.0 657.47 103.71 250.0 260.50 194.27 NaN 0.74 -0.40 0.14 True
drop delay centre E2 0.4 R2-O2-student 58 650.0 678.28 178.05 250.0 260.50 194.27 NaN 0.74 -0.40 0.14 True
drop delay end E1 0.4 R2-O2-student 58 850.0 815.54 77.95 450.0 409.69 220.41 NaN 0.74 -0.34 -0.16 False
drop delay end E2 0.4 R2-O2-student 58 850.0 878.28 178.05 450.0 422.50 236.05 NaN 0.74 -0.34 -0.16 False
drop delay centre E1 0.4 R2-O2-welch 59 650.0 664.80 99.54 250.0 259.44 195.09 NaN 0.74 -0.39 0.14 True
drop delay centre E2 0.4 R2-O2-welch 59 650.0 670.56 127.93 250.0 274.25 219.32 NaN 0.74 -0.39 0.14 True
drop delay end E1 0.4 R2-O2-welch 59 850.0 816.55 69.64 450.0 417.62 217.86 NaN 0.74 -0.33 -0.15 False
drop delay end E2 0.4 R2-O2-welch 59 850.0 870.56 127.93 450.0 443.25 253.16 NaN 0.74 -0.33 -0.15 False
drop bin centre E1 0.4 R1-O1-student 58 700.0 660.77 85.41 200.0 194.75 134.01 NaN 0.69 -0.49 0.04 True
drop bin centre E2 0.4 R1-O1-student 58 700.0 678.14 153.23 200.0 194.75 134.01 1550.0 0.69 -0.49 0.04 True
drop bin end E1 0.4 R1-O1-student 58 900.0 828.98 60.55 400.0 282.75 212.93 NaN 0.69 -0.36 -0.14 False
drop bin end E2 0.4 R1-O1-student 58 900.0 878.14 153.23 400.0 282.75 212.93 1750.0 0.69 -0.36 -0.14 False
drop bin centre E1 0.4 R1-O1-welch 59 650.0 654.97 93.44 200.0 193.18 135.18 NaN 0.69 -0.47 0.04 True
drop bin centre E2 0.4 R1-O1-welch 59 650.0 677.50 141.49 200.0 201.00 155.40 1450.0 0.69 -0.47 0.04 True
drop bin end E1 0.4 R1-O1-welch 59 850.0 820.59 68.01 400.0 288.64 207.22 NaN 0.69 -0.35 -0.13 False
drop bin end E2 0.4 R1-O1-welch 59 850.0 877.50 141.49 400.0 297.50 224.26 1650.0 0.69 -0.35 -0.13 False
drop bin centre E1 0.4 R1-O2-student 59 650.0 668.21 97.48 250.0 197.99 158.58 NaN 0.71 -0.44 0.04 True
drop bin centre E2 0.4 R1-O2-student 59 650.0 682.50 137.27 250.0 201.75 166.84 NaN 0.71 -0.44 0.04 True
drop bin end E1 0.4 R1-O2-student 59 850.0 831.37 73.18 450.0 317.09 221.20 NaN 0.71 -0.34 -0.13 False
drop bin end E2 0.4 R1-O2-student 59 850.0 882.50 137.27 450.0 321.25 228.33 NaN 0.71 -0.34 -0.13 False
drop bin centre E1 0.4 R1-O2-welch 59 650.0 668.21 97.48 250.0 197.99 158.58 NaN 0.71 -0.44 0.04 True
drop bin centre E2 0.4 R1-O2-welch 59 650.0 682.50 137.27 250.0 201.75 166.84 NaN 0.71 -0.44 0.04 True
drop bin end E1 0.4 R1-O2-welch 59 850.0 831.37 73.18 450.0 317.09 221.20 NaN 0.71 -0.34 -0.13 False
drop bin end E2 0.4 R1-O2-welch 59 850.0 882.50 137.27 450.0 321.25 228.33 NaN 0.71 -0.34 -0.13 False
drop bin centre E1 0.4 R2-O1-student 58 700.0 672.77 90.47 250.0 225.90 158.14 NaN 0.69 -0.48 0.04 True
drop bin centre E2 0.4 R2-O1-student 58 700.0 702.00 179.15 250.0 245.50 198.57 NaN 0.69 -0.48 0.04 True
drop bin end E1 0.4 R2-O1-student 58 900.0 836.46 71.98 450.0 336.41 229.96 NaN 0.69 -0.36 -0.14 False
drop bin end E2 0.4 R2-O1-student 58 900.0 902.00 179.15 450.0 358.25 264.99 NaN 0.69 -0.36 -0.14 False
drop bin centre E1 0.4 R2-O1-welch 60 650.0 659.74 107.47 200.0 205.30 139.75 NaN 0.69 -0.46 0.04 True
drop bin centre E2 0.4 R2-O1-welch 60 650.0 686.75 165.41 200.0 212.75 157.56 NaN 0.69 -0.46 0.04 True
drop bin end E1 0.4 R2-O1-welch 60 850.0 827.48 95.37 400.0 310.35 211.85 NaN 0.69 -0.34 -0.13 False
drop bin end E2 0.4 R2-O1-welch 60 850.0 886.75 165.41 400.0 318.75 226.74 NaN 0.69 -0.34 -0.13 False
drop bin centre E1 0.4 R2-O2-student 58 650.0 647.34 107.03 250.0 199.75 162.83 NaN 0.71 -0.45 0.03 True
drop bin centre E2 0.4 R2-O2-student 58 650.0 696.75 238.59 250.0 199.75 162.83 NaN 0.71 -0.45 0.03 True
drop bin end E1 0.4 R2-O2-student 58 850.0 819.43 93.86 450.0 324.75 228.53 NaN 0.71 -0.35 -0.13 False
drop bin end E2 0.4 R2-O2-student 58 850.0 896.75 238.59 450.0 324.75 228.53 NaN 0.71 -0.35 -0.13 False
drop bin centre E1 0.4 R2-O2-welch 59 650.0 668.21 97.48 250.0 197.99 158.58 NaN 0.71 -0.44 0.04 True
drop bin centre E2 0.4 R2-O2-welch 59 650.0 682.50 137.27 250.0 201.75 166.84 NaN 0.71 -0.44 0.04 True
drop bin end E1 0.4 R2-O2-welch 59 850.0 831.37 73.18 450.0 317.09 221.20 NaN 0.71 -0.34 -0.13 False
drop bin end E2 0.4 R2-O2-welch 59 850.0 882.50 137.27 450.0 321.25 228.33 NaN 0.71 -0.34 -0.13 False
keep trial centre E1 0.2 R1-O1-student 61 750.0 629.58 175.94 150.0 221.61 147.97 NaN 0.78 -0.44 -0.23 True
keep trial centre E2 0.2 R1-O1-student 61 750.0 771.75 311.43 150.0 225.25 156.28 1450.0 0.78 -0.44 -0.23 True
keep trial end E1 0.2 R1-O1-student 61 850.0 717.78 172.40 250.0 316.33 153.75 NaN 0.78 -0.36 -0.21 False
keep trial end E2 0.2 R1-O1-student 61 850.0 871.75 311.43 250.0 320.00 161.86 1550.0 0.78 -0.36 -0.21 False
keep trial centre E1 0.2 R1-O1-welch 60 750.0 618.31 194.24 150.0 221.00 145.29 NaN 0.78 -0.45 -0.24 True
keep trial centre E2 0.2 R1-O1-welch 60 750.0 792.00 376.41 150.0 221.00 145.29 1450.0 0.78 -0.45 -0.24 True
keep trial end E1 0.2 R1-O1-welch 60 850.0 708.09 192.15 250.0 312.25 155.12 NaN 0.78 -0.37 -0.21 False
keep trial end E2 0.2 R1-O1-welch 60 850.0 892.00 376.41 250.0 312.25 155.12 1550.0 0.78 -0.37 -0.21 False
keep trial centre E1 0.2 R1-O2-student 62 750.0 630.00 182.33 150.0 181.75 142.14 NaN 0.79 -0.42 -0.23 True
keep trial centre E2 0.2 R1-O2-student 62 750.0 776.01 327.01 150.0 181.75 142.14 1100.0 0.79 -0.42 -0.23 True
keep trial end E1 0.2 R1-O2-student 62 850.0 716.29 180.54 250.0 267.34 145.67 NaN 0.79 -0.34 -0.21 False
keep trial end E2 0.2 R1-O2-student 62 850.0 875.76 327.59 250.0 270.75 153.07 1200.0 0.79 -0.34 -0.21 False
keep trial centre E1 0.2 R1-O2-welch 62 NaN 667.50 141.81 150.0 226.75 164.84 NaN 0.73 -0.46 -0.27 False
keep trial centre E2 0.2 R1-O2-welch 62 950.0 850.77 330.33 150.0 226.75 164.84 1450.0 0.73 -0.46 -0.27 False
keep trial end E1 0.2 R1-O2-welch 62 NaN 750.45 135.76 250.0 317.34 165.91 NaN 0.73 -0.37 -0.25 False
keep trial end E2 0.2 R1-O2-welch 62 1050.0 950.77 330.33 250.0 320.50 171.41 1550.0 0.73 -0.37 -0.25 False
keep trial centre E1 0.2 R2-O1-student 61 750.0 622.30 180.54 150.0 219.25 157.93 NaN 0.78 -0.44 -0.24 True
keep trial centre E2 0.2 R2-O1-student 61 750.0 783.50 355.18 150.0 219.25 157.93 1450.0 0.78 -0.44 -0.24 True
keep trial end E1 0.2 R2-O1-student 61 850.0 715.56 178.83 250.0 309.25 167.79 NaN 0.78 -0.37 -0.22 False
keep trial end E2 0.2 R2-O1-student 61 850.0 883.50 355.18 250.0 309.25 167.79 1550.0 0.78 -0.37 -0.22 False
keep trial centre E1 0.2 R2-O1-welch 62 750.0 644.24 165.24 150.0 240.50 161.35 NaN 0.79 -0.43 -0.23 True
keep trial centre E2 0.2 R2-O1-welch 62 750.0 793.25 320.30 150.0 240.50 161.35 1450.0 0.79 -0.43 -0.23 True
keep trial end E1 0.2 R2-O1-welch 62 850.0 734.96 162.91 250.0 324.24 159.68 NaN 0.79 -0.36 -0.21 False
keep trial end E2 0.2 R2-O1-welch 62 850.0 893.25 320.30 250.0 330.50 170.65 1550.0 0.79 -0.36 -0.21 False
keep trial centre E1 0.2 R2-O2-student 61 750.0 649.32 165.00 150.0 202.00 149.90 NaN 0.79 -0.43 -0.23 True
keep trial centre E2 0.2 R2-O2-student 61 750.0 772.75 298.91 150.0 202.00 149.90 1100.0 0.79 -0.43 -0.23 True
keep trial end E1 0.2 R2-O2-student 61 850.0 734.19 160.85 250.0 294.00 158.16 NaN 0.79 -0.34 -0.21 False
keep trial end E2 0.2 R2-O2-student 61 850.0 872.75 298.91 250.0 294.00 158.16 1200.0 0.79 -0.34 -0.21 False
keep trial centre E1 0.2 R2-O2-welch 61 NaN 663.31 151.22 150.0 226.38 162.25 NaN 0.73 -0.46 -0.27 False
keep trial centre E2 0.2 R2-O2-welch 61 950.0 846.25 336.60 150.0 230.00 169.71 1450.0 0.73 -0.46 -0.27 False
keep trial end E1 0.2 R2-O2-welch 61 NaN 743.81 144.08 250.0 316.83 172.13 NaN 0.73 -0.38 -0.25 False
keep trial end E2 0.2 R2-O2-welch 61 1050.0 946.25 336.60 250.0 320.50 179.32 1550.0 0.73 -0.38 -0.25 False
keep delay centre E1 0.2 R1-O1-student 61 700.0 573.62 166.92 150.0 225.25 171.76 600.0 0.81 -0.38 -0.18 False
keep delay centre E2 0.2 R1-O1-student 61 700.0 685.18 337.99 150.0 225.25 171.76 600.0 0.81 -0.38 -0.18 False
keep delay end E1 0.2 R1-O1-student 61 800.0 666.04 161.88 250.0 311.00 184.94 700.0 0.81 -0.34 -0.17 False
keep delay end E2 0.2 R1-O1-student 61 800.0 785.18 337.99 250.0 311.00 184.94 700.0 0.81 -0.34 -0.17 False
keep delay centre E1 0.2 R1-O1-welch 60 700.0 564.24 171.34 150.0 219.50 159.59 600.0 0.81 -0.38 -0.18 False
keep delay centre E2 0.2 R1-O1-welch 60 700.0 693.22 392.51 150.0 219.50 159.59 600.0 0.81 -0.38 -0.18 False
keep delay end E1 0.2 R1-O1-welch 60 800.0 660.74 169.42 250.0 303.50 175.46 700.0 0.81 -0.35 -0.18 False
keep delay end E2 0.2 R1-O1-welch 60 800.0 793.22 392.51 250.0 303.50 175.46 700.0 0.81 -0.35 -0.18 False
keep delay centre E1 0.2 R1-O2-student 62 700.0 578.29 150.66 150.0 174.50 154.76 600.0 0.83 -0.35 -0.17 False
keep delay centre E2 0.2 R1-O2-student 62 700.0 649.75 289.92 150.0 174.50 154.76 600.0 0.83 -0.35 -0.17 False
keep delay end E1 0.2 R1-O2-student 62 800.0 676.72 149.68 250.0 239.39 157.44 700.0 0.83 -0.32 -0.16 False
keep delay end E2 0.2 R1-O2-student 62 800.0 749.75 289.92 250.0 246.50 171.87 700.0 0.83 -0.32 -0.16 False
keep delay centre E1 0.2 R1-O2-welch 62 700.0 597.67 142.40 150.0 219.50 183.22 NaN 0.77 -0.38 -0.21 True
keep delay centre E2 0.2 R1-O2-welch 62 700.0 733.42 342.14 150.0 219.50 183.22 1450.0 0.77 -0.38 -0.21 True
keep delay end E1 0.2 R1-O2-welch 62 800.0 691.50 137.07 250.0 302.26 190.17 NaN 0.77 -0.36 -0.21 False
keep delay end E2 0.2 R1-O2-welch 62 800.0 833.42 342.14 250.0 305.50 195.11 1550.0 0.77 -0.36 -0.21 False
keep delay centre E1 0.2 R2-O1-student 61 700.0 589.75 165.42 150.0 224.00 184.46 600.0 0.81 -0.38 -0.18 False
keep delay centre E2 0.2 R2-O1-student 61 700.0 696.46 331.87 150.0 224.00 184.46 600.0 0.81 -0.38 -0.18 False
keep delay end E1 0.2 R2-O1-student 61 800.0 682.80 161.57 250.0 297.72 182.50 700.0 0.81 -0.35 -0.18 False
keep delay end E2 0.2 R2-O1-student 61 800.0 796.46 331.87 250.0 307.50 197.72 700.0 0.81 -0.35 -0.18 False
keep delay centre E1 0.2 R2-O1-welch 62 700.0 579.43 169.06 150.0 234.75 180.01 600.0 0.81 -0.37 -0.18 False
keep delay centre E2 0.2 R2-O1-welch 62 700.0 686.18 300.41 150.0 234.75 180.01 600.0 0.81 -0.37 -0.18 False
keep delay end E1 0.2 R2-O1-welch 62 800.0 673.87 165.82 250.0 314.14 182.30 700.0 0.81 -0.34 -0.18 False
keep delay end E2 0.2 R2-O1-welch 62 800.0 786.18 300.41 250.0 320.50 192.11 700.0 0.81 -0.34 -0.18 False
keep delay centre E1 0.2 R2-O2-student 61 700.0 574.71 155.19 150.0 201.25 151.45 600.0 0.83 -0.36 -0.17 False
keep delay centre E2 0.2 R2-O2-student 61 700.0 661.50 315.74 150.0 201.25 151.45 600.0 0.83 -0.36 -0.17 False
keep delay end E1 0.2 R2-O2-student 61 800.0 669.82 152.13 250.0 288.00 163.57 700.0 0.83 -0.33 -0.17 False
keep delay end E2 0.2 R2-O2-student 61 800.0 761.50 315.74 250.0 288.00 163.57 700.0 0.83 -0.33 -0.17 False
keep delay centre E1 0.2 R2-O2-welch 61 700.0 608.88 151.54 150.0 258.25 206.14 NaN 0.77 -0.40 -0.22 True
keep delay centre E2 0.2 R2-O2-welch 61 700.0 731.91 321.08 150.0 258.25 206.14 1450.0 0.77 -0.40 -0.22 True
keep delay end E1 0.2 R2-O2-welch 61 800.0 692.31 140.47 250.0 326.53 206.86 NaN 0.77 -0.37 -0.22 False
keep delay end E2 0.2 R2-O2-welch 61 800.0 831.91 321.08 250.0 339.00 222.61 1550.0 0.77 -0.37 -0.22 False
keep bin centre E1 0.2 R1-O1-student 61 700.0 532.77 241.04 50.0 150.25 144.70 550.0 0.91 -0.38 -0.24 False
keep bin centre E2 0.2 R1-O1-student 61 700.0 674.00 331.51 50.0 150.25 144.70 550.0 0.91 -0.38 -0.24 False
keep bin end E1 0.2 R1-O1-student 61 800.0 619.01 236.37 50.0 131.00 156.97 650.0 0.91 -0.28 -0.21 False
keep bin end E2 0.2 R1-O1-student 61 800.0 774.00 331.51 50.0 131.00 156.97 650.0 0.91 -0.28 -0.21 False
keep bin centre E1 0.2 R1-O1-welch 60 700.0 558.72 227.75 50.0 144.00 138.61 550.0 0.91 -0.39 -0.24 False
keep bin centre E2 0.2 R1-O1-welch 60 700.0 687.50 301.53 50.0 144.00 138.61 550.0 0.91 -0.39 -0.24 False
keep bin end E1 0.2 R1-O1-welch 60 800.0 641.84 222.46 50.0 121.50 137.89 650.0 0.91 -0.28 -0.21 False
keep bin end E2 0.2 R1-O1-welch 60 800.0 787.50 301.53 50.0 121.50 137.89 650.0 0.91 -0.28 -0.21 False
keep bin centre E1 0.2 R1-O2-student 62 700.0 588.65 191.64 50.0 109.50 112.85 550.0 0.92 -0.35 -0.23 False
keep bin centre E2 0.2 R1-O2-student 62 700.0 677.75 261.09 50.0 109.50 112.85 550.0 0.92 -0.35 -0.23 False
keep bin end E1 0.2 R1-O2-student 62 800.0 675.16 186.86 100.0 111.75 116.83 650.0 0.92 -0.24 -0.18 False
keep bin end E2 0.2 R1-O2-student 62 800.0 777.75 261.09 100.0 111.75 116.83 650.0 0.92 -0.24 -0.18 False
keep bin centre E1 0.2 R1-O2-welch 62 700.0 631.48 157.61 50.0 124.25 133.13 550.0 0.85 -0.37 -0.25 False
keep bin centre E2 0.2 R1-O2-welch 62 700.0 770.35 264.86 50.0 124.25 133.13 550.0 0.85 -0.37 -0.25 False
keep bin end E1 0.2 R1-O2-welch 62 800.0 715.87 151.53 50.0 126.25 146.45 650.0 0.85 -0.27 -0.21 False
keep bin end E2 0.2 R1-O2-welch 62 800.0 870.35 264.86 50.0 126.25 146.45 650.0 0.85 -0.27 -0.21 False
keep bin centre E1 0.2 R2-O1-student 61 700.0 556.29 223.70 50.0 159.25 158.44 550.0 0.90 -0.38 -0.24 False
keep bin centre E2 0.2 R2-O1-student 61 700.0 676.50 292.66 50.0 159.25 158.44 550.0 0.90 -0.38 -0.24 False
keep bin end E1 0.2 R2-O1-student 61 800.0 645.89 220.17 50.0 141.25 169.66 650.0 0.90 -0.27 -0.20 False
keep bin end E2 0.2 R2-O1-student 61 800.0 776.50 292.66 50.0 141.25 169.66 650.0 0.90 -0.27 -0.20 False
keep bin centre E1 0.2 R2-O1-welch 62 700.0 549.03 236.28 50.0 172.25 168.35 550.0 0.91 -0.37 -0.23 False
keep bin centre E2 0.2 R2-O1-welch 62 700.0 675.25 321.52 50.0 172.25 168.35 550.0 0.91 -0.37 -0.23 False
keep bin end E1 0.2 R2-O1-welch 62 800.0 630.00 230.40 50.0 145.98 177.39 650.0 0.91 -0.27 -0.20 False
keep bin end E2 0.2 R2-O1-welch 62 800.0 775.25 321.52 50.0 150.00 185.81 650.0 0.91 -0.27 -0.20 False
keep bin centre E1 0.2 R2-O2-student 61 700.0 573.03 214.93 50.0 119.00 119.64 550.0 0.91 -0.36 -0.24 False
keep bin centre E2 0.2 R2-O2-student 61 700.0 657.00 271.30 50.0 119.00 119.64 550.0 0.91 -0.36 -0.24 False
keep bin end E1 0.2 R2-O2-student 61 800.0 664.38 212.53 100.0 122.00 125.86 650.0 0.91 -0.24 -0.18 False
keep bin end E2 0.2 R2-O2-student 61 800.0 757.00 271.30 100.0 122.00 125.86 650.0 0.91 -0.24 -0.18 False
keep bin centre E1 0.2 R2-O2-welch 61 700.0 634.83 163.30 50.0 141.75 151.39 550.0 0.84 -0.38 -0.25 False
keep bin centre E2 0.2 R2-O2-welch 61 700.0 755.75 265.15 50.0 141.75 151.39 550.0 0.84 -0.38 -0.25 False
keep bin end E1 0.2 R2-O2-welch 61 800.0 714.29 154.70 50.0 128.00 147.70 650.0 0.84 -0.27 -0.22 False
keep bin end E2 0.2 R2-O2-welch 61 800.0 855.75 265.15 50.0 128.00 147.70 650.0 0.84 -0.27 -0.22 False
keep trial centre E1 0.4 R1-O1-student 61 850.0 722.70 118.57 250.0 261.00 167.12 NaN 0.72 -0.38 -0.12 False
keep trial centre E2 0.4 R1-O1-student 61 850.0 884.46 358.92 250.0 261.00 167.12 NaN 0.72 -0.38 -0.12 False
keep trial end E1 0.4 R1-O1-student 61 NaN 807.81 67.44 450.0 435.79 169.06 NaN 0.72 -0.29 -0.29 False
keep trial end E2 0.4 R1-O1-student 61 1050.0 1084.46 358.92 450.0 445.50 185.35 NaN 0.72 -0.29 -0.29 False
keep trial centre E1 0.4 R1-O1-welch 60 850.0 717.59 123.95 250.0 255.53 150.19 NaN 0.72 -0.39 -0.12 False
keep trial centre E2 0.4 R1-O1-welch 60 850.0 868.95 363.40 250.0 259.00 157.62 NaN 0.72 -0.39 -0.12 False
keep trial end E1 0.4 R1-O1-welch 60 NaN 807.64 72.00 450.0 432.07 177.22 NaN 0.72 -0.30 -0.30 False
keep trial end E2 0.4 R1-O1-welch 60 1050.0 1068.95 363.40 450.0 438.25 187.01 NaN 0.72 -0.30 -0.30 False
keep trial centre E1 0.4 R1-O2-student 62 850.0 741.94 125.91 250.0 217.84 155.21 NaN 0.74 -0.35 -0.11 False
keep trial centre E2 0.4 R1-O2-student 62 850.0 859.42 331.77 250.0 221.75 164.36 NaN 0.74 -0.35 -0.11 False
keep trial end E1 0.4 R1-O2-student 62 NaN 814.84 90.86 450.0 399.75 170.00 NaN 0.74 -0.27 -0.28 False
keep trial end E2 0.4 R1-O2-student 62 1050.0 1059.42 331.77 450.0 407.00 184.05 NaN 0.74 -0.27 -0.28 False
keep trial centre E1 0.4 R1-O2-welch 62 850.0 745.35 118.85 250.0 263.13 172.93 NaN 0.69 -0.39 -0.16 False
keep trial centre E2 0.4 R1-O2-welch 62 850.0 956.42 424.66 250.0 270.00 185.14 NaN 0.69 -0.39 -0.16 False
keep trial end E1 0.4 R1-O2-welch 62 NaN 814.29 82.68 450.0 442.82 180.38 NaN 0.69 -0.32 -0.32 False
keep trial end E2 0.4 R1-O2-welch 62 1050.0 1156.42 424.66 450.0 457.50 200.92 NaN 0.69 -0.32 -0.32 False
keep trial centre E1 0.4 R2-O1-student 61 850.0 725.86 127.86 250.0 260.80 170.64 NaN 0.72 -0.39 -0.13 False
keep trial centre E2 0.4 R2-O1-student 61 850.0 880.93 356.81 250.0 264.50 178.02 NaN 0.72 -0.39 -0.13 False
keep trial end E1 0.4 R2-O1-student 61 NaN 804.03 98.09 450.0 436.15 172.20 NaN 0.72 -0.30 -0.30 False
keep trial end E2 0.4 R2-O1-student 61 1050.0 1080.93 356.81 450.0 451.50 195.63 NaN 0.72 -0.30 -0.30 False
keep trial centre E1 0.4 R2-O1-welch 62 850.0 743.15 119.16 250.0 276.77 169.42 NaN 0.72 -0.38 -0.12 False
keep trial centre E2 0.4 R2-O1-welch 62 850.0 910.21 391.45 250.0 284.50 185.57 NaN 0.72 -0.38 -0.12 False
keep trial end E1 0.4 R2-O1-welch 62 NaN 810.53 72.39 450.0 449.48 171.41 NaN 0.72 -0.29 -0.30 False
keep trial end E2 0.4 R2-O1-welch 62 1050.0 1110.21 391.45 450.0 469.50 204.68 NaN 0.72 -0.29 -0.30 False
keep trial centre E1 0.4 R2-O2-student 61 850.0 739.00 120.81 250.0 244.25 160.33 NaN 0.73 -0.36 -0.11 False
keep trial centre E2 0.4 R2-O2-student 61 850.0 860.99 321.17 250.0 244.25 160.33 NaN 0.73 -0.36 -0.11 False
keep trial end E1 0.4 R2-O2-student 61 NaN 815.57 88.96 450.0 430.75 179.42 NaN 0.73 -0.28 -0.29 False
keep trial end E2 0.4 R2-O2-student 61 1050.0 1060.99 321.17 450.0 430.75 179.42 NaN 0.73 -0.28 -0.29 False
keep trial centre E1 0.4 R2-O2-welch 61 850.0 746.40 119.45 250.0 273.48 191.66 NaN 0.69 -0.40 -0.16 False
keep trial centre E2 0.4 R2-O2-welch 61 850.0 915.71 369.26 250.0 280.50 203.09 NaN 0.69 -0.40 -0.16 False
keep trial end E1 0.4 R2-O2-welch 61 NaN 816.67 76.38 450.0 446.92 206.10 NaN 0.69 -0.32 -0.33 False
keep trial end E2 0.4 R2-O2-welch 61 1050.0 1115.71 369.26 450.0 462.50 226.15 NaN 0.69 -0.32 -0.33 False
keep delay centre E1 0.4 R1-O1-student 61 800.0 665.27 148.01 250.0 280.50 197.79 NaN 0.74 -0.31 -0.05 False
keep delay centre E2 0.4 R1-O1-student 61 800.0 739.73 303.45 250.0 280.50 197.79 1250.0 0.74 -0.31 -0.05 False
keep delay end E1 0.4 R1-O1-student 61 NaN 761.50 92.16 450.0 445.88 198.60 NaN 0.74 -0.27 -0.23 False
keep delay end E2 0.4 R1-O1-student 61 1000.0 939.73 303.45 450.0 463.00 218.59 1450.0 0.74 -0.27 -0.23 False
keep delay centre E1 0.4 R1-O1-welch 60 800.0 652.78 141.01 250.0 278.75 177.65 NaN 0.74 -0.31 -0.05 False
keep delay centre E2 0.4 R1-O1-welch 60 800.0 749.18 346.39 250.0 278.75 177.65 1250.0 0.74 -0.31 -0.05 False
keep delay end E1 0.4 R1-O1-welch 60 NaN 762.50 85.41 450.0 446.70 199.69 NaN 0.74 -0.27 -0.24 False
keep delay end E2 0.4 R1-O1-welch 60 1000.0 949.18 346.39 450.0 455.00 209.34 1450.0 0.74 -0.27 -0.24 False
keep delay centre E1 0.4 R1-O2-student 62 800.0 650.88 137.27 250.0 222.36 171.21 NaN 0.76 -0.28 -0.03 False
keep delay centre E2 0.4 R1-O2-student 62 800.0 726.19 300.64 250.0 226.00 178.32 1200.0 0.76 -0.28 -0.03 False
keep delay end E1 0.4 R1-O2-student 62 NaN 763.18 82.48 450.0 392.89 187.63 NaN 0.76 -0.24 -0.22 False
keep delay end E2 0.4 R1-O2-student 62 1000.0 926.19 300.64 450.0 403.25 204.33 1400.0 0.76 -0.24 -0.22 False
keep delay centre E1 0.4 R1-O2-welch 62 800.0 671.75 142.67 250.0 294.50 201.23 NaN 0.71 -0.33 -0.09 False
keep delay centre E2 0.4 R1-O2-welch 62 800.0 779.60 370.38 250.0 294.50 201.23 NaN 0.71 -0.33 -0.09 False
keep delay end E1 0.4 R1-O2-welch 62 NaN 765.17 83.60 450.0 468.30 200.16 NaN 0.71 -0.29 -0.26 False
keep delay end E2 0.4 R1-O2-welch 62 1000.0 979.60 370.38 450.0 483.75 215.92 NaN 0.71 -0.29 -0.26 False
keep delay centre E1 0.4 R2-O1-student 61 800.0 663.02 145.78 250.0 280.25 196.21 NaN 0.74 -0.31 -0.05 False
keep delay centre E2 0.4 R2-O1-student 61 800.0 727.45 296.07 250.0 280.25 196.21 1250.0 0.74 -0.31 -0.05 False
keep delay end E1 0.4 R2-O1-student 61 NaN 764.56 94.41 450.0 438.02 197.28 NaN 0.74 -0.27 -0.24 False
keep delay end E2 0.4 R2-O1-student 61 1000.0 927.45 296.07 450.0 460.50 222.69 1450.0 0.74 -0.27 -0.24 False
keep delay centre E1 0.4 R2-O1-welch 62 800.0 663.58 140.77 250.0 298.24 204.07 NaN 0.74 -0.31 -0.05 False
keep delay centre E2 0.4 R2-O1-welch 62 800.0 755.43 320.11 250.0 301.50 208.68 1250.0 0.74 -0.31 -0.05 False
keep delay end E1 0.4 R2-O1-welch 62 NaN 767.68 87.99 450.0 453.23 179.43 NaN 0.74 -0.26 -0.24 False
keep delay end E2 0.4 R2-O1-welch 62 1000.0 955.43 320.11 450.0 491.25 222.23 1450.0 0.74 -0.26 -0.24 False
keep delay centre E1 0.4 R2-O2-student 61 800.0 657.40 138.85 250.0 255.50 165.74 NaN 0.76 -0.29 -0.03 False
keep delay centre E2 0.4 R2-O2-student 61 800.0 715.05 254.77 250.0 255.50 165.74 1200.0 0.76 -0.29 -0.03 False
keep delay end E1 0.4 R2-O2-student 61 NaN 768.22 88.18 450.0 444.25 181.60 NaN 0.76 -0.25 -0.23 False
keep delay end E2 0.4 R2-O2-student 61 1000.0 915.05 254.77 450.0 444.25 181.60 1400.0 0.76 -0.25 -0.23 False
keep delay centre E1 0.4 R2-O2-welch 61 800.0 688.04 138.00 250.0 311.75 229.07 NaN 0.71 -0.33 -0.09 False
keep delay centre E2 0.4 R2-O2-welch 61 800.0 784.22 329.81 250.0 311.75 229.07 NaN 0.71 -0.33 -0.09 False
keep delay end E1 0.4 R2-O2-welch 61 NaN 772.09 74.94 450.0 457.03 211.38 NaN 0.71 -0.30 -0.27 False
keep delay end E2 0.4 R2-O2-welch 61 1000.0 984.22 329.81 450.0 497.50 248.33 NaN 0.71 -0.30 -0.27 False
keep bin centre E1 0.4 R1-O1-student 61 850.0 688.81 129.53 150.0 188.50 155.38 NaN 0.76 -0.43 -0.17 False
keep bin centre E2 0.4 R1-O1-student 61 850.0 891.96 370.16 150.0 188.50 155.38 NaN 0.76 -0.43 -0.17 False
keep bin end E1 0.4 R1-O1-student 61 NaN 782.64 70.79 350.0 280.25 227.10 NaN 0.76 -0.23 -0.28 False
keep bin end E2 0.4 R1-O1-student 61 1050.0 1091.96 370.16 350.0 280.25 227.10 NaN 0.76 -0.23 -0.28 False
keep bin centre E1 0.4 R1-O1-welch 60 850.0 680.29 132.68 150.0 193.25 156.10 NaN 0.76 -0.44 -0.18 False
keep bin centre E2 0.4 R1-O1-welch 60 850.0 880.10 374.66 150.0 193.25 156.10 NaN 0.76 -0.44 -0.18 False
keep bin end E1 0.4 R1-O1-welch 60 NaN 784.76 72.28 350.0 291.25 230.62 NaN 0.76 -0.23 -0.28 False
keep bin end E2 0.4 R1-O1-welch 60 1050.0 1080.10 374.66 350.0 291.25 230.62 NaN 0.76 -0.23 -0.28 False
keep bin centre E1 0.4 R1-O2-student 62 850.0 701.67 130.05 150.0 150.25 140.67 NaN 0.78 -0.39 -0.16 False
keep bin centre E2 0.4 R1-O2-student 62 850.0 856.09 346.43 150.0 150.25 140.67 NaN 0.78 -0.39 -0.16 False
keep bin end E1 0.4 R1-O2-student 62 NaN 787.01 61.58 350.0 257.04 195.17 NaN 0.78 -0.20 -0.26 False
keep bin end E2 0.4 R1-O2-student 62 1050.0 1056.09 346.43 350.0 261.00 202.56 NaN 0.78 -0.20 -0.26 False
keep bin centre E1 0.4 R1-O2-welch 62 850.0 712.88 129.92 250.0 180.15 157.70 NaN 0.74 -0.42 -0.17 False
keep bin centre E2 0.4 R1-O2-welch 62 850.0 910.91 364.02 250.0 184.25 167.60 NaN 0.74 -0.42 -0.17 False
keep bin end E1 0.4 R1-O2-welch 62 NaN 790.32 73.97 450.0 310.05 218.43 NaN 0.74 -0.24 -0.29 False
keep bin end E2 0.4 R1-O2-welch 62 1050.0 1110.91 364.02 450.0 314.50 226.75 NaN 0.74 -0.24 -0.29 False
keep bin centre E1 0.4 R2-O1-student 61 850.0 683.45 132.12 250.0 199.00 174.71 NaN 0.76 -0.43 -0.17 False
keep bin centre E2 0.4 R2-O1-student 61 850.0 854.36 339.30 250.0 199.00 174.71 NaN 0.76 -0.43 -0.17 False
keep bin end E1 0.4 R2-O1-student 61 NaN 790.96 87.17 450.0 297.22 233.88 NaN 0.76 -0.23 -0.28 False
keep bin end E2 0.4 R2-O1-student 61 1050.0 1054.36 339.30 450.0 304.50 243.83 NaN 0.76 -0.23 -0.28 False
keep bin centre E1 0.4 R2-O1-welch 62 850.0 696.50 140.39 150.0 206.53 182.00 NaN 0.76 -0.43 -0.17 False
keep bin centre E2 0.4 R2-O1-welch 62 850.0 878.28 365.61 150.0 210.50 189.97 NaN 0.76 -0.43 -0.17 False
keep bin end E1 0.4 R2-O1-welch 62 NaN 778.77 90.25 350.0 307.95 229.10 NaN 0.76 -0.22 -0.27 False
keep bin end E2 0.4 R2-O1-welch 62 1050.0 1078.28 365.61 350.0 326.75 255.34 NaN 0.76 -0.22 -0.27 False
keep bin centre E1 0.4 R2-O2-student 61 850.0 704.39 123.43 250.0 183.00 152.02 NaN 0.78 -0.40 -0.16 False
keep bin centre E2 0.4 R2-O2-student 61 850.0 856.85 327.61 250.0 183.00 152.02 NaN 0.78 -0.40 -0.16 False
keep bin end E1 0.4 R2-O2-student 61 NaN 798.70 66.44 450.0 313.75 209.40 NaN 0.78 -0.21 -0.26 False
keep bin end E2 0.4 R2-O2-student 61 1050.0 1056.85 327.61 450.0 313.75 209.40 NaN 0.78 -0.21 -0.26 False
keep bin centre E1 0.4 R2-O2-welch 61 850.0 721.18 123.97 250.0 198.74 190.51 NaN 0.74 -0.43 -0.18 False
keep bin centre E2 0.4 R2-O2-welch 61 850.0 912.24 393.70 250.0 203.50 201.53 NaN 0.74 -0.43 -0.18 False
keep bin end E1 0.4 R2-O2-welch 61 NaN 801.52 59.65 450.0 329.15 249.78 NaN 0.74 -0.24 -0.30 False
keep bin end E2 0.4 R2-O2-welch 61 1050.0 1112.24 393.70 450.0 334.25 259.35 NaN 0.74 -0.24 -0.30 False
early_lick H roc_ipsi_4_spots roc_ipsi_1_spot less_robust
drop H1 0.607 0.652 True
drop H2 0.672 0.641 False
keep H1 0.604 0.631 True
keep H2 0.643 0.642 False
early_lick pref label search sum size left4_ms right4_ms ipsi_ok contra_ok bil_no_recovery bil_larger_change less_robust holds outcome_here
drop bin centre E1 8 16 650-700 50-250 16 8 8 16 True True reproduced
drop bin centre E2 8 16 650-700 50-250 16 8 8 16 True True reproduced
drop bin end E1 0 16 750-900 150-450 8 8 8 16 True False not
drop bin end E2 0 16 750-900 150-450 8 8 8 16 True False not
drop delay centre E1 16 16 650-650 250-350 16 16 16 16 True True reproduced
drop delay centre E2 16 16 650-650 250-350 16 16 16 16 True True reproduced
drop delay end E1 0 16 750-850 450-450 8 0 16 16 True False not
drop delay end E2 0 16 750-850 450-450 8 0 16 16 True False not
drop trial centre E1 16 16 700-700 250-300 16 16 16 16 True True reproduced
drop trial centre E2 16 16 700-700 250-300 16 16 16 16 True True reproduced
drop trial end E1 0 16 800-900 400-450 0 0 16 16 True False not
drop trial end E2 0 16 800-900 400-450 0 0 16 16 True False not
keep bin centre E1 0 16 700-850 50-250 8 8 8 16 True False not
keep bin centre E2 0 16 700-850 50-250 8 8 8 16 True False not
keep bin end E1 0 16 800-800 50-450 0 6 8 8 True False not
keep bin end E2 0 16 800-1050 50-450 0 6 8 8 True False not
keep delay centre E1 2 16 700-800 150-250 8 16 10 16 True True reproduced
keep delay centre E2 2 16 700-800 150-250 8 16 10 16 True True reproduced
keep delay end E1 0 16 800-800 250-450 0 8 10 16 True False not
keep delay end E2 0 16 800-1000 250-450 0 8 10 16 True False not
keep trial centre E1 6 16 750-850 150-250 6 16 16 16 True True reproduced
keep trial centre E2 6 16 750-950 150-250 6 16 16 16 True True reproduced
keep trial end E1 0 16 850-850 250-450 0 8 16 10 True False not
keep trial end E2 0 16 850-1050 250-450 0 8 16 10 True False not
Outcomes over the method combinations (K, D, L, E): {'not': 14, 'reproduced': 10}
Included neurons: 58 to 62 ; paper 40 (tolerance 4)
Result: blocked (methods_underspecified). The answer gives neither the window label nor the other details, and the claims file now requires one outcome over all of them (K1, K2; D1 to D3; L1, L2; E1, E2); they differ. 10 of the 24 combinations have readings that hold, all with centre labels (L1), and 14 have none, among them every combination with end labels (L2). With lick-early trials dropped and centre labels the ipsilateral four-spot recovery is 650 to 700 ms (paper 490 +/- 280) and the contralateral one 50 to 350 ms (235 +/- 156); the selectivity change at the go cue is -0.38 to -0.49 after bilateral one-spot and -0.10 to +0.14 after ipsilateral four-spot photoinhibition. With end labels the ipsilateral time is 750 ms or more; 750 ms is inside the tolerance (210 to 770 ms), and the ipsilateral time holds in 8 of 16 readings for lick-early trials dropped with D2 or D3 and end labels, but these combinations fail on the other parts. With the preference set per bin (D3), bilateral selectivity reaches up to 0.87 of control before the go cue in half the readings. The end of the search (E1, E2) does not change which combinations hold. The four-spot ipsilateral ROC is below the one-spot ROC under H1 (0.607 against 0.652 with lick-early trials dropped, 0.604 against 0.631 kept). 58 to 62 neurons are included, against the paper's 40. With lick-early trials kept, 1% to 4% of the experiment-3 photoinhibition trials have their light before its logged time (data check).
ed1-monolithic-models-fail¶
Monolithic network models (integrator, integrator with corrective feedback, trained random recurrent networks) do not recover the unperturbed trajectory after transient silencing of half their neurons.
Criterion: simulations with the parameters of the Methods and the Extended Data Fig. 1 legend (simple integrator N = 100, tau 100 ms, one eigenvalue 0.99; FORCE network N = 400, tau 200 ms, tanh, p = 0.1, gain 1.5, 30 iterations; silencing 0.2 to 1.0 s of 2 s); 1 ms step, fixed seeds, at least 10 networks. Reproduced when, at 2 s, the output of each model differs from its unperturbed output by more than 10% of the unperturbed selectivity, for the simple integrator and the transient-input FORCE network. The FORCE target (a ramp to plus or minus 1 at 2 s), the feedback weights (uniform from -1 to 1), the learning rate and the update every 2 ms are standard choices the paper does not give. The integrator with corrective feedback and the tamed-chaos network lack parameters in the text and are not built.
from concurrent.futures import ProcessPoolExecutor
t0 = time.time()
rows = []
for seed in range(10):
sil = np.random.default_rng(100 + seed).choice(100, 50, replace=False)
for name, fn in (("integrator, persistent input", lambda **k: L.simple_integrator(**k)),
("integrator, transient input", lambda **k: L.simple_integrator(transient=True, **k)),
("cascaded integrators, transient input", lambda **k: L.cascaded_integrator(**k))):
_, o = fn(seed=seed); _, p = fn(seed=seed, silence=sil)
sel = o[1][-1] - o[-1][-1]
rows.append({"model": name, "seed": seed, "selectivity": sel,
"max_rel_diff": max(abs(p[1][-1] - o[1][-1]), abs(p[-1][-1] - o[-1][-1])) / abs(sel)})
with ProcessPoolExecutor(4) as ex:
force = list(ex.map(L.force_test, range(10)))
for r in force:
sel = r["unpert_right"] - r["unpert_left"]
rows.append({"model": "FORCE network, transient input", "seed": r["seed"], "selectivity": sel,
"max_rel_diff": max(abs(r["pert_right"] - r["unpert_right"]), abs(r["pert_left"] - r["unpert_left"])) / abs(sel),
"train_err": r["train_err"]})
mono = pd.DataFrame(rows)
print(f"simulated in {time.time() - t0:.0f} s")
print(mono.round(3).to_string(index=False))
ms = mono.groupby("model").agg(networks=("seed", "size"), min_rel_diff=("max_rel_diff", "min"), median_rel_diff=("max_rel_diff", "median"),
fail_to_recover=("max_rel_diff", lambda x: int((x > 0.1).sum())))
print("\n", ms.round(3).to_string())
simulated in 77 s
model seed selectivity max_rel_diff train_err
integrator, persistent input 0 32.603 0.210 NaN
integrator, transient input 0 0.808 0.495 NaN
cascaded integrators, transient input 0 311.258 0.494 NaN
integrator, persistent input 1 32.603 0.218 NaN
integrator, transient input 1 0.808 0.498 NaN
cascaded integrators, transient input 1 311.258 0.498 NaN
integrator, persistent input 2 32.603 0.217 NaN
integrator, transient input 2 0.808 0.497 NaN
cascaded integrators, transient input 2 311.258 0.497 NaN
integrator, persistent input 3 32.603 0.224 NaN
integrator, transient input 3 0.808 0.499 NaN
cascaded integrators, transient input 3 311.258 0.499 NaN
integrator, persistent input 4 32.603 0.204 NaN
integrator, transient input 4 0.808 0.491 NaN
cascaded integrators, transient input 4 311.258 0.494 NaN
integrator, persistent input 5 32.603 0.208 NaN
integrator, transient input 5 0.808 0.494 NaN
cascaded integrators, transient input 5 311.258 0.495 NaN
integrator, persistent input 6 32.603 0.210 NaN
integrator, transient input 6 0.808 0.495 NaN
cascaded integrators, transient input 6 311.258 0.496 NaN
integrator, persistent input 7 32.603 0.212 NaN
integrator, transient input 7 0.808 0.495 NaN
cascaded integrators, transient input 7 311.258 0.497 NaN
integrator, persistent input 8 32.603 0.218 NaN
integrator, transient input 8 0.808 0.498 NaN
cascaded integrators, transient input 8 311.258 0.497 NaN
integrator, persistent input 9 32.603 0.211 NaN
integrator, transient input 9 0.808 0.495 NaN
cascaded integrators, transient input 9 311.258 0.496 NaN
FORCE network, transient input 0 1.997 0.691 0.001
FORCE network, transient input 1 1.997 0.477 0.001
FORCE network, transient input 2 1.998 0.752 0.001
FORCE network, transient input 3 1.998 0.302 0.001
FORCE network, transient input 4 1.997 0.162 0.001
FORCE network, transient input 5 1.997 0.132 0.001
FORCE network, transient input 6 1.997 0.596 0.001
FORCE network, transient input 7 1.998 0.260 0.000
FORCE network, transient input 8 1.997 0.759 0.001
FORCE network, transient input 9 1.997 0.350 0.001
networks min_rel_diff median_rel_diff fail_to_recover
model
FORCE network, transient input 10 0.132 0.414 10
cascaded integrators, transient input 10 0.494 0.497 10
integrator, persistent input 10 0.204 0.211 10
integrator, transient input 10 0.491 0.495 10
Result: reproduced. Each of 10 simple integrators ends 20% to 22% of its selectivity away from its unperturbed output after silencing half of its units (persistent input), and each of 10 FORCE networks trained to ramp after a transient input ends 13% to 76% away (median 41%); all exceed the 10% bound. The transient-input and cascaded integrators end about 50% away. The two models whose parameters the text lacks were not built.
fig6-modular-models-recover¶
Modular networks of two coupled modules (attractor, integrator, trained recurrent network) recover after silencing of one module; the modular attractor drifts to a random fixed point when both modules are silenced.
Criterion: modular attractor and modular integrator with the Methods' parameters; 1 ms step with
Euler-Maruyama as the standard choice before the answer. Reproduced when, over 100 simulated trials per trial type, the modular attractor ends
at the instructed fixed point in more than 90% of trials after unilateral silencing and in 30% to
70% after bilateral silencing, and the modular integrator returns within 10% of its unperturbed
trajectory by 2 s after unilateral silencing. Answered 2026-10-21 as not given by the paper: the
noise, (n1) white noise of intensity 0.01, increment sd sqrt(0.01 dt)/tau, or (n2) one sample of
variance 0.01 per step, integrated like an input; and the step, (h1) 1 ms or (h2) 0.1 ms. The
outcome must hold under all four, else methods_underspecified. A trial ends at
the instructed fixed point when both modules have the instructed unit above the other one at 2 s.
rows = []
STEPS = {"h1": 0.001, "h2": 0.0001}
for noise, nname in (("em", "n1"), ("sample", "n2")):
for hname, dt in STEPS.items():
for cond, sil in (("unperturbed", ()), ("unilateral", (0, 1)), ("bilateral", (0, 1, 2, 3))):
ok = []
for k, trial in enumerate(("right", "left")):
_, R = L.modular_attractor(trial, silence=sil, seed=7 + k + 10 * len(sil), noise=noise, n_trials=100, dt=dt)
end = R[:, -1]
inst = (end[:, 0] > end[:, 1]) & (end[:, 2] > end[:, 3]) if trial == "right" else (end[:, 1] > end[:, 0]) & (end[:, 3] > end[:, 2])
ok.append(inst)
ok = np.concatenate(ok)
rows.append({"noise": nname, "step": hname, "silencing": cond, "trials": len(ok), "instructed_fixed_point": ok.mean()})
att = pd.DataFrame(rows)
print(att.to_string(index=False))
mi = []
for hname, dt in STEPS.items():
for trial in ("right", "left"):
_, R0 = L.modular_integrator(trial, dt=dt); _, R1 = L.modular_integrator(trial, silence=(0, 1, 2, 3), dt=dt)
sel0 = R0[-1, 0] - R0[-1, 1]; sel1 = R1[-1, 0] - R1[-1, 1]
sel0b = R0[-1, 4] - R0[-1, 5]; sel1b = R1[-1, 4] - R1[-1, 5]
mi.append({"step": hname, "trial": trial, "module1_unperturbed": sel0, "module1_silenced": sel1, "rel_diff_module1": abs(sel1 - sel0) / abs(sel0),
"module2_unperturbed": sel0b, "module2_after": sel1b, "rel_diff_module2": abs(sel1b - sel0b) / abs(sel0b)})
mi = pd.DataFrame(mi)
print("\nModular integrator, right minus left integrator unit at 2 s, module 1 silenced 0.2-1.0 s:")
print(mi.round(4).to_string(index=False))
judge6 = []
for nname in ("n1", "n2"):
for hname in STEPS:
a = att[(att.noise == nname) & (att.step == hname)].set_index("silencing").instructed_fixed_point
m = mi[mi.step == hname].set_index("trial").rel_diff_module1 <= 0.1
parts = {"attractor_unilateral": bool(a["unilateral"] > 0.9), "attractor_bilateral": bool(0.3 <= a["bilateral"] <= 0.7),
"integrator_right": bool(m["right"]), "integrator_left": bool(m["left"])}
judge6.append({"noise": nname, "step": hname, **parts,
"outcome_here": "reproduced" if all(parts.values()) else "partially" if any(parts.values()) else "not"})
judge6 = pd.DataFrame(judge6)
print("\n", judge6.to_string(index=False))
noise step silencing trials instructed_fixed_point n1 h1 unperturbed 200 0.510 n1 h1 unilateral 200 0.500 n1 h1 bilateral 200 0.430 n1 h2 unperturbed 200 0.485 n1 h2 unilateral 200 0.415 n1 h2 bilateral 200 0.440 n2 h1 unperturbed 200 1.000 n2 h1 unilateral 200 1.000 n2 h1 bilateral 200 0.480 n2 h2 unperturbed 200 1.000 n2 h2 unilateral 200 1.000 n2 h2 bilateral 200 0.500
Modular integrator, right minus left integrator unit at 2 s, module 1 silenced 0.2-1.0 s: step trial module1_unperturbed module1_silenced rel_diff_module1 module2_unperturbed module2_after rel_diff_module2 h1 right 14.3931 14.3674 0.0018 14.3931 14.3931 0.0 h1 left -14.3920 -7.2000 0.4997 -14.3920 -14.3920 0.0 h2 right 14.3997 13.6178 0.0543 14.3997 14.3997 0.0 h2 left -14.3992 -7.2000 0.5000 -14.3992 -14.3992 0.0 noise step attractor_unilateral attractor_bilateral integrator_right integrator_left outcome_here n1 h1 False True True False partially n1 h2 False True True False partially n2 h1 True True True False partially n2 h2 True True True False partially
Result: partially reproduced. The answer leaves the noise (n1, n2) and the step (h1, h2) open, and the claims file requires one outcome over all four; all four give partial. Under n2 the modular attractor ends at the instructed fixed point in 100% of trials after unilateral silencing and in 48% (h1) or 50% (h2) after bilateral silencing, as the claim says. Under n1 the noise dominates: it ends there in 41.5% to 51% of trials whatever the silencing (51% and 48.5% unperturbed), so the unilateral part fails, and the bilateral fraction (43%, 44%) lies in the 30% to 70% band only because the network is at chance. The modular integrator with the printed matrix restores lick right trials (0.2% from unperturbed at 2 s with 1 ms steps, 5.4% with 0.1 ms steps) but not lick left ones (50% away under both steps): its recovery unit passes only right-preferring activity.
Blocked claims¶
- fig1d-late-delay-ipsilateral-bias, fig1d-earlier-photoinhibition-minimal, ed3-behaviour-recovery-interval, fig2b-unilateral-performance, fig2b-bilateral-performance (data_missing). They rest on the behavioural photoinhibition sessions of 5 and 13 mice (photoinhibition on 25% of trials, light ending at the go cue, 1.3 s light with a variable delay, four-spot unilateral and two-spot bilateral protocols). The dandiset holds only the recording sessions (40% light trials), which lack those conditions (data check). The behaviour during the recordings is shown above for reference only: in experiment 1 (4 mice) performance on early-delay and late-delay photoinhibition trials is 0.745 and 0.749 against 0.799 in control (paired p 0.21 and 0.16), in line with fig1d-earlier-photoinhibition-minimal; in experiment 2 (7 mice) one spot with the hemispheres pooled gives 0.716 against 0.773 (paired p 0.059) and eight spots bilaterally 0.580 (paired p 0.0001); in experiment 3 (3 mice) one spot pooled gives 0.705, four spots 0.756 (left) and 0.830 (right), and two spots bilaterally 0.658 against 0.795 in control (paired p 0.045). These are other mice and sessions than the paper's behavioural cohort, with light on 40% of trials.
- ed5-photoactivation-recovery, ed5-photoactivation-rate-changes (data_missing). No Tlx_PL56-cre x Ai32 mouse is in the dandiset (genotypes in the data check).
- ed2d-spatial-extent (data_missing). The recordings of the 4 untrained mice are not in the dandiset.
- ed9f-reaction-time (data_missing). The analysis ran in its own section above: the lick trace of the experiment-2 sessions holds no licks, so the reaction times the claim needs are not there.
- fig5b-callosotomy-control-performance (data_missing). There are no sessions before the callosotomy, and no file marks the 7 mice as callosotomised.
- fig5b-callosotomy-unilateral-sensitivity, ed10-callosotomy-preparatory-activity, fig5-callosotomy-no-recovery, fig5f-callosotomy-cd-reduced (metadata_insufficient). The 33 sessions of the 7 mice without a photostimulus record contain photoinhibition trials (silenced trials in the data check), but no file says which trials, where or when, so control and photoinhibition trials cannot be told apart. They hold 519 putative pyramidal units (paper 496, within tolerance, if these are the callosotomy mice, which no file says). Counted on all their trials, photoinhibition trials included, 331 to 340 are selective with correct trials (paper 254 on control trials) and 81 to 84 in the sample epoch (cell below); this is not the claim's measure.
# ed10-callosotomy-preparatory-activity, the part that can be counted (verifier's suggestion; reference
# only). In the sessions without a photostimulus record control trials cannot be identified, so
# convention S is run on all their trials (lick-early dropped, K1, or kept, K2), with photoinhibition
# trials mixed in. Width classes are those of the data check.
cal_pyr = U[(U.exp == "no_photostim_record") & (U.cls == "pyr")]
rows = []
for early in ("drop", "keep"):
for r in L.S_READINGS:
st = L.selectivity_tests(cal_pyr, S, r["response"], r["outcomes"], early, r["equal_var"], conds=("unlabelled",))
sig = st[["sample", "delay", "response"]] < 0.05
rows.append({"early_lick": early, "reading": L.s_key(r), "units": len(st), "any": int(sig.any(axis=1).sum()),
"sample": int(sig["sample"].sum()), "delay": int(sig.delay.sum()), "response": int(sig.response.sum())})
print(pd.DataFrame(rows).to_string(index=False))
print("Putative pyramidal units:", len(cal_pyr), "(paper 496, tolerance 49.6); paper 254 selective (tolerance 25.4), on control trials.")
early_lick reading units any sample delay response
drop R1-O1-student 519 331 82 147 253
drop R1-O1-welch 519 331 84 148 253
drop R1-O2-student 519 279 61 118 207
drop R1-O2-welch 519 276 58 114 211
drop R2-O1-student 519 333 82 147 255
drop R2-O1-welch 519 338 84 148 259
drop R2-O2-student 519 279 61 118 207
drop R2-O2-welch 519 273 58 114 207
keep R1-O1-student 519 339 81 145 263
keep R1-O1-welch 519 339 82 142 265
keep R1-O2-student 519 288 59 116 219
keep R1-O2-welch 519 289 55 115 220
keep R2-O1-student 519 340 81 145 262
keep R2-O1-welch 519 339 82 142 263
keep R2-O2-student 519 285 59 116 218
keep R2-O2-welch 519 282 55 115 216
Putative pyramidal units: 519 (paper 496, tolerance 49.6); paper 254 selective (tolerance 25.4), on control trials.
Summary¶
| claim | outcome |
|---|---|
| unit-classification | partially reproduced |
| selective-fraction | not reproduced |
| fig1d-late-delay-ipsilateral-bias | blocked (data_missing) |
| fig1d-earlier-photoinhibition-minimal | blocked (data_missing) |
| ed3-behaviour-recovery-interval | blocked (data_missing) |
| ed4-return-to-trajectory | not reproduced |
| fig1f-spike-rate-recovery | reproduced |
| fig1g-selectivity-recovery | blocked (methods_underspecified) |
| ed5-photoactivation-recovery | blocked (data_missing) |
| ed5-photoactivation-rate-changes | blocked (data_missing) |
| ed2b-silencing-strength | not reproduced |
| ed2d-spatial-extent | blocked (data_missing) |
| ed2e-no-rebound | not reproduced |
| fig2b-unilateral-performance | blocked (data_missing) |
| fig2b-bilateral-performance | blocked (data_missing) |
| ed6a-bilateral-inconsistent-bias | reproduced |
| fig2-recordings-recovery | partially reproduced |
| fig2e-selectivity-recovery-times | not reproduced |
| ed7-larger-photoinhibition | blocked (methods_underspecified) |
| ed7e-roc-larger-photoinhibition | partially reproduced |
| cd-stable-over-epochs | blocked (methods_underspecified) |
| cd-captures-selectivity | blocked (methods_underspecified) |
| fig3c-cd-recovery-roc | not reproduced |
| ed8-roc-during-photoinhibition | partially reproduced |
| fig3c-cd-predicts-movement | reproduced |
| fig3d-persistent-mode | not reproduced |
| fig3e-ramping-mode | not reproduced |
| fig4-bilateral-cd-predicts-movement | reproduced |
| ed6b-session-bias-predicted | not reproduced |
| ed9f-reaction-time | blocked (data_missing) |
| ed9c-cd-window-robust | reproduced |
| fig5b-callosotomy-control-performance | blocked (data_missing) |
| fig5b-callosotomy-unilateral-sensitivity | blocked (metadata_insufficient) |
| ed10-callosotomy-preparatory-activity | blocked (metadata_insufficient) |
| fig5-callosotomy-no-recovery | blocked (metadata_insufficient) |
| fig5f-callosotomy-cd-reduced | blocked (metadata_insufficient) |
| ed1-monolithic-models-fail | reproduced |
| fig6-modular-models-recover | partially reproduced |
A failure to reproduce here may be a failure of this attempt, not of the paper: see the reasoning and the differences from the paper's method.
How the analysis differs from the paper's. Conditions are read from the laser traces and events, as the trial table has none. Session 258250_20141202 (interleaved, overlapping trial sequences) and the three experiment-1 sessions without a photostimulus record are left out of trial-based analyses. Details the claims file leaves open are run under each reading. The answers of 2026-10-21 to the ten questions asked found every detail missing from the paper; the readings they name are run, and a claim whose method-detail readings disagree is blocked. This changed two outcomes: cd-captures-selectivity (not reproduced before) is blocked, as its v1 and v2 readings differ, and ed9f-reaction-time, blocked before for want of a lick rule, was run over a range of thresholds and is blocked because the lick trace holds no licks. Several counts of included neurons and sessions differ from the paper's (55 and 143 neurons for the recovery times against 138 to 173 and 221 to 293 here; 16 sessions with 6 to 20 neurons for the activity space against 24 with 6 to 37), so the paper's selections are not those of the claims file. The simulations use standard choices for the integration step, the FORCE target and feedback, and the seeds; the modular attractor is run with both noise readings and both steps the answer names. Photoinhibition-trial random splits use one seed per session.
Partial outcomes. Where a criterion defines no partial outcome (unit-classification, selective-fraction, ed2b-silencing-strength, fig2-recordings-recovery, ed7e, ed8 and fig6), a claim that is not reproduced is called partially reproduced when at least half of the parts of its criterion hold under every reading that must agree (K1 and K2, and the other method details), and not reproduced otherwise. This rule was written after the first verification round, where the verifier judged several of these claims not reproduced; it moved selective-fraction (one count of four under K1) and ed2b-silencing-strength (one part of four under K2) to not reproduced, and leaves unit-classification (four of five), fig2-recordings-recovery (three of five), ed7e-roc-larger-photoinhibition and ed8-roc-during-photoinhibition (three of four under K1, two under K2) and fig6-modular-models-recover (two or three of four) partial.
After the first verification round. cd-stable-over-epochs is blocked: w from all correct control trials gives 0.563 and 0.588, inside the band, and w from the training subset 0.534 to 0.554, outside, and the claims file fixes neither. Under K2, 3% to 16% of the trials of each photoinhibition condition of experiment 1, 6.5% to 7.5% in experiment 2 and 1% to 4% in experiment 3 have their light before its logged time, so K2 mixes trials without light into the photoinhibition averages (data check); the claims file defines K2 with events at their logged times, and a question asks whether that is meant.
What was found about the dandiset. It holds the recordings of the paper's 12 control mice (58
sessions, 890 putative pyramidal units as in the paper) and 33 sessions of 7 further mice that
match the callosotomy experiment, but not the behavioural photoinhibition sessions, the
photoactivation and untrained mice, or any session before callosotomy. About 33 units of
intermediate spike width are missing (15 against 50). The photostimulus is not in the trial table;
it is recorded as laser traces per site and events, from which the site, the number of spots and
the timing can be read, but in 36 sessions (the 33 of the callosotomy mice and 3 of experiment 1)
it is missing although those sessions contain silenced trials. No file says which mice were
callosotomised. In lick-early trials the photostimulus event is logged at the restarted delay; in
339 of 931 such trials it lies more than 0.1 s after the light, which came up to 10 s before the
logged go cue. One session has interleaved overlapping trial sequences; 28 units have
spike times out of time order; the files' cell_type labels intermediate-width units as FS; the
behaviour-only file is empty. No file holds lick times: the lick_trace of the 24 experiment-2
sessions used for the activity space stays within about 0.002 of its baseline when the mouse
licks, so licks cannot be read from it, while the experiment-3 and unlabelled sessions read as
references do carry licks.
print(f"notebook ran in {time.time() - started:.0f} s")
notebook ran in 1132 s