OSCR

Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction.

Code ↔ Paper

8 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 8 matches
  1. [1] § Results › In Utero Transduction Targets All Major Cell Types in the Developing Gut. ↔ Preprocessing/Expt2_Preprocessing.R, lines 112–193 · score 0.90 · Col1a1, Upk3b, Phox2b, enterocytes, goblet, Clca1
  2. [2] § Results › In Utero Transduction Targets All Major Cell Types in the Developing Gut. ↔ Preprocessing/Expt3_Preprocessing.R, lines 119–198 · score 0.89 · Col1a1, Upk3b, Phox2b, enterocytes, goblet, Clca1
  3. [3] § Results › In Utero Transduction Targets All Major Cell Types in the Developing Gut. ↔ Preprocessing/Expt1_Processing.Rmd, lines 710–721 · score 0.84 · Top2a, Col6a4, Lepr, Mfap5, Mki67, Tagln
  4. [4] § Results › Clonal Sharing between Gut Segments Reveals Lineage-Specific Timing of Regional Identity Acquisition. ↔ Clonal_analysis/Clonal_Regional.Rmd, lines 484–499 · score 0.60 · Pou3f3, local clones, colonic ENS, regionally, stomach, clonally
  5. [5] § Results › Clonal Sharing between Gut Segments Reveals Lineage-Specific Timing of Regional Identity Acquisition. ↔ Clonal_analysis/Clonal_Regional.Rmd, lines 484–499 · score 0.56 · local clones, colonic ENS, Pou3f3 expression, migration, Regional, stomach
  6. [6] § Results › Barcoded In Utero Transduction Reveals Clonal Relationships in the Developing Gut. ↔ Preprocessing/Expt2_Processing.Rmd, lines 150–185 · score 0.52 · Col6a4, smooth muscle, interstitial, Adam12, Adamdec1, Kcnn3
  7. [7] § Results › Barcoded In Utero Transduction Reveals Clonal Relationships in the Developing Gut. ↔ Preprocessing/Expt1_Processing.Rmd, lines 138–164 · score 0.52 · Col6a4, smooth muscle, interstitial, Adam12, Adamdec1, Kcnn3
  8. [8] § Results › Nano-Injection at Early E7.5 Improves ENS Targeting While Revealing Residual Epiblasts. ↔ Clonal_analysis/Clonal_Regional.Rmd, lines 236–248 · score 0.51 · cross germ layer, single germ layer, multicellular, e7, transduction, clones

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 · 645 lines · 20 KB · MIT · 3 matches

  1. ---
  2. title: "Figure 5 — Regional and integrated clonal analysis"
  3. output: html_document
  4. ---
  5. ```{r setup, include=FALSE}
  6. knitr::opts_chunk$set(echo = TRUE)
  7. knitr::opts_knit$set(root.dir = normalizePath(".."))
  8. library(dplyr)
  9. library(Seurat)
  10. options(Seurat.object.assay.version = "v5")
  11. library(ggplot2)
  12. library(stringr)
  13. library(patchwork)
  14. library(scales)
  15. library(circlize)
  16. library(UpSetR)
  17. library(scCustomize)
  18. library(ggalluvial)
  19. library(tibble)
  20. library(tidyr)
  21. library(ComplexHeatmap)
  22. options(future.globals.maxSize = 100 * 1024^3)
  23. ```
  24. ```{r}
  25. fig_dir_regions <- "Figures/Fig5/"
  26. save_fig_regions <- function(name, width = 7, height = 5, device = grDevices::pdf, bg = "white", dpi = 300) {
  27. # Ensure directory exists
  28. if (!dir.exists(fig_dir_regions)) dir.create(fig_dir_regions, recursive = TRUE)
  29. ggsave(
  30. filename = file.path(fig_dir_regions, name),
  31. width = width,
  32. height = height,
  33. bg = bg,
  34. dpi = dpi,
  35. device = device
  36. )
  37. }
  38. ```
  39. ```{r}
  40. # Annotated Seurat objects (cell types + clonal metadata; see Preprocessing and Clonal notebooks)
  41. E16_barcodes <- readRDS("Data/E16_barcodes_E1.rds")
  42. E16_barcodes_E2 <- readRDS("Data/E16_barcodes_E2.rds")
  43. E16_E2_ENS <- readRDS("Data/E16_barcodes_ENS_E2.rds")
  44. ```
  45. ```{r}
  46. distinct11 <- c("#377EB8", "#F5B375", "#A3CB38", "#C73681", "#E41A1C", "#84817b", "#A65628", "#FF7F00", "#FFD92F", "#984EA3", "#4DAF4A")
  47. cell_types <- sort(unique(E16_barcodes$major_cell_type_2))
  48. color_map <- setNames(
  49. rep(distinct11, length.out = length(cell_types)),
  50. cell_types
  51. )
  52. clone_cols <- c(
  53. "No CloneID" = "grey70",
  54. "Singleton" = "grey70",
  55. "Cross-germ clones" = "grey70",
  56. "Region not shared at all" = "#56B4E9",
  57. "Region shared by stomach, ileum" = "#ff7f00",
  58. # E2-only categories
  59. "Region shared by stomach, jej_ileum" = "#006D2C",
  60. "Region shared by stomach, colon" = "#006D2C",
  61. "Region shared by jej_ileum, colon" = "#006D2C",
  62. "Region shared by stomach, jej_ile, colon" = "#D81B60"
  63. )
  64. ```
  65. ```{r}
  66. # Find regionally dispersed clones for E7.5 transduction
  67. clone_metadata <- [email hidden] %>%
  68. filter(clones_per_cell_4 == "Multicellular")
  69. regional_clone_summary <- clone_metadata %>%
  70. dplyr::select(clone_nr, sample, clone_type, assigned_cell_type) %>%
  71. group_by(clone_nr) %>%
  72. summarise(
  73. regions = list(unique(sample)),
  74. n_regions = n_distinct(sample),
  75. clone_types = list(unique(clone_type)),
  76. cell_types = list(unique(assigned_cell_type)),
  77. n_cells = n(),
  78. .groups = "drop"
  79. )
  80. # Identify clones found in multiple regions
  81. dispersed_clones <- regional_clone_summary %>%
  82. filter(n_regions > 1) # 21 clones
  83. summary_row <- dispersed_clones %>%
  84. summarise(
  85. clone_nr = paste0("TOTAL(", length(clone_nr), " clones)"),
  86. regions = list(unique(unlist(regions))),
  87. n_regions = 2,
  88. clone_types = list(unique(unlist(clone_types))),
  89. cell_types = list(unique(unlist(cell_types))),
  90. n_cells = sum(n_cells)
  91. )
  92. dispersed_clones <- dispersed_clones %>%
  93. mutate(clone_nr = as.character(clone_nr)) %>%
  94. unique()
  95. dispersed_clones_with_total <- bind_rows(dispersed_clones, summary_row)
  96. dispersed_clones_df <- dispersed_clones_with_total %>%
  97. mutate(across(where(is.list), ~ sapply(., toString)))
  98. write.csv(dispersed_clones_df, "Data/E1_regionaldispersed_clones.csv", row.names = FALSE)
  99. ```
  100. ```{r}
  101. # Prepare for the UpSet plot
  102. clone_counts <- as.data.frame(table(clone_metadata$clone_nr))
  103. colnames(clone_counts) <- c("clone_nr", "cell_count")
  104. shared_clone_metadata <- clone_metadata %>%
  105. filter(clone_nr %in% dispersed_clones$clone_nr)
  106. clone_analysis <- shared_clone_metadata %>%
  107. dplyr::select(clone_nr, major_cell_type_2)
  108. data_wide <- as.data.frame.matrix(table(clone_analysis$clone_nr, clone_analysis$major_cell_type_2))
  109. celltype <- colnames(data_wide)
  110. set_sizes <- colSums(data_wide)
  111. # Compute total number of cells per clone (sum across all cell types)
  112. clone_sizes <- rowSums(data_wide)
  113. # Convert to binary for UpSet intersections
  114. binary_matrix <- data_wide %>%
  115. mutate(across(everything(), ~ ifelse(. > 0, 1, 0)))
  116. binary_matrix$Clone_Size <- clone_sizes
  117. sets_vec <- colnames(binary_matrix)[-ncol(binary_matrix)]
  118. ```
  119. ```{r,fig.height = 6 , fig.width = 6, fig.align = "center"}
  120. grid::grid.newpage()
  121. upset(
  122. binary_matrix[, -ncol(binary_matrix)],
  123. sets = sets_vec,
  124. order.by = "freq",
  125. sets.x.label = "Total multicellular clones",
  126. point.size = 5,
  127. line.size = 2,
  128. mb.ratio = c(0.6, 0.4),
  129. text.scale = c(2.5, 2.0, 2.0, 1.8, 2.2, 2.2),
  130. nintersects = 30,
  131. mainbar.y.max = 16
  132. ) # Fig 5A
  133. dev.off()
  134. ```
  135. ```{r}
  136. clone_region_map <- [email hidden] %>%
  137. group_by(clone_nr) %>%
  138. summarise(
  139. regions = list(sort(unique(sample))),
  140. clone_type = unique(clone_type)[1],
  141. .groups = "drop"
  142. ) %>%
  143. mutate(
  144. shared_clone_category = case_when(
  145. clone_type == "No CloneID" ~ "No CloneID",
  146. clone_type == "Singleton" ~ "Singleton",
  147. TRUE ~ map_chr(regions, function(r) {
  148. if (length(r) == 1) {
  149. "Region not shared at all"
  150. } else if (setequal(r, c("E16_stomach", "E16_ileum"))) {
  151. "Region shared by stomach, ileum"
  152. } else {
  153. paste("Other combination:", paste(r, collapse = ", "))
  154. }
  155. })
  156. )
  157. )
  158. [email hidden]$shared_clone_category <-
  159. clone_region_map$shared_clone_category[
  160. match([email hidden]$clone_nr, clone_region_map$clone_nr)
  161. ]
  162. [email hidden]$shared_clone_category <- factor(
  163. [email hidden]$shared_clone_category,
  164. levels = c(
  165. "No CloneID",
  166. "Singleton",
  167. "Region not shared at all",
  168. "Region shared by stomach, ileum"
  169. )
  170. )
  171. [email hidden]$shared_clone_category <- factor(
  172. [email hidden]$shared_clone_category,
  173. levels = names(clone_cols)
  174. )
  175. DimPlot(E16_barcodes, group.by = "shared_clone_category", reduction = "umap.harmony", pt.size = 0.5, order = T, cols = clone_cols) + ggtitle("Clones shared between regions")
  176. save_fig_regions("umap_E1_regional_sharedclones.pdf", width = 9, height = 6) # Fig 5B
  177. ```
  178. ```{r,fig.height = 6, fig.width = 8, fig.align = "center"}
  179. clone_numbers_dispersed <- dispersed_clones$clone_nr %>% unique()
  180. df <- [email hidden] %>%
  181. filter(clone_nr %in% clone_numbers_dispersed) %>%
  182. select(sample, major_cell_type_2, clone_nr) %>%
  183. mutate(
  184. sample = factor(sample, levels = c("E16_stomach", "E16_ileum")),
  185. major_cell_type = as.factor(major_cell_type_2)
  186. )
  187. ggplot(
  188. df,
  189. aes(
  190. axis1 = sample,
  191. axis2 = major_cell_type,
  192. axis3 = clone_nr,
  193. y = 1,
  194. fill = major_cell_type
  195. )
  196. ) +
  197. geom_alluvium(aes(fill = major_cell_type), width = 0.1, alpha = 0.8) +
  198. geom_stratum(width = 0.1, fill = "grey90", color = "black") +
  199. geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 5) +
  200. scale_x_discrete(limits = c("Sample", "Cell type","Clone ID"), expand = c(0.1, 0.1)) +
  201. scale_fill_manual(values = color_map) +
  202. theme_void() +
  203. theme(legend.position = "none") # Fig 5C
  204. save_fig_regions("alluvialdiagram_E1_regional.pdf", width = 8, height = 6)
  205. ```
  206. ```{r}
  207. # Find regionally dispersed clones for early E7.5 transduction ( restricted to single-germ-layer clones)
  208. cross_germ_clone_ids <- [email hidden] %>%
  209. filter(clones_per_cell_4 == "Multicellular") %>%
  210. group_by(clone_nr) %>%
  211. summarise(
  212. n_types = n_distinct(major_cell_type_3),
  213. .groups = "drop"
  214. ) %>%
  215. filter(n_types > 1) %>%
  216. pull(clone_nr)
  217. cross_germ_clone_ids
  218. ```
  219. ```{r,fig.height = 6, fig.width = 8, fig.align = "center"}
  220. clone_cols <- c(
  221. "No CloneID" = "grey70",
  222. "Singleton" = "grey70",
  223. "Cross-germ clones" = "grey70",
  224. "Region not shared at all" = "#56B4E9",
  225. "Region shared by stomach, jej_ileum" = "#006D2C",
  226. "Region shared by stomach, colon" = "#006D2C",
  227. "Region shared by jej_ileum, colon" = "#006D2C",
  228. "Region shared by stomach, jej_ile, colon" = "#D81B60"
  229. )
  230. clone_region_map_E2 <- [email hidden] %>%
  231. group_by(clone_nr) %>%
  232. summarise(
  233. regions = list(sort(unique(sample))),
  234. clone_type = dplyr::first(as.character(clone_type)),
  235. .groups = "drop"
  236. ) %>%
  237. mutate(
  238. shared_clone_category = case_when(
  239. clone_type == "No CloneID" ~ "No CloneID",
  240. clone_type == "Singleton" ~ "Singleton",
  241. TRUE ~ map_chr(regions, function(r) {
  242. if (length(r) == 1) {
  243. "Region not shared at all"
  244. } else if (all(c("E16_stomach", "E16_jej_ileum") %in% r) && length(r) == 2) {
  245. "Region shared by stomach, jej_ileum"
  246. } else if (all(c("E16_stomach", "E16_colon") %in% r) && length(r) == 2) {
  247. "Region shared by stomach, colon"
  248. } else if (all(c("E16_jej_ileum", "E16_colon") %in% r) && length(r) == 2) {
  249. "Region shared by jej_ileum, colon"
  250. } else if (all(c("E16_stomach", "E16_jej_ileum", "E16_colon") %in% r) && length(r) == 3) {
  251. "Region shared by stomach, jej_ile, colon"
  252. } else {
  253. stop(paste("Unexpected region combination:", paste(r, collapse = ", ")))
  254. }
  255. })
  256. ),
  257. shared_clone_category = if_else(
  258. clone_nr %in% cross_germ_clone_ids,
  259. "Cross-germ clones",
  260. shared_clone_category
  261. )
  262. )
  263. [email hidden]$shared_clone_category <-
  264. clone_region_map_E2$shared_clone_category[
  265. match([email hidden]$clone_nr, clone_region_map_E2$clone_nr)
  266. ]
  267. [email hidden]$shared_clone_category <- factor(
  268. [email hidden]$shared_clone_category,
  269. levels = c(
  270. "No CloneID",
  271. "Singleton",
  272. "Cross-germ clones",
  273. "Region not shared at all",
  274. "Region shared by stomach, jej_ileum",
  275. "Region shared by stomach, colon",
  276. "Region shared by jej_ileum, colon",
  277. "Region shared by stomach, jej_ile, colon"
  278. )
  279. )
  280. DimPlot(E16_barcodes_E2, group.by = "shared_clone_category", reduction = "umap.harmony", pt.size = 0.5, order = T, cols = clone_cols) + ggtitle(NULL) + xlab("UMAP1") + ylab("UMAP2")
  281. save_fig_regions("umap_E2_regional_sharedclones.pdf", width = 9, height = 6) # Fig 5E
  282. ```
  283. ```{r}
  284. # Prepare for the UpSet plot for E2 (non-epiblast clones only)
  285. distinct_clones_E2 <- clone_metadata_E2%>%
  286. group_by(clone_nr) %>%
  287. filter(n_distinct(major_cell_type_3) == 1) %>%
  288. ungroup() %>%
  289. distinct(clone_nr) %>%
  290. pull(clone_nr)# 851 CloneIDs
  291. shared_clone_metadata_E2 <- clone_metadata_E2 %>%
  292. filter(clone_nr %in% distinct_clones_E2)
  293. regional_clone_summary_E2 <- shared_clone_metadata_E2 %>%
  294. dplyr::select(clone_nr, sample, clone_type, assigned_cell_type) %>%
  295. group_by(clone_nr) %>%
  296. summarise(
  297. regions = list(unique(sample)),
  298. n_regions = n_distinct(sample),
  299. clone_types = list(unique(clone_type)),
  300. cell_types = list(unique(assigned_cell_type)),
  301. n_cells = n(),
  302. .groups = "drop"
  303. )
  304. # Identify clones found in multiple regions
  305. dispersed_clones_E2 <- regional_clone_summary_E2 %>%
  306. filter(n_regions > 1) # 119 clones
  307. summary_row_E2 <- dispersed_clones_E2 %>%
  308. summarise(
  309. clone_nr = paste0("TOTAL(", length(clone_nr), " clones)"),
  310. regions = list(unique(unlist(regions))),
  311. n_regions = 3,
  312. clone_types = list(unique(unlist(clone_types))),
  313. cell_types = list(unique(unlist(cell_types))),
  314. n_cells = sum(n_cells)
  315. )
  316. dispersed_clones_E2 <- dispersed_clones_E2 %>%
  317. mutate(clone_nr = as.character(clone_nr)) %>%
  318. unique()
  319. dispersed_clones_with_total_E2 <- bind_rows(dispersed_clones_E2, summary_row_E2)
  320. dispersed_clones_df_E2 <- dispersed_clones_with_total_E2 %>%
  321. mutate(across(where(is.list), ~ sapply(., toString)))
  322. write.csv(dispersed_clones_df_E2, "Data/E2_regionaldispersed_clones_nonepiblast.csv", row.names = FALSE)
  323. ```
  324. ```{r}
  325. # Prepare for the UpSet plot for E2 (non-epiblast)
  326. clone_analysis_E2 <- shared_clone_metadata_E2 %>%
  327. dplyr::select(clone_nr, major_cell_type_2)
  328. data_wide_E2 <- as.data.frame.matrix(table(clone_analysis_E2$clone_nr, clone_analysis_E2$major_cell_type_2))
  329. celltype_E2 <- colnames(data_wide_E2)
  330. set_sizes_E2 <- colSums(data_wide_E2)
  331. # Compute total number of cells per clone (sum across all cell types)
  332. clone_sizes_E2 <- rowSums(data_wide_E2)
  333. # Convert to binary for UpSet intersections
  334. binary_matrix_E2 <- data_wide_E2 %>%
  335. mutate(across(everything(), ~ ifelse(. > 0, 1, 0)))
  336. binary_matrix_E2$Clone_Size <- clone_sizes_E2
  337. sets_vec_E2 <- colnames(binary_matrix_E2)[-ncol(binary_matrix_E2)]
  338. ```
  339. ```{r,fig.height = 5, fig.width = 6, fig.align = "center"}
  340. pdf(file.path(fig_dir_regions, "Uplot_E2_regional_nonepiblast.pdf"), width = 6, height = 5, onefile = FALSE)
  341. grid::grid.newpage()
  342. upset(
  343. binary_matrix_E2[, -ncol(binary_matrix_E2)],
  344. sets = sets_vec_E2,
  345. order.by = "freq",
  346. sets.x.label = "Total multicellular clones",
  347. point.size = 5,
  348. line.size = 2,
  349. mb.ratio = c(0.6, 0.4),
  350. text.scale = c(2.5, 2.0, 2.0, 1.8, 2.2, 2.2),
  351. nintersects = 30,
  352. mainbar.y.max = 120
  353. ) # Fig 5D
  354. dev.off()
  355. ```
  356. ```{r}
  357. heatmap_matrix <- shared_clone_metadata_E2 %>%
  358. distinct(clone_nr, sample) %>%
  359. mutate(val = 1) %>%
  360. pivot_wider(names_from = sample, values_from = val, values_fill = 0) %>%
  361. column_to_rownames("clone_nr") %>%
  362. as.matrix()
  363. # Prepare the Row Annotation (Cell Type)
  364. row_data <- shared_clone_metadata_E2 %>%
  365. distinct(clone_nr, major_cell_type_2) %>%
  366. group_by(clone_nr) %>%
  367. summarise(type = paste(unique(major_cell_type_2), collapse = "/")) %>%
  368. column_to_rownames("clone_nr")
  369. row_data <- row_data[rownames(heatmap_matrix), , drop = FALSE]
  370. celltype_cols <- c(
  371. "Endothelial" = "#A65628",
  372. "ENS" = "#984EA3",
  373. "Immune" = "#4DAF4A",
  374. "ICC/Fibroblast" = "yellow",
  375. "Endothelial/Fibroblast" = "#377EB8",
  376. "Immune/Fibroblast" = "red"
  377. )
  378. ra = rowAnnotation(
  379. CellType = row_data$type,
  380. col = list(CellType = celltype_cols)
  381. )
  382. # Draw the Heatmap
  383. pdf(file.path(fig_dir_regions, "E2_nonepiblast_clones_3regions.pdf"), width = 6, height = 5, onefile = FALSE)
  384. Heatmap(heatmap_matrix,
  385. name = "Presence",
  386. col = c("white", "navy"),
  387. right_annotation = ra,
  388. show_row_names = FALSE,
  389. cluster_columns = FALSE,
  390. row_title = "Clones",
  391. column_title = "Regional Distribution & Cell Identity",
  392. border = TRUE)
  393. dev.off() # Fig 5F
  394. ```
  395. ```{r,fig.height = 6, fig.width = 6, fig.align = "center"}
  396. clone_sharing_logic <- [email hidden] %>%
  397. filter(clones_per_cell_4 == "Multicellular") %>%
  398. group_by(clone_nr) %>%
  399. filter(n_distinct(major_cell_type_3) == 1) %>%
  400. distinct(clone_nr, sample) %>%
  401. group_by(clone_nr) %>%
  402. summarise(intersection_type = paste(sort(sample), collapse = " & "), .groups = "drop")
  403. sharing_map <- setNames(clone_sharing_logic$intersection_type, clone_sharing_logic$clone_nr)
  404. cells_meta <- [email hidden]
  405. cell_upset_values <- sharing_map[as.character(cells_meta$clone_nr)]
  406. names(cell_upset_values) <- colnames(E16_E2_ENS)
  407. E16_E2_ENS$upset_group <- cell_upset_values
  408. E16_E2_ENS$migration_type <- case_when(
  409. grepl("stomach", E16_E2_ENS$upset_group) & grepl("colon", E16_E2_ENS$upset_group) ~ "Stomach-Colon Migrant",
  410. grepl("&", E16_E2_ENS$upset_group) ~ "Other Shared Clone",
  411. TRUE ~ "Local Clone"
  412. )
  413. DimPlot(E16_E2_ENS,
  414. group.by = "migration_type",
  415. cols = c("Stomach-Colon Migrant" = "#E31A1C",
  416. "Other Shared Clone" = "#1F78B4",
  417. "Local Clone" = "#A6CEE3",
  418. "Unlabeled" = "grey90"),
  419. order = T,
  420. reduction = "umap.harmony") +
  421. labs(title = "ENS: Evidence of Long-Distance Migration",
  422. subtitle = "Red cells share a Clone ID between Stomach and Colon") #Fig 5H
  423. save_fig_regions("ENS_longdistancemigration_nonepiblast.pdf",width = 6, height = 6)
  424. ```
  425. ```{r,fig.height = 6, fig.width = 7, fig.align = "center"}
  426. E16_colon_barcodes_E2 <- subset(E16_E2_ENS, subset = epiblast_label == "non-epiblast" & sample == "E16_colon")
  427. VlnPlot(E2_colon_subset,
  428. features = c("Pou3f3","Pantr1"),
  429. group.by = "migration_type",
  430. pt.size = 0.5, # Shows individual cell jitter
  431. cols = c("Stomach-Colon Migrant" = "#E31A1C",
  432. "Other Shared Clone" = "#1F78B4",
  433. "Local Clone" = "#A6CEE3",
  434. "Unlabeled" = "grey90")) +
  435. geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
  436. labs(title = "Pou3f3 Expression in Colonic ENS by Clonal Origin",
  437. subtitle = "Stomach-derived migrants acquire colonic markers") +
  438. theme(legend.position = "none") # Fig 5I
  439. save_fig_regions("ENS_Vlnplot_nonepiblast.pdf",width = 7, height = 6)
  440. ```
  441. ```{r}
  442. # 1. Prepare metadata with relabeled ENS subtypes
  443. ens_meta_shared <- [email hidden] %>%
  444. filter(!is.na(clone_nr)) %>%
  445. mutate(
  446. refined_type = case_when(
  447. grepl("Progenitor", assigned_cell_type, ignore.case = TRUE) ~ "ENS Progenitors",
  448. grepl("Branch B", assigned_cell_type, ignore.case = TRUE) ~ "ENS Branch B",
  449. assigned_cell_type %in% c("ENS Branch A", "ENC12") ~ "ENS Branch A",
  450. TRUE ~ assigned_cell_type
  451. )
  452. ) %>%
  453. group_by(clone_nr) %>%
  454. #filter(n_distinct(refined_type) > 1, n_distinct(sample) > 1) %>% # filtering the more than 1 sample more than 1 cell type
  455. ungroup()
  456. # 2. Clone annotation data
  457. ens_shared_metadata <- ens_meta_shared %>%
  458. group_by(clone_nr) %>%
  459. summarise(
  460. samples = paste(
  461. unique(sample[order(match(sample, c("E16_stomach", "E16_jej_ileum", "E16_colon")))]),
  462. collapse = " / "
  463. ),
  464. .groups = "drop"
  465. )
  466. # 3. Build clone x subtype proportion matrix
  467. heatmap_matrix_ens <- ens_meta_shared %>%
  468. group_by(clone_nr, refined_type) %>%
  469. tally(name = "cell_count") %>%
  470. group_by(clone_nr) %>%
  471. mutate(prop = cell_count / sum(cell_count)) %>%
  472. ungroup() %>%
  473. select(clone_nr, refined_type, prop) %>%
  474. pivot_wider(
  475. id_cols = clone_nr,
  476. names_from = refined_type,
  477. values_from = prop,
  478. values_fill = 0
  479. ) %>%
  480. column_to_rownames("clone_nr") %>%
  481. as.matrix()
  482. # 4. Align row annotation
  483. row_data_ens <- ens_shared_metadata %>%
  484. filter(clone_nr %in% rownames(heatmap_matrix_ens)) %>%
  485. column_to_rownames("clone_nr")
  486. row_data_ens <- row_data_ens[rownames(heatmap_matrix_ens), , drop = FALSE]
  487. # 5. Region annotation colors
  488. all_unique_combos <- unique(row_data_ens$samples)
  489. ens_colors <- setNames(scales::hue_pal()(length(all_unique_combos)), all_unique_combos)
  490. ra_ens <- rowAnnotation(
  491. region = row_data_ens$samples,
  492. col = list(region = ens_colors),
  493. show_annotation_name = TRUE,
  494. annotation_legend_param = list(
  495. region = list(
  496. title = "Regions",
  497. title_gp = gpar(fontsize = 10, fontface = "bold")
  498. )
  499. )
  500. )
  501. # 6. Order subtype columns
  502. subtype_order <- c(
  503. "ENS Progenitors",
  504. "ENS Neuroblast",
  505. "ENS Branch A",
  506. "ENS Branch B",
  507. "SCP"
  508. )
  509. existing_cols <- intersect(subtype_order, colnames(heatmap_matrix_ens))
  510. heatmap_matrix_ens <- heatmap_matrix_ens[, existing_cols, drop = FALSE]
  511. # 7. Order region groups
  512. region_order <- c(
  513. "E16_stomach / E16_jej_ileum / E16_colon",
  514. "E16_stomach / E16_colon",
  515. "E16_stomach / E16_jej_ileum",
  516. "E16_jej_ileum / E16_colon",
  517. "E16_stomach",
  518. "E16_jej_ileum",
  519. "E16_colon"
  520. )
  521. region_colors <- c(
  522. "E16_stomach / E16_jej_ileum / E16_colon" = "#E41A1C",
  523. "E16_stomach / E16_colon" = "#FF69B4",
  524. "E16_stomach / E16_jej_ileum" = "#FF7F00",
  525. "E16_jej_ileum / E16_colon" = "#41AB5D",
  526. "E16_stomach" = "#8C6D31",
  527. "E16_jej_ileum" ="#FDBF6F",
  528. "E16_colon" = "#CAB2D6"
  529. )
  530. row_data_ens$samples <- factor(row_data_ens$samples, levels = region_order)
  531. # reorder rows to match split order
  532. ord <- order(row_data_ens$samples)
  533. heatmap_matrix_ens <- heatmap_matrix_ens[ord, , drop = FALSE]
  534. row_data_ens <- row_data_ens[ord, , drop = FALSE]
  535. # rebuild annotation AFTER ordering rows
  536. ra_ens <- rowAnnotation(
  537. region = row_data_ens$samples,
  538. col = list(region = region_colors),
  539. show_annotation_name = TRUE,
  540. annotation_legend_param = list(
  541. region = list(
  542. title = "Regions",
  543. title_gp = gpar(fontsize = 10, fontface = "bold")
  544. )
  545. )
  546. )
  547. pdf(file.path(fig_dir_regions, "ENS_E2_subtype_sharing_heatmap_subtype_allclones.pdf"), width = 6, height = 9)
  548. Heatmap(
  549. heatmap_matrix_ens,
  550. name = "Proportion",
  551. right_annotation = ra_ens,
  552. cluster_columns = FALSE,
  553. cluster_rows = TRUE,
  554. cluster_row_slices = FALSE,
  555. row_split = row_data_ens$samples,
  556. row_gap = unit(1.5, "mm"),
  557. show_row_names = FALSE,
  558. border = TRUE,
  559. column_names_side = "top",
  560. column_title = "Long-Distance ENS Migrants: Regional & Subtype Composition",
  561. row_title = "Shared CloneIDs"
  562. ) #Fig 5G
  563. dev.off()
  564. ```
  565. ```{r}
  566. saveRDS(object = E16_barcodes, "Data/E16_barcodes_E1.rds")
  567. saveRDS(object = E16_barcodes_E2, "Data/E16_barcodes_E2.rds")
  568. ```

Clonal_Regional.Rmd at commit 616e26b, under MIT · at the source

Overview

Authors: Ziwei Liu1, Krishnanand Padmanabhan1, Jingyan He2, Katrin Hector2, Bettina Semsch2,3, Jia Sun3, Viktoria Knoflach1, Sarantis Giatrellis2, Johan Lorentz2, Khachatur Dallakyan1, Christian Göritz2, Emma Rachel Andersson2, Ulrika Marklund1
  1. Department of Medical Biochemistry and Biophysics, Unit of Molecular Neurobiology, Karolinska Institutet SE-171 77, Stockholm, Sweden
  2. Department of Cell and Molecular Biology, Karolinska Institutet SE-171 77, Stockholm, Sweden
  3. Comparative Medicine, Karolinska Institutet SE-171 77, Stockholm, Sweden
Institutions: Karolinska Institutet (Sweden)
Dates: received 29 April 2026; accepted 11 August 2026; published online 9 September 2026; in print 15 September 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1073/pnas.2614077123 · PMID 42715084 · PMCID PMC13578780 · OpenAlex W7212009148
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: mouse (organism)
Keywords: lineage tracing, in utero transduction, enteric nervous system, gut patterning, neural crest development
MeSH: Cell Lineage*, Gastrointestinal Tract*, Animals, Cell Differentiation, Enteric Nervous System, Female, Gene Expression Regulation, Developmental, Mice, Neural Crest (* major topic)
Topic: Single-cell and spatial transcriptomics (Molecular Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: Knut och Alice Wallenbergs Stiftelse (kawforskning) (2020.0109); Vetenskapsrådet (VR) (2020-01129, 2022-01570, 2024-03113, 2021-03537, 2017-01054); Hjärnfonden (Brain Foundation) (FO2025-0169, FO2023-0130, FO2025-0271); European Research Council (101045026, 101171156)
Citations: not cited yet (Europe PMC); 40 references in the paper

Abstract

How diverse cell lineages emerge and are genetically regulated during organogenesis are central questions in understanding the developmental origins of disease. However, the mouse gut, including its intrinsic enteric nervous system (ENS) derived from migratory neural crest, has remained difficult to experimentally target. Here, we introduce an in utero lentiviral nano-injection strategy that enables early and efficient access to progenitor cells of all major cell types within the developing gut as well as gut-innervating ganglia. Leveraging this approach in combination with DNA barcoding and single-cell transcriptomics, we resolve clonal relationships in all gut lineages, including epithelial, neural, immune, and mesenchymal cell types. Clonal coupling between distinct subsets of fibroblasts and either pericytes, mesothelial cells, or interstitial cells of Cajal, suggested a developmental logic whereby the mesenchymal compartment arises from a set of fate-biased progenitors. Yet, mesenchymal regionalization along the anterior–posterior axis establishes early, whereas the ENS displays broad clonal dispersion across gut regions and acquires subsequent regional identities. We further adapted the platform for temporally controlled cell-type specific gene manipulation and, as a proof-of-principle, show that induced expression of the proneural factor Ascl1 biases ENS progenitor cells toward neuronal differentiation. Together, this work provides insights into refined spatiotemporal lineage relationships within a multigerm-layer organ and establishes a broadly applicable in vivo framework for probing gene function during gastrointestinal and neural crest development.

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

UMarklundLab/Inutero_clonaltracing_E16Gut

License: MIT
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: 616e26bff0494c376446fa645603249409f96ec2, 29 August 2026
Languages: R (17), Python (2)
Size: 84 files, 19 scripts
Software Heritage: not archived
Found in: the references
Holds: README, license file, environment (renv.lock), 8 notebooks
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: ggplot2 (15 files), Seurat (14 files), patchwork (13 files), tidyverse (13 files), circlize (7 files), ComplexHeatmap (7 files), cowplot (5 files), reticulate (4 files), NumPy (2 files), pandas (2 files), clusterProfiler (1 file), ggpubr (1 file), Scanpy (1 file), SciPy (1 file)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
21 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;
  • 19 scripts, each with its path and the digest of its content;
  • 8 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, Materials, and Software Availability

Raw and processed single-cell RNA-sequencing data are available at Gene Expression Omnibus (GEO) database under the identifier GSE325733 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE325733) (37). scRNA-seq data used in Fig. 1 can be found at ArrayExpress with the accession number E-MTAB-14817 (https://www.ebi.ac.uk/biostudies/arrayexpress/studies/E-MTAB-14817) (38). Code used to analyze data is summarized at https://github.com/UMarklundLab/Inutero_clonaltracing_E16Gut (39). Summary statistics of generated scRNA-seq dataset can be found in Dataset S2 (http://www.pnas.org/lookup/doi/10.1073/pnas.2614077123#supplementary-materials). Differentially expressed genes for clusters presented in the study are available in Datasets S3 (http://www.pnas.org/lookup/doi/10.1073/pnas.2614077123#supplementary-materials)–S8 (http://www.pnas.org/lookup/doi/10.1073/pnas.2614077123#supplementary-materials). We adapted in situ hybridization images from the database Gene Paint (40) for SI Appendix, Fig. S4 I–G (http://www.pnas.org/lookup/doi/10.1073/pnas.2614077123#supplementary-materials) and the spatial transcriptomic reproductions in SI Appendix, Fig. S1E (http://www.pnas.org/lookup/doi/10.1073/pnas.2614077123#supplementary-materials) are adapted from the Mouse Organogenesis Spatiotemporal Transcriptomic Atlas (MOSTA) interactive viewer at https://db.cngb.org/stomics/mosta/ (13).

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

Recorded: type, language, journal, volume, issue, pages, dates, 13 authors, 5 keywords, 9 MeSH terms, 4 funders, 37 references.

Cite

This paper

Liu, Z., Padmanabhan, K., He, J., Hector, K., Semsch, B., Sun, J., Knoflach, V., Giatrellis, S., Lorentz, J., Dallakyan, K., Göritz, C., Andersson, E. R., & Marklund, U. (2026). Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction. Proceedings of the National Academy of Sciences of the United States of America, 123(37), e2614077123. https://doi.org/10.1073/pnas.2614077123

BibTeX

@article{liu2026resolving,
author = {Liu, Ziwei and Padmanabhan, Krishnanand and He, Jingyan and Hector, Katrin and Semsch, Bettina and Sun, Jia and Knoflach, Viktoria and Giatrellis, Sarantis and Lorentz, Johan and Dallakyan, Khachatur and Göritz, Christian and Andersson, Emma Rachel and Marklund, Ulrika},
title = {{Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction}},
journal = {Proceedings of the National Academy of Sciences of the United States of America},
year = {2026},
month = sep,
volume = {123},
number = {37},
pages = {e2614077123},
publisher = {National Academy of Sciences},
issn = {0027-8424},
doi = {10.1073/pnas.2614077123},
url = {https://doi.org/10.1073/pnas.2614077123},
pmid = {42715084},
pmcid = {PMC13578780}
}

RIS

TY - JOUR
AU - Liu, Ziwei
AU - Padmanabhan, Krishnanand
AU - He, Jingyan
AU - Hector, Katrin
AU - Semsch, Bettina
AU - Sun, Jia
AU - Knoflach, Viktoria
AU - Giatrellis, Sarantis
AU - Lorentz, Johan
AU - Dallakyan, Khachatur
AU - Göritz, Christian
AU - Andersson, Emma Rachel
AU - Marklund, Ulrika
TI - Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction
T2 - Proceedings of the National Academy of Sciences of the United States of America
J2 - Proc Natl Acad Sci U S A
PY - 2026
DA - 2026/09/09
VL - 123
IS - 37
SP - e2614077123
SN - 0027-8424
PB - National Academy of Sciences
DO - 10.1073/pnas.2614077123
UR - https://doi.org/10.1073/pnas.2614077123
LA - en
ER -

CSL-JSON

{
"id": "10.1073/pnas.2614077123",
"type": "article-journal",
"title": "Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction",
"container-title": "Proceedings of the National Academy of Sciences of the United States of America",
"author": [
{
"family": "Liu",
"given": "Ziwei"
},
{
"family": "Padmanabhan",
"given": "Krishnanand"
},
{
"family": "He",
"given": "Jingyan"
},
{
"family": "Hector",
"given": "Katrin"
},
{
"family": "Semsch",
"given": "Bettina"
},
{
"family": "Sun",
"given": "Jia"
},
{
"family": "Knoflach",
"given": "Viktoria"
},
{
"family": "Giatrellis",
"given": "Sarantis"
},
{
"family": "Lorentz",
"given": "Johan"
},
{
"family": "Dallakyan",
"given": "Khachatur"
},
{
"family": "Göritz",
"given": "Christian"
},
{
"family": "Andersson",
"given": "Emma Rachel"
},
{
"family": "Marklund",
"given": "Ulrika"
}
],
"container-title-short": "Proc Natl Acad Sci U S A",
"volume": "123",
"issue": "37",
"page": "e2614077123",
"DOI": "10.1073/pnas.2614077123",
"PMID": "42715084",
"PMCID": "PMC13578780",
"ISSN": "0027-8424",
"publisher": "National Academy of Sciences",
"URL": "https://doi.org/10.1073/pnas.2614077123",
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
9
]
]
}
}

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.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, circlize, clusterProfiler, 11 other tools, mouse
[2] 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, circlize, clusterProfiler, 10 other tools, 1 reference
[3] doi:10.1002/imt2.70163 [code]
Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.
Journal: iMeta
In common: circlize, clusterProfiler, Scanpy, 10 other tools, mouse, 1 reference
[4] doi:10.1038/s42003-026-10034-0 [code]
Region- and cell type-specific changes in gene expression in the cerebellum after classical fear conditioning.
Journal: Communications biology
In common: reticulate, circlize, clusterProfiler, 10 other tools, mouse
[5] doi:10.1038/s41586-026-10629-x [code]
Whole-genome duplication shaped cell-type evolution in the vertebrate brain.
Journal: Nature
In common: reticulate, circlize, clusterProfiler, 10 other tools, mouse
[6] 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, 10 other tools, mouse
[7] doi:10.1126/sciadv.aeg3223 [code]
The extreme diversity of retinal amacrine cells has deep evolutionary roots.
Journal: Science advances
In common: reticulate, circlize, clusterProfiler, 10 other tools
[8] 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, circlize, clusterProfiler, 9 other tools
[9] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: circlize, clusterProfiler, Scanpy, 10 other tools
[10] doi:10.1261/rna.080954.126 [code]
Neuronal subtype-specific ribosomal protein mRNA expression.
Journal: RNA (New York, N.Y.)
In common: reticulate, circlize, Scanpy, 9 other tools, mouse

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.