nx_peptide_denovo.nx
buildroot/runtime/nx_peptide_denovo.nx
about
nx_peptide_denovo.nx -- SOTA: DE NOVO peptide sequencing. Reconstruct the
amino-acid sequence from a fragment-ion spectrum ALONE, with NO candidate
and NO database. This is the hardest problem in proteomics: read the
residues directly off the mass GAPS in the b-ion ladder.
THE PRINCIPLE, EXACT. Consecutive b-ions differ by exactly one residue's
mass: b_i - b_(i-1) = residue i. The first residue is b_1 - proton; the
last is recovered from the precursor mass. So a sorted b-ion ladder plus
the intact mass spells the sequence, gap by gap -- match each gap to the
nearest residue mass and read the letter. nx_peptide_identify needed a
candidate to score against; this needs nothing but the spectrum.
THE HONEST AMBIGUITIES, ENCODED NOT HIDDEN. Two residue pairs cannot be
told apart by mass and de novo sequencing is famous for exactly this:
Leu / Ile -- IDENTICAL mass. De novo cannot distinguish them; this
returns a canonical 'L' and flags the position.
Lys / Gln -- differ by 0.036 Da; separable only at high mass accuracy.
A de novo tool that pretended to resolve Leu/Ile would be lying about
physics. This one reports the ambiguity rather than guessing.
ANCHORED. Residue masses are the anchored table two independent methods
agree on; the gap arithmetic is exact. The gate liar-kills it by ROUND
TRIP: take a known peptide, generate its real b-ion ladder, de novo
sequence it back, and recover the original sequence (modulo Leu/Ile). If a
residue-mass gap were wrong, a letter would come back wrong.
All INTEGER, _q4 = x10^4 Da.
Grounding (cited; researcher-groundable):
dancik_1999_de_novo_peptide_sequencing
biemann_1990_fragment_ion_nomenclature
leu_ile_isobaric_lys_gln_near_isobaric
genealogy_id: peptide_chemistry + analytical_sota + liar_killer
dependencies 2 imports · 1 importers
imports: nx_syscalls.nxnx_peptide.nx
imported by: nx_qc_svc.nx
structs
| none |
consts
| 39 | const DENOVO_UNKNOWN: i64 = 0 - 1 // no residue matches a gap |
| 40 | const DENOVO_MAX_LEN: i64 = 128 |
functions
| 49 | func denovo_residue(delta_q4: i64, tol_q4: i64) -> i64 |
| 73 | func denovo_is_leu_ile(delta_q4: i64, tol_q4: i64) -> i64 |
| 82 | func denovo_char(aa: i64) -> i64 called by 1: denovo_sequence |
| 116 | func denovo_sequence(b_ions: *i64, n_b: i64, precursor_q4: i64, tol_q4: i64, out: *u8) -> i64 |
| 148 | func denovo_ambiguous_count(b_ions: *i64, n_b: i64, precursor_q4: i64, tol_q4: i64) -> i64 |