Skill: RNA-seq Read Counting
Use When
- User has aligned BAMs and needs a gene-level count matrix for differential expression
- User wants to count reads per gene feature from GTF annotation
- User needs to handle strandedness correctly
- User wants to count multiple BAMs into a single matrix
Inputs
- Required:
- BAM file(s) (one or more coordinate-sorted BAMs)
- GTF annotation file
- Optional:
- Tool choice:
featurecountsorhtseq(default:featurecounts) - Strandedness:
0= unstranded,1= stranded,2= reverse-stranded (default:0) - Feature type to count (default:
exon) - Attribute for grouping (default:
gene_id) - Number of threads (default: 4)
- Output path
- Paired-end flag
- Minimum mapping quality
- Tool choice:
Workflow
- Validate BAM files are sorted and indexed.
- Determine strandedness if not specified (recommend checking with RSeQC
infer_experiment.py). - If featureCounts: run with
-T threads,-s strandedness,-a GTF,-o output. For multiple BAMs, featureCounts natively produces a multi-sample count matrix. - If HTSeq-count: run
htseq-countwith--stranded,--type,--idattr. For multiple BAMs, run per-sample then merge columns into a single matrix. - For multi-BAM input: featureCounts natively produces a matrix; HTSeq-count requires per-sample runs then merge.
- Report: total assigned reads, unassigned categories (ambiguous, multimapping, no feature), assignment rate per sample.
Output Contract
- Count matrix: TSV file with gene IDs as rows and samples as columns
- Count summary statistics (featureCounts
.summaryfile or HTSeq-count footer) - Per-sample assignment rates
Limits
- featureCounts is multi-threaded and faster; HTSeq-count is single-threaded.
- Strandedness must match library prep protocol or counts will be incorrect.
- featureCounts is part of the Subread package and must be installed.
- BAMs must be coordinate-sorted.
- Common failure cases: wrong strandedness setting, unsorted BAMs, GTF/BAM chromosome naming mismatch.
Scan to join WeChat group