Skip to content
/ SPLIT Public

Profile purification of single-cell spatial transcriptomics data

License

Notifications You must be signed in to change notification settings

bdsc-tds/SPLIT

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

98 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

R-CMD-check DOI Version

SPLIT: Spatial Purification of Layered Intracellular Transcripts

🚧 This package is under active development. ❗ Make sure you use the latest version (i.e., v0.1.3).
⚡ Use the Quick Start guide below to get up and running quickly.
📖 A comprehensive tutorial of running SPLIT on Xenium data is now available as .Rmd and .html (<30 min total runtime on a standard PC, incl. 4 min for SPLIT with a peak memory usage of ~21 GB).
🆕🔥 A NEW comprehensive tutorial of running SPLIT on VisiumHD data is now available as .Rmd and .html (~30 min total runtime on a standard PC, incl. 10 min for SPLIT with a peak memory usage of ~52 GB). ❗ Requires SPLIT v0.1.2 or later.


📦 Installation

To install SPLIT from GitHub:

# Install SPLIT
remotes::install_github("bdsc-tds/SPLIT")

🚀 Quick Start

⚠️ IMPORTANT:
SPLIT currently requires doublet-mode RCTD results from the original spacexr GitHub repository or its faster HD fork, not from the newly released Bioconductor version.
🚧 Compatibility with Bioconductor's spacexr is coming soon.

If you already have your Xenium dataset as a Seurat object (xe) and RCTD results from doublet-mode decomposition in RCTD, you can run SPLIT purification like this:

library(SPLIT)
library(spacexr)
library(dplyr)
library(Seurat)
library(ggplot2)

# Post-process RCTD output
RCTD <- SPLIT::run_post_process_RCTD(RCTD)

# Run SPLIT purification
res_split <- SPLIT::purify(
  counts = GetAssayData(xe, assay = 'Xenium', layer = 'counts'), # or any gene x cells counts matrix
  rctd = RCTD,
  DO_purify_singlets = TRUE # optional
)

# Create a purified Seurat object
xe_purified <- CreateSeuratObject(
  counts = res_split$purified_counts,
  meta.data = res_split$cell_meta,
  assay = "Xenium"
)

# Optional: Filter, normalize and visualize
xe_purified <- subset(xe_purified, subset = nCount_Xenium > 5)
xe_purified <- xe_purified %>%
  SCTransform(assay = "Xenium") %>%
  RunPCA() %>%
  RunUMAP(dims = 1:20)
UMAPPlot(xe_purified, group.by = c("first_type"), label = T, repel = T) + theme(aspect.ratio = 1)

Citation

If you use SPLIT in your work, please cite:

From Transcripts to Cells: Dissecting Sensitivity, Signal Contamination, and Specificity in Xenium Spatial Transcriptomics
Mariia Bilous, Daria Buszta, Jonathan Bac, Senbai Kang, Yixing Dong, Stephanie Tissot, Sylvie Andre, Marina Alexandre-Gaveta, Christel Voize, Solange Peters, Krisztian Homicsko, Raphael Gottardo
bioRxiv (2025). https://doi.org/10.1101/2025.04.23.649965

Contact

If you have any questions about the package, feel free to open an issue or contact Mariia Bilous at Mariia.Bilous@chuv.ch.