OSCR

Selective weakening of population-coupled synaptic activity in vivo in a mouse model of amyloid-beta pathology.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [1] § Methods › Spatial transcriptomics using CosMxTM ↔ seurat_code.R, lines 320–383 · score 0.97 · FindClusters, FindNeighbors, RunUMAP, SCTransform, min.dist, Single cell

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

R · 481 lines · 21 KB · CC-BY-4.0 · 1 match

  1. #######################################################################################################################################################################
  2. #######################################################################################################################################################################
  3. # Disclaimer: This R scripts provided in this Zenodo upload are made available in the interest of open and reproducible science, and is provided "as is" without any express or implied warranties.
  4. # The authors make no representations about the suitability of this software for any purpose beyond its intended use to assist in the reproduction of figures and analysis presented in the aforementioned scientific article.
  5. # Use of the software is at your own risk, and the authors shall not be held liable for any damages resulting from its use.
  6. # Users are encouraged to review, test, and validate the code before applying it in critical or production environments.
  7. #######################################################################################################################################################################
  8. # Scripts tested in R (version 4.3.1)
  9. #######################################################################################################################################################################
  10. # Load all packages required for this analysis
  11. library(data.table) # version 1.15.4
  12. library(umap) # version 0.2.10.0
  13. library(datasets) # version 4.3.1
  14. library(Matrix) # version 1.6.5
  15. library(Seurat) # version 5.1.0
  16. library(reticulate) # version 1.36.1
  17. library(ggplot2) # version 3.5.2
  18. library(dplyr) # version 1.1.4
  19. library(tibble) # version 3.2.1
  20. library(rlang) # version 1.1.3
  21. library(patchwork) # version 1.2.1
  22. #######################################################################################################################################################################
  23. # Nanostring analysis: https://nanostring.com/wp-content/uploads/2023/01/LiverPublicDataRelease.html
  24. # Seurat: https://satijalab.org/seurat/articles/seurat5_spatial_vignette_2#human-lung-nanostring-cosmx-spatial-molecular-imager
  25. # SCT v2: https://satijalab.org/seurat/archive/v4.3/sctransform_v2_vignette
  26. # Prior to seurat creation & integration:
  27. # Cell QC parameters: Cells were removed from the dataset for the following reasons:
  28. # Any cell that contained fewer than 20 transcripts was filtered out.
  29. # Any cell that has an area greater than 5*geometric mean(area of all cells in the dataset) was filtered out.
  30. #######################################################################################################################################################################
  31. ###################################### Opening object #################################################################################################################
  32. # Bring in Seurat object
  33. seu_object <- readRDS() # Add directory
  34. #######################################################################################################################################################################
  35. ################################## Assign Metadata ####################################################################################################################
  36. parse_fov_text <- function(x) {
  37. if (is.na(x) || !nzchar(x)) return(numeric(0))
  38. # normalise separators/words
  39. x <- gsub("(?i)\\band\\b", ",", x, perl = TRUE)
  40. x <- gsub(";", ",", x)
  41. x <- gsub("(?i)\\s*to\\s*", "-", x, perl = TRUE)
  42. parts <- trimws(unlist(strsplit(x, ",")))
  43. out <- unlist(lapply(parts, function(tok) {
  44. tok <- gsub("\\s+", "", tok)
  45. if (grepl("^[0-9]+-[0-9]+$", tok)) {
  46. rng <- as.numeric(strsplit(tok, "-")[[1]])
  47. if (any(!is.finite(rng))) return(numeric(0))
  48. return(seq(rng[1], rng[2]))
  49. } else if (grepl("^[0-9]+$", tok)) {
  50. return(as.numeric(tok))
  51. } else {
  52. return(numeric(0))
  53. }
  54. }))
  55. unique(out)
  56. }
  57. assign_metadata_to_seurat <- function(seu_object, metadata) {
  58. required_columns <- c("genotype","age","genotype_age","brain_ID")
  59. if (!all(required_columns %in% colnames(metadata))) {
  60. stop("Metadata does not contain all the required columns.")
  61. }
  62. # vectors per cell
  63. fov_value <- suppressWarnings(as.numeric(sub("fov", "", [email hidden][["fov"]])))
  64. atomx_value <- [email hidden][["Run_Tissue_name"]]
  65. # init columns
  66. for (nm in required_columns) {
  67. if (!nm %in% colnames([email hidden])) [email hidden][[nm]] <- NA
  68. }
  69. # iterate rows in metadata
  70. for (i in seq_len(nrow(metadata))) {
  71. ax <- metadata$AtomxID[i]
  72. fv <- metadata$CosmxFOVs[i]
  73. if (is.na(ax) || is.na(fv)) next
  74. fov_list <- parse_fov_text(fv)
  75. if (length(fov_list) == 0) next
  76. matching_fovs <- which(atomx_value == ax & fov_value %in% fov_list)
  77. if (length(matching_fovs) == 0) next
  78. [email hidden][["genotype"]][matching_fovs] <- metadata$genotype[i]
  79. [email hidden][["age"]][matching_fovs] <- metadata$age[i]
  80. [email hidden][["genotype_age"]][matching_fovs] <- metadata$genotype_age[i]
  81. [email hidden][["brain_ID"]][matching_fovs] <- metadata$brain_ID[i]
  82. }
  83. seu_object
  84. }
  85. seu_object <- assign_metadata_to_seurat(seu_object, seu_object_metadata)
  86. # Check the Seurat object to see if the metadata columns have been added
  87. head([email hidden])
  88. unique([email hidden][["genotype"]])
  89. unique([email hidden][["age"]])
  90. unique([email hidden][["genotype_age"]])
  91. unique([email hidden][["brain_ID"]])
  92. # List of columns to convert to factors
  93. columns_to_convert <- c("genotype", "age", "genotype_age", "brain_ID")
  94. # Convert each specified column to a factor
  95. [email hidden][columns_to_convert] <- lapply(
  96. [email hidden][columns_to_convert],
  97. as.factor
  98. )
  99. #######################################################################################################################################################################
  100. ################################## Spatial QC #########################################################################################################################
  101. # Add centroids from @images into meta.data
  102. add_centroids_to_meta <- function(seu) {
  103. stopifnot(length(Images(seu)) > 0)
  104. all_imgs <- Images(seu)
  105. centroids_df <- do.call(rbind, lapply(all_imgs, function(img) {
  106. ctd <- seu@images[[img]]$centroids
  107. data.frame(
  108. cellname = ctd@cells,
  109. x_img = ctd@coords[, "x"],
  110. y_img = ctd@coords[, "y"],
  111. fov_name = img,
  112. stringsAsFactors = FALSE
  113. )
  114. }))
  115. md <- [email hidden] %>% rownames_to_column("cellname")
  116. # Ensure we have a slicer column to loop by
  117. if (!"brainSlice" %in% names(md) && !"Run_Tissue_name" %in% names(md)) {
  118. stop("Neither 'brainSlice' nor 'Run_Tissue_name' exists in meta.data.")
  119. }
  120. # Join centroids
  121. md2 <- md %>%
  122. left_join(centroids_df, by = "cellname")
  123. # If you already have global pixel coords, keep them; otherwise use x_img/y_img
  124. if (!"CenterX_global_px" %in% names(md2)) md2$CenterX_global_px <- md2$x_img
  125. if (!"CenterY_global_px" %in% names(md2)) md2$CenterY_global_px <- md2$y_img
  126. rownames(md2) <- md2$cellname
  127. md2$cellname <- NULL
  128. [email hidden] <- md2
  129. seu
  130. }
  131. seu_object <- add_centroids_to_meta(seu_object)
  132. md <- [email hidden] %>% rownames_to_column("cellname")
  133. # Choose which column defines a “slice”
  134. slice_col <- if ("brainSlice" %in% names(md)) "brainSlice" else "Run_Tissue_name"
  135. slice_vals <- md[[slice_col]] %>% unique() %>% sort()
  136. # Helper: safe min/max for coord limits (optional)
  137. rng2 <- function(v) { r <- range(v, na.rm = TRUE); if (any(!is.finite(r))) c(0,1) else r }
  138. # Loop per slice and plot
  139. plots_per_slice <- vector("list", length(slice_vals)); names(plots_per_slice) <- slice_vals
  140. for (sid in slice_vals) {
  141. mds <- md %>% filter(.data[[slice_col]] == sid)
  142. # ===== FOV arrangement =====
  143. # requires columns: fov, CenterX_global_px, CenterY_global_px
  144. p_fov <- NULL
  145. if (all(c("fov","CenterX_global_px","CenterY_global_px") %in% names(mds))) {
  146. fov_df <- mds %>%
  147. dplyr::group_by(fov) %>%
  148. dplyr::summarise(
  149. x = median(CenterX_global_px, na.rm = TRUE),
  150. y = median(CenterY_global_px, na.rm = TRUE),
  151. .groups = "drop"
  152. ) %>%
  153. tidyr::drop_na(x, y)
  154. p_fov <- ggplot2::ggplot(fov_df, ggplot2::aes(x = x, y = y, label = fov)) +
  155. ggplot2::geom_point(size = 3, colour = "deepskyblue3", shape = 15) +
  156. ggplot2::geom_text(size = 3, vjust = -0.6) +
  157. ggplot2::coord_fixed() +
  158. # ggplot2::scale_y_reverse() + # uncomment if your image Y increases downward
  159. ggplot2::theme_classic() +
  160. ggplot2::labs(title = paste0("FOV Arrangement — ", sid),
  161. x = "X (px)", y = "Y (px)")
  162. } else {
  163. p_fov <- ggplot2::ggplot() + ggplot2::theme_void() +
  164. ggplot2::ggtitle(paste0("FOV Arrangement — ", sid, " (needs fov + CenterX/Y_global_px)"))
  165. }
  166. # ===== Cell arrangement by Area (uses CenterX/Y_global_px) =====
  167. have_area <- all(c("CenterX_global_px","CenterY_global_px","Area") %in% names(mds))
  168. p_area <- NULL
  169. if (have_area) {
  170. xr <- rng2(mds$CenterX_global_px); yr <- rng2(mds$CenterY_global_px)
  171. p_area <- ggplot(mds, aes(CenterX_global_px, CenterY_global_px, colour = log2(Area))) +
  172. geom_point(size = 0.05, na.rm = TRUE) +
  173. coord_cartesian(xlim = xr, ylim = yr, expand = FALSE) +
  174. theme_classic() +
  175. scale_colour_gradientn(colours = c("grey50", "blue", "yellow", "red")) +
  176. labs(title = paste0("Area (log2) — ", sid), x = "Global X (px)", y = "Global Y (px)") +
  177. theme(plot.title = element_text(hjust = 0.5, face = "bold"),
  178. legend.position = "right")
  179. }
  180. # ===== Cell arrangement by DAPI =====
  181. have_dapi <- all(c("CenterX_global_px","CenterY_global_px","Mean.DAPI") %in% names(mds))
  182. p_dapi <- NULL
  183. if (have_dapi) {
  184. xr <- rng2(mds$CenterX_global_px); yr <- rng2(mds$CenterY_global_px)
  185. p_dapi <- ggplot(mds, aes(CenterX_global_px, CenterY_global_px, colour = log2(Mean.DAPI))) +
  186. geom_point(size = 0.05, na.rm = TRUE) +
  187. coord_cartesian(xlim = xr, ylim = yr, expand = FALSE) +
  188. theme_classic() +
  189. scale_colour_gradientn(colours = c("grey50", "yellow", "purple")) +
  190. labs(title = paste0("DAPI (log2) — ", sid), x = "Global X (px)", y = "Global Y (px)") +
  191. theme(plot.title = element_text(hjust = 0.5, face = "bold"),
  192. legend.position = "right")
  193. }
  194. # ===== Unassigned transcripts per FOV (per slice) =====
  195. have_un <- all(c("fov","unassignedTranscripts") %in% names(mds))
  196. p_un <- NULL
  197. if (have_un) {
  198. un_tx_summary <- mds %>%
  199. select(fov, unassignedTranscripts) %>%
  200. distinct() %>%
  201. arrange(fov)
  202. p_un <- ggplot(un_tx_summary, aes(x = factor(fov), y = unassignedTranscripts)) +
  203. geom_col(fill = "lightblue", width = 0.7) +
  204. scale_y_continuous(limits = c(0,1), breaks = seq(0,1,0.1),
  205. expand = expansion(mult = c(0, 0.05))) +
  206. theme_minimal() +
  207. labs(title = paste0("Unassigned Transcripts per FOV — ", sid),
  208. x = "FOV", y = "Fraction") +
  209. theme(plot.title = element_text(face = "bold", size = 14),
  210. axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
  211. }
  212. # Collect
  213. # Example layout: FOV on top, then Area | DAPI, and Unassigned below if available
  214. layout_top <- if (!is.null(p_fov)) p_fov else ggplot() + theme_void()
  215. layout_mid <- (if (!is.null(p_area)) p_area else ggplot() + theme_void()) +
  216. (if (!is.null(p_dapi)) p_dapi else ggplot() + theme_void())
  217. layout_bot <- if (!is.null(p_un)) p_un else ggplot() + theme_void()
  218. plots_per_slice[[sid]] <- layout_top / layout_mid / layout_bot +
  219. plot_layout(heights = c(1, 3, 1))
  220. }
  221. #######################################################################################################################################################################
  222. ## =================== FOV QC ===================
  223. # Utils + barcodes
  224. source("https://raw.githubusercontent.com/Nanostring-Biostats/CosMx-Analysis-Scratch-Space/Main/_code/FOV%20QC/FOV%20QC%20utils.R")
  225. CosMx_barcodes <- readRDS(url("https://github.com/Nanostring-Biostats/CosMx-Analysis-Scratch-Space/raw/Main/_code/FOV%20QC/barcodes_by_panel.RDS"))
  226. panel_barcode <- CosMx_barcodes$Mm_Neuro # pick the right panel for your run
  227. # Counts: Seurat returns genes x cells; transpose to cells x genes
  228. counts <- t(as.matrix(GetAssayData(seu_object, assay = "RNA", slot = "counts")))
  229. # XY coordinates as matrix (cells x 2), rownames must match counts rownames
  230. # In Seurat, rownames(md) == colnames(seu_object) == rownames(counts)
  231. xy <- as.matrix(md[, c("CenterX_global_px", "CenterY_global_px")])
  232. rownames(xy) <- md$cellname
  233. # Ensure alignment: reorder md to counts row order (just in case)
  234. md <- md[match(rownames(counts), md$cellname), ]
  235. xy <- xy[rownames(counts), , drop = FALSE]
  236. # FOV vector aligned to counts/xy rows
  237. fov_vec <- md$fov
  238. # Run FOV QC
  239. fovqc <- runFOVQC(counts = counts,
  240. xy = xy,
  241. fov = fov_vec,
  242. barcodemap = panel_barcode,
  243. max_prop_loss = 0.6,
  244. max_totalcounts_loss = 0.6)
  245. # Summaries
  246. if (length(fovqc$flaggedfovs) == 0) {
  247. flaggedFOVs <- integer(0)
  248. flaggedFOVs_signal <- integer(0)
  249. flaggedFOVs_bias <- integer(0)
  250. flaggedFOVsCells <- character(0)
  251. } else {
  252. flaggedFOVs <- fovqc$flaggedfovs
  253. flaggedFOVs_signal <- fovqc$flaggedfovs_fortotalcounts
  254. flaggedFOVs_bias <- fovqc$flaggedfovs_forbias
  255. flaggedFOVsCells <- md$cellname[md$fov %in% flaggedFOVs]
  256. }
  257. list(
  258. flaggedFOVs = flaggedFOVs,
  259. flaggedFOVs_signal = flaggedFOVs_signal,
  260. flaggedFOVs_bias = flaggedFOVs_bias,
  261. n_flagged_cells = length(flaggedFOVsCells)
  262. )
  263. #######################################################################################################################################################################
  264. ################################ Single-cell with integration on SCT ##################################################################################################
  265. # convert seurat to Assay5
  266. assay5 <- as(seu_object[["RNA"]], Class = "Assay5")
  267. seurat5 <- CreateSeuratObject(assay5, meta.data = [email hidden])
  268. seu_object <- seurat5
  269. seu_object[["RNA"]] <- split(seu_object[["RNA"]], f = [email hidden][["Run_Tissue_name"]])
  270. # this normalizes the data slot (i.e. layer); while counts slot contains the raw transcript counts
  271. seu_object <- NormalizeData(object = seu_object, normalization.method = "LogNormalize", scale.factor = 10000)
  272. options(future.globals.maxSize = 3e+09)
  273. # Check for cells with 0 counts
  274. cell_sums <- colSums(seu_object@assays[["RNA"]])
  275. # Cells with 0 counts
  276. zero_count_cells <- which(cell_sums == 0)
  277. # Print number of cells with 0 counts
  278. length(zero_count_cells)
  279. # Filter out cells with 0 counts
  280. seu_object <- subset(seu_object, cells = colnames(seu_object)[cell_sums > 0])
  281. seu_object <- SCTransform(seu_object, vst.flavor = "v2", verbose = T)
  282. seu_object <- RunPCA(seu_object, npcs = 30, verbose = T)
  283. seu_object <- IntegrateLayers(
  284. object = seu_object,
  285. method = RPCAIntegration,
  286. normalization.method = "SCT",
  287. verbose = T)
  288. seu_object <- FindNeighbors(seu_object, dims = 1:30, reduction = "integrated.dr", verbose = T)
  289. seu_object <- FindClusters(seu_object, resolution = 0.1, veborse = T) # 0.1, 0.2, 0.5, 0.8, 1.2
  290. seu_object <- RunUMAP(seu_object,
  291. dims = 1:30,
  292. n.neighbors = 70,
  293. min.dist = 0.2,
  294. n.epochs = 200,
  295. spread = 0.85,
  296. reduction = "integrated.dr",
  297. verbose = T)
  298. seu_object[["RNA"]] <- JoinLayers(seu_object[["RNA"]])
  299. DimPlot(seu_object, reduction = "umap", group.by="SCT_snn_res.0.2", label=TRUE) + NoLegend()
  300. DimPlot(seu_object, reduction = "umap", group.by="SCT_snn_res.0.8", label=TRUE) + NoLegend()
  301. DimPlot(seu_object, reduction = "umap", group.by="SCT_snn_res.1.2", label=TRUE) + NoLegend()
  302. [email hidden][["cell_types_rc"]] <- SCT_snn_res.0.2
  303. #######################################################################################################################################################################
  304. ################################ Find markers #########################################################################################################################
  305. Idents(seu_object) <- "cell_types_rc"
  306. # Ensure SCT is the active assay and ready for marker testing
  307. DefaultAssay(seu_object) <- "SCT"
  308. seu_object <- PrepSCTFindMarkers(seu_object)
  309. find_and_sort_markers <- function(seu, ident_col,
  310. min_pct = 0.10,
  311. logfc_threshold = 0.25,
  312. only_pos = TRUE,
  313. test_use = "wilcox",
  314. verbose = TRUE) {
  315. # 1) Check that the identity column exists
  316. if (!ident_col %in% colnames([email hidden])) {
  317. stop(sprintf("Identity column '%s' not found in meta.data.", ident_col))
  318. }
  319. # 2) Set identities and run markers on SCT
  320. Idents(seu) <- ident_col
  321. mk <- FindAllMarkers(
  322. seu,
  323. only.pos = only_pos,
  324. min.pct = min_pct,
  325. logfc.threshold = logfc_threshold,
  326. test.use = test_use,
  327. assay = DefaultAssay(seu), # "SCT"
  328. verbose = verbose
  329. )
  330. # 3) Split by cluster and sort by effect size
  331. split(mk, mk$cluster) |>
  332. lapply(function(df) df[order(-df$avg_log2FC), ])
  333. }
  334. # Choose a resolution that actually exists
  335. res <- "SCT_snn_res.0.2"
  336. markers_by_cluster <- find_and_sort_markers(seu_object, ident_col = res)
  337. # Save results
  338. saveRDS(markers_by_cluster, file = file.path(out_dir, "rds", "cluster_markers_SCT_res02.rds"))
  339. writexl::write_xlsx(
  340. markers_by_cluster,
  341. path = file.path(excel_folder, paste0("cluster_markers_SCT_res02_", brain_id, ".xlsx"))
  342. )
  343. #######################################################################################################################################################################
  344. ################################ EWCE #################################################################################################################################
  345. # run EWCE
  346. library(EWCE) # version 1.10.2
  347. library(ewceData) # version 1.10.0
  348. # Apply EWCE to Zeng data set (https://portal.brain-map.org/atlases-and-data/rnaseq/mouse-whole-cortex-and-hippocampus-10x)
  349. # based on Zeng 2021 (Allen Brain webstie) ctd - can check genes associated with main cell types and subtypes
  350. nano_zeng_ctd <- readRDS("C:/[...]/nano_zeng_ctd.rds")
  351. # this data was filtered for VIS and RSC cortex only
  352. zeng_ctd_fin <- nano_zeng_ctd <- readRDS("C:/[...]/zeng_ctd_fin.rds")
  353. # Parameters
  354. reps <- 1000
  355. # update this based on the list used (for ctd there are 2 levels; for zeng_ctd_fin there are 3 levels)
  356. annotLevel <- 3
  357. sctSpecies <- "mouse"
  358. genelistSpecies <- "mouse"
  359. # Initialize the list to store results
  360. enrichment_results_list <- list()
  361. # Optionally, you can use lapply instead of a for loop for a more concise approach
  362. enrichment_results_list <- lapply(markers_by_cluster, function(df) {
  363. hits <- df$gene
  364. full_results <- EWCE::bootstrap_enrichment_test(sct_data = zeng_ctd_fin, # this can be replaced with ctd or zeng_ctd_fin for sub-type identity
  365. sctSpecies = sctSpecies,
  366. genelistSpecies = genelistSpecies,
  367. hits = hits,
  368. reps = reps,
  369. annotLevel = annotLevel)
  370. return(full_results[["results"]])
  371. })
  372. # Save EWCE results
  373. saveRDS(enrichment_results_list, file = file.path(results_folder, "EWCE_enrichment_results.rds"))
  374. writexl::write_xlsx(enrichment_results_list, path = file.path(results_folder, "EWCE_enrichment_results.xlsx"))
  375. [email hidden][["cell_types_rc"]] <- NULL
  376. [email hidden][["cell_types_rc"]] <- cell_types_rc
  377. saveRDS(seu_object, file = file.path(results_folder, "seu_object.rds"))
  378. main_cell_type_pallete = c("salmon", "blue", "orange4", "red","seagreen3",
  379. "magenta2","purple2", "orange2" )
  380. DimPlot(seu_object, group.by = "cell_types_rc", cols = main_cell_type_pallete, label = FALSE)
  381. #######################################################################################################################################################################
  382. #######################################################################################################################################################################

seurat_code.R, under CC-BY-4.0 · at the source

Overview

Authors: Leire Melgosa-Ecenarro1, Carola I. Radulescu1, Nazanin Doostdar1, Joe Airey1, Francesca A. Chaloner1, Nawal Zabouri2, Giada Pedretti1, Francesca Osso1, Leire Garrido Perez1, Kjara S. Pilch1, Xingjian Wang1, Anna Mallach1, Sadra Sadeh3,4, Johanna Jackson1, Paul M. Matthews1,5, Samuel J. Barnes1
  1. UK Dementia Research Institute Centre, Department of Brain Sciences, Imperial College London, Hammersmith Hospital Campus,London, UK
  2. Department of Biomedical Engineering, Imperial College London, South Kensington Campus,London, UK
  3. Centre for Developmental Neurobiology, King’s College London, New Hunt’s House, Guy’s Campus,London, UK
  4. Francis Crick Institute,London, UK
  5. The Rosalind Franklin Institute, Harwell Science and Innovation Campus,Didcot, Oxon UK
Institutions: Hammersmith Hospital (United Kingdom); Imperial College London (United Kingdom); King's College London (United Kingdom); The Francis Crick Institute (United Kingdom); Rosalind Franklin Institute (United Kingdom)
Journal: Nature communications, volume 17, issue 1, article 3646
Dates: received 31 October 2024; accepted 12 February 2026; published online 7 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41467-026-69866-3 · PMID 41794826 · PMCID PMC13096637 · OpenAlex W7134199095
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), human (organism), mouse (organism), Alzheimer's / dementia (population), cellular / molecular (subfield)
Methods: Spectral & time-frequency, Connectivity, Statistics, Smoothing, state filtering, decompositions, Preprocessing, fMRI & imaging, Single-unit activity, calcium imaging
Keywords: Alzheimer's disease, Neurotransmitters
MeSH: Alzheimer Disease*, Amyloid beta-Peptides*, Synapses*, Amyloid beta-Protein Precursor, Animals, Calcium, Dendritic Spines, Disease Models, Animal, GABAergic Neurons, Humans, Male, Mice, Mice, Transgenic, Parvalbumins, Presynaptic Terminals, Synaptic Transmission (* major topic)
Topic: Alzheimer's disease research and treatments (Physiology, Medicine), according to OpenAlex
Funding: BrightFocus Foundation (BrightFocus) (A2022030S); UK Dementia Research Institute through UK DRI Ltd, principally funded by the Medical Research Council (to S.J.B). The Brightfocus foundation (A2022030S to S.J.B.) The Wellcome Trust (to S.J.B and S.S) The Uren Foundation (to S.J.B) The Rosetrees Trust (to S.J.B and J.J.) The Epilepsy Research Institute (to F.A.C.) The Imperial College Healthcare Trust -NIHR Biomedical Research Centre (to P.M.M) The Edmond J. and Lily Safra Foundation (C.I.R., A.M. and P.M.M); RCUK | Biotechnology and Biological Sciences Research Council (BBSRC)
Citations: cited by 2 papers (Europe PMC); 131 references in the paper
Research resources: RRID:IMSR_JAX:024275

Abstract

Synaptic dysfunction in Alzheimer’s disease (AD) may drive synapse loss and cognitive impairment. Whether AD-related synaptic pathophysiology occurs globally, or in specific synapses, is unclear. We investigate in vivo AD-related synaptic dysfunction during early-stage amyloidosis in AppNL-G-F mice. We find reduced presynaptic GABAergic proteins at c-Fos-positive excitatory neurons and increased calcium-mediated activity at excitatory and inhibitory neuronal assemblies. In vivo synaptic structure/function imaging finds reduced density and calcium-mediated activity of GABAergic axonal boutons. Rather than occurring globally, reduced synaptic activity is focused at GABAergic boutons strongly coupled to population activity in the amyloid microenvironment. The selective weakening of population-coupled synaptic activity also occurs in excitatory dendritic spines. Spatial transcriptomics finds parvalbumin-positive inhibitory neurons show differential gene expression associated with downregulated GABAergic synaptic transmission at early stages. We propose that early-stage AD-related synaptic pathophysiology is focused at population-coupled synapses, with molecular measures implicating abnormal synaptic processing as an early-stage feature in parvalbumin-positive interneurons.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.

Zenodo 18370193

License: CC-BY-4.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Languages: R (1)
Size: 1 file, 1 script
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: data.table (1 file), ggplot2 (1 file), patchwork (1 file), reticulate (1 file), Seurat (1 file), tidyverse (1 file), UMAP (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)
1 file
At the source:

Code availability

Code that supports the analysis is available at 10.5281/zenodo.18370193.

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:

  • 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;
  • 1 match 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

Data availability

Data associated with this paper has been deposited at 10.5281/zenodo.18369811 and at the Gene Expression Omnibus (GEO) database (GEO accession code: GSE318590 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE318590)). These are publicly available as of the date of publication. Due to large file size, other datasets generated in this study are also available from the author upon request. Source data are provided in this paper.

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, 16 authors, 2 keywords, 16 MeSH terms, 3 funders, 131 references, 1 RRID.

Cite

This paper

Melgosa-Ecenarro, L., Radulescu, C. I., Doostdar, N., Airey, J., Chaloner, F. A., Zabouri, N., Pedretti, G., Osso, F., Garrido Perez, L., Pilch, K. S., Wang, X., Mallach, A., Sadeh, S., Jackson, J., Matthews, P. M., & Barnes, S. J. (2026). Selective weakening of population-coupled synaptic activity in vivo in a mouse model of amyloid-beta pathology. Nature communications, 17(1), 3646. https://doi.org/10.1038/s41467-026-69866-3

BibTeX

@article{melgosaecenarro2026selective,
author = {Melgosa-Ecenarro, Leire and Radulescu, Carola I. and Doostdar, Nazanin and Airey, Joe and Chaloner, Francesca A. and Zabouri, Nawal and Pedretti, Giada and Osso, Francesca and Garrido Perez, Leire and Pilch, Kjara S. and Wang, Xingjian and Mallach, Anna and Sadeh, Sadra and Jackson, Johanna and Matthews, Paul M. and Barnes, Samuel J.},
title = {{Selective weakening of population-coupled synaptic activity in vivo in a mouse model of amyloid-beta pathology}},
journal = {Nature communications},
year = {2026},
month = mar,
volume = {17},
number = {1},
pages = {3646},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-69866-3},
url = {https://doi.org/10.1038/s41467-026-69866-3},
pmid = {41794826},
pmcid = {PMC13096637}
}

RIS

TY - JOUR
AU - Melgosa-Ecenarro, Leire
AU - Radulescu, Carola I.
AU - Doostdar, Nazanin
AU - Airey, Joe
AU - Chaloner, Francesca A.
AU - Zabouri, Nawal
AU - Pedretti, Giada
AU - Osso, Francesca
AU - Garrido Perez, Leire
AU - Pilch, Kjara S.
AU - Wang, Xingjian
AU - Mallach, Anna
AU - Sadeh, Sadra
AU - Jackson, Johanna
AU - Matthews, Paul M.
AU - Barnes, Samuel J.
TI - Selective weakening of population-coupled synaptic activity in vivo in a mouse model of amyloid-beta pathology
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/03/07
VL - 17
IS - 1
SP - 3646
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-69866-3
UR - https://doi.org/10.1038/s41467-026-69866-3
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-69866-3",
"type": "article-journal",
"title": "Selective weakening of population-coupled synaptic activity in vivo in a mouse model of amyloid-beta pathology",
"container-title": "Nature communications",
"author": [
{
"family": "Melgosa-Ecenarro",
"given": "Leire"
},
{
"family": "Radulescu",
"given": "Carola I."
},
{
"family": "Doostdar",
"given": "Nazanin"
},
{
"family": "Airey",
"given": "Joe"
},
{
"family": "Chaloner",
"given": "Francesca A."
},
{
"family": "Zabouri",
"given": "Nawal"
},
{
"family": "Pedretti",
"given": "Giada"
},
{
"family": "Osso",
"given": "Francesca"
},
{
"family": "Garrido Perez",
"given": "Leire"
},
{
"family": "Pilch",
"given": "Kjara S."
},
{
"family": "Wang",
"given": "Xingjian"
},
{
"family": "Mallach",
"given": "Anna"
},
{
"family": "Sadeh",
"given": "Sadra"
},
{
"family": "Jackson",
"given": "Johanna"
},
{
"family": "Matthews",
"given": "Paul M."
},
{
"family": "Barnes",
"given": "Samuel J."
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "3646",
"DOI": "10.1038/s41467-026-69866-3",
"PMID": "41794826",
"PMCID": "PMC13096637",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-69866-3",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
7
]
]
}
}

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.1016/j.celrep.2026.117505 [code]
Impaired spatial coding and neuronal hyperactivity in the medial entorhinal cortex of aged APP knock-in mice.
Journal: Cell reports
In common: patchwork, ggplot2, tidyverse, Alzheimer's / dementia, mouse, 17 references
[2] doi:10.1111/ejn.70480 [code]
Astrocyte Proximity Protects Synapses From Human Amyloid-Beta Induced Degeneration in a Mouse Ex Vivo Model of Early Alzheimer's Disease.
Journal: The European journal of neuroscience
In common: ggplot2, tidyverse, histology / microscopy, Alzheimer's / dementia, mouse, 1 other category, 9 references
[3] doi:10.1016/j.celrep.2026.117646 [code]
Medial entorhinal-hippocampal desynchronization parallels the emergence of memory impairment in a mouse model of Alzheimer's disease pathology.
Journal: Cell reports
In common: data.table, tidyverse, Alzheimer's / dementia, mouse, 9 references
[4] doi:10.1002/advs.77453 [code]
Tau Aggregate Imaging and Transcriptomics of Alzheimer's Disease Brain at Different Stages of Disease.
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)
In common: Alzheimer's / dementia, cellular / molecular, 3 references, 2 authors
[5] doi:10.1038/s43587-026-01096-0 [code]
Neuronal APOE4-induced early hippocampal network hyperexcitability in Alzheimer's disease pathogenesis.
Journal: Nature aging
In common: Alzheimer's / dementia, mouse, 10 references
[6] doi:10.1038/s41467-025-62798-4 [code]
Distinct manifestations of excitatory-inhibitory imbalance associated with amyloid-β and tau in patients with Alzheimer’s disease
Journal: n/a
In common: Alzheimer's / dementia, 9 references
[7] doi:10.1007/s00401-026-03036-z
Mechanisms of increased Alzheimer's disease pathology with R47H and R62H TREM2 variants.
Journal: Acta neuropathologica
In common: Alzheimer's / dementia, cellular / molecular, 5 references, author Johanna S Jackson
[8] doi:10.1002/alz.71378
Human iPSC-derived GABAergic interneuron transplantation restores circuit balance and cognitive function in an Alzheimer's disease model.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: Alzheimer's / dementia, mouse, 8 references
[9] doi:10.1038/s44318-026-00818-9 [code]
FAM134B-mediated ER-phagy degrades APP and suppresses Alzheimer's disease pathology.
Journal: The EMBO journal
In common: reticulate, UMAP, Seurat, 4 other tools, Alzheimer's / dementia, mouse, cellular / molecular, 1 reference
[10] doi:10.1038/s41467-026-76232-w [code]
Th17 effector cytokines induce shared and distinct microglial and endothelial cell responses in a mouse model for post-streptococcal encephalitis.
Journal: Nature communications
In common: reticulate, UMAP, Seurat, 3 other tools, mouse, cellular / molecular, 2 references

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.

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