FLAVi-CoV Update: Pseudogenes, Tests, and a One-Command Install
FLAVi-CoV now recovers pseudogenes, installs with conda, and ships a test suite
FLAVi-CoV annotates complete genomes of SARS-CoV-2 and other Orthocoronavirinae. I rewrote most of it this week. The new version recovers genes that lost their reading frame, installs from a single conda file, and comes with 122 automated tests.
Pseudogenes stop vanishing from the matrix
An annotator that reports open reading frames cannot report a gene that has no reading frame left. Most recent XBB genomes carry a stop codon at ORF8 codon 8, which leaves seven codons and nothing to annotate. In a set of 277 XBB genomes, only 65 keep an intact ORF8. The old behavior filled the ORF8 partition of the other 208 genomes with missing data. That discards about 76,000 observed nucleotides, and it discards the shared stop codon itself. Every genome that inherited that stop shares one derived state, so filling the partition with missing data deletes the evidence before the analysis starts.
The new --rescue option finds those genes the way we establish homology everywhere else. It searches the reference peptides against the genome with tblastn, which aligns through an internal stop instead of halting at it. ORF8 coverage in that XBB set rises from 65 genomes to 273 of the 275 that annotate. All 208 rescued copies place their first in-frame stop at codon 8, without exception. The option also found five ORF10 pseudogenes nobody was looking for.
Rescued genes stay out of the default partitions on purpose. How to code a pseudogene is an analytical decision, and an annotator should not make that decision quietly.
Anyone can reproduce a run
The repository now carries an environment.yml. Two commands give you Python, Biopython, BLAST, HMMER, MAFFT, and pytest at pinned versions.
conda env create -f environment.yml
conda activate flavi-cov
I tested this from a fresh clone. The reference database builds itself on the first run, and the full test suite passes in under a minute.
Quiet bugs are now loud
Four loops in the old code could run forever on the wrong input, which looks like a stalled job rather than an error. All four are fixed, and each one has a test that fails instead of hanging. A separate defect silently dropped any reading frame that started at the beginning of a frame. A genome that cannot be annotated is now reported and skipped instead of killing the whole run. I also removed the parsl dependency, which added a large install and no real parallelism.
Run pytest after you pull. If it fails on your machine, I want to hear about it.
Previous post
Phyloinformatics News: AI Updates for Bioinformatics
Next post
Phyloinformatics News: October 2026 AI Roundup