1 /*
2 *  Copyright (C) 2016 Sereina Riniker, Paolo Tosco
3 *
4 *    @@ All Rights Reserved @@
5 *   This file is part of the RDKit.
6 *   The contents are covered by the terms of the BSD license
7 *   which is included in the file license.txt, found at the root
8 *   of the RDKit source tree.
9 */
10 
11 package org.RDKit;
12 
13 import static org.junit.Assert.*;
14 
15 import java.io.File;
16 import java.io.FileReader;
17 import java.io.BufferedReader;
18 
19 import org.junit.Test;
20 
21 public class TrajectoryTests extends GraphMolTest {
22     @Test
testBasicInstantiation_Snapshot()23     public void testBasicInstantiation_Snapshot() {
24         Shared_Double_Array pos = new Shared_Double_Array();
25         Snapshot s = new Snapshot(pos);
26         assertNotNull(s);
27     }
28 
29     @Test
testSnapshot()30     public void testSnapshot() {
31         Shared_Double_Array pos = new Shared_Double_Array();
32         Snapshot s = new Snapshot(pos);
33         boolean e = false;
34         try {
35             s.getPoint2D(12);
36         }
37         catch (GenericRDKitException ex) {
38             e = true;
39         }
40         assertEquals(true, e);
41     }
42 
43     @Test
testTrajectory2D()44     public void testTrajectory2D() {
45         final int dim = 2;
46         final int np = 10;
47         final int ns = 5;
48         Trajectory traj = new Trajectory(dim, np);
49         assertEquals(traj.dimension(), dim);
50         assertEquals(traj.numPoints(), np);
51         final int posLen = np * dim;
52         Double_Vect dv = new Double_Vect(posLen);
53         for (int i = 0; i < posLen; ++i)
54             dv.set(i, (double)i);
55         for (int i = 0; i < ns; ++i)
56             traj.addSnapshot(new Snapshot(dv, (double)i));
57         assertEquals(traj.size(), ns);
58         boolean e = false;
59         try {
60             traj.getSnapshot(ns);
61         }
62         catch (GenericRDKitException ex) {
63             e = true;
64         }
65         assertEquals(true, e);
66         e = false;
67         try {
68             traj.getSnapshot(0).getPoint2D(np);
69         }
70         catch (GenericRDKitException ex) {
71             e = true;
72         }
73         assertEquals(true, e);
74         for (int i = 0; i < np; ++i) {
75             assertEquals(traj.getSnapshot(0).getPoint2D(i).getX(), (double)(i * dim), 0.001);
76             assertEquals(traj.getSnapshot(0).getPoint2D(i).getY(), (double)(i * dim + 1), 0.001);
77             e = false;
78             try {
79                 assertEquals(traj.getSnapshot(0).getPoint3D(i).getZ(), 0.0, 0.001);
80             }
81             catch (GenericRDKitException ex) {
82                 e = true;
83             }
84             assertEquals(false, e);
85         }
86         for (int i = 0; i < ns; ++i)
87             assertEquals((double)(i), traj.getSnapshot(i).getEnergy(), 0.001);
88         traj.removeSnapshot(0);
89         assertEquals(ns - 1, traj.size());
90         for (int i = 0; i < (ns - 1); ++i)
91             assertEquals((double)(i + 1), traj.getSnapshot(i).getEnergy(), 0.001);
92         traj.insertSnapshot(0, new Snapshot(dv, 999.0));
93         assertEquals(ns, traj.size());
94         Snapshot copySnapshot = new Snapshot(traj.getSnapshot(0));
95         traj.addSnapshot(copySnapshot);
96         assertEquals(ns + 1, traj.size());
97         assertEquals(999.0, traj.getSnapshot(0).getEnergy(), 0.001);
98         assertEquals(1.0, traj.getSnapshot(1).getEnergy(), 0.001);
99         assertEquals(999.0, traj.getSnapshot(traj.size() - 1).getEnergy(), 0.001);
100         Trajectory traj2 = new Trajectory(traj);
101         assertEquals(traj2.size(), traj.size());
102     }
103 
104     @Test
testTrajectory3D()105     public void testTrajectory3D() {
106         final int dim = 3;
107         final int np = 10;
108         final int ns = 5;
109         Trajectory traj = new Trajectory(dim, np);
110         assertEquals(dim, traj.dimension());
111         assertEquals(np, traj.numPoints());
112         final int posLen = np * dim;
113         Double_Vect dv = new Double_Vect(posLen);
114         for (int i = 0; i < posLen; ++i)
115             dv.set(i, (double)i);
116         for (int i = 0; i < ns; ++i)
117             traj.addSnapshot(new Snapshot(dv, (double)i));
118         assertEquals(ns, traj.size());
119         boolean e = false;
120         try {
121             traj.getSnapshot(ns);
122         }
123         catch (GenericRDKitException ex) {
124             e = true;
125         }
126         assertEquals(true, e);
127         e = false;
128         try {
129             traj.getSnapshot(0).getPoint2D(np);
130         }
131         catch (GenericRDKitException ex) {
132             e = true;
133         }
134         assertEquals(true, e);
135         for (int i = 0; i < np; ++i) {
136             assertEquals((double)(i * dim), traj.getSnapshot(0).getPoint3D(i).getX(), 0.001);
137             assertEquals((double)(i * dim + 1), traj.getSnapshot(0).getPoint3D(i).getY(), 0.001);
138             assertEquals((double)(i * dim + 2), traj.getSnapshot(0).getPoint3D(i).getZ(), 0.001);
139             if (i == 0) {
140                 e = false;
141                 try {
142                     traj.getSnapshot(0).getPoint2D(i);
143                 }
144                 catch (GenericRDKitException ex) {
145                     e = true;
146                 }
147                 assertEquals(true, e);
148             }
149         }
150         for (int i = 0; i < ns; ++i)
151             assertEquals((double)(i), traj.getSnapshot(i).getEnergy(), 0.001);
152         traj.removeSnapshot(0);
153         assertEquals(ns - 1, traj.size());
154         for (int i = 0; i < (ns - 1); ++i)
155             assertEquals((double)(i + 1), traj.getSnapshot(i).getEnergy(), 0.001);
156         traj.insertSnapshot(0, new Snapshot(dv, 999.0));
157         assertEquals(ns, traj.size());
158         Snapshot copySnapshot = new Snapshot(traj.getSnapshot(0));
159         traj.addSnapshot(copySnapshot);
160         assertEquals(ns + 1, traj.size());
161         assertEquals(999.0, traj.getSnapshot(0).getEnergy(), 0.001);
162         assertEquals(1.0, traj.getSnapshot(1).getEnergy(), 0.001);
163         assertEquals(999.0, traj.getSnapshot(traj.size() - 1).getEnergy(), 0.001);
164         Trajectory traj2 = new Trajectory(traj);
165         assertEquals(traj2.size(), traj.size());
166     }
167 
168     @Test
testReadAmber()169     public void testReadAmber() {
170 		String rdpath = System.getenv("RDBASE");
171 		if (rdpath == null)
172 			org.junit.Assert.fail("No definition for RDBASE");
173 		File base = new File(rdpath);
174 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
175 				+ File.separator + "test_data" + File.separator + "water_coords_bad.trx");
176 		String fName = testFile.getAbsolutePath();
177         Trajectory traj = new Trajectory(2, 0);
178         boolean e = false;
179         try {
180             RDKFuncs.readAmberTrajectory(fName, traj);
181         }
182         catch (GenericRDKitException ex) {
183             e = true;
184         }
185         assertEquals(true, e);
186         traj = new Trajectory(3, 3);
187         e = false;
188         try {
189             RDKFuncs.readAmberTrajectory(fName, traj);
190         }
191         catch (GenericRDKitException ex) {
192             e = true;
193         }
194         assertEquals(true, e);
195 		testFile = new File(base, "Code" + File.separator + "GraphMol"
196 				+ File.separator + "test_data" + File.separator + "water_coords_bad2.trx");
197 		fName = testFile.getAbsolutePath();
198         e = false;
199         traj = new Trajectory(3, 3);
200         try {
201             RDKFuncs.readAmberTrajectory(fName, traj);
202         }
203         catch (GenericRDKitException ex) {
204             e = true;
205         }
206         assertEquals(true, e);
207 		testFile = new File(base, "Code" + File.separator + "GraphMol"
208 				+ File.separator + "test_data" + File.separator + "water_coords.trx");
209 		fName = testFile.getAbsolutePath();
210         traj = new Trajectory(3, 3);
211         RDKFuncs.readAmberTrajectory(fName, traj);
212         assertEquals(traj.size(), 1);
213 		testFile = new File(base, "Code" + File.separator + "GraphMol"
214 				+ File.separator + "test_data" + File.separator + "water_coords2.trx");
215 		fName = testFile.getAbsolutePath();
216         traj = new Trajectory(3, 3);
217         RDKFuncs.readAmberTrajectory(fName, traj);
218         assertEquals(traj.size(), 2);
219     }
220 
221     @Test
testReadAmberJava()222     public void testReadAmberJava() {
223         /*
224         reimplemented the Amber trajectory reader in Java
225         let's check we get the same data as the C++ reader
226         (test for building a trajectory out of Snapshots from Java)
227         */
228 		String rdpath = System.getenv("RDBASE");
229 		if (rdpath == null)
230 			org.junit.Assert.fail("No definition for RDBASE");
231 		File base = new File(rdpath);
232 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
233 				+ File.separator + "test_data" + File.separator + "water_coords2.trx");
234 		String fName = testFile.getAbsolutePath();
235         Trajectory traj = new Trajectory(3, 3);
236         long nCoords = traj.numPoints() * 3;
237         int nSnapshots = 0;
238         BufferedReader r = null;
239         try {
240             r = new BufferedReader(new FileReader(testFile));
241         }
242         catch (Exception e) {
243             org.junit.Assert.fail("Could not open " + fName);
244         }
245         int lineNum = 0;
246         Double_Vect dv = new Double_Vect();
247         int i = 0;
248         String line = null;
249         try {
250             line = r.readLine();
251         }
252         catch (Exception e) {
253             org.junit.Assert.fail("Could not read from " + fName);
254         }
255         while (line != null) {
256             ++lineNum;
257             if (lineNum > 1) {
258                 String[] tok = line.split(" +");
259                 int j = 0;
260                 for (; (i < nCoords) && (j < tok.length); ++j) {
261                     if (tok[j].length() == 0) continue;
262                     dv.add(Double.parseDouble(tok[j]));
263                     ++i;
264                 }
265                 line = "";
266                 if (i == nCoords) {
267                     ++nSnapshots;
268                     traj.addSnapshot(new Snapshot(dv));
269                     dv.clear();
270                     i = 0;
271                     for (; j < tok.length; ++j) {
272                         if (tok[j].length() > 0)
273                             line += tok[j] + " ";
274                     }
275                 }
276             }
277             else {
278                 line = "";
279             }
280             try {
281                 String lineNew = r.readLine();
282                 if (lineNew != null)
283                     line += lineNew;
284                 else if (line.length() == 0)
285                     line = null;
286             }
287             catch (Exception e) {
288                 org.junit.Assert.fail("Could not read from " + fName);
289             }
290         }
291         try {
292             r.close();
293         }
294         catch (Exception e) {
295             org.junit.Assert.fail("Could not close " + fName);
296         }
297         assertEquals(0, i);
298         assertEquals(2, nSnapshots);
299         Trajectory traj2 = new Trajectory(3, 3);
300         RDKFuncs.readAmberTrajectory(fName, traj2);
301         assertEquals(traj2.size(), traj.size());
302         assertEquals(traj2.numPoints(), traj.numPoints());
303         for (int snapshotNum = 0; snapshotNum < traj.size(); ++snapshotNum) {
304             for (int pointNum = 0; pointNum < traj.numPoints(); ++pointNum) {
305                 assertEquals(traj2.getSnapshot(snapshotNum).getPoint3D(pointNum).getX(),
306                     traj.getSnapshot(snapshotNum).getPoint3D(pointNum).getX(), 0.001);
307                 assertEquals(traj2.getSnapshot(snapshotNum).getPoint3D(pointNum).getY(),
308                     traj.getSnapshot(snapshotNum).getPoint3D(pointNum).getY(), 0.001);
309                 assertEquals(traj2.getSnapshot(snapshotNum).getPoint3D(pointNum).getZ(),
310                     traj.getSnapshot(snapshotNum).getPoint3D(pointNum).getZ(), 0.001);
311             }
312         }
313     }
314 
315     @Test
testReadGromos()316     public void testReadGromos() {
317 		String rdpath = System.getenv("RDBASE");
318 		if (rdpath == null)
319 			org.junit.Assert.fail("No definition for RDBASE");
320 		File base = new File(rdpath);
321 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
322 				+ File.separator + "test_data" + File.separator + "water_coords_bad.trc");
323 		String fName = testFile.getAbsolutePath();
324         Trajectory traj = new Trajectory(2, 0);
325         boolean e = false;
326         try {
327             RDKFuncs.readGromosTrajectory(fName, traj);
328         }
329         catch (GenericRDKitException ex) {
330             e = true;
331         }
332         assertEquals(true, e);
333         traj = new Trajectory(3, 3);
334         e = false;
335         try {
336             RDKFuncs.readGromosTrajectory(fName, traj);
337         }
338         catch (GenericRDKitException ex) {
339             e = true;
340         }
341         assertEquals(true, e);
342 		testFile = new File(base, "Code" + File.separator + "GraphMol"
343 				+ File.separator + "test_data" + File.separator + "water_coords_bad2.trc");
344 		fName = testFile.getAbsolutePath();
345         e = false;
346         traj = new Trajectory(3, 3);
347         try {
348             RDKFuncs.readGromosTrajectory(fName, traj);
349         }
350         catch (GenericRDKitException ex) {
351             e = true;
352         }
353         assertEquals(true, e);
354 		testFile = new File(base, "Code" + File.separator + "GraphMol"
355 				+ File.separator + "test_data" + File.separator + "water_coords.trc");
356 		fName = testFile.getAbsolutePath();
357         traj = new Trajectory(3, 3);
358         RDKFuncs.readGromosTrajectory(fName, traj);
359         assertEquals(traj.size(), 1);
360 		testFile = new File(base, "Code" + File.separator + "GraphMol"
361 				+ File.separator + "test_data" + File.separator + "water_coords2.trc");
362 		fName = testFile.getAbsolutePath();
363         traj = new Trajectory(3, 3);
364         RDKFuncs.readGromosTrajectory(fName, traj);
365         assertEquals(traj.size(), 2);
366     }
367 
368     @Test
testAddConformersFromTrajectory()369     public void testAddConformersFromTrajectory() {
370         String molBlock =
371             "\n" +
372             "     RDKit          3D\n" +
373             "\n" +
374             " 71 74  0  0  0  0  0  0  0  0999 V2000\n" +
375             "    8.2543    3.1901   -0.3005 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
376             "    7.4558    1.9712    0.0938 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
377             "    7.3934    1.0441   -0.9483 O   0  0  0  0  0  0  0  0  0  0  0  0\n" +
378             "    6.6660   -0.0533   -0.4641 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
379             "    5.1928    0.2346   -0.4609 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
380             "    4.3713   -0.9410   -0.5770 N   0  0  0  0  0  0  0  0  0  0  0  0\n" +
381             "    3.1852   -1.0034   -1.2291 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
382             "    2.2914    0.1276   -1.6316 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
383             "    0.9308   -0.4468   -1.9908 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
384             "    0.1417   -0.7821   -0.7545 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
385             "   -0.1848    0.3695    0.0456 N   0  0  0  0  0  0  0  0  0  0  0  0\n" +
386             "   -1.5661    0.7686   -0.0745 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
387             "   -2.4768   -0.0640    0.8206 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
388             "   -3.8874    0.1143    0.3941 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
389             "   -4.6333   -0.9984    0.0264 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
390             "   -6.0127   -0.9516   -0.0400 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
391             "   -6.7062    0.1599    0.3963 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
392             "   -8.0408    0.4828   -0.1977 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
393             "   -7.7914    1.1180   -1.5591 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
394             "   -8.7622    1.4403    0.7265 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
395             "   -8.8409   -0.7397   -0.4395 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
396             "   -8.9121   -1.6637    0.4258 O   0  0  0  0  0  0  0  0  0  0  0  0\n" +
397             "   -9.7414   -0.7636   -1.5059 O   0  0  0  0  0  0  0  0  0  0  0  0\n" +
398             "   -5.9736    1.2357    0.8565 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
399             "   -4.5843    1.2252    0.8530 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
400             "    0.6263    1.4884   -0.3942 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
401             "    2.0541    1.0258   -0.4230 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
402             "    2.9225   -2.3317   -1.2963 N   0  0  0  0  0  0  0  0  0  0  0  0\n" +
403             "    3.6061   -2.9745   -0.3180 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
404             "    3.3554   -4.1536    0.3735 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
405             "    3.7653   -4.2712    1.6948 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
406             "    4.8254   -3.4613    2.0796 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
407             "    5.1978   -2.3436    1.3419 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
408             "    4.5694   -2.0799    0.1305 C   0  0  0  0  0  0  0  0  0  0  0  0\n" +
409             "    9.3138    3.1372    0.0031 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
410             "    7.8117    4.0754    0.1798 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
411             "    8.2358    3.3535   -1.4074 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
412             "    6.4027    2.2146    0.3634 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
413             "    7.9270    1.5444    1.0040 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
414             "    7.0677   -0.2415    0.5615 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
415             "    6.9530   -0.9105   -1.1025 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
416             "    4.9578    0.7259    0.5137 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
417             "    4.9985    0.9430   -1.3033 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
418             "    2.7171    0.7264   -2.4494 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
419             "    0.3994    0.2339   -2.6810 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
420             "    1.1342   -1.4171   -2.5076 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
421             "   -0.7632   -1.3370   -1.0391 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
422             "    0.7845   -1.4394   -0.1311 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
423             "    0.0125    0.1989    1.0673 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
424             "   -1.6672    1.8215    0.2925 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
425             "   -1.8705    0.7271   -1.1337 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
426             "   -2.3045    0.3159    1.8590 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
427             "   -2.1980   -1.1367    0.7635 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
428             "   -4.1513   -1.9468   -0.2114 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
429             "   -6.6138   -1.7460   -0.4718 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
430             "   -7.0727    0.4399   -2.0858 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
431             "   -7.3144    2.1076   -1.4482 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
432             "   -8.7609    1.1720   -2.1135 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
433             "   -8.3137    2.4504    0.5729 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
434             "   -8.6170    1.0817    1.7580 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
435             "   -9.8244    1.4444    0.4200 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
436             "   -6.4629    2.0541    1.3719 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
437             "   -4.0445    2.0563    1.3058 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
438             "    0.3329    1.8224   -1.3991 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
439             "    0.4920    2.3164    0.3160 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
440             "    2.2025    0.3766    0.4766 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
441             "    2.7945    1.8369   -0.3969 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
442             "    2.4404   -4.6964    0.1303 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
443             "    3.3157   -5.0055    2.3587 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
444             "    5.4272   -3.7654    2.9380 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
445             "    5.5668   -1.5069    1.9380 H   0  0  0  0  0  0  0  0  0  0  0  0\n" +
446             "  1  2  1  0\n" +
447             "  2  3  1  0\n" +
448             "  3  4  1  0\n" +
449             "  4  5  1  0\n" +
450             "  5  6  1  0\n" +
451             "  6  7  1  0\n" +
452             "  7  8  1  0\n" +
453             "  8  9  1  0\n" +
454             "  9 10  1  0\n" +
455             " 10 11  1  0\n" +
456             " 11 12  1  0\n" +
457             " 12 13  1  0\n" +
458             " 13 14  1  0\n" +
459             " 14 15  2  0\n" +
460             " 15 16  1  0\n" +
461             " 16 17  2  0\n" +
462             " 17 18  1  0\n" +
463             " 18 19  1  0\n" +
464             " 18 20  1  0\n" +
465             " 18 21  1  0\n" +
466             " 21 22  2  0\n" +
467             " 21 23  1  0\n" +
468             " 17 24  1  0\n" +
469             " 24 25  2  0\n" +
470             " 11 26  1  0\n" +
471             " 26 27  1  0\n" +
472             "  7 28  2  0\n" +
473             " 28 29  1  0\n" +
474             " 29 30  2  0\n" +
475             " 30 31  1  0\n" +
476             " 31 32  2  0\n" +
477             " 32 33  1  0\n" +
478             " 33 34  2  0\n" +
479             " 34  6  1  0\n" +
480             " 27  8  1  0\n" +
481             " 34 29  1  0\n" +
482             " 25 14  1  0\n" +
483             "  1 35  1  0\n" +
484             "  1 36  1  0\n" +
485             "  1 37  1  0\n" +
486             "  2 38  1  0\n" +
487             "  2 39  1  0\n" +
488             "  4 40  1  0\n" +
489             "  4 41  1  0\n" +
490             "  5 42  1  0\n" +
491             "  5 43  1  0\n" +
492             "  8 44  1  0\n" +
493             "  9 45  1  0\n" +
494             "  9 46  1  0\n" +
495             " 10 47  1  0\n" +
496             " 10 48  1  0\n" +
497             " 11 49  1  0\n" +
498             " 12 50  1  0\n" +
499             " 12 51  1  0\n" +
500             " 13 52  1  0\n" +
501             " 13 53  1  0\n" +
502             " 15 54  1  0\n" +
503             " 16 55  1  0\n" +
504             " 19 56  1  0\n" +
505             " 19 57  1  0\n" +
506             " 19 58  1  0\n" +
507             " 20 59  1  0\n" +
508             " 20 60  1  0\n" +
509             " 20 61  1  0\n" +
510             " 24 62  1  0\n" +
511             " 25 63  1  0\n" +
512             " 26 64  1  0\n" +
513             " 26 65  1  0\n" +
514             " 27 66  1  0\n" +
515             " 27 67  1  0\n" +
516             " 30 68  1  0\n" +
517             " 31 69  1  0\n" +
518             " 32 70  1  0\n" +
519             " 33 71  1  0\n" +
520             "M  CHG  2  11   1  23  -1\n" +
521             "M  END\n";
522         ROMol mol = RWMol.MolFromMolBlock(molBlock, true, false);
523         final int everySteps = 10;
524         final int maxIts = 1000;
525         final double gradTol = 0.01;
526 		String rdpath = System.getenv("RDBASE");
527 		if (rdpath == null)
528 			org.junit.Assert.fail("No definition for RDBASE");
529 		File base = new File(rdpath);
530 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
531 				+ File.separator + "test_data" + File.separator + "bilastine_trajectory_java.sdf");
532 		String fName = testFile.getAbsolutePath();
533         SDWriter w = new SDWriter(fName);
534         ForceField field = ForceField.MMFFGetMoleculeForceField(mol);
535         field.initialize();
536         SWIGTYPE_p_std__vectorT_RDKit__Snapshot_t sv = Snapshot.SnapshotVect();
537         int res = field.minimize(everySteps, sv, maxIts, gradTol);
538         assertEquals(0, res);
539         Trajectory traj = new Trajectory(3, mol.getNumAtoms(), sv);
540         mol.removeConformer(0);
541         traj.addConformersToMol(mol);
542         for (int nConf = 0; nConf < mol.getNumConformers(); ++nConf) {
543             String ss = String.format("%.4f", traj.getSnapshot(nConf).getEnergy());
544             mol.setProp("ENERGY", ss, false);
545             w.write(mol, nConf);
546         }
547         w.close();
548         traj.clear();
549         long n1 = mol.getNumConformers();
550         traj.addConformersToMol(mol);
551         long n2 = mol.getNumConformers();
552         assertEquals(n2, n1);
553         // getSnapshot should raise exception after Clear()
554         boolean e = false;
555         try {
556             traj.getSnapshot(0);
557         }
558         catch (GenericRDKitException ex) {
559             e = true;
560         }
561         assertEquals(true, e);
562     }
563 
564     @Test
testAddConformersFromAmberTrajectory()565     public void testAddConformersFromAmberTrajectory() {
566         ROMol mol = RWMol.MolFromSmiles("CCC");
567 		String rdpath = System.getenv("RDBASE");
568 		if (rdpath == null)
569 			org.junit.Assert.fail("No definition for RDBASE");
570 		File base = new File(rdpath);
571 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
572 				+ File.separator + "test_data" + File.separator + "water_coords.trx");
573 		String fName = testFile.getAbsolutePath();
574         {
575             Trajectory traj = new Trajectory(3, mol.getNumAtoms());
576             RDKFuncs.readAmberTrajectory(fName, traj);
577             assertEquals(1, traj.size());
578             for (int i = 0; i < 2; ++i) {
579                 traj.addConformersToMol(mol);
580                 assertEquals(i + 1, mol.getNumConformers());
581                 assertEquals(3, mol.getConformer(i).getNumAtoms());
582                 assertEquals(0.1941767, mol.getConformer(i).getAtomPos(0).getX(), 0.001);
583                 assertEquals(-0.4088006, mol.getConformer(i).getAtomPos(2).getZ(), 0.001);
584             }
585             mol.clearConformers();
586             boolean e = false;
587             try {
588                 traj.addConformersToMol(mol, 1);
589             }
590             catch (GenericRDKitException ex) {
591                 e = true;
592             }
593             assertEquals(true, e);
594             assertEquals(0, mol.getNumConformers());
595 		}
596         testFile = new File(base, "Code" + File.separator + "GraphMol"
597 				+ File.separator + "test_data" + File.separator + "water_coords2.trx");
598         fName = testFile.getAbsolutePath();
599         {
600             Trajectory traj = new Trajectory(3, mol.getNumAtoms());
601             RDKFuncs.readAmberTrajectory(fName, traj);
602             assertEquals(2, traj.size());
603             traj.addConformersToMol(mol);
604             assertEquals(2, mol.getNumConformers());
605             mol.clearConformers();
606             traj.addConformersToMol(mol, 0, 0);
607             assertEquals(1, mol.getNumConformers());
608             traj.addConformersToMol(mol, 1);
609             assertEquals(2, mol.getNumConformers());
610         }
611     }
612 
613     @Test
testAddConformersFromGromosTrajectory()614     public void testAddConformersFromGromosTrajectory() {
615         ROMol mol = RWMol.MolFromSmiles("CCC");
616 		String rdpath = System.getenv("RDBASE");
617 		if (rdpath == null)
618 			org.junit.Assert.fail("No definition for RDBASE");
619 		File base = new File(rdpath);
620 		File testFile = new File(base, "Code" + File.separator + "GraphMol"
621 				+ File.separator + "test_data" + File.separator + "water_coords.trc");
622 		String fName = testFile.getAbsolutePath();
623         {
624             Trajectory traj = new Trajectory(3, mol.getNumAtoms());
625             RDKFuncs.readGromosTrajectory(fName, traj);
626             assertEquals(1, traj.size());
627             for (int i = 0; i < 2; ++i) {
628                 traj.addConformersToMol(mol);
629                 assertEquals(i + 1, mol.getNumConformers());
630                 assertEquals(3, mol.getConformer(i).getNumAtoms());
631                 assertEquals(1.941767, mol.getConformer(i).getAtomPos(0).getX(), 0.001);
632                 assertEquals(-4.088006, mol.getConformer(i).getAtomPos(2).getZ(), 0.001);
633             }
634             mol.clearConformers();
635             boolean e = false;
636             try {
637                 traj.addConformersToMol(mol, 1);
638             }
639             catch (GenericRDKitException ex) {
640                 e = true;
641             }
642             assertEquals(true, e);
643             assertEquals(0, mol.getNumConformers());
644 		}
645         testFile = new File(base, "Code" + File.separator + "GraphMol"
646 				+ File.separator + "test_data" + File.separator + "water_coords2.trc");
647         fName = testFile.getAbsolutePath();
648         {
649             Trajectory traj = new Trajectory(3, mol.getNumAtoms());
650             RDKFuncs.readGromosTrajectory(fName, traj);
651             assertEquals(2, traj.size());
652             traj.addConformersToMol(mol);
653             assertEquals(2, mol.getNumConformers());
654             mol.clearConformers();
655             traj.addConformersToMol(mol, 0, 0);
656             assertEquals(1, mol.getNumConformers());
657             traj.addConformersToMol(mol, 1);
658             assertEquals(2, mol.getNumConformers());
659         }
660     }
661 
main(String args[])662 	public static void main(String args[]) {
663 		org.junit.runner.JUnitCore.main("org.RDKit.TrajectoryTests");
664 	}
665 }
666