Anterior cingulate neurons combine outcome monitoring of past decisions with ongoing movement signals.
The 25 matches · 2 of them tie a paragraph to a whole file without given lines: weak matches, whose lines are not tinted
- [1] § Methods › Perceptual evidence accumulation task ↔ Functions/StateMatrices/DemonstratorTaskSMA.m, lines 102 to 238 · score 0.89 · reward delivery, go cue, rewarded port, left port, right port, center port · Report a mismatch
- [2] § Methods › Perceptual evidence accumulation task ↔ labdata_plugin/pluginschema.py, lines 12 to 86 · score 0.87 · category boundary, left pokes, right pokes, stimulus train, early withdrawal, stimulus rate · Report a mismatch
- [3] § Methods › Movement and posture analysis ↔ chiCa/encoding_model_single_timepoints.py, lines 81 to 126 · score 0.81 · tail tip, nose tip, tail center, body part, ear, rectum · Report a mismatch
- [4] § Results › Neural representations of trial history cannot solely be explained by body posture or movements ↔ encoding_model_fitting.py, lines 275 to 323 · score 0.78 · Motion energy SVD, head orientation angle, body position, Video SVD, encoding models, fitted · Report a mismatch
- [5] § Results › Neural representations of trial history cannot solely be explained by body posture or movements ↔ reviewer_figure2.py, lines 451 to 491 · score 0.75 · Motion energy SVD, cross validation, Video SVD, explained variance, encoding models, ridge · Report a mismatch
- [6] § Methods › Behavioral training procedure ↔ Functions/StateMatrices/DemonstratorSelfInitiatedTaskSMA.m, the whole file · a weak match · score 0.72 · stimulus playing, initiate trials, center fixation, right ports, early withdrawal, volume · Report a mismatch
- [7] § Methods › Behavioral training procedure ↔ labdata_plugin/pluginschema.py, lines 12 to 86 · score 0.69 · center poke, response port, center fixation, early withdrawal, mastering, volume · Report a mismatch
- [8] § Results › Neural dynamics representing trial history are low-dimensional and similar between subjects ↔ figure4.py, lines 178 to 216 · score 0.68 · encoding weights projected, procrustes distance, chest point, PCA, transformations, dimensions · Report a mismatch
- [9] § Results › Neural representations of trial history cannot solely be explained by body posture or movements ↔ encoding_model_fitting.py, lines 374 to 456 · score 0.67 · regressors shuffled, single regressor, explained variance, encoding models, fluctuations, head · Report a mismatch
- [10] § Results › Neural representations of trial history cannot solely be explained by body posture or movements ↔ chiCa/encoding_model_full_version.py, lines 269 to 321 · score 0.66 · regressors shuffled, single regressor, explained variance, encoding models, fluctuations, head · Report a mismatch
- [11] § Results › Trial history can be decoded from ACC population activity ↔ statistical_testing.R, lines 138 to 205 · score 0.66 · ITI phases, shuffled control, decoding accuracy, trial history context, decoders, strength · Report a mismatch
- [12] § Results › Neural dynamics representing trial history are low-dimensional and similar between subjects ↔ figure4.py, lines 178 to 216 · score 0.65 · procrustes distance, encoding weights, chest point, tuning, transformations, dimensions · Report a mismatch
- [13] § Methods › Miniature microscope imaging and image processing ↔ chiCa/neuron_selection_GUI.py, lines 21 to 63 · score 0.65 · identified putative neurons, CaImAn, background, CNMF, fluorescence, motion · Report a mismatch
- [14] § Results › Trial history can be decoded from ACC population activity ↔ statistical_testing.R, lines 138 to 205 · score 0.65 · ITI duration, trial history decoding, early ITI, decoding accuracy, decoders, phases · Report a mismatch
- [15] § Methods › Perceptual evidence accumulation task ↔ Functions/StateMatrices/DemonstratorSelfInitiatedTaskSMA.m, the whole file · a weak match · score 0.65 · state machine, right ports, center port, volume, valve, LED · Report a mismatch
- [16] § Methods › Data reporting and statistical analyses ↔ statistical_testing.R, lines 1 to 45 · score 0.65 · lmerTest, emmeans, Sidak, marginal, coefficients, linear · Report a mismatch
- [17] § Methods › Miniature microscope imaging and image processing ↔ analysis/analysis_caiman.py, lines 465 to 508 · score 0.64 · identified putative neurons, CaImAn, background, CNMF, fluorescence, matrix · Report a mismatch
- [18] § Methods › Perceptual evidence accumulation task ↔ Functions/StateMatrices/DemonstratorTaskSMA.m, lines 102 to 238 · score 0.59 · right ports, center port, TTL, valve, camera, LED · Report a mismatch
- [19] § Results › Neural dynamics representing trial history are low-dimensional and similar between subjects ↔ figure4.py, lines 382 to 411 · score 0.59 · chest tuning motifs, chest position tuning, dimensions, video · Report a mismatch
- [20] § Results › Perceptual decisions in expert performers are modulated by trial history ↔ figure1_and_supplementary_figure1.py, lines 221 to 246 · score 0.58 · lower lapse rates, incorrect right, sensitivity, bias, sensory, Trial history · Report a mismatch
- [21] § Results › Trial history can be decoded from ACC population activity ↔ reviewer_figure2.py, lines 394 to 421 · score 0.57 · cross decoding accuracy, late ITI, shuffled accuracies, sem, Bars, phase · Report a mismatch
- [22] § Results › Trial history can be decoded from ACC population activity ↔ chiCa/decoding_utils.py, lines 1292 to 1415 · score 0.57 · confusion matrices, cross decoding, shuffled accuracies, neural activity, coefficient, decoder · Report a mismatch
- [23] § Results › Neural dynamics representing trial history are low-dimensional and similar between subjects ↔ statistical_testing.R, lines 47 to 91 · score 0.57 · subject procrustes distance, encoding weights, chest, dimensions, trial history, video · Report a mismatch
- [24] § Results › Perceptual decisions in expert performers are modulated by trial history ↔ figure1_and_supplementary_figure1.py, lines 157 to 212 · score 0.55 · Wilson score interval, stimulus rate, Psychometric, Figure 1, trial history, error · Report a mismatch
- [25] § Results › Neural representations of trial history cannot solely be explained by body posture or movements ↔ encoding_model_fitting.py, lines 374 to 456 · score 0.53 · unique explained variance, Video SVD, full model, fitted, shuffled, regressors · Report a mismatch
Paper
Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
R · 206 lines · 12 KB · GPL-3.0 · 4 matches
- # This script performs all the statistical testing for the analysis in
- # "Anterior cingulate neurons combine outcome monitoring of past decisions
- # with ongoing movement signals", by Oesch et al.
- #
- # The analyses here assume that all the results data frames are saved as .csv
- # files into the same file directory (base_dir, to be set by the user below).
- # To export the results from statistical analyses use the following:
- # write.csv(summary(fit)$coefficients, "path_to_my_file.csv") for lme results, and
- # write.csv(summary(emm, by = NULL, adjust = "sidak")$contrasts,"path_to_my_file.csv")
- # for the contrasts on the computed marginal means with p-values adjusted for
- # multiple comparison using sidak's method.
- #
- # LO, February 2026
- #-------------------------------------------------------------------------------
- #Importing
- library(lmerTest)
- library(ggplot2)
- library(emmeans)
- #Define the base directory for all the analysis files
- base_dir <- "/Users/loesch/Documents/Churchland_lab/Trial-history_manuscript/data_tables"
- # --------------Figure 1F----------------------------------------
- # Comparing the magnitudes of the model weights to the shuffled control
- data <- read.csv(file.path(base_dir, "Fig1F_logreg_weights.csv"), header=TRUE, sep=",")
- data$is_shuffle <- relevel(factor(data$is_shuffle), ref="shuffle")
- fit <- lmerTest::lmer(abs_logreg_weights ~ regressor * is_shuffle + (1 |subject), data = data)
- summary(fit) #
- emm = emmeans(fit, specs = pairwise ~ is_shuffle | regressor, pbkrtest.limit = 4272)
- summary(emm, by=NULL, adjust = "sidak")
- # -------------Figure 1H-----------------------------------------
- # Fitting linear relationship between the difference between history strength
- # and stimulus weight, and performance
- data <- read.csv(file.path(base_dir, "Fig1H_hist_delta_vs_performance.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(performance ~ hist_stim_coef_delta + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # -----------Figure 2F----------------------------------------------
- # Test for decoding accuracy difference between data and shuffle
- data <- read.csv(file.path(base_dir, "Fig2F_decoding_accuracy_decoder_vs_shuffle.csv"), header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref="shuffle") #Set shuffle to be the reference class
- fit <- lmerTest::lmer(accuracy ~ condition * time + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- # -----------Figure 2G---------------------------------------------
- # Comparing the decoding accuracy between the different trial history contexts
- data <- read.csv(file.path(base_dir, "Fig2G_class_wise_decoding_accuracy.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(accuracy ~ history_context * time + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ history_context | time, pbkrtest.limit = 12236)
- summary(emm, by = NULL, adjust = "sidak")
- # ------------Figure 2J-----------------------------------------------
- # Compare cross-decoding accuracy with shuffled control
- data <- read.csv(file.path(base_dir, "Fig2J_phase_wise_cross_decoding.csv"), header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref="shuffle")
- data$seed <- relevel(factor(data$seed), ref="Early ITI") #Seed here refers to the phase the decoder was trained in
- data$phase <- relevel(factor(data$phase), ref="Early ITI") #Phase is the testing phase
- fit <- lmerTest::lmer(accuracy ~ seed*phase*condition + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ condition | seed*phase)
- summary(emm, by = NULL, adjust = "sidak")
- # -----------Figure 4D------------------------------------------------
- #Compare the dimensionality of trial history, chest and video encoding
- data <- read.csv(file.path(base_dir, "Fig4D_encoding_weight_dimensionality.csv"), header=TRUE, sep=",")
- data$regressor <- relevel(factor(data$regressor), ref="previous_choice_outcome_combination")
- fit <- lmerTest::lmer(dimensionality ~ regressor + (1 |subject/session), data = data, REML = FALSE) #Here regressor refers to chest, trial history, etc
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ regressor )
- summary(emm, by = NULL, adjust = "sidak")
- # -----------Figure 4G-----------------------------------------------
- #Compare the within- and across subject procrustes distances for trial history, chest and video
- data <- read.csv(file.path(base_dir, "Fig4G_procrustes_distance.csv"), header=TRUE, sep=",")
- data$regressor <- relevel(factor(data$regressor), ref="previous_choice_outcome_combination")
- data$condition <- relevel(factor(data$condition), ref="within")
- fit <- lmerTest::lmer(procrustes_distance ~ regressor * condition + (1 |subject), data = data, REML = FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ regressor *condition)
- summary(emm, by = NULL, adjust = "sidak")
- # ------------Supplementary Figure 1A----------------------------------
- # Perceptual bias
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1A_perceptual_bias.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(param_estimate ~ trial_history + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ trial_history)
- summary(emm, by = NULL, adjust = "sidak")
- # ------------Supplementary Figure 1B----------------------------------
- # Sensitivity
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1B_sensitivity.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(param_estimate ~ trial_history + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # ------------Supplementary Figure 1C----------------------------------
- # Sensitivity
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1C_upper_lapse_rate.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(param_estimate ~ trial_history + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # ------------Supplementary Figure 1D----------------------------------
- # Sensitivity
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1D_lower_lapse_rate.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(param_estimate ~ trial_history + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # ----------Supplementary Figure 1E--------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1E_weigth_variance_no_shuffle.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(weight_variance ~ regressor + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # ----------Supplementary Figure 1G------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig1G_main_effects_logreg_weights.csv"), header=TRUE, sep=",")
- data$is_shuffle <- relevel(factor(data$is_shuffle), ref="shuffle")
- data$regressor <- relevel(factor(data$regressor), ref="intercept")
- fit <- lmerTest::lmer(abs_logreg_weights ~ regressor * is_shuffle + (1 |subject), data = data)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ regressor | is_shuffle, pbkrtest.limit = 5632)
- summary(emm, by = NULL, adjust = "sidak")
- #------------Supplementary Figure 2B----------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig2_decoding_accuracy_different_decoders.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(accuracy ~ decoded_variable * is_history + (1 |subject/session), data = data, REML = FALSE)
- summary(fit)
- #------------Supplementary Figure 2C----------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig2C_stim_phase_decoding_accuracy_by_ITI_duration.csv"), header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref = "Shuffle")
- fit <- lmerTest::lmer(decoding_accuracy ~ condition * ITI_bin + (1 | subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ condition | ITI_bin)
- summary(emm, by = NULL, adjust = "sidak")
- #------------Supplementary Figure 2D----------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig2D_Stim_phase_decoding_accuracy_by_ITI_duration_hist_context.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(decoding_accuracy ~ hist_context * ITI_bin + (1 | subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ hist_context | ITI_bin)
- summary(emm, by = NULL, adjust = "sidak")
- #------------Supplementary Figure 2E----------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig2E_history_decoding_t-2_overall.csv"), , header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref = "Shuffle")
- fit <- lmerTest::lmer(decoding_accuracy ~ condition * time + (1 | subject/session), data = data, REML=FALSE)
- summary(fit)
- #------------Supplementary Figure 2F----------------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig2F_history_decoding_t-2_by_context.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(decoding_accuracy ~ hist_context * time + (1 | subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ hist_context | time, pbkrtest.limit = 11172)
- summary(emm, by = NULL, adjust = "sidak")
- # -----------Supplementary Figure 5B and E---------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig5.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(decoding_accuracy ~ lens_AP * lens_DV + sex + (1 | subject), data = data, REML=FALSE)
- summary(fit)
- # ---------Supplementary Figure 5C and F----------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig5.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(cvR ~ lens_AP * lens_DV + sex + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- # --------Supplementary Figure 5D and G-----------------------------------------
- data <- read.csv(file.path(base_dir, "Supplementary_Fig5.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(dR ~ lens_AP * lens_DV + sex + (1 |subject), data = data, REML=FALSE)
- summary(fit)
- #---------Reviewer Figure 2A----------------------------------------------------
- # Test for decoding accuracy difference between data and shuffle for all sessions with no overlap between ITI phases
- data <- read.csv(file.path(base_dir, "Reviewer_Figure2a_decoding_accuracy_decoder_vs_shuffle_no_overlap.csv"), header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref="shuffle") #Set shuffle to be the reference class
- fit <- lmerTest::lmer(accuracy ~ condition * time + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- # -----------Reviewer Figure 2B---------------------------------------------
- # Comparing the decoding accuracy between the different trial history contexts for sessions with no overlap between ITI phases
- data <- read.csv(file.path(base_dir, "Reviewer_figure2b_class_wise_decoding_accuracy_no_overlap.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(accuracy ~ history_context * time + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ history_context | time, pbkrtest.limit = 12236)
- summary(emm, by = NULL, adjust = "sidak")
- # ------------Reviewer Figure 2E-----------------------------------------------
- # Compare cross-decoding accuracy with shuffled control for sessions with no overlap for the two ITI phases
- data <- read.csv(file.path(base_dir, "Reviewer_Figure2e_phase_wise_cross_decoding_no_overlap.csv"), header=TRUE, sep=",")
- data$condition <- relevel(factor(data$condition), ref="shuffle")
- data$seed <- relevel(factor(data$seed), ref="Early ITI") #Seed here refers to the phase the decoder was trained in
- data$phase <- relevel(factor(data$phase), ref="Early ITI") #Phase is the testing phase
- fit <- lmerTest::lmer(accuracy ~ seed*phase*condition + (1 |subject/session), data = data, REML=FALSE)
- summary(fit)
- emm = emmeans(fit, specs = pairwise ~ condition | seed*phase)
- summary(emm, by = NULL, adjust = "sidak")
- # -------------Reviewer Figure 3A-----------------------------------------
- # Fitting linear relationship between the difference between history strength
- # and stimulus weight, and performance excluding one animal (LY008) with sessions
- # showing a large difference between history strength and stimulus weight.
- data <- read.csv(file.path(base_dir, "Reviewer_figure3a_hist_delta_vs_performance.csv"), header=TRUE, sep=",")
- fit <- lmerTest::lmer(performance ~ hist_stim_coef_delta + (1 |subject), data = data, REML=FALSE)
- summary(fit)
statistical_testing.R at commit 989045b, under GPL-3.0 · at the source
Overview
Abstract
In dynamic environments, animals must closely monitor the effects of their actions to inform switches in behavioral strategy. Anterior cingulate cortex (ACC) neurons track decision outcomes in these environments. Yet, it remains unclear whether ACC neurons similarly monitor behavioral history in static environments and, if so, whether these signals are distinct from movement representations. We recorded large-scale ACC activity in freely moving mice making visual evidence-accumulation decisions. Many ACC neurons exhibited nonlinear mixed selectivity for previous choices and outcomes (trial history) and were modulated by movements. Trial history could be stably decoded from population activity and accounted for a separable component of neural activity than posture and movements. Trial history encoding was conserved across different subjects and was unaffected by fluctuating behavioral biases. These findings demonstrate that trial history monitoring in ACC is implemented in a conserved population code that is independent of the volatility of subjects’ task environment.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 25 matches between paragraphs and lines of code.
churchlandlab/chipmunk
a112fde94d24b4ca89590081a2aef2d7b4e2e96c, 6 April 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
47 files
- Functions/
DemonstratorFigure.m , MATLAB, 444 lines - Functions/
InitiationTimePlotObserv , MATLAB, 75 lineser.m - Functions/
InterTrialIntervalPlotOb , MATLAB, 53 linesserver.m - Functions/
LEDswitch.m , MATLAB, 16 lines - Functions/
ObserverDeck/ , C++, 203 linesArCOM.cpp - Functions/
ObserverDeck/ , C/C++, 85 linesArCOM.h - Functions/
ObserverDeck/ , MATLAB, 43 linesObserverDeck_TeensyTesti ng_SMA.m - Functions/
ObserverFigure.m , MATLAB, 169 lines - Functions/
OutcomePlotDemonstrator. , MATLAB, 130 linesm - Functions/
PerformancePlotDemonstra , MATLAB, 141 linestor.m - Functions/
PsychometricPlotDemonstr , MATLAB, 110 linesator.m - Functions/
SoftCodeHandler_PlaySoun , MATLAB, 6 linesd.m - Functions/
StateMachineLogicPlot.m , MATLAB, 56 lines - Functions/
StateMatrices/ , MATLAB, 235 linesDemonstratorFixationTrai ningSMA.m - Functions/
StateMatrices/ , MATLAB, 174 linesDemonstratorPacedFixatio nTrainingSMA.m - Functions/
StateMatrices/ , MATLAB, 169 linesDemonstratorPacedTaskSMA .m - Functions/
StateMatrices/ , MATLAB, 137 lines, 2 matchesDemonstratorSelfInitiate dTaskSMA.m - Functions/
StateMatrices/ , MATLAB, 245 lines, 2 matchesDemonstratorTaskSMA.m - Functions/
StateMatrices/ , MATLAB, 245 linesDemonstratorTaskStopStim SMA.m - Functions/
StateMatrices/ , MATLAB, 385 linesFreelyMovingNonSocialObs erverTaskSMA.m - Functions/
StateMatrices/ , MATLAB, 245 linesFreelyMovingObsDemonstra torTaskSMA.m - Functions/
StateMatrices/ , MATLAB, 385 linesNonSocialObserverTaskSMA .m - Functions/
StateMatrices/ , MATLAB, 397 linesObserverFixationTraining SMA.m - Functions/
StateMatrices/ , MATLAB, 351 linesObserverTaskSMA.m - Functions/
StateMatrices/ , MATLAB, 174 linesObserverTaskSMA_outdated .m - Functions/
StimulusPlotDemonstrator , MATLAB, 60 lines.m - Functions/
Utilities/ , MATLAB, 177 linesv2struct.m - Functions/
WaitTimeDiffPlotDemonstr , MATLAB, 86 linesator.m - Functions/
WaitTimePlotObserver.m , MATLAB, 79 lines - Functions/
createAuditoryStimSignal , MATLAB, 61 lines.m - Functions/
createVisualStimSignal.m , MATLAB, 38 lines - Functions/
drawStimModality.m , MATLAB, 27 lines - Functions/
findStimRate.m , MATLAB, 52 lines - Functions/
generateTaskControlSound , MATLAB, 96 liness.m - Functions/
generate_random_delay.m , MATLAB, 7 lines - Functions/
getAntiBiasPLeft.m , MATLAB, 59 lines - Functions/
initChipmunk.m , MATLAB, 185 lines - Functions/
poissonStimulusTrain.m , MATLAB, 51 lines - Functions/
retrieveTrialData.m , MATLAB, 232 lines - Functions/
twoIntervalStimulusTrain , MATLAB, 74 lines.m - Functions/
updateAntiBiasArrays.m , MATLAB, 97 lines - MiniscopeTools/
syncMiniscopeToBpod.py , Python, 146 lines - chipmunk.m, MATLAB, 850 lines
- labdata_plugin/
__init__.py , Python, 2 lines - labdata_plugin/
pluginschema.py , Python, 217 lines, 2 matches - labdata_plugin/
utils.py , Python, 756 lines - README.md, Text, 89 lines
jcouto/fit_psychometric
665d058ac2f9d83a73747c68bd36d2697d778f6f, 10 August 2023Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
7 files
- fit_psychometric/
__init__.py , Python, 6 lines - fit_psychometric/
analysis.py , Python, 234 lines - tutorials/
tutorial1_psychometric_d , Jupyter, 250 linesata_and_wilson_confidenc e.ipynb - tutorials/
tutorial2_basic_psychome , Jupyter, 214 linestric_curve_fitting.ipynb - tutorials/
tutorial3_fit_psychometr , Jupyter, 85 linesic_with_statsmodels.ipyn b - LICENSE, License, 674 lines
- README.md, Text, 6 lines
churchlandlab/chiCa
1bb1546074c4af0877b1bf6e1e9db7c43ea492c5, 13 February 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
75 files
- chiCa/
__init__.py , Python, 9 lines - chiCa/
align_behavioral_video_e , Python, 100 linesarlyGRBsessions.py - chiCa/
bin_and_concatentate_mov , Python, 85 linesies.py - chiCa/
chipmunk_analysis_tools. , Python, 1,570 linespy - chiCa/
chipmunk_synchronizer_to , Python, 145 linesols.py - chiCa/
choice_strategy_models.p , Python, 686 linesy - chiCa/
cnmfe_full_session_spyde , Python, 376 linesr.py - chiCa/
decoder_ay.py , Python, 192 lines - chiCa/
decoding_utils.py , Python, 1,415 lines, 1 match - chiCa/
encoding_model_full_vers , Python, 508 lines, 1 matchion.py - chiCa/
encoding_model_single_ti , Python, 305 lines, 1 matchmepoints.py - chiCa/
encoding_utils.py , Python, 962 lines - chiCa/
load_cnmfe_outputs.py , Python, 123 lines - chiCa/
logistic_regression_alon , Python, 183 linesg_task_period.py - chiCa/
logistic_regression_head , Python, 211 linesing_direction.py - chiCa/
multi_session_registrati , Python, 52 lineson.py - chiCa/
neuron_selection_GUI.py , Python, 316 lines, 1 match - chiCa/
popup_figure_from_traces , Python, 470 lines_plot.py - chiCa/
psth_visual_SpatialSparr , Python, 470 linesow.py - chiCa/
sandbox/ , Python, 104 linesload_and_save_specified_ video_sequence.py - chiCa/
sandbox/ , Python, 131 linesmovie_projection.py - chiCa/
sandbox/ , Python, 72 linesneuron_shape_and_respons e_multi_session.py - chiCa/
sandbox/ , Python, 118 linestensor_decomposition_ana lysis.py - chiCa/
sandbox/ , Python, 97 linestoy_example_decoding.py - chiCa/
sandbox/ , Python, 53 linesvideo_svd_tools.py - chiCa/
sandbox/ , Python, 337 linesvisualize_video.py - chiCa/
visualization_utils.py , Python, 196 lines - obsolete/
Practice1.py , Python, 70 lines - obsolete/
align_session_data.py , Python, 236 lines - obsolete/
balanced_splits_encoding , Python, 843 lines_model.py - obsolete/
basic_encoding_model.py , Python, 764 lines - obsolete/
binMatrix.py , Python, 15 lines - obsolete/
binarizeTaskEvents.py , Python, 30 lines - obsolete/
chipmunk_mulit_animal_pe , Python, 146 linesrformance_loop_over_old_ chipmunk.py - obsolete/
chipmunk_observer_multi_ , Python, 86 linesanimal.py - obsolete/
chipmunk_performance_met , Python, 250 linesrics_multiAnimal.py - obsolete/
column.py , Python, 2 lines - obsolete/
computeROCscore.py , Python, 55 lines - obsolete/
correlationMatrixforDiff , Python, 27 lineserentEvents.py - obsolete/
find_behavior_event_imag , Python, 331 linesing.py - obsolete/
interpolate_dropped_fram , Python, 88 lineses.py - obsolete/
loadCSVData.py , Python, 20 lines - obsolete/
loadHDF5Data.py , Python, 71 lines - obsolete/
parallel_processing_dumm , Python, 14 linesy.py - obsolete/
permuteCalciumTrace.py , Python, 66 lines - obsolete/
plotAllTaskVariableCalci , Python, 31 linesumTrace.py - obsolete/
plotAllTaskVariableHeatm , Python, 29 linesap.py - obsolete/
plotEventTriggeredAverag , Python, 33 linese for all cells.py - obsolete/
plotEventTriggeredAverag , Python, 36 lineseforRewardCells.py - obsolete/
plotRightLeftRewardRespo , Python, 24 linesnses.py - obsolete/
plotSampleTraces.py , Python, 37 lines - obsolete/
plotSingleNeuronResponse , Python, 67 linestoCenterInitiationandWit hdrawal.py - obsolete/
plotSingleNeuronResponse , Python, 126 linestoCenterLeftRightPorts.p y - obsolete/
plot_choice_interactions , Python, 480 lines.py - obsolete/
plot_different decoder_balancing.py , Python, 828 lines - obsolete/
plot_single_cell_trace_b , Python, 228 linesy_task_variables.py - obsolete/
plot_state_locked_activi , Python, 64 linesty_by_side_and_outcome.p y - obsolete/
plot_stimulus_aligned_tr , Python, 131 linesaces.py - obsolete/
setEventOnsetIDX.py , Python, 38 lines - obsolete/
setRewardOnsetFrames.py , Python, 85 lines - obsolete/
svmAnalysisPipeline.py , Python, 73 lines - obsolete/
svmAnalysisPipeline_subs , Python, 114 linesampling.py - obsolete/
svmAnalysisPipeline_subs , Python, 111 linesampling_lasso.py - obsolete/
svmAnalysis_sliding_wind , Python, 98 linesow.py - obsolete/
svmAnalysis_trial2.py , Python, 101 lines - obsolete/
svmLasso.py , Python, 36 lines - obsolete/
svmSlidingWindow.py , Python, 108 lines - obsolete/
svmSlidingWindow_subsamp , Python, 145 linesled.py - obsolete/
temp_plot_decoder_perfor , Python, 88 linesmance.py - obsolete/
visualize_task_aligned_t , Python, 314 linesraces.py - sandbox/
me_svd_multiples.py , Python, 41 lines - sandbox/
video_svd_crop.py , Python, 69 lines - sandbox/
video_svd_multiples.py , Python, 44 lines - setup.py, Python, 27 lines
- README.md, Text, 4 lines
jcouto/labdata-tools
859b1e3ab4c8555e95942cc45c12f39ef9666727, 28 May 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
24 files
- analysis/
analysis_caiman.py , Python, 798 lines, 1 match - analysis/
analysis_deeplabcut.py , Python, 1,106 lines - analysis/
analysis_kilosort25.py , Python, 339 lines - analysis/
analysis_mptracker.py , Python, 73 lines - analysis/
analysis_spikeinterface. , Python, 262 linespy - analysis/
analysis_spks.py , Python, 83 lines - analysis/
analysis_spksibl.py , Python, 191 lines - analysis/
analysis_suite2p.py , Python, 198 lines - analysis/
analysis_videosvd.py , Python, 192 lines - analysis/
analysis_wfield.py , Python, 77 lines - examples/
rename_remote_datatype.i , Jupyter, 35 linespynb - examples/
tutorial - basic usage from python.ipynb , Jupyter, 91 lines - labdatatools/
__init__.py , Python, 5 lines - labdatatools/
analysis.py , Python, 212 lines - labdatatools/
cleanup.py , Python, 121 lines - labdatatools/
cli.py , Python, 360 lines - labdatatools/
rclone.py , Python, 332 lines - labdatatools/
remote.py , Python, 73 lines - labdatatools/
slurm.py , Python, 84 lines - labdatatools/
uge.py , Python, 95 lines - labdatatools/
utils.py , Python, 195 lines - setup.py, Python, 69 lines
- LICENSE, License, 674 lines
- README.md, Text, 74 lines
jcouto/wfield
0befe16679f2503a5126decabcd2a66e2d55d710, 26 August 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
40 files
- notebooks/
approximate_svd.ipynb , Jupyter, 110 lines - notebooks/
approximate_svd_on_video , Jupyter, 44 lines.ipynb - notebooks/
blockwise_svd.ipynb , Jupyter, 76 lines - notebooks/
compute_baseline.ipynb , Jupyter, 35 lines - notebooks/
figures/ , Jupyter, 137 linesfigure_hemodynamics_corr ection.ipynb - notebooks/
hemodynamics_correction. , Jupyter, 67 linesipynb - notebooks/
imager_extract_stimulus_ , Jupyter, 32 linestimes.ipynb - notebooks/
imager_load_data.ipynb , Jupyter, 57 lines - notebooks/
imager_stim_average.ipyn , Jupyter, 49 linesb - notebooks/
masked_decomposition.ipy , Jupyter, 38 linesnb - notebooks/
match_dorsal_cortex_to_t , Jupyter, 115 lineshe_allen.ipynb - notebooks/
match_sessions.ipynb , Jupyter, 116 lines - notebooks/
motion_correction.ipynb , Jupyter, 44 lines - notebooks/
phasemaps_svd.ipynb , Jupyter, 83 lines - notebooks/
prepare_allen_map.ipynb , Jupyter, 166 lines - notebooks/
tutorial_example_warping , Jupyter, 168 lines_stack_ROIs.ipynb - notebooks/
tutorial_run_locaNMF.ipy , Jupyter, 159 linesnb - setup.py, Python, 53 lines
- wfield/
__init__.py , Python, 29 lines - wfield/
allen.py , Python, 629 lines - wfield/
allen_utils.py , Python, 39 lines - wfield/
cli.py , Python, 671 lines - wfield/
dask.py , Python, 56 lines - wfield/
decomposition.py , Python, 275 lines - wfield/
hemocorrection.py , Python, 84 lines - wfield/
imutils.py , Python, 187 lines - wfield/
io.py , Python, 890 lines - wfield/
local_nmf.py , Python, 123 lines - wfield/
multisession.py , Python, 140 lines - wfield/
ncaas.py , Python, 152 lines - wfield/
ncaas_gui.py , Python, 1,526 lines - wfield/
ncaas_utils.py , Python, 276 lines - wfield/
plots.py , Python, 134 lines - wfield/
registration.py , Python, 203 lines - wfield/
utils.py , Python, 584 lines - wfield/
utils_svd.py , Python, 68 lines - wfield/
viz.py , Python, 237 lines - wfield/
widgets.py , Python, 1,006 lines - LICENSE.txt, License, 674 lines
- README.md, Text, 107 lines
LukasOesch/Oesch_et_al_Trial_History_ACC
989045b63ade4208434724e79ca766b18c21a3bf, 26 February 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
12 files
- encoding_model_fitting.p
y , Python, 505 lines, 3 matches - figure1_and_supplementar
y_figure1.py , Python, 802 lines, 2 matches - figure2.py, Python, 792 lines
- figure3.py, Python, 338 lines
- figure4.py, Python, 412 lines, 3 matches
- reviewer_figure2.py, Python, 1,075 lines, 2 matches
- statistical_testing.R, R, 206 lines, 4 matches
- supplementary_figure2.py
, Python, 718 lines - supplementary_figure3.py
, Python, 161 lines - supplementary_figure4_an
d_5.py , Python, 425 lines - LICENSE, License, 674 lines
- README.md, Text, 36 lines
Zenodo 18793084
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
12 files
- encoding_model_fitting.p
y , Python, 505 lines - figure1_and_supplementar
y_figure1.py , Python, 802 lines - figure2.py, Python, 792 lines
- figure3.py, Python, 338 lines
- figure4.py, Python, 412 lines
- reviewer_figure2.py, Python, 1,075 lines
- statistical_testing.R, R, 206 lines
- supplementary_figure2.py
, Python, 718 lines - supplementary_figure3.py
, Python, 161 lines - supplementary_figure4_an
d_5.py , Python, 425 lines - LICENSE, License, 674 lines
- README.md, Text, 36 lines
Code availability
All code is publicly available. The code to run the analyses and statistical models, and to generate the figure panels presented in this study, can be found in the following repository79: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 7 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 205 scripts, each with its path and the digest of its content;
- 25 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- figshare:30670382, at figshare; found in DataCite
Data availability
All the data used in this study have been deposited on figshare78 and are publicly available under the following accession code: 10.6084/
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 2 keywords, 9 MeSH terms, 3 funders, 78 references.
Cite
This paper
Oesch, L. T., Thomas, M. C., Sandberg, D., Couto, J., & Churchland, A. K. (2026). Anterior cingulate neurons combine outcome monitoring of past decisions with ongoing movement signals. Nature communications, 17(1), 4354. https://
BibTeX
@article{oesch2026anteri
author = {Oesch, Lukas T. and Thomas, Makenna C. and Sandberg, Davis and Couto, João and Churchland, Anne K.},
title = {{Anterior cingulate neurons combine outcome monitoring of past decisions with ongoing movement signals}},
journal = {Nature communications},
year = {2026},
month = mar,
volume = {17},
number = {1},
pages = {4354},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/
url = {https://
pmid = {41872182},
pmcid = {PMC13171896}
}
RIS
TY - JOUR
AU - Oesch, Lukas T.
AU - Thomas, Makenna C.
AU - Sandberg, Davis
AU - Couto, João
AU - Churchland, Anne K.
TI - Anterior cingulate neurons combine outcome monitoring of past decisions with ongoing movement signals
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/
VL - 17
IS - 1
SP - 4354
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Anterior cingulate neurons combine outcome monitoring of past decisions with ongoing movement signals",
"container-title": "Nature communications",
"author": [
{
"family": "Oesch",
"given": "Lukas T."
},
{
"family": "Thomas",
"given": "Makenna C."
},
{
"family": "Sandberg",
"given": "Davis"
},
{
"family": "Couto",
"given": "João"
},
{
"family": "Churchland",
"given": "Anne K."
}
],
"container-title-short":
"volume": "17",
"issue": "1",
"page": "4354",
"DOI": "10.1038/
"PMID": "41872182",
"PMCID": "PMC13171896",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
24
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.21203/rs.3.rs-6858161/v1 [code]
- Anterior cingulate cortex mixes retrospective cognitive signals and ongoing movement signatures during decision-makingJournal: Research Square (preprint)In common: Suite2p, CaImAn, DeepLabCut, 19 other tools, 56 references, 3 authors
- [2] doi:10.1101/2025.04.11.648398 [code]
- Anterior cingulate cortex mixes retrospective cognitive signals and ongoing movement signatures during decision-makingJournal: bioRxiv (preprint)In common: Suite2p, CaImAn, DeepLabCut, 19 other tools, 56 references, author Lukas T. Oesch
- [3] doi:10.7554/elife.100840 [code]
- Reproducibility of in vivo electrophysiological measurements in mice.Journal: eLifeIn common: AllenSDK, tifffile, UMAP, 13 other tools, mouse, 5 references, author Anne K Churchland
- [4] doi:10.1038/s41586-025-08840-3 [code]
- Functional connectomics reveals general wiring rule in mouse visual cortex.Journal: NatureIn common: CaImAn, DeepLabCut, tifffile, 16 other tools, mouse, 3 references
- [5] doi:10.1038/s41467-023-37400-4 [code]
- Dynamical latent state computation in the male macaque posterior parietal cortex.Journal: Nature communicationsIn common: DeepLabCut, napari, Numba, 13 other tools, 6 references
- [6] doi:10.7554/elife.94167 [code]
- Pan-cortical 2-photon mesoscopic imaging and neurobehavioral alignment in awake, behaving mice.Journal: eLifeIn common: AllenSDK, tifffile, Numba, 12 other tools, mouse, 6 references
- [7] doi:10.1038/s41593-026-02213-3 [code]
- Functional bipartite invariance in mouse primary visual cortex receptive fields.Journal: Nature neuroscienceIn common: CaImAn, DeepLabCut, tifffile, 15 other tools, mouse, 1 reference
- [8] doi:10.1038/s41586-025-08829-y [code]
- Foundation model of neural activity predicts response to new stimulus types.Journal: NatureIn common: CaImAn, DeepLabCut, tifffile, 14 other tools, mouse, 1 reference
- [9] doi:10.7554/elife.83289 [code]
- Model discovery to link neural activity to behavioral tasks.Journal: eLifeIn common: CaImAn, tifffile, UMAP, 12 other tools, mouse, 3 references
- [10] doi:10.1038/s41593-026-02232-0 [code]
- Entorhinal cortex represents task-relevant remote locations independently of CA1.Journal: Nature neuroscienceIn common: DeepLabCut, SpikeInterface, Numba, 14 other tools, mouse, 1 reference
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 7 repositories of the authors' code, each at its verified commit and with its license, 205 scripts, and 25 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:65dec635a7f47f22…
Add the badge to the code's README
If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.
Markdown
<!-- oscr-badge:start -->
[](https://openscicode.org/badge/doi/10.1038/s41467-026-70639-1)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1038/s41467-026-70639-1.svg
:target: https://openscicode.org/badge/doi/10.1038/s41467-026-70639-1
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1038/s41467-026-70639-1"><img src="https://openscicode.org/badge/doi/10.1038/s41467-026-70639-1.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".
- churchlandlab/chipmunk: README.md on GitHub
- churchlandlab/chiCa: README.md on GitHub
- jcouto/labdata-tools: README.md on GitHub
- jcouto/wfield: README.md on GitHub
- LukasOesch/Oesch_et_al_Trial_History_ACC: README.md on GitHub
If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge page.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.
Report a mismatch between the code and the paper · Report a code error (signed in)
Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.
Report a reproduction failure (signed in)
Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
