Data from: Sensory adaptation and pupil-linked arousal support flexible evidence accumulation during perceptual decision making
Data files
Jul 24, 2026 version files 3.61 GB
-
LogisticFits_NeuralTerm_control.mat
2.07 KB
-
LogisticFits_NeuralTerm_Rsq_control.mat
2.36 KB
-
LogisticFits_NeuralTerm_Rsq.mat
2.38 KB
-
LogisticFits_NeuralTerm.mat
2.35 KB
-
LogisticFits_PupilTerm_control.mat
2.26 KB
-
LogisticFits_PupilTerm_Rsq_control.mat
2.35 KB
-
LogisticFits_PupilTerm_Rsq.mat
2.34 KB
-
LogisticFits_PupilTerm.mat
2.38 KB
-
LogisticFits_Rsq_Shuffle.mat
238.15 KB
-
LogisticFits_Rsq.mat
2.66 KB
-
LogisticFits_Shuffle.mat
251.38 KB
-
LogisticFits.mat
8.95 KB
-
mergedTable_proc_core.mat
135.93 MB
-
mergedTable_proc_neural.mat
219.52 MB
-
mergedTable_proc.mat
3.25 GB
-
normalizationTerm.mat
1.28 KB
-
README.md
15.58 KB
-
sensitivity_diff_labeled_BP.mat
2.61 KB
-
sensitivity_diff_labeled_N.mat
2.48 KB
-
sensitivity_diff_labeled_NP.mat
2.43 KB
Abstract
Effective decision-making in dynamic environments requires flexible evidence accumulation. Although models often express this flexibility as a property of the accumulator, its implementation in the brain may involve adaptive mechanisms operating at other stages of the decision process. We examined two such mechanisms: 1) stimulus-specific sensory adaptation at the level of evidence encoding; and 2) arousal-related neuromodulation, which could, in principle, affect both evidence encoding and accumulation. This repository includes all of the behavioral, neural, and pupillometric data from this study.
Code is available on GitHub:
https://github.com/TheGoldLab/ms_2026_mcgaughey_gold_elife
See code/README.m for the full project overview (dependencies, figure scripts, code/utilities/ reference) and code/builds/README.m for how the derived/cached files below are regenerated. This file documents only the contents of data/ itself, at the column level.
Contents
data/
mergedTable_proc.mat - canonical trial-wise table, all monkeys (9.5 GB loaded)
mergedTable_proc_core.mat - derived tier: behavioral columns only (~136 MB)
mergedTable_proc_neural.mat - derived tier: behavioral + neural, no pupil traces (~220 MB)
normalizationTerm.mat - per-unit firing-rate normalization terms
sensitivity_diff_labeled_BP.mat - per-session slope diff, behavior+pupil subset
sensitivity_diff_labeled_N.mat - per-session/unit slope diff, neural subset
sensitivity_diff_labeled_NP.mat - per-session/unit slope diff, neural+pupil subset
behaviorFits/ - pre-computed logistic-regression fits (see below)
mergedTable_proc.mat / mergedTable_proc_core.mat / mergedTable_proc_neural.mat
All three store the same MATLAB table under the variable name mergedTable_proc, one row per trial, pooled across monkeys An, Ch, and Mi. mergedTable_proc.mat is the canonical 80,314 x 32 source table; the other two are lighter derived tiers (dropping "heavy" columns) produced from it by code/builds/buildMergedTableTiers.m so that scripts that never touch pupil traces or spike times don't pay to load them. See code/README.m "data/" section for which figure script loads which tier, and re-run buildMergedTableTiers.m if mergedTable_proc.mat is ever regenerated — the two tiers are not meant to be hand-edited.
| Tier | Rows x Cols | Drops relative to full table |
|---|---|---|
mergedTable_proc.mat |
80314 x 32 | (nothing — canonical) |
mergedTable_proc_neural.mat |
80314 x 29 | pupil_diam, pupil_horiz, pupil_vert |
mergedTable_proc_core.mat |
80314 x 28 | above, plus Unit_1 |
Each session/unit's row-grouping key (ses_ID) encodes which data types are available for it via a trailing code — B (behavioral), N (neural), P (pupil), e.g. "AnDR_20210614_Unit1_BNP" — and createDatSubset.m (code/utilities/) filters rows by that code (e.g. 'N', 'NP', 'BP').
Columns of the full table, in order (indices below match mergedTable_proc.mat; the core/neural tiers renumber after dropping columns, but variable names are unchanged):
| # | Column | Description |
|---|---|---|
| 1 | ses_ID |
session/unit ID string, "<Monkey><rig>_<date>[_Unit<n>]_<BNP code>" |
| 2 | HR |
hazard-rate/switch-frequency condition code: 2 = LSF, 6 = HSF (see projectDefaults.m cfg.hazard) |
| 3 | coh_switch |
motion coherence of the pre-final (context/adapting) stimulus epoch |
| 4 | coh_final |
motion coherence of the final (test) stimulus epoch |
| 5 | dir_switch |
logical: true if the final-epoch direction differs from the prefinal-epoch direction ("switch" trial) |
| 6 | dir_final |
final (test) stimulus motion direction, degrees |
| 7 | dir_prefinal |
pre-final (context/adapting) stimulus motion direction, degrees |
| 8 | dur_last_before_final |
duration (ms) of the stimulus epoch immediately preceding the final/test epoch |
| 9 | dur_final |
duration (ms) of the final/test stimulus epoch ("viewing duration"; bin edges in cfg.bins.viewDuration) |
| 10 | choice_final |
monkey's choice on the final epoch (coded 1/2) |
| 11 | RT_final |
reaction time (ms) for the final choice |
| 12 | correct |
whether the final choice was correct (0/1) |
| 13 | eyefix |
eye-fixation status/flag during the trial |
| 14 | dot_diam |
random-dot stimulus dot diameter |
| 15 | dot_speed |
random-dot stimulus dot speed |
| 16 | dots_x |
dot-field aperture horizontal position |
| 17 | dots_y |
dot-field aperture vertical position |
| 18 | dots_off |
timestamp (ms) dot motion stops |
| 19 | tgt_on |
timestamp (ms) choice targets appear |
| 20 | fp_on |
timestamp (ms) fixation point appears |
| 21 | good_trials |
per-trial serial index within session (not a boolean flag) |
| 22 | pupil_acquire_rate |
eye-tracker acquisition sample rate, 3-element vector per trial |
| 23 | pupil_store_rate |
eye-tracker storage sample rate, 3-element vector per trial |
| 24 | pupil_diam |
[full table only] continuous per-trial pupil-diameter trace |
| 25 | pupil_horiz |
[full table only] continuous per-trial horizontal gaze-position trace |
| 26 | pupil_vert |
[full table only] continuous per-trial vertical gaze-position trace |
| 27 | trial_begins |
trial-start timestamp (ms) |
| 28 | trial_ends |
trial-end timestamp (ms) |
| 29 | taskID |
task-variant code (observed values 3–6) |
| 30 | trialID |
trial identifier/index |
| 31 | dots_on |
per-epoch motion-onset timestamps (ms), vector per trial; dots_on{1} is the first (context/adapting) onset, dots_on{end} is the final/test-epoch onset (see processNeuralData.m, processPupilFull.m) |
| 32 | Unit_1 |
[full table and _neural tier only] per-trial spike-time vector (variable length) for the session's recorded MT neuron |
Columns 24–26 (continuous pupil traces) account for 98.7% of the full table's in-memory size — that's why only the pupil-analysis scripts (Fig6_FigSupp1.m, Fig6_FigSupp2AB.m, Fig6_FigSupp2CD.m, behaviorLogisticFitsPupilTerm.m, processPupilBaseline.m, processPupilFull.m) load mergedTable_proc.mat directly; everything else uses one of the two lighter tiers.
normalizationTerm.mat
normalizationTerm — [numUnits x 1] double
Per-unit max-firing-rate normalization term computed from correct trials during initial neural processing (see processNeuralData.m / behaviorLogisticFitsNeuralTerm.m, where it's populated as normalizationTerm(uu,1) = max(maxRate)). Passed back into processNeuralData.m / processNeuralDataErrorTrials.m as normalizationTerm_input so that early-vs-late block-split analyses (Figure 4-Figure Supplement 1B) and error-trial analyses normalize firing rates consistently rather than recomputing the max per subset.
sensitivity_diff_labeled_{BP,N,NP}.mat
sensitivity_diff_labeled_<code> — [numRows x 2] cell array
- column 1: session/unit ID string (e.g.
"AnDR_20210614_Unit1_BNP") - column 2: double, difference in psychometric slope/sensitivity (β₂, time-dependent term) between conditions for that session/unit — extracted via
cell2mat(...(:,2))wherever these are loaded (e.g.Fig5_FigSupp3.m,Fig6_FigSupp2AB.m)
Suffix denotes which data-type subset (see createDatSubset.m codes) the rows are restricted to:
| Suffix | Rows | Subset |
|---|---|---|
| BP | 159 | behavior + pupil sessions (behavior-pupil analyses) |
| N | 155 | behavior + neural sessions (neural-only analyses) |
| NP | 153 | behavior + neural + pupil sessions (neural-pupil analyses) |
behaviorFits/
Pre-computed logistic-regression fits, generated by the four code/builds/behaviorLogisticFits*.m scripts (fitting is time-intensive, so these outputs are checked in rather than regenerated on each run). See code/builds/README.m for build provenance and validation notes. On Dryad, these files are in the top-level data directory (file names starting with Logistics..).
Behavior-only model (behaviorLogisticFits.m):
LogisticFits.mat→fits—[161 sessions x 4 params x 2 hazards]double: β₀ switch/stay bias, β₁ right/left directional bias, β₂ sensitivity to viewing duration (time slope), β₃ lapse rateLogisticFits_Rsq.mat→R_sq—[161 sessions x 1 x 2 hazards]double, Tjur's pseudo-R²
Behavior-only, shuffled null (behaviorLogisticFitsShuffle.m; 100 shuffled refits per session, stacked as 100 repeats of the per-session block — tile any per-session mask with repmat(mask, 100, 1) to index):
LogisticFits_Shuffle.mat→fits_shuffle—[16100 x 4 x 2]LogisticFits_Rsq_Shuffle.mat→R_sq_shuffle—[16100 x 1 x 2]
Behavior + trial-wise MT neural term (behaviorLogisticFitsNeuralTerm.m):
LogisticFits_NeuralTerm.mat→fits_neuralTerm—[153 units x 1 x 2 hazards]double, the neural x signed-time interaction coefficient (β₂) only, i.e.fits(uu,3,:)from the underlying 5-parameter fit — not the full parameter vectorLogisticFits_NeuralTerm_Rsq.mat→R_sq_neuralTerm—[153 x 1 x 2]LogisticFits_NeuralTerm_control.mat→fits_neuralTerm_control—[153 x 1 x 2](PREF-direction-only, behavior-only control fit's signed-time term)LogisticFits_NeuralTerm_Rsq_control.mat→R_sq_neuralTerm_control—[153 x 1x 2]
Behavior + trial-wise evoked-pupil term (behaviorLogisticFitsPupilTerm.m):
LogisticFits_PupilTerm.mat→fits_pupilTerm—[153 units x 1 x 2 hazards]double, the pupil x signed-time interaction coefficient (β₂) only, same convention asfits_neuralTermaboveLogisticFits_PupilTerm_Rsq.mat→R_sq_pupilTerm—[153 x 1x 2]LogisticFits_PupilTerm_control.mat→fits_pupilTerm_control—[153 x 1 x 2]LogisticFits_PupilTerm_Rsq_control.mat→R_sq_pupilTerm_control—[153 x 1 x 2]
All hazard/frequency dimensions are indexed [LSF, HSF] (cfg.hazard.codes = [2, 6] from projectDefaults.m); all *_control files are the matched behavior-only control fit for that model's units, not a separate experiment.
