This repository reproduces and compares published single-cell RNA-seq datasets generated with Parse Biosciences Evercode and 10x Genomics Chromium Single Cell 3', using a unified preprocessing pipeline based on kb-python (kallisto|bustools).
10XvParse/
├── Configs/ # Config files
│ ├── indexes/ # Per-species index configs (reference URLs, HRT Atlas URL)
| ├── 10x_info/ # 10X kit whitelists (for STAR alignment)
│ ├── parse_info/ # Parse kit barcode reference (kits_info.txt + barcodes/*.csv)
│ └── Analysis_N/ # Per-assay config dirs (auto-generated Parse files + static 10X files)
├── Data/ # Downloaded FASTQs, pseudoalignment outputs, and H5AD files (gitignored)
├── Index/ # kallisto indices and genome references, organized by species
├── Logs/ # Log files from preprocessing runs
├── Notebooks/ # Jupyter notebooks for downstream analysis and plotting
├── Scripts/ # Python entry-point scripts, one per analysis
└── XvP_utils/ # Shared utility package
├── preprocessing/ # Download, subsampling, pseudoalignment pipelines
└── plotting/ # Plotting helpers for comparison figures
For each Parse assay the pipeline automatically generates the following files in Configs/Analysis_N/<assay_name>/ at run time, derived from the kit name and optional well list in the YAML:
| File | Contents |
|---|---|
r1_R.txt |
Round 1 randO primer barcode sequences for the selected wells (used by splitcode) |
r1_T.txt |
Round 1 polyT primer barcode sequences for the selected wells (used by splitcode) |
onlist.txt |
Per-round barcode whitelist for kb-python error correction, including the sublibrary barcode |
replace.txt |
Maps randO bc1 sequences to their polyT counterparts for kb-python |
bcs_to_wells.txt |
Mapping from all bc1 sequences to well positions (used in analysis notebooks) |
lib_bc.txt |
Sublibrary barcode whitelist (used by STARsolo) |
sublibraries.txt |
Which sublibrary barcode was assigned to which sublibrary name |
The source of truth for all barcode sequences is Configs/parse_info/ — kits_info.txt lists the barcode files for each kit version, and barcodes/*.csv contains the sequences. The pipeline also writes config_RT_parse.txt, parse_keep.txt, and randOpolyT_keep.txt into the same subdirectory at run time.
Dependencies are managed with conda. To create and activate the environment:
conda env create -f environment.yml
conda activate 10XvParseInstall the local XvP_utils package in editable mode so that the scripts and notebooks can import it:
pip install -e .Each analysis has a dedicated script under Scripts/ and a config file under Configs/. The scripts download raw reads from SRA/ERA, build or reuse a kallisto index, pseudoalign, and write .h5ad files to Data/.
python Scripts/analysis2.py # Thymocyte dataset (mouse)
python Scripts/analysis3.py # PBMC dataset (human)
python Scripts/analysis4.py # K562/mESC barnyard dataset
python Scripts/analysis5.py # Frozen PBMC dataset (human)
python Scripts/analysis6.py # Cancer Cell Perturbation dataset (human)
python Scripts/analysis7.py # PBMC dataset (human)Downstream exploration is done in the corresponding Jupyter notebooks under Notebooks/.
Sample: Mus musculus thymocytes from two female mice aged 6 months
Datasets (find here):
- GSM8020231-9: Parse Evercode WT v2, sublibrary 1–9
- GSM8020240 and GSM8020241: Parse Evercode Mini v2, sublibrary 1 and 2
- GSM8020242: 10x Genomics Next Gem v3, Gene Expression
- GSM8020243: 10x Genomics Next Gem v3, TotalSeq™-B hashtag antibodies (BioLegend)
From: Comparative Analysis of Single-Cell RNA Sequencing Methods with and without Sample Multiplexing
Sample: Frozen Homo sapiens PBMCs from two healthy individuals
Datasets (find here):
- GSM7873659,61,63,65,67,69,71,73: Parse Evercode WT v2 H1 replicates 1–8
- GSM7873660,62,64,66,68,70,72,74: Parse Evercode WT v2 H2 replicates 1–8
- GSM7873657: 10x Genomics Next Gem v3 H1
- GSM7873658: 10x Genomics Next Gem v3 H2
From: Comparison of Single Cell Transcriptome Sequencing Methods: Of Mice and Men
Sample: Mixture of K562 human multiple myeloma and mESC mouse embryonic stem cell lines (barnyard)
Datasets uploaded to EBI under PRJEB67544 (10x) and PRJEB67549 (Parse):
- ERR12398015: 10x Next Gem v3
- ERR12167397 and ERR12167398: Parse Evercode Mini v2 sublibrary 1 and 2
From: Comparative Analysis of Commercial Single-Cell RNA Sequencing Technologies Now: [A comprehensive analysis framework for evaluating commercial single-cell RNA sequencing technologies] https://academic.oup.com/nar/article/53/2/gkae1186/7924191#501285411
Sample: Frozen Homo sapiens PBMCs
Datasets (find here):
- SRR28867558: Parse Evercode WT v2
- SRR28867563 and SRR28867562: 10x Next Gem v3.1, technical replicates 1 and 2
From: Comparison of high-throughput single-cell RNA-seq methods for ex vivo drug screening
Sample: Homo sapiens glucocorticoid-resistant E/R+ ALL Reh cell line multiplexed according to drug treatment (6 total perturbation experiments)
Datasets (find here)
- SRR24154339: 10X Next Gem v3
- SRR24154340: Multi-seq barcodes
- SRR24154341-2: Parse Evercode mini v1 replicate 1 and 2
From: Comparative analysis of multiplex single-cell mRNA sequencing of resting and activated PBMCs using droplet-based and split-pool methods (Yet to be published)
Sample: Frozen Homo sapiens PBMCs
Datasets: 10x: AZ13332/AZ_cDNA_S1_L002; 10X Chromium v4 10x_hashtags: LMO/RPI7_S0_L001; 10X Multi-Seq parse: AZ12601/AZ_PS_5k_S5_L002 and AZ12601/AZ_PS_10k_S6_L002; Parse Evercode mini v3
The comparison figures in Notebooks/Comparisons/ use the following experiment labels, ordered by species/tissue. Labels are colored by tissue type in the figures.
| Paper Label | Repository | Sample | Species |
|---|---|---|---|
| Exp 1 | Analysis_6 | Cancer cell perturbation (Reh) | Human |
| Exp 2a | Analysis_3 (H1) | Frozen PBMC, Donor 1 | Human |
| Exp 2b | Analysis_3 (H2) | Frozen PBMC, Donor 2 | Human |
| Exp 3 | Analysis_5 | Frozen PBMC | Human |
| Exp 4 | Analysis_7 | Frozen PBMC | Human |
| Exp 5a | Analysis_2 (standard) | Thymocytes | Mouse |
| Exp 5b | Analysis_2 (mini) | Thymocytes | Mouse |
| Exp 6 | Analysis_4 | K562/mESC barnyard | Human/Mouse |
Follow these steps to add a new analysis:
Reference URLs and the HRT Atlas URL live in Configs/indexes/{species}.yaml, separate from the per-analysis configs. If you are using an existing species (mouse, human, or human_mouse) the index config already exists and nothing needs to change. If you need a new species or a different Ensembl release, create Configs/indexes/{species}.yaml:
species: human
fasta: https://ftp.ensembl.org/pub/release-115/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
gtf: https://ftp.ensembl.org/pub/release-115/gtf/homo_sapiens/Homo_sapiens.GRCh38.115.gtf.gz
hrt_atlas_url: https://raw.githubusercontent.com/Bidossessih/HRT_Atlas/master/www/Housekeeping_GenesHuman.csvThe index directory (Index/{species}/) is shared across all analyses with the same species — updating the URL here will cause the reference to be re-downloaded on the next run (or set overwrite=True in RunSettings).
For barnyard indexes the format uses per-species keys — see Configs/indexes/human_mouse.yaml for the pattern.
Copy an existing config from Configs/ and edit it for your dataset. The config has four required sections:
name: Analysis_N
species: human # or "mouse" / "human_mouse"; determines which Configs/indexes/ file is used
# SRA or ERA accession numbers, grouped by assay type. Parse assays must additionally
# group their accessions by sublibrary (see below).
SRA:
10x:
- SRR_XXXXXXX
parse:
sub1:
- SRR_XXXXXXX
- SRR_XXXXXXX # a second run of the same sublibrary
sub2:
- SRR_XXXXXXX
# R1/R2 file suffixes produced by fasterq-dump. This varies across datasets depending upon
# whether or not Illumina sample indices were indexed and in what order they were saved to SRA.
read_num:
10x:
R1: 1
R2: 2
parse:
R1: 1
R2: 2
# kb-python technology strings for 10X assays; Parse kit name for Parse assays
tech:
10x: 10XV3
parse: WT_v2
# Optional: restrict Parse splitcode filtering to a subset of wells.
# If omitted, all wells in the kit are used.
wells:
parse: [A1, A2, A3]For Parse assays, the tech value must be a kit name of the form <kit>_v<chem> (e.g. WT_v2, WT_mini_v3). The pipeline looks this up in Configs/parse_info/kits_info.txt to obtain the kb-python technology x-string and the correct barcode files, then auto-generates all required splitcode/kb-python config files before running.
Use ERA instead of SRA for European Nucleotide Archive accessions.
A Parse sublibrary is distinguished by its sequencing index, not by the combinatorial barcodes themselves, so the same bc1/bc2/bc3 combination in two sublibraries belongs to two different cells. Sublibraries therefore cannot simply be concatenated. Group each Parse assay's accessions under a sublibrary name, as shown above; splitcode --remultiplex --bclen=4 then prepends a distinct 4 bp sequence to read 2 of each sublibrary, and that sequence is carried downstream as a fourth cell barcode. Accessions listed under the same name are runs of one sublibrary and share a barcode.
Two consequences worth knowing:
- Barcodes are assigned in the order sublibrary names first appear in the YAML, so reordering them invalidates already-processed data. The assignment for a given run is recorded in
Configs/Analysis_N/<assay>/sublibraries.txt. - For assays with no accessions (pre-downloaded local files in
FASTA/Dumped/), eachLib{i}file pair is treated as its own sublibrary. Files belonging to the same sublibrary must be concatenated before the pipeline runs.
Parse cell barcodes in the resulting H5ADs are consequently 4 bp longer, with the sublibrary barcode leading. bc1 remains the trailing 8 bp, so notebook logic keyed on the end of the barcode is unaffected.
Create Scripts/analysisN.py based on an existing script. At minimum, call load_10x and load_parse (and subsample_* variants if you want depth-matched comparisons):
from XvP_utils.preprocessing import load_10x, load_parse, subsample_parse, subsample_10x, get_subsample_num, setup_logger
from XvP_utils.preprocessing import RunSettings
from pathlib import Path
import os
if __name__ == "__main__":
settings = RunSettings(
root_dir=Path(__file__).parent.parent,
config_name="analysisN.yaml",
overwrite=False,
threads=16,
max_workers=4,
)
config_file = settings.root_dir / "Configs" / settings.config_name
os.makedirs(settings.root_dir / "Logs", exist_ok=True)
logger = setup_logger(settings.root_dir / "Logs" / "analysisN.txt")
load_10x(settings, config_file, "10x", logger)
load_parse(settings, config_file, "parse", logger)
subsample_num = get_subsample_num(
settings, config_file,
ten_x_assays=["10x"],
parse_assays=["parse"],
logger=logger,
)
subsample_10x(settings, config_file, "10x", subsample_num, logger)
subsample_parse(settings, config_file, "parse", subsample_num, logger)python Scripts/analysisN.pykb python outputs with .h5ad files will be written to Data/Analysis_N/{assat}/kb_python. Logs go to Logs/analysisN.txt.
Create a directory Notebooks/Analysis_N/ and add a Jupyter notebook for downstream analysis and figures, following the pattern in Notebooks/Analysis_2/ or Notebooks/Analysis_3/.
Add an entry for the new dataset under the Datasets section above, including the paper link, sample description, and accession numbers.