code wiki / (root) / nx_peptide_deconv_test.nx

nx_peptide_deconv_test.nx source

↩ module page · 150 lines · 8241 B

1// nx_peptide_deconv_test.nx -- gate for charge-state deconvolution. The 2// liar-kill: generate a KNOWN peptide's real charge ladder, deconvolve it 3// blind (no charge told), and demand the EXACT neutral mass back (T1), while 4// an unrelated pair is rejected as inconsistent (T4). Recovering the input you 5// never revealed is the proof it inverts real MS. 6// expect_exit: 0 license_tier: ORIGINAL 7import "nx_syscalls.nx" 8import "nx_peptide.nx" 9import "nx_peptide_deconv.nx" 10 11func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 12func t_putn(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 } 13 14func main() -> i64 { 15 var pass: i64 = 0 16 var total: i64 = 0 17 let tol: i64 = 100 // 0.01 Da 18 19 // BPC-157 mass (known): use it to synthesize a REAL charge ladder, then 20 // deconvolve blind. GEPPPGKPADDAGLV monoisotopic ~1418.70 Da. 21 let bpc: *u8 = "GEPPPGKPADDAGLV" as *u8 22 let M: i64 = pep_mass_mono_q4(bpc) 23 let mz2: i64 = pep_mz_q4(M, 2) // z=2 24 let mz3: i64 = pep_mz_q4(M, 3) // z=3 25 let mz4: i64 = pep_mz_q4(M, 4) // z=4 26 27 // --- T1 DECONVOLVE the z=2/z=3 pair BLIND -> exact neutral mass --- 28 // mz3 < mz2 (higher charge = lower m/z). Deduce charge + mass with no hint. 29 total = total + 1 30 let z_hi: i64 = deconv_charge_hi(mz3, mz2) // charge of the higher-m/z peak 31 let mass: i64 = deconv_neutral_mass(mz3, mz2) 32 t_puts("T1 BPC-157 ladder z3=" as *u8); t_putn(mz3); t_puts(" z2=" as *u8); t_putn(mz2); t_puts(" -> deduced charge_hi=" as *u8); t_putn(z_hi); t_puts(" neutral mass=" as *u8); t_putn(mass); t_puts(" vs true " as *u8); t_putn(M); t_puts(": " as *u8) 33 var ok1: i64 = 1 34 if z_hi != 2 { ok1 = 0 } 35 var d1: i64 = mass - M 36 if d1 < 0 { d1 = 0 - d1 } 37 if d1 > 5 { ok1 = 0 } 38 if ok1 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 39 40 // --- T2 a DIFFERENT charge pair (z=3/z=4) recovers the SAME mass --- 41 total = total + 1 42 let z34: i64 = deconv_charge_hi(mz4, mz3) 43 let mass34: i64 = deconv_neutral_mass(mz4, mz3) 44 t_puts("T2 z4/z3 pair -> charge_hi=" as *u8); t_putn(z34); t_puts(" (want 3) mass=" as *u8); t_putn(mass34); t_puts(" (same M): " as *u8) 45 var ok2: i64 = 1 46 if z34 != 3 { ok2 = 0 } 47 var d2: i64 = mass34 - M 48 if d2 < 0 { d2 = 0 - d2 } 49 if d2 > 5 { ok2 = 0 } 50 if ok2 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 51 52 // --- T3 the pair VERIFIES: deduced mass reproduces both peaks --- 53 total = total + 1 54 let cons: i64 = deconv_pair_consistent(mz3, mz2, tol) 55 let verified: i64 = deconv_mass_verified(mz3, mz2, tol) 56 t_puts("T3 pair consistent=" as *u8); t_putn(cons); t_puts(" verified mass=" as *u8); t_putn(verified); t_puts(": " as *u8) 57 var ok3: i64 = 1 58 if cons != 1 { ok3 = 0 } 59 if verified == DECONV_INVALID { ok3 = 0 } 60 if ok3 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 61 62 // --- T4 NEG-CONTROL: an UNRELATED pair (not adjacent charge states of 63 // one molecule) is REJECTED as inconsistent -- no false mass --- 64 total = total + 1 65 // two peaks from DIFFERENT molecules: BPC z=2 and bradykinin z=1. 66 let bk_mz1: i64 = pep_mz_q4(pep_mass_mono_q4("RPPGFSPFR" as *u8), 1) 67 let bad_cons: i64 = deconv_pair_consistent(mz2, bk_mz1, tol) 68 let bad_mass: i64 = deconv_mass_verified(mz2, bk_mz1, tol) 69 t_puts("T4 unrelated pair consistent=" as *u8); t_putn(bad_cons); t_puts(" verified mass=" as *u8); t_putn(bad_mass); t_puts(" want 0/-1 (rejected): " as *u8) 70 var ok4: i64 = 1 71 if bad_cons != 0 { ok4 = 0 } 72 if bad_mass != DECONV_INVALID { ok4 = 0 } 73 if ok4 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 74 75 // --- T5 WHOLE-SPECTRUM deconvolution: a sorted peak list (z4,z3,z2) -> 76 // neutral mass, corroborated by multiple pairs --- 77 total = total + 1 78 let peaks: *i64 = sys_mmap(64) 79 peaks[0] = mz4 // ascending: z4 < z3 < z2 80 peaks[1] = mz3 81 peaks[2] = mz2 82 let list_mass: i64 = deconv_from_list(peaks, 3, tol) 83 let support: i64 = deconv_support(peaks, 3, list_mass, tol) 84 t_puts("T5 3-peak spectrum -> mass=" as *u8); t_putn(list_mass); t_puts(" supported by " as *u8); t_putn(support); t_puts(" pairs (want mass=M, support=2): " as *u8) 85 var ok5: i64 = 1 86 var d5: i64 = list_mass - M 87 if d5 < 0 { d5 = 0 - d5 } 88 if d5 > 5 { ok5 = 0 } 89 if support != 2 { ok5 = 0 } 90 if ok5 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 91 92 // --- T6 CHARGE ASSIGNMENT: given the mass, each peak's charge is read --- 93 total = total + 1 94 let a2: i64 = deconv_assign_charge(mz2, M) 95 let a3: i64 = deconv_assign_charge(mz3, M) 96 let a4: i64 = deconv_assign_charge(mz4, M) 97 t_puts("T6 charge assignment mz2/mz3/mz4 = " as *u8); t_putn(a2); t_puts("/" as *u8); t_putn(a3); t_puts("/" as *u8); t_putn(a4); t_puts(" want 2/3/4: " as *u8) 98 var ok6: i64 = 1 99 if a2 != 2 { ok6 = 0 } 100 if a3 != 3 { ok6 = 0 } 101 if a4 != 4 { ok6 = 0 } 102 if ok6 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 103 104 // --- T7 predict/deduce ROUND TRIP: predict a peak, deduce its charge back --- 105 total = total + 1 106 let p5: i64 = deconv_predict_mz(M, 5) 107 let back5: i64 = deconv_assign_charge(p5, M) 108 t_puts("T7 predict z=5 peak=" as *u8); t_putn(p5); t_puts(" -> assigned charge=" as *u8); t_putn(back5); t_puts(" (round-trip to 5): " as *u8) 109 if back5 == 5 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 110 111 // --- T8 works for a SECOND molecule (angiotensin), not hard-coded to BPC --- 112 total = total + 1 113 let angM: i64 = pep_mass_mono_q4("DRVYIHPF" as *u8) 114 let a_mz2: i64 = pep_mz_q4(angM, 2) 115 let a_mz3: i64 = pep_mz_q4(angM, 3) 116 let a_mass: i64 = deconv_mass_verified(a_mz3, a_mz2, tol) 117 t_puts("T8 angiotensin z3/z2 deconvolved mass=" as *u8); t_putn(a_mass); t_puts(" vs true " as *u8); t_putn(angM); t_puts(": " as *u8) 118 var ok8: i64 = 1 119 if a_mass == DECONV_INVALID { ok8 = 0 } 120 var d8: i64 = a_mass - angM 121 if d8 < 0 { d8 = 0 - d8 } 122 if d8 > 5 { ok8 = 0 } 123 if ok8 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 124 125 // --- T9 fail-closed: misordered pair + too-few-peaks list refuse --- 126 total = total + 1 127 let mis: i64 = deconv_charge_hi(mz2, mz3) // mz_lo > mz_hi: wrong order 128 let short: i64 = deconv_from_list(peaks, 1, tol) 129 let onep: *i64 = sys_mmap(16) 130 onep[0] = mz2 131 let one_mass: i64 = deconv_from_list(onep, 1, tol) 132 t_puts("T9 misordered pair=" as *u8); t_putn(mis); t_puts(" 1-peak list=" as *u8); t_putn(short); t_puts("/" as *u8); t_putn(one_mass); t_puts(" want all -1: " as *u8) 133 var ok9: i64 = 1 134 if mis != DECONV_INVALID { ok9 = 0 } 135 if short != DECONV_INVALID { ok9 = 0 } 136 if one_mass != DECONV_INVALID { ok9 = 0 } 137 if ok9 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 138 139 // --- T10 THE END-TO-END SOTA STORY: a blind spectrum -> mass -> that 140 // mass matches BPC-157's known mass within tolerance --- 141 total = total + 1 142 let recovered: i64 = deconv_from_list(peaks, 3, tol) 143 let matches_bpc: i64 = deconv_mass_near(recovered, M, tol) 144 t_puts("T10 blind spectrum recovered mass=" as *u8); t_putn(recovered); t_puts(" matches BPC-157 known mass=" as *u8); t_putn(matches_bpc); t_puts(" (screen-ready): " as *u8) 145 if matches_bpc == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 146 147 t_puts("PEPTIDE-DECONV-GATE passed " as *u8); t_putn(pass); t_puts("/" as *u8); t_putn(total) 148 if pass == total { t_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 149 t_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1 150}