You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Long-read-only runs no longer show a phantom "Polished - short reads" stage in the report when
dnaapler reoriented the assembly; the reoriented label follows the actual final stage.
Concurrent polishing of samples whose names prefix each other (S1/S12) no longer deletes each
other's SAM files (exact-name cleanup instead of a prefix glob).
SKESA now gets --memory / parallel like SPAdes, instead of each concurrent job claiming the full
budget; bwa and filtlong outputs are streamed to disk instead of buffered whole in memory.
BUSCO downloads its lineages under ~/.hashbrown/db/busco instead of littering the working
directory; blank lines in a mosdepth summary no longer abort the report.
_R1/_R2 detection no longer misreads names like _R10, and a sample with an ambiguous set of
short-read files (e.g. un-merged lanes) stops the run with a clear message instead of silently
continuing with one file.
The benchmark harness resumes no longer inherit the base run's QC-module results (reports are
skipped in harness runs; stale 8_report state is removed on arm copies), and the non-model
benchmark fails loudly if no reference can be extracted instead of hanging on xargs cat.
Changed
Filtlong filtering and fastp trimming are now on by default (skip with --no-filter-long / --no-trim-short; the old opt-in spellings remain accepted no-ops). Porechop (--trim-long) stays
opt-in: it is unmaintained, slow, and redundant on recent basecalls. Short-read-only runs ignore the
long-read prep flags instead of erroring, and the benchmark scripts pin the prep flags to keep the
published validation numbers reproducible.
Unusable inputs fail loudly: an empty input file or broken symlink stops the run immediately with a
clear message; a prep stage that produces nothing warns and falls back to the previous reads; and a run
where no sample assembled exits non-zero instead of printing Done. Read QC figures use 1,000-style
thousands separators on their axes.
Mapping QC covers every read-processing stage: flagstat and mosdepth now run per stage (raw,
trimmed, filtered) instead of only on the most processed reads, so the effect of each step on mapping
rate and depth is measurable; long/short_read_cov.tsv gained a Stage column.
Single-end short reads can polish long-read assemblies: Polypolish (one all-alignments SAM) and
pyPOLCA (no --reads2) both run single-end, so Ion Torrent or unpaired Illumina data works in hybrid
mode; a sample with a pair plus stray extra files keeps the pair with a warning. New --skip-report
flag for harness runs where only the assemblies matter.
--ion-torrent now shapes the whole run, not just SPAdes: fastp skips adapter trimming for Ion
Torrent reads (the Torrent Suite already removed the adapters; the sliding-window quality trim stays),
the flag is accepted in hybrid mode, and polishing a Nanopore assembly with Ion Torrent reads prints a
warning — both platforms share homopolymer/indel errors, so such a polish can confirm errors rather
than fix them (--short-polisher none is suggested).
Added
Ion Torrent polishing benchmark (seventh validation track, two 3-platform isolates): Ion polishing
of a Nanopore assembly fixes ~92% of indels but 96–97% of its residual errors are homopolymer indels,
where depth-matched Illumina leaves none — the --ion-torrent warning now cites the measurement.
QA-grade report design: branded masthead (logo + version), summary verdict cards, a QC criteria
table with pass/warn/fail chips anchored on the MIMAG standard (Bowers et al. 2017) and an overall
draft-quality tier, a traceability appendix (software versions from log.txt, exact command line, run
date), PDF page footers with numbering, per-stage mapped coverage in the read funnel, restyled
tables and figures in HashBrown's palette, light/dark and print safe. Example report: docs/example_report/.
Contamination screening and read-based profiling (reporting phase 4): ConFindr verdict from the
short reads (hashbrown db confindr), a GenomeScope2 genome profile (size estimate, heterozygosity,
read error rate from the short-read 21-mers, reusing Merqury's meryl counts), and a built-in blob
plot — every contig by %GC and coverage, dot area ~ length, colored by its closest RefSeq genome
(per-contig mash dist -i + NCBI datasets; no BlobToolKit-scale databases needed). The plot plus a tables/<sample>_blob.tsv make stray contigs obvious.
Typing, AMR and annotation in the report (reporting phase 3), optional modules like the rest:
MLST (scheme/ST also on the run index), MOB-suite plasmid reconstruction and typing, one merged
gene table from AMRFinderPlus (resistance), abricate+VFDB (virulence) and abricate+PlasmidFinder
(replicons), and genome annotation — Bakta by default when installed, NCBI PGAP via Docker with --annotate pgap (new flag: --annotate {auto,bakta,pgap,none}). hashbrown db gains the bakta, amrfinder and mob modules.
Optional QC modules (reporting phase 2), auto-detected at runtime and reported as skipped-with-a-hint
when not installed: dnaapler reorients every final assembly in place (chromosome to dnaA, plasmids
to rep; the input order is kept next to it as <sample>_unoriented.fasta, and dot plots keep comparing
pre-reorientation sequences); Merqury consensus QV per assembly stage from the short-read k-mers (new
QV column in the report's assembly table); species confirmation — mash against a local RefSeq sketch,
then ANI (fastANI or skani) against the top hit fetched with NCBI datasets; CheckM2
completeness/contamination; BUSCO (prokaryote auto-lineage); barrnap rRNA counts and tRNAscan-SE tRNA counts as annotation sanity checks. Results land in the HTML/PDF report, the tables/ TSVs and 8_report/qc/<sample>/.
hashbrown db {mash,checkm2} downloads the databases those modules need (default ~/.hashbrown/db, override with --dir or $HASHBROWN_DB).
Per-sample HTML report (8_report/, or 4_report/ for short-read-only runs) with a run-level index.html: read funnel tables showing the effect of every read-processing stage (raw → trimmed →
filtered: reads, bases, N50, mean Q, %GC, coverage, % kept), assembly stage-by-stage table
(assembled → Medaka → short-read polished), per-contig mosdepth coverage (long and short reads side by
side), length/quality distribution and coverage figures, and links to the QUAST/pycoQC/dot plot details.
Every table is also written as TSV under 8_report/tables/. A PDF twin is written when WeasyPrint is
installed, and per-stage pycoQC-ng reports when pip install pycoqc-ng was run — both are optional and skipped with a note otherwise.
New core dependencies: seqkit, jinja2, matplotlib. The full reporting/QC roadmap is in docs/reporting_plan.md.