Protocols

Single-cell RNA-seq: from 10x reads to clusters and their markers

Count a 10x run, filter out empty droplets and dying cells, cluster what is left and find the genes that mark each cluster.

Experiment
Single-cell
Level
Intermediate
Hands-on
About two hours to set up and tune
Checked
25 October 2026

What you need

transcriptomeINPUTFASTQCOUNTCellRangerQCScanpyEMBEDUMAPREFGRCh38
The pipeline this protocol builds. More on Single-cell
InputFormat
ReadsThe FASTQ files from a 10x Chromium run, one set per sample..fastq.gz
ReferenceA 10x-style reference for your organism, such as GRCh38 for human.transcriptome
Sample sheetOne row per sample with its condition and batch, if you have more than one sample..csv

Before you start

  • The chemistry the library was made with, for example 3′ v3. It is on the run sheet.
  • Roughly how many cells were loaded, so you can tell whether the count looks right.
  • What tissue this is, because a sensible mitochondrial cut-off depends on it.
  • A few marker genes you already expect to see. They are the quickest check that clustering worked.

Steps

  1. 1

    Count reads per cell

    Uses Cell Ranger

    Connect the reads and the reference to Cell Ranger. It assigns reads to cells by their barcode and counts them per gene.

    Expected cells
    A guide for telling cells from empty droplets, not a hard limit.

    Before going on, check the estimated cell number, the median genes per cell, and the fraction of reads in cells. A low fraction often means a lot of free-floating RNA in the sample.

  2. 2

    Filter cells and genes

    Uses Scanpy

    Remove barcodes that are not real cells, cells that were dying, and genes seen in almost no cells.

    Minimum genes per cell
    Below this, a barcode is usually an empty droplet.
    Maximum mitochondrial %
    Dying cells leak cytoplasmic RNA and look mitochondria-heavy. Tissues like heart and muscle sit higher.
    Minimum cells per gene
    Drops genes too rare to inform clustering.

    Before going on, check the violin plots of genes, counts and mitochondrial share. Set the cut-offs at the tails, and check you have not removed a whole population that is simply smaller.

  3. 3

    Normalise and pick informative genes

    Uses Scanpy

    Scale each cell to the same total, log-transform, and keep the genes that vary most between cells.

    Highly variable genes
    Enough to separate cell types, few enough to keep noise down.

    Before going on, check that the marker genes you expected are among the highly variable ones.

  4. 4

    Cluster

    Uses Scanpy

    Reduce to principal components, connect each cell to its nearest neighbours, and group them into clusters.

    Principal components
    Use the point where the variance plot flattens.
    Resolution
    Higher gives more, smaller clusters. Try two values and keep the one that matches the biology.

    Before going on, check whether clusters follow sample or batch instead of cell type. If one cluster is entirely one sample, that is a batch effect until shown otherwise.

  5. 5

    Lay out and find markers

    Uses UMAP

    Embed the cells in two dimensions and test each cluster against the rest for the genes that mark it.

    Before going on, check the top markers per cluster against what you know. A cluster with no clear markers is often doublets or low-quality cells that passed the filter.

When it goes wrong

Far fewer cells than were loaded
Likely cause. Low capture, or the cut-off between cells and empty droplets is too strict.What to do. Look at the barcode rank plot from Cell Ranger. A clear knee further down means the cells are there.
Most cells fail the mitochondrial filter
Likely cause. Stressed tissue, or a tissue that is naturally mitochondria-rich.What to do. Raise the cut-off for that tissue and note it, rather than discarding most of the sample.
Clusters line up with samples, not cell types
Likely cause. A batch effect between samples.What to do. Add a batch integration step before clustering, using the batch column from the sample sheet.
A small cluster expressing markers of two cell types
Likely cause. Doublets: two cells captured in one droplet.What to do. Add a doublet detection step after filtering and remove the flagged cells.

What you get

  • A UMAP coloured by cluster, sample or any gene
  • A table of marker genes for every cluster
  • The filtered count matrix, ready for other tools
  • QC plots for every sample

Why it is done this way: Single-cell on a laptop: what fits, and what does not yet.

More protocols