OSCR

Adapted Smart-seq3xpress Facilitates Selective Microglial Transcriptomic Profiling From Frozen Brain Tissue.

Code ↔ Paper

19 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 19 matches
  1. [1] § Results › PU.1-Based Approach Preserves Microglial Heterogeneity in Frozen Tissue ↔ 2V_02_mg_cells_UMAP_dot_plot.Rmd, lines 244–254 · score 0.91 · C1qa, C1qb, P2ry12, Clec7a, Ccl4, Ifit3
  2. [2] § Methods › Data Analysis › 3’ Bias Metrics ↔ 1DP_06_library_qc.Rmd, lines 153–169 · score 0.91 · additional_sequence_annot.gtf, Gene body coverage, RSeQC, mm10_RefSeq.bed, usegalaxy.eu, mRNA
  3. [3] § Methods › Data Analysis › Data Filtering ↔ 1DP_05_all_cells_LC_FN_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 236–268 · score 0.80 · UMIfraction, percent.spike, nCount_RNA, nFeature_RNA, ERCC, SIRV
  4. [4] § Methods › Data Analysis › Data Filtering ↔ 1DP_00_all_cells_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 268–302 · score 0.80 · UMIfraction, percent.spike, nCount_RNA, nFeature_RNA, ERCC, SIRV
  5. [5] § Methods › Data Analysis › Cell–Cell Communication Analysis ↔ 1DP_04_CellChat.Rmd, lines 168–188 · score 0.80 · computeNetSimilarityPairwise, netEmbedding, mergeCellChat, netClustering, LiveNuclei, LiveCells
  6. [6] § Methods › Data Analysis › Normalization, Integration, and Clustering ↔ 1DP_01_mg_cells_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 115–144 · score 0.79 · FindClusters, FindNeighbors, SCTransform, CCAIntegration, UMAP, resolution
  7. [7] § Methods › Data Analysis › Gene Ontology Enrichment Analysis ↔ 1DP_03_GO.Rmd, lines 10–47 · score 0.78 · clusterProfiler, Gene ontology, GO terms, functional pathways, biological process, LiveCells
  8. [8] § Methods › Data Analysis › Normalization, Integration, and Clustering ↔ 1DP_00_all_cells_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 268–302 · score 0.78 · FindClusters, FindNeighbors, SCTransform, CCAIntegration, UMAP, resolution
  9. [9] § Methods › Data Analysis › Normalization, Integration, and Clustering ↔ 1DP_05_all_cells_LC_FN_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 236–268 · score 0.78 · FindClusters, FindNeighbors, SCTransform, CCAIntegration, UMAP, resolution
  10. [10] § Results › PU.1-Based Enrichment Enhances snRNA-seq Profiling of Microglia in Frozen Brain Tissue ↔ 2V_00_all_cells_UMAP_dot_plot.Rmd, lines 156–168 · score 0.77 · Cx3cr1, endothelial cells, mural cells, neutrophils, astrocytes, monocytes
  11. [11] § Methods › Data Analysis › Normalization, Integration, and Clustering ↔ 1DP_01_mg_cells_raw_data_to_seurat_merged_integrated_UMAP.Rmd, lines 115–144 · score 0.77 · FindClusters, FindNeighbors, SCTransform, CCAIntegration, UMAP, resolution
  12. [12] § Results › PU.1-Based Protocol Enables Detection of Inflammatory Microglial States ↔ 2V_04_DEG.Rmd, lines 168–203 · score 0.69 · Hif1a, Clec7a, ARM population, Cd63, Ctsb, Apoe
  13. [13] § Methods › Data Analysis › Differential Gene Expression Analysis ↔ 1DP_02_DEG.Rmd, lines 158–243 · score 0.62 · FindMarkers, RNA assay, isolation protocol, HM, Seurat, ARM
  14. [14] § Methods › Data Analysis › Identification of Cluster Markers ↔ 2V_02_mg_cells_UMAP_dot_plot.Rmd, lines 623–666 · score 0.60 · module scores, AddModuleScore, Seurat, UMAP, genes
  15. [15] § Results › PU.1-Based Enrichment Enhances snRNA-seq Profiling of Microglia in Frozen Brain Tissue ↔ 2V_00_all_cells_UMAP_dot_plot.Rmd, lines 156–168 · score 0.57 · endothelial cells, mural cells, neutrophils, astrocytes, monocytes, PVM
  16. [16] § Results › PU.1-Based Protocol Enables Detection of Inflammatory Microglial States ↔ 2V_04_DEG.Rmd, lines 33–134 · score 0.55 · log2 fold change, Volcano, log10, overlap, HM, LiveNuclei
  17. [17] § Methods › Data Analysis › Differential Gene Expression Analysis ↔ 2V_04_DEG.Rmd, lines 33–134 · score 0.54 · log2 fold change, HM, isolation protocol, ARM, gene, cells
  18. [18] § Methods › Data Analysis › 3’ Bias Metrics ↔ 1DP_06_library_qc.Rmd, lines 138–150 · score 0.51 · prefixes, internal, ERCC, SIRV, header, BAM
  19. [19] § Results › PU.1-Based Profiling Captures Cell–Cell Interactions Among Microglia ↔ 2V_06_CellChat.Rmd, lines 131–191 · score 0.50 · CellChat, chord diagrams, interactions, LiveNuclei, signaling, LiveCells

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 · 561 lines · 21 KB · no license · 3 matches

  1. ---
  2. title: "2V_04_DEG"
  3. author: "Dominika Dostalova"
  4. date: "2024-11-27"
  5. output: html_document
  6. editor_options:
  7. chunk_output_type: console
  8. ---
  9. Introduction
  10. This script is dedicated to visualizing processed data from **1DP_02_DEG.Rmd**. The processed data are represented using **Volcano and Scatter plots** to illustrate DEG analysis.
  11. #Loading of improtant files
  12. ```{r Load packages, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  13. suppressMessages(library("Matrix"))
  14. suppressMessages(library("ggplot2"))
  15. suppressMessages(library("Seurat"))
  16. suppressMessages(library("sctransform"))
  17. suppressMessages(library("ggrepel"))
  18. suppressMessages(library("dplyr"))
  19. suppressMessages(library("magrittr"))
  20. suppressMessages(library("patchwork"))
  21. suppressMessages(library("scales"))
  22. suppressMessages(library("tidyr"))
  23. suppressMessages(library("openxlsx"))
  24. plots <- list()
  25. col_list <- list()
  26. orders <- list()
  27. source("0F_colours_orders.R", local = F, echo = F, print.eval = F)
  28. source("0F_general_functions.R", local = F, echo = F, print.eval = F)
  29. gene_symbol <- read.table("data/Smartseq3xpress.gene_names.txt", header = TRUE)#File generaetd with zUMIS
  30. ```
  31. #Volcano Plots for comparison DEG in HM and ARM across isolation protocols
  32. ```{r Volcano, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  33. # Load the combined RDS file containing all conditions
  34. de_results_all <- readRDS("ws/1DP_02_DEG_ARMvsHM_allconditions.rds")
  35. # Define genes of interest - ARM Frigerio2019
  36. genes_of_interest <- c(
  37. "Apoe", "Cst7", "Lpl", "Clec7a", "Lyz2", "Ccl3", "Lgals3bp", "Cd63", "H2-D1",
  38. "Ctsb", "Cd9", "Ctsl", "Fth1", "Ctsz", "Cd52", "Ctsd", "B2m", "Eef1a1", "Cd83",
  39. "Ccl6", "Hif1a", "Tyrobp", "Serpine2", "Cadm1", "H2-K1", "Npc2", "Pkm",
  40. "Aldoa", "Tpi1", "Pld3", "Gusb", "Plek", "Ldha"
  41. )
  42. # Define protocol-specific colors (ordered for use with list indices)
  43. protocol_colors <- c("#5F7048", "#8a5c1a", "#d9741a") # Dark Green, Brown, Orange
  44. # Get protocol names
  45. protocol_names <- names(de_results_all)
  46. # Initialize an empty list to store plots
  47. plots <- list()
  48. # Loop through each protocol
  49. for (i in seq_along(protocol_names)) {
  50. protocol <- protocol_names[i]
  51. # Extract DE results
  52. de_results <- de_results_all[[protocol]]
  53. # Map ENSEMBL IDs to gene symbols
  54. de_results$gene_symbol <- gene_symbol$gene_name[match(rownames(de_results), gene_symbol$gene_id)]
  55. # Add significance
  56. de_results$significant <- with(de_results, p_val_adj < 0.05 & abs(avg_log2FC) > 1)
  57. # Add coloring category
  58. de_results$color_group <- ifelse(
  59. de_results$avg_log2FC > -1 & de_results$avg_log2FC < 1,
  60. "lowFC",
  61. ifelse(de_results$significant, "significant", "nonsig")
  62. )
  63. # Filter genes of interest
  64. gene_inter <- de_results %>%
  65. filter(gene_symbol %in% genes_of_interest)
  66. # Volcano plot
  67. plots[[protocol]] <- ggplot(data = de_results,
  68. aes(x = avg_log2FC, y = -log10(p_val_adj))) +
  69. geom_point(aes(colour = color_group),
  70. alpha = 0.6,
  71. shape = 16,
  72. size = 1) +
  73. geom_point(data = gene_inter,
  74. aes(x = avg_log2FC, y = -log10(p_val_adj)),
  75. shape = 21,
  76. fill = "black",
  77. color = "black",
  78. size = 1,
  79. stroke = 0.2) +
  80. geom_label_repel(data = gene_inter %>% filter(significant),
  81. aes(label = gene_symbol),
  82. box.padding = 0.22,
  83. label.padding = 0.10,
  84. point.padding = 0.1,
  85. color = "black",
  86. size = 1.8,
  87. max.iter = 20000,
  88. max.overlaps = 20,
  89. min.segment.length = 0,
  90. force = 30,
  91. nudge_y = 1,
  92. label.size = 0,
  93. segment.size = 0.1) +
  94. geom_hline(yintercept = -log10(0.05), linetype = "dashed", color = "#B6C7DB", linewidth = 0.1) +
  95. geom_vline(xintercept = c(-1, 1), linetype = "dashed", color = "#B6C7DB", linewidth = 0.1) +
  96. labs(
  97. title = paste(protocol, "\n(ARM vs HM)"),
  98. subtitle = (" down in ARM up in ARM"),
  99. x = "Log2 fold change",
  100. y = if (i == 1) "-Log10 adjusted p-value" else NULL
  101. ) +
  102. scale_color_manual(
  103. values = c(
  104. "nonsig" = "gray80",
  105. "lowFC" = "gray80",
  106. "significant" = protocol_colors[i]
  107. ),
  108. guide = "none"
  109. ) +
  110. scale_x_continuous(limits = c(-6.5, 9.1)) +
  111. scale_y_continuous(limits = c(-5, NA )) +#70
  112. theme_mk_title +
  113. remove_grid
  114. print(paste("Volcano plot created for:", protocol))
  115. }
  116. # Combine plots for viewing
  117. plots[["volcano"]] <- plots[["LiveCells"]] + plots[["LiveNuclei"]] + plots[["FixedNuclei"]]
  118. plots[["volcano"]]
  119. ```
  120. # Fig 03 A
  121. ```{r Fig03_1stline, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  122. layout_1stline <- "
  123. ABC
  124. "
  125. plots[["1st_line"]] <- plots[["LiveCells"]] + plots[["LiveNuclei"]] + plots[["FixedNuclei"]] +
  126. plot_layout(guides = "collect", design = layout_1stline) &
  127. theme(
  128. legend.position = "bottom",
  129. legend.justification = "center",
  130. legend.margin = margin(t = -10)
  131. ) &
  132. plot_annotation(
  133. tag_levels = list(c('A', " "),
  134. theme = theme(
  135. plot.tag = element_text(size = 7, face = "plain")
  136. )))
  137. plots[["1st_line"]]
  138. ggsave(
  139. filename = "results/2V_Fig03_1stline_VolcanoPlots.svg",
  140. plot = plots[["1st_line"]],
  141. device = "svg",
  142. width = 16.9,
  143. height = 7,
  144. units = "cm"
  145. )
  146. ```
  147. #SCATTER PLOTS - differences in mean expression of genes in ARM population
  148. #Scatter plot LiveCells vs FixedNuclei in ARM
  149. ```{r Table for ScatterPlot LiveCells vs FixedNuclei, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  150. #gene_table - helper for faster dividing of ARM genes into slots for ScatterPlot
  151. gene_table <- readRDS("ws/1DP_03_gene_table_ScatterPlot_LCvsFN.rds")
  152. list_gene_names_ARM_sym <- c(
  153. "Apoe", "Cst7", "Lpl", "Clec7a", "Lyz2", "Ccl3", "Lgals3bp", "Cd63", "H2-D1",
  154. "Ctsb", "Cd9", "Ctsl", "Fth1", "Ctsz", "Cd52", "Ctsd", "B2m", "Eef1a1", "Cd83",
  155. "Ccl6", "Hif1a", "Tyrobp", "Serpine2", "Cadm1", "H2-K1", "Npc2", "Pkm",
  156. "Aldoa", "Tpi1", "Pld3", "Gusb", "Plek", "Ldha"
  157. )
  158. # Assuming `gene_table` is your data frame
  159. # Initialize vectors for each category
  160. up2_fn <- gene_table$`Upregulated >2x in FN`[gene_table$`Upregulated >2x in FN` %in% list_gene_names_ARM_sym]
  161. up1_fn <- gene_table$`Upregulated 1-2x in FN`[gene_table$`Upregulated 1-2x in FN` %in% list_gene_names_ARM_sym]
  162. up0_fn <- gene_table$`Upregulated 0-1x in FN`[gene_table$`Upregulated 0-1x in FN` %in% list_gene_names_ARM_sym]
  163. up2_lc <- gene_table$`Upregulated >2x in LC`[gene_table$`Upregulated >2x in LC` %in% list_gene_names_ARM_sym]
  164. up1_lc <- gene_table$`Upregulated 1-2x in LC`[gene_table$`Upregulated 1-2x in LC` %in% list_gene_names_ARM_sym]
  165. up0_lc <- gene_table$`Upregulated 0-1x in LC`[gene_table$`Upregulated 0-1x in LC` %in% list_gene_names_ARM_sym]
  166. # Combine results into a named list for clarity
  167. result <- list(
  168. "Upregulated >2x in FN" = up2_fn,
  169. "Upregulated 1-2x in FN" = up1_fn,
  170. "Upregulated 0-1x in FN" = up0_fn,
  171. "Upregulated >2x in LC" = up2_lc,
  172. "Upregulated 1-2x in LC" = up1_lc,
  173. "Upregulated 0-1x in LC" = up0_lc
  174. )
  175. # Print results
  176. print(result)
  177. ```
  178. ```{r Scatter plot LiveCells vs FixedNuclei, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  179. topT <- readRDS("ws/1DP_03_top_genes_ARM_file.rds")
  180. # Define gene groups with their specific colors
  181. gene_groups <- list(
  182. up2 = list(genes = Symbol_to_ENSEMBL(c("Fth1", "Eef1a1")), color = "#5B1F3D"),
  183. up1 = list(genes = Symbol_to_ENSEMBL(c("Cd52", "Apoe", "Ctsd", "Ctsz", "Ccl6", "Npc2", "Ctsl", "Ctsb", "Tpi1", "Cd63", "Cd9", "Tyrobp", "Aldoa","Pkm", "B2m", "Ldha", "Cst7", "Lyz2", "H2-D1")), color = "#A7586D"),
  184. up0 = list(genes = Symbol_to_ENSEMBL(c("Ccl3", "Pld3", "Cd83", "Lpl", "Plek", "Gusb", "Serpine2", "Lgals3bp", "H2-K1", "Clec7a")), color = "#8aa5bf")
  185. )
  186. # Add a `group` and `label_color` column to `topT`
  187. topT$group <- NA
  188. topT$label_color <- NA
  189. for (group in names(gene_groups)) {
  190. genes <- toupper(gene_groups[[group]]$genes)
  191. topT$group[toupper(rownames(topT)) %in% genes] <- group
  192. topT$label_color[toupper(rownames(topT)) %in% genes] <- gene_groups[[group]]$color
  193. }
  194. plots[["scatter_plotLCvsFN"]] <- ggplot(topT, aes(x = LiveCells, y = FixedNuclei)) +
  195. labs(
  196. x = "Log normalized mean expression - LiveCells",
  197. y = "Log normalized mean expression - FixedNuclei"
  198. ) +
  199. geom_abline(slope = 1, intercept = c(0, -2, -1, 1, 2), linetype = c(1, 3, 3, 3, 3)) +
  200. # Base points with color based on differences
  201. geom_point(
  202. aes(color = ifelse(
  203. LiveCells - FixedNuclei > 1, "#5F7048", # Strongly up in LiveCells
  204. ifelse(
  205. FixedNuclei - LiveCells > 1, "#d9741a", # Strongly up in FixedNuclei
  206. "#A1B8D4" # Similar expression
  207. )
  208. )),
  209. size = 0.5,
  210. na.rm = TRUE
  211. ) +
  212. # Highlight gene groups
  213. geom_point(data = subset(topT, !is.na(group)), aes(color = group), size = 0.5) +
  214. # Add gene labels only for up1 and up2
  215. geom_label_repel(
  216. data = subset(topT, group %in% c("up1", "up2")),
  217. aes(
  218. label = ENSEMBL_to_Symbol(rownames(subset(topT, group %in% c("up1", "up2")))),
  219. color = label_color
  220. ),
  221. box.padding = 0.22,
  222. label.padding = 0.1,
  223. point.padding = 0.1,
  224. size = 1.8,
  225. max.iter = 20000,
  226. min.segment.length = 0,
  227. max.overlaps = 20,
  228. show.legend = FALSE,
  229. label.size = 0,
  230. segment.size = 0.1
  231. )+
  232. # Update the manual color scale with more colors
  233. scale_color_manual(
  234. values = c(
  235. "black", # labels >2 LiveCells
  236. "#5F7048", # points >1 LiveCells
  237. # "#7286AA", # labels for genes <1
  238. "gray80", # points < 1
  239. "black", # labels >1 LiveCells
  240. "#d9741a", # points >1 FixedNuclei
  241. "black", # points for genes <1
  242. "black", # points for genes >1 LiveCells
  243. "black" # points for genes >2 LiveCells
  244. )
  245. ) +
  246. theme_mk +
  247. remove_grid +
  248. theme(
  249. legend.position = "none"
  250. )
  251. plots[["scatter_plotLCvsFN"]]
  252. ```
  253. #Scatter plot LiveNuclei vs FixedNuclei in ARM
  254. ```{r Table for ScatterPlot LiveNuclei vs FixedNuclei, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  255. #gene_table - helper for faster dividing of ARM genes into slots for ScatterPlot
  256. gene_table <- readRDS("ws/1DP_03_gene_table_ScatterPlot_LNvsFN.rds")
  257. #filtering for ARM genes
  258. list_gene_names_ARM_sym <- c(
  259. "Apoe", "Cst7", "Lpl", "Clec7a", "Lyz2", "Ccl3", "Lgals3bp", "Cd63", "H2-D1",
  260. "Ctsb", "Cd9", "Ctsl", "Fth1", "Ctsz", "Cd52", "Ctsd", "B2m", "Eef1a1", "Cd83",
  261. "Ccl6", "Hif1a", "Tyrobp", "Serpine2", "Cadm1", "H2-K1", "Npc2", "Pkm",
  262. "Aldoa", "Tpi1", "Pld3", "Gusb", "Plek", "Ldha"
  263. )
  264. # Assuming `gene_table` is your data frame
  265. # Initialize vectors for each category
  266. up2_fn <- gene_table$`Upregulated >2x in FN`[gene_table$`Upregulated >2x in FN` %in% list_gene_names_ARM_sym]
  267. up1_fn <- gene_table$`Upregulated 1-2x in FN`[gene_table$`Upregulated 1-2x in FN` %in% list_gene_names_ARM_sym]
  268. up0_fn <- gene_table$`Upregulated 0-1x in FN`[gene_table$`Upregulated 0-1x in FN` %in% list_gene_names_ARM_sym]
  269. up2_ln <- gene_table$`Upregulated >2x in LN`[gene_table$`Upregulated >2x in LN` %in% list_gene_names_ARM_sym]
  270. up1_ln <- gene_table$`Upregulated 1-2x in LN`[gene_table$`Upregulated 1-2x in LN` %in% list_gene_names_ARM_sym]
  271. up0_ln <- gene_table$`Upregulated 0-1x in LN`[gene_table$`Upregulated 0-1x in LN` %in% list_gene_names_ARM_sym]
  272. # Combine results into a named list for clarity
  273. result <- list(
  274. "Upregulated >2x in FN" = up2_fn,
  275. "Upregulated 1-2x in FN" = up1_fn,
  276. "Upregulated 0-1x in FN" = up0_fn,
  277. "Upregulated >2x in LN" = up2_ln,
  278. "Upregulated 1-2x in LN" = up1_ln,
  279. "Upregulated 0-1x in LN" = up0_ln
  280. )
  281. # Print results
  282. print(result)
  283. ```
  284. ```{r Scatter plot LiveNuclei vs FixedNuclei, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  285. # Load gene expression table for LN vs FN
  286. topT_LNvsFN <- readRDS("ws/1DP_03_top_genes_ARM_file.rds")
  287. # Define gene groups with their specific colors
  288. gene_groups_LNvsFN <- list(
  289. up1 = list(genes = Symbol_to_ENSEMBL(c("Lyz2")), color = "#A7586D"),
  290. up0 = list(genes = Symbol_to_ENSEMBL(c(
  291. "Cd83", "Ctsz", "Ccl6", "Hif1a", "Ctsl", "Serpine2", "Cd9", "Lgals3bp",
  292. "B2m", "H2-K1", "Cst7", "H2-D1", "Clec7a", "Cd52", "Ccl3", "Apoe",
  293. "Pld3", "Ctsd", "Lpl", "Plek", "Npc2", "Ctsb", "Tpi1", "Fth1",
  294. "Cd63", "Gusb", "Tyrobp", "Aldoa", "Cadm1", "Pkm", "Eef1a1", "Ldha"
  295. )), color = "#8aa5bf")
  296. )
  297. # Add `group` and `label_color` to a copy of topT
  298. topT_LNvsFN$group <- NA
  299. topT_LNvsFN$label_color <- NA
  300. for (group in names(gene_groups_LNvsFN)) {
  301. genes <- toupper(gene_groups_LNvsFN[[group]]$genes)
  302. topT_LNvsFN$group[toupper(rownames(topT_LNvsFN)) %in% genes] <- group
  303. topT_LNvsFN$label_color[toupper(rownames(topT_LNvsFN)) %in% genes] <- gene_groups_LNvsFN[[group]]$color
  304. }
  305. # Create the plot
  306. plots[["scatter_plotLNvsFN"]] <- ggplot(topT_LNvsFN, aes(x = LiveNuclei, y = FixedNuclei)) +
  307. labs(
  308. x = "Log normalized mean expression - LiveNuclei",
  309. y = "Log normalized mean expression - FixedNuclei"
  310. ) +
  311. geom_abline(slope = 1, intercept = c(0, -2, -1, 1, 2), linetype = c(1, 3, 3, 3, 3)) +
  312. # Base points
  313. geom_point(
  314. aes(color = ifelse(
  315. LiveNuclei - FixedNuclei > 1, "#8a5c1a",
  316. ifelse(FixedNuclei - LiveNuclei > 1, "#d9741a", "#A1B8D4")
  317. )),
  318. size = 0.5,
  319. na.rm = TRUE
  320. ) +
  321. # Highlight gene groups
  322. geom_point(data = subset(topT_LNvsFN, !is.na(group)), aes(color = group), size = 0.5) +
  323. # Add labels only for up1
  324. geom_label_repel(
  325. data = subset(topT_LNvsFN, group %in% c("up1")),
  326. aes(
  327. label = ENSEMBL_to_Symbol(rownames(subset(topT_LNvsFN, group %in% c("up1")))),
  328. color = label_color
  329. ),
  330. box.padding = 0.22,
  331. label.padding = 0.1,
  332. point.padding = 0.1,
  333. size = 1.8,
  334. max.iter = 20000,
  335. min.segment.length = 0,
  336. max.overlaps = 20,
  337. show.legend = FALSE,
  338. label.size = 0,
  339. segment.size = 0.1
  340. ) +
  341. # Update the manual color scale with more colors
  342. scale_color_manual(
  343. values = c(
  344. "#8a5c1a", # points >1 LiveNuclei
  345. #"#7286AA", # labels <1
  346. "gray80", # points < 1
  347. "black", # labels > LiveNuclei
  348. "#d9741a", #points >1 FixedNuclei
  349. "black", # points for genes <1
  350. "black" # points >1 LiveNuclei SF
  351. ),
  352. guide = "none"
  353. ) +
  354. theme_mk +
  355. remove_grid +
  356. theme(
  357. legend.position = "none", # Show legend for color mapping
  358. )
  359. plots[["scatter_plotLNvsFN"]]
  360. ```
  361. # Fig 03 C
  362. ```{r Fig03_1stline, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  363. layout_1stline <- "
  364. AB"
  365. plots[["1st_line"]] <- plots[["scatter_plotLCvsFN"]] + plots[["scatter_plotLNvsFN"]]+
  366. plot_layout(design = layout_1stline)
  367. plots[["1st_line"]]
  368. ggsave(
  369. filename = "results/2V_Fig03_1stline_ScatterPlotLCvsFNt.svg", # Name of the file
  370. plot = plots[["1st_line"]], # The plot object to save
  371. device = "svg", # Specify the output format (png, pdf, svg)
  372. width = 12, # Width of the image
  373. height = 6, # Height of the image
  374. units = "cm" # Units for width and height
  375. )
  376. ```
  377. #Venn diagram with ARM activation - extraction only values
  378. ```{r Table with names from DEG, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  379. # Create an empty list to store the filtered results
  380. filtered_de_results <- list()
  381. # Create an empty list to store filtered genes for each condition
  382. filtered_genes <- list()
  383. # Iterate over the differential expression results stored in all_de_results
  384. for (name in names(de_results_all)) {
  385. # Get the DE results for the current iteration
  386. de_results <- de_results_all[[name]]
  387. # Filter the results based on the condition: avg_log2FC > 1
  388. filtered_results <- subset(de_results, p_val_adj < 0.05 & avg_log2FC > 1)
  389. # Save the filtered results into the new list
  390. filtered_de_results[[name]] <- filtered_results
  391. # Store only the gene names that meet the condition avg_log2FC > 1
  392. filtered_genes[[name]] <- rownames(filtered_results)
  393. # Print a message for tracking progress
  394. print(paste("Filtered DE results for:", name))
  395. }
  396. # Create the combined table with gene presence/absence
  397. gene_overlap_table <- data.frame(
  398. Gene = unique(unlist(filtered_genes)),
  399. LiveCells = unique(unlist(filtered_genes)) %in% filtered_genes$LiveCells,
  400. LiveNuclei = unique(unlist(filtered_genes)) %in% filtered_genes$LiveNuclei,
  401. FixedNuclei = unique(unlist(filtered_genes)) %in% filtered_genes$FixedNuclei
  402. )
  403. # Add overlap and status information
  404. gene_overlap_table <- gene_overlap_table %>%
  405. rowwise() %>%
  406. mutate(
  407. OverlapCount = sum(c_across(LiveCells:FixedNuclei)),
  408. Status = case_when(
  409. OverlapCount == 3 ~ "Overlap All",
  410. OverlapCount == 2 & LiveCells & LiveNuclei ~ "LiveCells and LiveNuclei",
  411. OverlapCount == 2 & LiveCells & FixedNuclei ~ "LiveCells and FixedNuclei",
  412. OverlapCount == 2 & LiveNuclei & FixedNuclei ~ "LiveNuclei and FixedNuclei",
  413. OverlapCount == 1 & LiveCells ~ "Unique LiveCells",
  414. OverlapCount == 1 & LiveNuclei ~ "Unique LiveNuclei",
  415. OverlapCount == 1 & FixedNuclei ~ "Unique FixedNuclei",
  416. TRUE ~ "Other"
  417. )
  418. )
  419. # Split genes by category
  420. genes_by_category <- gene_overlap_table %>%
  421. select(Gene, Status) %>%
  422. group_by(Status) %>%
  423. mutate(GeneIndex = row_number()) %>% # Create an index for each gene in a category
  424. pivot_wider(names_from = Status, values_from = Gene, values_fill = NA)
  425. # Save the horizontal table to an Excel file
  426. wb <- createWorkbook()
  427. addWorksheet(wb, "Gene Overlap Analysis")
  428. writeData(wb, "Gene Overlap Analysis", genes_by_category)
  429. saveWorkbook(wb, "ws/2V_04_DEG_gene_overlap.xlsx", overwrite = TRUE)
  430. ```
  431. Gene numbers for DEG Venn diagram
  432. ```{r Venn, eval = TRUE, echo = FALSE, message = FALSE, warning=FALSE}
  433. # Create an empty list to store the filtered results
  434. filtered_de_results <- list()
  435. # Create an empty list to store filtered genes for each condition
  436. filtered_genes <- list()
  437. # Iterate over the differential expression results stored in all_de_results
  438. for (name in names(de_results_all)) {
  439. # Get the DE results for the current iteration
  440. de_results <- de_results_all[[name]]
  441. # Filter the results based on the condition: avg_log2FC > 1
  442. filtered_results <- subset(de_results, p_val_adj < 0.05 & avg_log2FC > 1)
  443. # Save the filtered results into the new list
  444. filtered_de_results[[name]] <- filtered_results
  445. # Store only the gene names that meet the condition avg_log2FC > 1
  446. filtered_genes[[name]] <- rownames(filtered_results)
  447. # Print a message for tracking progress
  448. print(paste("Filtered DE results for:", name))
  449. }
  450. # Create a combined table with presence/absence of genes in each condition
  451. gene_overlap_table <- data.frame(
  452. Gene = unique(unlist(filtered_genes)),
  453. LiveCells = unique(unlist(filtered_genes)) %in% filtered_genes$LiveCells,
  454. LiveNuclei = unique(unlist(filtered_genes)) %in% filtered_genes$LiveNuclei,
  455. FixedNuclei = unique(unlist(filtered_genes)) %in% filtered_genes$FixedNuclei
  456. )
  457. # Add overlap and status information
  458. gene_overlap_table <- gene_overlap_table %>%
  459. rowwise() %>%
  460. mutate(
  461. OverlapCount = sum(c_across(LiveCells:FixedNuclei)),
  462. Status = case_when(
  463. OverlapCount == 3 ~ "Overlap All",
  464. OverlapCount == 2 & LiveCells & LiveNuclei ~ "LiveCells and LiveNuclei",
  465. OverlapCount == 2 & LiveCells & FixedNuclei ~ "LiveCells and FixedNuclei",
  466. OverlapCount == 2 & LiveNuclei & FixedNuclei ~ "LiveNuclei and FixedNuclei",
  467. OverlapCount == 1 & LiveCells ~ "Unique LiveCells",
  468. OverlapCount == 1 & LiveNuclei ~ "Unique LiveNuclei",
  469. OverlapCount == 1 & FixedNuclei ~ "Unique FixedNuclei",
  470. TRUE ~ "Other"
  471. )
  472. )
  473. # Group and count genes by status
  474. summary_table <- gene_overlap_table %>%
  475. group_by(Status) %>%
  476. summarize(UniqueGenes = n(), .groups = "drop")
  477. # Display the summary table
  478. print(summary_table)
  479. ```

2V_04_DEG.Rmd at commit 2e9446e, no license · at the source

Overview

  1. Laboratory of Glial Biology and Omics Technologies, Institute of Biotechnology of the Czech Academy of Sciences, Vestec, Czech Republic
  2. Faculty of Science, Charles University, Prague, Czech Republic
  3. GeneCore Facility, Institute of Biotechnology of the Czech Academy of Sciences, Vestec, Czech Republic
  4. Department of Cellular Neurophysiology, Institute of Experimental Medicine of the Czech Academy of Sciences, Prague, Czech Republic
  5. Second Faculty of Medicine, Charles University, Prague, Czech Republic
Journal: Cellular and molecular neurobiology, volume 46, issue 1, article 113
Dates: received 11 December 2025; accepted 4 May 2026; published online 14 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1007/s10571-026-01743-5 · PMID 42133140 · PMCID PMC13357468 · OpenAlex W7161125067
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), mouse (organism), stroke (population), cellular / molecular (subfield)
Methods: Connectivity, Statistics, Smoothing, state filtering, decompositions
Keywords: Enrichment, Frozen tissue, Microglia, PU.1, Single-nucleus RNA - sequencing, Stroke
MeSH: Brain*, Cryopreservation*, Freezing*, Gene Expression Profiling*, Microglia*, Transcriptome*, Animals, Male, Mice, Mice, Inbred C57BL, Sequence Analysis, RNA, Single-Cell Gene Expression Analysis (* major topic)
Topic: Neuroinflammation and Neurodegeneration Mechanisms (Neurology, Neuroscience), according to OpenAlex
Funding: Grantová Agentura, Univerzita Karlova (No. 2224); Grantová Agentura České Republiky (23-05327S); Ministerstvo Školství, Mládeže a Tělovýchovy (Financed by EU-Next Generation EU, LX22NPO5107, Financed by EU—Next Generation EU, MULTIOMICS_CZ CZ.02.01.01/00/23_020/0008540)
Citations: not cited yet (Europe PMC); 45 references in the paper

Abstract

Single-cell transcriptomics has revealed the central role of microglia in brain development, homeostasis, and disease, particularly in the context of neuroinflammation. While single-cell RNA-sequencing enables targeted microglial analysis from fresh tissue, studying these cells in cryopreserved or archival samples remains challenging due to the lack of a protocol for their specific enrichment and RNA-sequencing. In this study, we developed a method for profiling microglial nuclei from fresh-frozen tissue using Smart-seq3xpress. This approach relies on PU.1-based enrichment, made possible by a brief formaldehyde fixation step to preserve the antigen. To ensure compatibility with Smart-seq3xpress, we utilized a Thermolabile Proteinase K treatment to reverse cross-links, thereby maintaining high transcriptomic sensitivity. We benchmarked the method in a mouse model of ischemic stroke, evaluating both technical performance and its ability to capture biologically meaningful microglial states. Compared to standard single-nucleus protocols, our approach yielded higher gene and UMI counts and a greater proportion of coding reads. Transcriptomic profiles closely matched those from whole-cell RNA-sequencing, including the detection of activation markers and diverse microglial subpopulations. This approach enables high-resolution transcriptomic analysis of microglia from fresh-frozen or archival brain samples, overcoming major limitations of single-nucleus RNA sequencing. It broadens access to cellular insights from biobanked material, supporting both basic research and translational studies of neuroinflammatory disease.

Graphical Abstract: A modified Smart-seq3xpress protocol was developed for microglial profiling by combining formaldehyde fixation and PU.1-based nuclei enrichment from fresh-frozen brain tissue. The method yields high gene and UMI counts alongside strong coding coverage, enabling high-resolution characterization of diverse microglial activation states following stroke.

Supplementary Information: The online version contains supplementary material available at 10.1007/s10571-026-01743-5.

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

GliaOmicsLab/microglia-sc-snRNAseq

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 2e9446edb410619736e4773edbeeab4e5d34d5fc, 12 May 2026
Languages: R (17)
Size: 19 files, 17 scripts
Software Heritage: not archived
Found in: “Data Availability”
Holds: README, environment (renv.lock), 15 notebooks
Not found: license file, CITATION.cff, tests, continuous integration, documentation
Tools: ggplot2 (14 files), tidyverse (14 files), patchwork (13 files), Seurat (13 files), reshape2 (9 files), ComplexHeatmap (8 files), pheatmap (4 files), clusterProfiler (3 files), data.table (2 files), ggpubr (1 file), reticulate (1 file), SAMtools (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
18 files

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;
  • 17 scripts, each with its path and the digest of its content;
  • 19 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

The data that support the findings of this study are publicly available on Zenodo (https://zenodo.org/records/16737457), and the code for analysis is available on GitHub (https://github.com/GliaOmicsLab/microglia-sc-snRNAseq). Data from the main experiment (all cells (https://scarfweb.nygen.io/eu-central-1/public/q2acwcw8) and the subset of microglia (https://scarfweb.nygen.io/eu-central-1/public/wxvqmskh)) are available for online analysis via the Nygen portal. A detailed version of the optimized protocol is available at Protocols.io (https://www.protocols.io/private/E618BD14711011F08A690A58A9FEAC02).

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 6 keywords, 12 MeSH terms, 3 funders, 43 references, 4 RRIDs.

Cite

This paper

Dostalova, D., Abaffy, P., Rohlova, E., Kriska, J., Knotek, T., Tureckova, J., Kirdajova, D., Anderova, M., & Valihrach, L. (2026). Adapted Smart-seq3xpress Facilitates Selective Microglial Transcriptomic Profiling From Frozen Brain Tissue. Cellular and molecular neurobiology, 46(1), 113. https://doi.org/10.1007/s10571-026-01743-5

BibTeX

@article{dostalova2026adapted,
author = {Dostalova, Dominika and Abaffy, Pavel and Rohlova, Eva and Kriska, Jan and Knotek, Tomas and Tureckova, Jana and Kirdajova, Denisa and Anderova, Miroslava and Valihrach, Lukas},
title = {{Adapted Smart-seq3xpress Facilitates Selective Microglial Transcriptomic Profiling From Frozen Brain Tissue}},
journal = {Cellular and molecular neurobiology},
year = {2026},
month = may,
volume = {46},
number = {1},
pages = {113},
publisher = {Springer},
issn = {0272-4340},
doi = {10.1007/s10571-026-01743-5},
url = {https://doi.org/10.1007/s10571-026-01743-5},
pmid = {42133140},
pmcid = {PMC13357468}
}

RIS

TY - JOUR
AU - Dostalova, Dominika
AU - Abaffy, Pavel
AU - Rohlova, Eva
AU - Kriska, Jan
AU - Knotek, Tomas
AU - Tureckova, Jana
AU - Kirdajova, Denisa
AU - Anderova, Miroslava
AU - Valihrach, Lukas
TI - Adapted Smart-seq3xpress Facilitates Selective Microglial Transcriptomic Profiling From Frozen Brain Tissue
T2 - Cellular and molecular neurobiology
J2 - Cell Mol Neurobiol
PY - 2026
DA - 2026/05/14
VL - 46
IS - 1
SP - 113
SN - 0272-4340
PB - Springer
DO - 10.1007/s10571-026-01743-5
UR - https://doi.org/10.1007/s10571-026-01743-5
LA - en
ER -

CSL-JSON

{
"id": "10.1007/s10571-026-01743-5",
"type": "article-journal",
"title": "Adapted Smart-seq3xpress Facilitates Selective Microglial Transcriptomic Profiling From Frozen Brain Tissue",
"container-title": "Cellular and molecular neurobiology",
"author": [
{
"family": "Dostalova",
"given": "Dominika"
},
{
"family": "Abaffy",
"given": "Pavel"
},
{
"family": "Rohlova",
"given": "Eva"
},
{
"family": "Kriska",
"given": "Jan"
},
{
"family": "Knotek",
"given": "Tomas"
},
{
"family": "Tureckova",
"given": "Jana"
},
{
"family": "Kirdajova",
"given": "Denisa"
},
{
"family": "Anderova",
"given": "Miroslava"
},
{
"family": "Valihrach",
"given": "Lukas"
}
],
"container-title-short": "Cell Mol Neurobiol",
"volume": "46",
"issue": "1",
"page": "113",
"DOI": "10.1007/s10571-026-01743-5",
"PMID": "42133140",
"PMCID": "PMC13357468",
"ISSN": "0272-4340",
"publisher": "Springer",
"URL": "https://doi.org/10.1007/s10571-026-01743-5",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
14
]
]
}
}

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/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, clusterProfiler, ComplexHeatmap, 8 other tools, cellular / molecular, 3 references
[2] doi:10.1186/s13059-026-04177-w [code]
Genomic sequence evolution underlying human neocortical interareal diversification.
Journal: Genome biology
In common: SAMtools, reticulate, ComplexHeatmap, 7 other tools, genetics / omics, mouse, cellular / molecular, 3 references
[3] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: SAMtools, reticulate, clusterProfiler, 9 other tools, mouse, cellular / molecular
[4] 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: SAMtools, reticulate, clusterProfiler, 9 other tools
[5] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: SAMtools, clusterProfiler, ComplexHeatmap, 7 other tools, mouse, cellular / molecular, 2 references
[6] doi:10.1038/s41586-026-10214-2 [code]
Multidimensional profiling of heterogeneity in supratentorial ependymomas.
Journal: Nature
In common: reticulate, clusterProfiler, ComplexHeatmap, 8 other tools, genetics / omics, mouse, 1 reference
[7] doi:10.1016/j.celrep.2026.117073 [code]
Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.
Journal: Cell reports
In common: SAMtools, reticulate, clusterProfiler, 8 other tools, genetics / omics, mouse, cellular / molecular
[8] 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, clusterProfiler, ComplexHeatmap, 7 other tools, genetics / omics, mouse, cellular / molecular, 2 references
[9] doi:10.1038/s41467-026-69944-6 [code]
Multi-modal dissection of cell-type specific TDP-43 pathology in the motor cortex.
Journal: Nature communications
In common: SAMtools, clusterProfiler, ComplexHeatmap, 8 other tools, genetics / omics, 1 reference
[10] 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, clusterProfiler, ComplexHeatmap, 8 other tools, genetics / omics, 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.

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.