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}