Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells.
The 17 matches
- [1] § STAR★Methods › Method details › Sequence alignment and sample assignment ↔ 01_d16_processing_annotation.ipynb, lines 336–405 · score 0.79 · HTODemux, CITE seq, single cell, d16, Seurat, hashing
- [2] § STAR★Methods › Method details › Trajectory inference ↔ 10_tanycyte_monocle3_pseudotime.ipynb, lines 289–347 · score 0.78 · polynomial fitting, tanycyte lineage, Monocle3, pseudotime, Gene expression, polyfit
- [3] § STAR★Methods › Method details › Sequence alignment and sample assignment ↔ 03_d25_d50_d70_processing.ipynb, lines 380–526 · score 0.77 · HTODemux, CITE seq, single cell, Seurat, hashing, v1
- [4] § Results › Duration of BMP stimulation controls ARC versus VMH identity ↔ 14_d16_bmp_annotation.ipynb, lines 107–154 · score 0.74 · anterior tuberal progenitors, posterior tuberal progenitors, NR5A1, ARX, LHX1, telencephalic
- [5] § Results › Duration of BMP stimulation controls ARC versus VMH identity ↔ 15_d50+_bmp_annotation.ipynb, lines 228–289 · score 0.72 · NR5A1, FEZF1, ARX, LHX1, LHX8, GPR149
- [6] § Results › In vitro-derived ARC cultures show transcriptional similarity to the human ARC ↔ 07_d50_d70_analysis.ipynb, lines 626–653 · score 0.71 · DLX6 AS1, NR5A2, CRABP1, FOXP2, NPFFR2, TRH
- [7] § Results › In vitro-derived ARC cultures show transcriptional similarity to the human ARC ↔ 15_d50+_bmp_annotation.ipynb, lines 228–289 · score 0.71 · DLX6 AS1, NR5A2, BNC2, FOXP2, NPFFR2, PRDM12
- [8] § Results › Different POMC subtypes are dependent on BMP timing ↔ 14_d16_bmp_annotation.ipynb, lines 107–154 · score 0.69 · anterior tuberal progenitors, posterior tuberal progenitors, NR5A1, ventral, PRDM12, SOX14
- [9] § Results › In vitro-derived tanycytes map to the β2 subtype and respond to FGF1 ↔ 10_tanycyte_monocle3_pseudotime.ipynb, lines 289–347 · score 0.68 · COL25A1, tanycytic lineage, Pseudotime, CRYM, SOX2, NFIA
- [10] § STAR★Methods › Method details › sc/snRNA-seq processing and clustering ↔ 03_d25_d50_d70_processing.ipynb, lines 616–697 · score 0.66 · scDblFinder, log normalized, d25, doublets, hashed, d50
- [11] § Results › In vitro-derived ARC cultures show transcriptional similarity to the human ARC ↔ 04_d25_annotation_analysis.ipynb, lines 163–192 · score 0.64 · DLX6 AS1, NR5A2, DIO2, ONECUT1, NFIA, OTP
- [12] § STAR★Methods › Method details › Transcriptomic comparison with human data ↔ 16_bmp_analysis.ipynb, lines 959–1014 · score 0.62 · NR5A1, NR5A2, POMC subtypes, TBX3, VMH, human
- [13] § STAR★Methods › Method details › sc/snRNA-seq processing and clustering ↔ 01_d16_processing_annotation.ipynb, lines 498–568 · score 0.62 · scDblFinder, log normalized, doublets, hashed, d16, clustering
- [14] § STAR★Methods › Method details › sc/snRNA-seq processing and clustering ↔ 04_d25_annotation_analysis.ipynb, lines 33–77 · score 0.57 · d25, RPCA, Seurat, selection, neighbor, UMAP
- [15] § Results › Different POMC subtypes are dependent on BMP timing ↔ 16_bmp_analysis.ipynb, lines 959–1014 · score 0.56 · NR5A1, NR5A2, DEGs, SOX14, TBX3, VMH
- [16] § STAR★Methods › Method details › sc/snRNA-seq processing and clustering ↔ 05_d50_d70_annotation.ipynb, lines 127–167 · score 0.55 · RPCA, Seurat, selection, neighbor, d50, UMAP
- [17] § STAR★Methods › Method details › Differential gene expression analysis ↔ 16_bmp_analysis.ipynb, lines 854–921 · score 0.54 · glmQLFTest, Seurat, batch, model, matrix, filtered
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
Jupyter notebook · 1,077 lines · 38 KB · no license · 3 matches
- # %%
- import scanpy as sc
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- import seaborn as sns
- pd.set_option('display.max_columns', 500)
- import warnings
- warnings.filterwarnings("ignore")
- from matplotlib.lines import Line2D
- from rpy2.robjects import pandas2ri
- from rpy2.robjects import r
- import rpy2.rinterface_lib.callbacks
- import anndata2ri
- import rpy2.robjects.numpy2ri
- #import numpy2ri
- import anndata
- from matplotlib.ticker import MaxNLocator
- pandas2ri.activate()
- anndata2ri.activate()
- rpy2.robjects.numpy2ri.activate()
- import matplotlib.lines as mlines
- plt.rcParams.update({
- 'font.family': 'Arial'
- })
- # Function determining cutoff for cell positive for marker
- from sklearn.mixture import GaussianMixture as GMM
- def expression_cutoff(gene, adata_temp):
- data = adata_temp[: , gene].X.toarray()
- gmm = GMM(n_components=2).fit(data)
- labels = gmm.predict(data)
- df = pd.DataFrame({'expression': data.ravel(), 'label': labels})
- label0 = df[df['label'].isin([0])]['expression'].values
- label1 = df[df['label'].isin([1])]['expression'].values
- #print(label0.min())
- if label0.min() > label1.min():
- return label0.min()
- return label1.min()
- %load_ext rpy2.ipython
- # %%
- adata_early = sc.read('../../Data/SC/parse_annotated_early_stage.h5ad')
- # %%
- adata_early.obs
- # %%
- adata_early.obs[['sample','cell_line','bmp_treatment']].value_counts()
- # %%
- bmp_dict = {'no BMP_BMP 25-50':'no BMP early/late', 'no BMP':'no BMP4', 'BMP 5-7':'BMP4 5-7', 'BMP 5-9':'BMP4 5-9', 'BMP 5-11':'BMP4 5-11','BMP 5-14':'BMP4 5-14'}
- adata_early.obs['bmp_treatment'] = adata_early.obs['bmp_treatment'].map(bmp_dict)
- adata_temp = adata_early[adata_early.obs.sample(frac=1, random_state=42).index].copy()
- with plt.rc_context({"figure.dpi": 300}):
- sc.pl.umap(adata_temp, color='bmp_treatment', frameon=False, size=10, save='_bmp_d16_timing.pdf')
- # %%
- adata_temp.uns['bmp_treatment_colors']
- # %% [markdown]
- # # Early stage
- # %% [markdown]
- # ## BArplot
- # %%
- count_l, count_dict = [], {}
- for sample in adata_early.obs.bmp_treatment.cat.categories.tolist():
- count_l = []
- for cell_type in adata_early.obs.Cell_types.cat.categories.tolist():
- count_l.append(adata_early[adata_early.obs['Cell_types'] == cell_type].obs['bmp_treatment'].value_counts().reindex(adata_early.obs.bmp_treatment.cat.categories, fill_value=0)[sample])
- count_l = [i/sum(count_l) for i in count_l]
- count_dict[sample] = count_l
- df = pd.DataFrame.from_dict(count_dict, orient='index', columns=adata_early.obs.Cell_types.cat.categories.tolist())
- df.loc[-1] = adata_early.uns['Cell_types_colors']
- df.index = ['color' if x==-1 else x for x in list(df.index)]
- # Sort the DF
- df = df[df.loc['no BMP4'].sort_values(ascending=False).index]
- df
- # %%
- bmp_conditions = df.iloc[:-1].index.tolist()
- # Create a subplot with 1 row and 4 columns
- fig, axes = plt.subplots(1, 5, figsize=(14, 5), dpi=400)
- for i, bmp in enumerate(bmp_conditions):
- df_flipped = df.iloc[:-1].loc[bmp].reset_index()
- df_flipped.columns = ['Cell_Type', 'Percentage']
- # Create the barplot on the respective axis
- sns.barplot(
- data=df_flipped,
- y="Cell_Type", # Cell types on the y-axis
- x="Percentage", # Percentages on the x-axis
- palette=df.loc['color'].values,
- ax=axes[i] # Specify the axis for each plot
- )
- # Set the title and other plot customizations
- axes[i].set_title(bmp, fontsize=22)
- axes[i].set_xlabel("")
- axes[i].set_ylabel("")
- cell_type_colors = dict(zip(df.columns, df.iloc[-1]))
- axes[i].tick_params(axis='x', labelsize=15)
- axes[i].tick_params(axis='y', labelsize=20)
- # Add a vertical color column next to the y-ticks in the first subplot
- #if i == 0:
- # ytick_positions = axes[i].get_yticks()
- # for y_pos, cell_type in zip(ytick_positions, df_flipped["Cell_Type"]):
- # color = cell_type_colors.get(cell_type, "black") # Get color or default to black
- # axes[i].add_patch(plt.Rectangle((-0.055, y_pos - 0.4), 0.03, 0.8, color=color, transform=axes[i].transData, clip_on=False))
- # axes[i].tick_params(axis='y', pad=11)
- # axes[i].tick_params(axis='y', length=3.5, width=2)
- if i != 0:
- axes[i].tick_params(axis='y', which='both', length=0) # Remove y-ticks
- axes[i].set_yticklabels([]) # Remove y-tick labels
- axes[i].set_xticks([0.2,0.4,0.6])
- axes[i].set_xlim(0,0.7)
- # Adjust layout and show the plot
- plt.tight_layout(pad=0.2)
- plt.savefig('figures/BMP_d16_cluster_proportions.pdf')
- plt.show()
- # %%
- adata_early.obs["Cell_types"] = pd.Categorical(
- values=adata_early.obs.Cell_types, categories=cell_type_colors.keys(), ordered=True
- )
- with plt.rc_context({"figure.dpi": 300}):
- sc.pl.umap(adata_early, color='Cell_types', palette = list(cell_type_colors.values()) ,frameon=False, size=10,save='_d16_legend.pdf' )
- # %%
- with plt.rc_context({"figure.dpi": 300}):
- sc.pl.umap(adata_early, color='cell_line' ,frameon=False, size=10 )
- # %%
- adata_arc_d16 = adata_early[(adata_early.obs.day == 'd16') & (adata_early.obs.bmp_treatment == 'BMP4 5-14')]
- # Group by 'diff_batch' and 'Cell_types' and count the number of occurrences
- counts = adata_arc_d16.obs.groupby(['cell_line', 'Cell_types']).size().reset_index(name='counts')
- # Calculate the total counts per batch
- totals = adata_arc_d16.obs.groupby('cell_line').size().reset_index(name='total_counts')
- # Merge the counts with the totals
- counts = counts.merge(totals, on='cell_line')
- # Normalize the counts
- counts['normalized_counts'] = counts['counts'] / counts['total_counts']
- counts['normalized_counts'] = counts['normalized_counts'].mul(100)
- # Colors dict
- #colors_dict = dict(zip(adata_early.obs.Cell_types.cat.categories, list(cell_type_colors.values())))
- counts['colors'] = counts['Cell_types'].map(cell_type_colors)
- # Print the result
- counts = counts.sort_values(['cell_line','Cell_types'])
- counts = counts[counts.groupby('Cell_types')['normalized_counts'].transform('max') > 2]
- counts
- # %%
- colors_dict = {k: v for k, v in cell_type_colors.items() if k in counts.Cell_types.unique()}
- labels = ['Bio-N', 'RC17', 'KOLF' ]
- category_names = colors_dict.keys()
- cumsum = np.array([0.0, 0.0, 0.0])
- legend_list = []
- with plt.rc_context({"figure.dpi": 250}):
- fig, ax = plt.subplots(figsize=(3.5, 2.5))
- #ax.set_xlim(0, np.sum(data, axis=1).max())
- ax.set_ylim(-0.5, len(labels) - 0.5)
- for i, ct in enumerate(category_names):
- width = [counts[(counts.cell_line == cl) & (counts.Cell_types == ct)].normalized_counts.values[0] for cl in labels]
- cumsum += width
- starts = cumsum-width
- color = counts[counts.Cell_types == ct].colors.values[0]
- rects = ax.barh(labels, width, left=starts, height=0.7,
- label=ct, color=color)
- legend_list.append(mlines.Line2D([], [], color="white", marker='o',label=ct, markersize=8, markerfacecolor=color))
- ax.legend(handles=legend_list, fontsize='small', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))
- plt.savefig('d16_bmp5-14_parse_barplot.pdf', bbox_inches='tight')
- plt.show()
- # %% [markdown]
- # # DEG analysis
- # %%
- %%R -i adata_early
- Csparse_validate = "CsparseMatrix_validate"
- library(Seurat)
- library(edgeR)
- seur <- as.Seurat(adata_early, counts = "counts", data = NULL)
- #seur <- readRDS("Data/d50_d70_neurons_seurat.rds")
- seur <- RenameAssays(seur, originalexp="RNA")
- y <- Seurat2PB(seur, sample = "sample", cluster = "Cell_types")
- keep.samples <- y$samples$lib.size > 5e4
- y <- y[, keep.samples]
- keep.genes <- filterByExpr(y, group=y$samples$cluster)
- y <- y[keep.genes, , keep=FALSE]
- y <- normLibSizes(y)
- cluster <- as.factor(y$samples$cluster)
- batch <- factor(y$samples$sample)
- #design <- model.matrix(~ cluster + batch)
- design <- model.matrix(~ cluster)
- colnames(design) <- gsub("batch", "", colnames(design))
- colnames(design)[1] <- "Int"
- head(design)
- y <- estimateDisp(y, design, robust=TRUE)
- fit <- glmQLFit(y, design, robust=TRUE)
- ncls <- nlevels(cluster)
- contr <- rbind( matrix(1/(1-ncls), ncls, ncls), matrix(0, ncol(design)-ncls, ncls) )
- diag(contr) <- 1
- contr[1,] <- 0
- rownames(contr) <- colnames(design)
- colnames(contr) <- paste0("cluster", levels(cluster))
- contr
- qlf <- list()
- for(i in 1:ncls){
- qlf[[i]] <- glmQLFTest(fit, contrast=contr[,i])
- qlf[[i]]$comparison <- paste0("cluster", levels(cluster)[i], "_vs_others")
- }
- top <- 500
- topMarkers <- list()
- de_df = data.frame(matrix(
- vector(), 0, 7, dimnames=list(c(), c("gene","logFC","logCPM","F","PValue","FDR",'comparison'))),
- stringsAsFactors=F)
- for(i in 1:ncls) {
- #print(head(qlf[[i]])$comparison)
- ord <- order(qlf[[i]]$table$PValue, decreasing=FALSE)
- up <- qlf[[i]]$table$logFC[ord] > 0
- topMarkers[[i]] <- rownames(y)[ord[up][1:top]]
- #genes =
- df = as.data.frame(topTags(qlf[[i]], n='all'))
- df =df[rownames(df) %in% rownames(y)[ord[up][1:top]], ]
- df$comparison <- head(qlf[[i]])$comparison
- de_df = rbind(de_df, df)
- }
- print(dim(de_df))
- write.csv(de_df, "parse_early_stage_bmp_deg.csv")
- # %%
- de_genes = pd.read_csv('parse_early_stage_bmp_deg.csv',index_col=0)
- de_genes['cluster'] = de_genes['comparison'].str.extract(r'cluster(.*?)_vs_others')
- de_genes = de_genes[['gene','logFC','logCPM','F','PValue','FDR','comparison','cluster']]
- de_genes = de_genes[(de_genes.FDR < 0.05) & (de_genes.logFC > 1)]
- de_genes.to_excel("ARC_VMH_analysis/DE_lists/d16_bmp_de_list.xlsx")
- de_genes
- # %% [markdown]
- # # Late stage
- # %%
- adata_late = sc.read('../../Data/SC/revision_bmp_timing_annotated.h5ad')
- adata_late.obs['Cell_types_2'].value_counts()
- # %%
- adata_late.obs[['sample','cell_line','day','bmp_treatment']].value_counts()
- # %%
- adata_late.obs.bmp_treatment.cat.categories
- # %%
- bmp_dict = {'no BMP early/late':'no BMP4 or 7', 'no BMP4':'no BMP4', 'BMP4 5-7':'BMP4 5-7', 'BMP4 5-9':'BMP4 5-9', 'BMP4 5-11':'BMP4 5-11','BMP4 5-14':'BMP4 5-14'}
- adata_late.obs['bmp_treatment'] = adata_late.obs['bmp_treatment'].map(bmp_dict)
- # %%
- adata_late.obs['bmp_treatment']
- # %%
- adata_temp = adata_late[adata_late.obs.sample(frac=1, random_state=42).index].copy()
- with plt.rc_context({ "figure.dpi": 300}):
- ax = sc.pl.umap(adata_temp, color=['bmp_treatment'], palette=['#fb9a99','#8b67ad', '#32a02d', '#b2df8a', '#2078b4', '#a6cee3'], frameon=False, size=10, colorbar_loc=None, layer='logcounts')
- #plt.savefig('figures/bmp_late_timing_umap.pdf',bbox_inches="tight")
- # %%
- adata_temp = adata_late[adata_late.obs.sample(frac=1, random_state=42).index].copy()
- with plt.rc_context({ "figure.dpi": 300}):
- ax = sc.pl.umap(adata_temp, color=['day'], frameon=False, size=10, colorbar_loc=None, layer='logcounts', show=False)
- plt.savefig('figures/bmp_late_day_umap.pdf',bbox_inches="tight")
- # %% [markdown]
- # # Barplot
- # %%
- colors_dict = {
- 'AGRP+/OTP+': '#3b89bf',
- 'Astrocytes': '#8b67ad',
- 'DLX6-AS1+/FOXP2+': '#bb9c8a',
- 'FEZF1+/SOX14+': '#fa8016',
- 'GHRH+/PNOC+': '#b15a27',
- 'GPR149+/LHX8+': '#71b09b',
- 'Immature ARC neurons': '#e85b3d',
- 'LHX1+/ARX+': '#8a2e35',
- 'NR5A2+/ONECUT1/3+': '#f4a989',
- 'OTP+/SST+/BNC2+': '#89969c',
- 'Optic area neurons': '#4f9e46',
- 'PNOC+/NPFFR2+': '#85c668',
- 'POMC+/SOX14+/NR5A1+': '#a11d02',
- 'POMC+/TBX3+/NR5A2+': '#eddb7e',
- 'Tanycytes': '#faaa4e',
- 'Telencephalic neurons': '#d0a9b7',
- 'Unassigned': '#a4cde0',
- 'VAX1+/GBX1+': '#d46abf',
- 'LMX1A+/LMX1B+': '#45bacc'
- }
- cell_types_order =['Astrocytes', 'Telencephalic neurons','Unassigned','DLX6-AS1+/FOXP2+','OTP+/SST+/BNC2+','NR5A2+/ONECUT1/3+','LMX1A+/LMX1B+','VAX1+/GBX1+','GHRH+/PNOC+','LHX1+/ARX+','GPR149+/LHX8+',
- 'POMC+/SOX14+/NR5A1+', 'FEZF1+/SOX14+','Immature ARC neurons', 'POMC+/TBX3+/NR5A2+','Tanycytes','AGRP+/OTP+','PNOC+/NPFFR2+','Optic area neurons']
- print(len(cell_types_order))
- #colors_dict = dict(zip(list(adata_late.obs.Cell_types_2.cat.categories), colors_dict.values()))
- colors_dict = {k: colors_dict[k] for k in cell_types_order if k in colors_dict}
- colors_dict
- adata_late.obs["Cell_types_2"] = pd.Categorical(
- values=adata_late.obs.Cell_types_2, categories=cell_types_order, ordered=True
- )
- # %%
- with plt.rc_context({"figure.dpi": 300}):
- sc.pl.umap(adata_late, color='Cell_types_2',palette = colors_dict,frameon=False, size=10 ,show = False)
- plt.savefig('figures/Revision/bmp_late_annotations_umap.pdf',bbox_inches="tight")
- plt.show()
- # %%
- count_l, count_dict = [], {}
- for sample in adata_late.obs.bmp_treatment.cat.categories.tolist():
- #if sample != 'no BMP_BMP 25-50':
- count_l = []
- for cell_type in adata_late.obs.Cell_types_2.cat.categories.tolist():
- count_l.append(adata_late[adata_late.obs['Cell_types_2'] == cell_type].obs['bmp_treatment'].value_counts().reindex(adata_late.obs.bmp_treatment.cat.categories, fill_value=0)[sample])
- count_l = [i/sum(count_l) for i in count_l]
- count_dict[sample] = count_l
- df = pd.DataFrame.from_dict(count_dict, orient='index', columns=adata_late.obs.Cell_types_2.cat.categories.tolist())
- df.loc[-1] = adata_late.uns['Cell_types_2_colors']
- df.index = ['color' if x==-1 else x for x in list(df.index)]
- # Sort the DF
- df = df[['Astrocytes', 'Telencephalic neurons','Unassigned','DLX6-AS1+/FOXP2+','OTP+/SST+/BNC2+','NR5A2+/ONECUT1/3+','LMX1A+/LMX1B+','VAX1+/GBX1+','GHRH+/PNOC+','LHX1+/ARX+','GPR149+/LHX8+',
- 'POMC+/SOX14+/NR5A1+', 'FEZF1+/SOX14+','Immature ARC neurons', 'POMC+/TBX3+/NR5A2+','Tanycytes','AGRP+/OTP+','PNOC+/NPFFR2+','Optic area neurons']]
- df
- # %%
- bmp_conditions = df.iloc[:-1].index.tolist()
- # Create a subplot with 1 row and 4 columns
- fig, axes = plt.subplots(1, 6, figsize=(14, 6), dpi=400)
- for i, bmp in enumerate(bmp_conditions):
- df_flipped = df.iloc[:-1].loc[bmp].reset_index()
- df_flipped.columns = ['Cell_Type', 'Percentage']
- # Create the barplot on the respective axis
- sns.barplot(
- data=df_flipped,
- y="Cell_Type", # Cell types on the y-axis
- x="Percentage", # Percentages on the x-axis
- palette=df.loc['color'].values,
- ax=axes[i] # Specify the axis for each plot
- )
- # Set the title and other plot customizations
- #axes[i].set_title(bmp, fontsize=22)
- if bmp == 'no BMP early/late': bmp = 'no BMP\nearly/late'
- axes[i].set_title(bmp, fontsize=21)
- axes[i].set_xlabel("")
- axes[i].set_ylabel("")
- cell_type_colors = dict(zip(df.columns, df.iloc[-1]))
- axes[i].tick_params(axis='x', labelsize=15)
- axes[i].tick_params(axis='y', labelsize=20)
- # Add a vertical color column next to the y-ticks in the first subplot
- #if i == 0:
- if i != 0:
- axes[i].tick_params(axis='y', which='both', length=0) # Remove y-ticks
- axes[i].set_yticklabels([]) # Remove y-tick labels
- axes[i].set_xticks([0.2,0.4])
- axes[i].set_xlim(0,0.5)
- # Adjust layout and show the plot
- plt.tight_layout(pad=0.3)
- plt.savefig('figures/Revision/bmp_late_barplot.pdf',bbox_inches="tight")
- plt.show()
- # %%
- adata_late.write('../../Data/SC/revision_bmp_timing_annotated.h5ad')
- # %% [markdown]
- # # Stacked barplot
- # %%
- adata_arc_d50 = adata_late[(adata_late.obs.day == 'd50') & (adata_late.obs.bmp_treatment == 'BMP4 5-14')]
- # %%
- with plt.rc_context({"figure.dpi": 300}):
- sc.pl.umap(adata_arc_d50, color=['cell_line', 'biological_replicate'],frameon=False, size=10)
- # %%
- # Group by 'diff_batch' and 'Cell_types' and count the number of occurrences
- counts = adata_arc_d50.obs.groupby(['cell_line', 'Cell_types_2']).size().reset_index(name='counts')
- # Calculate the total counts per batch
- totals = adata_arc_d50.obs.groupby('cell_line').size().reset_index(name='total_counts')
- # Merge the counts with the totals
- counts = counts.merge(totals, on='cell_line')
- # Normalize the counts
- counts['normalized_counts'] = counts['counts'] / counts['total_counts']
- counts['normalized_counts'] = counts['normalized_counts'].mul(100)
- # Colors dict
- counts['colors'] = counts['Cell_types_2'].map(colors_dict)
- # Print the result
- counts = counts.sort_values(['cell_line','Cell_types_2'])
- counts = counts[counts.groupby('Cell_types_2')['normalized_counts'].transform('max') > 2]
- counts
- # %%
- adata_arc_d50[adata_arc_d50.obs.cell_line == 'RC17'].obs.Cell_types_2.value_counts(normalize=True).mul(100)
- # %%
- colors_dict = {k: v for k, v in colors_dict.items() if k in counts.Cell_types_2.unique()}
- labels = ['Bio-N', 'RC17', 'KOLF' ]
- category_names = colors_dict.keys()
- cumsum = np.array([0.0, 0.0, 0.0])
- legend_list = []
- with plt.rc_context({"figure.dpi": 250}):
- fig, ax = plt.subplots(figsize=(3.5, 2.5))
- #ax.set_xlim(0, np.sum(data, axis=1).max())
- ax.set_ylim(-0.5, len(labels) - 0.5)
- for i, ct in enumerate(category_names):
- width = [counts[(counts.cell_line == cl) & (counts.Cell_types_2 == ct)].normalized_counts.values[0] for cl in labels]
- cumsum += width
- starts = cumsum-width
- color = counts[counts.Cell_types_2 == ct].colors.values[0]
- rects = ax.barh(labels, width, left=starts, height=0.7,
- label=ct, color=color)
- legend_list.append(mlines.Line2D([], [], color="white", marker='o',label=ct, markersize=8, markerfacecolor=color))
- ax.legend(handles=legend_list, fontsize='small', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))
- plt.savefig('d50_bmp5-14_parse_barplot.pdf', bbox_inches='tight')
- plt.show()
- # %% [markdown]
- # # DEG
- # %%
- %%R -i adata_late
- Csparse_validate = "CsparseMatrix_validate"
- library(Seurat)
- library(edgeR)
- seur <- as.Seurat(adata_late, counts = "counts", data = NULL)
- #seur <- readRDS("Data/d50_d70_neurons_seurat.rds")
- seur <- RenameAssays(seur, originalexp="RNA")
- y <- Seurat2PB(seur, sample = "sample", cluster = "Cell_types_2")
- keep.samples <- y$samples$lib.size > 5e4
- y <- y[, keep.samples]
- keep.genes <- filterByExpr(y, group=y$samples$cluster)
- y <- y[keep.genes, , keep=FALSE]
- y <- normLibSizes(y)
- cluster <- as.factor(y$samples$cluster)
- batch <- factor(y$samples$sample)
- #design <- model.matrix(~ cluster + batch)
- design <- model.matrix(~ cluster)
- colnames(design) <- gsub("batch", "", colnames(design))
- colnames(design)[1] <- "Int"
- head(design)
- y <- estimateDisp(y, design, robust=TRUE)
- fit <- glmQLFit(y, design, robust=TRUE)
- ncls <- nlevels(cluster)
- contr <- rbind( matrix(1/(1-ncls), ncls, ncls), matrix(0, ncol(design)-ncls, ncls) )
- diag(contr) <- 1
- contr[1,] <- 0
- rownames(contr) <- colnames(design)
- colnames(contr) <- paste0("cluster", levels(cluster))
- contr
- qlf <- list()
- for(i in 1:ncls){
- qlf[[i]] <- glmQLFTest(fit, contrast=contr[,i])
- qlf[[i]]$comparison <- paste0("cluster", levels(cluster)[i], "_vs_others")
- }
- top <- 500
- topMarkers <- list()
- de_df = data.frame(matrix(
- vector(), 0, 7, dimnames=list(c(), c("gene","logFC","logCPM","F","PValue","FDR",'comparison'))),
- stringsAsFactors=F)
- for(i in 1:ncls) {
- #print(head(qlf[[i]])$comparison)
- ord <- order(qlf[[i]]$table$PValue, decreasing=FALSE)
- up <- qlf[[i]]$table$logFC[ord] > 0
- topMarkers[[i]] <- rownames(y)[ord[up][1:top]]
- #genes =
- df = as.data.frame(topTags(qlf[[i]], n='all'))
- df =df[rownames(df) %in% rownames(y)[ord[up][1:top]], ]
- df$comparison <- head(qlf[[i]])$comparison
- de_df = rbind(de_df, df)
- }
- print(dim(de_df))
- write.csv(de_df, "DE_lists/revision_parse_late_stage_bmp_deg.csv")
- # %%
- de_genes = pd.read_csv('DE_lists/revision_parse_late_stage_bmp_deg.csv',index_col=0)
- de_genes['cluster'] = de_genes['comparison'].str.extract(r'cluster(.*?)_vs_others')
- de_genes = de_genes[['gene','logFC','logCPM','F','PValue','FDR','comparison','cluster']]
- de_genes = de_genes[(de_genes.FDR < 0.05) & (de_genes.logFC > 1)]
- #de_genes = de_genes[~de_genes['gene'].str.startswith(('ENSG', 'LINC'))]
- de_genes.to_excel("DE_lists/revision_parse_late_stage_bmp_deg.xlsx")
- de_genes
- # %% [markdown]
- # # Dotplot by POMC cluster
- # %%
- #adata_temp = adata_late[adata_late.obs.Cell_types_2.isin(['AGRP+/OTP+','POMC+/SOX14+/NR5A1+','POMC+/TBX3+/NR5A2+','GHRH+/PNOC+','PNOC+/NPFFR2+','FEZF1+/SOX14+', 'Tanycytes', 'Immature ARC neurons','DLX6-AS1+/FOXP2+','OTP+/SST+/BNC2+','NR5A2+/ONECUT1/3+','GPR149+/LHX8+','VAX1+/GBX1+'])]
- genes = ['POMC','PRDM12','AGRP','SST', 'GHRH', 'TBX3','NR5A2','PNOC', 'TRH',
- 'NPY', 'NR5A1','SOX14','GPR149','IL18R1','GLP1R','GLP2R','GHSR','GIPR','CCKAR','CCKBR','CALCR','RAMP1','RAMP2','RAMP3',"GRPR","SSTR1","SSTR2","SSTR5",
- 'NPFFR2','NPY1R',"NPY2R","NPY5R","NPY6R",'HCRTR2', 'LEPR','SORT1','SORL1',"VIPR1","VIPR2","CRHR1","CRHR2","SCTR", 'PRLHR']
- sc.pl.dotplot(adata_late, genes, 'Cell_types_2')
- # %%
- #genes = ['POMC']
- factor = 40
- #genes = ['POMC','GLP1R']
- non_zero_dict, expression_dict = {},{}
- for gene in genes:
- non_zero_list, expression_list = [], []
- for c in adata_late.obs['Cell_types_2'].cat.categories:
- # Calculate percentage of non-zero values, handling missing categories
- non_zero_count = adata_late[adata_late[:, gene].X > 0, :].obs['Cell_types_2'].value_counts().get(c, 0)
- total_count = adata_late[adata_late.obs['Cell_types_2'] == c].shape[0]
- percentage_non_zero = (non_zero_count / total_count) * 100 if total_count > 0 else 0
- non_zero_list.append(percentage_non_zero)
- # Calculate mean expression for the gene
- mean_expression = np.mean(adata_late[adata_late.obs['Cell_types_2'] == c, gene].X)
- expression_list.append(mean_expression)
- non_zero_dict.update({gene: non_zero_list})
- expression_dict.update({gene: expression_list})
- df_nonzero = pd.DataFrame.from_dict(non_zero_dict, orient='index', columns=adata_late.obs['Cell_types_2'].cat.categories)
- df_exp = pd.DataFrame.from_dict(expression_dict, orient='index', columns=adata_late.obs['Cell_types_2'].cat.categories)
- # Reverse the order of treatments
- treatments = df_nonzero.columns[::-1]
- sizes = []
- expression = []
- X = []
- Y = []
- # Iterate over the reversed treatments
- for r, treatment in enumerate(treatments):
- sizes.append(df_nonzero[treatment].values)
- expression.append(df_exp[treatment].values)
- Y.append(np.repeat(r, len(genes)))
- X.append(np.arange(len(genes)))
- sizes = np.array(sizes)
- expression = np.array(expression)
- X = np.array(X)
- Y = np.array(Y)
- # Filter out small dots
- mask = sizes * factor >= 1 # Only include dots above the threshold
- X = X[mask]
- Y = Y[mask]
- sizes = sizes[mask]
- expression = expression[mask]
- with plt.rc_context({"figure.dpi": 500, "figure.figsize": [12, 7 ]}):
- # Set figure size dynamically based on number of treatments and genes
- fig, ax = plt.subplots(figsize=(1 * len(genes), 1.3 * len(treatments)))
- # Adjust the scatter plot
- ax.set_xticks(np.arange(len(genes)), labels=genes, rotation=90, fontsize=30)
- ax.set_yticks(np.arange(len(treatments)), labels=treatments, fontsize=30)
- im = ax.scatter(X, Y, c=expression, s=factor * sizes, cmap='Blues', lw=0.5, vmin=0, edgecolors='black')
- ax.set_ylim([-0.7, len(treatments) - 0.3])
- ax.set_xlim([-0.5, len(genes) - 0.5])
- # Add a colorbar
- cbar = plt.colorbar(im, ax=ax, orientation='horizontal',aspect=5)
- cbar.ax.set_title('Mean expression', fontsize=20)
- cbar.ax.set_position([0.93, 0.3, 0.07, 0.15])
- # Set colorbar ticks to only min and max
- cbar.set_ticks([im.get_array().min(), im.get_array().max()])
- cbar.set_ticklabels(['Min', 'Max'], fontsize=20) # Format tick labels as needed
- # Add a size legend
- legend_sizes = [5, 25, 50] # Example sizes
- legend_labels = [f'{s}%' for s in legend_sizes]
- # Create custom legend handles for size legend
- handles = [Line2D([0], [0], marker='o', color='w', label=label,
- markersize=np.sqrt(s * factor), markerfacecolor='gray', lw=0)
- for s, label in zip(legend_sizes, legend_labels)]
- # Place the legend outside the plot
- ax.legend(handles=handles, title="Fraction of non-zero", loc='upper left', fontsize=18, title_fontsize=20,
- bbox_to_anchor=(1.012, 1), frameon=False)#, ncol=len(legend_sizes))
- #plt.tight_layout()
- #plt.savefig('figures/Revision/bmp_late_day_dotplot.pdf', bbox_inches="tight")
- plt.show()
- # %% [markdown]
- # # Dotplot by day
- # %%
- adata_late = sc.read('../../Data/SC/revision_bmp_timing_annotated.h5ad')
- adata_late.obs['Cell_types_2'].value_counts()
- # %%
- with plt.rc_context({"figure.dpi": 300}):
- ax = sc.pl.umap(adata_late, show=False,frameon=False, size=10 )
- sc.pl.umap(adata_late[(adata_late.obs.bmp_treatment=='BMP4 5-14') & (adata_late.obs.cell_line=='RC17')],ax = ax, color=['biological_replicate'],frameon=False, size=10 )
- with plt.rc_context({"figure.dpi": 300}):
- ax = sc.pl.umap(adata_late, show=False,frameon=False, size=10 )
- sc.pl.umap(adata_late[(adata_late.obs.bmp_treatment=='BMP4 5-14') & (adata_late.obs.cell_line=='RC17')],ax = ax, color=['day'],frameon=False, size=10 )
- # %%
- factor = 15
- cluster = 'POMC+/TBX3+/NR5A2+'
- adata_temp= adata_late[(adata_late.obs.cell_line == 'RC17') & (adata_late.obs.Cell_types_2 == cluster) & (adata_late.obs.bmp_treatment == 'BMP4 5-14')]
- genes = ["GRIA4", "NR5A2", "KCNQ3", "KCNJ3", "LEPR", "HTR2C", "SORT1", "GRPR", "PRDM12", "GHSR", "GIPR", "NPFFR2"]
- non_zero_dict, expression_dict = {},{}
- for gene in genes:
- non_zero_list, expression_list = [], []
- for c in adata_temp.obs['day'].cat.categories:
- # Calculate percentage of non-zero values, handling missing categories
- non_zero_count = adata_temp[adata_temp[:, gene].X > 0, :].obs['day'].value_counts().get(c, 0)
- total_count = adata_temp[adata_temp.obs['day'] == c].shape[0]
- percentage_non_zero = (non_zero_count / total_count) * 100 if total_count > 0 else 0
- non_zero_list.append(percentage_non_zero)
- # Calculate mean expression for the gene
- mean_expression = np.mean(adata_temp[adata_temp.obs['day'] == c, gene].X)
- expression_list.append(mean_expression)
- non_zero_dict.update({gene: non_zero_list})
- expression_dict.update({gene: expression_list})
- df_nonzero = pd.DataFrame.from_dict(non_zero_dict, orient='index', columns=adata_temp.obs['day'].cat.categories)
- df_exp = pd.DataFrame.from_dict(expression_dict, orient='index', columns=adata_temp.obs['day'].cat.categories)
- # Reverse the order of treatments
- treatments = df_nonzero.columns[::-1]
- sizes = []
- expression = []
- X = []
- Y = []
- # Iterate over the reversed treatments
- for r, treatment in enumerate(treatments):
- sizes.append(df_nonzero[treatment].values)
- expression.append(df_exp[treatment].values)
- Y.append(np.repeat(r, len(genes)))
- X.append(np.arange(len(genes)))
- sizes = np.array(sizes)
- expression = np.array(expression)
- X = np.array(X)
- Y = np.array(Y)
- # Filter out small dots
- mask = sizes * factor >= 1 # Only include dots above the threshold
- X = X[mask]
- Y = Y[mask]
- sizes = sizes[mask]
- expression = expression[mask]
- with plt.rc_context({"figure.dpi": 500, "figure.figsize": [12, 5 ]}):
- # Set figure size dynamically based on number of treatments and genes
- fig, ax = plt.subplots(figsize=(1 * len(genes), 1.3 * len(treatments)))
- # Adjust the scatter plot
- ax.set_xticks(np.arange(len(genes)), labels=genes, rotation=90, fontsize=30)
- ax.set_yticks(np.arange(len(treatments)), labels=treatments, fontsize=30)
- im = ax.scatter(X, Y, c=expression, s=factor * sizes, cmap='Blues', lw=0.5, vmin=0, edgecolors='black')
- ax.set_ylim([-0.5, len(treatments) - 0.5])
- ax.set_xlim([-0.5, len(genes) - 0.5])
- # Add a colorbar
- cbar = plt.colorbar(im, ax=ax, orientation='horizontal',aspect=5)
- cbar.ax.set_title('Mean expression', fontsize=20)
- cbar.ax.set_position([0.96, 0, 0.1, 0.2])
- # Set colorbar ticks to only min and max
- cbar.set_ticks([im.get_array().min(), im.get_array().max()])
- cbar.set_ticklabels(['Min', 'Max'], fontsize=20) # Format tick labels as needed
- # Add a size legend
- legend_sizes = [5, 25, 50] # Example sizes
- legend_labels = [f'{s}%' for s in legend_sizes]
- # Create custom legend handles for size legend
- handles = [Line2D([0], [0], marker='o', color='w', label=label,
- markersize=np.sqrt(s * factor), markerfacecolor='gray', lw=0)
- for s, label in zip(legend_sizes, legend_labels)]
- # Place the legend outside the plot
- ax.legend(handles=handles, title="Fraction of non-zero", loc='upper left', fontsize=18, title_fontsize=20,
- bbox_to_anchor=(1, 1), frameon=False)#, ncol=len(legend_sizes))
- #plt.tight_layout()
- plt.title(cluster, size=30)
- cluster_temp = cluster.replace('/','_')
- plt.savefig(f'figures/bmp_late_maturation_dotplot_{cluster_temp}.pdf', bbox_inches="tight")
- plt.show()
- # %% [markdown]
- # # POMC subtype DE analysis
- # %%
- adata_pomc = adata_late[adata_late.obs.Cell_types_2.isin(['POMC+/SOX14+/NR5A1+', 'POMC+/TBX3+/NR5A2+'])]
- #adata_pomc = adata_pomc[adata_pomc.obs.day == 'd50']
- adata_pomc
- # %%
- with plt.rc_context({ "figure.dpi": 300 }):
- ax = sc.pl.umap(adata_late, show=False, size=15, frameon=False)
- sc.pl.umap(adata_pomc, ax = ax, color="Cell_types_2", size=15, frameon=False, save='_POMC_populations.pdf')
- # %%
- %%R -i adata_pomc
- Csparse_validate = "CsparseMatrix_validate"
- library(Seurat)
- library(edgeR)
- seur <- as.Seurat(adata_pomc, counts = "counts", data = NULL)
- #seur <- readRDS("Data/d50_d70_neurons_seurat.rds")
- seur <- RenameAssays(seur, originalexp="RNA")
- y <- Seurat2PB(seur, sample = "cell_line", cluster = "Cell_types_2")
- keep.samples <- y$samples$lib.size > 5e4
- y <- y[, keep.samples]
- keep.genes <- filterByExpr(y, group=y$samples$cluster)
- y <- y[keep.genes, , keep=FALSE]
- y <- normLibSizes(y)
- print('OK')
- cluster <- as.factor(y$samples$cluster)
- batch <- factor(y$samples$sample)
- design <- model.matrix(~ cluster + batch)
- colnames(design) <- gsub("batch", "", colnames(design))
- colnames(design)[1] <- "Int"
- head(design)
- y <- estimateDisp(y, design, robust=TRUE)
- fit <- glmQLFit(y, design, robust=TRUE)
- print('OK')
- ncls <- nlevels(cluster)
- contr <- rbind( matrix(1/(1-ncls), ncls, ncls), matrix(0, ncol(design)-ncls, ncls) )
- diag(contr) <- 1
- contr[1,] <- 0
- rownames(contr) <- colnames(design)
- colnames(contr) <- paste0("cluster", levels(cluster))
- contr
- qlf <- list()
- for(i in 1:ncls){
- qlf[[i]] <- glmQLFTest(fit, contrast=contr[,i])
- qlf[[i]]$comparison <- paste0("cluster", levels(cluster)[i], "_vs_others")
- }
- print('OK')
- top <- 20000
- topMarkers <- list()
- de_df = data.frame(matrix(
- vector(), 0, 7, dimnames=list(c(), c("gene","logFC","logCPM","F","PValue","FDR",'comparison'))),
- stringsAsFactors=F)
- for(i in 1:ncls) {
- #print(head(qlf[[i]])$comparison)
- ord <- order(qlf[[i]]$table$PValue, decreasing=FALSE)
- up <- qlf[[i]]$table$logFC[ord] > 0
- topMarkers[[i]] <- rownames(y)[ord[up][1:top]]
- #genes =
- df = as.data.frame(topTags(qlf[[i]], n='all'))
- df =df[rownames(df) %in% rownames(y)[ord[up][1:top]], ]
- df$comparison <- head(qlf[[i]])$comparison
- de_df = rbind(de_df, df)
- }
- print(dim(de_df))
- write.csv(de_df, "parse_pomc.csv")
- # %%
- %%R -o markers
- library(Seurat)
- # Identify spatially variable genes in spatial human hypomap
- merged <- readRDS('../../Data/SC/humanHYPOMAP_spatial.rds')
- merged_subset = subset(x = merged, subset = regional_clusters_named %in% c('ARC',"VMH"))
- Idents(object = merged_subset) <- "regional_clusters_grouped"
- markers <- FindAllMarkers(object = merged_subset, features = rownames(merged_subset))
- # %%
- de_genes = pd.read_csv('parse_pomc.csv',index_col=0)
- de_genes['cluster'] = de_genes['comparison'].str.extract(r'cluster(.*?)_vs_others')
- de_genes = de_genes[['gene','logFC','logCPM','F','PValue','FDR','comparison','cluster']]
- de_genes['identity'] = de_genes.cluster.map({'POMC+/TBX3+/NR5A2+': 'ARC','POMC+/SOX14+/NR5A1+':'VMH'})
- arc_genes = list(markers[(markers.cluster == 'ARC') & (markers.p_val_adj < 0.05) & (markers.avg_log2FC >0.1)].gene.values)
- vmh_genes = list(markers[(markers.cluster == 'VMH') & (markers.p_val_adj < 0.05) & (markers.avg_log2FC >0.1)].gene.values)
- de_genes['spatial_hypomap_de_gene'] = '-'
- de_genes.loc[ (de_genes.gene.isin(arc_genes)), 'spatial_hypomap_de_gene'] = 'ARC'
- de_genes.loc[ (de_genes.gene.isin(vmh_genes)), 'spatial_hypomap_de_gene'] = 'VMH'
- top_genes = de_genes[(de_genes.FDR < 0.05) & (de_genes.logFC > 1)]
- top_genes.to_excel('arc_vmh_pomc_subtype_deg.xlsx')
- top_genes = (top_genes.loc[top_genes['spatial_hypomap_de_gene'].isin(['VMH','ARC'])].sort_values(by=['cluster', 'logFC'], ascending=[True, False]))
- de_genes.loc[de_genes.cluster == 'POMC+/SOX14+/NR5A1+','logFC'] = de_genes[de_genes.cluster == 'POMC+/SOX14+/NR5A1+']['logFC'] * -1
- # %%
- top_genes[top_genes.cluster == 'POMC+/SOX14+/NR5A1+'].spatial_hypomap_de_gene.value_counts()
- # %%
- #plt.clf()
- from adjustText import adjust_text
- with plt.rc_context({ "figure.dpi": 300, "figure.figsize": [5, 4 ] }):
- # highlight down- or up- regulated genes
- down = de_genes[(de_genes['logFC']<=-1)&(de_genes['FDR']<=0.05)]
- up = de_genes[(de_genes['logFC']>=1)&(de_genes['FDR']<=0.05)]
- plt.axvline(-1,color="grey",linestyle="--")
- plt.axvline(1,color="grey",linestyle="--")
- plt.axhline(-np.log10(0.05),color="grey",linestyle="--")
- plt.scatter(x=de_genes['logFC'],y=de_genes['FDR'].apply(lambda x:-np.log10(x)),s=4,label="Not significant",color="#bebebe")
- plt.scatter(x=down['logFC'],y=down['FDR'].apply(lambda x:-np.log10(x)),s=4,label='POMC+/SOX14+/NR5A1+',color="#a11d02")
- plt.scatter(x=up['logFC'],y=up['FDR'].apply(lambda x:-np.log10(x)),s=4,label='POMC+/TBX3+/NR5A2+',color="#eddb7e")
- highlight_df_vmh = de_genes[de_genes['gene'].isin(top_genes[top_genes.spatial_hypomap_de_gene == 'VMH'].gene)]
- highlight_df_arc = de_genes[de_genes['gene'].isin(top_genes[top_genes.spatial_hypomap_de_gene == 'ARC'].gene)]
- # Circle the selected genes (larger, transparent points)
- plt.scatter(highlight_df_vmh['logFC'], -np.log10(highlight_df_vmh['FDR']), s=6.5, facecolors='none', edgecolors='orange', linewidths=0.7, label="Spatial human VMH DEG")
- plt.scatter(highlight_df_arc['logFC'], -np.log10(highlight_df_arc['FDR']), s=6.5, facecolors='none', edgecolors='black', linewidths=0.7, label="Spatial human ARC DEG")
- gene_list =['NR5A1','SOX14','GPR149','CBLN1','GABRB2','SOX1','CA10','CNR1','HS3ST4','ST6GAL2','GABRE','ADGRL4','FGF10','RAX',
- 'IL13RA1','NR5A2','IL13RA2','ECEL1','LHX2','PROX1','NR3C1','CRH', 'SLC17A6', 'CALCR', 'VAX1', 'NR2F2-AS1']
- texts=[]
- for gene in gene_list:
- texts.append(plt.text(x=de_genes[de_genes.gene == gene]['logFC'],y=-np.log10(de_genes[de_genes.gene == gene]['FDR']),s=gene,fontsize=8,weight='bold'))
- adjust_text(texts, expand=(1.65, 1.7),arrowprops=dict(arrowstyle="-", color='black', lw=0.8, shrinkA=2, shrinkB=2))
- plt.ylim(0,7.8)
- plt.xlim(-11,6.5)
- plt.xlabel("logFC", size=14)
- plt.ylabel("-log10(p-value)", size=14)
- plt.title('POMC subtype DEG', fontsize=16)
- legend_handles = [
- Line2D([0], [0], marker='o', color='w', markerfacecolor='#bebebe', markersize=5, label="Not significant"),
- Line2D([0], [0], marker='o', color='w', markerfacecolor='#a11d02', markersize=5, label='POMC+/SOX14+/NR5A1+'),
- Line2D([0], [0], marker='o', color='w', markerfacecolor='#eddb7e', markersize=5, label='POMC+/TBX3+/NR5A2+'),
- Line2D([0], [0], marker='o', color='w', markerfacecolor='none', markeredgecolor='#F58024', markersize=4, markeredgewidth=2.5, label="Spatial hypomap VMH DEG"),
- Line2D([0], [0], marker='o', color='w', markerfacecolor='none', markeredgecolor='black', markersize=4, markeredgewidth=2.5, label="Spatial hypomap ARC DEG")
- ]
- # Add legend with increased linewidth
- plt.legend(handles=legend_handles, loc="upper left", bbox_to_anchor=(0.98, 0.75),
- fontsize=10, frameon=False, markerscale=3, handletextpad=0.05, handleheight=2, handlelength=2)
- #plt.tight_layout()
- plt.savefig('figures/Revision/POMC_DE_analysis.pdf',bbox_inches="tight")
- plt.show()
- # %%
- de_genes = de_genes[(de_genes.FDR < 0.05) & (de_genes.logFC > 1)]
- de_genes.to_excel("DE_lists/revision_parse_pomc_clusters_de_list.xlsx")
- de_genes
- # %%
- adata_pomc_arc = adata_late[(adata_late.obs.Cell_types_2.isin(['POMC+/TBX3+/NR5A2+'])) & (adata_late.obs.day == 'd50')]
- adata_pomc_vmh = adata_late[(adata_late.obs.Cell_types_2.isin(['POMC+/SOX14+/NR5A1+'])) & (adata_late.obs.day == 'd50')]
- # %%
- arc_pomc_dict = {'timing': adata_pomc_arc.obs.bmp_treatment.value_counts(normalize=True).mul(100).keys().values.tolist(), 'Percentage':adata_pomc_arc.obs.bmp_treatment.value_counts(normalize=True).mul(100).values.tolist() }
- df_arc = pd.DataFrame.from_dict(arc_pomc_dict)
- df_arc['cell_type'] = 'POMC+/TBX3+/NR5A2+'
- vmh_pomc_dict = {'timing': adata_pomc_vmh.obs.bmp_treatment.value_counts(normalize=True).mul(100).keys().values.tolist(), 'Percentage':adata_pomc_vmh.obs.bmp_treatment.value_counts(normalize=True).mul(100).values.tolist() }
- df_vmh = pd.DataFrame.from_dict(vmh_pomc_dict)
- df_vmh['cell_type'] = 'POMC+/SOX14+/NR5A1+'
- df_merge = pd.concat([df_vmh,df_arc], axis=0)
- df_merge.timing = df_merge.timing.astype('category')
- df_merge.timing = df_merge.timing.cat.reorder_categories(['no BMP4 or 7', 'no BMP4', 'BMP4 5-7', 'BMP4 5-9', 'BMP4 5-11', 'BMP4 5-14'])
- #df_merge.timing = df_merge.timing.cat.rename_categories({'no BMP_BMP 25-50':'25-50','BMP 5-7':'5-7','BMP 5-9':'5-9','BMP 5-11':'5-11','BMP 5-14':'5-14'})
- df_merge
- # %%
- # Create the bar plot
- from matplotlib.lines import Line2D
- with plt.rc_context({ "figure.dpi": 400, "figure.figsize": [3.5, 2.8 ]}):
- ax = sns.barplot(
- data=df_merge,
- x="timing",
- y="Percentage",
- hue="cell_type",
- palette=['#a11d02','#eddb7e']
- )
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- line1 = Line2D([], [], color="white", marker='o', markerfacecolor='#eddb7e',markersize=12)
- line2 = Line2D([], [], color="white", marker='o', markerfacecolor='#a11d02',markersize=12)
- ax.legend((line2, line1), ('POMC+/SOX14+/NR5A1+','POMC+/TBX3+/NR5A2+'),loc='center left', bbox_to_anchor=(1, 0.5),frameon=False,handletextpad=-0.2, fontsize=12)
- # Customize the plot
- #plt.title("BMP timing", fontsize=16)
- plt.xlabel("")
- plt.ylabel("Fraction of POMC clusters", fontsize=14)
- #plt.legend(title="Cell Type", fontsize=8)
- plt.xticks( fontsize=18, rotation = 90)
- plt.yticks(fontsize=12)
- #plt.tight_layout()
- #plt.tight_layout()
- plt.savefig('figures/Revision/pomc_clusters_percentages.pdf', bbox_inches='tight')
- # Show the plot
- plt.show()
16_bmp_analysis.ipynb at commit b31f478, no license · at the source
Overview
- Novo Nordisk Foundation Center for Stem Cell Medicine (reNEW), Department of Biomedical Sciences, Faculty of Health and Medical Sciences, University of Copenhagen, 2200 Copenhagen, Denmark
- Novo Nordisk Foundation Center for Basic Metabolic Research (CBMR), Faculty of Health and Medical Sciences, University of Copenhagen, 2200 Copenhagen, Denmark
- Department of Experimental Medical Sciences, Wallenberg Centre for Molecular Medicine (WCMM) and Lund Stem Cell Centre, Lund University, 221 84 Lund, Sweden
- School of Biosciences, University of Sheffield, Sheffield S10 2TN, UK
Abstract
The arcuate nucleus (ARC) and ventromedial hypothalamus (VMH) are highly specialized hypothalamic nuclei controlling appetite and energy expenditure. Here, we demonstrate that human VMH and ARC neurons can be generated from pluripotent stem cells by fine-tuned timing and duration of bone morphogenetic protein (BMP) exposure. We identified SHH−/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 17 matches between paragraphs and lines of code.
kirkebylab/In_vitro_ARC_VMH_analysis
b31f4789b26e407bac91bc65f53ab0a843973080, 26 February 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
21 files
- 01_d16_processing_annota
tion.ipynb , Jupyter, 790 lines, 2 matches - 02_d16_analysis.ipynb, Jupyter, 301 lines
- 03_d25_d50_d70_processin
g.ipynb , Jupyter, 1,921 lines, 2 matches - 04_d25_annotation_analys
is.ipynb , Jupyter, 409 lines, 2 matches - 05_d50_d70_annotation.ip
ynb , Jupyter, 245 lines, 1 match - 06_reference_processing_
label_transfer.ipynb , Jupyter, 743 lines - 07_d50_d70_analysis.ipyn
b , Jupyter, 1,324 lines, 1 match - 08_seurat_label_transfer
.ipynb , Jupyter, 823 lines - 09_cluster_trajectory_ne
uronal_lineage.ipynb , Jupyter, 299 lines - 10_tanycyte_monocle3_pse
udotime.ipynb , Jupyter, 415 lines, 2 matches - 11_fgf1_analysis.ipynb, Jupyter, 133 lines
- 12_bmp_processing.ipynb, Jupyter, 205 lines
- 13_revision_bmp_processi
ng.ipynb , Jupyter, 217 lines - 14_d16_bmp_annotation.ip
ynb , Jupyter, 196 lines, 2 matches - 15_d50+_bmp_annotation.i
pynb , Jupyter, 472 lines, 2 matches - 16_bmp_analysis.ipynb, Jupyter, 1,077 lines, 3 matches
- 17_arc_vmh_correlation.i
pynb , Jupyter, 399 lines - 18_tangram_mapping.ipynb
, Jupyter, 172 lines - 19_mouse_hypo_dev_proces
sing.ipynb , Jupyter, 356 lines - 20_mouse_hypo_dev_proces
sing.Rmd , R, 123 lines - README.md, Text, 1 line
Zenodo 20118475
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
21 files
- 01_d16_processing_annota
tion.ipynb , Jupyter, 790 lines - 02_d16_analysis.ipynb, Jupyter, 301 lines
- 03_d25_d50_d70_processin
g.ipynb , Jupyter, 1,921 lines - 04_d25_annotation_analys
is.ipynb , Jupyter, 409 lines - 05_d50_d70_annotation.ip
ynb , Jupyter, 245 lines - 06_reference_processing_
label_transfer.ipynb , Jupyter, 743 lines - 07_d50_d70_analysis.ipyn
b , Jupyter, 1,324 lines - 08_seurat_label_transfer
.ipynb , Jupyter, 823 lines - 09_cluster_trajectory_ne
uronal_lineage.ipynb , Jupyter, 299 lines - 10_tanycyte_monocle3_pse
udotime.ipynb , Jupyter, 415 lines - 11_fgf1_analysis.ipynb, Jupyter, 133 lines
- 12_bmp_processing.ipynb, Jupyter, 205 lines
- 13_revision_bmp_processi
ng.ipynb , Jupyter, 217 lines - 14_d16_bmp_annotation.ip
ynb , Jupyter, 196 lines - 15_d50+_bmp_annotation.i
pynb , Jupyter, 472 lines - 16_bmp_analysis.ipynb, Jupyter, 1,077 lines
- 17_arc_vmh_correlation.i
pynb , Jupyter, 399 lines - 18_tangram_mapping.ipynb
, Jupyter, 172 lines - 19_mouse_hypo_dev_proces
sing.ipynb , Jupyter, 356 lines - 20_mouse_hypo_dev_proces
sing.Rmd , R, 123 lines - README.md, Text, 1 line
alexdobin/star
b1edc1208d91a53bf40ebae8669f71d50b994851, 25 January 2024Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
331 files
- extras/
scripts/ , Shell, 10 linesextractSJfromGTF.sh - extras/
scripts/ , MATLAB, 45 linessjMotif.m - source/
AlignVsTranscript.h , C/C++, 9 lines - source/
BAMbinSortByCoordinate.c , C++, 81 linespp - source/
BAMbinSortByCoordinate.h , C/C++, 12 lines - source/
BAMbinSortUnmapped.cpp , C++, 91 lines - source/
BAMbinSortUnmapped.h , C/C++, 12 lines - source/
BAMfunctions.cpp , C++, 194 lines - source/
BAMfunctions.h , C/C++, 79 lines - source/
BAMoutput.cpp , C++, 186 lines - source/
BAMoutput.h , C/C++, 37 lines - source/
Chain.cpp , C++, 126 lines - source/
Chain.h , C/C++, 30 lines - source/
ChimericAlign.cpp , C++, 32 lines - source/
ChimericAlign.h , C/C++, 41 lines - source/
ChimericAlign_chimericBA , C++, 105 linesMoutput.cpp - source/
ChimericAlign_chimericJu , C++, 23 linesnctionOutput.cpp - source/
ChimericAlign_chimericSt , C++, 181 linesitching.cpp - source/
ChimericDetection.cpp , C++, 6 lines - source/
ChimericDetection.h , C/C++, 29 lines - source/
ChimericDetection_chimer , C++, 138 linesicDetectionMult.cpp - source/
ChimericSegment.cpp , C++, 32 lines - source/
ChimericSegment.h , C/C++, 23 lines - source/
ChimericTranscript.h , C/C++, 19 lines - source/
ClipCR4.cpp , C++, 109 lines - source/
ClipCR4.h , C/C++, 41 lines - source/
ClipMate.h , C/C++, 34 lines - source/
ClipMate_clip.cpp , C++, 78 lines - source/
ClipMate_clipChunk.cpp , C++, 62 lines - source/
ClipMate_initialize.cpp , C++, 32 lines - source/
ErrorWarning.cpp , C++, 37 lines - source/
ErrorWarning.h , C/C++, 9 lines - source/
GTF.cpp , C++, 171 lines - source/
GTF.h , C/C++, 36 lines - source/
GTF_superTranscript.cpp , C++, 257 lines - source/
GTF_transcriptGeneSJ.cpp , C++, 183 lines - source/
Genome.cpp , C++, 234 lines - source/
Genome.h , C/C++, 107 lines - source/
Genome_genomeGenerate.cp , C++, 438 linesp - source/
Genome_genomeLoad.cpp , C++, 521 lines - source/
Genome_genomeOutLoad.cpp , C++, 58 lines - source/
Genome_insertSequences.c , C++, 33 linespp - source/
Genome_transformGenome.c , C++, 324 linespp - source/
GlobalVariables.cpp , C++, 4 lines - source/
GlobalVariables.h , C/C++, 9 lines - source/
InOutStreams.cpp , C++, 44 lines - source/
InOutStreams.h , C/C++, 23 lines - source/
IncludeDefine.h , C/C++, 255 lines - source/
OutSJ.cpp , C++, 123 lines - source/
OutSJ.h , C/C++, 59 lines - source/
PackedArray.cpp , C++, 43 lines - source/
PackedArray.h , C/C++, 34 lines - source/
ParameterInfo.h , C/C++, 112 lines - source/
Parameters.cpp , C++, 1,269 lines - source/
Parameters.h , C/C++, 374 lines - source/
ParametersChimeric.h , C/C++, 41 lines - source/
ParametersChimeric_initi , C++, 118 linesalize.cpp - source/
ParametersClip.h , C/C++, 37 lines - source/
ParametersClip_initializ , C++, 107 linese.cpp - source/
ParametersGenome.cpp , C++, 59 lines - source/
ParametersGenome.h , C/C++, 63 lines - source/
ParametersSolo.cpp , C++, 721 lines - source/
ParametersSolo.h , C/C++, 220 lines - source/
Parameters_closeReadsFil , C++, 12 lineses.cpp - source/
Parameters_openReadsFile , C++, 111 liness.cpp - source/
Parameters_readFilesInit , C++, 167 lines.cpp - source/
Parameters_readSAMheader , C++, 44 lines.cpp - source/
Parameters_samAttributes , C++, 263 lines.cpp - source/
Quantifications.cpp , C++, 37 lines - source/
Quantifications.h , C/C++, 22 lines - source/
ReadAlign.cpp , C++, 125 lines - source/
ReadAlign.h , C/C++, 239 lines - source/
ReadAlignChunk.cpp , C++, 170 lines - source/
ReadAlignChunk.h , C/C++, 49 lines - source/
ReadAlignChunk_mapChunk. , C++, 128 linescpp - source/
ReadAlignChunk_processCh , C++, 302 linesunks.cpp - source/
ReadAlign_CIGAR.cpp , C++, 62 lines - source/
ReadAlign_alignBAM.cpp , C++, 614 lines - source/
ReadAlign_assignAlignToW , C++, 130 linesindow.cpp - source/
ReadAlign_calcCIGAR.cpp , C++, 58 lines - source/
ReadAlign_chimericDetect , C++, 57 linesion.cpp - source/
ReadAlign_chimericDetect , C++, 312 linesionOld.cpp - source/
ReadAlign_chimericDetect , C++, 74 linesionOldOutput.cpp - source/
ReadAlign_chimericDetect , C++, 39 linesionPEmerged.cpp - source/
ReadAlign_createExtendWi , C++, 85 linesndowsWithAlign.cpp - source/
ReadAlign_mapOneRead.cpp , C++, 118 lines - source/
ReadAlign_mapOneReadSpli , C++, 40 linesceGraph.cpp - source/
ReadAlign_mappedFilter.c , C++, 21 linespp - source/
ReadAlign_maxMappableLen , C++, 115 linesgth2strands.cpp - source/
ReadAlign_multMapSelect. , C++, 95 linescpp - source/
ReadAlign_oneRead.cpp , C++, 124 lines - source/
ReadAlign_outputAlignmen , C++, 325 linests.cpp - source/
ReadAlign_outputSpliceGr , C++, 164 linesaphSAM.cpp - source/
ReadAlign_outputTranscri , C++, 65 linesptCIGARp.cpp - source/
ReadAlign_outputTranscri , C++, 359 linesptSAM.cpp - source/
ReadAlign_outputTranscri , C++, 56 linesptSJ.cpp - source/
ReadAlign_outputVariatio , C++, 13 linesn.cpp - source/
ReadAlign_peOverlapMerge , C++, 368 linesMap.cpp - source/
ReadAlign_quantTranscrip , C++, 91 linestome.cpp - source/
ReadAlign_stitchPieces.c , C++, 350 linespp - source/
ReadAlign_stitchWindowSe , C++, 278 lineseds.cpp - source/
ReadAlign_storeAligns.cp , C++, 160 linesp - source/
ReadAlign_transformGenom , C++, 74 linese.cpp - source/
ReadAlign_waspMap.cpp , C++, 128 lines - source/
ReadAnnotations.h , C/C++, 47 lines - source/
STAR.cpp , C++, 313 lines - source/
SequenceFuns.cpp , C++, 445 lines - source/
SequenceFuns.h , C/C++, 32 lines - source/
SharedMemory.cpp , C++, 291 lines - source/
SharedMemory.h , C/C++, 182 lines - source/
SimpleGoodTuring/ , C/C++, 300 linessgt.h - source/
SjdbClass.h , C/C++, 17 lines - source/
Solo.cpp , C++, 91 lines - source/
Solo.h , C/C++, 30 lines - source/
SoloBarcode.cpp , C++, 152 lines - source/
SoloBarcode.h , C/C++, 38 lines - source/
SoloBarcode_extractBarco , C++, 34 linesde.cpp - source/
SoloCommon.h , C/C++, 80 lines - source/
SoloFeature.cpp , C++, 65 lines - source/
SoloFeature.h , C/C++, 110 lines - source/
SoloFeatureTypes.h , C/C++, 12 lines - source/
SoloFeature_addBAMtags.c , C++, 26 linespp - source/
SoloFeature_cellFilterin , C++, 131 linesg.cpp - source/
SoloFeature_collapseUMI_ , C++, 172 linesGraph.cpp - source/
SoloFeature_collapseUMIa , C++, 658 linesll.cpp - source/
SoloFeature_countCBgeneU , C++, 112 linesMI.cpp - source/
SoloFeature_countSmartSe , C++, 159 linesq.cpp - source/
SoloFeature_countVelocyt , C++, 166 lineso.cpp - source/
SoloFeature_emptyDrops_C , C++, 231 linesR.cpp - source/
SoloFeature_loadRawMatri , C++, 141 linesx.cpp - source/
SoloFeature_outputResult , C++, 241 liness.cpp - source/
SoloFeature_processRecor , C++, 87 linesds.cpp - source/
SoloFeature_quantTranscr , C++, 327 linesipt.cpp - source/
SoloFeature_redistribute , C++, 80 linesReadsByCB.cpp - source/
SoloFeature_statsOutput. , C++, 123 linescpp - source/
SoloFeature_sumThreads.c , C++, 101 linespp - source/
SoloFilteredCells.h , C/C++, 33 lines - source/
SoloRead.cpp , C++, 22 lines - source/
SoloRead.h , C/C++, 23 lines - source/
SoloReadBarcode.cpp , C++, 51 lines - source/
SoloReadBarcode.h , C/C++, 46 lines - source/
SoloReadBarcodeStats.h , C/C++, 27 lines - source/
SoloReadBarcode_getCBand , C++, 429 linesUMI.cpp - source/
SoloReadFeature.cpp , C++, 63 lines - source/
SoloReadFeature.h , C/C++, 50 lines - source/
SoloReadFeatureStats.h , C/C++, 49 lines - source/
SoloReadFeature_inputRec , C++, 172 linesords.cpp - source/
SoloReadFeature_record.c , C++, 276 linespp - source/
SoloRead_record.cpp , C++, 15 lines - source/
SpliceGraph.cpp , C++, 33 lines - source/
SpliceGraph.h , C/C++, 58 lines - source/
SpliceGraph_findSuperTr. , C++, 186 linescpp - source/
SpliceGraph_swScoreSplic , C++, 249 linesed.cpp - source/
SpliceGraph_swTraceBack. , C++, 19 linescpp - source/
Stats.cpp , C++, 156 lines - source/
Stats.h , C/C++, 41 lines - source/
SuffixArrayFuns.cpp , C++, 410 lines - source/
SuffixArrayFuns.h , C/C++, 18 lines - source/
SuperTranscriptome.cpp , C++, 92 lines - source/
SuperTranscriptome.h , C/C++, 42 lines - source/
ThreadControl.cpp , C++, 7 lines - source/
ThreadControl.h , C/C++, 29 lines - source/
TimeFunctions.cpp , C++, 20 lines - source/
TimeFunctions.h , C/C++, 9 lines - source/
Transcript.cpp , C++, 59 lines - source/
Transcript.h , C/C++, 83 lines - source/
Transcript_alignScore.cp , C++, 60 linesp - source/
Transcript_convertGenome , C++, 161 linesCigar.cpp - source/
Transcript_generateCigar , C++, 63 linesP.cpp - source/
Transcript_transformGeno , C++, 167 linesme.cpp - source/
Transcript_variationAdju , C++, 74 linesst.cpp - source/
Transcript_variationOutp , C++, 6 linesut.cpp - source/
Transcriptome.cpp , C++, 190 lines - source/
Transcriptome.h , C/C++, 63 lines - source/
Transcriptome_alignExonO , C++, 278 linesverlap.cpp - source/
Transcriptome_classifyAl , C++, 267 linesign.cpp - source/
Transcriptome_geneCounts , C++, 63 linesAddAlign.cpp - source/
Transcriptome_geneFullAl , C++, 56 linesignOverlap.cpp - source/
Transcriptome_geneFullAl , C++, 43 linesignOverlap_ExonOverIntro n.cpp - source/
Transcriptome_quantAlign , C++, 114 lines.cpp - source/
Variation.cpp , C++, 157 lines - source/
Variation.h , C/C++, 53 lines - source/
bamRemoveDuplicates.cpp , C++, 271 lines - source/
bamRemoveDuplicates.h , C/C++, 10 lines - source/
bamSortByCoordinate.cpp , C++, 97 lines - source/
bamSortByCoordinate.h , C/C++, 11 lines - source/
bam_cat.c , C, 143 lines - source/
bam_cat.h , C/C++, 8 lines - source/
binarySearch2.cpp , C++, 43 lines - source/
binarySearch2.h , C/C++, 7 lines - source/
blocksOverlap.cpp , C++, 41 lines - source/
blocksOverlap.h , C/C++, 10 lines - source/
extendAlign.cpp , C++, 93 lines - source/
extendAlign.h , C/C++, 6 lines - source/
funCompareUintAndSuffixe , C++, 40 liness.cpp - source/
funCompareUintAndSuffixe , C/C++, 11 liness.h - source/
funCompareUintAndSuffixe , C++, 33 linessMemcmp.cpp - source/
funCompareUintAndSuffixe , C/C++, 10 linessMemcmp.h - source/
funPrimaryAlignMark.cpp , C++, 43 lines - source/
funPrimaryAlignMark.h , C/C++, 5 lines - source/
genomeGenerate.h , C/C++, 4 lines - source/
genomeParametersWrite.cp , C++, 45 linesp - source/
genomeParametersWrite.h , C/C++, 9 lines - source/
genomeSAindex.cpp , C++, 217 lines - source/
genomeSAindex.h , C/C++, 11 lines - source/
genomeScanFastaFiles.cpp , C++, 92 lines - source/
genomeScanFastaFiles.h , C/C++, 10 lines - source/
htslib/ , C, 1,085 linesbgzf.c - source/
htslib/ , C, 283 linesbgzip.c - source/
htslib/ , C/C++, 3 linesconfig.h - source/
htslib/ , C/C++, 66 linescram/ cram.h - source/
htslib/ , C, 1,764 linescram/ cram_codecs.c - source/
htslib/ , C/C++, 155 linescram/ cram_codecs.h - source/
htslib/ , C, 2,138 linescram/ cram_decode.c - source/
htslib/ , C/C++, 112 linescram/ cram_decode.h - source/
htslib/ , C, 2,630 linescram/ cram_encode.c - source/
htslib/ , C/C++, 105 linescram/ cram_encode.h - source/
htslib/ , C, 503 linescram/ cram_index.c - source/
htslib/ , C/C++, 98 linescram/ cram_index.h - source/
htslib/ , C, 3,652 linescram/ cram_io.c - source/
htslib/ , C/C++, 532 linescram/ cram_io.h - source/
htslib/ , C, 144 linescram/ cram_samtools.c - source/
htslib/ , C/C++, 97 linescram/ cram_samtools.h - source/
htslib/ , C, 357 linescram/ cram_stats.c - source/
htslib/ , C/C++, 59 linescram/ cram_stats.h - source/
htslib/ , C/C++, 752 linescram/ cram_structs.h - source/
htslib/ , C, 76 linescram/ files.c - source/
htslib/ , C, 634 linescram/ mFILE.c - source/
htslib/ , C/C++, 88 linescram/ mFILE.h - source/
htslib/ , C, 295 linescram/ md5.c - source/
htslib/ , C/C++, 54 linescram/ md5.h - source/
htslib/ , C/C++, 110 linescram/ misc.h - source/
htslib/ , C, 386 linescram/ open_trace_file.c - source/
htslib/ , C/C++, 115 linescram/ open_trace_file.h - source/
htslib/ , C/C++, 306 linescram/ os.h - source/
htslib/ , C, 170 linescram/ pooled_alloc.c - source/
htslib/ , C/C++, 56 linescram/ pooled_alloc.h - source/
htslib/ , C, 1,222 linescram/ sam_header.c - source/
htslib/ , C/C++, 452 linescram/ sam_header.h - source/
htslib/ , C, 153 linescram/ string_alloc.c - source/
htslib/ , C/C++, 69 linescram/ string_alloc.h - source/
htslib/ , C, 713 linescram/ thread_pool.c - source/
htslib/ , C/C++, 197 linescram/ thread_pool.h - source/
htslib/ , C, 432 linescram/ vlen.c - source/
htslib/ , C/C++, 48 linescram/ vlen.h - source/
htslib/ , C, 185 linescram/ zfio.c - source/
htslib/ , C/C++, 54 linescram/ zfio.h - source/
htslib/ , C, 421 linesfaidx.c - source/
htslib/ , C, 526 lineshfile.c - source/
htslib/ , C/C++, 75 lineshfile_internal.h - source/
htslib/ , C, 99 lineshfile_net.c - source/
htslib/ , C, 1,326 lineshts.c - source/
htslib/ , C/C++, 313 lineshtslib/ bgzf.h - source/
htslib/ , C/C++, 112 lineshtslib/ faidx.h - source/
htslib/ , C/C++, 204 lineshtslib/ hfile.h - source/
htslib/ , C/C++, 305 lineshtslib/ hts.h - source/
htslib/ , C/C++, 47 lineshtslib/ hts_defs.h - source/
htslib/ , C/C++, 49 lineshtslib/ kfunc.h - source/
htslib/ , C/C++, 617 lineshtslib/ khash.h - source/
htslib/ , C/C++, 98 lineshtslib/ khash_str2int.h - source/
htslib/ , C/C++, 121 lineshtslib/ klist.h - source/
htslib/ , C/C++, 75 lineshtslib/ knetfile.h - source/
htslib/ , C/C++, 253 lineshtslib/ kseq.h - source/
htslib/ , C/C++, 285 lineshtslib/ ksort.h - source/
htslib/ , C/C++, 64 lineshtslib/ kstdint.h - source/
htslib/ , C/C++, 270 lineshtslib/ kstring.h - source/
htslib/ , C/C++, 401 lineshtslib/ sam.h - source/
htslib/ , C/C++, 255 lineshtslib/ synced_bcf_reader.h - source/
htslib/ , C/C++, 52 lineshtslib/ tbx.h - source/
htslib/ , C/C++, 824 lineshtslib/ vcf.h - source/
htslib/ , C/C++, 15 lineshtslib/ vcf_sweep.h - source/
htslib/ , C/C++, 94 lineshtslib/ vcfutils.h - source/
htslib/ , C, 254 lineskfunc.c - source/
htslib/ , C, 622 linesknetfile.c - source/
htslib/ , C, 229 lineskstring.c - source/
htslib/ , C, 1,797 linessam.c - source/
htslib/ , C, 1,183 linessynced_bcf_reader.c - source/
htslib/ , C, 374 linestabix.c - source/
htslib/ , C, 290 linestbx.c - source/
htslib/ , C, 2,967 linesvcf.c - source/
htslib/ , C, 158 linesvcf_sweep.c - source/
htslib/ , C, 642 linesvcfutils.c - source/
insertSeqSA.cpp , C++, 319 lines - source/
insertSeqSA.h , C/C++, 11 lines - source/
mapThreadsSpawn.cpp , C++, 33 lines - source/
mapThreadsSpawn.h , C/C++, 7 lines - source/
opal/ , C++, 1,568 linesopal.cpp - source/
opal/ , C/C++, 171 linesopal.h - source/
opal/ , C/C++, 5,590 linessimde_avx2.h - source/
outputSJ.cpp , C++, 163 lines - source/
outputSJ.h , C/C++, 4 lines - source/
readBarcodeLoad.h , C/C++, 9 lines - source/
readLoad.cpp , C++, 100 lines - source/
readLoad.h , C/C++, 12 lines - source/
samHeaders.cpp , C++, 108 lines - source/
samHeaders.h , C/C++, 10 lines - source/
serviceFuns.cpp , C++, 351 lines - source/
signalFromBAM.cpp , C++, 209 lines - source/
signalFromBAM.h , C/C++, 13 lines - source/
sjAlignSplit.cpp , C++, 15 lines - source/
sjAlignSplit.h , C/C++, 9 lines - source/
sjdbBuildIndex.cpp , C++, 333 lines - source/
sjdbBuildIndex.h , C/C++, 10 lines - source/
sjdbInsertJunctions.cpp , C++, 102 lines - source/
sjdbInsertJunctions.h , C/C++, 10 lines - source/
sjdbLoadFromFiles.cpp , C++, 27 lines - source/
sjdbLoadFromFiles.h , C/C++, 10 lines - source/
sjdbLoadFromStream.cpp , C++, 29 lines - source/
sjdbLoadFromStream.h , C/C++, 8 lines - source/
sjdbPrepare.cpp , C++, 225 lines - source/
sjdbPrepare.h , C/C++, 10 lines - source/
soloInputFeatureUMI.cpp , C++, 44 lines - source/
soloInputFeatureUMI.h , C/C++, 13 lines - source/
sortSuffixesBucket.h , C/C++, 3 lines - source/
stitchAlignToTranscript. , C++, 415 linescpp - source/
stitchAlignToTranscript. , C/C++, 7 linesh - source/
stitchGapIndel.cpp , C++, 59 lines - source/
stitchWindowAligns.cpp , C++, 355 lines - source/
stitchWindowAligns.h , C/C++, 12 lines - source/
streamFuns.cpp , C++, 149 lines - source/
streamFuns.h , C/C++, 17 lines - source/
stringSubstituteAll.cpp , C++, 10 lines - source/
stringSubstituteAll.h , C/C++, 8 lines - source/
sysRemoveDir.cpp , C++, 28 lines - source/
sysRemoveDir.h , C/C++, 8 lines - source/
systemFunctions.cpp , C++, 27 lines - source/
systemFunctions.h , C/C++, 6 lines - source/
twoPassRunPass1.cpp , C++, 97 lines - source/
twoPassRunPass1.h , C/C++, 11 lines - LICENSE, License, 21 lines
- README.md, Text, 115 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:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 369 scripts, each with its path and the digest of its content;
- 17 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
No dataset and no data link were found in the paper.
Data and code availability
All data necessary for the conclusions of the study are provided with the article. sc/
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Publisher: n/a → Elsevier BV
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 24 authors, 10 keywords, 7 MeSH terms, 6 funders, 101 references, 32 RRIDs.
Cite
This paper
Abay-Nørgaard, Z., Mueller, A. K., Hänninen, E., Rausch, D., Piilgaard, L., Trujillo, L. S., Fedrizzi, L., Christensen, J. B., Salvador, A., Schörling, A. L., Mottelson, N. W., Qin, Q., Sampath, S., Hersbach, B., Henkenjohann, J., Peeters, S., Nikulina, V., Kruse, C. H., Li, Y., . . . Kirkeby, A. (2026). Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells. Cell stem cell, 33(7), 1174-1190.e11. https://
BibTeX
@article{abaynrgaard2026
author = {Abay-Nørgaard, Zehra and Mueller, Anika K. and Hänninen, Erno and Rausch, Dylan and Piilgaard, Louise and Trujillo, Lucía Sena and Fedrizzi, Lorenzo and Christensen, Jens Bager and Salvador, Alison and Schörling, Alrik L. and Mottelson, Noah Wulff and Qin, Qiuyu and Sampath, Shruthi and Hersbach, Bob and Henkenjohann, Jonas and Peeters, Sofie and Nikulina, Viktoriia and Kruse, Charlotte Høy and Li, Yuan and Chinnaiya, Kavitha and Placzek, Marysia and Kajtez, Janko and Pers, Tune H. and Kirkeby, Agnete},
title = {{Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells}},
journal = {Cell stem cell},
year = {2026},
month = jun,
volume = {33},
number = {7},
pages = {1174--1190.e11},
publisher = {Elsevier BV},
issn = {1934-5909},
doi = {10.1016/
url = {https://
pmid = {42259293},
pmcid = {PMC13353052}
}
RIS
TY - JOUR
AU - Abay-Nørgaard, Zehra
AU - Mueller, Anika K.
AU - Hänninen, Erno
AU - Rausch, Dylan
AU - Piilgaard, Louise
AU - Trujillo, Lucía Sena
AU - Fedrizzi, Lorenzo
AU - Christensen, Jens Bager
AU - Salvador, Alison
AU - Schörling, Alrik L.
AU - Mottelson, Noah Wulff
AU - Qin, Qiuyu
AU - Sampath, Shruthi
AU - Hersbach, Bob
AU - Henkenjohann, Jonas
AU - Peeters, Sofie
AU - Nikulina, Viktoriia
AU - Kruse, Charlotte Høy
AU - Li, Yuan
AU - Chinnaiya, Kavitha
AU - Placzek, Marysia
AU - Kajtez, Janko
AU - Pers, Tune H.
AU - Kirkeby, Agnete
TI - Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells
T2 - Cell stem cell
J2 - Cell Stem Cell
PY - 2026
DA - 2026/
VL - 33
IS - 7
SP - 1174
EP - 1190.e11
SN - 1934-5909
PB - Elsevier BV
DO - 10.1016/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1016/
"type": "article-journal",
"title": "Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells",
"container-title": "Cell stem cell",
"author": [
{
"family": "Abay-Nørgaard",
"given": "Zehra"
},
{
"family": "Mueller",
"given": "Anika K."
},
{
"family": "Hänninen",
"given": "Erno"
},
{
"family": "Rausch",
"given": "Dylan"
},
{
"family": "Piilgaard",
"given": "Louise"
},
{
"family": "Trujillo",
"given": "Lucía Sena"
},
{
"family": "Fedrizzi",
"given": "Lorenzo"
},
{
"family": "Christensen",
"given": "Jens Bager"
},
{
"family": "Salvador",
"given": "Alison"
},
{
"family": "Schörling",
"given": "Alrik L."
},
{
"family": "Mottelson",
"given": "Noah Wulff"
},
{
"family": "Qin",
"given": "Qiuyu"
},
{
"family": "Sampath",
"given": "Shruthi"
},
{
"family": "Hersbach",
"given": "Bob"
},
{
"family": "Henkenjohann",
"given": "Jonas"
},
{
"family": "Peeters",
"given": "Sofie"
},
{
"family": "Nikulina",
"given": "Viktoriia"
},
{
"family": "Kruse",
"given": "Charlotte Høy"
},
{
"family": "Li",
"given": "Yuan"
},
{
"family": "Chinnaiya",
"given": "Kavitha"
},
{
"family": "Placzek",
"given": "Marysia"
},
{
"family": "Kajtez",
"given": "Janko"
},
{
"family": "Pers",
"given": "Tune H."
},
{
"family": "Kirkeby",
"given": "Agnete"
}
],
"container-title-short":
"volume": "33",
"issue": "7",
"page": "1174-1190.e11",
"DOI": "10.1016/
"PMID": "42259293",
"PMCID": "PMC13353052",
"ISSN": "1934-5909",
"publisher": "Elsevier BV",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
8
]
]
}
}
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.1016/j.stemcr.2026.102958 [code]
- Scalable hypothalamic neuron differentiation from human pluripotent stem cells suitable for modeling metabolic disorders.Journal: Stem cell reportsIn common: cellular / molecular, 22 references
- [2] 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: rpy2, Monocle 3, SingleCellExperiment, 16 other tools, cellular / molecular, 4 references
- [3] doi:10.1016/j.isci.2026.116055 [code]
- Mapping the transcriptional diversity of calcium signaling in the mouse and human brain.Journal: iScienceIn common: Squidpy, rpy2, Monocle 3, 14 other tools, 3 references
- [4] doi:10.1186/s13059-026-04177-w [code]
- Genomic sequence evolution underlying human neocortical interareal diversification.Journal: Genome biologyIn common: Squidpy, Monocle 3, anndata, 13 other tools, cellular / molecular, 3 references
- [5] doi:10.1002/imt2.70163 [code]
- Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.Journal: iMetaIn common: Monocle 3, SingleCellExperiment, edgeR, 15 other tools, cellular / molecular
- [6] 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: rpy2, SingleCellExperiment, edgeR, 14 other tools, 1 reference
- [7] doi:10.1038/s41592-026-03194-8 [code]
- Beyond benchmarking: an expert-guided consensus approach to spatially aware clustering.Journal: Nature methodsIn common: Squidpy, rpy2, SingleCellExperiment, 13 other tools, 1 reference
- [8] doi:10.1038/s44318-026-00818-9 [code]
- FAM134B-mediated ER-phagy degrades APP and suppresses Alzheimer's disease pathology.Journal: The EMBO journalIn common: Monocle 3, SingleCellExperiment, anndata, 14 other tools, cellular / molecular
- [9] doi:10.1016/j.cell.2026.05.026 [code]
- The critical role of the endogenous immune compartment after CAR T cell therapy in recurrent GBM.Journal: CellIn common: SingleCellExperiment, edgeR, anndata, 12 other tools, 3 references
- [10] doi:10.1126/sciadv.aed2952 [code]
- Activation of transposable elements is linked to a region- and cell type-specific interferon response in Parkinson's disease.Journal: Science advancesIn common: anndata, Scanpy, Seurat, 9 other tools, cellular / molecular, 2 references, author Agnete Kirkeby
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: 3 repositories of the authors' code, each at its verified commit and with its license, 369 scripts, and 17 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:7ae0c821551d0474…
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.
