Dynamic representations of valence in anterior cingulate cortex in mice.
The 2 matches
- [1] § Results › ACC represents aspects of the US ↔ analyze_ideas_traces_final.py, lines 343–417 · score 0.59 · peak offset, peak onset, peak amplitude, AUC, error
- [2] § Materials and methods › Data analysis and statistics › Event-related (peri-event) activity ↔ analyze_ideas_traces_final.py, lines 343–417 · score 0.56 · peak onset, Peak amplitudes, window, offset, baseline, trace
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 674 lines · 20 KB · CC-BY-4.0 · 2 matches
- import re
- import time
- import traceback
- from pathlib import Path
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- # ======================================================
- # CONFIG
- # ======================================================
- ALLCELLS_INPUT_DIR = Path(r"C:\Users\pgoswamee\Desktop\new EAPA traces_ALL CELLS")
- LCR_INPUT_DIR = Path(r"C:\Users\pgoswamee\Desktop\new EAPA trace-LCR")
- # ---- COLUMN INDICES (0-based) ----
- COL_TIME = 0
- COL_BASE_TRUE = 1 # Column B
- COL_UP_TRUE = 3 # Column D
- COL_DOWN_TRUE = 5 # Column F
- # ---- Analysis parameters ----
- MOVING_AVG_WINDOW = 5
- BASELINE_START = -20.0
- BASELINE_END = 0.0
- PEAK_SEARCH_START = 0.0
- PEAK_SEARCH_END = 20.0
- ONSET_MIN_TIME = -20.0
- SKIP_EXISTING_ANALYSIS_OUTPUTS = True
- # ---- Summary config ----
- LCR_DESIRED_CONDITIONS = [
- "D2RD3-EARLY", "D2RD3-LATE",
- "D3RD2-EARLY", "D3RD2-LATE",
- "D3RD4-EARLY", "D3RD4-LATE",
- "D4RD3-EARLY", "D4RD3-LATE",
- "D4RD5-EARLY", "D4RD5-LATE",
- "D5RD4-EARLY", "D5RD4-LATE",
- ]
- ALLCELLS_DESIRED_ORDER = [
- "D2-EARLY", "D2-LATE",
- "D3-EARLY", "D3-LATE",
- "D4-EARLY", "D4-LATE",
- "D5-EARLY", "D5-LATE",
- ]
- PREFERRED_ROW = "BASE"
- POSSIBLE_PEAK_COLS = [
- "Peak_Amplitude_diff",
- "Peak_Amplitude",
- ]
- POSSIBLE_AUC_COLS = [
- "AUC_dynamic_diff",
- "AUC_baseline_subtracted",
- "AUC_diff",
- "AUC",
- ]
- # ======================================================
- # COMMON UTILS
- # ======================================================
- def ensure_dir(path: Path):
- path.mkdir(parents=True, exist_ok=True)
- def try_write_csv(df: pd.DataFrame, path: Path) -> bool:
- for i in range(10):
- try:
- df.to_csv(path, index=True)
- return True
- except PermissionError:
- print(f" File locked, retrying ({i+1}/10)... {path.name}")
- time.sleep(1)
- print(f" ERROR: Could not save {path}, file is locked.")
- return False
- def moving_average(x, w=5):
- """Centered moving average, preserving your current analysis logic."""
- if w <= 1:
- return x
- return np.convolve(x, np.ones(w) / w, mode="same")
- def compute_baseline(trace, time_vec, t_start, t_end):
- mask = (time_vec >= t_start) & (time_vec <= t_end)
- if not np.any(mask):
- return np.nan
- return float(np.nanmean(trace[mask]))
- def find_peak(trace, time_vec, t_start, t_end):
- mask = (time_vec >= t_start) & (time_vec <= t_end)
- idxs = np.where(mask)[0]
- if len(idxs) == 0:
- return None, None, None
- sliced = trace[idxs]
- if np.all(np.isnan(sliced)):
- return None, None, None
- try:
- peak_local = int(np.nanargmax(sliced))
- except ValueError:
- return None, None, None
- peak_idx = idxs[peak_local]
- peak_val = float(trace[peak_idx])
- peak_time = float(time_vec[peak_idx])
- return peak_idx, peak_val, peak_time
- def find_onset_offset(trace, time_vec, baseline, peak_idx):
- n = len(trace)
- onset_idx = None
- for i in range(peak_idx, -1, -1):
- if time_vec[i] < ONSET_MIN_TIME:
- break
- if not np.isnan(trace[i]) and trace[i] <= baseline:
- onset_idx = i
- break
- if onset_idx is None:
- valid_idxs = np.where(time_vec >= ONSET_MIN_TIME)[0]
- onset_idx = int(valid_idxs[0]) if len(valid_idxs) > 0 else 0
- offset_idx = None
- for j in range(peak_idx, n):
- if time_vec[j] > PEAK_SEARCH_END:
- break
- if not np.isnan(trace[j]) and trace[j] <= baseline:
- offset_idx = j
- break
- if offset_idx is None:
- valid_idxs = np.where(time_vec <= PEAK_SEARCH_END)[0]
- offset_idx = int(valid_idxs[-1]) if len(valid_idxs) > 0 else (n - 1)
- return onset_idx, offset_idx
- def compute_auc_baseline_subtracted(trace, time_vec, baseline, onset_idx, offset_idx):
- if onset_idx is None or offset_idx is None or offset_idx <= onset_idx:
- return np.nan
- sliced_t = time_vec[onset_idx:offset_idx + 1]
- sliced_y = trace[onset_idx:offset_idx + 1] - baseline
- if len(sliced_t) < 2 or np.all(np.isnan(sliced_y)):
- return np.nan
- return float(np.trapz(sliced_y, sliced_t))
- def pick_metric(row: pd.Series, candidates):
- for c in candidates:
- if c in row.index:
- return row[c]
- return np.nan
- def compute_stats_over_subjects(table: pd.DataFrame):
- rows = []
- for cond in table.columns:
- vals = pd.to_numeric(table[cond], errors="coerce").values
- vals = vals[~np.isnan(vals)]
- n = len(vals)
- if n == 0:
- mean = np.nan
- sem = np.nan
- elif n == 1:
- mean = float(vals[0])
- sem = np.nan
- else:
- mean = float(np.mean(vals))
- sem = float(np.std(vals, ddof=1) / np.sqrt(n))
- rows.append({
- "condition": cond,
- "Mean": mean,
- "SEM": sem,
- "N": n,
- })
- return pd.DataFrame(rows).set_index("condition")
- def write_summary_workbook(out_xlsx: Path, tables: dict):
- with pd.ExcelWriter(out_xlsx, engine="xlsxwriter") as writer:
- for sheet_name, df in tables.items():
- df.to_excel(writer, sheet_name=sheet_name[:31])
- def make_mean_sem_plot(stats_df: pd.DataFrame, title: str, ylabel: str, out_png: Path):
- if stats_df.empty:
- print(f" WARNING: stats table empty for {out_png.name}, skipping figure.")
- return
- means = pd.to_numeric(stats_df["Mean"], errors="coerce").values
- sems = pd.to_numeric(stats_df["SEM"], errors="coerce").values
- labels = list(stats_df.index)
- if len(labels) == 0 or np.all(np.isnan(means)):
- print(f" WARNING: no plottable values for {out_png.name}, skipping figure.")
- return
- plt.figure(figsize=(12, 5))
- x = np.arange(len(labels))
- plt.bar(x, means, yerr=sems, capsize=4)
- plt.xticks(x, labels, rotation=45, ha="right")
- plt.ylabel(ylabel)
- plt.title(title)
- plt.tight_layout()
- plt.savefig(out_png, dpi=300, bbox_inches="tight")
- plt.close()
- print(f" Wrote figure: {out_png.name}")
- def make_condition_order(conditions_in_data, desired_order):
- final = []
- for c in desired_order:
- if c in conditions_in_data and c not in final:
- final.append(c)
- for c in sorted(conditions_in_data):
- if c not in final:
- final.append(c)
- return final
- # ======================================================
- # FLEXIBLE FILENAME NORMALIZATION / PARSING
- # ======================================================
- def clean_stem_for_parsing(stem: str) -> str:
- """
- Normalize filename stem to make parsing separator-agnostic.
- """
- stem = re.sub(r"(_baseline)?_analysis_output$", "", stem, flags=re.IGNORECASE)
- # Convert underscores and hyphens to spaces
- stem = stem.replace("_", " ").replace("-", " ")
- # Collapse repeated spaces
- stem = re.sub(r"\s+", " ", stem).strip()
- return stem.upper()
- def extract_subject(cleaned_stem: str):
- """
- Extract WTIN subject and normalize to 'WTIN 005'
- """
- m = re.search(r"\bWTIN\s*(\d+)\b", cleaned_stem)
- if not m:
- return None
- num = m.group(1)
- return f"WTIN {num}"
- def extract_epoch(cleaned_stem: str):
- if re.search(r"\bEARLY\b", cleaned_stem):
- return "EARLY"
- if re.search(r"\bLATE\b", cleaned_stem):
- return "LATE"
- return None
- def extract_lcr_condition(cleaned_stem: str):
- """
- Detect session-pair tokens like:
- D2RD3
- D4RD5
- Also tolerates split tokens:
- D2 RD3
- D2 RD D3
- """
- # Direct compact form
- m = re.search(r"\b(D[2-5]RD[2-5])\b", cleaned_stem)
- if m:
- return m.group(1)
- # Split form: D2 RD3
- m = re.search(r"\b(D[2-5])\s*RD\s*(D[2-5])\b", cleaned_stem)
- if m:
- return f"{m.group(1)}R{m.group(2)}".replace("R", "RD", 1)
- # Split form: D2 RD D3
- m = re.search(r"\b(D[2-5])\s*RD\s*(D[2-5])\b", cleaned_stem)
- if m:
- return f"{m.group(1)}RD{m.group(2)[1:]}"
- return None
- def extract_single_day_condition(cleaned_stem: str):
- """
- Detect single-session day token like D2, D3, D4, D5
- but avoid misreading D2RD3 as D2.
- """
- # Remove any LCR tokens first so we do not double-detect
- temp = re.sub(r"\bD[2-5]RD[2-5]\b", " ", cleaned_stem)
- temp = re.sub(r"\bD[2-5]\s*RD\s*D[2-5]\b", " ", temp)
- m = re.search(r"\b(D[2-5])\b", temp)
- if not m:
- return None
- return m.group(1)
- def parse_subject_and_condition_allcells_flexible(stem: str):
- cleaned = clean_stem_for_parsing(stem)
- subject = extract_subject(cleaned)
- epoch = extract_epoch(cleaned)
- day = extract_single_day_condition(cleaned)
- if subject is None or epoch is None or day is None:
- return None, None
- return subject, f"{day}-{epoch}"
- def parse_subject_and_condition_lcr_flexible(stem: str):
- cleaned = clean_stem_for_parsing(stem)
- subject = extract_subject(cleaned)
- epoch = extract_epoch(cleaned)
- pair = extract_lcr_condition(cleaned)
- if subject is None or epoch is None or pair is None:
- return None, None
- return subject, f"{pair}-{epoch}"
- # ======================================================
- # PER-FILE ANALYSIS
- # ======================================================
- def analyze_single_trace_file(csv_path: Path, analysis_output_dir: Path):
- print(f"\nProcessing raw trace file: {csv_path.name}")
- df = pd.read_csv(csv_path)
- df.columns = df.columns.str.strip()
- if "time" in df.columns:
- time_vec = pd.to_numeric(df["time"], errors="coerce").values
- else:
- time_vec = pd.to_numeric(df.iloc[:, COL_TIME], errors="coerce").values
- if np.all(np.isnan(time_vec)):
- raise ValueError("time column is all NaN")
- results = {}
- trace_specs = [
- ("BASE", COL_BASE_TRUE),
- ("UP", COL_UP_TRUE),
- ("DOWN", COL_DOWN_TRUE),
- ]
- for label, col_true in trace_specs:
- if col_true >= df.shape[1]:
- print(f" WARNING: column {col_true} out of range for {csv_path.name}, skipping {label}")
- continue
- true_raw = pd.to_numeric(df.iloc[:, col_true], errors="coerce").values
- true_sm = moving_average(true_raw, MOVING_AVG_WINDOW)
- baseline = compute_baseline(true_sm, time_vec, BASELINE_START, BASELINE_END)
- if np.isnan(baseline):
- print(f" WARNING: could not compute baseline for {label} in {csv_path.name}, skipping {label}.")
- continue
- peak_idx, peak_val, peak_time = find_peak(
- true_sm, time_vec, PEAK_SEARCH_START, PEAK_SEARCH_END
- )
- if peak_idx is None:
- print(f" WARNING: could not find peak for {label} in {csv_path.name}, skipping {label}.")
- continue
- peak_amp = peak_val - baseline
- onset_idx, offset_idx = find_onset_offset(true_sm, time_vec, baseline, peak_idx)
- onset_time = float(time_vec[onset_idx])
- offset_time = float(time_vec[offset_idx])
- auc = compute_auc_baseline_subtracted(true_sm, time_vec, baseline, onset_idx, offset_idx)
- results[label] = {
- "Baseline": baseline,
- "Peak_Amplitude": peak_amp,
- "Peak_Time": peak_time,
- "Peak_Onset_Time": onset_time,
- "Peak_Offset_Time": offset_time,
- "AUC_baseline_subtracted": auc,
- }
- if not results:
- print(" No valid traces analyzed for this file, skipping save.")
- return None
- out_df = pd.DataFrame(results).T
- out_name = csv_path.stem + "_baseline_analysis_output.csv"
- out_path = analysis_output_dir / out_name
- if SKIP_EXISTING_ANALYSIS_OUTPUTS and out_path.exists():
- print(f" Output already exists, skipping write: {out_path.name}")
- return out_path
- if try_write_csv(out_df, out_path):
- print(f" -> wrote {out_path.name}")
- return out_path
- else:
- print(f" -> FAILED to write {out_path.name}")
- return None
- def run_analysis_stage(input_dir: Path, analysis_output_dir: Path):
- ensure_dir(analysis_output_dir)
- raw_csv_paths = sorted(
- [p for p in input_dir.iterdir() if p.is_file() and p.suffix.lower() == ".csv"],
- key=lambda p: p.name
- )
- if not raw_csv_paths:
- print(f"No raw .csv files found in {input_dir}")
- return []
- print(f"\nFound {len(raw_csv_paths)} raw CSV files in {input_dir}:")
- for p in raw_csv_paths:
- print(" ", p.name)
- generated = []
- for csv_path in raw_csv_paths:
- try:
- out_path = analyze_single_trace_file(csv_path, analysis_output_dir)
- if out_path is not None:
- generated.append(out_path)
- except Exception as e:
- print(f" ERROR while processing {csv_path.name}: {e}")
- traceback.print_exc()
- print(" Skipping this file and continuing...")
- continue
- print(f"\n=== ANALYSIS STAGE DONE for {input_dir.name} ===")
- print(f"Generated/available per-file outputs: {len(generated)}")
- return generated
- # ======================================================
- # ALL-CELLS SUMMARY
- # ======================================================
- def run_summary_stage_allcells(analysis_output_dir: Path, summary_dir: Path, figure_dir: Path):
- ensure_dir(summary_dir)
- ensure_dir(figure_dir)
- summary_xlsx = summary_dir / "EAPA_summary_tables.xlsx"
- csv_paths = sorted(
- analysis_output_dir.glob("*_analysis_output.csv"),
- key=lambda p: p.name
- )
- if not csv_paths:
- print(f"No *_analysis_output.csv files found in {analysis_output_dir}")
- return
- records = []
- skipped = []
- for p in csv_paths:
- subj, cond = parse_subject_and_condition_allcells_flexible(p.stem)
- if subj is None or cond is None:
- skipped.append(p.name)
- continue
- try:
- df = pd.read_csv(p, index_col=0)
- except Exception as e:
- print(f" ERROR reading {p.name}: {e}")
- continue
- row = df.loc[PREFERRED_ROW] if PREFERRED_ROW in df.index else df.iloc[0]
- records.append({
- "subject": subj,
- "condition": cond,
- "peak": pick_metric(row, POSSIBLE_PEAK_COLS),
- "auc": pick_metric(row, POSSIBLE_AUC_COLS),
- })
- print(f"\nALL-CELLS summary parsed records: {len(records)}")
- if skipped:
- print(f"ALL-CELLS skipped files: {len(skipped)}")
- for name in skipped[:10]:
- print(" skipped:", name)
- if not records:
- print("No all-cells records parsed; no workbook or figures generated.")
- return
- rec_df = pd.DataFrame(records)
- subjects = sorted(rec_df["subject"].unique())
- cond_seen = sorted(rec_df["condition"].unique())
- final_conditions = make_condition_order(cond_seen, ALLCELLS_DESIRED_ORDER)
- peak_table = pd.DataFrame(data=np.nan, index=subjects, columns=final_conditions)
- auc_table = pd.DataFrame(data=np.nan, index=subjects, columns=final_conditions)
- for _, row in rec_df.iterrows():
- peak_table.loc[row["subject"], row["condition"]] = row["peak"]
- auc_table.loc[row["subject"], row["condition"]] = row["auc"]
- peak_stats = compute_stats_over_subjects(peak_table)
- auc_stats = compute_stats_over_subjects(auc_table)
- write_summary_workbook(summary_xlsx, {
- "PeakAmp": peak_table,
- "AUC": auc_table,
- "PeakAmp_stats": peak_stats,
- "AUC_stats": auc_stats,
- })
- print(f"Wrote ALL-CELLS workbook: {summary_xlsx}")
- make_mean_sem_plot(
- peak_stats,
- title="All-Cells Peak Amplitude Summary",
- ylabel="Peak Amplitude",
- out_png=figure_dir / "ALLCELLS_Peak_Amplitude_summary.png"
- )
- make_mean_sem_plot(
- auc_stats,
- title="All-Cells AUC Summary",
- ylabel="AUC",
- out_png=figure_dir / "ALLCELLS_AUC_summary.png"
- )
- # ======================================================
- # LCR SUMMARY
- # ======================================================
- def run_summary_stage_lcr(analysis_output_dir: Path, summary_dir: Path, figure_dir: Path):
- ensure_dir(summary_dir)
- ensure_dir(figure_dir)
- summary_xlsx = summary_dir / "LR_summary_metrics.xlsx"
- csv_paths = sorted(
- analysis_output_dir.glob("*_analysis_output.csv"),
- key=lambda p: p.name
- )
- if not csv_paths:
- print(f"No *_analysis_output.csv files found in {analysis_output_dir}")
- return
- records = []
- skipped = []
- for p in csv_paths:
- subj, cond = parse_subject_and_condition_lcr_flexible(p.stem)
- if subj is None or cond is None:
- skipped.append(p.name)
- continue
- try:
- df = pd.read_csv(p, index_col=0)
- except Exception as e:
- print(f" ERROR reading {p.name}: {e}")
- continue
- row = df.loc[PREFERRED_ROW] if PREFERRED_ROW in df.index else df.iloc[0]
- records.append({
- "subject": subj,
- "condition": cond,
- "peak": pick_metric(row, POSSIBLE_PEAK_COLS),
- "auc": pick_metric(row, POSSIBLE_AUC_COLS),
- })
- print(f"\nLCR summary parsed records: {len(records)}")
- if skipped:
- print(f"LCR skipped files: {len(skipped)}")
- for name in skipped[:10]:
- print(" skipped:", name)
- if not records:
- print("No LCR records parsed; no workbook or figures generated.")
- return
- rec_df = pd.DataFrame(records)
- subjects = sorted(rec_df["subject"].unique())
- cond_seen = sorted(rec_df["condition"].unique())
- final_conditions = make_condition_order(cond_seen, LCR_DESIRED_CONDITIONS)
- peak_table = pd.DataFrame(data=np.nan, index=subjects, columns=final_conditions)
- auc_table = pd.DataFrame(data=np.nan, index=subjects, columns=final_conditions)
- for _, row in rec_df.iterrows():
- peak_table.loc[row["subject"], row["condition"]] = row["peak"]
- auc_table.loc[row["subject"], row["condition"]] = row["auc"]
- peak_stats = compute_stats_over_subjects(peak_table)
- auc_stats = compute_stats_over_subjects(auc_table)
- write_summary_workbook(summary_xlsx, {
- "Peak_Amplitude": peak_table,
- "AUC": auc_table,
- "Peak_Amplitude_stats": peak_stats,
- "AUC_stats": auc_stats,
- })
- print(f"Wrote LCR workbook: {summary_xlsx}")
- make_mean_sem_plot(
- peak_stats,
- title="LCR Peak Amplitude Summary",
- ylabel="Peak Amplitude",
- out_png=figure_dir / "LCR_Peak_Amplitude_summary.png"
- )
- make_mean_sem_plot(
- auc_stats,
- title="LCR AUC Summary",
- ylabel="AUC",
- out_png=figure_dir / "LCR_AUC_summary.png"
- )
- # ======================================================
- # DRIVER
- # ======================================================
- def process_root(input_dir: Path, mode: str):
- if not input_dir.exists():
- print(f"\nWARNING: input directory does not exist, skipping: {input_dir}")
- return
- analysis_output_dir = input_dir / "analysis_output_baseline"
- summary_dir = input_dir / "summary_outputs"
- figure_dir = summary_dir / "figures"
- ensure_dir(analysis_output_dir)
- ensure_dir(summary_dir)
- ensure_dir(figure_dir)
- print("\n" + "=" * 80)
- print(f"PROCESSING MODE: {mode}")
- print(f"INPUT ROOT: {input_dir}")
- print("=" * 80)
- run_analysis_stage(input_dir, analysis_output_dir)
- if mode == "ALLCELLS":
- run_summary_stage_allcells(analysis_output_dir, summary_dir, figure_dir)
- elif mode == "LCR":
- run_summary_stage_lcr(analysis_output_dir, summary_dir, figure_dir)
- else:
- print(f"Unknown mode: {mode}")
- def main():
- process_root(ALLCELLS_INPUT_DIR, "ALLCELLS")
- process_root(LCR_INPUT_DIR, "LCR")
- print("\n=== PIPELINE COMPLETE ===")
- print(f"All-cells root processed: {ALLCELLS_INPUT_DIR}")
- print(f"LCR root processed : {LCR_INPUT_DIR}")
- if __name__ == "__main__":
- main()
analyze_ideas_traces_final.py, under CC-BY-4.0 · at the source
Overview
- Department of Neuroscience and Psychiatry, University of Toledo College of Medicine and Life Sciences, Toledo, OH, United States
- Department of Neuroscience and Anatomy, Virginia Commonwealth University School of Medicine, Richmond, VA, United States (current)
- College of Pharmacy and Pharmaceutical Sciences, University of Toledo, Toledo, OH, United States
- Department of Anesthesiology, University of Wisconsin-Madison, Madison, WI, United States
Abstract
While the contributions of hippocampus and amygdala to fear memory are well established, the role of anterior cingulate cortex in recall of recent fear memory remains unclear. Here we longitudinally recorded anterior cingulate cortex neural activity using single-photon calcium imaging in freely-moving male mice undergoing auditory fear conditioning. During pre-exposure to the conditioned stimulus, neural responses were strongest to novel conditioned stimulus presentations and declined with repetition. During acquisition, responses emerged late in training as the conditioned stimulus became shock-predictive. Ensemble analysis identified subpopulations of “freezing on” and “freezing off” cells whose activation coincided with decreased population activity and increased neural synchrony. During 24 and 48-h recall, responses were robust during early unreinforced conditioned stimulus presentations and declined with repetition; similarly, a subpopulation of neurons emerged that was consistently upmodulated by the conditioned stimulus in early 24 and 48-h recall and suppressed in late epochs. Our results demonstrate that the anterior cingulate cortex neural response to a cue reorganizes within and across sessions, with dynamic changes in population activity, recruitment, and synchrony that mirror changes in salience relative to novelty and both conditioned and unconditioned negative valence. This response pattern is consistent with a role for anterior cingulate cortex as a flexible hub that dynamically represents cue salience.
Reproduced under the paper's license (CC BY-NC), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.
Zenodo 19339357
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
1 file
- analyze_ideas_traces_fin
al.py — Python, 674 lines, 2 matches
The paper's code and data availability statement is in the Data section.
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:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 1 script, each with its path and the digest of its content;
- 2 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
No dataset and no data link were found in the paper.
Data availability
All raw data, metadata, and custom analysis scripts are freely available for download on Zenodo (“Dynamic representations of valence in anterior cingulate cortex in mice,” version v2, doi:10.5281/
Reproduced under the paper's license (CC BY-NC), 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, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 8 authors, 5 keywords, 11 MeSH terms, 1 funder, 46 references.
Cite
This paper
Goswamee, P., Saferin, N., Shah, R., Seoane, J. S., Ganguly, K., Neifer, K. L., Pearce, R. A., & Burkett, J. P. (2026). Dynamic representations of valence in anterior cingulate cortex in mice. Cerebral cortex (New York, N.Y. : 1991), 36(5), bhag062. https://
BibTeX
@article{goswamee2026dyn
author = {Goswamee, Priyodarshan and Saferin, Nilanjana and Shah, Radha and Seoane, Jorge S and Ganguly, Kamalika and Neifer, Kari L and Pearce, Robert A and Burkett, James P},
title = {{Dynamic representations of valence in anterior cingulate cortex in mice}},
journal = {Cerebral cortex (New York, N.Y. : 1991)},
year = {2026},
month = may,
volume = {36},
number = {5},
pages = {bhag062},
publisher = {Oxford University Press},
issn = {1047-3211},
doi = {10.1093/
url = {https://
pmid = {42172105},
pmcid = {PMC13196587}
}
RIS
TY - JOUR
AU - Goswamee, Priyodarshan
AU - Saferin, Nilanjana
AU - Shah, Radha
AU - Seoane, Jorge S
AU - Ganguly, Kamalika
AU - Neifer, Kari L
AU - Pearce, Robert A
AU - Burkett, James P
TI - Dynamic representations of valence in anterior cingulate cortex in mice
T2 - Cerebral cortex (New York, N.Y. : 1991)
J2 - Cereb Cortex
PY - 2026
DA - 2026/
VL - 36
IS - 5
SP - bhag062
SN - 1047-3211
PB - Oxford University Press
DO - 10.1093/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1093/
"type": "article-journal",
"title": "Dynamic representations of valence in anterior cingulate cortex in mice",
"container-title": "Cerebral cortex (New York, N.Y. : 1991)",
"author": [
{
"family": "Goswamee",
"given": "Priyodarshan"
},
{
"family": "Saferin",
"given": "Nilanjana"
},
{
"family": "Shah",
"given": "Radha"
},
{
"family": "Seoane",
"given": "Jorge S"
},
{
"family": "Ganguly",
"given": "Kamalika"
},
{
"family": "Neifer",
"given": "Kari L"
},
{
"family": "Pearce",
"given": "Robert A"
},
{
"family": "Burkett",
"given": "James P"
}
],
"container-title-short":
"volume": "36",
"issue": "5",
"page": "bhag062",
"DOI": "10.1093/
"PMID": "42172105",
"PMCID": "PMC13196587",
"ISSN": "1047-3211",
"publisher": "Oxford University Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
1
]
]
}
}
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.1038/s41467-026-77318-1 [code]
- Offline generative network reconfiguration guides insight-like accelerated learning by assimilation into schema in rats.Journal: Nature communicationsIn common: pandas, Matplotlib, systems, 3 references
- [2] doi:10.7554/elife.105528 [code]
- Functional specialization of mPFC-BLA and mPFC-NAc pathways in affective state representation.Journal: eLifeIn common: pandas, Matplotlib, NumPy, mouse, 2 references
- [3] doi:10.7554/elife.105774 [code]
- Anterior cingulate cortex monitors action state and action content in complex associative learning.Journal: eLifeIn common: mouse, 3 references
- [4] doi:10.1038/s41598-026-56980-x
- Sustained Notch activation depletes adult neural stem cells and impairs cognitive function.Journal: Scientific reportsIn common: mouse, 3 references
- [5] doi:10.1038/s41593-026-02292-2
- Individual differences in prosocial learning are represented in the hippocampal dorsal CA1.Journal: Nature neuroscienceIn common: systems, mouse, 2 references
- [6] doi:10.1038/s41467-026-75706-1 [code]
- Dissociable roles of prefrontal plasticity in decision-making strategy and execution of habitual behavior.Journal: Nature communicationsIn common: pandas, Matplotlib, NumPy, mouse, 1 reference
- [7] doi:10.1371/journal.pbio.3003824 [code]
- Flexible goal learning involves coordinated population activity in dCA1 and medial orbitofrontal cortex.Journal: PLoS biologyIn common: pandas, Matplotlib, NumPy, systems, 1 reference
- [8] doi:10.1111/ejn.70582 [code]
- Multifiber Array-Based Photometry System for Multiregional Functional Mapping in the Mouse Brain.Journal: The European journal of neuroscienceIn common: pandas, Matplotlib, NumPy, optical imaging (calcium, voltage, 2-photon), systems, mouse
- [9] doi:10.7554/elife.110277 [code]
- Functional imaging of nine distinct neuronal populations under a miniscope in freely behaving animals.Journal: eLifeIn common: pandas, Matplotlib, NumPy, optical imaging (calcium, voltage, 2-photon), systems, mouse
- [10] doi:10.1038/s41593-026-02315-y [code]
- The representational geometry of emotional states in basolateral amygdala.Journal: Nature neuroscienceIn common: pandas, Matplotlib, NumPy, 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: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 2 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:50df9c585cdc2d8b…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
