code wiki / (root) / nx_peptide_test.nx

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}