$darkmode
DENOPTIM
FragmentSpaceTest.java
Go to the documentation of this file.
1package denoptim.fragspace;
2
3import static org.junit.jupiter.api.Assertions.assertEquals;
4import static org.junit.jupiter.api.Assertions.assertTrue;
5
6/*
7 * DENOPTIM
8 * Copyright (C) 2019 Marco Foscato <marco.foscato@uib.no>
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU Affero General Public License as published
12 * by the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Affero General Public License for more details.
19 *
20 * You should have received a copy of the GNU Affero General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24import java.io.File;
25import java.util.ArrayList;
26import java.util.Arrays;
27import java.util.HashMap;
28import java.util.HashSet;
29import java.util.List;
30import java.util.Map;
31import java.util.Random;
32import java.util.Set;
33import java.util.function.Supplier;
34import java.util.stream.Collectors;
35import java.util.stream.IntStream;
36
37import javax.vecmath.Point3d;
38
39import org.junit.jupiter.api.Test;
40import org.junit.jupiter.api.io.TempDir;
41import org.openscience.cdk.Atom;
42import org.openscience.cdk.DefaultChemObjectBuilder;
43import org.openscience.cdk.PseudoAtom;
44import org.openscience.cdk.interfaces.IAtom;
45import org.openscience.cdk.interfaces.IAtomContainer;
46import org.openscience.cdk.interfaces.IChemObjectBuilder;
47import org.openscience.cdk.silent.Bond;
48
49import denoptim.exception.DENOPTIMException;
50import denoptim.files.FileUtils;
51import denoptim.graph.APClass;
52import denoptim.graph.AttachmentPoint;
53import denoptim.graph.DGraph;
54import denoptim.graph.Edge;
55import denoptim.graph.Edge.BondType;
56import denoptim.graph.Fragment;
57import denoptim.graph.Ring;
58import denoptim.graph.SymmetricAPs;
59import denoptim.graph.Template;
60import denoptim.graph.Vertex;
61import denoptim.graph.Vertex.BBType;
62import denoptim.graph.rings.RingClosingAttractor;
63import denoptim.io.DenoptimIO;
64import denoptim.molecularmodeling.ThreeDimTreeBuilder;
65import denoptim.utils.GraphUtils;
66import denoptim.utils.MoleculeUtils;
67
75{
76 private static final String SEP = System.getProperty("file.separator");
77
78 @TempDir
79 static File tempDir;
80
81 private final Random rng = new Random();
82
83 private static final int APSUBRULE = 0;
84
85 private static final String RULAPCS = "apc-S";
86 private static final String RULAPC1 = "apc-1";
87 private static final String RULAPC2 = "apc-2";
88 private static final String RULAPC3 = "apc-3";
89 private static final String RULAPC4 = "apc-4";
90 private static final String RULAPC5 = "a_p_c-5";
91 private static final String RULAPC6 = "a_p_c-6";
92 private static final String RULAPCC1 = "cap-1";
93 private static final String RULAPCC2 = "cap-2";
94
95 private static final BBType BBTFRAG = BBType.FRAGMENT;
96
97 private static APClass APCS;
98 private static APClass APC1;
99 private static APClass APC2;
100 private static APClass APC3;
101 private static APClass APC4;
102 private static APClass APC5;
103 private static APClass APC6;
104 private static APClass APCC1;
105 private static APClass APCC2;
106
107//------------------------------------------------------------------------------
108
110 {
111 assertTrue(tempDir.isDirectory(),"Should be a directory ");
112
113 try
114 {
124 } catch (DENOPTIMException e)
125 {
126 //This will not happen
127 }
128
129 String rootName = tempDir.getAbsolutePath() + SEP;
130
131 ArrayList<Vertex> fragLib = new ArrayList<Vertex>();
132 Fragment frg1 = new Fragment();
133 Atom a1 = new Atom("C", new Point3d(new double[]{0.0, 1.1, 2.2}));
134 Atom a2 = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
135 Atom a3 = new Atom("C", new Point3d(new double[]{2.0, 1.1, 2.2}));
136 frg1.addAtom(a1);
137 frg1.addAtom(a2);
138 frg1.addAtom(a3);
139 frg1.addBond(new Bond(a1, a2));
140 frg1.addBond(new Bond(a2, a3));
141 frg1.addAPOnAtom(a3, APC1, new Point3d(new double[]{0.0, 2.2, 3.3}));
142 frg1.addAPOnAtom(a3, APC1, new Point3d(new double[]{0.0, 0.0, 3.3}));
143 frg1.addAPOnAtom(a3, APC2, new Point3d(new double[]{0.0, 0.0, 1.1}));
144 frg1.addAPOnAtom(a1, APC3, new Point3d(new double[]{3.0, 0.0, 3.3}));
146 fragLib.add(frg1);
147
148 Fragment frg2 = new Fragment();
149 Atom a21 = new Atom("N", new Point3d(new double[]{0.0, 1.1, 2.2}));
150 Atom a22 = new Atom("H", new Point3d(new double[]{1.0, 1.1, 2.2}));
151 frg2.addAtom(a21);
152 frg2.addAtom(a22);
153 frg2.addBond(new Bond(a21, a22));
154 frg2.addAPOnAtom(a22, APC2, new Point3d(new double[]{0.0, 2.2, 3.3}));
155 frg2.addAPOnAtom(a22, APC2, new Point3d(new double[]{0.0, 0.0, 3.3}));
157 fragLib.add(frg2);
158
159 Fragment frg3 = new Fragment();
160 Atom a31 = new Atom("P", new Point3d(new double[]{0.0, 1.1, 2.2}));
161 frg3.addAtom(a31);
162 frg3.addAPOnAtom(a31, APC1, new Point3d(new double[]{0.0, 2.2, 3.3}));
163 frg3.addAPOnAtom(a31, APC2, new Point3d(new double[]{0.0, 0.0, 3.3}));
164 frg3.addAPOnAtom(a31, APC3, new Point3d(new double[]{0.0, 0.0, 1.1}));
166 fragLib.add(frg3);
167
168 Fragment frg8 = new Fragment();
169 Atom a81 = new Atom("C", new Point3d(new double[]{0.0, 1.1, -2.2}));
170 Atom a82 = new Atom("C", new Point3d(new double[]{1.0, 1.1, -2.2}));
171 Atom a83 = new Atom("C", new Point3d(new double[]{2.0, 1.1, -2.2}));
172 frg8.addAtom(a81);
173 frg8.addAtom(a82);
174 frg8.addAtom(a83);
175 frg8.addBond(new Bond(a81, a82));
176 frg8.addBond(new Bond(a82, a83));
177 frg8.addAPOnAtom(a83, APC4, new Point3d(new double[]{0.0, 2.2, -3.3}));
178 frg8.addAPOnAtom(a83, APC4, new Point3d(new double[]{0.0, 0.0, -3.3}));
179 frg8.addAPOnAtom(a83, APC6, new Point3d(new double[]{0.0, 0.0, -1.1}));
180 frg8.addAPOnAtom(a82, APC5, new Point3d(new double[]{1.0, 0.1, -2.2}));
181 frg8.addAPOnAtom(a82, APC5, new Point3d(new double[]{1.0, 0.1, -1.2}));
182 frg8.addAPOnAtom(a82, APC5, new Point3d(new double[]{1.0, 2.1, -2.2}));
183 frg8.addAPOnAtom(a81, APC5, new Point3d(new double[]{3.0, 0.0, -3.3}));
185 fragLib.add(frg8);
186
187 String fragLibFile = rootName + "frags.sdf";
188 DenoptimIO.writeVertexesToSDF(new File(fragLibFile), fragLib, false);
189
190 ArrayList<Vertex> scaffLib = new ArrayList<Vertex>();
191 Fragment scaf0 = new Fragment();
192 Atom a41 = new Atom("O", new Point3d(new double[]{0.0, 1.1, 2.2}));
193 Atom a42 = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
194 Atom a43 = new Atom("Ru", new Point3d(new double[]{2.0, 1.1, 2.2}));
195 scaf0.addAtom(a41);
196 scaf0.addAtom(a42);
197 scaf0.addAtom(a43);
198 scaf0.addBond(new Bond(a41, a42));
199 scaf0.addBond(new Bond(a42, a43));
200 scaf0.addAPOnAtom(a43, APCS, new Point3d(new double[]{0.0, 2.2, 3.3}));
201 scaf0.addAPOnAtom(a43, APCS, new Point3d(new double[]{0.0, 0.0, 3.3}));
202 scaf0.addAPOnAtom(a43, APCS, new Point3d(new double[]{0.0, 0.0, 1.1}));
203 scaf0.addAPOnAtom(a41, APCS, new Point3d(new double[]{3.0, 0.0, 3.3}));
205 scaffLib.add(scaf0);
206
207 Fragment scaf1 = new Fragment();
208 Atom a51 = new Atom("Zn", new Point3d(new double[]{5.0, 1.1, 2.2}));
209 scaf1.addAtom(a51);
210 scaf1.addAPOnAtom(a51, APCS, new Point3d(new double[]{5.0, 2.2, 3.3}));
211 scaf1.addAPOnAtom(a51, APCS, new Point3d(new double[]{5.0, 0.0, 3.3}));
212 scaf1.addAPOnAtom(a51, APCS, new Point3d(new double[]{5.0, 0.0, 1.1}));
214 scaffLib.add(scaf1);
215
216 String scaffLibFile = rootName + "scaff.sdf";
217 DenoptimIO.writeVertexesToSDF(new File(scaffLibFile), scaffLib, false);
218
219 ArrayList<Vertex> cappLib = new ArrayList<Vertex>();
220 Fragment cap1 = new Fragment();
221 Atom a61 = new Atom("H", new Point3d(new double[]{10.0, 1.1, 2.2}));
222 cap1.addAtom(a61);
223 cap1.addAPOnAtom(a61, APCC1, new Point3d(new double[]{13.0, 0.0, 3.3}));
225 cappLib.add(cap1);
226
227 Fragment cap2 = new Fragment();
228 Atom a71 = new Atom("Cl", new Point3d(new double[]{10.0, 1.1, 2.2}));
229 cap2.addAtom(a71);
230 cap2.addAPOnAtom(a71, APCC2, new Point3d(new double[]{13.0, 0.0, 3.3}));
232 cappLib.add(cap2);
233
234 String capLibFile = rootName + "caps.sdf";
235 DenoptimIO.writeVertexesToSDF(new File(capLibFile), cappLib, false);
236
237 HashMap<APClass,ArrayList<APClass>> cpMap =
238 new HashMap<APClass,ArrayList<APClass>>();
239 ArrayList<APClass> lst1 = new ArrayList<APClass>();
240 lst1.add(APC1);
241 lst1.add(APC2);
242 cpMap.put(APCS, lst1);
243 ArrayList<APClass> lst2 = new ArrayList<APClass>();
244 lst2.add(APC2);
245 cpMap.put(APC1, lst2);
246 ArrayList<APClass> lst3 = new ArrayList<APClass>();
247 lst3.add(APC2);
248 lst3.add(APC3);
249 cpMap.put(APC2, lst3);
250
251 HashMap<APClass,APClass> capMap = new HashMap<APClass,APClass>();
252 capMap.put(APCS, APCC2);
253 capMap.put(APC1, APCC1);
254 capMap.put(APC2, APCC1);
255
256 HashSet<APClass> ends = new HashSet<APClass>();
257 ends.add(APC3);
258
259 String cpmFile = rootName + "cpm.dat";
260 DenoptimIO.writeCompatibilityMatrix(cpmFile, cpMap, capMap,ends);
261
262 /*
263 //Just in case one day we want to have also an RC-CPMap
264 HashMap<APClass,ArrayList<APClass>> rcCpMap =
265 new HashMap<APClass,ArrayList<APClass>>();
266 */
267
269 new FragmentSpace(fsp, scaffLibFile, fragLibFile,
270 capLibFile, cpmFile);
271 return fsp;
272 }
273
274//-----------------------------------------------------------------------------
275
276 @Test
277 public void testSymmetry() throws Exception
278 {
280 assertTrue(fsp.getFragmentSpace().isDefined(),"FragmentSpace is defined");
283 fsp.getFragmentSpace());
284
285 assertEquals(2,v.getSymmetricAPSets().size(),
286 "Number of symmetric sets of APs");
287
288 Map<APClass,Integer> expectedCount = new HashMap<APClass,Integer>();
289 expectedCount.put(APC4, 2);
290 expectedCount.put(APC5, 3);
291 for (SymmetricAPs ss : v.getSymmetricAPSets())
292 {
293 APClass apc = ss.get(0).getAPClass();
294 assertEquals(expectedCount.get(apc),ss.size(),
295 "Number of APs in symmetric set for APClass "+apc);
296 }
297 }
298
299//-----------------------------------------------------------------------------
300
301 @Test
302 public void testGetFragsWithAPClass() throws Exception
303 {
306 assertTrue(fs.isDefined(),"FragmentSpace is defined");
307 ArrayList<IdFragmentAndAP> l = fs.getFragsWithAPClass(APC2);
308 assertEquals(4,l.size(),"Wrong size of AP IDs with given APClass.");
309
310 int i = -1;
311 for (IdFragmentAndAP id : l)
312 {
313 i++;
315 id.getVertexMolId(), id.getVertexMolType(), fs);
316 assertEquals(APC2, v.getAP(id.getApId()).getAPClass(),
317 "APClass of "+i);
318 }
319 }
320
321//-----------------------------------------------------------------------------
322
323 @Test
324 public void testGetVerticesWithAPClass() throws Exception
325 {
328 assertTrue(fs.isDefined(),"FragmentSpace is defined");
329 ArrayList<Vertex> lst = fs.getVerticesWithAPClass(APC2);
330 assertEquals(4,lst.size(),"Wrong size of AP IDs with given APClass.");
331
332 for (Vertex v : lst)
333 {
334 assertTrue( v.getAllAPClasses().contains(APC2));
335 }
336 }
337
338//-----------------------------------------------------------------------------
339
340 @Test
341 public void testGetVerticesWithAPClasses() throws Exception
342 {
345 assertTrue(fs.isDefined(),"FragmentSpace is defined");
346
347 Set<APClass> query = new HashSet<APClass>();
348 query.add(APC2);
349 query.add(APC1);
350 List<Vertex> lst = fs.getVerticesWithAPClasses(query);
351 assertEquals(2, lst.size());
352 for (APClass apc : query)
353 {
354 for (Vertex v : lst)
355 {
356 assertTrue(v.getAllAPClasses().contains(apc));
357 }
358 }
359 }
360
361//-----------------------------------------------------------------------------
362
363 @Test
364 public void testGetVerticesWithAPFingerprint() throws Exception
365 {
368 assertTrue(fs.isDefined(),"FragmentSpace is defined");
369
370 // Add vertex to get more results
371 Fragment frg1b = new Fragment();
372 Atom a1b = new Atom("C", new Point3d(new double[]{0.0, 1.1, 2.2}));
373 Atom a2b = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
374 frg1b.addAtom(a1b);
375 frg1b.addAtom(a2b);
376 frg1b.addBond(new Bond(a1b, a2b));
377 frg1b.addAPOnAtom(a1b, APC1, new Point3d(new double[]{0.0, 2.2, 3.3}));
378 frg1b.addAPOnAtom(a1b, APC1, new Point3d(new double[]{0.0, 0.0, 3.3}));
379 frg1b.addAPOnAtom(a2b, APC2, new Point3d(new double[]{0.0, 0.0, 1.1}));
380 frg1b.addAPOnAtom(a2b, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
383
384 Fragment frg1c = new Fragment();
385 Atom a1c = new Atom("C", new Point3d(new double[]{0.0, 1.1, 2.2}));
386 Atom a2c = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
387 frg1c.addAtom(a1c);
388 frg1c.addAtom(a2c);
389 frg1c.addBond(new Bond(a1c, a2c));
390 frg1c.addAPOnAtom(a1c, APC1, new Point3d(new double[]{0.0, 2.2, 3.3}));
391 frg1c.addAPOnAtom(a2c, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
394
395 Fragment frg1d = new Fragment();
396 Atom a1d = new Atom("C", new Point3d(new double[]{0.0, 1.1, 2.2}));
397 Atom a2d = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
398 frg1d.addAtom(a1d);
399 frg1d.addAtom(a2d);
400 frg1d.addBond(new Bond(a1d, a2d));
401 frg1d.addAPOnAtom(a1d, APCS, new Point3d(new double[]{0.0, 2.2, 3.3}));
402 frg1d.addAPOnAtom(a2d, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
403 frg1d.addAPOnAtom(a1d, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
404 frg1d.addAPOnAtom(a1d, APC1, new Point3d(new double[]{3.0, 0.0, 3.3}));
407
408 Fragment frg1 = new Fragment();
409 Atom a1 = new Atom("C", new Point3d(new double[]{0.0, 1.1, 2.2}));
410 Atom a2 = new Atom("C", new Point3d(new double[]{1.0, 1.1, 2.2}));
411 frg1.addAtom(a1);
412 frg1.addAtom(a2);
413 frg1.addBond(new Bond(a1, a2));
414 frg1.addAPOnAtom(a1, APC1, new Point3d(new double[]{0.0, 2.2, 3.3}));
415 frg1.addAPOnAtom(a2, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
416 frg1.addAPOnAtom(a1, APC2, new Point3d(new double[]{3.0, 0.0, 3.3}));
419
420 Map<APClass,Integer> query = new HashMap<APClass,Integer>();
421 query.put(APC2,2);
422 query.put(APC1,1);
423 List<Vertex> lst = fs.getVerticesWithAPFingerprint(query);
424 assertEquals(3, lst.size());
425
426 for (Vertex v : lst)
427 {
428 for (APClass apc : query.keySet())
429 {
430 assertTrue(query.get(apc) <= v.getAttachmentPoints().stream()
431 .filter(ap -> ap.getAPClass().equals(apc))
432 .count());
433 }
434 }
435 }
436
437//-----------------------------------------------------------------------------
438
439 @Test
440 public void testGetFragsWithAPClassStartingWith() throws Exception
441 {
444 assertTrue(fs.isDefined(),"FragmentSpace is defined");
445 List<Vertex> lst = fs.getVerticesWithAPClassStartingWith(
446 RULAPC5.substring(0, 4));
447 assertEquals(1, lst.size(),"Wrong size of AP IDs with given APClass.");
448
449 int counter = 0;
450 for (Vertex v : lst)
451 {
452 for (APClass apc : v.getAllAPClasses())
453 {
454 if (apc.toString().startsWith(RULAPC5.substring(0, 4)))
455 counter++;
456 }
457 }
458 assertEquals(2, counter);
459 }
460
461//-----------------------------------------------------------------------------
462
463 @Test
464 public void testGetFragAPsCompatibleWithClass() throws Exception
465 {
466
469 assertTrue(fs.isDefined(),"FragmentSpace is defined");
470 ArrayList<IdFragmentAndAP> lst = fs.getFragAPsCompatibleWithClass(APC1);
471
472 assertEquals(4,lst.size(),"Size of compatible APs list is wrong.");
473
474 int i = -1;
475 for (IdFragmentAndAP id : lst)
476 {
477 i++;
479 id.getVertexMolId(), id.getVertexMolType(), fs);
480 AttachmentPoint ap = v.getAP(id.getApId());
481 assertTrue(APC1.isCPMapCompatibleWith(ap.getAPClass(), fs),
482 "Incompatible choice at "+i);
483 }
484 }
485
486//------------------------------------------------------------------------------
487
488 @Test
489 public void testGetFragAPsCompatibleWithTheseAPs() throws Exception
490 {
493 assertTrue(fs.isDefined(),"FragmentSpace is defined");
494 IdFragmentAndAP src1 = new IdFragmentAndAP(-1,2,BBTFRAG,0,-1,-1);
495 IdFragmentAndAP src2 = new IdFragmentAndAP(-1,2,BBTFRAG,1,-1,-1);
496 ArrayList<IdFragmentAndAP> srcAPs = new ArrayList<IdFragmentAndAP>();
497 srcAPs.add(src1);
498 srcAPs.add(src2);
500 src1.getVertexMolId(), src1.getVertexMolType(), fs);
501 APClass src1APC = src1V.getAP(src1.getApId()).getAPClass();
503 src2.getVertexMolId(), src2.getVertexMolType(), fs);
504 APClass src2APC = src2V.getAP(src2.getApId()).getAPClass();
505
506
507 /*
508 System.out.println("SRC1 "+fs.getAPClassForFragment(src1)+" => "
509 +fs.getCompatibleAPClasses(fs.getAPClassForFragment(src1)));
510 System.out.println("SRC2 "+fs.getAPClassForFragment(src2)+" => "
511 +fs.getCompatibleAPClasses(fs.getAPClassForFragment(src2)));
512 System.out.println("Frags with SRC1: "+fs.getFragAPsCompatibleWithClass(
513 fs.getAPClassForFragment(src1)));
514 System.out.println("Frags with SRC2: "+fs.getFragAPsCompatibleWithClass(
515 fs.getAPClassForFragment(src2)));
516 */
517
518 ArrayList<IdFragmentAndAP> lst = fs.getFragAPsCompatibleWithTheseAPs(
519 srcAPs);
520
521 assertEquals(4,lst.size(),"Size of compatible APs list is wrong.");
522
523 int i = -1;
524 for (IdFragmentAndAP id : lst)
525 {
526 i++;
528 id.getVertexMolId(), id.getVertexMolType(), fs);
529 AttachmentPoint ap = v.getAP(id.getApId());
530 assertTrue(src1APC.isCPMapCompatibleWith(ap.getAPClass(), fs)
531 || src2APC.isCPMapCompatibleWith(ap.getAPClass(), fs),
532 "Incompatible choice at "+i);
533 }
534 }
535
536//------------------------------------------------------------------------------
537
538 @Test
539 public void testGetFragmentsCompatibleWithTheseAPs() throws Exception
540 {
543 assertTrue(fs.isDefined(),"FragmentSpace is defined");
544 IdFragmentAndAP src1 = new IdFragmentAndAP(-1,2,BBTFRAG,0,-1,-1);
545 IdFragmentAndAP src2 = new IdFragmentAndAP(-1,2,BBTFRAG,1,-1,-1);
546 ArrayList<IdFragmentAndAP> srcAPs = new ArrayList<IdFragmentAndAP>();
547 srcAPs.add(src1);
548 srcAPs.add(src2);
549
550 ArrayList<Vertex> lst = fs.getFragmentsCompatibleWithTheseAPs(
551 srcAPs);
552
553 assertEquals(3,lst.size(),"Wrong number of compatible fragments.");
554 }
555
556//------------------------------------------------------------------------------
557
558 @Test
559 public void testGetRCVsForAPClass() throws Exception
560 {
563
564 APClass apcA = APClass.make("A",0);
565 APClass apcB = APClass.make("B",0);
566
567 HashMap<APClass,ArrayList<APClass>> cpMap =
568 new HashMap<APClass,ArrayList<APClass>>();
569 ArrayList<APClass> lstA = new ArrayList<APClass>();
570 lstA.add(rcvP);
571 cpMap.put(apcA, lstA);
572 ArrayList<APClass> lstB = new ArrayList<APClass>();
573 lstB.add(rcvP);
574 lstB.add(rcvM);
575 cpMap.put(apcB, lstB);
576
577 HashMap<APClass,ArrayList<APClass>> rcCPMap =
578 new HashMap<APClass,ArrayList<APClass>>();
579 ArrayList<APClass> lstC = new ArrayList<APClass>();
580 lstC.add(apcB);
581 rcCPMap.put(apcA, lstC);
582
583 ArrayList<Vertex> fragments = new ArrayList<Vertex>();
584
585 Fragment frg2 = new Fragment();
586 Atom a21 = new Atom("N", new Point3d(new double[]{0.0, 1.1, 2.2}));
587 Atom a22 = new Atom("H", new Point3d(new double[]{1.0, 1.1, 2.2}));
588 frg2.addAtom(a21);
589 frg2.addAtom(a22);
590 frg2.addBond(new Bond(a21, a22));
591 frg2.addAP(1, apcB, new Point3d(new double[]{0.0, 2.2, 3.3}));
592 frg2.addAP(1, apcA, new Point3d(new double[]{0.0, 0.0, 3.3}));
593 fragments.add(frg2);
594
595 Fragment rcv1 = new Fragment();
596 Atom at1 = new PseudoAtom(RingClosingAttractor.RCALABELPERAPCLASS.get(rcvP),
597 new Point3d());
598 rcv1.addAtom(at1);
599 rcv1.addAP(0, rcvP, new Point3d(1.0, 0, 0));
600 rcv1.setAsRCV(true);
601 fragments.add(rcv1);
602
603 Fragment rcv2 = new Fragment();
604 Atom at2 = new PseudoAtom(RingClosingAttractor.RCALABELPERAPCLASS.get(rcvM),
605 new Point3d());
606 rcv2.addAtom(at2);
607 rcv2.addAP(0, rcvM, new Point3d(-1.0, 0, 0));
608 rcv2.setAsRCV(true);
609 fragments.add(rcv2);
610
611 Fragment rcv3 = new Fragment();
612 Atom at3 = new PseudoAtom(RingClosingAttractor.RCALABELPERAPCLASS.get(rcvM),
613 new Point3d());
614 rcv3.addAtom(at3);
615 rcv3.addAP(0, rcvM, new Point3d(-2.0, 0, 0));
616 rcv3.setAsRCV(true);
617 fragments.add(rcv3);
618
619 HashMap<APClass,APClass> capMap = new HashMap<APClass,APClass>();
620 HashSet<APClass> forbEnds = new HashSet<APClass>();
621
623 FragmentSpace fs = new FragmentSpace(fsp,
624 new ArrayList<Vertex>(), // scaffolds
625 fragments,
626 new ArrayList<Vertex>(), // caps
627 cpMap, capMap, forbEnds, cpMap);
629
630 List<Vertex> rcvs1 = fs.getRCVsForAPClass(apcA);
631 assertEquals(1, rcvs1.size());
632 assertEquals(rcvP, rcvs1.get(0).getAP(0).getAPClass());
633 List<Vertex> rcvs2 = fs.getRCVsForAPClass(apcB);
634 assertEquals(3, rcvs2.size());
635 int countP = 0;
636 int countM = 0;
637 for (Vertex rcv : rcvs2)
638 {
639 if (rcvP == rcv.getAP(0).getAPClass())
640 countP++;
641 else
642 countM++;
643 }
644 assertEquals(1, countP);
645 assertEquals(2, countM);
646 List<Vertex> rcvs3 = fs.getRCVsForAPClass(APClass.make("C",0));
647 assertEquals(0, rcvs3.size());
648 }
649
650//------------------------------------------------------------------------------
651
652 @Test
653 public void testGetRCVsWithAPClass() throws Exception
654 {
657
658 APClass apcA = APClass.make("A",0);
659 APClass apcB = APClass.make("B",0);
660
661 HashMap<APClass,ArrayList<APClass>> cpMap =
662 new HashMap<APClass,ArrayList<APClass>>();
663 ArrayList<APClass> lstA = new ArrayList<APClass>();
664 lstA.add(rcvP);
665 cpMap.put(apcA, lstA);
666 ArrayList<APClass> lstB = new ArrayList<APClass>();
667 lstB.add(rcvP);
668 lstB.add(rcvM);
669 cpMap.put(apcB, lstB);
670
671 HashMap<APClass,ArrayList<APClass>> rcCPMap =
672 new HashMap<APClass,ArrayList<APClass>>();
673 ArrayList<APClass> lstC = new ArrayList<APClass>();
674 lstC.add(apcB);
675 rcCPMap.put(apcA, lstC);
676
677 ArrayList<Vertex> fragments = new ArrayList<Vertex>();
678
679 Fragment frg2 = new Fragment();
680 Atom a21 = new Atom("N", new Point3d(new double[]{0.0, 1.1, 2.2}));
681 Atom a22 = new Atom("H", new Point3d(new double[]{1.0, 1.1, 2.2}));
682 frg2.addAtom(a21);
683 frg2.addAtom(a22);
684 frg2.addBond(new Bond(a21, a22));
685 frg2.addAP(1, apcB, new Point3d(new double[]{0.0, 2.2, 3.3}));
686 frg2.addAP(1, apcA, new Point3d(new double[]{0.0, 0.0, 3.3}));
687 fragments.add(frg2);
688
689 Fragment rcv1 = new Fragment();
690 Atom at1 = new PseudoAtom(RingClosingAttractor.RCALABELPERAPCLASS.get(rcvP),
691 new Point3d());
692 rcv1.addAtom(at1);
693 rcv1.addAP(0, rcvP, new Point3d(1.0, 0, 0));
694 rcv1.setAsRCV(true);
695 fragments.add(rcv1);
696
697 Fragment rcv2 = new Fragment();
698 Atom at2 = new PseudoAtom(RingClosingAttractor.RCALABELPERAPCLASS.get(rcvM),
699 new Point3d());
700 rcv2.addAtom(at2);
701 rcv2.addAP(0, rcvM, new Point3d(-1.0, 0, 0));
702 rcv2.setAsRCV(true);
703 fragments.add(rcv2);
704
705 HashMap<APClass,APClass> capMap = new HashMap<APClass,APClass>();
706 HashSet<APClass> forbEnds = new HashSet<APClass>();
707
709 FragmentSpace fs = new FragmentSpace(fsp,
710 new ArrayList<Vertex>(), // scaffolds
711 fragments,
712 new ArrayList<Vertex>(), // caps
713 cpMap, capMap, forbEnds, cpMap);
715
716 List<Vertex> rcvs1 = fs.getRCVsWithAPClass(rcvP);
717 assertEquals(1, rcvs1.size());
718 assertTrue(rcv1.sameAs(rcvs1.get(0)));
719
720 List<Vertex> rcvs2 = fs.getRCVsWithAPClass(rcvM);
721 assertEquals(1, rcvs2.size());
722 assertTrue(rcv2.sameAs(rcvs2.get(0)));
723 }
724
725//------------------------------------------------------------------------------
726
737 @Test
738 public void testFusedRingAddedToFragmentLibrary() throws Exception
739 {
741 fsp.fragmentLibFile = "dummyFilename_DenoptimTest_Frag";
742 fsp.scaffoldLibFile = "dummyFilename_DenoptimTest_Scaff";
744
745 TestCase testCase = getTestCase();
746
747 List<Vertex> fragLib = fs.getFragmentLibrary();
748 fragLib.clear();
749
751
752 //Cleanup tmp files
755
756 assertEquals(1, fragLib.size());
757 Vertex actual = fragLib.get(0);
758 StringBuilder sb = new StringBuilder();
759 assertTrue(testCase.expected.sameAs(actual, sb),
760 "Problem is "+sb.toString());
761 }
762
763//------------------------------------------------------------------------------
764
770 @Test
771 public void testFusedRingAddedToScaffoldLibrary() throws Exception
772 {
774 fsp.fragmentLibFile = "dummyFilename_DenoptimTest_Frag";
775 fsp.scaffoldLibFile = "dummyFilename_DenoptimTest_Scaff";
777 TestCase testCase = getTestCase();
778 testCase.graph.getVertexList().get(0)
779 .setBuildingBlockType(BBType.SCAFFOLD);
781 testCase.expected.getInnerGraph().getVertexList().get(0)
782 .setBuildingBlockType(BBType.SCAFFOLD);
783
784 List<Vertex> scaffLib = fs.getScaffoldLibrary();
785 scaffLib.clear();
786
788
789 //Cleanup tmp files
792
793 assertEquals(1, scaffLib.size());
794 Vertex actual = scaffLib.get(0);
795 assertTrue(testCase.expected.sameAs(actual, new StringBuilder()));
796 }
797
798//------------------------------------------------------------------------------
799
800 @Test
802 {
804 fsp.fragmentLibFile = "dummyFilename_DenoptimTest_Frag";
805 fsp.scaffoldLibFile = "dummyFilename_DenoptimTest_Scaff";
807 TestCase testCase = getTestCase();
808 final int TRY_ADDING = 10;
809 List<DGraph> sameGraphs = IntStream
810 .range(0, TRY_ADDING)
811 .mapToObj(i -> testCase.graph.clone())
812 .peek(t -> t.renumberGraphVertices())
813 .collect(Collectors.toList());
814
815 List<Vertex> fragLib = fs.getFragmentLibrary();
816 fragLib.clear();
817
818 for (DGraph g : sameGraphs) {
820 }
821
822 //Cleanup tmp files
825
826 assertEquals(1, fragLib.size());
827 }
828
829//------------------------------------------------------------------------------
830
841 {
842 DGraph g = new DGraph();
844 c3 = getCarbonVertex(), c4 = getCarbonVertex(),
845 c5 = getCarbonVertex();
846
847 Vertex rcv14 = getRCV(), rcv41 = getRCV(), rcv45 = getRCV(),
848 rcv54 = getRCV();
849
850 g.addVertex(c1);
851 g.appendVertexOnAP(c1.getAP(0), c2.getAP(0));
852 g.appendVertexOnAP(c1.getAP(1), rcv14.getAP(0));
853 g.appendVertexOnAP(c2.getAP(1), c3.getAP(0));
854 g.appendVertexOnAP(c2.getAP(2), c5.getAP(0));
855 g.appendVertexOnAP(c2.getAP(3), c4.getAP(0));
856 g.appendVertexOnAP(c4.getAP(1), rcv41.getAP(0));
857 g.appendVertexOnAP(c4.getAP(2), rcv45.getAP(0));
858 g.appendVertexOnAP(c5.getAP(1), rcv54.getAP(0));
859
860 Ring r124 = new Ring(Arrays.asList(rcv14, c1, c2, c4,
861 rcv41));
862 Ring r425 = new Ring(Arrays.asList(rcv45, c4, c2, c5,
863 rcv54));
864 g.addRing(r124);
865 g.addRing(r425);
866
868
869 Template t = getExpectedTemplate(g, c3);
870
871 return new TestCase(g, t);
872 }
873
874//------------------------------------------------------------------------------
875
877 Vertex c3) throws DENOPTIMException {
878 DGraph innerGraph = g.clone();
879 innerGraph.renumberGraphVertices();
880 Vertex c3Inner = innerGraph.getVertexAtPosition(g
881 .indexOfVertexWithID(c3.getVertexId()));
882 innerGraph.removeVertex(c3Inner);
883
885 t.setInnerGraph(innerGraph);
887 return t;
888 }
889
890//------------------------------------------------------------------------------
891
893 {
894 IChemObjectBuilder builder = DefaultChemObjectBuilder.getInstance();
895 IAtom carbon = builder.newAtom();
896 carbon.setSymbol("C");
897 IAtomContainer mol = builder.newAtomContainer();
898 mol.addAtom(carbon);
899 Fragment v = new Fragment(
901 mol,
903 for (int i = 0; i < 4; i++) {
904 v.addAP(0, APC1, getRandomVector());
905 }
906 return v;
907 }
908
909//------------------------------------------------------------------------------
910
912 {
913 IChemObjectBuilder builder = DefaultChemObjectBuilder
914 .getInstance();
915 IAtomContainer dummyMol = builder.newAtomContainer();
916 IAtom dummyAtom = builder.newAtom();
917 dummyMol.addAtom(dummyAtom);
918 Fragment rcv = new Fragment(
920 dummyMol,
922 true);
923 rcv.addAP(0, APC1, getRandomVector());
924 return rcv;
925 }
926
927//------------------------------------------------------------------------------
928
929 private Point3d getRandomVector() {
930 int precision = 10 * 10 * 10 * 10;
931
932 Supplier<Double> randomCoord = () ->
933 (double) (Math.round(rng.nextDouble() * (double) precision)) /
934 ((double) precision);
935
936 return new Point3d(randomCoord.get(), randomCoord.get(),
937 randomCoord.get());
938 }
939
940//------------------------------------------------------------------------------
941
942 private static final class TestCase {
945
947 this.graph = g;
948 this.expected = expected;
949 }
950 }
951
952//------------------------------------------------------------------------------
953
976 @Test
977 public void testUseWholeMolGeometryForExtractedTemplates() throws Exception
978 {
980 fsp.fragmentLibFile = "dummyFilename_DenoptimTest_Frag";
981 fsp.scaffoldLibFile = "dummyFilename_DenoptimTest_Scaff";
983 Fragment scaf = new Fragment();
984 IAtom s1 = new Atom("C", new Point3d(0,0,0));
985 scaf.addAtom(s1);
986 scaf.addAPOnAtom(s1, APC2, new Point3d(1,1,0));
987 scaf.addAPOnAtom(s1, APC3, new Point3d(1,-1,0));
988 scaf.addAPOnAtom(s1, APC4, new Point3d(-1,-1,0));
990
992 int sId = fs.getScaffoldLibrary().size() - 1;
993
994 Fragment frg = new Fragment();
995 IAtom a1 = new Atom("C", new Point3d(0,0,0));
996 IAtom a2 = new Atom("C", new Point3d(0,0,1));
997 IAtom a3 = new Atom("C", new Point3d(0,0,2));
998 frg.addAtom(a1);
999 frg.addAtom(a2);
1000 frg.addAtom(a3);
1001 frg.addBond(new Bond(a1, a2));
1002 frg.addBond(new Bond(a2, a3));
1003 frg.addAPOnAtom(a1, APC2, new Point3d(1,1,2));
1004 frg.addAPOnAtom(a2, APC3, new Point3d(1,-1,0));
1005 frg.addAPOnAtom(a3, APC4, new Point3d(-1,-1,0));
1007
1009 int bbId = fs.getFragmentLibrary().size() - 1;
1010
1011 Fragment rcv = new Fragment();
1012 IAtom a4 = new PseudoAtom("ATN", new Point3d(0,0,0));
1013 rcv.addAtom(a4);
1014 rcv.addAPOnAtom(a4, APClass.make("ATneutral",0), new Point3d(1,0,0));
1016 rcv.setAsRCV(true);
1017
1019 int rcvId = fs.getFragmentLibrary().size() - 1;
1020
1021 DGraph wholeGraph = new DGraph();
1022 Vertex v1 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1023 Vertex v2 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1024 Vertex v3 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1025 Vertex v4 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1026 Vertex v5 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1028 Vertex v7 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1029 Vertex v8 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1030 Vertex v9 = fs.getVertexFromLibrary(BBTFRAG, bbId);
1031 Vertex v10 = fs.getVertexFromLibrary(BBTFRAG, rcvId);
1032 Vertex v11 = fs.getVertexFromLibrary(BBTFRAG, rcvId);
1033 Vertex v12 = fs.getVertexFromLibrary(BBTFRAG, rcvId);
1034 Vertex v13 = fs.getVertexFromLibrary(BBTFRAG, rcvId);
1039
1040 // Disordered... just for the fun of it. Still, do not change it further
1041 // as we need to wholeMol to be created consistently
1042 wholeGraph.addVertex(v7);
1043 wholeGraph.addVertex(v8);
1044 wholeGraph.addVertex(v9);
1045 wholeGraph.addVertex(v6);
1046 wholeGraph.addVertex(v1);
1047 wholeGraph.addVertex(v2);
1048 wholeGraph.addVertex(v3);
1049 wholeGraph.addVertex(v4);
1050 wholeGraph.addVertex(v5);
1051 wholeGraph.addVertex(v10);
1052 wholeGraph.addVertex(v11);
1053 wholeGraph.addVertex(v12);
1054 wholeGraph.addVertex(v13);
1055 wholeGraph.addVertex(c1);
1056 wholeGraph.addVertex(c2);
1057 wholeGraph.addVertex(c3);
1058 wholeGraph.addVertex(c4);
1059 wholeGraph.addEdge(new Edge(v6.getAP(0),v4.getAP(1),BondType.SINGLE));
1060 wholeGraph.addEdge(new Edge(v6.getAP(1),v10.getAP(0),BondType.SINGLE));
1061 wholeGraph.addEdge(new Edge(v4.getAP(0),v2.getAP(1),BondType.SINGLE));
1062 wholeGraph.addEdge(new Edge(v2.getAP(0),v3.getAP(0),BondType.SINGLE));
1063 wholeGraph.addEdge(new Edge(v3.getAP(1),v11.getAP(0),BondType.SINGLE));
1064 wholeGraph.addEdge(new Edge(v2.getAP(2),v1.getAP(2),BondType.SINGLE));
1065 wholeGraph.addEdge(new Edge(v6.getAP(2),v9.getAP(0),BondType.SINGLE));
1066 wholeGraph.addEdge(new Edge(v9.getAP(1),v5.getAP(0),BondType.SINGLE));
1067 wholeGraph.addEdge(new Edge(v5.getAP(1),v7.getAP(0),BondType.SINGLE));
1068 wholeGraph.addEdge(new Edge(v5.getAP(2),v8.getAP(0),BondType.SINGLE));
1069 wholeGraph.addEdge(new Edge(v7.getAP(1),v12.getAP(0),BondType.SINGLE));
1070 wholeGraph.addEdge(new Edge(v8.getAP(2),v13.getAP(0),BondType.SINGLE));
1071 wholeGraph.addEdge(new Edge(v3.getAP(2),c1.getAP(0),BondType.SINGLE));
1072 wholeGraph.addEdge(new Edge(v4.getAP(2),c2.getAP(0),BondType.SINGLE));
1073 wholeGraph.addEdge(new Edge(v7.getAP(2),c3.getAP(0),BondType.SINGLE));
1074 wholeGraph.addEdge(new Edge(v8.getAP(1),c4.getAP(0),BondType.SINGLE));
1075
1076 wholeGraph.addRing(v10, v11, BondType.DOUBLE);
1077 wholeGraph.addRing(v12, v13, BondType.DOUBLE);
1078
1080 fsp.getRandomizer());
1081 IAtomContainer wholeMol = tb3d.convertGraphTo3DAtomContainer(
1082 wholeGraph.clone(), true);
1083
1084 double r = 10;
1085 for (int i=0; i<wholeMol.getAtomCount(); i++)
1086 {
1087 IAtom atm = wholeMol.getAtom(i);
1088 if (atm instanceof PseudoAtom)
1089 ((PseudoAtom) atm).setLabel("Du");
1090 else
1091 atm.setSymbol("P");
1092 atm.setPoint3d(new Point3d(r*Math.cos(Math.toRadians(360/34 * i)),
1093 r*Math.sin(Math.toRadians(360/34 * i)),0));
1094 }
1095
1096 int szScafLibPre = fs.getScaffoldLibrary().size();
1097 int szFragLibPre = fs.getFragmentLibrary().size();
1098
1099 String scafFile = tempDir.getAbsolutePath() + SEP + "newScaf.sdf";
1100 String fragFile = tempDir.getAbsolutePath() + SEP + "newFrag.sdf";
1101 fsp.scaffoldLibFile = scafFile;
1102 fsp.fragmentLibFile = fragFile;
1103
1104 fs.addFusedRingsToFragmentLibrary(wholeGraph, true, true, wholeMol);
1105
1106 // NB: in here there is cloning of template with mol representation
1107 assertEquals(szScafLibPre+1,fs.getScaffoldLibrary().size(),
1108 "Size scaffolds library");
1109 assertEquals(szFragLibPre+1,fs.getFragmentLibrary().size(),
1110 "Size fragments library");
1111
1112 Vertex newScaff = fs.getVertexFromLibrary(
1113 BBType.SCAFFOLD,szScafLibPre); // szScafLibPre+1-1
1114 assertEquals(4,newScaff.getAttachmentPoints().size(),
1115 "#APs on new scaffold");
1116 int nP = 0;
1117 for (IAtom a : newScaff.getIAtomContainer().atoms())
1118 {
1119 if ("P".equals(MoleculeUtils.getSymbolOrLabel(a)))
1120 nP++;
1121 }
1122 assertEquals(10,nP,"#P in new scaffold");
1123
1124 Vertex newFrag = fs.getVertexFromLibrary(
1125 BBType.FRAGMENT,szFragLibPre); // szFragLibPre+1-1
1126 assertEquals(3,newFrag.getAttachmentPoints().size(),
1127 "#APs on new fragment");
1128 nP = 0;
1129 for (IAtom a : newFrag.getIAtomContainer().atoms())
1130 {
1131 if ("P".equals(MoleculeUtils.getSymbolOrLabel(a)))
1132 nP++;
1133 }
1134 assertEquals(9,nP,"#P in new fragment");
1135
1136 //Cleanup tmp files
1139 }
1140
1141//------------------------------------------------------------------------------
1142}
static void deleteFile(String fileName)
Delete the file.
Definition: FileUtils.java:256
Class defining a space of building blocks.
ArrayList< Vertex > getFragmentsCompatibleWithTheseAPs(ArrayList< IdFragmentAndAP > srcAPs)
Searches for all building blocks that are compatible with the given list of APs.
void appendVertexToLibrary(Vertex v, Vertex.BBType bbt, ArrayList< Vertex > library)
Takes a vertex and add it to a given library.
ArrayList< IdFragmentAndAP > getFragAPsCompatibleWithTheseAPs(ArrayList< IdFragmentAndAP > srcAPs)
Searches for all APs that are compatible with the given list of APs.
boolean isDefined()
Checks for valid definition of this fragment space.
Vertex getVertexFromLibrary(Vertex.BBType bbType, int bbIdx)
Returns a clone of the requested building block.
void setAPclassBasedApproach(boolean useAPC)
Set the fragment space to behave according to APClass-based approach.
ArrayList< IdFragmentAndAP > getFragsWithAPClass(APClass apc)
Returns the list of attachment points with the given class.
List< Vertex > getVerticesWithAPClassStartingWith(String root)
Extracts vertexes from the collection of vertexes defined by this FragmentSpace.
List< Vertex > getRCVsWithAPClass(APClass apc)
Searches for all building blocks that are ring-closing vertexes and hold an AP with the given class.
ArrayList< IdFragmentAndAP > getFragAPsCompatibleWithClass(APClass aPC1)
Returns the list of attachment points found in the fragment space and that are compatible with a give...
void addFusedRingsToFragmentLibrary(DGraph graph)
Extracts a system of one or more fused rings and adds them to the fragment space if not already prese...
ArrayList< Vertex > getVerticesWithAPClass(APClass apc)
Returns the list of vertexes with attachment points of the given class.
List< Vertex > getVerticesWithAPClasses(Set< APClass > apcs)
Returns the list of vertexes with at least one attachment point of each of the given classes.
ArrayList< Vertex > getScaffoldLibrary()
ArrayList< Vertex > getFragmentLibrary()
List< Vertex > getRCVsForAPClass(APClass apc)
Searches for all building blocks that are ring-closing vertexes and are compatible with the given AP.
List< Vertex > getVerticesWithAPFingerprint(Map< APClass, Integer > apcCounts)
Returns the list of vertexes that have the specified number of AttachmentPoints with the given APClas...
Parameters defining the fragment space.
Unit test for fragment space.
void testFusedRingAddedToScaffoldLibrary()
Checks that a graph with a fused ring containing a scaffold vertex is added to the scaffold library.
void testUseWholeMolGeometryForExtractedTemplates()
Works with this graph:
void testFusedRingAddedToFragmentLibrary()
Check that the following graph's fused ring gets added to the fragment library.
FragmentSpaceParameters buildFragmentSpace()
Template getExpectedTemplate(DGraph g, Vertex c3)
Data structure containing information that identifies a single AP of a vertex/fragment.
boolean isCPMapCompatibleWith(APClass other, FragmentSpace fragSpace)
Check compatibility as defined in the compatibility matrix considering this AP as source and the othe...
Definition: APClass.java:483
static final APClass RCACLASSPLUS
Conventional class of attachment points on ring-closing vertexes.
Definition: APClass.java:85
static final APClass RCACLASSMINUS
Conventional class of attachment points on ring-closing vertexes.
Definition: APClass.java:92
static APClass make(String ruleAndSubclass)
Creates an APClass if it does not exist already, or returns the reference to the existing instance.
Definition: APClass.java:164
An attachment point (AP) is a possibility to attach a Vertex onto the vertex holding the AP (i....
APClass getAPClass()
Returns the Attachment Point class.
Container for the list of vertices and the edges that connect them.
Definition: DGraph.java:102
void addVertex(Vertex vertex)
Appends a vertex to this graph without creating any edge.
Definition: DGraph.java:1325
void removeVertex(Vertex vertex)
Remove a vertex from this graph.
Definition: DGraph.java:1347
Vertex getVertexAtPosition(int pos)
Returns the vertex that is in the given position of the list of vertices belonging to this graph.
Definition: DGraph.java:2743
void appendVertexOnAP(AttachmentPoint srcAP, AttachmentPoint trgAP)
Append a vertex to this graph: adds the new vertex to the list of vertices belonging to the graph,...
Definition: DGraph.java:6005
List< Vertex > getVertexList()
Definition: DGraph.java:947
DGraph clone()
Returns almost "deep-copy" of this graph.
Definition: DGraph.java:3415
void renumberGraphVertices()
Reassign vertex IDs to all vertices of this graph.
Definition: DGraph.java:5512
void addRing(Ring ring)
Definition: DGraph.java:1258
void addEdge(Edge edge)
Adds the edge to the list of edges belonging to this graph.
Definition: DGraph.java:1249
This class represents the edge between two vertices.
Definition: Edge.java:38
Class representing a continuously connected portion of chemical object holding attachment points.
Definition: Fragment.java:61
boolean sameAs(Fragment other, StringBuilder reason)
Compares this and another fragment ignoring vertex IDs.
Definition: Fragment.java:967
void addAP(int atomPositionNumber)
Adds an attachment point with a dummy APClass.
Definition: Fragment.java:343
AttachmentPoint addAPOnAtom(IAtom srcAtm, APClass apc, Point3d vector)
Add an attachment point to the specifies atom.
Definition: Fragment.java:424
void addBond(IBond bond)
Definition: Fragment.java:871
void addAtom(IAtom atom)
Definition: Fragment.java:836
void projectAPsToProperties()
Finds the DENOPTIMAttachmentPoint objects defined as properties of the atoms in this container,...
Definition: Fragment.java:693
This class represents the closure of a ring in a spanning tree.
Definition: Ring.java:40
A collection of AttachmentPoints that are related by a relation that we call "symmetry",...
void setInnerGraph(DGraph innerGraph)
Definition: Template.java:298
boolean sameAs(Template other, StringBuilder reason)
Compares this and another template ignoring vertex IDs.
Definition: Template.java:970
A vertex is a data structure that has an identity and holds a list of AttachmentPoints.
Definition: Vertex.java:62
void setAsRCV(boolean isRCV)
Definition: Vertex.java:275
abstract List< AttachmentPoint > getAttachmentPoints()
void setBuildingBlockId(int buildingBlockId)
Definition: Vertex.java:312
abstract List< SymmetricAPs > getSymmetricAPSets()
void setBuildingBlockType(Vertex.BBType buildingBlockType)
Definition: Vertex.java:326
abstract IAtomContainer getIAtomContainer()
AttachmentPoint getAP(int i)
Get attachment point i on this vertex.
Definition: Vertex.java:1008
static Vertex newVertexFromLibrary(int bbId, Vertex.BBType bbt, FragmentSpace fragSpace)
Builds a new molecular fragment kind of vertex.
Definition: Vertex.java:215
The RingClosingAttractor represent the available valence/connection that allows to close a ring.
static final HashMap< APClass, String > RCALABELPERAPCLASS
Conventional labels for attractor pseudoatom.
Utility methods for input/output.
static void writeCompatibilityMatrix(String fileName, HashMap< APClass, ArrayList< APClass > > cpMap, HashMap< APClass, APClass > capMap, HashSet< APClass > ends)
The class compatibility matrix.
static void writeVertexesToSDF(File file, List< Vertex > vertexes, boolean append)
Write a list of vertexes to file.
Tool to build build three-dimensional (3D) tree-like molecular structures from DGraph.
IAtomContainer convertGraphTo3DAtomContainer(DGraph graph)
Created a three-dimensional molecular representation from a given DGraph.
Logger getLogger()
Get the name of the program specific logger.
Randomizer getRandomizer()
Returns the current program-specific randomizer.
Utilities for graphs.
Definition: GraphUtils.java:40
static synchronized long getUniqueVertexIndex()
Unique counter for the number of graph vertices generated.
Definition: GraphUtils.java:97
Utilities for molecule conversion.
static String getSymbolOrLabel(IAtom atm)
Gets either the elemental symbol (for standard atoms) of the label (for pseudo-atoms).
Possible chemical bond types an edge can represent.
Definition: Edge.java:303
The type of building block.
Definition: Vertex.java:87