Skip to content

Commit d8e0ef9

Browse files
Merge pull request #3 from GaitiLab/dev
Dev
2 parents fc8b0b8 + 04ed843 commit d8e0ef9

File tree

118 files changed

+329051
-11721
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+329051
-11721
lines changed

.gitignore

+10-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ vignettes/*.pdf
4646
._.*
4747
._*
4848
.DS_Store
49-
jobs/pipeline_runs/*/.nextflow/*
5049

5150
# Python
5251
Python/__pycache__
@@ -60,11 +59,19 @@ slurm_out
6059

6160
output/
6261
data/
63-
misc/
62+
6463

6564
analysis/run_notebooks.R
6665
analysis/run_notebooks.sh
6766
TEST-*
6867
tmp.txt
6968

70-
000_ARCHIVED
69+
**/000_ARCHIVED
70+
.nextflow
71+
preprocessing/scRNAseq/CCI_CellClass_L2_2/gaitilab.config
72+
73+
74+
misc/internal
75+
# TODO remove once supptables finalized
76+
misc/SuppTables
77+
internal_scripts

.lintr

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ linters: linters_with_defaults(
66
indentation_linter(
77
indent = 4L
88
),
9-
commented_code_linter=NULL
9+
commented_code_linter=NULL,
10+
line_length_linter(80L),
11+
pipe_continuation_linter()
1012
)

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
# Overview
22

3-
Repository with code to reproduce analyses and figures in "Glioblastoma cells co-opt epigenetic regulators of normal oligodendrocyte development for brain infiltration"
3+
Repository with code to reproduce analyses and figures in "Neurodevelopmental hijacking of oligodendrocyte lineage programs drives glioblastoma infiltration"
44

55

66
## Abstract
77

8-
Glioblastoma (GBM) is a highly aggressive brain tumor known for its ability to infiltrate and colonize normal brain tissue. Despite the clinical relevance of this behavior, the molecular characteristics of infiltrating GBM cells in the peritumoral zone remain largely unexplored in patients. Here, we show that peritumoral progenitor-like GBM cells overexpress transcriptional programs associated with increased neuronal migration, synaptic activity, and NOTCH signaling. Moreover, they spatially colocalize with neurons and have increased propensity for neuronal crosstalk. These infiltrative cells hijack key transcription factors that typically direct normal oligodendrocyte progenitor cell (OPC) differentiation. We further demonstrate that the epigenetic encoding of these infiltrative cells mirrors that of uncommitted OPCs in the developing human brain, a neurodevelopmental state marked by increased synaptic and migratory capabilities. Our findings provide critical insights into the neurodevelopmental hijacking that drives GBM infiltration in patients, rationalizing further investigation into targeting differentiation potential as a therapeutic strategy.
8+
Glioblastoma (GBM) is a highly aggressive brain tumor known for its ability to infiltrate and colonize normal brain tissue. Despite the clinical relevance of this behavior, the molecular underpinnings of infiltrating GBM cells in the peritumoral zone remain unexplored in patients. Here, we show that peritumoral progenitor-like GBM cells activate transcriptional programs associated with increased invasivity, synaptic activity, and NOTCH signaling. These cells spatially colocalize with neurons and exhibit increased propensity for neuronal crosstalk. The epigenetic encoding of these infiltrative cells mirrors that of uncommitted OPCs in the developing human brain, a neurodevelopmental state marked by increased synaptic and migratory potential. Functional perturbation of a nominated regulatory factor, ZEB1, confirmed its role in maintaining the invasive and uncommitted developmental potential of infiltrative GBM cells. Our findings provide insights into the neurodevelopmental hijacking that drives GBM infiltration in patients, rationalizing further investigation into targeting differentiation potential as a therapeutic strategy.
9+
10+
## Analysis workflow
11+
![Analysis Workflow](misc/Workflow.png)
912

1013
## Contact
1114

air.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[format]
2+
line-width = 80
3+
indent-width = 4
4+
indent-style = "space"
5+
line-ending = "auto"
6+
persistent-line-breaks = true
7+
exclude = [".nextflow/", "slurm_out", "Python"]
8+
default-exclude = true

analysis/Fig1a.R

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# ---- Code to reproduce Figure 1a ---- #
2+
3+
# Unload all previously loaded packages + remove previous environment
4+
rm(list = ls(all = TRUE))
5+
pacman::p_unload()
6+
7+
# Set working directory
8+
GaitiLabUtils::set_wd()
9+
10+
# ---- Setup script ---- #
11+
12+
# Load required packages
13+
pacman::p_load(dplyr, ComplexHeatmap, RColorBrewer, tidyr, circlize)
14+
15+
# Helper function for drawing Heatmaps
16+
cell_border_fun <- function(j, i, x, y, width, height, fill) {
17+
grid.rect(
18+
x = x,
19+
y = y,
20+
width = width,
21+
height = height,
22+
gp = gpar(col = "black", lwd = 1, fill = NA)
23+
)
24+
}
25+
26+
# Required inputs
27+
params <- list(
28+
plot_dir = "output/figures",
29+
input_table_path = "misc/Table S1.xlsx" # can be downloaded online, see publication
30+
)
31+
32+
GaitiLabUtils::create_dir(params$plot_dir)
33+
34+
# ---- Load data & Data wrangling ---- #
35+
mutations_oi <- c("IDH", "CDKN2A", "TP53", "ATRX", "BRAF")
36+
regions_oi <- c("PT", "TE", "TC")
37+
38+
df <- readxl::read_excel(
39+
params$input_table_path,
40+
sheet = "Patient and sample info",
41+
skip = 2
42+
) %>%
43+
tidyr::fill(everything()) %>%
44+
mutate(
45+
IDH = ifelse(
46+
stringr::str_detect(`Molecular alterations`, "IDH wildtype"),
47+
"WT",
48+
"MUT"
49+
),
50+
CDKN2A = ifelse(
51+
stringr::str_detect(
52+
`Molecular alterations`,
53+
"CDKN2A homozygous deletion"
54+
),
55+
"DEL",
56+
"WT"
57+
),
58+
TP53 = ifelse(
59+
stringr::str_detect(
60+
`Molecular alterations`,
61+
"TP53 p\\.C277Wfs\\*27 mutation"
62+
) |
63+
stringr::str_detect(`Molecular alterations`, "P53 Mutated"),
64+
"MUT",
65+
"WT"
66+
),
67+
ATRX = ifelse(
68+
stringr::str_detect(`Molecular alterations`, "ATRX retained"),
69+
"WT",
70+
"MUT"
71+
),
72+
BRAF = ifelse(
73+
stringr::str_detect(`Molecular alterations`, "BRAF mutation"),
74+
"MUT",
75+
"WT"
76+
),
77+
) %>%
78+
group_by_at(c(
79+
"Patient ID",
80+
"Sex",
81+
"IDH",
82+
"CDKN2A",
83+
"TP53",
84+
"ATRX",
85+
"BRAF",
86+
"Region annotation"
87+
)) %>%
88+
summarise(n = n()) %>%
89+
pivot_wider(names_from = "Region annotation", values_from = "n")
90+
91+
col_annot_df <- df %>%
92+
ungroup() %>%
93+
dplyr::select(all_of(c("Sex"))) %>%
94+
pull()
95+
96+
97+
# ---- Create Figure 1a ---- #
98+
99+
col_annot <- HeatmapAnnotation(
100+
Sex = col_annot_df,
101+
which = "col",
102+
col = list(
103+
Sex = c("Male" = "white", "Female" = "black")
104+
),
105+
gp = gpar(col = "black")
106+
)
107+
108+
heatmap_df <- df %>%
109+
ungroup() %>%
110+
dplyr::select(all_of(mutations_oi))
111+
heatmap_df <- as.matrix(heatmap_df)
112+
rownames(heatmap_df) <- df %>% pull(`Patient ID`)
113+
ht1 <- Heatmap(
114+
t(heatmap_df),
115+
name = "Molecular features",
116+
col = c("WT" = "white", "MUT" = "grey", "DEL" = "black"),
117+
cluster_rows = FALSE,
118+
cluster_columns = FALSE,
119+
border = TRUE,
120+
cell_fun = cell_border_fun,
121+
show_column_names = FALSE,
122+
top_annotation = col_annot,
123+
)
124+
125+
heatmap_df2 <- df %>%
126+
ungroup() %>%
127+
dplyr::select(all_of(regions_oi))
128+
heatmap_df2 <- as.matrix(heatmap_df2)
129+
rownames(heatmap_df2) <- df %>% pull(`Patient ID`)
130+
heatmap_df2 <- ifelse(is.na(heatmap_df2), 0, heatmap_df2)
131+
col_scheme <- brewer.pal(5, "Blues")
132+
col_scheme[1] <- "white"
133+
134+
ht2 <- Heatmap(
135+
t(heatmap_df2),
136+
name = "Number of samples from region",
137+
col = circlize::colorRamp2(c(0, 1, 2, 3, 4), col_scheme),
138+
cluster_rows = FALSE,
139+
cluster_columns = FALSE,
140+
border = TRUE,
141+
cell_fun = cell_border_fun
142+
)
143+
144+
heatmap <- ht1 %v% ht2
145+
146+
pdf(
147+
file = file.path(params$plot_dir, "Fig1a.pdf"),
148+
width = 10,
149+
height = 10
150+
)
151+
draw(heatmap, ht_gap = unit(0.5, "cm"))
152+
dev.off()

0 commit comments

Comments
 (0)