OSCR

Spatial transcriptomics of <i>Ciona</i> adult brains reveals functional zonalization and insights into neural gland function.

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] § Results › Tissue annotation for the adult brain of ciona ↔ script/3_Go.r, lines 32–105 · score 0.83 · body wall muscle, ciliated funnel, GO terms, expressed genes, neural gland duct, dorsal strand
  2. [2] § Results › Tissue annotation for the adult brain of ciona ↔ script/2_clustering.r, lines 47–103 · score 0.75 · body wall muscle, ciliated funnel, neural gland duct, cerebral ganglion, dorsal strand, cluster
  3. [3] § Results › Tissue annotation for the adult brain of ciona ↔ script/3_Go.r, lines 32–105 · score 0.65 · body wall muscle, ciliated funnel, neural gland duct, dorsal strand, biologically, enrichment
  4. [4] § Results › Tissue annotation for the adult brain of ciona ↔ script/2_clustering.r, lines 47–103 · score 0.61 · body wall muscle, ciliated funnel, neural gland duct, dorsal strand, ciona
  5. [5] § STAR★Methods › Method details › Mapping and preprocessing ↔ script/2_clustering.r, lines 1–42 · score 0.56 · SCTransform, Seurat, PCA, preprocessing, clustering

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 · 336 lines · 16 KB · CC-BY-4.0 · 3 matches

  1. suppressMessages(library(Seurat))
  2. suppressMessages(library(ggplot2))
  3. suppressMessages(library(patchwork))
  4. suppressMessages(library(cowplot))
  5. library(tidyverse)
  6. library(clustree)
  7. setwd('~/Desktop/project/Ciona_ST/')
  8. set.seed(123)
  9. result_dir <- 'result/result1/clustering/'
  10. nc_merge <- readRDS('result/result1/preprocessing/nc_merge.rds')
  11. nc_merge <- SCTransform(nc_merge, assay = "Spatial", verbose = FALSE)
  12. nc_merge.list <- SplitObject(nc_merge, split.by = 'donor')
  13. features <- SelectIntegrationFeatures(object.list = nc_merge.list)
  14. ciona_nr.anchors <- FindIntegrationAnchors(object.list = nc_merge.list, anchor.features = features)
  15. ciona_nc.combined <- IntegrateData(anchorset = ciona_nr.anchors)
  16. ciona_nc.combined <- ScaleData(ciona_nc.combined, verbose = FALSE)
  17. ciona_nc.combined <- RunPCA(ciona_nc.combined, npcs = 50, verbose = FALSE)
  18. ###Plot PCA distribution across individuals
  19. p1 <- DimPlot(ciona_nc.combined, reduction = 'pca', group.by = 'donor') +
  20. theme_cowplot() +
  21. theme(panel.grid.major=element_blank(),
  22. panel.grid.minor=element_blank(),
  23. axis.title = element_text(face = "bold",size = rel(1)),
  24. plot.title = element_blank(),
  25. legend.position = c(0.8,0.2),
  26. legend.margin=margin(t = 0, unit='cm'))
  27. ggsave(filename = paste0(result_dir, 'pca_after_cca_individual.pdf'), p1, width=3.2, height=3)
  28. p2 <- DimPlot(ciona_nc.combined, reduction = 'pca', group.by = 'orig.ident') +
  29. theme_cowplot() +
  30. theme(panel.grid.major=element_blank(),
  31. panel.grid.minor=element_blank(),
  32. axis.title = element_text(face = "bold",size = rel(1)),
  33. plot.title = element_blank(),
  34. legend.position = c(0.7,0.2),
  35. legend.margin=margin(t = 0, unit='cm'))
  36. ggsave(filename = paste0(result_dir, 'pca_after_cca_slide.pdf'), p2, width=3.2, height=3)
  37. ##
  38. ciona_nc.combined <- RunUMAP(ciona_nc.combined, dims = 1:18)
  39. ciona_nc.combined <- FindNeighbors(ciona_nc.combined, dims = 1:18)
  40. resolutions <- c(0.1,0.2,0.4,0.8)
  41. for (i in resolutions){
  42. ciona_nc.combined <- FindClusters(ciona_nc.combined,resolution = i)
  43. }
  44. saveRDS(ciona_nc.combined, paste0(result_dir, 'ciona_nc.combined.rds'))
  45. ### Vis
  46. p3 <- DimPlot(
  47. ciona_nc.combined,
  48. reduction = "umap",
  49. group.by = "integrated_snn_res.0.2"
  50. ) +
  51. theme_cowplot() +
  52. theme(
  53. axis.title = element_text(face = "bold", size = rel(1)),
  54. axis.text = element_blank(),
  55. axis.ticks = element_blank(),
  56. axis.line = element_blank(),
  57. plot.title = element_blank(),
  58. legend.margin = margin(t = 0, unit = "cm")
  59. )
  60. ggsave(filename = paste0(result_dir, 'umap_clustering_res2.pdf'), p3, width=3.3, height=3)
  61. anno_ids <- c('Body wall muscle', 'Cerebral ganglion', 'Neural gland duct + \n Dorsal strand', 'Neural gland', 'Ciliated funnel')
  62. names(anno_ids) <- levels(ciona_nc.combined)
  63. ciona_nc.combined <- RenameIdents(ciona_nc.combined, anno_ids)
  64. ciona_nc.combined$cell_type <- Idents(ciona_nc.combined)
  65. p3 <- DimPlot(
  66. ciona_nc.combined,
  67. reduction = "umap",
  68. group.by = 'cell_type'
  69. ) +
  70. theme_cowplot() +
  71. theme(
  72. axis.title = element_text(face = "bold", size = rel(1)),
  73. axis.text = element_blank(),
  74. axis.ticks = element_blank(),
  75. axis.line = element_blank(),
  76. plot.title = element_blank(),
  77. legend.margin = margin(t = 0, unit = "cm"),
  78. legend.key.height = unit(0.8, "cm"),
  79. legend.spacing.y = unit(1, "cm"),
  80. )
  81. ggsave(filename = paste0(result_dir, 'umap_anno.pdf'), p3, width=4.8, height=3)
  82. nc_merge <- AddMetaData(nc_merge,[email hidden])
  83. Idents(nc_merge) <- nc_merge$cell_type
  84. p1 <- SpatialDimPlot(nc_merge, images = c('slide1'), crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.4)
  85. ggsave(filename = paste0(result_dir, 'spatial_dim_anno_slide1.pdf'), p1, width=4.8, height=3)
  86. p2 <- SpatialDimPlot(nc_merge, images = c('slide2'), crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.4)
  87. ggsave(filename = paste0(result_dir, 'spatial_dim_anno_slide2.pdf'), p2, width=4.8, height=3)
  88. p3 <- SpatialDimPlot(nc_merge, images = c('slide3'), crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.4)
  89. ggsave(filename = paste0(result_dir, 'spatial_dim_anno_slide3.pdf'), p3, width=4.8, height=3)
  90. p4 <- SpatialDimPlot(nc_merge, images = c('slide2'), crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.4)
  91. ggsave(filename = paste0(result_dir, 'spatial_dim_anno_slide4.pdf'), p4, width=4.8, height=3)
  92. ciona_nc.0.2.markers <- FindAllMarkers(ciona_nc.combined, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
  93. ciona_nc.0.2.markers <- ciona_nc.0.2.markers[ciona_nc.0.2.markers$p_val_adj < 0.05,]
  94. ciona_human_genes <- read.table('result/ciona_human_homo.tsv', sep = '\t', header = TRUE)
  95. ciona_human_genes$gene_model <- paste0('KH2013:',ciona_human_genes$gene_model)
  96. colnames(ciona_human_genes)[2] <- 'human_homolog'
  97. ciona_nc.0.2.markers <- left_join(ciona_nc.0.2.markers, ciona_human_genes[,c('gene_model', 'human_homolog')], by = c('gene' = 'gene_model'))
  98. ciona_nc.0.2.markers.top10 <- ciona_nc.0.2.markers %>% group_by(cluster) %>% slice_max(n=10, order_by = avg_log2FC)
  99. p1 <- DoHeatmap(
  100. ciona_nc.combined,
  101. features = ciona_nc.0.2.markers.top10$gene,
  102. group.by = "cell_type",
  103. label = FALSE
  104. ) +
  105. theme(
  106. axis.ticks.x = element_blank()
  107. )
  108. ggsave(
  109. filename = paste0(result_dir, "heatmap_top10.pdf"),
  110. plot = p1,
  111. width = 5, height =6
  112. )
  113. ciona_nc.0.2.markers$cluster <- gsub("[\r\n]+", " ", ciona_nc.0.2.markers$cluster)
  114. write.table(ciona_nc.0.2.markers, paste0(result_dir, 'res2_cluster.markers.txt'),quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  115. saveRDS(ciona_nc.combined, paste0(result_dir, 'ciona_nc.combined.rds'))
  116. saveRDS(nc_merge, paste0(result_dir, 'nc_merge_bf_cca.rds'))
  117. p1 <- SpatialDimPlot(nc_merge, group.by = 'integrated_snn_res.0.4', images = 'slide2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) +
  118. guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  119. ggsave(
  120. filename = paste0(result_dir, "slide2_spatial_dim_res04.pdf"),
  121. plot = p1,
  122. width = 5, height =3
  123. )
  124. Idents(ciona_nc.combined) <- ciona_nc.combined$integrated_snn_res.0.4
  125. bodywallmuscle.markers <- FindMarkers(ciona_nc.combined, ident.1 = 1, ident.2 = 3)
  126. bodywallmuscle.markers <- bodywallmuscle.markers[bodywallmuscle.markers$p_val_adj < 0.05, ]
  127. write.table(bodywallmuscle.markers, paste0(result_dir, 'bodywallmuscle.markers.txt'),quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  128. p1 <- SpatialFeaturePlot(nc_merge, features = 'KH2013:KH.C12.521', images = 'slide2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8)
  129. p2 <- SpatialFeaturePlot(nc_merge, features = 'KH2013:KH.C7.598', images = 'slide2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8)
  130. ggsave(
  131. filename = paste0(result_dir, "bodywallMuscle_markers.pdf"),
  132. plot = p1 | p2,
  133. width = 10, height =5
  134. )
  135. # ciona_nc.merge <- AddMetaData(ciona_nc.merge,[email hidden])
  136. # Idents(ciona_nc.merge) <- ciona_nc.merge$integrated_snn_res.0.2
  137. # SpatialDimPlot(ciona_nc.merge, images = 'sample1', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  138. # SpatialDimPlot(ciona_nc.merge, images = 'sample2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  139. # SpatialDimPlot(ciona_nc.merge, images = 'sample3', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  140. # SpatialDimPlot(ciona_nc.merge, images = 'sample4', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  141. # Idents(ciona_nc.merge) <- ciona_nc.merge$integrated_snn_res.0.4
  142. # SpatialDimPlot(ciona_nc.merge, images = 'sample1', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  143. # SpatialDimPlot(ciona_nc.merge, images = 'sample2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  144. # SpatialDimPlot(ciona_nc.merge, images = 'sample3', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  145. # SpatialDimPlot(ciona_nc.merge, images = 'sample4', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + guides(fill=guide_legend(title="Clusters",override.aes = list(size = 5)))
  146. # Idents(ciona_nc.combined) <- ciona_nc.combined$integrated_snn_res.0.2
  147. # ciona_nc.0.2.markers <- FindAllMarkers(ciona_nc.combined, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
  148. # ciona_nc.0.2.markers <- filter(ciona_nc.0.2.markers,p_val_adj < 0.05)
  149. # write.table(ciona_nc.0.2.markers,'result/clustering/ciona_nc.0.2.markers.csv',quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  150. # ciona_nc.0.2.markers.top20 <- ciona_nc.0.2.markers %>% group_by(cluster) %>% slice_max(n=20, order_by = avg_log2FC)
  151. # DoHeatmap(ciona_nc.combined, features = ciona_nc.0.2.markers.top20$gene) + NoLegend()
  152. # Idents(ciona_nc.combined) <- ciona_nc.combined$integrated_snn_res.0.4
  153. # ciona_nc.0.4.markers <- FindAllMarkers(ciona_nc.combined, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
  154. # ciona_nc.0.4.markers <- filter(ciona_nc.0.4.markers,p_val_adj < 0.05)
  155. # write.table(ciona_nc.0.4.markers,'result/clustering/ciona_nc.0.4.markers.csv',quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  156. # ciona_nc.0.4.markers.top20 <- ciona_nc.0.4.markers %>% group_by(cluster) %>% slice_max(n=20, order_by = avg_log2FC)
  157. # DoHeatmap(ciona_nc.combined, features = ciona_nc.0.4.markers.top50$gene) + NoLegend()
  158. # ciona_nc.0.8.markers <- FindAllMarkers(ciona_nc.combined, logfc.threshold = 0.25, min.pct = 0.25, only.pos = TRUE)
  159. # ciona_human_genes <- read.table('../TF/pythonCodes/codes/results/ciona_human_homo.tsv', sep = '\t', header = TRUE)
  160. # ciona_human_genes$gene_model <- paste0('KH2013:',ciona_human_genes$gene_model)
  161. # rownames(ciona_human_genes) <- ciona_human_genes$gene_model
  162. # ciona_nc.0.2.markers$human_homologs <- ciona_human_genes[ciona_nc.0.2.markers$gene,]$gene_name
  163. # write.table(ciona_nc.0.2.markers,'result/clustering/ciona_nc.0.2.markers.csv',quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  164. # ciona_nc.0.4.markers <- read.table('result/clustering/ciona_nc.0.4.markers.csv', sep = ',', header = TRUE)
  165. # ciona_nc.0.4.markers$human_homologs <- ciona_human_genes[ciona_nc.0.4.markers$gene,]$gene_name
  166. # write.table(ciona_nc.0.4.markers,'result/clustering/ciona_nc.0.4.markers.csv',quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  167. # ciona_nc.0.8.markers <- read.table('result/clustering/ciona_nc.0.8.markers.csv', sep = ',', header = TRUE)
  168. # ciona_nc.0.8.markers$human_homologs <- ciona_human_genes[ciona_nc.0.8.markers$gene,]$gene_name
  169. # write.table(ciona_nc.0.8.markers,'result/clustering/ciona_nc.0.8.markers.csv',quote = FALSE,sep = ',', col.names = TRUE, row.names = FALSE)
  170. # mySpatialFeatureaPlot <- function(sp,feature, save_image=TRUE){
  171. # p1 <- SpatialFeaturePlot(sp,features = feature,images = 'sample1', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8)
  172. # p2 <- SpatialFeaturePlot(sp,features = feature,images = 'sample2', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8)
  173. # p3 <- SpatialFeaturePlot(sp,features = feature,images = 'sample3', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + theme(legend.position = 'bottom')
  174. # p4 <- SpatialFeaturePlot(sp,features = feature,images = 'sample4', crop = FALSE, pt.size.factor = 1.3,image.alpha = 0.8) + theme(legend.position = 'bottom')
  175. # p12 <- p1 | p2
  176. # p34 <- p3 | p4
  177. # if (save_image == TRUE){
  178. # ggsave(paste0('result/spatialPlot/',substring(feature, first = 8),'_sample12','.pdf'),
  179. # p12,
  180. # dpi = 200,
  181. # units = 'cm',
  182. # width = 30,
  183. # height = 16)
  184. # ggsave(paste0('result/spatialPlot/',substring(feature, first = 8),'_sample34','.pdf'),
  185. # p34,
  186. # dpi = 200,
  187. # units = 'cm',
  188. # width = 30,
  189. # height = 16)
  190. # }
  191. # }
  192. # nc_merge_sct <- AddMetaData(nc_merge_sct, [email hidden])
  193. # saveRDS(nc_merge_sct, file = 'result/rds/nc_merge_sct.rds')
  194. # ##################################################
  195. # opsin_genes <- data.frame(gene_name= c('Ci-opsin1', 'Ci-opsin2', 'Ci-opsin3', 'Ci-opsin5', 'Ci-opsin6', 'Ci-Nut2', 'Ci-Nut1'),
  196. # kh_model = c('KH.L171.13', 'KH.L38.6','KH.L57.28', 'KH.C9.770', 'KH.C7.385', 'KH.C14.516', 'KH.C14.4'))
  197. # opsin_genes$kh2013 <- paste0('KH2013:',opsin_genes$kh_model)
  198. # opsin_genes_counts <- nc_merge_sct@assays$Spatial@data[opsin_genes$kh2013,]
  199. # opsin_genes$num_spot_expressed <- rowSums(opsin_genes_counts > 0)
  200. # opsin_genes$mean_in_expressed_spot <- rowSums(opsin_genes_counts)/rowSums(opsin_genes_counts > 0)
  201. # opsin_genes$mean_in_expressed_spot <- round(opsin_genes$mean_in_expressed_spot,digits = 2)
  202. # opsin_genes$max_expressed <- apply(opsin_genes_counts,MARGIN = 1, max)
  203. # # check the expression level of Ci-opsin2 in cerebral ganglion.
  204. # cluster0 <- subset(larva_ner, subset = integrated_snn_res.0.2 == '0')
  205. # Idents(cluster0, WhichCells(object = cluster0, expression = `KH2013:KH.L38.6` > 0, slot = 'counts')) <- 'Ci-opsin2_positive'
  206. # Idents(cluster0, WhichCells(object = cluster0, expression = `KH2013:KH.L38.6` <= 0, slot = 'counts')) <- 'Ci-opsin2_negative'
  207. # cluster0 <- PrepSCTFindMarkers(cluster0)
  208. # genes <- FindMarkers(cluster0, ident.1 = 'Ci-opsin2_positive', ident.2 = 'Ci-opsin2_negative', slot = 'data')
  209. # gene_for_vln <- subset(opsin_genes, num_spot_expressed > 4)
  210. # VlnPlot(nc_merge_sct,gene_for_vln$kh2013,pt.size = FALSE, stack = TRUE, flip = TRUE, group.by = 'integrated_snn_res.0.2') +
  211. # geom_boxplot(width=0.1,fill="white",outlier.size = 0) +
  212. # NoLegend() +
  213. # theme(axis.title.x=element_blank())
  214. # myFeaturePlot <- function(sce,feature, save_image =TRUE){
  215. # p1 <- FeaturePlot(sce, features = feature) +
  216. # theme_bw() +
  217. # theme(panel.grid.major=element_blank(),
  218. # panel.grid.minor=element_blank(),
  219. # axis.title = element_text(face = "bold",size = rel(1)),
  220. # plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
  221. # legend.margin=margin(t = 0, unit='cm')) +
  222. # ggtitle(feature)
  223. # if (save_image == TRUE){
  224. # ggsave(paste0('result/opsin_genes/',substring(feature, first = 8),'_featurePlot','.pdf'),
  225. # p1,
  226. # dpi = 200,
  227. # units = 'cm',
  228. # width = 17,
  229. # height = 15)
  230. # }
  231. # }
  232. # for (x in opsin_genes$kh2013){
  233. # myFeaturePlot(nc_combined, feature = x)
  234. # }
  235. # nc_combined <- readRDS('result/rds/nc_combined.rds')
  236. # cluster0 <- subset(nc_combined, integrated_snn_res.0.8 == c(0,5,9,10))
  237. # markers_sep <- FindAllMarkers(cluster0,only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
  238. # markers_sep <- subset(markers_sep, p_val_adj < 0.05)
  239. # markers_sep$human_homologs <- ciona_human_genes[markers_sep$gene,]$gene_name
  240. # ##get highly variable genes from samples
  241. # ciona_merge <- readRDS('../result/rds/nc_merge.rds')
  242. # ciona_merge <- SCTransform(ciona_merge, assay = 'Spatial', verbose = FALSE, variable.features.n = 1000)
  243. # hvgs <- VariableFeatures(ciona_merge)
  244. # opsin_genes <- c('KH.L171.13', 'KH.L38.6','KH.L57.28', 'KH.C9.770', 'KH.C7.385', 'KH.C14.516', 'KH.C14.4')
  245. # hvgs_opsin <- c(hvgs, paste0("KH2013:",opsin_genes))
  246. # nc_regulon_info <- readRDS('../../SCENIC/results/R_downstream/ciona/nc_regulon_info.rds')
  247. # regulon_tf <- nc_regulon_info$tf_info$tf_name
  248. # hvgs_opsin_tf <- c(hvgs_opsin, regulon_tf)
  249. # hvgs_opsin_tf <- unique(hvgs_opsin_tf)
  250. # hvgs_opsin_tf_merge <- paste(hvgs_opsin_tf, collapse = "|")

2_clustering.r, under CC-BY-4.0 · at the source

Overview

Authors: Xin Zeng1,2, Fuki Gyoja3, Ayana Maruo3, Nanako Okawa3, Ken-ichi Mizutani4, Yutaka Suzuki2, Kenta Nakai1,2, Takehiro G. Kusakabe3
  1. Human Genome Center, The Institute of Medical Science, The University of Tokyo, Tokyo 108-8639, Japan
  2. Department of Computational Biology and Medical Sciences, The University of Tokyo, Kashiwa 277-8563, Japan
  3. Institute for Integrative Neurobiology and Department of Biology, Konan University, Kobe 658-8501, Japan
  4. Graduate School of Pharmaceutical Sciences, Kobe Gakuin University, Kobe 650-8586, Japan
Institutions: The University of Tokyo (Japan); Konan University (Japan); Kobe Gakuin University (Japan)
Journal: iScience, volume 29, issue 9, article 117346
Dates: received 20 April 2026; accepted 23 July 2026; published online 24 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1016/j.isci.2026.117346 · PMID 42698976 · PMCID PMC13542503 · OpenAlex W7204098736
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Graphs
Keywords: Ciona, invertebrate chordate, ascidian, central nervous system, spatial transcriptomics, chordate evolution, super-resolved gene expression map
Topic: Neurogenesis and neuroplasticity mechanisms (Developmental Neuroscience, Neuroscience), according to OpenAlex
Funding: Japan Society for the Promotion of Science (23K27185, 23H02492, 22K06189, 21K19280); Hirao Taro Foundation; Academic Research; Takeda Science Foundation (2015021209); Japan Science and Technology Corporation; Support for Pioneering Research Initiated by the Next Generation (JPMJSP2108)
Citations: not cited yet (Europe PMC); 35 references in the paper

Abstract

The ascidian Ciona is a pivotal chordate model for illuminating the evolutionary origins of the vertebrate brain. Here, spatial transcriptomics of the adult Ciona neural complex, combined with image-based computational super-resolution mapping, resolved distinct tissue domains including the cerebral ganglion, neural gland, ciliated funnel, neural gland duct/dorsal strand, and body wall muscle. Within the cerebral ganglion, high-resolution mapping revealed clear molecular zonalization separating the cortex and medulla, alongside regional specialization within the cortex itself. The neural gland exhibited localized enrichment of genes associated with extracellular matrix and cell-cell interactions. These spatial features suggest that the neural gland functions as a homeostatic and signaling interface, reminiscent of primitive vertebrate meninges or choroid plexus. Overall, this spatially defined gene expression map provides a foundational framework for understanding functional regionalization in the tunicate brain and its evolutionary relationship to vertebrate nervous systems.

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.

figshare 31915545

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 3 files
Software Heritage: not checked
Found in: “Data and code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: ggplot2 (4 files), cowplot (3 files), patchwork (3 files), Seurat (3 files), tidyverse (3 files), clusterProfiler (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
6 files
At the source:

xzengComBio/Ciona_ST

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: abbd9dce150552a20fb13f1bb7c8acd01d270395, 13 April 2026
Languages: R (5)
Size: 11 files, 5 scripts
Software Heritage: not archived
Found in: “Data and code availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: ggplot2 (4 files), cowplot (3 files), patchwork (3 files), Seurat (3 files), tidyverse (3 files), clusterProfiler (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
6 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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 10 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

No dataset and no data link were found in the paper.

Data and code availability

• FASTQ sequencing data generated in this study are publicly available in the Gene Expression Omnibus (GEO) under accession number GSE327796. Processed data are publicly available on figshare (https://doi.org/10.6084/m9.figshare.31915545). • All custom codes generated for this study are publicly available on GitHub at https://github.com/xzengComBio/Ciona_ST and figshare (DOI: https://doi.org/10.6084/m9.figshare.31915545). • Any additional information required to reanalyze the data reported in this paper is available from the lead contact upon request

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

Versions

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

Version 2, 28 September 2026

  • Authors: added Kenta Nakai (0000-0002-8721-8883); removed Kenta Nakai

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 8 authors, 7 keywords, 6 funders, 33 references.

Cite

This paper

Zeng, X., Gyoja, F., Maruo, A., Okawa, N., Mizutani, K.-i., Suzuki, Y., Nakai, K., & Kusakabe, T. G. (2026). Spatial transcriptomics of &lt;i&gt;Ciona&lt;/i&gt; adult brains reveals functional zonalization and insights into neural gland function. iScience, 29(9), 117346. https://doi.org/10.1016/j.isci.2026.117346

BibTeX

@article{zeng2026spatial,
author = {Zeng, Xin and Gyoja, Fuki and Maruo, Ayana and Okawa, Nanako and Mizutani, Ken-ichi and Suzuki, Yutaka and Nakai, Kenta and Kusakabe, Takehiro G.},
title = {{Spatial transcriptomics of \&lt;i\&gt;Ciona\&lt;/i\&gt; adult brains reveals functional zonalization and insights into neural gland function}},
journal = {iScience},
year = {2026},
month = aug,
volume = {29},
number = {9},
pages = {117346},
publisher = {Elsevier},
issn = {2589-0042},
doi = {10.1016/j.isci.2026.117346},
url = {https://doi.org/10.1016/j.isci.2026.117346},
pmid = {42698976},
pmcid = {PMC13542503}
}

RIS

TY - JOUR
AU - Zeng, Xin
AU - Gyoja, Fuki
AU - Maruo, Ayana
AU - Okawa, Nanako
AU - Mizutani, Ken-ichi
AU - Suzuki, Yutaka
AU - Nakai, Kenta
AU - Kusakabe, Takehiro G.
TI - Spatial transcriptomics of &lt;i&gt;Ciona&lt;/i&gt; adult brains reveals functional zonalization and insights into neural gland function
T2 - iScience
J2 - iScience
PY - 2026
DA - 2026/08/24
VL - 29
IS - 9
SP - 117346
SN - 2589-0042
PB - Elsevier
DO - 10.1016/j.isci.2026.117346
UR - https://doi.org/10.1016/j.isci.2026.117346
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.isci.2026.117346",
"type": "article-journal",
"title": "Spatial transcriptomics of &lt;i&gt;Ciona&lt;/i&gt; adult brains reveals functional zonalization and insights into neural gland function",
"container-title": "iScience",
"author": [
{
"family": "Zeng",
"given": "Xin"
},
{
"family": "Gyoja",
"given": "Fuki"
},
{
"family": "Maruo",
"given": "Ayana"
},
{
"family": "Okawa",
"given": "Nanako"
},
{
"family": "Mizutani",
"given": "Ken-ichi"
},
{
"family": "Suzuki",
"given": "Yutaka"
},
{
"family": "Nakai",
"given": "Kenta"
},
{
"family": "Kusakabe",
"given": "Takehiro G."
}
],
"container-title-short": "iScience",
"volume": "29",
"issue": "9",
"page": "117346",
"DOI": "10.1016/j.isci.2026.117346",
"PMID": "42698976",
"PMCID": "PMC13542503",
"ISSN": "2589-0042",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.isci.2026.117346",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
24
]
]
}
}

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.1002/imt2.70163 [code]
Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.
Journal: iMeta
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 3 references
[2] doi:10.1038/s41380-026-03629-w [code]
Maternal fasting during early gestation induces epigenetic alterations and schizophrenia-related phenotypes.
Journal: Molecular psychiatry
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 1 reference
[3] 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: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 1 reference
[4] doi:10.1126/sciadv.aeg3223 [code]
The extreme diversity of retinal amacrine cells has deep evolutionary roots.
Journal: Science advances
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 1 reference
[5] doi:10.1038/s41467-026-73305-8 [code]
Comparative analysis of the cellular landscape in mammalian striatum.
Journal: Nature communications
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 1 reference
[6] 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: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular, 1 reference
[7] doi:10.1002/advs.77986 [code]
DUET-seq: An Open-Source Droplet Platform for High-Fidelity Joint Chromatin and Transcriptome Profiling Reveals Temporal Regulatory Decoupling in Single Cells.
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, 1 reference
[8] doi:10.1038/s41597-026-07185-4 [code]
A multi-center cross-platform single-cell multimodal atlas of the mouse cerebral cortex.
Journal: Scientific data
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, 1 reference
[9] doi:10.1038/s44318-026-00806-z [code]
Interspecific diversity in the neuronal composition of the mammalian cortex arises from heterochrony in neurogenesis.
Journal: The EMBO journal
In common: clusterProfiler, Seurat, cowplot, 3 other tools, 1 reference
[10] doi:10.1038/s41467-026-76232-w [code]
Th17 effector cytokines induce shared and distinct microglial and endothelial cell responses in a mouse model for post-streptococcal encephalitis.
Journal: Nature communications
In common: clusterProfiler, Seurat, cowplot, 3 other tools, genetics / omics, cellular / molecular

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.