OSCR

Delta family protocadherins contribute to protoglomerular targeting of olfactory sensory neuron axons in the olfactory bulb.

Code ↔ Paper

4 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 4 matches
  1. [1] § Results › Olfactory sensory neurons from three developmental timepoints contain similar cells that differ by maturity ↔ 10x Genomics scRNAseq Zebrafish OSNs.R, lines 223–274 · score 0.84 · ascl1a, cfl1l, Early mature, cfap157, cldne, gng8
  2. [2] § Results › Olfactory sensory neurons from three developmental timepoints contain similar cells that differ by maturity ↔ 10x Genomics scRNAseq Zebrafish OSNs.R, lines 223–274 · score 0.58 · cxcr3.3, DESeq2, CD83, tnfb, immune, maturity
  3. [3] § Materials and methods › 10x genomics scRNA-seq analysis ↔ 10x Genomics scRNAseq Zebrafish OSNs.R, lines 1–53 · score 0.51 · cell Ranger, Seurat, Genomics, zebrafish
  4. [4] § Results › Odorant receptors co-expressed in the same OSN generally belong to the same OR subfamily ↔ 10x Genomics scRNAseq Zebrafish OSNs.R, lines 276–318 · score 0.51 · Or107, or106, or108, or109, or125, or126

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

R · 366 lines · 19 KB · no license · 4 matches

  1. # Load Libraries ----------------------------------------------------------
  2. library(Seurat)
  3. library(dplyr)
  4. library(data.table)
  5. library(readxl)
  6. library(viridis)
  7. library(RColorBrewer)
  8. library(ggplot2)
  9. library(DESeq2)
  10. library(patchwork)
  11. # Import and Filter -------------------------------------------------------
  12. #10x Data importation from cell ranger output files, takes barcodes.tsv, features.tsc, matrix.mtx.
  13. hpf36_OMP_RFP <- Read10X(data.dir = "36hrMergedCount")
  14. hpf48_OMP_RFP <- Read10X(data.dir = "48hrMergedCount")
  15. hpf72_OMP_RFP <- Read10X(data.dir = "72hrMergedCount")
  16. # Initialize the Seurat object with the raw (non-normalized data).
  17. hpf36_OMP_RFP <- CreateSeuratObject(counts = hpf36_OMP_RFP, project = "36hpf_OMP_RFP", min.cells = 2, min.features = 100)
  18. hpf48_OMP_RFP <- CreateSeuratObject(counts = hpf48_OMP_RFP, project = "48hpf_OMP_RFP", min.cells = 2, min.features = 100)
  19. hpf72_OMP_RFP <- CreateSeuratObject(counts = hpf72_OMP_RFP, project = "72hpf_OMP_RFP", min.cells = 2, min.features = 100)
  20. combi_OMP_RFP <- merge(hpf36_OMP_RFP, y = c(hpf48_OMP_RFP, hpf72_OMP_RFP), add.cell.ids = c("36hpf", "48hpf", "72hpf"))
  21. combi_OMP_RFP
  22. [email hidden]
  23. levels(combi_OMP_RFP)
  24. #Start quality control analysis. First quantify mitochondrial expression.
  25. combi_OMP_RFP[["percent.mt"]] <- PercentageFeatureSet(combi_OMP_RFP, pattern = "^mt-")
  26. combi_OMP_RFP[["percent.OR"]] <- PercentageFeatureSet(combi_OMP_RFP, pattern = "^or1")
  27. #visualize qc data
  28. VlnPlot(combi_OMP_RFP, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
  29. plot1 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "percent.mt")
  30. plot2 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
  31. FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "percent.OR")
  32. CombinePlots(plots = list(plot1, plot2))
  33. remove(plot1,plot2)
  34. #Stats before filtering
  35. combi_OMP_RFP
  36. #Filter
  37. combi_OMP_RFP <- subset(combi_OMP_RFP, subset = nFeature_RNA > 800 & nFeature_RNA < 7000 & percent.mt < 10 & nCount_RNA < 50000)
  38. #stats after filtering
  39. combi_OMP_RFP
  40. plot1 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "percent.mt")
  41. plot2 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
  42. CombinePlots(plots = list(plot1, plot2))
  43. remove(plot1,plot2)
  44. VlnPlot(combi_OMP_RFP, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
  45. FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "percent.OR")
  46. VlnPlot(combi_OMP_RFP, features = c("nFeature_RNA", "nCount_RNA", "percent.OR"), ncol = 3)
  47. [email hidden]
  48. # Normalization -----------------------------------------------------------
  49. #Using SCTransform to normalize the data
  50. combi_OMP_RFP<- SCTransform(combi_OMP_RFP,return.only.var.genes = FALSE, verbose = TRUE)
  51. #features post normalization
  52. VlnPlot(combi_OMP_RFP, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
  53. plot1 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "percent.mt")
  54. plot2 <- FeatureScatter(combi_OMP_RFP, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
  55. CombinePlots(plots = list(plot1, plot2))
  56. remove(plot1,plot2)
  57. #Export SCT normalized Data to Excel. Uses Data.table package. Add date to file name if wanted.
  58. data_to_write_out <- as.data.frame(as.matrix(combi_OMP_RFP[["SCT"]]@counts))
  59. fwrite(x = data_to_write_out, row.names = TRUE, file = "SCTransAll_combi_Outfile_10012021.csv")
  60. remove(data_to_write_out)
  61. saveRDS(combined_OSNs, file = "combined_OSNs_NormalizedSCT.rds")
  62. # OR naming ---------------------------------------------------------------
  63. #Imports excel files from previously written out data that has been edited.
  64. #I manually removed all genes that were not ORs, I wanted this excel file to
  65. #be able to manually check some parameters outside of R
  66. #Read in data
  67. OR_df <- readxl::read_xlsx("SCTransAll_combi_Outfile_OR_10012021.xlsx")
  68. #Lets deal with the OR ratios and identities first
  69. #Convert to data.table, set the column of genes as rowname
  70. OR_dt <- as.data.table(OR_df[-1])
  71. rownames(OR_dt) <- OR_df[[1]]
  72. # filter out cells that have no OR genes
  73. OR_all_zero_cols <- which(sapply(OR_dt, function(x) sum(x) == 0))
  74. OR_dt[, (OR_all_zero_cols) := NULL]
  75. # compute information about prominent genes
  76. OR_top2s <- lapply(OR_dt, function(x) {
  77. names(x) <- rownames(OR_dt)
  78. top2 <- tail(sort(x), 2)
  79. list(first = names(top2)[2], second = names(top2)[1], ratio = top2[1]/top2[2])
  80. })
  81. gene_prominence_data <- rbindlist(OR_top2s)[, gene := names(OR_top2s)][ratio <= 1]
  82. # pull cells with prominent genes and the name of the prominent gene
  83. prominent_genes <- setNames(gene_prominence_data$first, gene_prominence_data$gene)
  84. prominent_genes_ratios <- setNames(gene_prominence_data$ratio, gene_prominence_data$gene)
  85. # merge with other cells that don't have a prominent gene (default value NA)
  86. prominent_genes_metadata <- setNames(rep(NA_character_, ncol(OR_df) - 1), colnames(OR_df)[-1])
  87. prominent_genes_metadata[names(prominent_genes)] <- prominent_genes
  88. #attempting ratio
  89. prominent_genes_ratios_metadata <- setNames(rep(NA_character_, ncol(OR_df) - 1), colnames(OR_df)[-1])
  90. prominent_genes_ratios_metadata[names(prominent_genes_ratios)] <- prominent_genes_ratios
  91. #Copy 0 OR ratio (only cells with 1 OR expressed)
  92. combi_OMP_RFP <- AddMetaData(
  93. object = combi_OMP_RFP,
  94. metadata = prominent_genes_metadata,
  95. col.name = 'prominent.OR'
  96. )
  97. combi_OMP_RFP <- AddMetaData(
  98. object = combi_OMP_RFP,
  99. metadata = as.numeric(prominent_genes_ratios_metadata),
  100. col.name = 'prominent.OR.ratio'
  101. )
  102. # check if it's been added
  103. head([email hidden])
  104. # should be accessible w/ double brackets
  105. combi_OMP_RFP [["prominent.OR"]]
  106. combi_OMP_RFP [["prominent.OR.ratio"]]
  107. #Write out data
  108. #export Meta data showing prominent OR per cell and OR ratio
  109. data_to_write_out <- as.data.frame(as.matrix([email hidden]))
  110. fwrite(x = data_to_write_out, row.names = TRUE, file = "10122021_combi_OMP_RFP_metadata.csv")
  111. remove(data_to_write_out)
  112. #export co-expression OR information showing top 2 ORs and ratio
  113. data_to_write_out <- as.data.frame(as.matrix(gene_prominence_data))
  114. fwrite(x = data_to_write_out, row.names = TRUE, file = "10122021_combi_OMP_RFP_OR_prominence_data.csv")
  115. remove(data_to_write_out)
  116. #cleanup
  117. remove(gene_prominence_data, OR_df, OR_dt, OR_top2s, OR_all_zero_cols, prominent_genes, prominent_genes_metadata, prominent_genes_ratios, prominent_genes_ratios_metadata)
  118. # OR Subsets --------------------------------------------------------------
  119. #Create alternate object for OMP_RFP based on assigned ORs, only cells with called ORs will remain
  120. #OR_combi_OMP_RFP <- subset(combi_OMP_RFP, subset = prominent.OR != "N/A")
  121. #OR called if 5x expression of second OR
  122. #pt2_combi_OMP_RFP <- subset(combi_OMP_RFP, subset = prominent.OR != "N/A" & prominent.OR.ratio <= 0.2)
  123. # Processing Code ---------------------------------------------------------
  124. #This is the standard data processing workflow I settled on using
  125. #It can be used for any data subset you want to analyse
  126. #Process all all OSNs
  127. remove(tmp,all.genes, top30)
  128. tmp <- combi_OMP_RFP
  129. tmp <- FindVariableFeatures(tmp, selection.method = "vst", nfeatures = 2000)
  130. top30 <- head(VariableFeatures(tmp), 30)
  131. plot1 <- VariableFeaturePlot(tmp)
  132. LabelPoints(plot = plot1, points = top30, repel = TRUE)
  133. remove(plot1)
  134. #Linear transformation for data scaling
  135. all.genes <- rownames(tmp)
  136. tmp <- ScaleData(tmp, features = all.genes)
  137. tmp<- RunPCA(tmp, features = VariableFeatures(object = tmp))
  138. print(tmp[["pca"]], dims = 1:5, nfeatures = 5)
  139. VizDimLoadings(tmp, dims = 1:2, reduction = "pca")
  140. DimPlot(tmp, reduction = "pca")
  141. DimHeatmap(tmp, dims = 1, cells = 500, balanced = TRUE)
  142. DimHeatmap(tmp, dims = 1:15, cells = 500, balanced = TRUE)
  143. ElbowPlot(tmp)
  144. #Clustering
  145. tmp <- FindNeighbors(tmp, dims = 1:10)
  146. tmp <- FindClusters(tmp, resolution = 0.5)
  147. ###head(Idents(tmp, 5))
  148. #UMAP Dimensionality Reduction
  149. tmp <- RunUMAP(tmp, dims = 1:10)
  150. DimPlot(tmp, reduction = "umap", label = TRUE, label.color = 'white') +DarkTheme()
  151. DimPlot(tmp, reduction = "umap", label = TRUE)
  152. # Output ------------------------------------------------------------------
  153. #reassign temp to variable
  154. combi_OMP_RFP<-tmp
  155. remove(tmp)
  156. levels(combi_OMP_RFP)
  157. #Save RDS backup and Workspace if wanted
  158. saveRDS(combi_OMP_RFP, file = "combined_OSNs_DataProcessed.rds")
  159. save.image()
  160. # Data Visualization Figures -----------------------------------------------
  161. ##Figure 1
  162. # Visualize UMAPs and Clustering
  163. remove(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
  164. p0<-FeaturePlot(combi_OMP_RFP, features = "ompb") * scale_colour_viridis()* DarkTheme() + ggtitle('Placeholder for OMP :RFP Image', )
  165. p0
  166. p1<-DimPlot(combi_OMP_RFP, reduction = "umap", label = TRUE, pt.size = .1,label.color = "White", label.box = TRUE, repel = TRUE) + theme(plot.title = element_text(hjust = 0.5)) * DarkTheme()
  167. p1
  168. p2<-DimPlot(combi_OMP_RFP, reduction = "umap", label = TRUE, split.by = 'orig.ident', label.size = 0, label.color = 'white', pt.size = .1, shuffle = TRUE) + DarkTheme() + NoLegend()
  169. p2
  170. # Define the layout design
  171. combined_plot <- (p0 | p1) /
  172. p2 +
  173. plot_layout(heights = c(1, 1))
  174. combined_plot
  175. #Redefining Clusters by maturity
  176. Combined_clusters <- combi_OMP_RFP
  177. # Change seurat_clusters to the cluster column name
  178. new_cluster_ids <- [email hidden]$seurat_clusters
  179. new_cluster_ids <- as.character([email hidden]$seurat_clusters)
  180. # Assign new group names
  181. new_cluster_ids[new_cluster_ids %in% c(3,5,8,4,10,11,13,14)] <- 'Immature'
  182. new_cluster_ids[new_cluster_ids %in% c(2,0)] <- 'Early Mature'
  183. new_cluster_ids[!new_cluster_ids %in% c('Immature', 'Early Mature',7)] <- 'Mature'
  184. # Update the metadata with the new clusters
  185. [email hidden]$new_clusters <- new_cluster_ids
  186. # Update the identity classes
  187. Combined_clusters <- SetIdent(Combined_clusters, value = 'new_clusters')
  188. #Visualize new clusters IDS Including cluster 7
  189. DimPlot(Combined_clusters, reduction = "umap", label = TRUE, pt.size = .1, label.color = "White", label.box = TRUE, repel = TRUE) + theme(plot.title = element_text(hjust = 0.5)) * DarkTheme()
  190. #Remake without cluster 7
  191. cells_to_keep <- WhichCells(Combined_clusters, expression = seurat_clusters != 7)
  192. # Subset the Seurat object to keep only the cells you want
  193. Combined_clusters <- subset(Combined_clusters, cells = cells_to_keep)
  194. # seurat_obj_subset now contains your data minus the cells from cluster 7
  195. DimPlot(Combined_clusters, reduction = "umap", label = TRUE, pt.size = .1,label.color = "White", label.box = TRUE, repel = TRUE) + theme(plot.title = element_text(hjust = 0.5)) * DarkTheme()
  196. # Set the factor levels in the order you want
  197. Combined_clusters$new_clusters <- factor(Combined_clusters$new_clusters, levels = c("Immature", "Early Mature", "Mature"))
  198. maturity_markers <- c("neurod1", "ascl1a", "gap43","gng8", "ompb", "vamp2","elf3", "malb", "krt4","cfl1l", "cldne", "cfap157")
  199. #Dotplot visualizing maturity marker by maturity groups
  200. DotPlot(Combined_clusters, features = maturity_markers, group.by = "new_clusters", dot.scale = 20) + scale_color_viridis() + DarkTheme()
  201. ##Supplement 1, Maturity markers on all cluster including 7
  202. FeaturePlot(combi_OMP_RFP, features = maturity_markers, ncol = 3) * scale_colour_viridis()* DarkTheme()
  203. ##Supplement 2 UMAPS of Immune Genes
  204. Cluster7_Immune_genes <- c("apoc1", "tln1", "cd83","ccl35.1", "cxcr3.3", "tnfa", "tnfb","ptprc", "marco")
  205. FeaturePlot(combi_OMP_RFP, features = Cluster7_Immune_genes, ncol = 3) * scale_colour_viridis()* DarkTheme()
  206. # DEG Testing -------------------------------------------------------------
  207. #Deseq2 Differentially Expressed Genes by cluster
  208. # Ensure you're using the RNA assay for Deseq2
  209. DefaultAssay(combi_OMP_RFP) <- "RNA"
  210. combi_OMP_RFP_15_Deseq2<- FindMarkers(combi_OMP_RFP, ident.1 = 15, test.use = "DESeq2")
  211. combi_OMP_RFP_15_Deseq2
  212. data_to_write_out <- as.data.frame(as.matrix(combi_OMP_RFP_9_Deseq2))
  213. fwrite(x = data_to_write_out, row.names = TRUE, file = "combi_OMP_RFP_15_Deseq2_10072021.csv")
  214. combi_OMP_RFP_9v15_Deseq2<- FindMarkers(combi_OMP_RFP, ident.1 = 9, ident.2 = 15, test.use = "DESeq2")
  215. combi_OMP_RFP_9v15_Deseq2
  216. data_to_write_out <- as.data.frame(as.matrix(combi_OMP_RFP_9v15_Deseq2))
  217. fwrite(x = data_to_write_out, row.names = TRUE, file = "combi_OMP_RFP_9v15_Deseq2_10072021.csv")
  218. combi_OMP_RFP_9v1_Deseq2<- FindMarkers(combi_OMP_RFP, ident.1 = 9, ident.2 = 1, test.use = "DESeq2")
  219. combi_OMP_RFP_9v1_Deseq2
  220. data_to_write_out <- as.data.frame(as.matrix(combi_OMP_RFP_9v1_Deseq2))
  221. fwrite(x = data_to_write_out, row.names = TRUE, file = "combi_OMP_RFP_9v1_Deseq2_10072021.csv")
  222. combi_OMP_RFP_0a2v5a1_Deseq2<- FindMarkers(combi_OMP_RFP, ident.1 = c(0,2), ident.2 = c(5,1), test.use = "DESeq2")
  223. combi_OMP_RFP_0a2v5a1_Deseq2
  224. data_to_write_out <- as.data.frame(as.matrix(combi_OMP_RFP_0a2v5a1_Deseq2))
  225. fwrite(x = data_to_write_out, row.names = TRUE, file = "combi_OMP_RFP_0a2v5a1_Deseq2_10072021.csv")
  226. #Counting ORs Export to excel
  227. combi_pt2_ORs <- pt2_combi_OMP_RFP$prominent.OR
  228. data_to_write_out <- as.data.frame(as.matrix(combi_pt2_ORs))
  229. fwrite(x = data_to_write_out, row.names = TRUE, file = "combi_pt2_ORs_10132021.csv")
  230. #To perform DESEQ2 analysis by OR Clade
  231. #Define OR clades
  232. CladeA_ORs <- c("or101-1", "or102-3", "or102-4" , "or102-5", "or103-1", "or103-2","or103-5", "or104-1", "or104-2",
  233. "or106-1", "or106-2" , "or106-3", "or106-4", "or106-6", "or106-7", "or106-8", "or106-9", "or106-10", "or106-11",
  234. "or107-1", "or108-1", "or108-2", "or108-3", "or109-1", "or109-2", "or109-7", "or109-11", "or109-13",
  235. "or110-2", "or111-1", "or111-2", "or111-3", "or111-4", "or111-5", "or111-6", "or111-7", "or111-8", "or111-9", "or111-10", "or111-11", "or112-1")
  236. CladeB_ORs <- c("or115-1", "or115-2", "or115-5", "or115-6", "or115-7", "or115-9", "or115-10", "or115-11", "or115-12", "or115-15",
  237. "or116-1", "or116-2", "or117-1", "or118-2", "or119-2", "or120-1", "or121-1", "or122-1", "or122-2", "or123-1", "or124-1",
  238. "or125-1", "or125-2", "or125-3", "or125-4", "or125-5", "or125-6", "or125-7", "or125-8", "or126-1", "or126-2", "or126-3", "or126-4", "or126-5",
  239. "or127-1", "or128-1", "or128-2", "or128-3", "or128-4", "or128-5", "or128-6", "or128-8", "or128-9", "or128-10")
  240. CladeC_ORs <- c("or129-1", "or130-1", "or130-1.1", "or131-1", "or131-2", "or132-1", "or132-2", "or132-2.1", "or132-4", "or132-5",
  241. "or133-1", "or133-2", "or133-4", "or133-5", "or133-6", "or133-7", "or133-9", "or134-1", "or135-1", "or136-1",
  242. "or137-2", "or137-3", "or137-4", "or137-6", "or137-7", "or137-8", "or137-9")
  243. #subset OSNs which have a confidently assigned OR
  244. #remove cluster 7 from the main data set
  245. cells_to_keep <- WhichCells(combi_OMP_RFP, expression = seurat_clusters != 7)
  246. # Subset the Seurat object to keep only the cells you want
  247. combi_OMP_RFP_no7 <- subset(combi_OMP_RFP, cells = cells_to_keep)
  248. #Only keep OSNs in which an OR can confidently be assigned
  249. pt2_combi_OMP_RFP <- subset(combi_OMP_RFP_no7, subset = prominent.OR != "N/A" & prominent.OR.ratio <= 0.2)
  250. #Subset OR_OMP_RFP by clades, set new idents per subset, merge together, check output.
  251. CladeA_pt2_combi_OMP_RFP <- subset(x = pt2_combi_OMP_RFP, subset = prominent.OR %in% CladeA_ORs)
  252. CladeB_pt2_combi_OMP_RFP <- subset(x = pt2_combi_OMP_RFP, subset = prominent.OR %in% CladeB_ORs)
  253. CladeC_pt2_combi_OMP_RFP <- subset(x = pt2_combi_OMP_RFP, subset = prominent.OR %in% CladeC_ORs)
  254. #Add meta data for each OR clade and then set idents for the cells in that clade
  255. CladeA_pt2_combi_OMP_RFP<- AddMetaData(object = CladeA_pt2_combi_OMP_RFP, metadata = "CladeA", col.name = 'OR.Clade')
  256. Idents(CladeA_pt2_combi_OMP_RFP) <- CladeA_pt2_combi_OMP_RFP$OR.Clade
  257. CladeB_pt2_combi_OMP_RFP<- AddMetaData(object = CladeB_pt2_combi_OMP_RFP, metadata = "CladeB", col.name = 'OR.Clade')
  258. Idents(CladeB_pt2_combi_OMP_RFP) <- CladeB_pt2_combi_OMP_RFP$OR.Clade
  259. CladeC_pt2_combi_OMP_RFP<- AddMetaData(object = CladeC_pt2_combi_OMP_RFP, metadata = "CladeC", col.name = 'OR.Clade')
  260. Idents(CladeC_pt2_combi_OMP_RFP) <- CladeC_pt2_combi_OMP_RFP$OR.Clade
  261. #Merge the 3 subsets back together with there new idents
  262. CladesABC_combi_pt2_Merged <- merge(x= CladeA_pt2_combi_OMP_RFP, y = list (CladeB_pt2_combi_OMP_RFP, CladeC_pt2_combi_OMP_RFP))
  263. #Check levels of merged object (Should have three levels A,B and C)
  264. levels(CladesABC_combi_pt2_Merged)
  265. #You can either prep the SCT for find markers or remove the SCT assay.
  266. # I remove it since it is incompatible with DESeq2
  267. #PrepSCTFindMarkers(CladesABC_combi_pt2_Merged, assay = "SCT", verbose = TRUE)
  268. #Deseq2 comparing OR Clades
  269. DefaultAssay(CladesABC_combi_pt2_Merged) <- "RNA"
  270. testCladesABC_combi_pt2_Merged <- CladesABC_combi_pt2_Merged[["SCT"]] <- NULL
  271. #A vs B
  272. CladesAvsB_combi_pt2_Merged_Deseq2<- FindMarkers(CladesABC_combi_pt2_Merged, ident.1 = "CladeA", ident.2 = "CladeB", test.use = "DESeq2")
  273. CladesAvsB_combi_pt2_Merged_Deseq2
  274. data_to_write_out <- as.data.frame(as.matrix(CladesAvsB_combi_pt2_Merged_Deseq2))
  275. fwrite(x = data_to_write_out, row.names = TRUE, file = "CladesAvsB_combi_pt2_10132021.csv")
  276. remove(data_to_write_out)
  277. #AvsC
  278. CladesAvsC_combi_pt2_Merged_Deseq2<- FindMarkers(CladesABC_combi_pt2_Merged, ident.1 = "CladeA", ident.2 = "CladeC", test.use = "DESeq2")
  279. CladesAvsC_combi_pt2_Merged_Deseq2
  280. data_to_write_out <- as.data.frame(as.matrix(CladesAvsC_combi_pt2_Merged_Deseq2))
  281. fwrite(x = data_to_write_out, row.names = TRUE, file = "CladesAvsC_combi_pt2_10132021.csv")
  282. remove(data_to_write_out)
  283. #BvsC
  284. CladesBvsC_combi_pt2_Merged_Deseq2<- FindMarkers(CladesABC_combi_pt2_Merged, ident.1 = "CladeB", ident.2 = "CladeC", test.use = "DESeq2")
  285. CladesBvsC_combi_pt2_Merged_Deseq2
  286. data_to_write_out <- as.data.frame(as.matrix(CladesBvsC_combi_pt2_Merged_Deseq2))
  287. fwrite(x = data_to_write_out, row.names = TRUE, file = "CladesBvsC_combi_pt2_10132021.csv")
  288. remove(data_to_write_out)
  289. # AB vs C
  290. CladesABvsC_combi_pt2_Merged_Deseq2<- FindMarkers(CladesABC_combi_pt2_Merged, ident.1 = c("CladeA","CladeB"), ident.2 = "CladeC", test.use = "DESeq2")
  291. CladesABvsC_combi_pt2_Merged_Deseq2
  292. data_to_write_out <- as.data.frame(as.matrix(CladesABvsC_combi_pt2_Merged_Deseq2))
  293. fwrite(x = data_to_write_out, row.names = TRUE, file = "CladesABvsC_combi_pt2_10132021.csv")
  294. remove(data_to_write_out)
  295. # B vs AC
  296. CladesBvsAC_combi_pt2_Merged_Deseq2<- FindMarkers(CladesABC_combi_pt2_Merged, ident.1 = c("CladeB"), ident.2 = c("CladeA", "CladeC"), test.use = "DESeq2")
  297. CladesBvsAC_combi_pt2_Merged_Deseq2
  298. data_to_write_out <- as.data.frame(as.matrix(CladesBvsAC_combi_pt2_Merged_Deseq2))
  299. fwrite(x = data_to_write_out, row.names = TRUE, file = "CladesBvsAC_combi_pt2_10132021.csv")
  300. remove(data_to_write_out)

10x Genomics scRNAseq Zebrafish OSNs.R at commit 7c431e8, no license · at the source

Overview

  1. Department of Biology, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America
  2. Department of Neurosciences, Perelman School of Medicine, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America
  3. Department of Natural & Applied Sciences, Cheyney University, Cheyney, Pennsylvania, United States of America
Institutions: University of Pennsylvania (United States); Cheyney University of Pennsylvania (United States)
Journal: PLoS genetics, volume 22, issue 4, article e1012090
Dates: received 17 March 2025; accepted 9 March 2026; published online 1 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pgen.1012090 · PMID 41920906 · PMCID PMC13043054 · OpenAlex W7147109692
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: zebrafish (organism), cellular / molecular (subfield)
Methods: Evoked potentials
MeSH: Axons*, Cadherins*, Olfactory Bulb*, Olfactory Receptor Neurons*, Zebrafish Proteins*, Animals, Axon Guidance, Neurodevelopment, Protocadherins, Sensory Receptor Cells, Zebrafish (* major topic)
Topic: Axon Guidance and Neuronal Signaling (Cellular and Molecular Neuroscience, Neuroscience), according to OpenAlex
Funding: National Institute on Deafness and Other Communication Disorders (5R01DC012854); NIGMS NIH HHS (K12 GM081259); NIDCD NIH HHS (R01 DC012854)
Citations: cited by 2 papers (Europe PMC); 85 references in the paper
Research resources: RRID:SCR_022382

Abstract

To understand how neural circuits are assembled, it is essential to identify and characterize the axonal guidance cues and receptors that determine the axonal trajectories and connections between neurons. We performed single-cell RNA sequencing of olfactory sensory neurons from zebrafish to identify candidate axonal guidance-related genes that are differentially expressed according to sensory axon target location in the olfactory bulb. Among the candidates we identified were several members of the non-clustered delta-protocadherin family of adhesion molecules. We found that two members of the delta1-protocadherin family, pcdh7b and pcdh11, are most highly expressed in sensory neurons that project to a specific identifiable neuropil in the early olfactory bulb called the DZ protoglomerulus. Knocking down either one of these protocadherins impairs the ability of sensory axons to terminate within the DZ protoglomerulus. Knockdown does not affect the ability of other sensory axons from terminating normally in a separate neuropil called the CZ protoglomerulus. In contrast, two members of the delta2-protocadherin family, pcdh10b and pcdh17, are most highly expressed in sensory neurons that project to the CZ protoglomerulus. Knocking down pcdh10b induces ectopic terminations of CZ projecting sensory axons. Knocking down pcdh17 induces substantial ectopic axonal trajectories and impairs CZ projecting sensory axons from finding and terminating in the CZ protoglomerulus. Knockdowns of either pcdh10b or pcdh17 do not affect DZ projecting sensory axons. We conclude that delta1-protocadherins help DZ projecting sensory axons enter and remain within the DZ protoglomerulus, while delta2-protocadherins help CZ projecting sensory axons navigate to the CZ protoglomerulus.

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

DanielTBarnes/sc-RNAseq-of-Zebrafish-Olfactory-Sensory-Neurons

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 7c431e8e7cfb77d21ddfec72c6b5c1447289129a, 10 March 2025
Languages: R (2)
Size: 14 files, 2 scripts
Software Heritage: not archived
Found in: “Data Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: data.table (1 file), DESeq2 (1 file), ggplot2 (1 file), patchwork (1 file), pheatmap (1 file), Seurat (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
2 files

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;
  • 2 scripts, each with its path and the digest of its content;
  • 4 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

All scRNA-seq data is available in both raw and processed forms at the Gene Expression Omnibus accession code GSE291626. The scripts used to analyze the data are available at https://github.com/DanielTBarnes/sc-RNAseq-of-Zebrafish-Olfactory-Sensory-Neurons.

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 11 MeSH terms, 3 funders, 83 references, 1 RRID.

Cite

This paper

Barnes, D. T., Crenshaw, E. M. D., Curran, M. J., Herr, J. B., Devereaux, E. S., Seligman, C. D., & Raper, J. A. (2026). Delta family protocadherins contribute to protoglomerular targeting of olfactory sensory neuron axons in the olfactory bulb. PLoS genetics, 22(4), e1012090. https://doi.org/10.1371/journal.pgen.1012090

BibTeX

@article{barnes2026delta,
author = {Barnes, Daniel T and Crenshaw, Ezekiel M D and Curran, Matthew J and Herr, Jessica B and Devereaux, Emily S and Seligman, Carly D and Raper, Jonathan A},
title = {{Delta family protocadherins contribute to protoglomerular targeting of olfactory sensory neuron axons in the olfactory bulb}},
journal = {PLoS genetics},
year = {2026},
month = apr,
volume = {22},
number = {4},
pages = {e1012090},
publisher = {PLOS},
issn = {1553-7390},
doi = {10.1371/journal.pgen.1012090},
url = {https://doi.org/10.1371/journal.pgen.1012090},
pmid = {41920906},
pmcid = {PMC13043054}
}

RIS

TY - JOUR
AU - Barnes, Daniel T
AU - Crenshaw, Ezekiel M D
AU - Curran, Matthew J
AU - Herr, Jessica B
AU - Devereaux, Emily S
AU - Seligman, Carly D
AU - Raper, Jonathan A
TI - Delta family protocadherins contribute to protoglomerular targeting of olfactory sensory neuron axons in the olfactory bulb
T2 - PLoS genetics
J2 - PLoS Genet
PY - 2026
DA - 2026/04/01
VL - 22
IS - 4
SP - e1012090
SN - 1553-7390
PB - PLOS
DO - 10.1371/journal.pgen.1012090
UR - https://doi.org/10.1371/journal.pgen.1012090
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pgen.1012090",
"type": "article-journal",
"title": "Delta family protocadherins contribute to protoglomerular targeting of olfactory sensory neuron axons in the olfactory bulb",
"container-title": "PLoS genetics",
"author": [
{
"family": "Barnes",
"given": "Daniel T"
},
{
"family": "Crenshaw",
"given": "Ezekiel M D"
},
{
"family": "Curran",
"given": "Matthew J"
},
{
"family": "Herr",
"given": "Jessica B"
},
{
"family": "Devereaux",
"given": "Emily S"
},
{
"family": "Seligman",
"given": "Carly D"
},
{
"family": "Raper",
"given": "Jonathan A"
}
],
"container-title-short": "PLoS Genet",
"volume": "22",
"issue": "4",
"page": "e1012090",
"DOI": "10.1371/journal.pgen.1012090",
"PMID": "41920906",
"PMCID": "PMC13043054",
"ISSN": "1553-7390",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pgen.1012090",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
1
]
]
}
}

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-71595-6 [code]
A single-cell and spatial atlas of early human olfactory development.
Journal: Nature communications
In common: Seurat, patchwork, ggplot2, 1 other tool, 8 references
[2] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: DESeq2, pheatmap, Seurat, 4 other tools, zebrafish, cellular / molecular, 1 reference
[3] doi:10.1038/s41593-026-02367-0 [code]
A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.
Journal: Nature neuroscience
In common: DESeq2, pheatmap, Seurat, 4 other tools, cellular / molecular, 2 references
[4] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: DESeq2, pheatmap, Seurat, 4 other tools, cellular / molecular, 2 references
[5] doi:10.1038/s41514-026-00397-3 [code]
Nasal administration of Protollin enhances monocyte phagocytosis and decreases CD8&lt;sup&gt;+&lt;/sup&gt; T cell cytotoxicity in subjects with early Alzheimer's disease: a Phase 1 clinical trial.
Journal: npj aging
In common: DESeq2, pheatmap, Seurat, 4 other tools, 2 references
[6] doi:10.1093/brain/awaf426 [code]
Single-nucleus multiome shows motor neuron glutamate overactivation in amyotrophic lateral sclerosis.
Journal: Brain : a journal of neurology
In common: DESeq2, pheatmap, Seurat, 3 other tools, 3 references
[7] 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 advances
In common: DESeq2, pheatmap, Seurat, 4 other tools, cellular / molecular, 1 reference
[8] doi:10.1038/s41467-026-73772-z [code]
Nociceptor circadian clock genes control excitability and pain perception in mice in a sex- and time-dependent manner.
Journal: Nature communications
In common: DESeq2, pheatmap, Seurat, 4 other tools, cellular / molecular, 1 reference
[9] 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 communications
In common: DESeq2, pheatmap, Seurat, 4 other tools, 1 reference
[10] doi:10.1038/s41598-026-51501-2 [code]
Expanding canonical cortical cell type markers in the era of single-cell transcriptomics.
Journal: Scientific reports
In common: DESeq2, pheatmap, Seurat, 3 other tools, cellular / molecular, 2 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.