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).

In [1]:
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)
In [2]:
# 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¶

In [3]:
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 ()
In [4]:
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.

In [5]:
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.

In [6]:
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.

In [7]:
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.

In [8]:
# 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.

In [9]:
# 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.

In [10]:
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.

In [11]:
# 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
In [12]:
# 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
In [13]:
# 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.

In [14]:
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.

In [15]:
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
In [16]:
# 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.

In [17]:
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.

In [18]:
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.

In [19]:
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.

In [20]:
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
In [21]:
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)
In [22]:
# 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.

In [23]:
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.

In [24]:
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.

In [25]:
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.

In [26]:
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
In [27]:
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.

In [28]:
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
In [29]:
# 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.

In [30]:
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).

In [31]:
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.

In [32]:
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.

In [33]:
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).

In [34]:
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.

In [35]:
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).

In [36]:
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.

In [37]:
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.

In [38]:
# 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
In [39]:
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
In [40]:
# 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
No description has been provided for this image
Every plotted sample is inside its axis (each panel's y range is set from its data).
In [41]:
# 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.

In [42]:
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.

In [43]:
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).

In [44]:
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.

In [45]:
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.

In [46]:
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.
In [47]:
# 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.

In [48]:
print(f"notebook ran in {time.time() - started:.0f} s")
notebook ran in 1132 s