code wiki / (root) / nx_chem_sildenafil_probe_test.nx

nx_chem_sildenafil_probe_test.nx source

↩ module page · 114 lines · 4920 B

1// nx_chem_sildenafil_probe_test.nx -- one-off SMILES parser probe. 2// 3// Goal: determine if the existing C2.1 SMILES parser handles the 4// sildenafil SMILES (and if so what [M+H]+ it computes). Drives a 5// real go/no-go decision for adding ED-class adulterants to the 6// production DB. 7// 8// SMILES: CCCc1nn(C)c2c(=O)[nH]c(-c3cc(S(=O)(=O)N4CCN(C)CC4)ccc3OCC)nc12 9// Formula: C22H30N6O4S 10// Published [M+H]+: 475.2127 11// 12// expect_exit: 0 13// license_tier: ORIGINAL 14 15import "nx_chem.nx" 16import "nx_chem_molecule.nx" 17import "nx_chem_smiles.nx" 18import "nx_chem_periodic.nx" 19import "nx_chem_valence.nx" 20import "nx_chem_mass.nx" 21 22func main() -> nx_exit { 23 println("=== sildenafil SMILES parser probe ===" as *u8) 24 25 // Hand-bytes for: CCCc1nn(C)c2c(=O)[nH]c(-c3cc(S(=O)(=O)N4CCN(C)CC4)ccc3OCC)nc12 26 let s: *u8 = sys_mmap(128) 27 s[0]=0x43; s[1]=0x43; s[2]=0x43 // CCC 28 s[3]=0x63; s[4]=0x31 // c1 29 s[5]=0x6E; s[6]=0x6E // nn 30 s[7]=0x28; s[8]=0x43; s[9]=0x29 // (C) 31 s[10]=0x63; s[11]=0x32 // c2 32 s[12]=0x63 // c 33 s[13]=0x28; s[14]=0x3D; s[15]=0x4F; s[16]=0x29 // (=O) 34 s[17]=0x5B; s[18]=0x6E; s[19]=0x48; s[20]=0x5D // [nH] 35 s[21]=0x63 // c 36 s[22]=0x28; s[23]=0x2D // (- 37 s[24]=0x63; s[25]=0x33 // c3 38 s[26]=0x63; s[27]=0x63 // cc 39 s[28]=0x28; s[29]=0x53 // (S 40 s[30]=0x28; s[31]=0x3D; s[32]=0x4F; s[33]=0x29 // (=O) 41 s[34]=0x28; s[35]=0x3D; s[36]=0x4F; s[37]=0x29 // (=O) 42 s[38]=0x4E; s[39]=0x34 // N4 43 s[40]=0x43; s[41]=0x43 // CC 44 s[42]=0x4E // N 45 s[43]=0x28; s[44]=0x43; s[45]=0x29 // (C) 46 s[46]=0x43; s[47]=0x43; s[48]=0x34 // CC4 47 s[49]=0x29 // ) 48 s[50]=0x63; s[51]=0x63; s[52]=0x63; s[53]=0x33 // ccc3 49 s[54]=0x4F; s[55]=0x43; s[56]=0x43 // OCC 50 s[57]=0x29 // ) 51 s[58]=0x6E; s[59]=0x63; s[60]=0x31; s[61]=0x32 // nc12 52 let n: nx_int = 62 53 54 let m: *MolGraph = nx_chem_parse_smiles(s, n) 55 let _p1: i64 = print(" parsed atoms: " as *u8) 56 let _p2: i64 = print_i64(m.n_atoms as i64) 57 let _p3: i64 = println("" as *u8) 58 let _p4: i64 = print(" parsed bonds: " as *u8) 59 let _p5: i64 = print_i64(m.n_bonds as i64) 60 let _p6: i64 = println("" as *u8) 61 62 if m.n_atoms == 0 { 63 println(" FAIL: parser rejected sildenafil SMILES" as *u8) 64 return 0 65 } 66 67 // Count by element 68 var n_c: nx_int = 0 69 var n_n: nx_int = 0 70 var n_o: nx_int = 0 71 var n_s: nx_int = 0 72 var i: nx_int = 0 73 while i < m.n_atoms { 74 let a: *Atom = ((m.atoms as nx_int) + (i * NX_ATOM_BYTES)) as *Atom 75 if a.z == 6 { n_c = n_c + 1 } 76 if a.z == 7 { n_n = n_n + 1 } 77 if a.z == 8 { n_o = n_o + 1 } 78 if a.z == 16 { n_s = n_s + 1 } 79 i = i + 1 80 } 81 let _e1: i64 = print(" by element: C=" as *u8) 82 let _e2: i64 = print_i64(n_c as i64) 83 let _e3: i64 = print(" N=" as *u8) 84 let _e4: i64 = print_i64(n_n as i64) 85 let _e5: i64 = print(" O=" as *u8) 86 let _e6: i64 = print_i64(n_o as i64) 87 let _e7: i64 = print(" S=" as *u8) 88 let _e8: i64 = print_i64(n_s as i64) 89 let _e9: i64 = println("" as *u8) 90 println(" expected formula C22H30N6O4S: C=22 N=6 O=4 S=1" as *u8) 91 92 let _f: nx_int = nx_chem_compute_implicit_h(m) 93 let ad: *AtomicData = nx_chem_atomic_data_table_118() 94 let mono: nx_int = nx_chem_mol_monoisotopic_mass_q4(m, ad) 95 let mh: nx_int = nx_chem_mol_mh_plus_q4(m, ad) 96 let _m1: i64 = print(" monoisotopic mass Q4: " as *u8) 97 let _m2: i64 = print_i64(mono as i64) 98 let _m3: i64 = print(" ([M+H]+ Q4: " as *u8) 99 let _m4: i64 = print_i64(mh as i64) 100 let _m5: i64 = println(")" as *u8) 101 println(" published [M+H]+ = 475.2127 (Q4 4752127)" as *u8) 102 if mh == 4752127 { 103 println(" VERDICT: PASS -- substrate computes published m/z exactly" as *u8) 104 } 105 if mh != 4752127 { 106 let dev: nx_int = mh - 4752127 107 let _d1: i64 = print(" VERDICT: deviation from published = " as *u8) 108 let _d2: i64 = print_i64(dev as i64) 109 let _d3: i64 = print(" Q4 units (= " as *u8) 110 if dev < 0 { let _d4: i64 = print("-" as *u8) } 111 let _d5: i64 = println(" ppm; check parser interpretation)" as *u8) 112 } 113 return 0 114}