OSCR

Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output.

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches
  1. [1] § Methods › Immunohistochemistry, RNAscope in situ hybridization, and confocal imaging ↔ 02_Data_Processing/Code_Replicate1.py, lines 264–275 · score 0.58 · Bcl11a, Pou6f2, Rnf220, Calb1, Sp8, St18
  2. [2] § Methods › Immunohistochemistry, RNAscope in situ hybridization, and confocal imaging ↔ 02_Data_Processing/Code_Replicate2.py, lines 242–253 · score 0.58 · Bcl11a, Pou6f2, Rnf220, Calb1, Sp8, St18
  3. [3] § Methods › Immunohistochemistry, RNAscope in situ hybridization, and confocal imaging ↔ 02_Data_Processing/Code_Replicate1.py, lines 264–275 · score 0.52 · Nr5a2, Pou6f2, Rnf220, Sp8, St18, Foxp2
  4. [4] § Methods › Immunohistochemistry, RNAscope in situ hybridization, and confocal imaging ↔ 02_Data_Processing/Code_Replicate2.py, lines 242–253 · score 0.52 · Nr5a2, Pou6f2, Rnf220, Sp8, St18, Foxp2
  5. [5] § Methods › snRNA-seq analysis › Data preprocessing and quality control ↔ 01_cellranger/CellRangerAutoScriptGFP.py, lines 5–17 · score 0.52 · force cells, CellRanger, mm10, RNA, transcripts

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

Python · 543 lines · 16 KB · MIT · 2 matches

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. # # P0 Het and Ko analysis Replicate 1
  4. # AT Updated 8/8/24
  5. # ## Section 1: Load in data and concatenate datasets if applicable
  6. # Import libraries
  7. import numpy as np
  8. import pandas as pd
  9. import scanpy as sc
  10. from sklearn.cluster import KMeans
  11. from sklearn.metrics import silhouette_score
  12. import matplotlib.pyplot as plt
  13. from scipy import stats
  14. import warnings
  15. warnings.filterwarnings("ignore") # suppress warnings
  16. get_ipython().run_line_magic('matplotlib', 'inline')
  17. sc.settings.verbosity = 3
  18. sc.logging.print_header()
  19. sc.settings.set_figure_params(format = "pdf", vector_friendly = False, dpi_save = 80, transparent = True)
  20. sc.set_figure_params(vector_friendly = False, format = "eps", dpi = 80, dpi_save = 80, transparent = True)
  21. plt.rcParams['svg.fonttype'] = 'none'
  22. results_file = 'write/P0KOR1.h5ad'
  23. # Read in control data from replicate 1
  24. adata_het = sc.read_10x_mtx('/Users/atrevisa/Desktop/KO_sc/ForceCells/P0HetR1_filtered_feature_bc_matrix',
  25. var_names='gene_symbols',cache=True)
  26. adata_het.var_names_make_unique()
  27. adata_het
  28. # Read in Ko data from replicate 1
  29. adata_ko = sc.read_10x_mtx('/Users/atrevisa/Desktop/KO_sc/ForceCells/P0KoR1_filtered_feature_bc_matrix',
  30. var_names='gene_symbols',cache=True)
  31. adata_ko.var_names_make_unique()
  32. adata_ko
  33. # Merge the data (no batch correction)
  34. adata_all = adata_het.concatenate(adata_ko, batch_categories=['het', 'ko'])
  35. adata_all
  36. # ## Section 2: Define functions used for analaysis
  37. def QC_graphs (adata):
  38. # QC graphs generates graphs of basic QC data including the highest expressing genes, total counts, genes, % mt genes
  39. # example
  40. # Q_graphs(adata_all)
  41. # if you have not yet run preprocessing1 you will only see the top genes and then get an error
  42. # run preprocessing1 on the data to get the other QC graphs
  43. # Graph highest expressing genes overall
  44. sc.pl.highest_expr_genes (adata, n_top = 20)
  45. # If you have not yet run preprocessing1 the following will give an error because these values have not been calculated yet
  46. if 'batch' in adata.obs.columns:
  47. sc.pl.violin(adata, ['n_genes_by_counts', 'total_counts', 'pct_counts_mt'], groupby = 'batch',jitter=0.4, multi_panel=True, size = 0)
  48. sc.pl.scatter(adata, x='log1p_total_counts', y='log1p_pct_counts_mt', color = 'batch')
  49. sc.pl.scatter(adata, x='total_counts', y='pct_counts_mt', color = 'batch')
  50. sc.pl.scatter(adata, x='total_counts', y='n_genes_by_counts', color = 'batch')
  51. sc.pl.scatter(adata, x='log1p_total_counts', y='log1p_n_genes_by_counts', color = 'batch')
  52. else:
  53. sc.pl.violin(adata, ['n_genes_by_counts', 'total_counts', 'pct_counts_mt'], jitter=0.4, multi_panel=True, size = 0)
  54. sc.pl.scatter(adata, x='log1p_total_counts', y='log1p_pct_counts_mt')
  55. sc.pl.scatter(adata, x='total_counts', y='pct_counts_mt')
  56. sc.pl.scatter(adata, x='total_counts', y='n_genes_by_counts')
  57. sc.pl.scatter(adata, x='log1p_total_counts', y='log1p_n_genes_by_counts')
  58. def preprocessing1 (adata):
  59. # preprocessing 1 elimates genes with less than 3 counts and cells with less than 200 reads
  60. # preprocessing 1 also calculates QC stats
  61. # example
  62. # preprocessing(adata_all)
  63. # First compute the number of genes per cell and add to adata.obs in a column called 'n_genes'
  64. sc.pp.filter_cells(adata, min_genes=0, inplace = True)
  65. # Manually filter
  66. adata_copy = adata[adata.obs['n_genes'] >= 1000, :]
  67. # First compute the number of cells expressing each gene and add to adata.var in a column called 'n_cells'
  68. sc.pp.filter_genes(adata_copy, min_cells=0, inplace = True)
  69. # Manually filter
  70. adata_copy = adata_copy[:, adata_copy.var['n_cells'] >= 10]
  71. # Calculate qc statistics
  72. # note that log1p is the natural log
  73. adata_copy.var['mt'] = adata_copy.var_names.str.startswith('mt-') # annotate the group of mitochondrial genes as 'mt'
  74. sc.pp.calculate_qc_metrics(adata_copy, qc_vars=['mt'], percent_top=None, log1p=True, inplace=True)
  75. adata_copy.obs['log1p_pct_counts_mt'] = np.log1p(adata_copy.obs.pct_counts_mt)
  76. return(adata_copy)
  77. def preprocessing2 (adata):
  78. # preprocessing2 eleminates cells above and below 2 MADs from the median of the natiral log total counts and genes
  79. # preprocessing2 also gets rid of cells with > 5% mt genes expressed
  80. # example
  81. # adata_filtered = preprocessing2(adata_all)
  82. if 'batch' in adata.obs.columns:
  83. cell_ID2 = []
  84. for batch in adata.obs.batch.unique():
  85. print(batch)
  86. currentbatch = adata[adata.obs.batch == batch]
  87. print(currentbatch)
  88. upper_counts = currentbatch.obs.log1p_total_counts.median() + 2.5*stats.median_abs_deviation(currentbatch.obs.log1p_total_counts)
  89. lower_counts = currentbatch.obs.log1p_total_counts.median() - 2.5*stats.median_abs_deviation(currentbatch.obs.log1p_total_counts)
  90. upper_genes = currentbatch.obs.log1p_n_genes_by_counts.median() + 2.5*stats.median_abs_deviation(currentbatch.obs.log1p_n_genes_by_counts)
  91. lower_genes = currentbatch.obs.log1p_n_genes_by_counts.median() - 2.5*stats.median_abs_deviation(currentbatch.obs.log1p_n_genes_by_counts)
  92. currentbatch = currentbatch[currentbatch.obs.log1p_total_counts < upper_counts, :]
  93. currentbatch = currentbatch[currentbatch.obs.log1p_total_counts > lower_counts, :]
  94. currentbatch = currentbatch[currentbatch.obs.log1p_n_genes_by_counts > lower_genes, :]
  95. currentbatch = currentbatch[currentbatch.obs.log1p_n_genes_by_counts < upper_genes, :]
  96. currentbatch = currentbatch[currentbatch.obs.pct_counts_mt < 5, :]
  97. cell_ID2.extend(currentbatch.obs.index.tolist())
  98. #len(cell_ID2)
  99. cell_ID2_series = pd.Series(cell_ID2)
  100. adata = adata[cell_ID2_series]
  101. return(adata)
  102. # use the following code for only 1 batch - significantly simpler
  103. else:
  104. upper_counts = adata.obs.log1p_total_counts.median() + 2.5*stats.median_abs_deviation(adata.obs.log1p_total_counts)
  105. lower_counts = adata.obs.log1p_total_counts.median() - 2.5*stats.median_abs_deviation(adata.obs.log1p_total_counts)
  106. upper_genes = adata.obs.log1p_n_genes_by_counts.median() + 2.5*stats.median_abs_deviation(adata.obs.log1p_n_genes_by_counts)
  107. lower_genes = adata.obs.log1p_n_genes_by_counts.median() - 2.5*stats.median_abs_deviation(adata.obs.log1p_n_genes_by_counts)
  108. adata = adata[adata.obs.log1p_total_counts < upper_counts, :]
  109. adata = adata[adata.obs.log1p_total_counts > lower_counts, :]
  110. adata = adata[adata.obs.log1p_n_genes_by_counts > lower_genes, :]
  111. adata = adata[adata.obs.log1p_n_genes_by_counts < upper_genes, :]
  112. adata = adata[adata.obs.pct_counts_mt < 5, :]
  113. return(adata)
  114. def normalization (adata, regress=None):
  115. # normalization normalizes reads to total counts per cell, logarithmizes the data, identifies HVG, and scales the data
  116. # optionally, normalization can regress out variables of choice using the optional argument regress
  117. # options for regression
  118. # Continuous variables: ['total_counts', 'pct_counts_mt', 'n_genes_by_counts']
  119. # Categorical variable such as ['batch'] but this cannot be combined with continuous variables
  120. # you cannot run normalization twice on the same dataset
  121. # examples
  122. # adata_filtered = normalization(adata_filtered) # no regression
  123. # adata_filtered = normalization(adata_filtered, ['batch'])
  124. # adata_filtered = normalization(adata_filtered, ['total_counts', 'pct_counts_mt', 'n_genes_by_counts'])
  125. sc.pp.normalize_total(adata, target_sum=1e4)
  126. sc.pp.log1p(adata)
  127. sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5)
  128. # IF YOU HAVE ERRORS DO NOT RUN THE NEXT LINE
  129. adata.raw = adata # this may mess up some heatmaps later
  130. adata = adata[:, adata.var.highly_variable]
  131. if regress is not None:
  132. sc.pp.regress_out(adata, regress)
  133. sc.pp.scale(adata, max_value=10)
  134. return(adata)
  135. def pca (adata):
  136. # pca performs pca dimensionality reduction on the data and outputs several graphs to reflect this
  137. # example
  138. # pca(adata_filtered)
  139. sc.tl.pca(adata, svd_solver='arpack')
  140. sc.pl.pca(adata, color='total_counts')
  141. sc.pl.pca(adata, color='batch')
  142. sc.pl.pca_variance_ratio(adata, log=True)
  143. sc.pl.pca_loadings(adata) # genes contributing to each PC
  144. def cluster (adata, neighbors, pcs, res):
  145. # cluster performs non-linear dimensionality reduction and clustering
  146. # example
  147. # cluster(adata_filtered, neighbors = 30, pcs = 15, res = 1)
  148. sc.pp.neighbors(adata, n_neighbors=neighbors, n_pcs=pcs)
  149. # sc.tl.paga(adata_all_all)
  150. # sc.pl.paga(adata_all_all, plot=False) # remove `plot=False` if you want to see the coarse-grained graph
  151. # sc.tl.umap(adata_all_all, init_pos='paga')
  152. sc.tl.umap(adata)
  153. #sc.pl.umap(adata)
  154. sc.tl.leiden(adata, resolution = res) # Default resolution is 1
  155. sc.pl.umap(adata, color=['leiden'], legend_loc='on data')
  156. sc.pl.umap(adata, color=['leiden'])
  157. def filtering (adata):
  158. # filtering shows some basic info need for getting rid of non-V1 cells
  159. # example
  160. # filtering(adata)
  161. sc.pl.umap(adata, color=['total_counts', 'pct_counts_mt', 'n_genes_by_counts',
  162. 'log1p_total_counts', 'log1p_pct_counts_mt', 'log1p_n_genes_by_counts'], ncols=3)
  163. sc.pl.umap(adata, color=['Foxp2', 'St18', 'Calb1', 'Pou6f2', 'Sall3', 'Nr5a2', 'Rnf220', 'Bcl11a', 'Nos1', 'Piezo2', 'Ntn1', 'Sp8'], ncols=3)
  164. sc.pl.umap(adata, color=['leiden'], legend_loc='on data')
  165. # ## Section 3: Preliminary analysis -1
  166. adata_all
  167. adata_filtered = preprocessing1(adata_all)
  168. adata_filtered
  169. QC_graphs(adata_filtered)
  170. adata_filtered = preprocessing2(adata_filtered)
  171. adata_filtered
  172. QC_graphs(adata_filtered)
  173. adata_filtered = normalization(adata_filtered)
  174. adata_filtered
  175. # ## Negative Selection 1
  176. pca(adata_filtered)
  177. cluster(adata_filtered, neighbors = 30, pcs = 15, res = 1)
  178. sc.pl.umap(adata_filtered, color = 'batch')
  179. filtering(adata_filtered)
  180. # Glia
  181. # General
  182. # Astrocytes
  183. # Oligodendrocyte-lineage
  184. # Microglia
  185. sc.pl.umap(adata_filtered, color=["Sox6",
  186. "Aldh1l1", "Fgfr3", "Aqp4", "Gfap", "Glul", "Gja1", "Slc1a3", "Slc4a4", "Sox2", "Slc1a2", "S100b", "Ndrg2", "Nkx6-1", "Sox9",
  187. "Olig2", "Mbp", "Mog", "Mag", "Bcas1", "Pdgfra", "Mbp", "Plp1", "Pmp22", "Prx", "Cspg4", "Gpr17", "Cnp", "Sox10", "Olig1", "Cd9", "Zfp488", "Zfp536", "Nkx6-2", "Nkx2-2", "Cd82", "Mal", "Bmp4", "Aspa", "St18",
  188. "Aif1", "Trem2", "Inpp5d", "Ctss", "Itgam", "Ptprc", "Cx3cr1", "Cd68", "Adgre1", "Mertk", "Fcer1g", "Fcrls", "Hexb"], ncols = 3)
  189. # Other non-neuronal cells
  190. # Vasculature
  191. # CSF-contacting cells
  192. # Meninges
  193. # Ependymal cells
  194. sc.pl.umap(adata_filtered, color=["Cldn5", "Rgs5", "Flt1", 'Slco1c1', 'Fli1', "Sox17", "Fermt3", "Klf1", "Car2", "Pecam1", "Tek", "Egflam", "Dlc1", "Cald1", "Rapgef5", "Flt4",
  195. "Pkd2l1", "Pkd1l2", "Myo3b",
  196. "Dcn", "Col3a1", "Igf2",
  197. "Sox9", "Sox2",
  198. "Dnah12", "Spef2", "Ccdc114", "Ddo", "Cfap65", "Ak9", "Fam216b", "Zfp474", "Wdr63", "Ccdc180",
  199. "Lmx1a", "Msx1", "Pax3", "Wnt1"], ncols = 3)
  200. # Neurons
  201. # General excitatory markers
  202. # Cholinergic markers
  203. # Neural Crest derived
  204. sc.pl.umap(adata_filtered, color=["Slc17a6", "Lmx1b", "Ebf2", "Sox5", "Slc17a7", "Ebf1", "Ebf3", "Cacna2d1",
  205. "Chat", "Slc5a7", "Slc18a3", "Isl1", "Ret", "Slit3", "Prph", "Lhx3", "Isl2", "Mnx1", "Slc8a3",
  206. "Sox10", "Sox2",
  207. "Enc1", "Dlg4", "Eno2",
  208. "Lhx1", "Lhx5", "Pax8", "Lbx1", "Pax2", "Gbx1", "Bhlhe22", "Sall3",
  209. "Gad1", "Gad2", "Slc32a1",
  210. "Tal1", "Gata2", "Gata3",
  211. "Evx1", "Evx2",
  212. "Dmrt3", "Wt1", "En1"], ncols = 3)
  213. # dI4
  214. # dIlA
  215. sc.pl.umap(adata_filtered, color=["Lhx1", "Lhx5", "Pax8", "Lbx1", "Gbx1", "Bhlhe22",
  216. "Gbx1", "Pax2","Sall3", "Rorb", "Pdzd2"], ncols = 3)
  217. # remove clusters
  218. # First round contaminants
  219. adata_filtered = adata_filtered[~adata_filtered.obs.leiden.isin(["11", "6", "17", "15", "8", "16", "13", "10", "7", "12", "8", "18", "5", "9"])]
  220. adata_filtered
  221. filtering(adata_filtered)
  222. # ## Negative Selection 2
  223. pca(adata_filtered)
  224. cluster(adata_filtered, neighbors = 30, pcs = 15, res = 1)
  225. sc.pl.umap(adata_filtered, color = 'batch')
  226. filtering(adata_filtered)
  227. # Glia
  228. # General
  229. # Astrocytes
  230. # Oligodendrocyte-lineage
  231. # Microglia
  232. sc.pl.umap(adata_filtered, color=["Sox6",
  233. "Aldh1l1", "Fgfr3", "Aqp4", "Gfap", "Glul", "Gja1", "Slc1a3", "Slc4a4", "Sox2", "Slc1a2", "S100b", "Ndrg2", "Nkx6-1", "Sox9",
  234. "Olig2", "Mbp", "Mog", "Mag", "Bcas1", "Pdgfra", "Mbp", "Plp1", "Pmp22", "Prx", "Cspg4", "Gpr17", "Cnp", "Sox10", "Olig1", "Cd9", "Zfp488", "Zfp536", "Nkx6-2", "Nkx2-2", "Cd82", "Mal", "Bmp4", "Aspa", "St18",
  235. "Aif1", "Trem2", "Inpp5d", "Ctss", "Itgam", "Ptprc", "Cx3cr1", "Cd68", "Adgre1", "Mertk", "Fcer1g", "Fcrls", "Hexb"], ncols = 3)
  236. # other non-neuronal
  237. # Vasculature
  238. # CSF-contacting cells
  239. # Meninges
  240. # Ependymal cells
  241. sc.pl.umap(adata_filtered, color=["Cldn5", "Rgs5", "Flt1", 'Slco1c1', 'Fli1', "Sox17", "Fermt3", "Klf1", "Car2", "Pecam1", "Tek", "Egflam", "Dlc1", "Cald1", "Rapgef5", "Flt4",
  242. "Pkd2l1", "Pkd1l2", "Myo3b",
  243. "Dcn", "Col3a1", "Igf2",
  244. "Sox9", "Sox2",
  245. "Dnah12", "Spef2", "Ccdc114", "Ddo", "Cfap65", "Ak9", "Fam216b", "Zfp474", "Wdr63", "Ccdc180",
  246. "Lmx1a", "Msx1", "Pax3", "Wnt1"], ncols = 3)
  247. # neurons
  248. # General excitatory markers
  249. # Cholinergic markers
  250. # NC derived
  251. #
  252. sc.pl.umap(adata_filtered, color=["Slc17a6", "Lmx1b", "Ebf2", "Sox5", "Slc17a7", "Ebf1", "Ebf3", "Cacna2d1",
  253. "Chat", "Slc5a7", "Slc18a3", "Isl1", "Ret", "Slit3", "Prph", "Lhx3", "Isl2", "Mnx1", "Slc8a3",
  254. "Sox10", "Sox2",
  255. "Enc1", "Dlg4", "Eno2",
  256. "Lhx1", "Lhx5", "Pax8", "Lbx1", "Pax2", "Gbx1", "Bhlhe22", "Sall3",
  257. "Gad1", "Gad2", "Slc32a1",
  258. "Tal1", "Gata2", "Gata3",
  259. "Evx1", "Evx2",
  260. "Dmrt3", "Wt1", "En1"], ncols = 3)
  261. # dI4
  262. # dIlA
  263. sc.pl.umap(adata_filtered, color=["Lhx1", "Lhx5", "Pax8", "Lbx1", "Gbx1", "Bhlhe22",
  264. "Gbx1", "Pax2","Sall3", "Rorb", "Pdzd2"], ncols = 3)
  265. adata_filtered # before removing contaminates
  266. # remove clusters
  267. # Second round
  268. adata_filtered = adata_filtered[~adata_filtered.obs.leiden.isin(["9", "13", "0", "14"])]
  269. adata_filtered
  270. filtering(adata_filtered)
  271. # ## Select for V1's and perform analysis again
  272. adata_filtered
  273. V1 = pd.DataFrame(adata_filtered.obs.index)
  274. V1_ID = V1[0]
  275. len(V1_ID)
  276. adata_all
  277. adata_V1 = adata_all[V1_ID]
  278. adata_V1
  279. adata_V1 = preprocessing1(adata_V1)
  280. adata_V1
  281. QC_graphs(adata_V1)
  282. adata_V1 = normalization(adata_V1, ['batch']) # regress out batch effects`
  283. adata_V1
  284. pca(adata_V1)
  285. cluster(adata_V1, neighbors = 50, pcs = 12, res = 1)
  286. sc.pl.umap(adata_V1, color = 'batch') # optional
  287. for batch in ['het', 'ko']:
  288. sc.pl.umap(adata_V1, color='batch', groups=[batch])
  289. filtering(adata_V1)

Code_Replicate1.py at commit b6e8214, under MIT · at the source

Overview

Authors: Alexandra J. Trevisan1, Katie Han1, Phillip D. Chapman1, Anand S. Kulkarni1, Jennifer M. Hinton1, Ines Klein2, Cody Ramirez1, Alfonso Lavado3, Graziana Gatto2, Mariano I. Gabitto4,5, Vilas Menon6, Jay B. Bikoff1
  1. Department of Developmental Neurobiology, St. Jude Children’s Research Hospital,Memphis, TN USA
  2. Department of Neurology, University Hospital of Cologne,Cologne, Germany
  3. Center for Pediatric Neurological Disease Research, St. Jude Children’s Research Hospital,Memphis, TN USA
  4. Allen Institute for Brain Science,Seattle, WA USA
  5. Department of Statistics, University of Washington,Seattle, WA USA
  6. Department of Neurology, Center for Translational and Computational Neuroimmunology, Columbia University,New York, NY USA
Institutions: St. Jude Children's Research Hospital (United States); University Hospital Cologne (Germany); Allen Institute for Brain Science (United States); University of Washington (United States); Columbia University (United States)
Journal: Nature communications, volume 17, issue 1, article 9614
Dates: received 6 February 2025; accepted 31 July 2026; published online 10 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41467-026-76522-3 · PMID 42711323 · PMCID PMC13554063 · OpenAlex W7202083432
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), mouse (organism), cellular / molecular (subfield)
Methods: Spectral & time-frequency, Statistics, Smoothing, state filtering, decompositions, Machine learning, Preprocessing, Evoked potentials, Connectivity, fMRI & imaging
Keywords: Spinal cord, Neural circuits, Cell type diversity
MeSH: Interneurons*, Spinal Cord*, Transcriptome*, Animals, Female, Gene Expression Profiling, Homeodomain Proteins, Locomotion, Male, Mice, Mice, Knockout (* major topic)
Topic: Zebrafish Biomedical Research Applications (Cell Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: NINDS (R01NS123116); American Lebanese Syrian Associated Charities; Deutsche Forschungsgemeinschaft (DFG) (CRC1451 - 431549029-A09, CRC1451 - 431549029-Z02); National Cancer Institute (P30 CA021765); iBehave network from the Ministry of Culture and Science of the State of North Rhine-Westphalia
Citations: not cited yet (Europe PMC); 115 references in the paper

Abstract

Neural circuits in the spinal cord are composed of diverse populations of interneurons that play crucial roles in shaping motor output. However, the extent of interneuron heterogeneity and how this diversity relates to functional aspects of movement remain unclear. Here, through a focus on mouse spinal V1 interneurons, we show that loss of the V1 transcription factor En1 selectively disrupts the frequency of rhythmic locomotor output but does not disrupt flexion/extension limb movement, thereby decoupling two key functional roles ascribed to this neuronal population. To investigate the cellular basis of these deficits, we generated a single-nucleus transcriptomic atlas of V1 interneurons across postnatal development. Our analysis reveals age-dependent transcriptional changes while also demonstrating that their core molecular taxonomy perdures into adulthood. Notably, En1 deficiency selectively perturbed a single subset of V1Pou6f2 interneurons, thereby identifying a possible cellular substrate for influencing locomotor speed. Beyond serving as a molecular resource, our study highlights how deep neuronal profiling provides an entry point for understanding the multifunctional nature of heterogeneous interneuron populations.

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

Bikoff-Lab

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
At the source: github.com/Bikoff-Lab

Bikoff-Lab/V1_KO_analysis

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: b6e8214879b477eaa7f784633160005cbb8a909b, 10 August 2026
Languages: Python (3)
Size: 6 files, 3 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: pandas (3 files), Matplotlib (2 files), NumPy (2 files), Scanpy (2 files), scikit-learn (2 files), SciPy (2 files)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
5 files

Code availability

The code used for analysis of sequencing data is available at Github (https://github.com/Bikoff-Lab/V1_interneuron_snRNAseq_Age_Atlas and https://github.com/Bikoff-Lab/V1_KO_analysis).

Reproduced under the paper's license (CC BY), from the paper cited above.

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 3 scripts, each with its path and the digest of its content;
  • 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability

Raw sequencing data, counts tables, and associated metadata generated in this study have been deposited in the Gene Expression Omnibus (GEO) under accession number GEO: GSE275595 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=gse275595). In addition, an interactive, searchable web resource for exploration and visualization of these data is available at https://v1interneurons.stjude.org/shinyApp/. Source data are provided with this paper.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 12 authors, 3 keywords, 11 MeSH terms, 5 funders, 114 references.

Cite

This paper

Trevisan, A. J., Han, K., Chapman, P. D., Kulkarni, A. S., Hinton, J. M., Klein, I., Ramirez, C., Lavado, A., Gatto, G., Gabitto, M. I., Menon, V., & Bikoff, J. B. (2026). Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output. Nature communications, 17(1), 9614. https://doi.org/10.1038/s41467-026-76522-3

BibTeX

@article{trevisan2026transcriptomic,
author = {Trevisan, Alexandra J. and Han, Katie and Chapman, Phillip D. and Kulkarni, Anand S. and Hinton, Jennifer M. and Klein, Ines and Ramirez, Cody and Lavado, Alfonso and Gatto, Graziana and Gabitto, Mariano I. and Menon, Vilas and Bikoff, Jay B.},
title = {{Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output}},
journal = {Nature communications},
year = {2026},
month = aug,
volume = {17},
number = {1},
pages = {9614},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-76522-3},
url = {https://doi.org/10.1038/s41467-026-76522-3},
pmid = {42711323},
pmcid = {PMC13554063}
}

RIS

TY - JOUR
AU - Trevisan, Alexandra J.
AU - Han, Katie
AU - Chapman, Phillip D.
AU - Kulkarni, Anand S.
AU - Hinton, Jennifer M.
AU - Klein, Ines
AU - Ramirez, Cody
AU - Lavado, Alfonso
AU - Gatto, Graziana
AU - Gabitto, Mariano I.
AU - Menon, Vilas
AU - Bikoff, Jay B.
TI - Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/08/10
VL - 17
IS - 1
SP - 9614
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-76522-3
UR - https://doi.org/10.1038/s41467-026-76522-3
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-76522-3",
"type": "article-journal",
"title": "Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output",
"container-title": "Nature communications",
"author": [
{
"family": "Trevisan",
"given": "Alexandra J."
},
{
"family": "Han",
"given": "Katie"
},
{
"family": "Chapman",
"given": "Phillip D."
},
{
"family": "Kulkarni",
"given": "Anand S."
},
{
"family": "Hinton",
"given": "Jennifer M."
},
{
"family": "Klein",
"given": "Ines"
},
{
"family": "Ramirez",
"given": "Cody"
},
{
"family": "Lavado",
"given": "Alfonso"
},
{
"family": "Gatto",
"given": "Graziana"
},
{
"family": "Gabitto",
"given": "Mariano I."
},
{
"family": "Menon",
"given": "Vilas"
},
{
"family": "Bikoff",
"given": "Jay B."
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "9614",
"DOI": "10.1038/s41467-026-76522-3",
"PMID": "42711323",
"PMCID": "PMC13554063",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-76522-3",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
10
]
]
}
}

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.1038/s41467-026-74228-0 [code]
Spatial and network principles behind neural generation of locomotion.
Journal: Nature communications
In common: NumPy, genetics / omics, mouse, cellular / molecular, 19 references
[2] doi:10.1016/j.cell.2026.05.047 [code]
An emergent disease-associated motor neuron state precedes cell death in ALS.
Journal: Cell
In common: Scanpy, pandas, SciPy, 2 other tools, genetics / omics, mouse, cellular / molecular, 7 references
[3] doi:10.1016/j.isci.2026.115196 [code]
Transcriptional and cellular maturation of the chick spinal cord in the context of distinct neuromuscular circuits.
Journal: iScience
In common: 10 references
[4] doi:10.1038/s41467-026-76054-w [code]
Distinct differentiation trajectories leave lasting impacts on gene regulation and function of V2a neurons.
Journal: Nature communications
In common: Scanpy, pandas, Matplotlib, 1 other tool, cellular / molecular, 4 references
[5] doi:10.7554/elife.106347 [code]
Esr1-dependent signaling and transcriptional maturation in the medial preoptic area of the hypothalamus shape the development of mating behavior during adolescence.
Journal: eLife
In common: Scanpy, scikit-learn, pandas, 3 other tools, genetics / omics, mouse, 4 references
[6] doi:10.1038/s41467-026-69944-6 [code]
Multi-modal dissection of cell-type specific TDP-43 pathology in the motor cortex.
Journal: Nature communications
In common: Scanpy, pandas, SciPy, 2 other tools, genetics / omics, 5 references
[7] doi:10.1038/s41467-026-73883-7 [code]
In situ graphene-seq: spatial transcriptomics and chronic electrophysiological characterization of tissue microenvironments.
Journal: Nature communications
In common: Scanpy, scikit-learn, pandas, 3 other tools, genetics / omics, cellular / molecular, 3 references
[8] doi:10.1038/s42003-026-10034-0 [code]
Region- and cell type-specific changes in gene expression in the cerebellum after classical fear conditioning.
Journal: Communications biology
In common: Scanpy, pandas, SciPy, 2 other tools, genetics / omics, mouse, cellular / molecular, 4 references
[9] doi:10.1038/s41467-026-74171-0 [code]
Cluster replicability in single-cell and single-nucleus atlases of the mouse brain.
Journal: Nature communications
In common: Scanpy, pandas, SciPy, 1 other tool, genetics / omics, mouse, cellular / molecular, 4 references
[10] doi:10.1016/j.celrep.2026.117073 [code]
Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.
Journal: Cell reports
In common: Scanpy, pandas, SciPy, 2 other tools, genetics / omics, mouse, cellular / molecular, 4 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.