Recovers far more genes between distantly related species, runs multi-threaded by default, and fixes a -copies bug that dropped every extra gene copy's transcript.
pip install -U lifton
Fixed
-copies extra gene copies kept only their gene line.
Liftoff suffixes every feature of an extra gene copy with _<n>, so a copy arrives as gene-X_1 / rna-X_1. LiftOn resolved the gene id back to the reference correctly but looked the transcript id up verbatim. rna-X_1 is not in the reference annotation, so the lookup failed and the transcript was skipped — taking every exon and CDS with it, while the already-written gene line remained. The result was a gene with no children, which is useless to every downstream tool.
Measured with -copies across the benchmark corpus: rice 539 of 815 copy genes, human → zebrafish 1,178 of 1,881, maize B73 → Mo17 1,079 of 2,716, human → xenopus 728 of 986, arabidopsis 161 of 223. On MANE v1.5 → CHM13v2.0, 472 of 509.
The reference transcript is now resolved the way the gene already was: the exact id first, and only on a miss the _<n> copy base — accepted only when that base really is a transcript of the reference gene the copy belongs to. Trying the exact id first is what keeps reference ids that genuinely end in _<int> intact; the rice reference, for instance, has trans-spliced part=2 genes such as gene-OrsajCp001_1 whose base gene-OrsajCp001 is the other half of the same gene.
With the aligner input held fixed the change is purely additive: no row lost, every changed row a parent that gained children, and columns 1-8 byte-identical on all of them — so no protein can have moved. Recovered exons and CDS match Liftoff's own coordinates exactly.
A gene emitted with no child features is now counted and reported — at the end of the run, and in run_manifest.json as genes_emitted_without_children. gff3-validate had always flagged these, but only as a warning.
Also in this release
- Many more genes recovered between distant species. A second miniprot-only rescue sub-pass judges candidates by the fraction of the reference protein the hit aligns, instead of by a genomic-span ratio that scales with intron length. Whole-genome primary-assembly gene recall rises from 0.315 to 0.593 (human → zebrafish), 0.364 to 0.615 (human → chicken) and 0.361 to 0.638 (human → xenopus).
--no-coverage-rescue-gateopts out. - Rescued genes carry their isoforms, each held to the same identity floor.
--no-rescue-isoformsopts out. - Miniprot-derived models carry their stop codon.
--no-orf-stop-completionopts out. --threads N > 1now fans out Steps 7 and 8 by itself, byte-identically to the serial path.- Flat prokaryotic annotations lift (top-level
CDS, nogene) instead of selecting nothing (GH #37), and-dir/--intermediate-dirmoves a run's artifact directory (GH #14). - Resource safety and diagnostics on very large targets (GH #71): aligners are scheduled to avoid overlapping index-memory peaks, and
run_manifest.jsonrecords the schedule, exact commands, stage progress, return codes and signal names.
Full detail in CHANGELOG.md.