OSCR

Focal astrocyte loss reveals nuclear translocation during lesion repopulation.

Code ↔ Paper

6 matches 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 6 matches
  1. [1] § Methods › STs › Cell-type identification ↔ rmd/5.Cell_type.Rmd, lines 285–296 · score 0.81 · Slc1a2, S100b, Tubb2b, Aldh1l1, Gja1, SCT
  2. [2] § Methods › STs › Cell-type identification ↔ rmd/7.Comparaison.Rmd, lines 142–165 · score 0.73 · logfc.threshold, FindMarkers, min.pct, healthy, DEGs, reactive
  3. [3] § Results › Perilesional astrocytes display a transient injury-associated gene signature ↔ rmd/7.Comparaison.Rmd, lines 691–704 · score 0.72 · Tuba1a, Tmsb4x, Tubb2b, Marcks, Rtn4, Vim
  4. [4] § Methods › STs › Gene expression and pathway analysis ↔ rmd/7.Comparaison.Rmd, lines 437–465 · score 0.61 · clusterProfiler, db, BP, mm, enriched, enrichment
  5. [5] § Methods › STs › Astrocyte spatial gene expression ↔ rmd/utils_ST.R, lines 67–101 · score 0.54 · spot coordinates, lesion center, centroids, Seurat, distance
  6. [6] § Results › Perilesional astrocytes display a transient injury-associated gene signature ↔ rmd/5.Cell_type.Rmd, lines 285–296 · score 0.53 · S100b, Aldh1l1, Gja1, Gfap, filtered, Aqp4

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 Markdown · 850 lines · 28 KB · no license · 3 matches

  1. ---
  2. title: "Reactive Astrocyte Gene Signature and Pathway Dynamics Across Timepoints"
  3. author: "Anna Lasne"
  4. date: "2025-05-28"
  5. output: html_document
  6. ---
  7. # Setup
  8. ```{r}
  9. knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE, cache = TRUE)
  10. set.seed(123)
  11. suppressPackageStartupMessages({
  12. library(reticulate)
  13. library(grid)
  14. library(SeuratDisk)
  15. library(patchwork)
  16. library(Matrix)
  17. library(data.table)
  18. library(Seurat)
  19. library(dplyr)
  20. library(igraph)
  21. library(ggcorrplot)
  22. library(hdf5r)
  23. library(png)
  24. library(ggplot2)
  25. library(arrow)
  26. library(cluster)
  27. library(Banksy)
  28. library(readxl)
  29. library(textshape)
  30. library(radiant)
  31. library(scales)
  32. library(xml2)
  33. library(sf)
  34. library(ComplexHeatmap)
  35. library(RColorBrewer)
  36. library(future)
  37. library(EnhancedVolcano)
  38. library(tibble)
  39. library(circlize)
  40. library(purrr)
  41. library(clusterProfiler)
  42. library(org.Mm.eg.db)
  43. library(DOSE)
  44. })
  45. source("~/Documents/ST/resequencing/rmd/utils_ST.R") # Put all helper fns here!
  46. options(future.globals.maxSize = 8e9)
  47. mem.maxVSize(300000)
  48. ```
  49. # Data Loading
  50. ```{r}
  51. # Load per-timepoint Seurat objects for astrocyte subsets
  52. threedpi <- readRDS("~/Documents/ST/resequencing/Visium_obj/astrocyte_subset_labeled_0.5_3dpi.rds")
  53. fivedpi <- readRDS("~/Documents/ST/resequencing/Visium_obj/astrocyte_subset_labeled_0.5_5dpi.rds")
  54. seventeendpi <- readRDS("~/Documents/ST/resequencing/Visium_obj/astrocyte_subset_labeled_0.5_17dpi.rds")
  55. ```
  56. ## Timepoint labels
  57. ```{r}
  58. threedpi$timepoint <- "3dpi"
  59. fivedpi$timepoint <- "5dpi"
  60. seventeendpi$timepoint <- "17dpi"
  61. ```
  62. # Reactive/Healthy Classification
  63. ## Define 17 dpi Cutoffs (Quantile & Regression)
  64. ```{r}
  65. # Calculate quantile-based and regression-based thresholds for defining "reactive" at 17dpi.
  66. df_3_reactive <- [email hidden] %>% filter(astro_status == "reactive")
  67. q3_3dpi <- quantile(df_3_reactive$min_distance_microns, 0.75, na.rm = TRUE)
  68. df_5_reactive <- [email hidden] %>% filter(astro_status == "reactive")
  69. q3_5dpi <- quantile(df_5_reactive$min_distance_microns, 0.75, na.rm = TRUE)
  70. threshold_17_quantile <- mean(c(q3_3dpi, q3_5dpi))
  71. seventeendpi$astro_status <- ifelse([email hidden]$min_distance_microns <= threshold_17_quantile, "reactive", "healthy")
  72. message("Q₃(3 dpi reactive) = ", round(q3_3dpi, 1))
  73. message("Q₃(5 dpi reactive) = ", round(q3_5dpi, 1))
  74. message("Threshold for 17 dpi (quantile‐avg) = ", round(threshold_17_quantile, 1))
  75. ```
  76. ## Visualize Distance Distributions & Cutoffs
  77. ```{r}
  78. # Plot the distribution of min-distance to lesion at each timepoint,
  79. # including vertical lines for thresholds used to call "reactive".
  80. df_plot <- bind_rows(
  81. [email hidden] %>% filter(astro_status == "reactive") %>% dplyr::select(timepoint, min_distance_microns) %>% mutate(group = "3dpi reactive"),
  82. [email hidden] %>% filter(astro_status == "reactive") %>% dplyr::select(timepoint, min_distance_microns) %>% mutate(group = "5dpi reactive"),
  83. [email hidden] %>% dplyr::select(timepoint, min_distance_microns) %>% mutate(group = "17dpi all")
  84. )
  85. vline_info <- data.frame(
  86. label = c("Q3 (3 dpi)", "Q3 (5 dpi)", "Cutoff (quantile)"),
  87. x = c(q3_3dpi, q3_5dpi, threshold_17_quantile),
  88. color = c("#1B9E77", "#D95F02", "#7570B3"),
  89. linetype = c("dashed", "dashed", "solid"),
  90. stringsAsFactors = FALSE
  91. )
  92. ggplot(df_plot, aes(x = min_distance_microns)) +
  93. geom_density(aes(fill = group), color = NA, alpha = 0.3, size = 0.8) +
  94. geom_vline(
  95. data = vline_info,
  96. aes(xintercept = x, color = label, linetype = label),
  97. size = 1.2, inherit.aes = FALSE
  98. ) +
  99. scale_fill_manual(
  100. name = "Density group",
  101. values = c("3dpi reactive" = "#1B9E77", "5dpi reactive" = "#D95F02", "17dpi all" = "#7570B3")
  102. ) +
  103. scale_color_manual(
  104. name = "Reference lines",
  105. values = c("Q3 (3 dpi)" = "#1B9E77", "Q3 (5 dpi)" = "#D95F02", "Cutoff (quantile)" = "#7570B3")
  106. ) +
  107. scale_linetype_manual(
  108. name = "Reference lines",
  109. values = c("Q3 (3 dpi)" = "dashed", "Q3 (5 dpi)" = "dashed", "Cutoff (quantile)" = "solid")
  110. ) +
  111. labs(
  112. title = "Min‐Distance Densities (Reactive 3 dpi, Reactive 5 dpi, All 17 dpi)",
  113. x = "Min Distance to Lesion (µm)",
  114. y = "Density"
  115. ) +
  116. theme_minimal() +
  117. theme(
  118. legend.box = "vertical",
  119. legend.title = element_text(size = 10),
  120. legend.text = element_text(size = 9)
  121. )
  122. ```
  123. # Differential Expression Analyses
  124. ## Run FindMarkers (Reactive vs. Healthy)
  125. ```{r}
  126. # Find DEGs for each timepoint using "integrated" assay; compare "reactive" vs "healthy".
  127. seurat_list <- list("3dpi" = threedpi, "5dpi" = fivedpi, "17dpi" = seventeendpi)
  128. de_results <- lapply(names(seurat_list), function(tp) {
  129. obj <- seurat_list[[tp]]
  130. DefaultAssay(obj) <- "integrated"
  131. Idents(obj) <- "astro_status"
  132. FindMarkers(
  133. object = obj,
  134. ident.1 = "reactive",
  135. ident.2 = "healthy",
  136. test.use = "wilcox",
  137. logfc.threshold = 0.25,
  138. min.pct = 0.1
  139. ) %>%
  140. rownames_to_column("gene")
  141. })
  142. names(de_results) <- names(seurat_list)
  143. lapply(de_results, head, n = 5)
  144. ```
  145. ## Fold Change Heatmaps
  146. ```{r}
  147. # Load identified noise-prone genes for timepoint of interest
  148. noise_prone_genes <- readRDS("~/Documents/ST/resequencing/Visium_obj/Noise_prone_genes_3dpi.rds")
  149. ```
  150. ```{r}
  151. # Build a matrix of top up/down DEGs at 3dpi and plot fold changes for all timepoints
  152. markers_3dpi_df <- de_results[["3dpi"]] %>% column_to_rownames("gene")
  153. markers_5dpi_df <- de_results[["5dpi"]] %>% column_to_rownames("gene")
  154. markers_17dpi_df <- de_results[["17dpi"]] %>% column_to_rownames("gene")
  155. ```
  156. ```{r}
  157. sig3 <- markers_3dpi_df %>%
  158. rownames_to_column("gene") %>%
  159. filter(p_val_adj < 0.05)
  160. # Filter out the noise‐prone genes
  161. sig3_clean <- sig3 %>%
  162. filter(! gene %in% noise_prone_genes)
  163. top_up_clean <- sig3_clean %>%
  164. arrange(desc(avg_log2FC)) %>%
  165. slice_head(n = 20) %>%
  166. pull(gene)
  167. top_down_clean <- sig3_clean %>%
  168. arrange(avg_log2FC) %>%
  169. slice_head(n = 20) %>%
  170. pull(gene)
  171. top_genes <- c(top_up_clean, top_down_clean)
  172. ```
  173. ```{r}
  174. get_log2fc <- function(markers_df, genes) {
  175. sapply(genes, function(g) {
  176. if (g %in% rownames(markers_df)) {
  177. markers_df[g, "avg_log2FC"]
  178. } else {
  179. NA_real_
  180. }
  181. })
  182. }
  183. fc_matrix <- cbind(
  184. `3 dpi` = get_log2fc(markers_3dpi_df, top_genes),
  185. `5 dpi` = get_log2fc(markers_5dpi_df, top_genes),
  186. `17 dpi` = get_log2fc(markers_17dpi_df, top_genes)
  187. )
  188. rownames(fc_matrix) <- top_genes
  189. raw_fun <- colorRamp2(
  190. c(min(fc_matrix, na.rm = TRUE), 0, max(fc_matrix, na.rm = TRUE)),
  191. c("#7EA3DE", "#E6E3E3", "#DB3C4C")
  192. )
  193. z_fun <- colorRamp2(c(-2, 0, 2), c("#7EA3DE", "#E6E3E3", "#DB3C4C"))
  194. ht_raw <- Heatmap(
  195. fc_matrix,
  196. name = "Fold−change on SCT residuals",
  197. col = raw_fun,
  198. cluster_rows = FALSE,
  199. cluster_columns = FALSE,
  200. show_row_names = TRUE,
  201. show_column_names = TRUE,
  202. row_names_side = "left",
  203. column_names_side = "top",
  204. column_names_rot = 0,
  205. column_title = "Fold−change on SCT residuals",
  206. na_col = "grey90"
  207. )
  208. ht_raw
  209. ```
  210. ```{r}
  211. # Save HM data
  212. mat <- ht_raw@matrix
  213. df <- as.data.frame(mat)
  214. df$Gene <- rownames(df)
  215. df <- df[, c("Gene", setdiff(names(df), "Gene"))]
  216. write.csv(
  217. df,
  218. file = "top20_3dpi_FC_across_timepoints.csv",
  219. row.names = FALSE,
  220. quote = FALSE
  221. )
  222. ```
  223. # DEG Summary and Evolution
  224. ```{r}
  225. # Summarize number/proportion of up/down/NS DEGs at each timepoint and plot stacked bars
  226. classify_deg <- function(df, pval_cut = 0.05, fc_cut = 0.25) {
  227. df %>%
  228. mutate(regulation = case_when(
  229. p_val_adj < pval_cut & avg_log2FC > fc_cut ~ "Upregulated",
  230. p_val_adj < pval_cut & avg_log2FC < -fc_cut ~ "Downregulated",
  231. TRUE ~ "NS"
  232. ))
  233. }
  234. # marker dataframes in list with timepoint names
  235. markers_list <- list(
  236. "3dpi" = markers_3dpi_df,
  237. "5dpi" = markers_5dpi_df,
  238. "17dpi" = markers_17dpi_df
  239. )
  240. markers_list_clean <- map(markers_list, function(df) {
  241. df %>%
  242. # bring gene names into a column
  243. rownames_to_column("gene") %>%
  244. # keep only genes NOT in the noise list
  245. filter(! gene %in% noise_prone_genes) %>%
  246. # back to rownames
  247. column_to_rownames("gene")
  248. })
  249. # DEG summary: classify & bind all timepoints
  250. deg_all <- map2_dfr(markers_list_clean, names(markers_list_clean),
  251. ~ classify_deg(.x) %>% mutate(timepoint = .y)
  252. )
  253. deg_summary <- deg_all %>%
  254. group_by(timepoint, regulation) %>%
  255. summarise(n = n(), .groups = "drop") %>%
  256. group_by(timepoint) %>%
  257. mutate(prop = n / sum(n)) %>%
  258. ungroup() %>%
  259. mutate(
  260. timepoint = factor(timepoint, levels = names(markers_list_clean)),
  261. regulation = factor(regulation, levels = c("Upregulated", "NS", "Downregulated"))
  262. )
  263. # Plot DEG summary
  264. ggplot(deg_summary, aes(timepoint, prop, fill = regulation)) +
  265. geom_col() +
  266. geom_text(aes(label = n),
  267. position = position_stack(vjust = 0.5),
  268. color = "white", size = 5) +
  269. scale_fill_manual(values = c(
  270. Upregulated = "#E44E5A",
  271. NS = "lightgrey",
  272. Downregulated = "#7CA2DE"
  273. )) +
  274. labs(
  275. title = "Proportion and Number of DEGs",
  276. x = "Timepoint",
  277. y = "Proportion of Genes",
  278. fill = "Regulation"
  279. ) +
  280. theme_minimal(base_size = 14)
  281. ```
  282. ```{r}
  283. # Sava data
  284. write.csv(
  285. deg_summary,
  286. file = "DEG_time.csv",
  287. row.names = FALSE,
  288. quote = FALSE
  289. )
  290. ```
  291. ## DEG Evolution (Up and Down Signatures)
  292. ```{r}
  293. # Identify 3dpi signatures
  294. sig_3dpi <- deg_summary %>%
  295. filter(timepoint == "3dpi" & regulation != "NS") %>%
  296. split(.$regulation) %>%
  297. map(~ rownames(markers_list_clean[["3dpi"]])[
  298. markers_list_clean[["3dpi"]]$p_val_adj < 0.05 &
  299. sign(markers_list_clean[["3dpi"]]$avg_log2FC) == ifelse(.x$regulation[1]=="Upregulated", 1, -1) &
  300. abs(markers_list_clean[["3dpi"]]$avg_log2FC) > 0.25
  301. ])
  302. # Build gene‐evolution table for a signature
  303. make_evolution <- function(genes, init_label, markers, pval_cut = 0.05, fc_cut = 0.25) {
  304. map_dfr(names(markers), function(tp) {
  305. df <- markers[[tp]]
  306. stats <- df[genes, c("p_val_adj","avg_log2FC"), drop = FALSE]
  307. regulation <- if (tp == "3dpi") {
  308. init_label
  309. } else {
  310. case_when(
  311. !is.na(stats$p_val_adj) & stats$p_val_adj < pval_cut & stats$avg_log2FC > fc_cut ~ "Upregulated",
  312. !is.na(stats$p_val_adj) & stats$p_val_adj < pval_cut & stats$avg_log2FC < -fc_cut ~ "Downregulated",
  313. TRUE ~ "NS"
  314. )
  315. }
  316. tibble(
  317. gene = genes,
  318. timepoint = factor(tp, levels = names(markers)),
  319. regulation = factor(regulation, levels = c("Upregulated", "NS", "Downregulated"))
  320. )
  321. })
  322. }
  323. # Summarize evolution for plotting
  324. summarize_evol <- function(evo_df) {
  325. evo_df %>%
  326. count(timepoint, regulation, name = "n") %>%
  327. group_by(timepoint) %>%
  328. mutate(prop = n / sum(n)) %>%
  329. ungroup()
  330. }
  331. # Plot
  332. plot_evol <- function(sum_df, title, hide_legend = FALSE) {
  333. ggplot(sum_df, aes(timepoint, prop, fill = regulation)) +
  334. geom_col() +
  335. geom_text(aes(label = n),
  336. position = position_stack(vjust = .5),
  337. color = "white", size = 5) +
  338. scale_fill_manual(values = c(
  339. Upregulated = "#E44E5A",
  340. NS = "lightgrey",
  341. Downregulated = "#7CA2DE"
  342. )) +
  343. labs(title = title, x = "Timepoint", y = "Proportion of Genes") +
  344. theme_minimal(base_size = 14) +
  345. guides(fill = if (hide_legend) "none" else "legend")
  346. }
  347. evol_up <- make_evolution(sig_3dpi$Up, "Upregulated", markers_list_clean)
  348. evol_down <- make_evolution(sig_3dpi$Down, "Downregulated", markers_list_clean)
  349. sum_up <- summarize_evol(evol_up)
  350. sum_down <- summarize_evol(evol_down)
  351. p_up <- plot_evol(sum_up, "3 dpi Upregulated Signature Evolution", hide_legend = TRUE)
  352. p_down <- plot_evol(sum_down, "3 dpi Downregulated Signature Evolution")
  353. (p_up / p_down) + plot_layout(heights = c(1, 1))
  354. ```
  355. ```{r}
  356. # Save data
  357. write.csv(
  358. sum_up,
  359. file = "DEG_UP_time.csv",
  360. row.names = FALSE,
  361. quote = FALSE
  362. )
  363. ```
  364. # Pathway Enrichment (GO)
  365. ## GO Enrichment for Upregulated Genes
  366. ```{r}
  367. # Get upregulated genes for each timepoint and run GO enrichment (biological process)
  368. deg_3dpi_up <- subset(markers_list_clean[["3dpi"]], p_val_adj < 0.05 & avg_log2FC > 0.25)
  369. deg_5dpi_up <- subset(markers_list_clean[["5dpi"]], p_val_adj < 0.05 & avg_log2FC > 0.25)
  370. deg_17dpi_up <- subset(markers_list_clean[["17dpi"]], p_val_adj < 0.05 & avg_log2FC > 0.25)
  371. genes_3dpi_up <- rownames(deg_3dpi_up)
  372. genes_5dpi_up <- rownames(deg_5dpi_up)
  373. genes_17dpi_up <- rownames(deg_17dpi_up)
  374. ```
  375. ```{r}
  376. # Map gene symbols to Entrez IDs (required for clusterProfiler)
  377. genes_3dpi_entrez <- bitr(genes_3dpi_up, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  378. genes_5dpi_entrez <- bitr(genes_5dpi_up, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  379. genes_17dpi_entrez <- bitr(genes_17dpi_up, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  380. # Run enrichment
  381. ego_3dpi_up <- enrichGO(gene = genes_3dpi_entrez$ENTREZID,
  382. OrgDb = org.Mm.eg.db,
  383. ont = "BP",
  384. pAdjustMethod = "BH",
  385. pvalueCutoff = 0.05,
  386. qvalueCutoff = 0.05,
  387. readable = TRUE)
  388. ego_5dpi_up <- enrichGO(gene = genes_5dpi_entrez$ENTREZID,
  389. OrgDb = org.Mm.eg.db,
  390. ont = "BP",
  391. pAdjustMethod = "BH",
  392. pvalueCutoff = 0.05,
  393. qvalueCutoff = 0.05,
  394. readable = TRUE)
  395. ego_17dpi_up <- enrichGO(gene = genes_17dpi_entrez$ENTREZID,
  396. OrgDb = org.Mm.eg.db,
  397. ont = "BP",
  398. pAdjustMethod = "BH",
  399. pvalueCutoff = 0.05,
  400. qvalueCutoff = 0.05,
  401. readable = TRUE)
  402. ```
  403. ## GO Enrichment for Downregulated Genes
  404. ```{r}
  405. # Repeat for downregulated DEGs
  406. deg_3dpi_down <- subset(markers_list_clean[["3dpi"]], p_val_adj < 0.05 & avg_log2FC < -0.25)
  407. deg_5dpi_down <- subset(markers_list_clean[["5dpi"]], p_val_adj < 0.05 & avg_log2FC < -0.25)
  408. deg_17dpi_down <- subset(markers_list_clean[["17dpi"]], p_val_adj < 0.05 & avg_log2FC < -0.25)
  409. genes_3dpi_down <- rownames(deg_3dpi_down)
  410. genes_5dpi_down <- rownames(deg_5dpi_down)
  411. genes_17dpi_down <- rownames(deg_17dpi_down)
  412. ```
  413. ```{r}
  414. genes_3dpi_down_entrez <- bitr(genes_3dpi_down, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  415. genes_5dpi_down_entrez <- bitr(genes_5dpi_down, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  416. genes_17dpi_down_entrez <- bitr(genes_17dpi_down, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Mm.eg.db)
  417. ego_3dpi_down <- enrichGO(gene = genes_3dpi_down_entrez$ENTREZID,
  418. OrgDb = org.Mm.eg.db,
  419. ont = "BP",
  420. pAdjustMethod = "BH",
  421. pvalueCutoff = 0.05,
  422. qvalueCutoff = 0.05,
  423. readable = TRUE)
  424. ego_5dpi_down <- enrichGO(gene = genes_5dpi_down_entrez$ENTREZID,
  425. OrgDb = org.Mm.eg.db,
  426. ont = "BP",
  427. pAdjustMethod = "BH",
  428. pvalueCutoff = 0.05,
  429. qvalueCutoff = 0.05,
  430. readable = TRUE)
  431. ego_17dpi_down <- enrichGO(gene = genes_17dpi_down_entrez$ENTREZID,
  432. OrgDb = org.Mm.eg.db,
  433. ont = "BP",
  434. pAdjustMethod = "BH",
  435. pvalueCutoff = 0.05,
  436. qvalueCutoff = 0.05,
  437. readable = TRUE)
  438. ```
  439. ## Pathway Bubble Plots (Up/Down)
  440. ### Upregulated
  441. ```{r}
  442. # Extract and plot the top 3dpi upregulated pathways and show their trajectory across timepoints.
  443. df_3dpi <- as.data.frame(ego_3dpi_up@result) %>% mutate(timepoint = "3dpi")
  444. df_5dpi <- as.data.frame(ego_5dpi_up@result) %>% mutate(timepoint = "5dpi")
  445. df_17dpi <- as.data.frame(ego_17dpi_up@result) %>% mutate(timepoint = "17dpi")
  446. top10_pathways <- df_3dpi %>% arrange(p.adjust) %>% head(15)
  447. topIDs <- top10_pathways$ID
  448. top10_pathways <- top10_pathways %>% mutate(Pathway = paste(ID, Description, sep=": "))
  449. ordered_pathways <- top10_pathways %>% arrange(p.adjust) %>% pull(Pathway)
  450. df_3 <- df_3dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  451. df_5 <- df_5dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  452. df_17 <- df_17dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  453. combined_df <- bind_rows(df_3, df_5, df_17)
  454. combined_df <- combined_df %>%
  455. mutate(
  456. GeneRatio_numeric = sapply(GeneRatio, function(x){
  457. parts <- as.numeric(unlist(strsplit(x, "/")))
  458. if (length(parts) == 2) parts[1] / parts[2] else NA
  459. }),
  460. neg_log10_p = -log10(p.adjust)
  461. )
  462. combined_df$Pathway <- factor(combined_df$Pathway, levels = rev(ordered_pathways))
  463. combined_df$timepoint <- factor(combined_df$timepoint, levels = c("3dpi", "5dpi", "17dpi"))
  464. ggplot(combined_df, aes(x = timepoint, y = Pathway)) +
  465. geom_point(aes(size = GeneRatio_numeric, color = neg_log10_p)) +
  466. scale_color_gradient(low = "#F7CACE", high = "#A01823", name = expression(-log[10](adj~p))) +
  467. scale_size(range = c(3, 8), name = "Gene Ratio") +
  468. labs(title = "Evolution of Top 3dpi Pathways Across Timepoints",
  469. x = "Timepoint",
  470. y = "Pathway") +
  471. theme_bw() +
  472. theme(text = element_text(size = 12),
  473. axis.text.y = element_text(face = "italic"))
  474. ```
  475. ```{r}
  476. # Save data
  477. write.csv(combined_df, "top15_GO_UP_5dpi_pathways_across_timepoints_noise_genes.csv", row.names = FALSE)
  478. ```
  479. ### Downregulated
  480. ```{r}
  481. # Repeat for top 3dpi downregulated pathways
  482. df_3dpi <- as.data.frame(ego_3dpi_down@result) %>% mutate(timepoint = "3dpi")
  483. df_5dpi <- as.data.frame(ego_5dpi_down@result) %>% mutate(timepoint = "5dpi")
  484. df_17dpi <- as.data.frame(ego_17dpi_down@result) %>% mutate(timepoint = "17dpi")
  485. top10_pathways <- df_5dpi %>% arrange(p.adjust) %>% head(15)
  486. topIDs <- top10_pathways$ID
  487. top10_pathways <- top10_pathways %>% mutate(Pathway = paste(ID, Description, sep=": "))
  488. ordered_pathways <- top10_pathways %>% arrange(p.adjust) %>% pull(Pathway)
  489. df_3 <- df_3dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  490. df_5 <- df_5dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  491. df_17 <- df_17dpi %>% filter(ID %in% topIDs) %>% mutate(Pathway = paste(ID, Description, sep=": "))
  492. combined_df <- bind_rows(df_3, df_5, df_17)
  493. combined_df <- combined_df %>%
  494. mutate(
  495. GeneRatio_numeric = sapply(GeneRatio, function(x){
  496. parts <- as.numeric(unlist(strsplit(x, "/")))
  497. if(length(parts) == 2) parts[1] / parts[2] else NA
  498. }),
  499. neg_log10_p = -log10(p.adjust)
  500. )
  501. combined_df$Pathway <- factor(combined_df$Pathway, levels = rev(ordered_pathways))
  502. combined_df$timepoint <- factor(combined_df$timepoint, levels = c("3dpi", "5dpi", "17dpi"))
  503. ggplot(combined_df, aes(x = timepoint, y = Pathway)) +
  504. geom_point(aes(size = GeneRatio_numeric, color = neg_log10_p)) +
  505. scale_color_gradient(low = "#DFE8F7", high = "#1D3D72", name = expression(-log[10](adj~p))) +
  506. scale_size(range = c(3, 8), name = "Gene Ratio") +
  507. labs(title = "Evolution of Top 3dpi Downregulated Pathways Across Timepoints",
  508. x = "Timepoint",
  509. y = "Pathway") +
  510. theme_bw() +
  511. theme(text = element_text(size = 12),
  512. axis.text.y = element_text(face = "italic"))
  513. ```
  514. ```{r}
  515. # Save data
  516. write.csv(combined_df, "top5_GO_DOWN_3dpi_pathways_across_timepoints_noisegenes.csv", row.names = FALSE)
  517. ```
  518. # Gene Signature Analysis (Migratory & Progenitor Genes)
  519. ```{r, warning=FALSE}
  520. # Plot the mean expression (±SE) and per-gene trends for curated migratory and progenitor gene lists
  521. obj_list <- list(
  522. "3dpi" = subset(threedpi, subset = astro_status == "reactive"),
  523. "5dpi" = subset(fivedpi, subset = astro_status == "reactive"),
  524. "17dpi" = subset(seventeendpi, subset = astro_status == "reactive")
  525. )
  526. get_overall_mean_expr <- function(seurat_obj, gene_list, assay = "SCT") {
  527. mat <- GetAssayData(seurat_obj, assay = assay, slot = "data")
  528. genes_present <- intersect(gene_list, rownames(mat))
  529. if (length(genes_present) == 0) return(c(mean=NA, se=NA))
  530. expr <- rowMeans(mat[genes_present, , drop=FALSE], na.rm=TRUE)
  531. overall_mean <- mean(expr, na.rm=TRUE)
  532. overall_se <- sd(expr, na.rm=TRUE) / sqrt(length(expr))
  533. c(mean=overall_mean, se=overall_se)
  534. }
  535. plot_signature_overall <- function(obj_list, gene_list, sig_name) {
  536. df <- do.call(rbind, lapply(names(obj_list), function(tp) {
  537. stats <- get_overall_mean_expr(obj_list[[tp]], gene_list)
  538. data.frame(Timepoint = tp, Mean_Expression = stats["mean"], SE = stats["se"])
  539. }))
  540. df$Timepoint <- factor(df$Timepoint, levels = c("3dpi","5dpi","17dpi"))
  541. ggplot(df, aes(x = Timepoint, y = Mean_Expression, group = 1)) +
  542. geom_line(size = 1, color = "black") +
  543. geom_point(size = 4, aes(color = Timepoint)) +
  544. geom_errorbar(aes(ymin = Mean_Expression - SE, ymax = Mean_Expression + SE),
  545. width = 0.1, color = "black") +
  546. scale_color_manual(values = c("3dpi" = "#931F1D",
  547. "5dpi" = "#EF959D",
  548. "17dpi" = "#F3B7BC")) +
  549. labs(title = paste(sig_name, "Signature: Mean Expression (±SE)"),
  550. x = "Timepoint", y = "Mean Expression") +
  551. theme_minimal() +
  552. theme(text = element_text(size = 14))
  553. }
  554. plot_signature_per_gene <- function(obj_list, gene_list, sig_name) {
  555. df <- bind_rows(lapply(names(obj_list), function(tp) {
  556. mat <- GetAssayData(obj_list[[tp]], assay="SCT", slot="data")
  557. genes_present <- intersect(gene_list, rownames(mat))
  558. if(length(genes_present) == 0) return(NULL)
  559. tibble(Timepoint = tp,
  560. Gene = genes_present,
  561. Mean_Expr = rowMeans(mat[genes_present, , drop=FALSE], na.rm=TRUE))
  562. }))
  563. df$Timepoint <- factor(df$Timepoint, levels = c("3dpi","5dpi","17dpi"))
  564. ggplot(df, aes(x = Timepoint, y = Mean_Expr, group = Gene, color = Gene)) +
  565. geom_line(size = 0.8, alpha = 0.8) +
  566. geom_point(size = 2, alpha = 0.8) +
  567. scale_color_viridis_d(option = "turbo") +
  568. labs(
  569. title = paste0(sig_name, " Signature Genes: Per-gene Trends"),
  570. subtitle = "Overlay of all signature genes",
  571. x = "Timepoint",
  572. y = "Mean Expression",
  573. color = "Gene"
  574. ) +
  575. theme_minimal(base_size = 12) +
  576. theme(
  577. axis.text.x = element_text(angle = 45, hjust = 1),
  578. legend.position = "right",
  579. legend.key.size = unit(0.4, "cm")
  580. )
  581. }
  582. ```
  583. ## Progenitor Genes: Per-gene and Overall Trends
  584. ```{r}
  585. # Curated list of proliferative signature genes (from literature or own analysis)
  586. progenitor_genes <- c(
  587. "Actn4", "Akt1s1", "Anxa7", "Atp2b4", "Bcl2l1", "C1qa", "Cdk14", "Chst2",
  588. "Dact3", "Dlg1", "Efhd2", "Etv5", "Fgf13", "Fkbp1a", "Gfap", "Grn", "Hdac5",
  589. "Igfbp2", "Il34", "Manf", "Mast2", "Mcl1", "Ndfip1", "Pcna", "Ptprj", "Rbbp4",
  590. "Rimbp2", "Sema6b", "Smarca2", "Tmsb4x", "Trf", "Vim"
  591. )
  592. progenitor_genes_clean <- setdiff(progenitor_genes, noise_prone_genes)
  593. plot_signature_overall(obj_list, progenitor_genes_clean, "Progenitor")
  594. plot_signature_per_gene(obj_list, progenitor_genes_clean, "Progenitor")
  595. ```
  596. ## Migratory Genes: Per-gene Trends
  597. ```{r}
  598. # Curated migratory signature genes
  599. migratory_genes <- c(
  600. "Actn4", "Brk1", "Cotl1", "Emc10", "Evl", "Fam107a", "Marcks", "Pik3r2",
  601. "Rtn4", "Sdc4", "Sparc", "Stmn1", "Tmsb4x", "Tnr", "Tuba1a", "Tubb2b",
  602. "Usp9x", "Vim"
  603. )
  604. migratory_genes_clean <- setdiff(migratory_genes, noise_prone_genes)
  605. plot_signature_overall(obj_list, migratory_genes, "Migratory")
  606. plot_signature_per_gene(obj_list, migratory_genes, "Migratory")
  607. ```
  608. ## Signature Expression vs. Distance
  609. ```{r}
  610. get_sig_expr_cells <- function(obj, tp, genes, assay="SCT", slot="data", dist_col="min_distance_microns") {
  611. mat <- GetAssayData(obj, assay = assay, slot = slot)
  612. genes_present <- intersect(genes, rownames(mat))
  613. if (length(genes_present) == 0) return(NULL)
  614. # compute signature score per cell
  615. sig_vals <- colMeans(mat[genes_present, , drop = FALSE], na.rm = TRUE)
  616. # pull distance from metadata
  617. d <- [email hidden][names(sig_vals), dist_col]
  618. # assemble
  619. data.frame(
  620. Timepoint = tp,
  621. Cell = names(sig_vals),
  622. Expr = sig_vals,
  623. Distance = d,
  624. stringsAsFactors = FALSE
  625. )
  626. }
  627. # Progenitor signature vs. distance
  628. genes <- progenitor_genes_clean
  629. df3 <- get_sig_expr_cells(threedpi, "3dpi", genes)
  630. df5 <- get_sig_expr_cells(fivedpi, "5dpi", genes)
  631. df17 <- get_sig_expr_cells(seventeendpi, "17dpi",genes)
  632. df_cells <- bind_rows(df3, df5, df17)
  633. p_prol <- ggplot(df_cells, aes(x = Distance, y = Expr, color = Timepoint, fill = Timepoint)) +
  634. geom_smooth(method = "loess", se = TRUE, size = 1) +
  635. labs(
  636. title = "Progenitor Signature: Mean SCT Expression vs. Distance",
  637. x = "Min Distance (µm)",
  638. y = "Mean SCT Expression"
  639. ) +
  640. scale_color_manual(values = c(
  641. "3dpi" = "#931F1D",
  642. "5dpi" = "#EF959D",
  643. "17dpi" = "#F6CBCF"
  644. )) +
  645. scale_fill_manual(values = c(
  646. "3dpi" = "#F6CCCC",
  647. "5dpi" = "#FCD1D0",
  648. "17dpi" = "#FBEDEC"
  649. )) +
  650. theme_minimal(base_size = 14) +
  651. theme(text = element_text(size = 14))
  652. print(p_prol)
  653. # Migratory signature vs. distance
  654. genes <- migratory_genes
  655. df3 <- get_sig_expr_cells(threedpi, "3dpi", genes)
  656. df5 <- get_sig_expr_cells(fivedpi, "5dpi", genes)
  657. df17 <- get_sig_expr_cells(seventeendpi, "17dpi",genes)
  658. df_cells <- bind_rows(df3, df5, df17)
  659. p_migr <- ggplot(df_cells, aes(x = Distance, y = Expr, color = Timepoint, fill = Timepoint)) +
  660. geom_smooth(method = "loess", se = TRUE, size = 1) +
  661. labs(
  662. title = "Migratory Signature: Mean SCT Expression vs. Distance",
  663. x = "Min Distance (µm)",
  664. y = "Mean SCT Expression"
  665. ) +
  666. scale_color_manual(values = c(
  667. "3dpi" = "#931F1D",
  668. "5dpi" = "#EF959D",
  669. "17dpi" = "#F6CBCF"
  670. )) +
  671. scale_fill_manual(values = c(
  672. "3dpi" = "#F6CCCC",
  673. "5dpi" = "#FCD1D0",
  674. "17dpi" = "#FBEDEC"
  675. )) +
  676. theme_minimal(base_size = 14) +
  677. theme(text = element_text(size = 14))
  678. print(p_migr)
  679. ```
  680. ## Saving Data
  681. ### Save Expression vs. Distance
  682. ```{r}
  683. df_prol_export <- df_cells %>%
  684. dplyr::rename(
  685. timepoint = Timepoint,
  686. distance = Distance,
  687. `Mean expression` = Expr
  688. )
  689. write.csv(df_prol_export, "migratory_signature_distance.csv", row.names = FALSE)
  690. ```
  691. ### Save per-gene trends
  692. ```{r}
  693. # Save the per-gene trends for both signatures for further stats or plotting
  694. save_signature_per_gene <- function(obj_list, gene_list, filename) {
  695. df <- bind_rows(lapply(names(obj_list), function(tp) {
  696. mat <- GetAssayData(obj_list[[tp]], assay="SCT", slot="data")
  697. genes_present <- intersect(gene_list, rownames(mat))
  698. if(length(genes_present) == 0) return(NULL)
  699. tibble(Timepoint = tp,
  700. Gene = genes_present,
  701. Mean_Expr = rowMeans(mat[genes_present, , drop=FALSE], na.rm=TRUE))
  702. }))
  703. df$Timepoint <- factor(df$Timepoint, levels = c("3dpi","5dpi","17dpi"))
  704. write.csv(df, file = filename, row.names = FALSE)
  705. invisible(df)
  706. }
  707. save_signature_per_gene(obj_list, migratory_genes, "migratory_per_gene_noise.csv")
  708. save_signature_per_gene(obj_list, proliferative_genes, "proliferative_per_gene_noise.csv")
  709. ```
  710. ### Save overall mean (±SE) table
  711. ```{r}
  712. # Save overall mean and SE for signature plots (for bar/line graphs or supplement)
  713. save_signature_overall <- function(obj_list, gene_list, filename) {
  714. df <- do.call(rbind, lapply(names(obj_list), function(tp) {
  715. stats <- get_overall_mean_expr(obj_list[[tp]], gene_list)
  716. data.frame(Timepoint = tp, Mean_Expression = stats["mean"], SE = stats["se"])
  717. }))
  718. df$Timepoint <- factor(df$Timepoint, levels = c("3dpi","5dpi","17dpi"))
  719. write.csv(df, file = filename, row.names = FALSE)
  720. invisible(df)
  721. }
  722. save_signature_overall(obj_list, migratory_genes, "migratory_overal_noise.csv")
  723. save_signature_overall(obj_list, proliferative_genes, "proliferative_overall_noise.csv")
  724. ```
  725. # Session Info
  726. ```{r}
  727. sessionInfo()
  728. ```

7.Comparaison.Rmd at commit a23950f, no license · at the source

Overview

Authors: Marina Herwerth1,2,3,4,5, Matthias T Wyss1,3, Nicola B Schmid1,3, Anna Lasne1,3, Jacqueline Condrau1,3, Luca Ravotto1,3, José María Mateos Melero6, Andres Kaech6, Gustav Bredell7, Carolina Thomas8,9, Rachel Kim10, Petra Kukanja10, Vladyslav L Korobeynyk3,11, Christine Stadelmann8,9, Thomas Misgeld4,12,13, Jeffrey L Bennett14, Sebastian Jessberger3,11, Aiman S Saab1,3, Shane A Liddelow10,15,16,17, Bruno Weber1,3
17 affiliations
  1. Institute of Pharmacology and Toxicology, University of Zurich, Zurich, Switzerland
  2. Neurology Department, University Hospital Zurich, University of Zurich, Zurich, Switzerland
  3. Neuroscience Center Zurich, University and ETH Zurich, Zurich, Switzerland
  4. Institute of Neuronal Cell Biology, Technical University of Munich, Munich, Germany
  5. Department of Neurology, Klinikum rechts der Isar, Technical University of Munich, Munich, Germany
  6. Center for Microscopy and Image Analysis, University of Zurich, Zurich, Switzerland
  7. Computer Vision Laboratory, Department of Information Technology and Electrical Engineering, ETH Zurich, Zurich, Switzerland
  8. Department of Neuropathology, University Medical Center Göttingen, Göttingen, Germany
  9. Cluster of Excellence ‘Multiscale Bioimaging: from Molecular Machines to Network of Excitable Cells’ (MBExC), University of Goettingen, Göttingen, Germany
  10. Institute for Translational Neuroscience, NYU Grossman School of Medicine, New York City, NY USA
  11. Brain Research Institute, University of Zurich, Zurich, Switzerland
  12. German Center for Neurodegenerative Diseases (DZNE), Munich, Germany
  13. Munich Cluster for Systems Neurology (SyNergy), Munich, Germany
  14. Departments of Neurology and Ophthalmology, Programs in Neuroscience and Immunology, University of Colorado School of Medicine, Aurora, CO USA
  15. Department of Neuroscience, NYU Grossman School of Medicine, New York City, NY USA
  16. Department of Ophthalmology, NYU Grossman School of Medicine, New York City, NY USA
  17. Parekh Center for Interdisciplinary Neurology, NYU Grossman School of Medicine, New York City, NY USA
Journal: Nature neuroscience, volume 29, issue 8, pages 1826-1840
Dates: received 21 October 2025; accepted 29 May 2026; published online 23 July 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41593-026-02354-5 · PMID 42493549 · PMCID PMC13433311 · OpenAlex W7170195188
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: mouse (organism), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Preprocessing, Evoked potentials, Connectivity, fMRI & imaging
Keywords: Astrocyte, Neuroimmunology
MeSH: Astrocytes*, Cell Nucleus*, Somatosensory Cortex*, Animals, Aquaporin 4, Cell Proliferation, Mice, Mice, Inbred C57BL (* major topic)
Topic: Neurogenesis and neuroplasticity mechanisms (Developmental Neuroscience, Neuroscience), according to OpenAlex
Funding: Swiss National Science Foundation (196869, 232028, 223118, 156965, 209272, 320030, 216616, 187000); NEI NIH HHS (R01 EY022936)
Citations: cited by 2 papers (Europe PMC); 85 references in the paper

Abstract

Astrocyte loss occurs in various neurological conditions and can disrupt local tissue homeostasis. While astrocytes surrounding border-forming lesions adopt reactive states without restoring astrocyte networks, how astrocytes respond to spatially confined astrocyte loss remains poorly understood. Here we used longitudinal in vivo two-photon microscopy, combined with spatiotemporal transcriptional profiling, to examine astrocyte responses following focal aquaporin-4 antibody-mediated ablation in the somatosensory cortex of adult mouse brain, a model of astrocytopathy relevant to neuromyelitis optica spectrum disorder. Here we show that perilesional astrocytes undergo pronounced structural remodeling during lesion repopulation, characterized by cell proliferation, prolonged multinucleated astrocyte states, polarized process extension into the depleted area and gradual displacement of nuclei into previously unoccupied astrocyte territories. Spatial transcriptomics reveal an injury-associated molecular response that resolves as the astrocyte network is restored. Together, our findings delineate the spatiotemporal dynamics of astrocyte regeneration after astrocyte loss, extending current understanding of astroglial plasticity in the adult brain.

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 6 matches between paragraphs and lines of code.

alasne-uzh/migratory-astrocytes-ST

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: a23950f0bf379a0edd0ed1b9da19efd8aed7e781, 23 July 2025
Languages: R (8)
Size: 11 files, 8 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, environment (environment.yml), 7 notebooks
Not found: license file, CITATION.cff, tests, continuous integration, documentation
Tools: tidyverse (8 files), ComplexHeatmap (7 files), data.table (7 files), ggplot2 (7 files), patchwork (7 files), Seurat (7 files), reticulate (5 files), ggpubr (4 files), igraph (4 files), circlize (1 file), clusterProfiler (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
9 files

doi:10.17632/xw8fv8gt8f.1

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

Code availability

This paper reports an original Python code for vector-based morphological analysis that has been deposited at the Mendeley repository (10.17632/xw8fv8gt8f.1).

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 8 scripts, each with its path and the digest of its content;
  • 6 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

Data Availability Statement

Authors confirm that all relevant data are included in the paper/or its supplementary information files. Further information and requests for resources should be directed to the lead contact, B.W. This study did not generate new unique reagents. Mouse lines can be requested from the providing investigators and are protected by standard MTAs. Stained human tissue sections, whole slide scans thereof and data related to human tissue analysis will be provided upon reasonable request. Transcriptomics data generated and analyzed in this study are available under Gene Expression Omnibus accession GSE300434 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE300434). Code and library details for the ST analysis pipeline are available at https://github.com/alasne-uzh/migratory-astrocytes-ST. Source data are provided with this paper.

This paper reports an original Python code for vector-based morphological analysis that has been deposited at the Mendeley repository (10.17632/xw8fv8gt8f.1).

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 2, 28 September 2026

  • Publisher: n/a → Nature Portfolio

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 20 authors, 2 keywords, 8 MeSH terms, 2 funders, 81 references.

Cite

This paper

Herwerth, M., Wyss, M. T., Schmid, N. B., Lasne, A., Condrau, J., Ravotto, L., Mateos Melero, J. M., Kaech, A., Bredell, G., Thomas, C., Kim, R., Kukanja, P., Korobeynyk, V. L., Stadelmann, C., Misgeld, T., Bennett, J. L., Jessberger, S., Saab, A. S., Liddelow, S. A., & Weber, B. (2026). Focal astrocyte loss reveals nuclear translocation during lesion repopulation. Nature neuroscience, 29(8), 1826-1840. https://doi.org/10.1038/s41593-026-02354-5

BibTeX

@article{herwerth2026focal,
author = {Herwerth, Marina and Wyss, Matthias T and Schmid, Nicola B and Lasne, Anna and Condrau, Jacqueline and Ravotto, Luca and Mateos Melero, José María and Kaech, Andres and Bredell, Gustav and Thomas, Carolina and Kim, Rachel and Kukanja, Petra and Korobeynyk, Vladyslav L and Stadelmann, Christine and Misgeld, Thomas and Bennett, Jeffrey L and Jessberger, Sebastian and Saab, Aiman S and Liddelow, Shane A and Weber, Bruno},
title = {{Focal astrocyte loss reveals nuclear translocation during lesion repopulation}},
journal = {Nature neuroscience},
year = {2026},
month = jul,
volume = {29},
number = {8},
pages = {1826--1840},
publisher = {Nature Portfolio},
issn = {1097-6256},
doi = {10.1038/s41593-026-02354-5},
url = {https://doi.org/10.1038/s41593-026-02354-5},
pmid = {42493549},
pmcid = {PMC13433311}
}

RIS

TY - JOUR
AU - Herwerth, Marina
AU - Wyss, Matthias T
AU - Schmid, Nicola B
AU - Lasne, Anna
AU - Condrau, Jacqueline
AU - Ravotto, Luca
AU - Mateos Melero, José María
AU - Kaech, Andres
AU - Bredell, Gustav
AU - Thomas, Carolina
AU - Kim, Rachel
AU - Kukanja, Petra
AU - Korobeynyk, Vladyslav L
AU - Stadelmann, Christine
AU - Misgeld, Thomas
AU - Bennett, Jeffrey L
AU - Jessberger, Sebastian
AU - Saab, Aiman S
AU - Liddelow, Shane A
AU - Weber, Bruno
TI - Focal astrocyte loss reveals nuclear translocation during lesion repopulation
T2 - Nature neuroscience
J2 - Nat Neurosci
PY - 2026
DA - 2026/07/23
VL - 29
IS - 8
SP - 1826
EP - 1840
SN - 1097-6256
PB - Nature Portfolio
DO - 10.1038/s41593-026-02354-5
UR - https://doi.org/10.1038/s41593-026-02354-5
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41593-026-02354-5",
"type": "article-journal",
"title": "Focal astrocyte loss reveals nuclear translocation during lesion repopulation",
"container-title": "Nature neuroscience",
"author": [
{
"family": "Herwerth",
"given": "Marina"
},
{
"family": "Wyss",
"given": "Matthias T"
},
{
"family": "Schmid",
"given": "Nicola B"
},
{
"family": "Lasne",
"given": "Anna"
},
{
"family": "Condrau",
"given": "Jacqueline"
},
{
"family": "Ravotto",
"given": "Luca"
},
{
"family": "Mateos Melero",
"given": "José María"
},
{
"family": "Kaech",
"given": "Andres"
},
{
"family": "Bredell",
"given": "Gustav"
},
{
"family": "Thomas",
"given": "Carolina"
},
{
"family": "Kim",
"given": "Rachel"
},
{
"family": "Kukanja",
"given": "Petra"
},
{
"family": "Korobeynyk",
"given": "Vladyslav L"
},
{
"family": "Stadelmann",
"given": "Christine"
},
{
"family": "Misgeld",
"given": "Thomas"
},
{
"family": "Bennett",
"given": "Jeffrey L"
},
{
"family": "Jessberger",
"given": "Sebastian"
},
{
"family": "Saab",
"given": "Aiman S"
},
{
"family": "Liddelow",
"given": "Shane A"
},
{
"family": "Weber",
"given": "Bruno"
}
],
"container-title-short": "Nat Neurosci",
"volume": "29",
"issue": "8",
"page": "1826-1840",
"DOI": "10.1038/s41593-026-02354-5",
"PMID": "42493549",
"PMCID": "PMC13433311",
"ISSN": "1097-6256",
"publisher": "Nature Portfolio",
"URL": "https://doi.org/10.1038/s41593-026-02354-5",
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
23
]
]
}
}

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.1073/pnas.2513515123
ECgo: All-optical induction of single endothelial cell injury and capillary occlusion in the brain.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: mouse, 6 references, 3 authors
[2] doi:10.1038/s41593-026-02367-0 [code]
A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.
Journal: Nature neuroscience
In common: reticulate, igraph, circlize, 8 other tools, cellular / molecular, 4 references
[3] doi:10.1038/s41586-026-10214-2 [code]
Multidimensional profiling of heterogeneity in supratentorial ependymomas.
Journal: Nature
In common: reticulate, igraph, circlize, 8 other tools, mouse, 2 references
[4] doi:10.1186/s13059-026-04177-w [code]
Genomic sequence evolution underlying human neocortical interareal diversification.
Journal: Genome biology
In common: reticulate, igraph, circlize, 6 other tools, mouse, cellular / molecular, 4 references
[5] doi:10.1101/gr.281113.125 [code]
Single-nucleus multiomic profiling of the aging mouse substantia nigra reveals conserved gene alterations linked to Parkinson's disease.
Journal: Genome research
In common: reticulate, circlize, clusterProfiler, 7 other tools, mouse, cellular / molecular, 3 references
[6] doi:10.3390/ijms27104466 [code]
Uncovering the Key Circuit FOSL2/FOS/EGR3/EGR1, Contributing to the Hyperexcitability of Excitatory Neurons in the Epileptic Temporal Cortex and Hippocampus.
Journal: International journal of molecular sciences
In common: reticulate, igraph, circlize, 8 other tools, 1 reference
[7] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: reticulate, igraph, circlize, 8 other tools, mouse, cellular / molecular
[8] doi:10.1073/pnas.2523130123 [code]
FABP7 controls radial glial scaffold stability during human cortical development.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: reticulate, igraph, circlize, 8 other tools, mouse
[9] doi:10.1186/s12967-026-08266-z [code]
Single-cell multi-omic integration analysis prioritizes druggable genes and reveals cell-type-specific causal effects in glioblastomagenesis.
Journal: Journal of translational medicine
In common: reticulate, igraph, circlize, 8 other tools, cellular / molecular
[10] doi:10.1016/j.cpblue.2026.100007 [code]
An integrated single-cell and spatial proteotranscriptomics atlas of fibroblast-driven immunoregulation within the human adult oral cavity.
Journal: Cell press blue
In common: reticulate, igraph, circlize, 8 other tools

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.