Resolving cell lineages and gene functions in the developing mouse gastrointestinal tract using in utero transduction.
The 8 matches
- [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] § 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] § 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] § 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] § 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] § 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] § 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] § 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
- ---
- title: "Figure 5 — Regional and integrated clonal analysis"
- output: html_document
- ---
- ```{r setup, include=FALSE}
- knitr::opts_chunk$set(echo = TRUE)
- knitr::opts_knit$set(root.dir = normalizePath(".."))
- library(dplyr)
- library(Seurat)
- options(Seurat.object.assay.version = "v5")
- library(ggplot2)
- library(stringr)
- library(patchwork)
- library(scales)
- library(circlize)
- library(UpSetR)
- library(scCustomize)
- library(ggalluvial)
- library(tibble)
- library(tidyr)
- library(ComplexHeatmap)
- options(future.globals.maxSize = 100 * 1024^3)
- ```
- ```{r}
- fig_dir_regions <- "Figures/Fig5/"
- save_fig_regions <- function(name, width = 7, height = 5, device = grDevices::pdf, bg = "white", dpi = 300) {
- # Ensure directory exists
- if (!dir.exists(fig_dir_regions)) dir.create(fig_dir_regions, recursive = TRUE)
- ggsave(
- filename = file.path(fig_dir_regions, name),
- width = width,
- height = height,
- bg = bg,
- dpi = dpi,
- device = device
- )
- }
- ```
- ```{r}
- # Annotated Seurat objects (cell types + clonal metadata; see Preprocessing and Clonal notebooks)
- E16_barcodes <- readRDS("Data/E16_barcodes_E1.rds")
- E16_barcodes_E2 <- readRDS("Data/E16_barcodes_E2.rds")
- E16_E2_ENS <- readRDS("Data/E16_barcodes_ENS_E2.rds")
- ```
- ```{r}
- distinct11 <- c("#377EB8", "#F5B375", "#A3CB38", "#C73681", "#E41A1C", "#84817b", "#A65628", "#FF7F00", "#FFD92F", "#984EA3", "#4DAF4A")
- cell_types <- sort(unique(E16_barcodes$major_cell_type_2))
- color_map <- setNames(
- rep(distinct11, length.out = length(cell_types)),
- cell_types
- )
- clone_cols <- c(
- "No CloneID" = "grey70",
- "Singleton" = "grey70",
- "Cross-germ clones" = "grey70",
- "Region not shared at all" = "#56B4E9",
- "Region shared by stomach, ileum" = "#ff7f00",
- # E2-only categories
- "Region shared by stomach, jej_ileum" = "#006D2C",
- "Region shared by stomach, colon" = "#006D2C",
- "Region shared by jej_ileum, colon" = "#006D2C",
- "Region shared by stomach, jej_ile, colon" = "#D81B60"
- )
- ```
- ```{r}
- # Find regionally dispersed clones for E7.5 transduction
- clone_metadata <- [email hidden] %>%
- filter(clones_per_cell_4 == "Multicellular")
- regional_clone_summary <- clone_metadata %>%
- dplyr::select(clone_nr, sample, clone_type, assigned_cell_type) %>%
- group_by(clone_nr) %>%
- summarise(
- regions = list(unique(sample)),
- n_regions = n_distinct(sample),
- clone_types = list(unique(clone_type)),
- cell_types = list(unique(assigned_cell_type)),
- n_cells = n(),
- .groups = "drop"
- )
- # Identify clones found in multiple regions
- dispersed_clones <- regional_clone_summary %>%
- filter(n_regions > 1) # 21 clones
- summary_row <- dispersed_clones %>%
- summarise(
- clone_nr = paste0("TOTAL(", length(clone_nr), " clones)"),
- regions = list(unique(unlist(regions))),
- n_regions = 2,
- clone_types = list(unique(unlist(clone_types))),
- cell_types = list(unique(unlist(cell_types))),
- n_cells = sum(n_cells)
- )
- dispersed_clones <- dispersed_clones %>%
- mutate(clone_nr = as.character(clone_nr)) %>%
- unique()
- dispersed_clones_with_total <- bind_rows(dispersed_clones, summary_row)
- dispersed_clones_df <- dispersed_clones_with_total %>%
- mutate(across(where(is.list), ~ sapply(., toString)))
- write.csv(dispersed_clones_df, "Data/E1_regionaldispersed_clones.csv", row.names = FALSE)
- ```
- ```{r}
- # Prepare for the UpSet plot
- clone_counts <- as.data.frame(table(clone_metadata$clone_nr))
- colnames(clone_counts) <- c("clone_nr", "cell_count")
- shared_clone_metadata <- clone_metadata %>%
- filter(clone_nr %in% dispersed_clones$clone_nr)
- clone_analysis <- shared_clone_metadata %>%
- dplyr::select(clone_nr, major_cell_type_2)
- data_wide <- as.data.frame.matrix(table(clone_analysis$clone_nr, clone_analysis$major_cell_type_2))
- celltype <- colnames(data_wide)
- set_sizes <- colSums(data_wide)
- # Compute total number of cells per clone (sum across all cell types)
- clone_sizes <- rowSums(data_wide)
- # Convert to binary for UpSet intersections
- binary_matrix <- data_wide %>%
- mutate(across(everything(), ~ ifelse(. > 0, 1, 0)))
- binary_matrix$Clone_Size <- clone_sizes
- sets_vec <- colnames(binary_matrix)[-ncol(binary_matrix)]
- ```
- ```{r,fig.height = 6 , fig.width = 6, fig.align = "center"}
- grid::grid.newpage()
- upset(
- binary_matrix[, -ncol(binary_matrix)],
- sets = sets_vec,
- order.by = "freq",
- sets.x.label = "Total multicellular clones",
- point.size = 5,
- line.size = 2,
- mb.ratio = c(0.6, 0.4),
- text.scale = c(2.5, 2.0, 2.0, 1.8, 2.2, 2.2),
- nintersects = 30,
- mainbar.y.max = 16
- ) # Fig 5A
- dev.off()
- ```
- ```{r}
- clone_region_map <- [email hidden] %>%
- group_by(clone_nr) %>%
- summarise(
- regions = list(sort(unique(sample))),
- clone_type = unique(clone_type)[1],
- .groups = "drop"
- ) %>%
- mutate(
- shared_clone_category = case_when(
- clone_type == "No CloneID" ~ "No CloneID",
- clone_type == "Singleton" ~ "Singleton",
- TRUE ~ map_chr(regions, function(r) {
- if (length(r) == 1) {
- "Region not shared at all"
- } else if (setequal(r, c("E16_stomach", "E16_ileum"))) {
- "Region shared by stomach, ileum"
- } else {
- paste("Other combination:", paste(r, collapse = ", "))
- }
- })
- )
- )
- [email hidden]$shared_clone_category <-
- clone_region_map$shared_clone_category[
- match([email hidden]$clone_nr, clone_region_map$clone_nr)
- ]
- [email hidden]$shared_clone_category <- factor(
- [email hidden]$shared_clone_category,
- levels = c(
- "No CloneID",
- "Singleton",
- "Region not shared at all",
- "Region shared by stomach, ileum"
- )
- )
- [email hidden]$shared_clone_category <- factor(
- [email hidden]$shared_clone_category,
- levels = names(clone_cols)
- )
- 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")
- save_fig_regions("umap_E1_regional_sharedclones.pdf", width = 9, height = 6) # Fig 5B
- ```
- ```{r,fig.height = 6, fig.width = 8, fig.align = "center"}
- clone_numbers_dispersed <- dispersed_clones$clone_nr %>% unique()
- df <- [email hidden] %>%
- filter(clone_nr %in% clone_numbers_dispersed) %>%
- select(sample, major_cell_type_2, clone_nr) %>%
- mutate(
- sample = factor(sample, levels = c("E16_stomach", "E16_ileum")),
- major_cell_type = as.factor(major_cell_type_2)
- )
- ggplot(
- df,
- aes(
- axis1 = sample,
- axis2 = major_cell_type,
- axis3 = clone_nr,
- y = 1,
- fill = major_cell_type
- )
- ) +
- geom_alluvium(aes(fill = major_cell_type), width = 0.1, alpha = 0.8) +
- geom_stratum(width = 0.1, fill = "grey90", color = "black") +
- geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 5) +
- scale_x_discrete(limits = c("Sample", "Cell type","Clone ID"), expand = c(0.1, 0.1)) +
- scale_fill_manual(values = color_map) +
- theme_void() +
- theme(legend.position = "none") # Fig 5C
- save_fig_regions("alluvialdiagram_E1_regional.pdf", width = 8, height = 6)
- ```
- ```{r}
- # Find regionally dispersed clones for early E7.5 transduction ( restricted to single-germ-layer clones)
- cross_germ_clone_ids <- [email hidden] %>%
- filter(clones_per_cell_4 == "Multicellular") %>%
- group_by(clone_nr) %>%
- summarise(
- n_types = n_distinct(major_cell_type_3),
- .groups = "drop"
- ) %>%
- filter(n_types > 1) %>%
- pull(clone_nr)
- cross_germ_clone_ids
- ```
- ```{r,fig.height = 6, fig.width = 8, fig.align = "center"}
- clone_cols <- c(
- "No CloneID" = "grey70",
- "Singleton" = "grey70",
- "Cross-germ clones" = "grey70",
- "Region not shared at all" = "#56B4E9",
- "Region shared by stomach, jej_ileum" = "#006D2C",
- "Region shared by stomach, colon" = "#006D2C",
- "Region shared by jej_ileum, colon" = "#006D2C",
- "Region shared by stomach, jej_ile, colon" = "#D81B60"
- )
- clone_region_map_E2 <- [email hidden] %>%
- group_by(clone_nr) %>%
- summarise(
- regions = list(sort(unique(sample))),
- clone_type = dplyr::first(as.character(clone_type)),
- .groups = "drop"
- ) %>%
- mutate(
- shared_clone_category = case_when(
- clone_type == "No CloneID" ~ "No CloneID",
- clone_type == "Singleton" ~ "Singleton",
- TRUE ~ map_chr(regions, function(r) {
- if (length(r) == 1) {
- "Region not shared at all"
- } else if (all(c("E16_stomach", "E16_jej_ileum") %in% r) && length(r) == 2) {
- "Region shared by stomach, jej_ileum"
- } else if (all(c("E16_stomach", "E16_colon") %in% r) && length(r) == 2) {
- "Region shared by stomach, colon"
- } else if (all(c("E16_jej_ileum", "E16_colon") %in% r) && length(r) == 2) {
- "Region shared by jej_ileum, colon"
- } else if (all(c("E16_stomach", "E16_jej_ileum", "E16_colon") %in% r) && length(r) == 3) {
- "Region shared by stomach, jej_ile, colon"
- } else {
- stop(paste("Unexpected region combination:", paste(r, collapse = ", ")))
- }
- })
- ),
- shared_clone_category = if_else(
- clone_nr %in% cross_germ_clone_ids,
- "Cross-germ clones",
- shared_clone_category
- )
- )
- [email hidden]$shared_clone_category <-
- clone_region_map_E2$shared_clone_category[
- match([email hidden]$clone_nr, clone_region_map_E2$clone_nr)
- ]
- [email hidden]$shared_clone_category <- factor(
- [email hidden]$shared_clone_category,
- levels = c(
- "No CloneID",
- "Singleton",
- "Cross-germ clones",
- "Region not shared at all",
- "Region shared by stomach, jej_ileum",
- "Region shared by stomach, colon",
- "Region shared by jej_ileum, colon",
- "Region shared by stomach, jej_ile, colon"
- )
- )
- 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")
- save_fig_regions("umap_E2_regional_sharedclones.pdf", width = 9, height = 6) # Fig 5E
- ```
- ```{r}
- # Prepare for the UpSet plot for E2 (non-epiblast clones only)
- distinct_clones_E2 <- clone_metadata_E2%>%
- group_by(clone_nr) %>%
- filter(n_distinct(major_cell_type_3) == 1) %>%
- ungroup() %>%
- distinct(clone_nr) %>%
- pull(clone_nr)# 851 CloneIDs
- shared_clone_metadata_E2 <- clone_metadata_E2 %>%
- filter(clone_nr %in% distinct_clones_E2)
- regional_clone_summary_E2 <- shared_clone_metadata_E2 %>%
- dplyr::select(clone_nr, sample, clone_type, assigned_cell_type) %>%
- group_by(clone_nr) %>%
- summarise(
- regions = list(unique(sample)),
- n_regions = n_distinct(sample),
- clone_types = list(unique(clone_type)),
- cell_types = list(unique(assigned_cell_type)),
- n_cells = n(),
- .groups = "drop"
- )
- # Identify clones found in multiple regions
- dispersed_clones_E2 <- regional_clone_summary_E2 %>%
- filter(n_regions > 1) # 119 clones
- summary_row_E2 <- dispersed_clones_E2 %>%
- summarise(
- clone_nr = paste0("TOTAL(", length(clone_nr), " clones)"),
- regions = list(unique(unlist(regions))),
- n_regions = 3,
- clone_types = list(unique(unlist(clone_types))),
- cell_types = list(unique(unlist(cell_types))),
- n_cells = sum(n_cells)
- )
- dispersed_clones_E2 <- dispersed_clones_E2 %>%
- mutate(clone_nr = as.character(clone_nr)) %>%
- unique()
- dispersed_clones_with_total_E2 <- bind_rows(dispersed_clones_E2, summary_row_E2)
- dispersed_clones_df_E2 <- dispersed_clones_with_total_E2 %>%
- mutate(across(where(is.list), ~ sapply(., toString)))
- write.csv(dispersed_clones_df_E2, "Data/E2_regionaldispersed_clones_nonepiblast.csv", row.names = FALSE)
- ```
- ```{r}
- # Prepare for the UpSet plot for E2 (non-epiblast)
- clone_analysis_E2 <- shared_clone_metadata_E2 %>%
- dplyr::select(clone_nr, major_cell_type_2)
- data_wide_E2 <- as.data.frame.matrix(table(clone_analysis_E2$clone_nr, clone_analysis_E2$major_cell_type_2))
- celltype_E2 <- colnames(data_wide_E2)
- set_sizes_E2 <- colSums(data_wide_E2)
- # Compute total number of cells per clone (sum across all cell types)
- clone_sizes_E2 <- rowSums(data_wide_E2)
- # Convert to binary for UpSet intersections
- binary_matrix_E2 <- data_wide_E2 %>%
- mutate(across(everything(), ~ ifelse(. > 0, 1, 0)))
- binary_matrix_E2$Clone_Size <- clone_sizes_E2
- sets_vec_E2 <- colnames(binary_matrix_E2)[-ncol(binary_matrix_E2)]
- ```
- ```{r,fig.height = 5, fig.width = 6, fig.align = "center"}
- pdf(file.path(fig_dir_regions, "Uplot_E2_regional_nonepiblast.pdf"), width = 6, height = 5, onefile = FALSE)
- grid::grid.newpage()
- upset(
- binary_matrix_E2[, -ncol(binary_matrix_E2)],
- sets = sets_vec_E2,
- order.by = "freq",
- sets.x.label = "Total multicellular clones",
- point.size = 5,
- line.size = 2,
- mb.ratio = c(0.6, 0.4),
- text.scale = c(2.5, 2.0, 2.0, 1.8, 2.2, 2.2),
- nintersects = 30,
- mainbar.y.max = 120
- ) # Fig 5D
- dev.off()
- ```
- ```{r}
- heatmap_matrix <- shared_clone_metadata_E2 %>%
- distinct(clone_nr, sample) %>%
- mutate(val = 1) %>%
- pivot_wider(names_from = sample, values_from = val, values_fill = 0) %>%
- column_to_rownames("clone_nr") %>%
- as.matrix()
- # Prepare the Row Annotation (Cell Type)
- row_data <- shared_clone_metadata_E2 %>%
- distinct(clone_nr, major_cell_type_2) %>%
- group_by(clone_nr) %>%
- summarise(type = paste(unique(major_cell_type_2), collapse = "/")) %>%
- column_to_rownames("clone_nr")
- row_data <- row_data[rownames(heatmap_matrix), , drop = FALSE]
- celltype_cols <- c(
- "Endothelial" = "#A65628",
- "ENS" = "#984EA3",
- "Immune" = "#4DAF4A",
- "ICC/Fibroblast" = "yellow",
- "Endothelial/Fibroblast" = "#377EB8",
- "Immune/Fibroblast" = "red"
- )
- ra = rowAnnotation(
- CellType = row_data$type,
- col = list(CellType = celltype_cols)
- )
- # Draw the Heatmap
- pdf(file.path(fig_dir_regions, "E2_nonepiblast_clones_3regions.pdf"), width = 6, height = 5, onefile = FALSE)
- Heatmap(heatmap_matrix,
- name = "Presence",
- col = c("white", "navy"),
- right_annotation = ra,
- show_row_names = FALSE,
- cluster_columns = FALSE,
- row_title = "Clones",
- column_title = "Regional Distribution & Cell Identity",
- border = TRUE)
- dev.off() # Fig 5F
- ```
- ```{r,fig.height = 6, fig.width = 6, fig.align = "center"}
- clone_sharing_logic <- [email hidden] %>%
- filter(clones_per_cell_4 == "Multicellular") %>%
- group_by(clone_nr) %>%
- filter(n_distinct(major_cell_type_3) == 1) %>%
- distinct(clone_nr, sample) %>%
- group_by(clone_nr) %>%
- summarise(intersection_type = paste(sort(sample), collapse = " & "), .groups = "drop")
- sharing_map <- setNames(clone_sharing_logic$intersection_type, clone_sharing_logic$clone_nr)
- cells_meta <- [email hidden]
- cell_upset_values <- sharing_map[as.character(cells_meta$clone_nr)]
- names(cell_upset_values) <- colnames(E16_E2_ENS)
- E16_E2_ENS$upset_group <- cell_upset_values
- E16_E2_ENS$migration_type <- case_when(
- grepl("stomach", E16_E2_ENS$upset_group) & grepl("colon", E16_E2_ENS$upset_group) ~ "Stomach-Colon Migrant",
- grepl("&", E16_E2_ENS$upset_group) ~ "Other Shared Clone",
- TRUE ~ "Local Clone"
- )
- DimPlot(E16_E2_ENS,
- group.by = "migration_type",
- cols = c("Stomach-Colon Migrant" = "#E31A1C",
- "Other Shared Clone" = "#1F78B4",
- "Local Clone" = "#A6CEE3",
- "Unlabeled" = "grey90"),
- order = T,
- reduction = "umap.harmony") +
- labs(title = "ENS: Evidence of Long-Distance Migration",
- subtitle = "Red cells share a Clone ID between Stomach and Colon") #Fig 5H
- save_fig_regions("ENS_longdistancemigration_nonepiblast.pdf",width = 6, height = 6)
- ```
- ```{r,fig.height = 6, fig.width = 7, fig.align = "center"}
- E16_colon_barcodes_E2 <- subset(E16_E2_ENS, subset = epiblast_label == "non-epiblast" & sample == "E16_colon")
- VlnPlot(E2_colon_subset,
- features = c("Pou3f3","Pantr1"),
- group.by = "migration_type",
- pt.size = 0.5, # Shows individual cell jitter
- cols = c("Stomach-Colon Migrant" = "#E31A1C",
- "Other Shared Clone" = "#1F78B4",
- "Local Clone" = "#A6CEE3",
- "Unlabeled" = "grey90")) +
- geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
- labs(title = "Pou3f3 Expression in Colonic ENS by Clonal Origin",
- subtitle = "Stomach-derived migrants acquire colonic markers") +
- theme(legend.position = "none") # Fig 5I
- save_fig_regions("ENS_Vlnplot_nonepiblast.pdf",width = 7, height = 6)
- ```
- ```{r}
- # 1. Prepare metadata with relabeled ENS subtypes
- ens_meta_shared <- [email hidden] %>%
- filter(!is.na(clone_nr)) %>%
- mutate(
- refined_type = case_when(
- grepl("Progenitor", assigned_cell_type, ignore.case = TRUE) ~ "ENS Progenitors",
- grepl("Branch B", assigned_cell_type, ignore.case = TRUE) ~ "ENS Branch B",
- assigned_cell_type %in% c("ENS Branch A", "ENC12") ~ "ENS Branch A",
- TRUE ~ assigned_cell_type
- )
- ) %>%
- group_by(clone_nr) %>%
- #filter(n_distinct(refined_type) > 1, n_distinct(sample) > 1) %>% # filtering the more than 1 sample more than 1 cell type
- ungroup()
- # 2. Clone annotation data
- ens_shared_metadata <- ens_meta_shared %>%
- group_by(clone_nr) %>%
- summarise(
- samples = paste(
- unique(sample[order(match(sample, c("E16_stomach", "E16_jej_ileum", "E16_colon")))]),
- collapse = " / "
- ),
- .groups = "drop"
- )
- # 3. Build clone x subtype proportion matrix
- heatmap_matrix_ens <- ens_meta_shared %>%
- group_by(clone_nr, refined_type) %>%
- tally(name = "cell_count") %>%
- group_by(clone_nr) %>%
- mutate(prop = cell_count / sum(cell_count)) %>%
- ungroup() %>%
- select(clone_nr, refined_type, prop) %>%
- pivot_wider(
- id_cols = clone_nr,
- names_from = refined_type,
- values_from = prop,
- values_fill = 0
- ) %>%
- column_to_rownames("clone_nr") %>%
- as.matrix()
- # 4. Align row annotation
- row_data_ens <- ens_shared_metadata %>%
- filter(clone_nr %in% rownames(heatmap_matrix_ens)) %>%
- column_to_rownames("clone_nr")
- row_data_ens <- row_data_ens[rownames(heatmap_matrix_ens), , drop = FALSE]
- # 5. Region annotation colors
- all_unique_combos <- unique(row_data_ens$samples)
- ens_colors <- setNames(scales::hue_pal()(length(all_unique_combos)), all_unique_combos)
- ra_ens <- rowAnnotation(
- region = row_data_ens$samples,
- col = list(region = ens_colors),
- show_annotation_name = TRUE,
- annotation_legend_param = list(
- region = list(
- title = "Regions",
- title_gp = gpar(fontsize = 10, fontface = "bold")
- )
- )
- )
- # 6. Order subtype columns
- subtype_order <- c(
- "ENS Progenitors",
- "ENS Neuroblast",
- "ENS Branch A",
- "ENS Branch B",
- "SCP"
- )
- existing_cols <- intersect(subtype_order, colnames(heatmap_matrix_ens))
- heatmap_matrix_ens <- heatmap_matrix_ens[, existing_cols, drop = FALSE]
- # 7. Order region groups
- region_order <- c(
- "E16_stomach / E16_jej_ileum / E16_colon",
- "E16_stomach / E16_colon",
- "E16_stomach / E16_jej_ileum",
- "E16_jej_ileum / E16_colon",
- "E16_stomach",
- "E16_jej_ileum",
- "E16_colon"
- )
- region_colors <- c(
- "E16_stomach / E16_jej_ileum / E16_colon" = "#E41A1C",
- "E16_stomach / E16_colon" = "#FF69B4",
- "E16_stomach / E16_jej_ileum" = "#FF7F00",
- "E16_jej_ileum / E16_colon" = "#41AB5D",
- "E16_stomach" = "#8C6D31",
- "E16_jej_ileum" ="#FDBF6F",
- "E16_colon" = "#CAB2D6"
- )
- row_data_ens$samples <- factor(row_data_ens$samples, levels = region_order)
- # reorder rows to match split order
- ord <- order(row_data_ens$samples)
- heatmap_matrix_ens <- heatmap_matrix_ens[ord, , drop = FALSE]
- row_data_ens <- row_data_ens[ord, , drop = FALSE]
- # rebuild annotation AFTER ordering rows
- ra_ens <- rowAnnotation(
- region = row_data_ens$samples,
- col = list(region = region_colors),
- show_annotation_name = TRUE,
- annotation_legend_param = list(
- region = list(
- title = "Regions",
- title_gp = gpar(fontsize = 10, fontface = "bold")
- )
- )
- )
- pdf(file.path(fig_dir_regions, "ENS_E2_subtype_sharing_heatmap_subtype_allclones.pdf"), width = 6, height = 9)
- Heatmap(
- heatmap_matrix_ens,
- name = "Proportion",
- right_annotation = ra_ens,
- cluster_columns = FALSE,
- cluster_rows = TRUE,
- cluster_row_slices = FALSE,
- row_split = row_data_ens$samples,
- row_gap = unit(1.5, "mm"),
- show_row_names = FALSE,
- border = TRUE,
- column_names_side = "top",
- column_title = "Long-Distance ENS Migrants: Regional & Subtype Composition",
- row_title = "Shared CloneIDs"
- ) #Fig 5G
- dev.off()
- ```
- ```{r}
- saveRDS(object = E16_barcodes, "Data/E16_barcodes_E1.rds")
- saveRDS(object = E16_barcodes_E2, "Data/E16_barcodes_E2.rds")
- ```
Clonal_Regional.Rmd at commit 616e26b, under MIT · at the source
Overview
- Department of Medical Biochemistry and Biophysics, Unit of Molecular Neurobiology, Karolinska Institutet SE-171 77, Stockholm, Sweden
- Department of Cell and Molecular Biology, Karolinska Institutet SE-171 77, Stockholm, Sweden
- Comparative Medicine, Karolinska Institutet SE-171 77, Stockholm, Sweden
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
616e26bff0494c376446fa645603249409f96ec2, 29 August 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
21 files
- Automatic_annotation/
SCSA.py , Python, 1,603 lines - Automatic_annotation/
scanpy_findallmarkers.py , Python, 87 lines - Automatic_annotation/
seurat_findallmarkers.R , R, 52 lines - Clonal_analysis/
Barcode_E1_Clones.Rmd , R, 1,244 lines - Clonal_analysis/
Barcode_E2_Clones.Rmd , R, 1,137 lines - Clonal_analysis/
Barcode_E3_Clones.Rmd , R, 1,903 lines - Clonal_analysis/
Clonal_Regional.Rmd , R, 645 lines, 3 matches - Clonal_analysis/
E1E2_Comparison.Rmd , R, 557 lines - Clonal_analysis/
Transcriptome_Regional.R , R, 392 linesmd - Helpers/
SoupXDoubletfinder.R , R, 302 lines - Helpers/
helpers.R , R, 380 lines - Preprocessing/
Assessing_ambinetRNA.R , R, 56 lines - Preprocessing/
Expt1_Preprocessing.R , R, 234 lines - Preprocessing/
Expt1_Processing.Rmd , R, 747 lines, 2 matches - Preprocessing/
Expt2_Preprocessing.R , R, 193 lines, 1 match - Preprocessing/
Expt2_Processing.Rmd , R, 450 lines, 1 match - Preprocessing/
Expt3_Preprocessing.R , R, 375 lines, 1 match - Preprocessing/
IntegratingE1E2E3.R , R, 124 lines - renv/
activate.R , R, 1,403 lines - LICENSE, License, 21 lines
- README.md, Text, 387 lines
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
- arrayexpress:E-MTAB-1481
7 , at ArrayExpress; found in “Data, Materials, and Software Availability” - geo:GSE325733, at NCBI GEO; found in “Data, Materials, and Software Availability”
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://
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://
BibTeX
@article{liu2026resolvin
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/
url = {https://
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/
VL - 123
IS - 37
SP - e2614077123
SN - 0027-8424
PB - National Academy of Sciences
DO - 10.1073/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1073/
"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":
"volume": "123",
"issue": "37",
"page": "e2614077123",
"DOI": "10.1073/
"PMID": "42715084",
"PMCID": "PMC13578780",
"ISSN": "0027-8424",
"publisher": "National Academy of Sciences",
"URL": "https://
"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 AmericaIn 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 blueIn 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: iMetaIn 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 biologyIn 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: NatureIn 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 researchIn 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 advancesIn 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 sciencesIn 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. MedicineIn 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 19 scripts, and 8 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:f06cc5c340564b4a…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
