mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-04 21:54:27 +08:00
1237 lines
37 KiB
Java
1237 lines
37 KiB
Java
/*
|
|
* $Id: SmilesDetailsTests.java 134 2011-01-21 02:24:56Z bill.smith $
|
|
*
|
|
* Copyright (c) 2010, Novartis Institutes for BioMedical Research Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of Novartis Institutes for BioMedical Research Inc.
|
|
* nor the names of its contributors may be used to endorse or promote
|
|
* products derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
package org.RDKit;
|
|
import static org.junit.Assert.*;
|
|
|
|
import org.junit.Test;
|
|
|
|
public class SmilesDetailsTests extends GraphMolTest {
|
|
|
|
@Test
|
|
public void testDetails() {
|
|
ROMol mol;
|
|
Atom a;
|
|
String smi;
|
|
|
|
// implicit/explicit H handling
|
|
smi = "OC([OH])C[O-]";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(5, mol.getNumAtoms());
|
|
a = mol.getAtomWithIdx(0);
|
|
assertEquals(1, a.getImplicitValence());
|
|
assertEquals(1, a.getExplicitValence());
|
|
assertFalse(a.getNoImplicit());
|
|
assertEquals(0, a.getFormalCharge());
|
|
a = mol.getAtomWithIdx(2);
|
|
assertEquals(0, a.getImplicitValence());
|
|
assertEquals(2, a.getExplicitValence());
|
|
assertTrue(a.getNoImplicit());
|
|
assertEquals(0, a.getFormalCharge());
|
|
a = mol.getAtomWithIdx(4);
|
|
assertEquals(0, a.getImplicitValence());
|
|
assertEquals(1, a.getExplicitValence());
|
|
assertTrue(a.getNoImplicit());
|
|
assertEquals(-1, a.getFormalCharge());
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testProblems() {
|
|
ROMol mol;
|
|
String smi;
|
|
|
|
// ring closure handling with branches/fragments
|
|
Int_Vect_Vect rings = new Int_Vect_Vect();
|
|
smi = "C1(CC1CC1CC1)";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
int ringCount = RDKFuncs.findSSSR(mol, rings);
|
|
assertEquals(2, ringCount);
|
|
assertEquals(2, rings.size());
|
|
assertEquals(3, rings.get(0).size());
|
|
assertEquals(3, rings.get(1).size());
|
|
|
|
// this is truly pathological, but both daylight
|
|
// and chemdraw parse it properly
|
|
smi = "C1.C1CC1CC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
rings = new Int_Vect_Vect();
|
|
ringCount = RDKFuncs.findSSSR(mol, rings);
|
|
assertEquals(1, ringCount);
|
|
assertEquals(1, rings.size());
|
|
assertEquals(3, rings.get(0).size());
|
|
|
|
// here's another stupid case that we need to handle:
|
|
|
|
smi = "C1CC11CC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
ringCount = RDKFuncs.findSSSR(mol, rings);
|
|
assertEquals(2, ringCount);
|
|
assertEquals(2, rings.size());
|
|
assertEquals(3, rings.get(0).size());
|
|
assertEquals(3, rings.get(1).size());
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testBasicCanon() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
|
|
smi = "C1OCCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles();
|
|
|
|
smi = "C1COCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "O1CCCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "OC=CC";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles();
|
|
|
|
smi = "CC=CO";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "C(C)=CO";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "C(O)=CC";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
// --- These are related to Issue 109
|
|
|
|
smi = "C([H])Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(2, mol.getNumAtoms());
|
|
refSmi = mol.MolToSmiles();
|
|
|
|
smi = "CCl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
// -- Issue 131
|
|
smi = "P#[Ga]";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(2, mol.getNumAtoms());
|
|
refSmi = mol.MolToSmiles();
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "O=[Ba]";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(2, mol.getNumAtoms());
|
|
refSmi = mol.MolToSmiles();
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals(smi, refSmi);
|
|
|
|
// make sure empty molecules return empty SMILES:
|
|
|
|
mol = new ROMol();
|
|
smi = mol.MolToSmiles();
|
|
assertEquals("", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testStereochem() {
|
|
ROMol mol;
|
|
String smi, refSmi, cip;
|
|
|
|
smi = "F[C@](Cl)(Br)I";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
smi = "F[C@](Br)(I)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "F[C@](I)(Cl)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Cl[C@](Br)(F)I";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Cl[C@](F)(I)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "I[C@](F)(Br)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "I[C@](Br)(Cl)F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "F[C@@](Br)(Cl)I";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "F[C@@](Cl)(I)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Cl[C@@](Br)(I)F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Cl[C@@](F)(Br)I";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "[C@@](Cl)(F)(Br)I";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(0).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "F[C@H](Cl)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
smi = "Br[C@H](F)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
smi = mol.MolToSmiles(true);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@]([H])(F)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@](F)(Cl)[H]";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@]1(F)(Cl).[H]1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@H]1Cl.F1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@]12Cl.F2.[H]1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "Br[C@]21Cl.F1.[H]2";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "[C@@H](Br)(F)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(0).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
smi = "[H][C@@](Br)(F)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(0).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("R", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(refSmi, smi);
|
|
|
|
// an additional set of test cases from the Chirality notes document.
|
|
// one can never have too many tests of this stuff.
|
|
|
|
smi = "F[C@]([H])(O)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "F[C@]1([H])OC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "F[C@H](O)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "F[C@@H]1OC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "[C@](F)([H])(O)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "[C@@]1(F)([H])OC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "[C@@H](F)(O)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals("C[C@@H](O)F", smi);
|
|
smi = mol.MolToSmiles(true, false, 0);
|
|
assertEquals("[C@H](C)(O)F", smi);
|
|
|
|
smi = "[C@@H]1(F)OC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(0).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals("F[C@H]1CO1", smi);
|
|
smi = mol.MolToSmiles(true, false, 0);
|
|
assertEquals("[C@H]1(F)CO1", smi);
|
|
|
|
smi = "C1O[C@H]1F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(2).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(2).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
smi = "C1O[C@@]1([H])F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(2).hasProp("_CIPCode"));
|
|
cip = mol.getAtomWithIdx(2).getProp("_CIPCode");
|
|
assertEquals("S", cip);
|
|
|
|
// -----------------------------------
|
|
// test some double-bond containing molecules:
|
|
|
|
// -- cis --
|
|
|
|
smi = "F\\C=C/Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Br\\C=C/F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Br/C=C\\F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F/C=C\\Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
// -- trans --
|
|
|
|
smi = "F\\C=C\\Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Br\\C=C\\F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Br/C=C/F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F/C=C/Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
// -- more complex --
|
|
|
|
smi = "F\\C=C(/Cl)\\Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F/C=C(\\Cl)/Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F/C=C(\\Cl)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F/C=C(Cl)/Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
// -- combine chirality with cis/trans --
|
|
|
|
smi = "F[C@H](Cl)\\C=C(/F)";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F[C@H](Cl)/C=C(\\F)";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Cl[C@@H](F)/C=C(\\F)";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Cl[C@@H](F)\\C=C(/F)";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue127() {
|
|
ROMol mol, mol2;
|
|
String smi, refSmi, tempStr;
|
|
|
|
smi = "Cl[C@]12[Si]C(C2)O1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
|
|
// first roundtrip the non-chiral SMILES:
|
|
refSmi = mol.MolToSmiles();
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
tempStr = mol2.MolToSmiles();
|
|
assertEquals(tempStr, refSmi);
|
|
|
|
// now do the true SMILES:
|
|
refSmi = mol.MolToSmiles(true);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
tempStr = mol2.MolToSmiles(true);
|
|
assertEquals(tempStr, refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue143() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
|
|
smi = "C[C@](C)(C)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("CC(C)(C)C", refSmi);
|
|
|
|
smi = "CC[C@](C)(C)C=O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("CCC(C)(C)C=O", refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue151() {
|
|
ROMol mol, mol2;
|
|
String smi, refSmi;
|
|
|
|
smi = "C1S[C@H]1O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(2).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(2).getChiralTag());
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("O[C@H]1CS1", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "F[C@@H]1O[C@H](Cl)S1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(2).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(4).getChiralTag());
|
|
|
|
assertTrue(mol.getAtomWithIdx(1).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(3).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(3).getChiralTag());
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("F[C@@H]1O[C@H](Cl)S1", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Cl[C@@H]1S[C@@H](O1)F";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(2).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(4).getChiralTag());
|
|
|
|
assertTrue(mol.getAtomWithIdx(1).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(3).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(3).getChiralTag());
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("F[C@@H]1O[C@H](Cl)S1", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Cl[C@@H]1O[C@H](F)S1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(2).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(4).getChiralTag());
|
|
|
|
assertTrue(mol.getAtomWithIdx(1).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(3).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(3).getChiralTag());
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("F[C@H]1O[C@@H](Cl)S1", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue153() {
|
|
String code;
|
|
ROMol mol, mol2;
|
|
String smi, refSmi;
|
|
|
|
smi = "C1(O[C@H]12)S2";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(2).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(2).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(2).hasProp("_CIPCode"));
|
|
code = mol.getAtomWithIdx(2).getProp("_CIPCode");
|
|
assertEquals("S", code);
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("O1C2S[C@H]12", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "C1(O[C@H]21)S2";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertTrue(mol.getAtomWithIdx(2).getChiralTag() != Atom.ChiralType.CHI_UNSPECIFIED);
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(2).getChiralTag());
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(2).hasProp("_CIPCode"));
|
|
code = mol.getAtomWithIdx(2).getProp("_CIPCode");
|
|
assertEquals("R", code);
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
assertEquals("O1C2S[C@@H]12", refSmi);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue157() {
|
|
String code;
|
|
ROMol mol, mol2;
|
|
String smi, refSmi;
|
|
smi = "O[C@](C)(Cl)[C@@](O)(Cl)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Atom.ChiralType.CHI_UNSPECIFIED, mol.getAtomWithIdx(0).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CCW, mol.getAtomWithIdx(1).getChiralTag());
|
|
assertEquals(Atom.ChiralType.CHI_TETRAHEDRAL_CW, mol.getAtomWithIdx(4).getChiralTag());
|
|
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
code = mol.getAtomWithIdx(1).getProp("_CIPCode");
|
|
assertEquals("R", code);
|
|
assertTrue(mol.getAtomWithIdx(1).hasProp("_CIPCode"));
|
|
code = mol.getAtomWithIdx(4).getProp("_CIPCode");
|
|
assertEquals("S", code);
|
|
|
|
refSmi = mol.MolToSmiles(true);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "Cl[C@@](C)1CC[C@@](C)(C1)Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
refSmi = mol.MolToSmiles(true);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "[H][C@@]12CC(CO1)CN2";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
smi = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("S", smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
|
|
assertEquals(smi, refSmi);
|
|
|
|
smi = "[H][C@@]12C[14C@@](C=C1)(C3C2C(NC3=O)=O)[H]";
|
|
// smi="C1=C[C@@H]2C[C@H]1C1C(=O)NC(=O)C21";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
smi = mol.getAtomWithIdx(0).getProp("_CIPCode");
|
|
assertEquals("R", smi);
|
|
smi = mol.getAtomWithIdx(2).getProp("_CIPCode");
|
|
assertEquals("S", smi);
|
|
refSmi = mol.MolToSmiles(true);
|
|
mol2 = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol2);
|
|
smi = mol2.MolToSmiles(true);
|
|
|
|
assertEquals(smi, refSmi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue159() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
|
|
smi = "C/C=C/O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
|
|
assertEquals(Bond.BondStereo.STEREONONE, mol.getBondWithIdx(0).getStereo());
|
|
assertEquals(Bond.BondStereo.STEREOE, mol.getBondWithIdx(1).getStereo());
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
smi = "C(\\C)=C/O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
|
|
assertEquals(Bond.BondStereo.STEREONONE, mol.getBondWithIdx(0).getStereo());
|
|
assertEquals(Bond.BondStereo.STEREOE, mol.getBondWithIdx(1).getStereo());
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
}
|
|
|
|
@Test
|
|
public void testIssue175() {
|
|
ROMol mol;
|
|
String smi;
|
|
|
|
smi = "Cl\\C=C1.F/1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondStereo.STEREOE, mol.getBondWithIdx(1).getStereo());
|
|
|
|
smi = "Cl\\C=C1CN/1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondStereo.STEREOE, mol.getBondWithIdx(1).getStereo());
|
|
}
|
|
|
|
@Test
|
|
public void testIssue176() {
|
|
ROMol mol;
|
|
String smi;
|
|
smi = "C1CC1C1CC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(7, mol.getNumBonds());
|
|
|
|
smi = "C1CC1C1CC-1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(7, mol.getNumBonds());
|
|
|
|
smi = "C1CC1C1CC=1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(7, mol.getNumBonds());
|
|
|
|
smi = "C1CC1C=1CC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(7, mol.getNumBonds());
|
|
}
|
|
|
|
// Keep this -- first test of BondIterator
|
|
@Test
|
|
public void testIssue184() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
|
|
smi = "C1NC(Cl)C(=N\\O)/C1=N\\O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondType.DOUBLE, mol.getBondWithIdx(4).getBondType());
|
|
assertEquals(Bond.BondStereo.STEREOZ, mol.getBondWithIdx(4).getStereo());
|
|
assertEquals(Bond.BondType.DOUBLE, mol.getBondWithIdx(7).getBondType());
|
|
assertEquals(Bond.BondStereo.STEREOZ, mol.getBondWithIdx(7).getStereo());
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
|
|
for (BondIterator bondIt = mol.beginBonds(); bondIt.ne(mol.endBonds()); bondIt.next()) {
|
|
Bond b = bondIt.getBond();
|
|
if (b.getBondType() == Bond.BondType.DOUBLE) {
|
|
assertEquals(Bond.BondStereo.STEREOZ, b.getStereo());
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue185() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
|
|
// start with a simple E/Z handling case with branches:
|
|
smi = "C(/C)=N/O";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondType.DOUBLE, mol.getBondWithIdx(1).getBondType());
|
|
assertEquals(Bond.BondStereo.STEREOZ, mol.getBondWithIdx(1).getStereo());
|
|
refSmi = mol.MolToSmiles(true, false, 0); // (1,0,0);
|
|
|
|
assertEquals("C(\\C)=N\\O", refSmi);
|
|
|
|
// make sure we can round-trip:
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondType.DOUBLE, mol.getBondWithIdx(1).getBondType());
|
|
assertEquals(Bond.BondStereo.STEREOZ, mol.getBondWithIdx(1).getStereo());
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue191() {
|
|
ROMol mol;
|
|
String smi, refSmi;
|
|
int numE = 0;
|
|
|
|
smi = "C2=NNC(N=C2)=N\\N=C\\c1ccccc1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(Bond.BondType.DOUBLE, mol.getBondWithIdx(7).getBondType());
|
|
assertEquals(Bond.BondStereo.STEREOE, mol.getBondWithIdx(7).getStereo());
|
|
refSmi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(refSmi);
|
|
assertNotNull(mol);
|
|
numE = 0;
|
|
for (BondIterator bondIt = mol.beginBonds(); bondIt.ne(mol.endBonds()); bondIt.next()) {
|
|
Bond b = bondIt.getBond();
|
|
if (b.getBondType() == Bond.BondType.DOUBLE) {
|
|
assertTrue(b.getStereo() != Bond.BondStereo.STEREOZ);
|
|
if (b.getStereo() == Bond.BondStereo.STEREOE) {
|
|
numE++;
|
|
}
|
|
}
|
|
}
|
|
assertEquals(1, numE);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals(smi, refSmi);
|
|
}
|
|
|
|
@Test
|
|
public void testIssue256() {
|
|
ROMol mol;
|
|
Bond bond;
|
|
String smi;
|
|
|
|
smi = "C1CC[C+]1=1CCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
bond = mol.getBondBetweenAtoms(3, 0);
|
|
assertNotNull(bond);
|
|
assertEquals(Bond.BondType.SINGLE, bond.getBondType());
|
|
bond = mol.getBondBetweenAtoms(3, 6);
|
|
assertNotNull(bond);
|
|
assertEquals(Bond.BondType.DOUBLE, bond.getBondType());
|
|
|
|
smi = "C1CC[C+]=11CCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
bond = mol.getBondBetweenAtoms(3, 0);
|
|
assertNotNull(bond);
|
|
assertEquals(Bond.BondType.DOUBLE, bond.getBondType());
|
|
bond = mol.getBondBetweenAtoms(3, 6);
|
|
assertNotNull(bond);
|
|
assertEquals(Bond.BondType.SINGLE, bond.getBondType());
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIssue266() {
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "c1ccccc1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals("c1ccccc1", smi);
|
|
|
|
RDKFuncs.Kekulize(mol);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals("C1=CC=CC=C1", smi);
|
|
|
|
smi = "c1ccccc1c1ccccc1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals("c1ccc(-c2ccccc2)cc1", smi);
|
|
|
|
RDKFuncs.Kekulize(mol);
|
|
smi = mol.MolToSmiles();
|
|
assertEquals("C1=CC=C(C2=CC=CC=C2)C=C1", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testRootedAt() {
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "CN(C)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("CN(C)C", smi);
|
|
smi = mol.MolToSmiles(false, false, 1);
|
|
assertEquals("N(C)(C)C", smi);
|
|
smi = mol.MolToSmiles(false, false, 2);
|
|
assertEquals("CN(C)C", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testIsotopes() {
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "C[13C](C)(C)C";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
assertEquals(0.001, mol.getAtomWithIdx(1).getMass(), 13.0034);
|
|
assertEquals(mol.getAtomWithIdx(1).getIsotope(), 13);
|
|
smi = mol.MolToSmiles(false);
|
|
assertEquals("CC(C)(C)C", smi);
|
|
smi = mol.MolToSmiles(true);
|
|
assertEquals("C[13C](C)(C)C", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testBug1670149() {
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "C1[NH2+]CCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("C1CC[NH2+]C1", smi);
|
|
|
|
mol.getAtomWithIdx(1).setNumExplicitHs(0);
|
|
mol.getAtomWithIdx(1).setNoImplicit(false);
|
|
mol.getAtomWithIdx(1).updatePropertyCache();
|
|
assertEquals(2, mol.getAtomWithIdx(1).getNumImplicitHs());
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("C1CC[NH2+]C1", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testBug1719046() {
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "Cl[CH]1CCCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("ClC1CCCCC1", smi);
|
|
|
|
smi = "Cl[C@H]1CCCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("ClC1CCCCC1", smi);
|
|
|
|
smi = "Cl[C@H]1C(Br)CCCC1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("ClC1CCCCC1Br", smi);
|
|
|
|
smi = "[CH]1=[CH][CH]=[CH][CH]=[CH]1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("c1ccccc1", smi);
|
|
|
|
smi = "c1ccccn1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("c1ccncc1", smi);
|
|
|
|
smi = "C1=CNC=C1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("c1cc[nH]c1", smi);
|
|
|
|
smi = "[CH]1=[CH][NH][CH]=[CH]1";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(false, false, -1);
|
|
assertEquals("c1cc[nH]c1", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testBug1842174() {
|
|
|
|
RWMol mol;
|
|
String smi;
|
|
|
|
smi = "F/C=N/Cl";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(true, false, -1);
|
|
|
|
assertEquals("F/C=N/Cl", smi);
|
|
|
|
smi = mol.MolToSmiles(true, false, 1);
|
|
|
|
assertEquals("C(\\F)=N/Cl", smi);
|
|
|
|
smi = "C(\\C=C\\F)=C(/Cl)Br";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi = mol.MolToSmiles(true, false, -1);
|
|
|
|
assertEquals("F/C=C/C=C(/Cl)Br", smi);
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testBug1844617() {
|
|
|
|
RWMol mol;
|
|
String smi, smi2;
|
|
String label;
|
|
|
|
smi = "O=C1C2OCC[C@@]22C(CC1)CNCC2";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(6).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(6).getProp("_CIPCode");
|
|
assertEquals("S", label);
|
|
|
|
smi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi2 = mol.MolToSmiles(true);
|
|
|
|
assertEquals(smi2, smi);
|
|
|
|
smi = "O=C1CC[C@@]2(O)[C@@H]3N(C)CC[C@]22[C@H]1OC[C@H]2CC3";
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
RDKFuncs.assignStereochemistry(mol);
|
|
assertTrue(mol.getAtomWithIdx(4).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(4).getProp("_CIPCode");
|
|
assertEquals("S", label);
|
|
assertTrue(mol.getAtomWithIdx(6).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(6).getProp("_CIPCode");
|
|
assertEquals("R", label);
|
|
assertTrue(mol.getAtomWithIdx(11).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(11).getProp("_CIPCode");
|
|
assertEquals("S", label);
|
|
assertTrue(mol.getAtomWithIdx(12).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(12).getProp("_CIPCode");
|
|
assertEquals("R", label);
|
|
assertTrue(mol.getAtomWithIdx(15).hasProp("_CIPCode"));
|
|
label = mol.getAtomWithIdx(15).getProp("_CIPCode");
|
|
assertEquals("S", label);
|
|
|
|
smi = mol.MolToSmiles(true);
|
|
|
|
mol = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(mol);
|
|
smi2 = mol.MolToSmiles(true);
|
|
|
|
assertEquals(smi2, smi);
|
|
}
|
|
|
|
@Test
|
|
public void testRingStereochem() {
|
|
|
|
RWMol m;
|
|
String smi;
|
|
|
|
smi = "C[C@H]1CC[C@@H](C)CC1";
|
|
m = RWMol.MolFromSmiles(smi);
|
|
assertNotNull(m);
|
|
assertEquals(8, m.getNumAtoms());
|
|
|
|
smi = m.MolToSmiles(true);
|
|
//assertTrue(m.hasProp("_ringStereoWarning"));
|
|
|
|
smi = m.MolToSmiles(false);
|
|
//assertTrue((!m.hasProp("_ringStereoWarning")));
|
|
|
|
}
|
|
|
|
public static void main(String args[]) {
|
|
org.junit.runner.JUnitCore.main("org.RDKit.SmilesDetailsTests");
|
|
}
|
|
|
|
}
|