CBQ-native all-in-one quality control tool
The Hiller Lab at the Senckenberg Research Institute
binseq .
usage .
benchmark .
us
removes adapter sequences, trims, deduplicates, extracts UMIs, and filters sequencing
reads stored in CBQ files. It works natively on CBQ: no FASTQ conversion,
no intermediate file, and every stage runs in one pass over the input.
Important
- 📄 CBQ-native: reads CBQ directly.
- ⚡~ 4-8x faster than the field on typical data (fastp, cutadapt, atropos, trimmomatic), with 📉 ~90% less memory.
- 🧬 Reference-free sniff adapters (curated 234-known adapters) and 👃 sniff strandeness for RNA against a Salmon index (given or produced on-the-fly through
--transcriptome <PATH>). - 🔄 Everything in one pass: 3' adapter removal (incl.
--allow-indels), quality/positional/homopolymer trim, polyA/G tails, overlap error correction from the mate, internal-adapter split, UMI extraction, filtering — configurable. - 🔒 Deterministic + safe: single static binary
cargo install --all-features bqcdocker pull ghcr.io/hillerlab/bqc:latestconda install -c bioconda bqcSee bench.md for full details.
typical— synthetic, generated by bench/gen.py: 150 bp, A1/A2 adapters with per-base quality decay (phred33), i.e. a realistic "standard adapter-trimming" workload.real— the first 2M pairs(head -$((P_REAL*4)) lines)of real sequencing dataSRR8997011(~100 bp), which has no adapters to trim — so it measures raw throughput/overhead on genuine data rather than trimming effect.
| dataset | tool | wall s | RSS MB | reads out | bases out (M) | mean len | pairs kept | adapter ppm |
|---|---|---|---|---|---|---|---|---|
| typical | bqc | 1.59 | 176 | 1,957,469 | 251.7 | 128.6 | 1,957,469 | 0.0 |
| typical | fastp | 6.46 | 1235 | 1,957,469 | 251.3 | 128.4 | 1,957,469 | 0.0 |
| typical | cutadapt | 3.86 | 50 | 1,957,469 | 251.2 | 128.3 | 1,957,469 | 0.0 |
| typical | atropos | 16.65 | 60 | 1,957,469 | 251.2 | 128.3 | 1,957,469 | 0.0 |
| typical | trimmomatic | 12.95 | 1154 | 1,957,469 | 251.8 | 128.7 | 1,957,469 | 0.0 |
| real | bqc | 1.23 | 103 | 1,965,023 | 196.6 | 100.0 | 1,965,023 | 0.0 |
| real | fastp | 5.00 | 1240 | 1,828,671 | 180.9 | 98.3 | 1,828,671 | 0.0 |
| real | cutadapt | 3.08 | 51 | 1,964,259 | 196.2 | 99.7 | 1,964,259 | 0.0 |
| real | atropos | 15.43 | 62 | 1,964,259 | 196.2 | 99.7 | 1,964,259 | 0.0 |
| real | trimmomatic | 7.72 | 1149 | 1,921,288 / 1,863,229 | 188.1 / 181.4 | 97.6 | 1,827,052 | 0.0 |
| op | bqc wall s | bqc RSS MB | fastp wall s | fastp RSS MB |
|---|---|---|---|---|
| UMI (8 bp read1) | 0.48 | 100 | 1.32 | 80 |
| dedup 0% | 1.05 | 612 | 3.21 | 4204 |
| dedup 50% | 2.09 | 1473 | 3.61 | 4192 |
bqc dedup is exact; fastp's Bloom filter over-deletes (~65–168 unique reads at 10–50% duplication) and pins 4.2 GB regardless of duplication, while bqc memory scales with candidate families (612 MB → 1.47 GB).