1 /* Copyright (C) 2010  Egon Willighagen <egonw@users.sf.net>
2  *
3  * Contact: cdk-devel@lists.sourceforge.net
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation; either version 2.1
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 package org.openscience.cdk.qsar.descriptors.molecular;
20 
21 import javax.vecmath.Point2d;
22 
23 import org.junit.Assert;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.openscience.cdk.AtomContainer;
27 import org.openscience.cdk.interfaces.IAtom;
28 import org.openscience.cdk.interfaces.IAtomContainer;
29 import org.openscience.cdk.interfaces.IBond;
30 import org.openscience.cdk.qsar.result.IntegerResult;
31 import org.openscience.cdk.silent.SilentChemObjectBuilder;
32 import org.openscience.cdk.smiles.SmilesParser;
33 import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
34 
35 /**
36  * @cdk.module test-qsarmolecular
37  */
38 public class AcidicGroupCountDescriptorTest extends MolecularDescriptorTest {
39 
40     @Before
setUp()41     public void setUp() throws Exception {
42         setDescriptor(AcidicGroupCountDescriptor.class);
43     }
44 
45     @Test
testConstructor()46     public void testConstructor() throws Exception {
47         Assert.assertNotNull(new AcidicGroupCountDescriptor());
48     }
49 
50     @Test(expected = IllegalStateException.class)
uninitalisedError()51     public void uninitalisedError() {
52         new BasicGroupCountDescriptor().calculate(new AtomContainer());
53     }
54 
55     @Test
testOneAcidGroup()56     public void testOneAcidGroup() throws Exception {
57         SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
58         IAtomContainer mol = sp.parseSmiles("CC(=O)O");
59         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
60         Assert.assertEquals(1, result.intValue());
61     }
62 
63     @Test
testSulphurAcidGroup()64     public void testSulphurAcidGroup() throws Exception {
65         SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
66         IAtomContainer mol = sp.parseSmiles("OS(=O)(=O)O");
67         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
68         Assert.assertEquals(2, result.intValue());
69     }
70 
71     @Test
testPhosphorusAcidGroup()72     public void testPhosphorusAcidGroup() throws Exception {
73         SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
74         IAtomContainer mol = sp.parseSmiles("O=P(=O)O");
75         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
76         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
77         Assert.assertEquals(1, result.intValue());
78     }
79 
80     @Test
testFancyGroup()81     public void testFancyGroup() throws Exception {
82         SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
83         IAtomContainer mol = sp.parseSmiles("[NH](S(=O)=O)C(F)(F)F");
84         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
85         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
86         Assert.assertEquals(1, result.intValue());
87     }
88 
89     @Test
testNitroRing()90     public void testNitroRing() throws Exception {
91         SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
92         IAtomContainer mol = sp.parseSmiles("[nH]1nnnc1");
93         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
94         Assert.assertEquals(2, result.intValue());
95     }
96 
97     /**
98      * @cdk.inchi InChI=1S/C2H2N4O2/c7-2(8)1-3-5-6-4-1/h(H,7,8)(H,3,4,5,6)
99      */
100     @Test
testTwoGroup()101     public void testTwoGroup() throws Exception {
102         IAtomContainer mol = SilentChemObjectBuilder.getInstance().newAtomContainer();
103         IAtom a1 = mol.getBuilder().newInstance(IAtom.class, "O");
104         a1.setFormalCharge(0);
105         a1.setPoint2d(new Point2d(5.9019, 0.5282));
106         mol.addAtom(a1);
107         IAtom a2 = mol.getBuilder().newInstance(IAtom.class, "O");
108         a2.setFormalCharge(0);
109         a2.setPoint2d(new Point2d(5.3667, -1.1191));
110         mol.addAtom(a2);
111         IAtom a3 = mol.getBuilder().newInstance(IAtom.class, "N");
112         a3.setFormalCharge(0);
113         a3.setPoint2d(new Point2d(3.3987, -0.4197));
114         mol.addAtom(a3);
115         IAtom a4 = mol.getBuilder().newInstance(IAtom.class, "N");
116         a4.setFormalCharge(0);
117         a4.setPoint2d(new Point2d(2.5896, 0.1681));
118         mol.addAtom(a4);
119         IAtom a5 = mol.getBuilder().newInstance(IAtom.class, "N");
120         a5.setFormalCharge(0);
121         a5.setPoint2d(new Point2d(3.8987, 1.1191));
122         mol.addAtom(a5);
123         IAtom a6 = mol.getBuilder().newInstance(IAtom.class, "N");
124         a6.setFormalCharge(0);
125         a6.setPoint2d(new Point2d(2.8987, 1.1191));
126         mol.addAtom(a6);
127         IAtom a7 = mol.getBuilder().newInstance(IAtom.class, "C");
128         a7.setFormalCharge(0);
129         a7.setPoint2d(new Point2d(4.2077, 0.1681));
130         mol.addAtom(a7);
131         IAtom a8 = mol.getBuilder().newInstance(IAtom.class, "C");
132         a8.setFormalCharge(0);
133         a8.setPoint2d(new Point2d(5.1588, -0.141));
134         mol.addAtom(a8);
135         IAtom a9 = mol.getBuilder().newInstance(IAtom.class, "H");
136         a9.setFormalCharge(0);
137         a9.setPoint2d(new Point2d(2.0, -0.0235));
138         mol.addAtom(a9);
139         IAtom a10 = mol.getBuilder().newInstance(IAtom.class, "H");
140         a10.setFormalCharge(0);
141         a10.setPoint2d(new Point2d(6.4916, 0.3366));
142         mol.addAtom(a10);
143         IBond b1 = mol.getBuilder().newInstance(IBond.class, a1, a8, IBond.Order.SINGLE);
144         mol.addBond(b1);
145         IBond b2 = mol.getBuilder().newInstance(IBond.class, a1, a10, IBond.Order.SINGLE);
146         mol.addBond(b2);
147         IBond b3 = mol.getBuilder().newInstance(IBond.class, a2, a8, IBond.Order.DOUBLE);
148         mol.addBond(b3);
149         IBond b4 = mol.getBuilder().newInstance(IBond.class, a3, a4, IBond.Order.SINGLE);
150         mol.addBond(b4);
151         IBond b5 = mol.getBuilder().newInstance(IBond.class, a3, a7, IBond.Order.DOUBLE);
152         mol.addBond(b5);
153         IBond b6 = mol.getBuilder().newInstance(IBond.class, a4, a6, IBond.Order.SINGLE);
154         mol.addBond(b6);
155         IBond b7 = mol.getBuilder().newInstance(IBond.class, a4, a9, IBond.Order.SINGLE);
156         mol.addBond(b7);
157         IBond b8 = mol.getBuilder().newInstance(IBond.class, a5, a6, IBond.Order.DOUBLE);
158         mol.addBond(b8);
159         IBond b9 = mol.getBuilder().newInstance(IBond.class, a5, a7, IBond.Order.SINGLE);
160         mol.addBond(b9);
161         IBond b10 = mol.getBuilder().newInstance(IBond.class, a7, a8, IBond.Order.SINGLE);
162         mol.addBond(b10);
163 
164         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
165         addImplicitHydrogens(mol);
166 
167         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
168         Assert.assertEquals(3, result.intValue());
169     }
170 
171     /**
172      * @cdk.inchi InChI=1S/C6H12O10S/c7-2(1-16-17(13,14)15)3(8)4(9)5(10)6(11)12/h2-5,7-10H,1H2,(H,11,12)(H,13,14,15)/t2-,3-,4+,5-/m1/s1
173      */
174     @Test
testCID()175     public void testCID() throws Exception {
176         IAtomContainer mol = SilentChemObjectBuilder.getInstance().newAtomContainer();
177         IAtom a1 = mol.getBuilder().newInstance(IAtom.class, "S");
178         a1.setFormalCharge(0);
179         a1.setPoint2d(new Point2d(9.4651, 0.25));
180         mol.addAtom(a1);
181         IAtom a2 = mol.getBuilder().newInstance(IAtom.class, "O");
182         a2.setFormalCharge(0);
183         a2.setPoint2d(new Point2d(6.001, 1.25));
184         mol.addAtom(a2);
185         IAtom a3 = mol.getBuilder().newInstance(IAtom.class, "O");
186         a3.setFormalCharge(0);
187         a3.setPoint2d(new Point2d(5.135, -1.25));
188         mol.addAtom(a3);
189         IAtom a4 = mol.getBuilder().newInstance(IAtom.class, "O");
190         a4.setFormalCharge(0);
191         a4.setPoint2d(new Point2d(6.8671, -1.25));
192         mol.addAtom(a4);
193         IAtom a5 = mol.getBuilder().newInstance(IAtom.class, "O");
194         a5.setFormalCharge(0);
195         a5.setPoint2d(new Point2d(8.5991, -0.25));
196         mol.addAtom(a5);
197         IAtom a6 = mol.getBuilder().newInstance(IAtom.class, "O");
198         a6.setFormalCharge(0);
199         a6.setPoint2d(new Point2d(4.269, 1.25));
200         mol.addAtom(a6);
201         IAtom a7 = mol.getBuilder().newInstance(IAtom.class, "O");
202         a7.setFormalCharge(0);
203         a7.setPoint2d(new Point2d(2.5369, 0.25));
204         mol.addAtom(a7);
205         IAtom a8 = mol.getBuilder().newInstance(IAtom.class, "O");
206         a8.setFormalCharge(0);
207         a8.setPoint2d(new Point2d(3.403, -1.25));
208         mol.addAtom(a8);
209         IAtom a9 = mol.getBuilder().newInstance(IAtom.class, "O");
210         a9.setFormalCharge(0);
211         a9.setPoint2d(new Point2d(10.3312, 0.75));
212         mol.addAtom(a9);
213         IAtom a10 = mol.getBuilder().newInstance(IAtom.class, "O");
214         a10.setFormalCharge(0);
215         a10.setPoint2d(new Point2d(9.9651, -0.616));
216         mol.addAtom(a10);
217         IAtom a11 = mol.getBuilder().newInstance(IAtom.class, "O");
218         a11.setFormalCharge(0);
219         a11.setPoint2d(new Point2d(8.9651, 1.116));
220         mol.addAtom(a11);
221         IAtom a12 = mol.getBuilder().newInstance(IAtom.class, "C");
222         a12.setFormalCharge(0);
223         a12.setPoint2d(new Point2d(6.001, 0.25));
224         mol.addAtom(a12);
225         IAtom a13 = mol.getBuilder().newInstance(IAtom.class, "C");
226         a13.setFormalCharge(0);
227         a13.setPoint2d(new Point2d(5.135, -0.25));
228         mol.addAtom(a13);
229         IAtom a14 = mol.getBuilder().newInstance(IAtom.class, "C");
230         a14.setFormalCharge(0);
231         a14.setPoint2d(new Point2d(6.8671, -0.25));
232         mol.addAtom(a14);
233         IAtom a15 = mol.getBuilder().newInstance(IAtom.class, "C");
234         a15.setFormalCharge(0);
235         a15.setPoint2d(new Point2d(4.269, 0.25));
236         mol.addAtom(a15);
237         IAtom a16 = mol.getBuilder().newInstance(IAtom.class, "C");
238         a16.setFormalCharge(0);
239         a16.setPoint2d(new Point2d(7.7331, 0.25));
240         mol.addAtom(a16);
241         IAtom a17 = mol.getBuilder().newInstance(IAtom.class, "C");
242         a17.setFormalCharge(0);
243         a17.setPoint2d(new Point2d(3.403, -0.25));
244         mol.addAtom(a17);
245         IAtom a18 = mol.getBuilder().newInstance(IAtom.class, "H");
246         a18.setFormalCharge(0);
247         a18.setPoint2d(new Point2d(6.538, 0.56));
248         mol.addAtom(a18);
249         IAtom a19 = mol.getBuilder().newInstance(IAtom.class, "H");
250         a19.setFormalCharge(0);
251         a19.setPoint2d(new Point2d(5.672, -0.56));
252         mol.addAtom(a19);
253         IAtom a20 = mol.getBuilder().newInstance(IAtom.class, "H");
254         a20.setFormalCharge(0);
255         a20.setPoint2d(new Point2d(6.3301, -0.56));
256         mol.addAtom(a20);
257         IAtom a21 = mol.getBuilder().newInstance(IAtom.class, "H");
258         a21.setFormalCharge(0);
259         a21.setPoint2d(new Point2d(4.8059, 0.56));
260         mol.addAtom(a21);
261         IAtom a22 = mol.getBuilder().newInstance(IAtom.class, "H");
262         a22.setFormalCharge(0);
263         a22.setPoint2d(new Point2d(8.1316, 0.7249));
264         mol.addAtom(a22);
265         IAtom a23 = mol.getBuilder().newInstance(IAtom.class, "H");
266         a23.setFormalCharge(0);
267         a23.setPoint2d(new Point2d(7.3346, 0.7249));
268         mol.addAtom(a23);
269         IAtom a24 = mol.getBuilder().newInstance(IAtom.class, "H");
270         a24.setFormalCharge(0);
271         a24.setPoint2d(new Point2d(6.538, 1.56));
272         mol.addAtom(a24);
273         IAtom a25 = mol.getBuilder().newInstance(IAtom.class, "H");
274         a25.setFormalCharge(0);
275         a25.setPoint2d(new Point2d(4.5981, -1.56));
276         mol.addAtom(a25);
277         IAtom a26 = mol.getBuilder().newInstance(IAtom.class, "H");
278         a26.setFormalCharge(0);
279         a26.setPoint2d(new Point2d(7.404, -1.56));
280         mol.addAtom(a26);
281         IAtom a27 = mol.getBuilder().newInstance(IAtom.class, "H");
282         a27.setFormalCharge(0);
283         a27.setPoint2d(new Point2d(3.732, 1.56));
284         mol.addAtom(a27);
285         IAtom a28 = mol.getBuilder().newInstance(IAtom.class, "H");
286         a28.setFormalCharge(0);
287         a28.setPoint2d(new Point2d(2.0, -0.06));
288         mol.addAtom(a28);
289         IAtom a29 = mol.getBuilder().newInstance(IAtom.class, "H");
290         a29.setFormalCharge(0);
291         a29.setPoint2d(new Point2d(10.8681, 0.44));
292         mol.addAtom(a29);
293         IBond b1 = mol.getBuilder().newInstance(IBond.class, a1, a5, IBond.Order.SINGLE);
294         mol.addBond(b1);
295         IBond b2 = mol.getBuilder().newInstance(IBond.class, a1, a9, IBond.Order.SINGLE);
296         mol.addBond(b2);
297         IBond b3 = mol.getBuilder().newInstance(IBond.class, a1, a10, IBond.Order.DOUBLE);
298         mol.addBond(b3);
299         IBond b4 = mol.getBuilder().newInstance(IBond.class, a1, a11, IBond.Order.DOUBLE);
300         mol.addBond(b4);
301         IBond b5 = mol.getBuilder().newInstance(IBond.class, a2, a12, IBond.Order.SINGLE);
302         mol.addBond(b5);
303         IBond b6 = mol.getBuilder().newInstance(IBond.class, a2, a24, IBond.Order.SINGLE);
304         mol.addBond(b6);
305         IBond b7 = mol.getBuilder().newInstance(IBond.class, a3, a13, IBond.Order.SINGLE);
306         mol.addBond(b7);
307         IBond b8 = mol.getBuilder().newInstance(IBond.class, a3, a25, IBond.Order.SINGLE);
308         mol.addBond(b8);
309         IBond b9 = mol.getBuilder().newInstance(IBond.class, a4, a14, IBond.Order.SINGLE);
310         mol.addBond(b9);
311         IBond b10 = mol.getBuilder().newInstance(IBond.class, a4, a26, IBond.Order.SINGLE);
312         mol.addBond(b10);
313         IBond b11 = mol.getBuilder().newInstance(IBond.class, a5, a16, IBond.Order.SINGLE);
314         mol.addBond(b11);
315         IBond b12 = mol.getBuilder().newInstance(IBond.class, a6, a15, IBond.Order.SINGLE);
316         mol.addBond(b12);
317         IBond b13 = mol.getBuilder().newInstance(IBond.class, a6, a27, IBond.Order.SINGLE);
318         mol.addBond(b13);
319         IBond b14 = mol.getBuilder().newInstance(IBond.class, a7, a17, IBond.Order.SINGLE);
320         mol.addBond(b14);
321         IBond b15 = mol.getBuilder().newInstance(IBond.class, a7, a28, IBond.Order.SINGLE);
322         mol.addBond(b15);
323         IBond b16 = mol.getBuilder().newInstance(IBond.class, a8, a17, IBond.Order.DOUBLE);
324         mol.addBond(b16);
325         IBond b17 = mol.getBuilder().newInstance(IBond.class, a9, a29, IBond.Order.SINGLE);
326         mol.addBond(b17);
327         IBond b18 = mol.getBuilder().newInstance(IBond.class, a12, a13, IBond.Order.SINGLE);
328         mol.addBond(b18);
329         IBond b19 = mol.getBuilder().newInstance(IBond.class, a12, a14, IBond.Order.SINGLE);
330         mol.addBond(b19);
331         IBond b20 = mol.getBuilder().newInstance(IBond.class, a12, a18, IBond.Order.SINGLE);
332         mol.addBond(b20);
333         IBond b21 = mol.getBuilder().newInstance(IBond.class, a13, a15, IBond.Order.SINGLE);
334         mol.addBond(b21);
335         IBond b22 = mol.getBuilder().newInstance(IBond.class, a13, a19, IBond.Order.SINGLE);
336         mol.addBond(b22);
337         IBond b23 = mol.getBuilder().newInstance(IBond.class, a14, a16, IBond.Order.SINGLE);
338         mol.addBond(b23);
339         IBond b24 = mol.getBuilder().newInstance(IBond.class, a14, a20, IBond.Order.SINGLE);
340         mol.addBond(b24);
341         IBond b25 = mol.getBuilder().newInstance(IBond.class, a15, a17, IBond.Order.SINGLE);
342         mol.addBond(b25);
343         IBond b26 = mol.getBuilder().newInstance(IBond.class, a15, a21, IBond.Order.SINGLE);
344         mol.addBond(b26);
345         IBond b27 = mol.getBuilder().newInstance(IBond.class, a16, a22, IBond.Order.SINGLE);
346         mol.addBond(b27);
347         IBond b28 = mol.getBuilder().newInstance(IBond.class, a16, a23, IBond.Order.SINGLE);
348         mol.addBond(b28);
349         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
350         addImplicitHydrogens(mol);
351         IntegerResult result = (IntegerResult) descriptor.calculate(mol).getValue();
352         Assert.assertEquals(2, result.intValue());
353     }
354 }
355