nx_peptide_test.nx source
↩ module page · 166 lines · 9404 B
1// nx_peptide_test.nx -- gate for nx_peptide. Liar-killing where possible:
2// the mass tests are checked against PUBLISHED masses of real peptides
3// (angiotensin II, bradykinin), not against our own arithmetic, and the
4// bisection's monotonicity PRECONDITION is measured rather than assumed.
5// expect_exit: 0 license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_peptide.nx"
8
9func 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 }
10func 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 }
11
12func main() -> i64 {
13 var pass: i64 = 0
14 var total: i64 = 0
15
16 let ang: *u8 = "DRVYIHPF" as *u8 // angiotensin II
17 let bk: *u8 = "RPPGFSPFR" as *u8 // bradykinin
18 let bad: *u8 = "DRVYIHPX" as *u8 // X is not a residue
19
20 // --- T1 monoisotopic mass vs PUBLISHED value (1045.5345 Da) ---
21 total = total + 1
22 let m_ang: i64 = pep_mass_mono_q4(ang)
23 t_puts("T1 angiotensin-II monoisotopic Q4=" as *u8); t_putn(m_ang); t_puts(" want 10455345: " as *u8)
24 if m_ang == 10455345 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
25
26 // --- T2 average mass agrees with published 1046.18 within 0.02 Da ---
27 total = total + 1
28 let a_ang: i64 = pep_mass_avg_q4(ang)
29 t_puts("T2 angiotensin-II average Q4=" as *u8); t_putn(a_ang); t_puts(" vs lit 10461800 tol 200: " as *u8)
30 if pep_mass_agrees(a_ang, 10461800, 200) == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
31
32 // --- T3 bradykinin vs published 1059.5614, Q4 rounding budget = 2 ---
33 total = total + 1
34 let m_bk: i64 = pep_mass_mono_q4(bk)
35 t_puts("T3 bradykinin monoisotopic Q4=" as *u8); t_putn(m_bk); t_puts(" vs lit 10595614 tol 2: " as *u8)
36 if pep_mass_agrees(m_bk, 10595614, 2) == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
37
38 // --- T4 FAIL-CLOSED: an unknown residue REFUSES, never fabricates ---
39 total = total + 1
40 let m_bad: i64 = pep_mass_mono_q4(bad)
41 t_puts("T4 unknown residue refused (want -1) got " as *u8); t_putn(m_bad); t_puts(": " as *u8)
42 if m_bad == PEP_INVALID { if pep_seq_valid(bad) == 0 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
43
44 // --- T5 Leu/Ile are ISOBARIC (real chemistry, not a table typo) ---
45 total = total + 1
46 let m_l: i64 = pep_mass_mono_q4("L" as *u8)
47 let m_i: i64 = pep_mass_mono_q4("I" as *u8)
48 let m_k: i64 = pep_mass_mono_q4("K" as *u8)
49 t_puts("T5 Leu==Ile isobaric, Lys distinct: " as *u8)
50 if m_l == m_i { if m_k != m_l { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
51
52 // --- T6 charge-state ladder [M+H]+ and [M+2H]2+ ---
53 total = total + 1
54 let mz1: i64 = pep_mz_q4(m_ang, 1)
55 let mz2: i64 = pep_mz_q4(m_ang, 2)
56 t_puts("T6 [M+H]+=" as *u8); t_putn(mz1); t_puts(" [M+2H]2+=" as *u8); t_putn(mz2); t_puts(": " as *u8)
57 if mz1 == 10465418 { if mz2 == 5237745 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
58
59 // --- T7 b2 ion of DR = 272.1353 ---
60 total = total + 1
61 let b2: i64 = pep_b_ion_q4(ang, 2)
62 t_puts("T7 b2 Q4=" as *u8); t_putn(b2); t_puts(" want 2721353: " as *u8)
63 if b2 == 2721353 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
64
65 // --- T8 y6 ion of VYIHPF = 775.4138 ---
66 total = total + 1
67 let y6: i64 = pep_y_ion_q4(ang, 6)
68 t_puts("T8 y6 Q4=" as *u8); t_putn(y6); t_puts(" want 7754138: " as *u8)
69 if y6 == 7754138 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
70
71 // --- T9 b/y complementarity holds at EVERY interior cleavage site ---
72 total = total + 1
73 var i9: i64 = 1
74 var ok9: i64 = 1
75 while i9 < 8 {
76 let c9: i64 = pep_by_complement_ok(ang, i9)
77 if c9 != 1 { ok9 = 0 }
78 i9 = i9 + 1
79 }
80 t_puts("T9 b_i+y_(n-i)==M+2H for all 7 sites: " as *u8)
81 if ok9 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
82
83 // --- T10 decade exponential KAT ---
84 total = total + 1
85 let p0: i64 = pep_pow10_q3(0)
86 let p1: i64 = pep_pow10_q3(1000)
87 let pm1: i64 = pep_pow10_q3(0 - 1000)
88 let ph: i64 = pep_pow10_q3(500)
89 let p23: i64 = pep_pow10_q3(2300)
90 t_puts("T10 pow10 KAT 1/10/0.1/3.162/199.5 = " as *u8); t_putn(p0); t_puts(" " as *u8); t_putn(p1); t_puts(" " as *u8); t_putn(pm1); t_puts(" " as *u8); t_putn(ph); t_puts(" " as *u8); t_putn(p23); t_puts(": " as *u8)
91 var ok10: i64 = 1
92 if p0 != 1000 { ok10 = 0 }
93 if p1 != 10000 { ok10 = 0 }
94 if pm1 != 100 { ok10 = 0 }
95 if ph != 3162 { ok10 = 0 }
96 if p23 != 199500 { ok10 = 0 }
97 if ok10 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
98
99 // --- T11 half-ionisation: at pH == pKa both fractions are exactly 0.5 ---
100 total = total + 1
101 let fb: i64 = pep_frac_basic_q3(PEP_PKA_K, PEP_PKA_K)
102 let fa: i64 = pep_frac_acidic_q3(PEP_PKA_D, PEP_PKA_D)
103 t_puts("T11 half-ionised at pH=pKa basic=" as *u8); t_putn(fb); t_puts(" acidic=" as *u8); t_putn(fa); t_puts(": " as *u8)
104 if fb == 500 { if fa == 500 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
105
106 // --- T12 extinction at 280 nm: 1 Tyr = 1490; + 1 disulfide = 1615 ---
107 total = total + 1
108 let e0: i64 = pep_ext_coeff_280(ang, 0)
109 let e1: i64 = pep_ext_coeff_280(ang, 1)
110 t_puts("T12 eps280 Tyr-only=" as *u8); t_putn(e0); t_puts(" +1SS=" as *u8); t_putn(e1); t_puts(": " as *u8)
111 if e0 == 1490 { if e1 == 1615 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
112
113 // --- T13 no chromophore -> A280 CANNOT quantify (real lab constraint) ---
114 total = total + 1
115 let e_bk: i64 = pep_ext_coeff_280(bk, 0)
116 let q_bk: i64 = pep_a280_quantifiable(bk, 0)
117 let q_ang: i64 = pep_a280_quantifiable(ang, 0)
118 t_puts("T13 bradykinin eps280=" as *u8); t_putn(e_bk); t_puts(" A280-quantifiable=" as *u8); t_putn(q_bk); t_puts(" (angiotensin=" as *u8); t_putn(q_ang); t_puts("): " as *u8)
119 if e_bk == 0 { if q_bk == 0 { if q_ang == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
120
121 // --- T14 GRAVY = mean Kyte-Doolittle = -0.325 for DRVYIHPF ---
122 total = total + 1
123 let g: i64 = pep_gravy_q3(ang)
124 let hyd: i64 = pep_is_hydrophobic(ang)
125 t_puts("T14 GRAVY x1000=" as *u8); t_putn(g); t_puts(" want -325, hydrophobic=" as *u8); t_putn(hyd); t_puts(": " as *u8)
126 if g == 0 - 325 { if hyd == 0 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
127
128 // --- T15 pI STRUCTURAL ORDERING: acidic < neutral < basic ---
129 total = total + 1
130 let pi_acid: i64 = pep_pi_milli("DDDD" as *u8)
131 let pi_neut: i64 = pep_pi_milli("GGGG" as *u8)
132 let pi_base: i64 = pep_pi_milli("RRRR" as *u8)
133 t_puts("T15 pI acidic=" as *u8); t_putn(pi_acid); t_puts(" neutral=" as *u8); t_putn(pi_neut); t_puts(" basic=" as *u8); t_putn(pi_base); t_puts(": " as *u8)
134 if pi_acid < pi_neut { if pi_neut < pi_base { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
135
136 // --- T16 angiotensin II pI lands in the near-neutral band ---
137 total = total + 1
138 let pi_ang: i64 = pep_pi_milli(ang)
139 t_puts("T16 angiotensin-II pI milli=" as *u8); t_putn(pi_ang); t_puts(" band 7000..8000: " as *u8)
140 if pi_ang >= 7000 { if pi_ang <= 8000 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
141
142 // --- T17 MEASURE the bisection's precondition: charge is monotone in pH ---
143 total = total + 1
144 var ph17: i64 = 0
145 var ok17: i64 = 1
146 var prev17: i64 = 999999
147 while ph17 <= 14000 {
148 let c17: i64 = pep_charge_q3(ang, ph17)
149 if c17 > prev17 { ok17 = 0 }
150 prev17 = c17
151 ph17 = ph17 + 500
152 }
153 t_puts("T17 net charge monotone non-increasing over pH 0..14 (29 pts): " as *u8)
154 if ok17 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
155
156 // --- T18 charge sign flips across the pH range (neg-control) ---
157 total = total + 1
158 let c_lo: i64 = pep_charge_q3(ang, 0)
159 let c_hi: i64 = pep_charge_q3(ang, 14000)
160 t_puts("T18 charge pH0=" as *u8); t_putn(c_lo); t_puts(" pH14=" as *u8); t_putn(c_hi); t_puts(": " as *u8)
161 if c_lo > 0 { if c_hi < 0 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) }
162
163 t_puts("PEPTIDE-GATE passed " as *u8); t_putn(pass); t_puts("/" as *u8); t_putn(total)
164 if pass == total { t_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
165 t_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1
166}