What happens
Running vaxrank with --input-pvacseq or --input-lens against a real pVACseq / LENS TSV produces an empty rank table. Every variant is dropped during ranking with a "No epitopes for peptide" log message, even when the loaded predictions have legitimate IC50s.
Smoke: cAIrn's HCC1395 example pVACseq TSV (317 rows of real predictions) ranks 0 variants.
Root cause
PR #291 (3.1.0) introduced CandidateEpitope.per_allele_scores as the canonical storage for per-(peptide, allele) DSL scores, and made VaccinePeptide.target_epitope_score read from it. predict_epitopes was updated to populate the new field at predict time. The external-input loaders load_lens and load_pvacseq were not — every loaded epitope ships with per_allele_scores == {}, so epitope_score == 0, target_epitope_score == 0, combined_score == 0, and the ranker drops the variant.
The 3.1.0 PR was verified against the upstream (VCF + BAM) path but not the external-input path.
Fix
Tracked in #294. Adds epitope_dsl.attach_per_allele_scores(epitopes, cfg=None) and calls it at the end of both loaders. Two regression tests pin both paths.
What happens
Running vaxrank with
--input-pvacseqor--input-lensagainst a real pVACseq / LENS TSV produces an empty rank table. Every variant is dropped during ranking with a"No epitopes for peptide"log message, even when the loaded predictions have legitimate IC50s.Smoke: cAIrn's HCC1395 example pVACseq TSV (317 rows of real predictions) ranks 0 variants.
Root cause
PR #291 (3.1.0) introduced
CandidateEpitope.per_allele_scoresas the canonical storage for per-(peptide, allele) DSL scores, and madeVaccinePeptide.target_epitope_scoreread from it.predict_epitopeswas updated to populate the new field at predict time. The external-input loadersload_lensandload_pvacseqwere not — every loaded epitope ships withper_allele_scores == {}, soepitope_score == 0,target_epitope_score == 0,combined_score == 0, and the ranker drops the variant.The 3.1.0 PR was verified against the upstream (VCF + BAM) path but not the external-input path.
Fix
Tracked in #294. Adds
epitope_dsl.attach_per_allele_scores(epitopes, cfg=None)and calls it at the end of both loaders. Two regression tests pin both paths.