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}