Arrayed single-gene perturbations identify drivers of human anterior neural tube closure.
The 8 matches
- [1] § Results › A reproducible in vitro model of human anterior neurulation ↔ GA_analysis_2_clustering_day2_week4_ectoderm.ipynb, lines 253–257 · score 0.71 · TFAP2A, ZEB1, SIX1, GATA3, ZEB2, DLX5
- [2] § Methods › Quantification of transduction efficiency ↔ CA_transduction_efficiency_analysis.py, lines 200–348 · score 0.60 · Transduction efficiency, Ilastik, pixel, channel, Circle, background
- [3] § Methods › scRNA-seq analysis of Day 2 and 4 organoids and Week 3 and 4 human embryos ↔ RH291_analysis_5a_phenotypes_on_saved_PCA.ipynb, lines 348–381 · score 0.58 · principal component, pca, ARPACK, solver, Louvain, neighbors
- [4] § Results › A high-throughput genetic screen of anterior neurulation reveals three transcription factors necessary for proper neural tube closure ↔ RH291_analysis_1_merging_guide_calls.ipynb, lines 107–186 · score 0.58 · POU3F1, TOX3, TGIF1, ZFHX4, GLI3, LHX2
- [5] § Results › Identifying transcription factor candidates for regulation of anterior neurulation ↔ RH296_analysis_7_choosing candidates.ipynb, lines 287–329 · score 0.56 · downregulated genes, fold change, candidate, log2, threshold, regulatory
- [6] § Results › A high-throughput genetic screen of anterior neurulation reveals three transcription factors necessary for proper neural tube closure ↔ JC_hdWGCNA.R, lines 86–139 · score 0.52 · Module eigengene, neural cell, WGCNA, neural ectoderm, dendrogram, knockdown
- [7] § Results › A high-throughput genetic screen of anterior neurulation reveals three transcription factors necessary for proper neural tube closure ↔ JC_3_ClusterProfiler_Annotation.R, lines 166–248 · score 0.51 · co expressed, neural cell, WGCNA, modules, Scatterplots, bar
- [8] § Results › A high-throughput genetic screen of anterior neurulation reveals three transcription factors necessary for proper neural tube closure ↔ RH291_analysis_1_merging_guide_calls.ipynb, lines 107–186 · score 0.51 · POU3F2, SP5, TGIF1, ZFHX4, MSX1, PAX3
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 · 355 lines · 13 KB · MIT · 2 matches
- # %% [markdown]
- # # Merging "protospacer_calls_per_cell" with "filtered_matrix" hdf5 file
- # %% [markdown]
- # ## 1. Import packages
- # %%
- # Import all the packages
- import h5py
- from pathlib import Path
- import numpy as np
- import pandas as pd
- from scipy.io import mmread, mmwrite
- from scipy.sparse import load_npz, save_npz, coo_matrix, csr_matrix, vstack
- from scipy.ndimage import gaussian_filter1d
- from scipy.stats import binned_statistic
- import matplotlib.pyplot as plt
- import matplotlib as mpl
- import ray
- import seaborn as sns
- #import fastcluster
- import seaborn as sns
- #import hdf5plugin
- COLOR = 'black'
- mpl.rcParams['text.color'] = COLOR
- mpl.rcParams['axes.labelcolor'] = COLOR
- mpl.rcParams['xtick.color'] = COLOR
- mpl.rcParams['ytick.color'] = COLOR
- import scanpy as sc
- #import louvain
- #import leidenalg
- #import anndata as ad
- import sys
- sys.setrecursionlimit(100000)
- # Set scanpy save settings
- sc._settings.ScanpyConfig.dpi_save = 300
- sc._settings.ScanpyConfig.file_format_figs = 'png'
- # %% [markdown]
- # ## 2. Prepare guide call dataframe
- # %%
- # Load CRISPR guide and count data into dataframes
- barcode_282_data = pd.read_csv('../data/RH282_protospacer_calls_per_cell.csv')
- print('RH282 protospacer calls shape:', barcode_282_data.shape[0])
- barcode_284_data = pd.read_csv('../data/RH284_protospacer_calls_per_cell.csv')
- print('RH284 protospacer calls shape:', barcode_284_data.shape[0])
- # Delete any rows with more than two features
- barcode_282_data = barcode_282_data[barcode_282_data['num_features'] < 3]
- print('RH282 protospacer calls, < 3 features:', barcode_282_data.shape[0])
- barcode_284_data = barcode_284_data[barcode_284_data['num_features'] < 3]
- print('RH284 protospacer calls, < 3 features:', barcode_284_data.shape[0])
- print(barcode_284_data.shape)
- # %%
- # Add together counts from cells with two guide calls
- #RH282
- barcode_282_data['first_count'] = np.nan
- barcode_282_data['second_count'] = np.nan
- barcode_282_data['final_count'] = np.nan
- # Do NOT loop through a range here. That will call the wrong indices for the truncated dataframe.
- for i in barcode_282_data.index:
- # Do not use iloc here. That is for integer indexing. Here we want to use the label indexing.
- s = barcode_282_data['num_umis'].loc[i]
- # If there are no bars, the final count is the single guide count
- if s.count('|') == 0:
- barcode_282_data.at[i,'final_count'] = float(s)
- # If there is one bar, the final count is the dual guide count
- if s.count('|') == 1:
- bar_idx = int(s.find('|'))
- first_count = float(s[0:bar_idx])
- second_count = float(s[bar_idx+1:len(s)])
- barcode_282_data.at[i,'first_count'] = first_count
- barcode_282_data.at[i, 'second_count'] = second_count
- barcode_282_data.at[i,'final_count']= first_count + second_count
- #RH284
- barcode_284_data['first_count'] = np.nan
- barcode_284_data['second_count'] = np.nan
- barcode_284_data['final_count'] = np.nan
- # Do NOT loop through a range here. That will call the wrong indices for the truncated dataframe.
- for i in barcode_284_data.index:
- # Do not use iloc here. That is for integer indexing. Here we want to use the label indexing.
- s = barcode_284_data['num_umis'].loc[i]
- # If there are no bars, the final count is the single guide count
- if s.count('|') == 0:
- barcode_284_data.at[i,'final_count'] = float(s)
- # If there is one bar, the final count is the dual guide count
- if s.count('|') == 1:
- bar_idx = int(s.find('|'))
- first_count = float(s[0:bar_idx])
- second_count = float(s[bar_idx+1:len(s)])
- barcode_284_data.at[i,'first_count'] = first_count
- barcode_284_data.at[i,'second_count'] = second_count
- barcode_284_data.at[i,'final_count']= first_count + second_count
- # %%
- # Merge guide calls
- #RH282
- barcode_282_data['guide'] = np.nan
- for i in barcode_282_data.index:
- s = barcode_282_data['feature_call'].loc[i]
- if s == 'SOX11-1' or s == 'SOX11-2' or s == 'SOX11-1|SOX11-2' or s == 'SOX11-2|SOX11-1':
- barcode_282_data.at[i,'guide'] = 'SOX11'
- if s == 'ZIC5-1' or s == 'ZIC5-2' or s == 'ZIC5-1|ZIC5-2' or s == 'ZIC5-2|ZIC5-1':
- barcode_282_data.at[i,'guide'] = 'ZIC5'
- if s == 'ZNF521-1' or s == 'ZNF521-2' or s == 'ZNF521-1|ZNF521-2' or s == 'ZNF521-2|ZNF521-1':
- barcode_282_data.at[i,'guide'] = 'ZNF521'
- if s == 'SCRAMBLE2-1' or s == 'SCRAMBLE2-2' or s == 'SCRAMBLE2-1|SCRAMBLE2-2' or s == 'SCRAMBLE2-2|SCRAMBLE2-1':
- barcode_282_data.at[i,'guide'] = 'SCRAMBLE2a'
- #RH284
- barcode_284_data['guide'] = np.nan
- for i in barcode_284_data.index:
- s = barcode_284_data['feature_call'].loc[i]
- if s == 'SCRAMBLE2-1' or s == 'SCRAMBLE2-2' or s == 'SCRAMBLE2-1|SCRAMBLE2-2' or s == 'SCRAMBLE2-2|SCRAMBLE2-1':
- barcode_284_data.at[i,'guide'] = 'SCRAMBLE2b'
- if s == 'ZIC2-1' or s == 'ZIC2-2' or s == 'ZIC2-1|ZIC2-2' or s == 'ZIC2-2|ZIC2-1':
- barcode_284_data.at[i,'guide'] = 'ZIC2'
- if s == 'HES4-1' or s == 'HES4-2' or s == 'HES4-1|HES4-2' or s == 'HES4-2|HES4-1':
- barcode_284_data.at[i,'guide'] = 'HES4'
- if s == 'HES5-1' or s == 'HES5-2' or s == 'HES5-1|HES5-2' or s == 'HES5-2|HES5-1':
- barcode_284_data.at[i,'guide'] = 'HES5'
- if s == 'GLI3-1' or s == 'GLI3-2' or s == 'GLI3-1|GLI3-2' or s == 'GLI3-2|GLI3-1':
- barcode_284_data.at[i,'guide'] = 'GLI3'
- if s == 'LHX2-1' or s == 'LHX2-2' or s == 'LHX2-1|LHX2-2' or s == 'LHX2-2|LHX2-1':
- barcode_284_data.at[i,'guide'] = 'LHX2'
- if s == 'MSX1-1' or s == 'MSX1-2' or s == 'MSX1-1|MSX1-2' or s == 'MSX1-2|MSX1-1':
- barcode_284_data.at[i,'guide'] = 'MSX1'
- if s == 'NR6A1-1' or s == 'NR6A1-2' or s == 'NR6A1-1|NR6A1-2' or s == 'NR6A1-2|NR6A1-1':
- barcode_284_data.at[i,'guide'] = 'NR6A1'
- if s == 'OTX1-1' or s == 'OTX1-2' or s == 'OTX1-1|OTX1-2' or s == 'OTX1-2|OTX1-1':
- barcode_284_data.at[i,'guide'] = 'OTX1'
- if s == 'OTX2-1' or s == 'OTX2-2' or s == 'OTX2-1|OTX2-2' or s == 'OTX2-2|OTX2-1':
- barcode_284_data.at[i,'guide'] = 'OTX2'
- if s == 'PAX3-1' or s == 'PAX3-2' or s == 'PAX3-1|PAX3-2' or s == 'PAX3-2|PAX3-1':
- barcode_284_data.at[i,'guide'] = 'PAX3'
- if s == 'PAX6-1' or s == 'PAX6-2' or s == 'PAX6-1|PAX6-2' or s == 'PAX6-2|PAX6-1':
- barcode_284_data.at[i,'guide'] = 'PAX6'
- if s == 'PAX7-1' or s == 'PAX7-2' or s == 'PAX7-1|PAX7-2' or s == 'PAX7-2|PAX7-1':
- barcode_284_data.at[i,'guide'] = 'PAX7'
- if s == 'POU3F1-1' or s == 'POU3F1-2' or s == 'POU3F1-1|POU3F1-2' or s == 'POU3F1-2|POU3F1-1':
- barcode_284_data.at[i,'guide'] = 'POU3F1'
- if s == 'POU3F2-1' or s == 'POU3F2-2' or s == 'POU3F2-1|POU3F2-2' or s == 'POU3F2-2|POU3F2-1':
- barcode_284_data.at[i,'guide'] = 'POU3F2'
- if s == 'RAX1-1' or s == 'RAX1-2' or s == 'RAX1-1|RAX1-2' or s == 'RAX1-2|RAX1-1':
- barcode_284_data.at[i,'guide'] = 'RAX1'
- if s == 'SCRAMBLE1-1' or s == 'SCRAMBLE1-2' or s == 'SCRAMBLE1-1|SCRAMBLE1-2' or s == 'SCRAMBLE1-2|SCRAMBLE1-1':
- barcode_284_data.at[i,'guide'] = 'SCRAMBLE1'
- if s == 'SOX2-1' or s == 'SOX2-2' or s == 'SOX2-1|SOX2-2' or s == 'SOX2-2|SOX2-1':
- barcode_284_data.at[i,'guide'] = 'SOX2'
- if s == 'SOX3-1' or s == 'SOX3-2' or s == 'SOX3-1|SOX3-2' or s == 'SOX3-2|SOX3-1':
- barcode_284_data.at[i,'guide'] = 'SOX3'
- if s == 'SP5-1' or s == 'SP5-2' or s == 'SP5-1|SP5-2' or s == 'SP5-2|SP5-1':
- barcode_284_data.at[i,'guide'] = 'SP5'
- if s == 'TGIF1-1' or s == 'TGIF1-2' or s == 'TGIF1-1|TGIF1-2' or s == 'TGIF1-2|TGIF1-1':
- barcode_284_data.at[i,'guide'] = 'TGIF1'
- if s == 'TOX3-1' or s == 'TOX3-2' or s == 'TOX3-1|TOX3-2' or s == 'TOX3-2|TOX3-1':
- barcode_284_data.at[i,'guide'] = 'TOX3'
- if s == 'ZBTB16-1' or s == 'ZBTB16-2' or s == 'ZBTB16-1|ZBTB16-2' or s == 'ZBTB16-2|ZBTB16-1':
- barcode_284_data.at[i,'guide'] = 'ZBTB16'
- if s == 'ZEB2-1' or s == 'ZEB2-2' or s == 'ZEB2-1|ZEB2-2' or s == 'ZEB2-2|ZEB2-1':
- barcode_284_data.at[i,'guide'] = 'ZEB2'
- if s == 'ZFHX4-1' or s == 'ZFHX4-2' or s == 'ZFHX4-1|ZFHX4-2' or s == 'ZFHX4-2|ZFHX4-1':
- barcode_284_data.at[i,'guide'] = 'ZFHX4'
- # Drop mixed guide calls and cells with Tianlei's guides
- print(barcode_282_data.shape)
- print(barcode_284_data.shape)
- barcode_282_data.dropna(subset=['guide'], inplace=True)
- barcode_284_data.dropna(subset=['guide'], inplace=True)
- print(barcode_282_data.shape)
- print(barcode_284_data.shape)
- # %%
- # Store minimum dataframe
- barcode_282_data_min = barcode_282_data[['cell_barcode', 'guide', 'final_count']]
- barcode_284_data_min = barcode_284_data[['cell_barcode', 'guide', 'final_count']]
- # %%
- # Check that cell barcodes are all unique
- unique_values = barcode_282_data_min['cell_barcode'].unique()
- print(len(unique_values))
- unique_values = barcode_284_data_min['cell_barcode'].unique()
- print(len(unique_values))
- # %% [markdown]
- # ## 3. Merge guide calls and counts with cells_genes matrix; save as new AnnData
- # %%
- # Load the cells_by_genes data into scanpy as Anndata
- sample_282 = sc.read_10x_h5('../data/RH282_filtered_matrix.h5')
- sample_282.var_names_make_unique()
- print(sample_282)
- sample_284 = sc.read_10x_h5('../data/RH284_filtered_matrix.h5')
- sample_284.var_names_make_unique()
- print(sample_284)
- # %%
- # Extract cell barcodes from the cells_by_genes Anndata
- cell_ids_282 = pd.DataFrame()
- cell_ids_282['cell_barcode'] = sample_282.obs.index
- cell_ids_284 = pd.DataFrame()
- cell_ids_284['cell_barcode'] = sample_284.obs.index
- # Merge the guide calls and counts to the cell barcodes, keeping the order from Anndata
- merger_df_282 = cell_ids_282.merge(barcode_282_data_min, on='cell_barcode', how='left')
- merger_df_284 = cell_ids_284.merge(barcode_284_data_min, on='cell_barcode', how='left')
- # Re-index merger dataframes by cell barcode
- merger_df_282_reindexed = merger_df_282.set_index('cell_barcode')
- merger_df_284_reindexed = merger_df_284.set_index('cell_barcode')
- # Assign new observations to the Anndata
- sample_282.obs['guide'] = merger_df_282_reindexed['guide']
- sample_282.obs['guide_count'] = merger_df_282_reindexed['final_count']
- sample_284.obs['guide'] = merger_df_284_reindexed['guide']
- sample_284.obs['guide_count'] = merger_df_284_reindexed['final_count']
- print(sample_282)
- print(sample_284)
- # Write data to new anndata files
- #sample_282.write('../data/RH282_merged_matrix.h5')
- #sample_284.write('../data/RH284_merged_matrix.h5')
- # %%
- # Check number of cells with guides called
- RH282_num_guide_calls = pd.Series(sample_282.obs.guide)
- RH282_num_guide_calls = RH282_num_guide_calls.dropna()
- RH284_num_guide_calls = pd.Series(sample_284.obs.guide)
- RH284_num_guide_calls = RH284_num_guide_calls.dropna()
- print(len(RH282_num_guide_calls))
- print(len(RH284_num_guide_calls))
- # %%
- scramble_282 = sample_282[sample_282.obs['guide'].isin(['SCRAMBLE2a']),:]
- print('Number of scramble cells in RH282:', scramble_282.shape[0])
- # %% [markdown]
- # ## X. Count number of guide calls from sequence one or sequence 2 (no saving to dataframe here)
- # %%
- # Load CRISPR guide and count data into dataframes
- barcode_282_data = pd.read_csv('../data/RH282_protospacer_calls_per_cell.csv')
- print('RH282 protospacer calls shape:', barcode_282_data.shape[0])
- # Delete any rows with more than 2 features
- barcode_282_data = barcode_282_data[barcode_282_data['num_features'] < 3]
- print('RH282 protospacer calls, < 3 features:', barcode_282_data.shape[0])
- print(barcode_282_data['num_umis'].iloc[200])
- # %%
- # SOX11
- pos1_count = 0
- pos2_count = 0
- #pos1_only_calls = 0
- #pos2_only_calls = 0
- #pos12_calls = 0
- for i in barcode_282_data.index:
- calls = barcode_282_data['feature_call'].loc[i]
- counts = barcode_282_data['num_umis'].loc[i]
- if calls == 'SOX11-1':
- #pos1_only_calls = pos1_only_calls+1
- pos1_counts = pos1_count + float(counts)
- if calls == 'SOX11-2':
- #pos2_only_calls = pos2_only_calls+2
- pos2_counts = pos2_count + float(counts)
- if calls == 'SOX11-1|SOX11-2':
- #pos12_calls = pos12_calls+1
- #pos2_calls = pos2_calls+2
- bar_idx = int(counts.find('|'))
- first_count = float(counts[0:bar_idx])
- second_count = float(counts[bar_idx+1:len(counts)])
- pos1_count = pos1_count + first_count
- pos2_count = pos2_count + second_count
- if calls == 'SOX11-2|SOX11-1':
- #pos12_calls = pos12_calls+1
- #pos2_calls = pos2_calls+2
- bar_idx = int(counts.find('|'))
- first_count = float(counts[0:bar_idx])
- second_count = float(counts[bar_idx+1:len(counts)])
- pos1_count = pos1_count + second_count
- pos2_count = pos2_count + first_count
- #print(pos1_only_calls)
- #print(pos2_only_calls)
- #print(pos12_calls)
- print(pos1_count)
- print(pos2_count)
- # %%
- pos1_count = 0
- pos2_count = 0
- i = 200
- calls = barcode_282_data['feature_call'].loc[i]
- counts = barcode_282_data['num_umis'].loc[i]
- if calls == 'SCRAMBLE2-1':
- pos1_counts = pos1_count + float(counts)
- if calls == 'SCRAMBLE2-2':
- #pos2_only_calls = pos2_only_calls+2
- pos2_counts = pos2_count + float(counts)
- if calls == 'SCRAMBLE2-1|SCRAMBLE2-2':
- bar_idx = int(counts.find('|'))
- first_count = float(counts[0:bar_idx])
- second_count = float(counts[bar_idx+1:len(counts)])
- pos1_count = pos1_count + first_count
- pos2_count = pos2_count + second_count
- if calls == 'SCRAMBLE2-2|SCRAMBLE2-1':
- bar_idx = int(counts.find('|'))
- first_count = float(counts[0:bar_idx])
- second_count = float(counts[bar_idx+1:len(counts)])
- pos1_count = pos1_count + second_count
- pos2_count = pos2_count + first_count
- print(pos1_count)
- print(pos2_count)
- # %%
RH291_analysis_1_merging_guide_calls.ipynb at commit dd0c80b, under MIT · at the source
Overview
- Department of Stem Cell and Regenerative Biology, Harvard University Cambridge United States
- School of Engineering and Applied Sciences, Harvard University Cambridge United States
- Department of Molecular and Cellular Biology, Harvard University Cambridge United States
Abstract
Genetic studies of human embryonic morphogenesis are constrained by ethical and practical challenges, restricting insights into developmental mechanisms and disorders. Human pluripotent stem cell (hPSC)-derived organoids provide a powerful alternative for the study of embryonic morphogenesis. However, screening for genetic drivers of morphogenesis in vitro has been infeasible due to organoid variability and the high costs of performing scaled tissue-wide single-gene perturbations. By overcoming both these limitations, we developed a platform that integrates reproducible organoid morphogenesis with uniform single-gene perturbations, enabling high-throughput arrayed CRISPR interference screening in hPSC-derived organoids. To demonstrate the power of this platform, we screened 77 transcription factors in an organoid model of anterior neurulation to identify ZIC2, SOX11, and ZNF521 as essential regulators of neural tube closure. We discovered that ZIC2 and SOX11 are required for closure, while ZNF521 prevents ectopic closure points. Single-cell transcriptomic analysis of perturbed organoids revealed co-regulated gene targets of ZIC2 and SOX11 and an opposing role for ZNF521, suggesting that these transcription factors jointly govern a gene regulatory program driving neural tube closure in the anterior forebrain region. Our single-gene perturbation platform enables high-throughput genetic screening of in vitro models of human embryonic morphogenesis.
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.
royahuang/2026_HuangAnand
dd0c80ba3a29947a4e7f7d040f75d568f40936c6, 26 January 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
20 files
- CA_transduction_efficien
cy_analysis.py , Python, 377 lines, 1 match - GA_analysis_1_clustering
_week4.ipynb , Jupyter, 683 lines - GA_analysis_2_clustering
_day2_week4_ectoderm.ipy , Jupyter, 967 lines, 1 matchnb - GA_analysis_3_comparing_
day2_week4.ipynb , Jupyter, 791 lines - GA_plot_organoid_feature
s.ipynb , Jupyter, 43 lines - JC_1_Preprocessing_Clust
ering.R , R, 100 lines - JC_3_ClusterProfiler_Ann
otation.R , R, 249 lines, 1 match - JC_hdWGCNA.R, R, 216 lines, 1 match
- RH291_analysis_1_merging
_guide_calls.ipynb , Jupyter, 355 lines, 2 matches - RH291_analysis_2b_perfor
ming_SMD_on_RHTE_data.ip , Jupyter, 212 linesynb - RH291_analysis_3b_select
ing_RH_data_from_RHTE_da , Jupyter, 257 linesta.ipynb - RH291_analysis_4_perform
ing_SMD_on_RH_data.ipynb , Jupyter, 319 lines - RH291_analysis_5_selecti
ng_cell_types.ipynb , Jupyter, 287 lines - RH291_analysis_5a_phenot
ypes_on_saved_PCA.ipynb , Jupyter, 387 lines, 1 match - RH296_analysis_6b_analyz
ing_NE_expression.ipynb , Jupyter, 200 lines - RH296_analysis_6b_analyz
ing_NPB_expression.ipynb , Jupyter, 193 lines - RH296_analysis_6b_analyz
ing_SE_expression.ipynb , Jupyter, 197 lines - RH296_analysis_7_choosin
g candidates.ipynb , Jupyter, 928 lines, 1 match - LICENSE, License, 21 lines
- README.md, Text, 4 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;
- 18 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
- figshare:31151509, at figshare; found in “Data availability”
Data availability
Raw scRNA-seq data will remain unpublished to protect donor patient privacy, in accordance with Institutional Review Board (IRB) protocol and updated WiCell contract restrictions on publishing RNA sequences derived from human embryonic stem cells. Cell-by-gene count matrices from this paper are available at Figshare dataset 2026_HuangAnand (https://
The following dataset was generated:
HuangRE AnandGM MegaleHC ChenJ Abraham-IgweC RamanathanS 20262026_HuangAnandfigsh
The following previously published dataset was used:
LiuZ ZengB ZhongS WangX WuQ 2023The single-cell and spatial transcriptional landscape of human developmentNCBI Gene Expression OmnibusGSE155121
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, pages, dates, 6 authors, 6 keywords, 9 MeSH terms, 2 funders, 71 references, 11 RRIDs.
Cite
This paper
Huang, R. E., Anand, G. M., Megale, H. C., Chen, J., Abraham-Igwe, C., & Ramanathan, S. (2026). Arrayed single-gene perturbations identify drivers of human anterior neural tube closure. eLife, 14, RP108224. https://
BibTeX
@article{huang2026arraye
author = {Huang, Roya E and Anand, Giridhar M and Megale, Heitor C and Chen, Jason and Abraham-Igwe, Chudi and Ramanathan, Sharad},
title = {{Arrayed single-gene perturbations identify drivers of human anterior neural tube closure}},
journal = {eLife},
year = {2026},
month = jul,
volume = {14},
pages = {RP108224},
publisher = {eLife Sciences Publications, Ltd},
issn = {2050-084X},
doi = {10.7554/
url = {https://
pmid = {42411605},
pmcid = {PMC13341112}
}
RIS
TY - JOUR
AU - Huang, Roya E
AU - Anand, Giridhar M
AU - Megale, Heitor C
AU - Chen, Jason
AU - Abraham-Igwe, Chudi
AU - Ramanathan, Sharad
TI - Arrayed single-gene perturbations identify drivers of human anterior neural tube closure
T2 - eLife
J2 - Elife
PY - 2026
DA - 2026/
VL - 14
SP - RP108224
SN - 2050-084X
PB - eLife Sciences Publications, Ltd
DO - 10.7554/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.7554/
"type": "article-journal",
"title": "Arrayed single-gene perturbations identify drivers of human anterior neural tube closure",
"container-title": "eLife",
"author": [
{
"family": "Huang",
"given": "Roya E"
},
{
"family": "Anand",
"given": "Giridhar M"
},
{
"family": "Megale",
"given": "Heitor C"
},
{
"family": "Chen",
"given": "Jason"
},
{
"family": "Abraham-Igwe",
"given": "Chudi"
},
{
"family": "Ramanathan",
"given": "Sharad"
}
],
"container-title-short":
"volume": "14",
"page": "RP108224",
"DOI": "10.7554/
"PMID": "42411605",
"PMCID": "PMC13341112",
"ISSN": "2050-084X",
"publisher": "eLife Sciences Publications, Ltd",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
7
]
]
}
}
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.xcrm.2026.102766 [code]
- A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.Journal: Cell reports. MedicineIn common: WGCNA, anndata, clusterProfiler, 15 other tools, genetics / omics
- [2] doi:10.1038/s41467-026-76939-w [code]
- HIPPIE: a generative model for electrophysiological analysis across species, technologies, and modalities.Journal: Nature communicationsIn common: reticulate, anndata, Scanpy, 15 other tools
- [3] doi:10.1038/s41586-026-10629-x [code]
- Whole-genome duplication shaped cell-type evolution in the vertebrate brain.Journal: NatureIn common: reticulate, anndata, clusterProfiler, 14 other tools, genetics / omics
- [4] doi:10.1126/sciadv.aeg3223 [code]
- The extreme diversity of retinal amacrine cells has deep evolutionary roots.Journal: Science advancesIn common: WGCNA, reticulate, anndata, 13 other tools, genetics / omics
- [5] doi:10.1038/s41467-026-76675-1 [code]
- Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.Journal: Nature communicationsIn common: WGCNA, reticulate, anndata, 13 other tools, genetics / omics
- [6] doi:10.1038/s41586-026-10214-2 [code]
- Multidimensional profiling of heterogeneity in supratentorial ependymomas.Journal: NatureIn common: reticulate, anndata, clusterProfiler, 13 other tools, genetics / omics
- [7] doi:10.1038/s41467-026-71803-3 [code]
- Charting the transition from in vitro gliogenesis to the in vivo maturation of human glial progenitor cells transplanted into the hypomyelinated mouse brain.Journal: Nature communicationsIn common: reticulate, anndata, Scanpy, 13 other tools, genetics / omics
- [8] 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: anndata, clusterProfiler, Scanpy, 13 other tools, genetics / omics
- [9] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: WGCNA, reticulate, clusterProfiler, 13 other tools
- [10] doi:10.1093/bib/bbag175 [code]
- Uncovering causal relationships in single-cell omic studies with causarray.Journal: Briefings in bioinformaticsIn common: reticulate, anndata, clusterProfiler, 13 other tools
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, 18 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:15dbc91261eb3331…
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.
