Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

ProSE: rescore all runs of a multi-file search with one joint Percolator model

Aperta
#10,581 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@satyam102006 ci sta già lavorando.

Dal 15/10/2026.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
8/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
cpp
Ambito
data

Direzione di ricerca

The per-file rescoring lives in ProSEAlgorithm::applyPsmFDR_, called from the multi-file loop in searchWithModificationAnalysis(), and Percolator::rescorePSMs trains and scores one list at a time. Read how MultiFileSearchResult::per_file holds the PSMs, then decide how training across all runs fits before per-run scoring. Done means the two-file, blank-like and per_run tests described in the issue pass.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Motivation

With #10578, ProSE rescores PSMs with Percolator by default (Search:rescore). Each input file is rescored on its own and gets its own model. Small runs suffer from this:

  • Single-cell runs and other small runs: each run trains a model on its own few PSMs. A run with fewer than 100 PSMs, or without decoy PSMs, is not rescored at all and keeps its HyperScore-based q-values. A run just above that limit gets a model trained on very little data. The 100 PSMs are all PSMs (best hit per spectrum, targets and decoys, before the FDR filter), not confident identifications.
  • Blanks: a blank easily has more than 100 PSMs, all of them false. Percolator then runs. Its sanity check finds no targets at q < test FDR and falls back to the best single feature (Resetting score vector, using default vector). The result is conservative: in a simulation with real spectra against a random database, 0 target PSMs passed 5% FDR. But the run is reported as rescored.
  • Batches with -out_merged: if Percolator rescores only some files (e.g. one blank or one small run in a batch), the runs report different search engines and scores. They cannot be pooled, so -out_merged fails (since #10578 with exit code INCOMPATIBLE_INPUT_DATA). With rescoring on by default, this hits typical single-cell batches.

Proposal

For multi-file searches, train one Percolator model on the PSMs of all runs (a joint model, as mokapot offers for single-cell data). Apply it to every run, and compute q-values per run (and on the pooled set for -out_merged).

  • Small runs and blanks are scored with a model trained on enough data. Only the q-value estimate stays per run.
  • All runs carry Percolator scores, so -out_merged always works. The mixed outcome disappears, except when the whole batch has too few PSMs or no decoys.
  • Keep per-run models as an option, e.g. a parameter rescore:model with joint (default for more than one file) and per_run.

Implementation notes

  • Today the rescoring sits in ProSEAlgorithm::applyPsmFDR_, which the multi-file path of searchWithModificationAnalysis() calls per file inside its search loop. A joint model needs the PSMs of all files first: train after all searches, then apply the model and the PSM FDR per file, then compute the run statistics, the modification analysis and the pooled aggregate.
  • Percolator::rescorePSMs trains and scores one PeptideIdentificationList. A joint model needs either one call on the concatenated PSMs, with per-run TDC and q-values afterwards from the SVM score, or a split into train (all runs) and score (each run).
  • The PIN feature set must be the same for all runs: standard features with the charge range over all runs, plus extra_features, which already match across runs of one search.
  • Memory: the PSMs of all files are kept anyway (MultiFileSearchResult::per_file), so training needs no additional copy beyond Percolator's own feature matrix.
  • The chunked multi-file loop and the distributed (sharded) workflow keep per-run models, or document that a joint model needs all shards in one process.

Also worth doing

  • Report the sanity-check fallback (learned model replaced by the best single feature) per run, instead of only the raw Resetting score vector … Use --override flag line on stderr. The flag does not exist in ProSE. This is a small change and goes into #10578.

Tests

  • A two-file search with one run below 100 PSMs: both runs get Percolator q-values, and -out_merged is written.
  • A blank-like run (real spectra, random database) in a batch: no target passes the FDR threshold, and the batch still merges.
  • per_run reproduces the current results.
Lingua principale
C++
Stelle
623
Fork
441
Merge medio
23h 47m
PR unite (30g)
289

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di OpenMS/OpenMS

Tutte le issue di OpenMS/OpenMS

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.