Vdv radii from blue obelisk (#2154)

* updated atomic radii to follow the Blue Obelisk Data Repository

Ubuntu package bodr version 10-1; radii are from file
/usr/share/bodr/elements.xml

* typo

* use 2.0 as default VDW radius instead of 1.7

for elements missing from the Blue Obelisk Data Repository

* Document the atomic_data

* update expected test results

* update java tests

* allow a bit more slop when comparing confs

For cross-platform stability
This commit is contained in:
Francois Berenger
2019-05-29 16:23:27 +09:00
committed by Greg Landrum
parent 874641cd43
commit 7ec8ec0bb9
16 changed files with 976 additions and 907 deletions

View File

@@ -1,6 +1,7 @@
import unittest
import os, copy
import os
import copy
import math
import numpy
@@ -16,517 +17,523 @@ logger = logger()
def feq(v1, v2, tol=1.e-4):
return abs(v1 - v2) < tol
return abs(v1 - v2) < tol
def lstEq(l1, l2, tol=1.0e-4):
ln = len(l1)
if (ln != len(l2)):
return 0
ln = len(l1)
if (ln != len(l2)):
return 0
for i in range(ln):
if abs(l1[i] - l2[i]) > tol:
return 0
return 1
for i in range(ln):
if abs(l1[i] - l2[i]) > tol:
return 0
return 1
def compareWithOld(smilesFile, sdFile):
smiSup = Chem.SmilesMolSupplier(smilesFile, ",", 0, -1)
sdsup = Chem.SDMolSupplier(sdFile)
im = 0
for mol in smiSup:
cid = rdDistGeom.EmbedMolecule(mol, 10, 1)
omol = sdsup[im]
assert cid == 0
conf = mol.GetConformer(0)
oconf = omol.GetConformer()
nat = mol.GetNumAtoms()
for i in range(nat):
#atm = mol.GetAtomWithIdx(i)
#oatm = omol.GetAtomWithIdx(i)
pos = conf.GetAtomPosition(i)
opos = oconf.GetAtomPosition(i)
if not lstEq(pos, opos):
return 0
im += 1
return 1
smiSup = Chem.SmilesMolSupplier(smilesFile, ",", 0, -1)
sdsup = Chem.SDMolSupplier(sdFile)
im = 0
for mol in smiSup:
cid = rdDistGeom.EmbedMolecule(mol, 10, 1)
omol = sdsup[im]
assert cid == 0
conf = mol.GetConformer(0)
oconf = omol.GetConformer()
nat = mol.GetNumAtoms()
for i in range(nat):
#atm = mol.GetAtomWithIdx(i)
#oatm = omol.GetAtomWithIdx(i)
pos = conf.GetAtomPosition(i)
opos = oconf.GetAtomPosition(i)
if not lstEq(pos, opos):
return 0
im += 1
return 1
def compareMatrices(bm1, bm2, map, tol=1.0e-5):
N = numpy.shape(bm1)[0]
for i in range(1, N):
for j in range(i):
l, m = map[i], map[j]
if (l < m):
l, m = m, l
if (abs(bm1[l, m] - bm2[i, j]) > tol):
return 0
N = numpy.shape(bm1)[0]
for i in range(1, N):
for j in range(i):
l, m = map[i], map[j]
if (l < m):
l, m = m, l
if (abs(bm1[l, m] - bm2[i, j]) > tol):
return 0
if (abs(bm1[m, l] - bm2[j, i]) > tol):
return 0
if (abs(bm1[m, l] - bm2[j, i]) > tol):
return 0
return 1
return 1
def compareOrder(smi1, smi2, tol=1.0e-5):
m1 = Chem.MolFromSmiles(smi1)
m2 = Chem.MolFromSmiles(smi2)
bm1 = rdDistGeom.GetMoleculeBoundsMatrix(m1)
bm2 = rdDistGeom.GetMoleculeBoundsMatrix(m2)
map = m1.GetSubstructMatch(m2)
return compareMatrices(bm1, bm2, map, tol)
m1 = Chem.MolFromSmiles(smi1)
m2 = Chem.MolFromSmiles(smi2)
bm1 = rdDistGeom.GetMoleculeBoundsMatrix(m1)
bm2 = rdDistGeom.GetMoleculeBoundsMatrix(m2)
map = m1.GetSubstructMatch(m2)
return compareMatrices(bm1, bm2, map, tol)
def computeDist(lst1, lst2):
res = 0.0
for i, val in enumerate(lst1):
res += (val - lst2[i]) * (val - lst2[i])
res = math.sqrt(res)
return res
res = 0.0
for i, val in enumerate(lst1):
res += (val - lst2[i]) * (val - lst2[i])
res = math.sqrt(res)
return res
def computeChiralVol(pt1, pt2, pt3, pt4):
v1 = pt1 - pt4
v2 = pt2 - pt4
v3 = pt3 - pt4
cp = v2.CrossProduct(v3)
vol = v1.DotProduct(cp)
return vol
v1 = pt1 - pt4
v2 = pt2 - pt4
v3 = pt3 - pt4
cp = v2.CrossProduct(v3)
vol = v1.DotProduct(cp)
return vol
class TestCase(unittest.TestCase):
def setUp(self):
pass
def setUp(self):
pass
def _test0Cdk2(self):
fileN = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'cis_trans_cases.csv')
def _test0Cdk2(self):
fileN = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'cis_trans_cases.csv')
ofile = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'embedDistOpti.sdf')
self.assertTrue(compareWithOld(fileN, ofile))
ofile = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'embedDistOpti.sdf')
self.assertTrue(compareWithOld(fileN, ofile))
def test1Small(self):
#writer = Chem.SDWriter("test.sdf")
# single double and tripple atoms cases should not fail
mol = Chem.MolFromSmiles('O')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [0.0, 0.0, 0.0]))
#writer.write(mol)
def test1Small(self):
#writer = Chem.SDWriter("test.sdf")
# single double and tripple atoms cases should not fail
mol = Chem.MolFromSmiles('O')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [0.0, 0.0, 0.0]))
# writer.write(mol)
mol = Chem.MolFromSmiles('CO')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [0.69192, 0.0, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.69192, 0.0, 0.0]))
#writer.write(mol)
mol = Chem.MolFromSmiles('CO')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [0.69192, 0.0, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.69192, 0.0, 0.0]))
# writer.write(mol)
mol = Chem.MolFromSmiles('CCC')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [-1.21676, -0.2989, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.00604, 0.59337, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(2), [1.22281, -0.29446, 0.0]))
#writer.write(mol)
mol = Chem.MolFromSmiles('CCC')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
self.assertTrue(lstEq(conf.GetAtomPosition(0), [-1.21676, -0.2989, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.00604, 0.59337, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(2), [1.22281, -0.29446, 0.0]))
# writer.write(mol)
mol = Chem.MolFromSmiles('O=C=O')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
mol = Chem.MolFromSmiles('O=C=O')
rdDistGeom.EmbedMolecule(mol, 10, 1)
conf = mol.GetConformer()
#writer.write(mol)
self.assertTrue(lstEq(conf.GetAtomPosition(0), [-1.2180, -0.06088, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.00408, 0.12116, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(2), [1.22207, -0.060276, 0.0]))
# writer.write(mol)
self.assertTrue(lstEq(conf.GetAtomPosition(0), [-1.2180, -0.06088, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(1), [-0.00408, 0.12116, 0.0]))
self.assertTrue(lstEq(conf.GetAtomPosition(2), [1.22207, -0.060276, 0.0]))
mol = Chem.MolFromSmiles('C=C=C=C')
rdDistGeom.EmbedMolecule(mol, 10, 1, useExpTorsionAnglePrefs=False,
useBasicKnowledge=False)
conf = mol.GetConformer()
mol = Chem.MolFromSmiles('C=C=C=C')
rdDistGeom.EmbedMolecule(mol, 10, 1, useExpTorsionAnglePrefs=False,
useBasicKnowledge=False)
conf = mol.GetConformer()
#writer.write(mol)
# writer.write(mol)
d1 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(1))
self.assertTrue(feq(d1, 1.31, 0.01))
d2 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(2))
self.assertTrue(feq(d2, 2.59, 0.05))
d3 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(3))
self.assertTrue(feq(d3, 3.84, 0.1))
d4 = computeDist(conf.GetAtomPosition(1), conf.GetAtomPosition(2))
self.assertTrue(feq(d4, 1.29, 0.01))
d5 = computeDist(conf.GetAtomPosition(1), conf.GetAtomPosition(3))
self.assertTrue(feq(d5, 2.54, 0.1))
d6 = computeDist(conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(feq(d6, 1.31, 0.01))
d1 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(1))
self.assertTrue(feq(d1, 1.31, 0.01))
d2 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(2))
self.assertTrue(feq(d2, 2.59, 0.05))
d3 = computeDist(conf.GetAtomPosition(0), conf.GetAtomPosition(3))
self.assertTrue(feq(d3, 3.84, 0.1))
d4 = computeDist(conf.GetAtomPosition(1), conf.GetAtomPosition(2))
self.assertTrue(feq(d4, 1.29, 0.01))
d5 = computeDist(conf.GetAtomPosition(1), conf.GetAtomPosition(3))
self.assertTrue(feq(d5, 2.54, 0.1))
d6 = computeDist(conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(feq(d6, 1.31, 0.01))
def test2Utils(self):
mol = Chem.MolFromSmiles('CC')
bm = rdDistGeom.GetMoleculeBoundsMatrix(mol)
self.assertTrue(bm[1, 0] > 0)
self.assertTrue(bm[0, 1] > 0)
self.assertTrue(bm[0, 1] >= bm[1, 0])
self.assertTrue(bm[1, 0] < 1.510)
self.assertTrue(bm[0, 1] > 1.510)
def test2Utils(self):
mol = Chem.MolFromSmiles('CC')
bm = rdDistGeom.GetMoleculeBoundsMatrix(mol)
self.assertTrue(bm[1, 0] > 0)
self.assertTrue(bm[0, 1] > 0)
self.assertTrue(bm[0, 1] >= bm[1, 0])
self.assertTrue(bm[1, 0] < 1.510)
self.assertTrue(bm[0, 1] > 1.510)
def test3MultiConf(self):
mol = Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC")
cids = rdDistGeom.EmbedMultipleConfs(mol, 10, maxAttempts=30, randomSeed=100,
useExpTorsionAnglePrefs=False,
useBasicKnowledge=False)
energies = [112.98, 103.57, 110.78, 100.40, 95.37, 101.64, 114.72, 112.65, 124.53, 107.50]
nenergies = []
for cid in cids:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, cid)
ee = ff.CalcEnergy()
nenergies.append(ee)
#print(['%.2f'%x for x in nenergies])
#print(nenergies)
self.assertTrue(lstEq(energies, nenergies, tol=1e-2))
def test3MultiConf(self):
mol = Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC")
cids = rdDistGeom.EmbedMultipleConfs(mol, 10, maxAttempts=30, randomSeed=100,
useExpTorsionAnglePrefs=False,
useBasicKnowledge=False)
energies = [115.460, 105.891, 109.868, 104.415,
92.944, 140.917, 139.468, 95.081, 123.528, 107.885]
nenergies = []
for cid in cids:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, cid)
ee = ff.CalcEnergy()
nenergies.append(ee)
#print(['%.2f' % x for x in nenergies])
# print(nenergies)
self.assertTrue(lstEq(energies, nenergies, tol=1e-2))
def test4OrderDependence(self):
self.assertTrue(
compareOrder("CC(C)(C)C(=O)NC(C1)CC(N2C)CCC12", "CN1C2CCC1CC(NC(=O)C(C)(C)C)C2"))
#issue 230
self.assertTrue(compareOrder("C#CC(C)(C)N(CN1)C\\N=C/1SC", "CSC1=NCN(C(C)(C)C#C)CN1"))
#issue 232
self.assertTrue(
compareOrder("CC(C)(C)C(=O)NC(C1)CC(N2C)CCC12", "CN1C2CCC1CC(NC(=O)C(C)(C)C)C2"))
def test4OrderDependence(self):
self.assertTrue(
compareOrder("CC(C)(C)C(=O)NC(C1)CC(N2C)CCC12", "CN1C2CCC1CC(NC(=O)C(C)(C)C)C2"))
# issue 230
self.assertTrue(compareOrder("C#CC(C)(C)N(CN1)C\\N=C/1SC", "CSC1=NCN(C(C)(C)C#C)CN1"))
# issue 232
self.assertTrue(
compareOrder("CC(C)(C)C(=O)NC(C1)CC(N2C)CCC12", "CN1C2CCC1CC(NC(=O)C(C)(C)C)C2"))
def test5Issue285(self):
m = Chem.MolFromSmiles('CNC=O')
cs = rdDistGeom.EmbedMultipleConfs(m, 10)
for i, ci in enumerate(cs):
for j in range(i + 1, len(cs)):
cj = cs[j]
self.assertTrue(Chem.MolToMolBlock(m, confId=ci) != Chem.MolToMolBlock(m, confId=cj))
def test5Issue285(self):
m = Chem.MolFromSmiles('CNC=O')
cs = rdDistGeom.EmbedMultipleConfs(m, 10)
for i, ci in enumerate(cs):
for j in range(i + 1, len(cs)):
cj = cs[j]
self.assertTrue(Chem.MolToMolBlock(m, confId=ci)
!= Chem.MolToMolBlock(m, confId=cj))
def test6RmsPruning(self):
smiles = [
'CC(C)CC(NC(C1[N+]CCC1)=O)C([O-])=O', 'CC(NC(CO)C(O)c1ccc([N+]([O-])=O)cc1)=O',
'CC([N+])C(NC(C)C(N1C(C=O)CCC1)=O)=O', 'CC(NC1C(O)C=C(C([O-])=O)OC1C(O)C(O)CO)=O',
'CCCC=C(NC(C1CC1(C)C)=O)C([O-])=O', 'OCC(O)C(O)C(Cn1c2c(cc(C)c(C)c2)nc-2c(=O)[nH]c(=O)nc12)O'
]
def test6RmsPruning(self):
smiles = [
'CC(C)CC(NC(C1[N+]CCC1)=O)C([O-])=O', 'CC(NC(CO)C(O)c1ccc([N+]([O-])=O)cc1)=O',
'CC([N+])C(NC(C)C(N1C(C=O)CCC1)=O)=O', 'CC(NC1C(O)C=C(C([O-])=O)OC1C(O)C(O)CO)=O',
'CCCC=C(NC(C1CC1(C)C)=O)C([O-])=O', 'OCC(O)C(O)C(Cn1c2c(cc(C)c(C)c2)nc-2c(=O)[nH]c(=O)nc12)O'
]
nconfs = []
expected = [5, 6, 6, 6, 6, 3]
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
cids = rdDistGeom.EmbedMultipleConfs(mol, 50, maxAttempts=30, randomSeed=100,
pruneRmsThresh=1.5)
nconfs.append(len(cids))
nconfs = []
expected = [4, 5, 5, 4, 5, 4]
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
cids = rdDistGeom.EmbedMultipleConfs(mol, 50, maxAttempts=30, randomSeed=100,
pruneRmsThresh=1.5)
nconfs.append(len(cids))
d = [abs(x - y) for x, y in zip(expected, nconfs)]
d = [abs(x - y) for x, y in zip(expected, nconfs)]
# print(nconfs)
self.assertTrue(max(d) <= 1)
self.assertTrue(max(d) <= 1)
def test6Chirality(self):
# turn on chirality and we should get chiral volume that is pretty consistent and
# positive
tgtVol = 13.0
smiles = "Cl[C@](C)(F)Br"
mol = Chem.MolFromSmiles(smiles)
cids = rdDistGeom.EmbedMultipleConfs(mol, 30, maxAttempts=30, randomSeed=100)
self.assertTrue(len(cids) == 30)
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 1)
def test6Chirality(self):
# turn on chirality and we should get chiral volume that is pretty consistent and
# positive
tgtVol = 13.0
smiles = "Cl[C@](C)(F)Br"
mol = Chem.MolFromSmiles(smiles)
cids = rdDistGeom.EmbedMultipleConfs(mol, 30, maxAttempts=30, randomSeed=100)
self.assertTrue(len(cids) == 30)
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 1)
# turn of chirality and now we should see both chiral forms
smiles = "ClC(C)(F)Br"
mol = Chem.MolFromSmiles(smiles)
cids = rdDistGeom.EmbedMultipleConfs(mol, 30, maxAttempts=30, randomSeed=120)
self.assertTrue(len(cids) == 30)
nPos = 0
nNeg = 0
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 1 or abs(vol + tgtVol) < 1)
if vol < 0:
nNeg += 1
else:
nPos += 1
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
# turn of chirality and now we should see both chiral forms
smiles = "ClC(C)(F)Br"
mol = Chem.MolFromSmiles(smiles)
cids = rdDistGeom.EmbedMultipleConfs(mol, 30, maxAttempts=30, randomSeed=120)
self.assertTrue(len(cids) == 30)
nPos = 0
nNeg = 0
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 1 or abs(vol + tgtVol) < 1)
if vol < 0:
nNeg += 1
else:
nPos += 1
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
tgtVol = 5.0
for i in range(10):
smiles = "Cl[C@H](F)Br"
mol = Chem.MolFromSmiles(smiles)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
conf = mol.GetConformer(ci)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(1), conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(abs(vol - tgtVol) < 1, "%s %s" % (vol, tgtVol))
tgtVol = 5.0
for i in range(10):
smiles = "Cl[C@H](F)Br"
mol = Chem.MolFromSmiles(smiles)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
conf = mol.GetConformer(ci)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(1), conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(abs(vol - tgtVol) < 1, "%s %s" % (vol, tgtVol))
tgtVol = 3.5
expected = [-3.62, -3.67, -3.72, 3.91, 3.95, 3.98, 3.90, 3.94, 3.98, 3.91]
nPos = 0
nNeg = 0
for i in range(30):
smiles = "ClC(F)Br"
mol = Chem.MolFromSmiles(smiles)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
conf = mol.GetConformer(ci)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(1), conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(abs(vol - tgtVol) < 1 or abs(vol + tgtVol) < 1)
if vol < 0:
nNeg += 1
else:
nPos += 1
tgtVol = 3.5
expected = [-3.62, -3.67, -3.72, 3.91, 3.95, 3.98, 3.90, 3.94, 3.98, 3.91]
nPos = 0
nNeg = 0
for i in range(30):
smiles = "ClC(F)Br"
mol = Chem.MolFromSmiles(smiles)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
conf = mol.GetConformer(ci)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(1), conf.GetAtomPosition(2), conf.GetAtomPosition(3))
self.assertTrue(abs(vol - tgtVol) < 1 or abs(vol + tgtVol) < 1)
if vol < 0:
nNeg += 1
else:
nPos += 1
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
smiles = "Cl[C@H](F)Br"
m = Chem.MolFromSmiles(smiles)
mol = Chem.AddHs(m)
cids = rdDistGeom.EmbedMultipleConfs(mol, 10, maxAttempts=30, randomSeed=100)
self.assertTrue(len(cids) == 10)
tgtVol = 10.5
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 2.)
smiles = "Cl[C@H](F)Br"
m = Chem.MolFromSmiles(smiles)
mol = Chem.AddHs(m)
cids = rdDistGeom.EmbedMultipleConfs(mol, 10, maxAttempts=30, randomSeed=100)
self.assertTrue(len(cids) == 10)
tgtVol = 10.5
for cid in cids:
conf = mol.GetConformer(cid)
vol = computeChiralVol(
conf.GetAtomPosition(0),
conf.GetAtomPosition(2), conf.GetAtomPosition(3), conf.GetAtomPosition(4))
self.assertTrue(abs(vol - tgtVol) < 2.)
# let's try a little more complicated system
expectedV1 = -2.0
expectedV2 = -2.9
# let's try a little more complicated system
expectedV1 = -2.0
expectedV2 = -2.9
for i in range(5):
smi = "C1=CC=C(C=C1)[C@H](OC1=C[NH]N=C1)C(=O)[NH]C[C@H](Cl)C1=CC=NC=C1"
mol = Chem.MolFromSmiles(smi)
ci = rdDistGeom.EmbedMolecule(mol, randomSeed=(i + 1) * 15)
self.assertTrue(ci >= 0)
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, ci)
ff.Minimize()
for i in range(5):
smi = "C1=CC=C(C=C1)[C@H](OC1=C[NH]N=C1)C(=O)[NH]C[C@H](Cl)C1=CC=NC=C1"
mol = Chem.MolFromSmiles(smi)
ci = rdDistGeom.EmbedMolecule(mol, randomSeed=(i + 1) * 15)
self.assertTrue(ci >= 0)
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, ci)
ff.Minimize()
conf = mol.GetConformer(ci)
vol1 = computeChiralVol(
conf.GetAtomPosition(6),
conf.GetAtomPosition(3), conf.GetAtomPosition(7), conf.GetAtomPosition(13))
self.assertTrue(abs(vol1 - expectedV1) < 1 or abs(vol1 + expectedV1) < 1)
if vol1 < 0:
nNeg += 1
else:
nPos += 1
conf = mol.GetConformer(ci)
vol1 = computeChiralVol(
conf.GetAtomPosition(6),
conf.GetAtomPosition(3), conf.GetAtomPosition(7), conf.GetAtomPosition(13))
self.assertTrue(abs(vol1 - expectedV1) < 1 or abs(vol1 + expectedV1) < 1)
if vol1 < 0:
nNeg += 1
else:
nPos += 1
vol2 = computeChiralVol(
conf.GetAtomPosition(17),
conf.GetAtomPosition(16), conf.GetAtomPosition(18), conf.GetAtomPosition(19))
self.assertTrue(abs(vol2 - expectedV2) < 1 or abs(vol2 + expectedV2) < 1)
vol2 = computeChiralVol(
conf.GetAtomPosition(17),
conf.GetAtomPosition(16), conf.GetAtomPosition(18), conf.GetAtomPosition(19))
self.assertTrue(abs(vol2 - expectedV2) < 1 or abs(vol2 + expectedV2) < 1)
# remove the chiral specification and we should see other chiral
# forms of the compound
expectedV1 = 2.0 # [-2.30, -2.31, -2.30, 2.30, -1.77]
expectedV2 = 2.8 # [2.90, 2.89, 2.69, -2.90, -2.93]
# remove the chiral specification and we should see other chiral
# forms of the compound
expectedV1 = 2.0 #[-2.30, -2.31, -2.30, 2.30, -1.77]
expectedV2 = 2.8 #[2.90, 2.89, 2.69, -2.90, -2.93]
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
for i in range(5):
smi = "C1=CC=C(C=C1)C(OC1=C[NH]N=C1)C(=O)[NH]CC(Cl)C1=CC=NC=C1"
mol = Chem.MolFromSmiles(smi)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, ci)
ff.Minimize()
self.assertTrue(nPos > 0)
self.assertTrue(nNeg > 0)
for i in range(5):
smi = "C1=CC=C(C=C1)C(OC1=C[NH]N=C1)C(=O)[NH]CC(Cl)C1=CC=NC=C1"
mol = Chem.MolFromSmiles(smi)
ci = rdDistGeom.EmbedMolecule(mol, 30, (i + 1) * 10)
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, ci)
ff.Minimize()
conf = mol.GetConformer(ci)
vol1 = computeChiralVol(
conf.GetAtomPosition(6),
conf.GetAtomPosition(3), conf.GetAtomPosition(7), conf.GetAtomPosition(13))
vol2 = computeChiralVol(
conf.GetAtomPosition(17),
conf.GetAtomPosition(16), conf.GetAtomPosition(18), conf.GetAtomPosition(19))
self.assertTrue(abs(abs(vol1) - expectedV1) < 1.0)
self.assertTrue(abs(abs(vol2) - expectedV2) < 1.0)
conf = mol.GetConformer(ci)
vol1 = computeChiralVol(
conf.GetAtomPosition(6),
conf.GetAtomPosition(3), conf.GetAtomPosition(7), conf.GetAtomPosition(13))
vol2 = computeChiralVol(
conf.GetAtomPosition(17),
conf.GetAtomPosition(16), conf.GetAtomPosition(18), conf.GetAtomPosition(19))
self.assertTrue(abs(abs(vol1) - expectedV1) < 1.0)
self.assertTrue(abs(abs(vol2) - expectedV2) < 1.0)
def test7ConstrainedEmbedding(self):
ofile = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'constrain1.sdf')
suppl = Chem.SDMolSupplier(ofile)
ref = next(suppl)
probe = copy.deepcopy(ref)
def test7ConstrainedEmbedding(self):
ofile = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'constrain1.sdf')
suppl = Chem.SDMolSupplier(ofile)
ref = next(suppl)
probe = copy.deepcopy(ref)
cMap = {}
for i in range(5):
cMap[i] = ref.GetConformer().GetAtomPosition(i)
ci = rdDistGeom.EmbedMolecule(probe, coordMap=cMap, randomSeed=23)
self.assertTrue(ci > -1)
algMap = list(zip(range(5), range(5)))
ssd = rdMolAlign.AlignMol(probe, ref, atomMap=algMap)
self.assertTrue(ssd < 0.1)
cMap = {}
for i in range(5):
cMap[i] = ref.GetConformer().GetAtomPosition(i)
ci = rdDistGeom.EmbedMolecule(probe, coordMap=cMap, randomSeed=23)
self.assertTrue(ci > -1)
algMap = list(zip(range(5), range(5)))
ssd = rdMolAlign.AlignMol(probe, ref, atomMap=algMap)
self.assertTrue(ssd < 0.1)
def test8MultiThreadMultiConf(self):
if (rdBase.rdkitBuild.split('|')[2] != "MINGW"):
ENERGY_TOLERANCE = 1.0e-6
MSD_TOLERANCE = 1.0e-6
else:
ENERGY_TOLERANCE = 1.0
MSD_TOLERANCE = 1.0e-5
mol = Chem.AddHs(Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC"))
cids = rdDistGeom.EmbedMultipleConfs(mol, 200, maxAttempts=30, randomSeed=100)
energies = []
for cid in cids:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, cid)
ee = ff.CalcEnergy()
energies.append(ee)
def test8MultiThreadMultiConf(self):
if (rdBase.rdkitBuild.split('|')[2] != "MINGW"):
ENERGY_TOLERANCE = 1.0e-6
MSD_TOLERANCE = 1.0e-6
else:
ENERGY_TOLERANCE = 1.0
MSD_TOLERANCE = 1.0e-5
mol = Chem.AddHs(Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC"))
cids = rdDistGeom.EmbedMultipleConfs(mol, 200, maxAttempts=30, randomSeed=100)
energies = []
for cid in cids:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol, 10.0, cid)
ee = ff.CalcEnergy()
energies.append(ee)
mol2 = Chem.AddHs(Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC"))
cids2 = rdDistGeom.EmbedMultipleConfs(
mol2, 200, maxAttempts=30, randomSeed=100, numThreads=4)
self.assertTrue(lstEq(cids, cids2))
nenergies = []
for cid in cids2:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol2, 10.0, cid)
ee = ff.CalcEnergy()
nenergies.append(ee)
mol2 = Chem.AddHs(Chem.MolFromSmiles("CC(C)(C)c(cc12)n[n]2C(=O)/C=C(N1)/COC"))
cids2 = rdDistGeom.EmbedMultipleConfs(mol2, 200, maxAttempts=30, randomSeed=100, numThreads=4)
self.assertTrue(lstEq(cids, cids2))
nenergies = []
for cid in cids2:
ff = ChemicalForceFields.UFFGetMoleculeForceField(mol2, 10.0, cid)
ee = ff.CalcEnergy()
nenergies.append(ee)
self.assertTrue(lstEq(energies, nenergies, tol=ENERGY_TOLERANCE))
self.assertTrue(lstEq(energies, nenergies, tol=ENERGY_TOLERANCE))
for cid in cids:
msd = 0.0
for i in range(mol.GetNumAtoms()):
msd += (mol.GetConformer().GetAtomPosition(i) -
mol2.GetConformer().GetAtomPosition(i)).LengthSq()
msd /= mol.GetNumAtoms()
self.assertTrue(msd < MSD_TOLERANCE)
for cid in cids:
msd = 0.0
for i in range(mol.GetNumAtoms()):
msd += (mol.GetConformer().GetAtomPosition(i) \
- mol2.GetConformer().GetAtomPosition(i)).LengthSq()
msd /= mol.GetNumAtoms()
self.assertTrue(msd < MSD_TOLERANCE)
def _compareConfs(self, mol, ref, molConfId, refConfId):
self.assertEqual(mol.GetNumAtoms(), ref.GetNumAtoms())
molConf = mol.GetConformer(molConfId)
refConf = ref.GetConformer(refConfId)
for i in range(mol.GetNumAtoms()):
mp = molConf.GetAtomPosition(i)
rp = refConf.GetAtomPosition(i)
self.assertAlmostEqual((mp - rp).Length(), 0.0, 3)
def _compareConfs(self, mol, ref, molConfId, refConfId):
self.assertEqual(mol.GetNumAtoms(), ref.GetNumAtoms())
molConf = mol.GetConformer(molConfId)
refConf = ref.GetConformer(refConfId)
for i in range(mol.GetNumAtoms()):
mp = molConf.GetAtomPosition(i)
rp = refConf.GetAtomPosition(i)
self.assertAlmostEqual((mp - rp).Length(), 0.0, 3)
def test9EmbedParams(self):
mol = Chem.AddHs(Chem.MolFromSmiles('OCCC'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.dg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
def test9EmbedParams(self):
mol = Chem.AddHs(Chem.MolFromSmiles('OCCC'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.dg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useExpTorsionAnglePrefs = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.ETDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useExpTorsionAnglePrefs = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.ETDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etkdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useExpTorsionAnglePrefs = True
params.useBasicKnowledge = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.ETKDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etkdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useExpTorsionAnglePrefs = True
params.useBasicKnowledge = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.ETKDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.kdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useBasicKnowledge = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.KDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.kdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.EmbedParameters()
params.randomSeed = 42
params.useBasicKnowledge = True
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
params = rdDistGeom.KDG()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
def test10ETKDGv2(self):
mol = Chem.AddHs(Chem.MolFromSmiles('n1cccc(C)c1ON'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'torsion.etkdg.v2.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.ETKDGv2()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
def test10ETKDGv2(self):
mol = Chem.AddHs(Chem.MolFromSmiles('n1cccc(C)c1ON'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'torsion.etkdg.v2.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
params = rdDistGeom.ETKDGv2()
params.randomSeed = 42
self.assertEqual(rdDistGeom.EmbedMolecule(mol, params), 0)
self._compareConfs(mol, ref, 0, 0)
def assertDeterministicWithSeed(self, seed):
input_mol = Chem.MolFromSmiles('CN(Cc1cnc2nc(N)nc(N)c2n1)c1ccc(C(=O)NC(CCC(=O)O)C(=O)O)cc1')
def assertDeterministicWithSeed(self, seed):
input_mol = Chem.MolFromSmiles('CN(Cc1cnc2nc(N)nc(N)c2n1)c1ccc(C(=O)NC(CCC(=O)O)C(=O)O)cc1')
params = AllChem.ETKDG()
params.pruneRmsThresh = -1.0 # skip internal RMSD pruning
if seed is not None:
params.randomSeed = seed
params = AllChem.ETKDG()
params.pruneRmsThresh = -1.0 # skip internal RMSD pruning
if seed is not None:
params.randomSeed = seed
firstMol = Chem.AddHs(input_mol)
firstIds = AllChem.EmbedMultipleConfs(firstMol, 11, params)
firstMol = Chem.AddHs(input_mol)
firstIds = AllChem.EmbedMultipleConfs(firstMol, 11, params)
secondMol = Chem.AddHs(input_mol)
secondIds = AllChem.EmbedMultipleConfs(secondMol, 11, params)
secondMol = Chem.AddHs(input_mol)
secondIds = AllChem.EmbedMultipleConfs(secondMol, 11, params)
self.assertEqual(list(firstIds), list(secondIds))
self.assertEqual(firstMol.GetNumConformers(), secondMol.GetNumConformers())
self.assertEqual(list(firstIds), list(secondIds))
self.assertEqual(firstMol.GetNumConformers(), secondMol.GetNumConformers())
nonDeterministic = False
for confIdx in range(firstMol.GetNumConformers()):
nonDeterministic = False
for confIdx in range(firstMol.GetNumConformers()):
firstConf = firstMol.GetConformer(confIdx)
secondConf = secondMol.GetConformer(confIdx)
firstConf = firstMol.GetConformer(confIdx)
secondConf = secondMol.GetConformer(confIdx)
firstPositions = firstConf.GetPositions()
secondPositions = secondConf.GetPositions()
firstPositions = firstConf.GetPositions()
secondPositions = secondConf.GetPositions()
d = firstPositions - secondPositions
rmsd = numpy.sqrt(numpy.sum(d * d))
if seed >= 0:
self.assertEqual(rmsd, 0.0)
elif rmsd != 0.0:
nonDeterministic = True
if seed < 0:
self.assertTrue(nonDeterministic)
d = firstPositions - secondPositions
rmsd = numpy.sqrt(numpy.sum(d * d))
if seed >= 0:
self.assertEquals(rmsd, 0.0)
elif rmsd != 0.0:
nonDeterministic = True
if seed < 0:
self.assertTrue(nonDeterministic)
def testETKDGIsDeterministic(self):
self.assertDeterministicWithSeed(-1) # not deterministic
self.assertDeterministicWithSeed(0) # deterministic
self.assertDeterministicWithSeed(1) # deterministic
# as large as we can go without overflowing since 11 * 195225786 should not overflow the int
self.assertDeterministicWithSeed(195225786)
self.assertDeterministicWithSeed(195225787) # one higher seed will overflow though
# another large seeds that shouldn't overflow internals and make them non-deterministic
self.assertDeterministicWithSeed(0x1CEB00DA)
def testETKDGIsDeterministic(self):
self.assertDeterministicWithSeed(-1) # not deterministic
self.assertDeterministicWithSeed(0) # deterministic
self.assertDeterministicWithSeed(1) # deterministic
self.assertDeterministicWithSeed(195225786) # as large as we can go without overflowing since 11 * 195225786 should not overflow the int
self.assertDeterministicWithSeed(195225787) # one higher seed will overflow though
self.assertDeterministicWithSeed(0x1CEB00DA) # another large seeds that shouldn't overflow internals and make them non-deterministic
def testGithub1763(self):
mol = Chem.MolFromSmiles('CCCCC')
bm1 = rdDistGeom.GetMoleculeBoundsMatrix(mol)
bm2 = rdDistGeom.GetMoleculeBoundsMatrix(mol, doTriangleSmoothing=False)
self.assertTrue(bm1[0, 4] < bm2[0, 4])
def testGithub1763(self):
mol = Chem.MolFromSmiles('CCCCC')
bm1 = rdDistGeom.GetMoleculeBoundsMatrix(mol)
bm2 = rdDistGeom.GetMoleculeBoundsMatrix(mol,doTriangleSmoothing=False)
self.assertTrue(bm1[0, 4] < bm2[0,4])
def testGithub2057(self):
# ensure that ETKDG is the default Embedder
mol = Chem.AddHs(Chem.MolFromSmiles('OCCC'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etkdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
self.assertEqual(rdDistGeom.EmbedMolecule(mol, randomSeed=42), 0)
self._compareConfs(mol, ref, 0, 0)
def testGithub2057(self):
# ensure that ETKDG is the default Embedder
mol = Chem.AddHs(Chem.MolFromSmiles('OCCC'))
fn = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'DistGeomHelpers', 'test_data',
'simple_torsion.etkdg.mol')
ref = Chem.MolFromMolFile(fn, removeHs=False)
self.assertEqual(rdDistGeom.EmbedMolecule(mol, randomSeed=42), 0)
self._compareConfs(mol, ref, 0, 0)
if __name__ == '__main__':
unittest.main()
unittest.main()

View File

@@ -1629,7 +1629,7 @@ void compareConfs(const ROMol *m, const ROMol *expected, int molConfId = -1,
RDGeom::Point3D pt1i = conf1.getAtomPos(i);
RDGeom::Point3D pt2i = conf2.getAtomPos(i);
TEST_ASSERT((pt1i - pt2i).length() < 10e-4);
TEST_ASSERT((pt1i - pt2i).length() < 0.05);
}
}
} // namespace
@@ -1645,36 +1645,56 @@ void testGithub971() {
int cid = DGeomHelpers::EmbedMolecule(*m, 0, 0xf00d);
TEST_ASSERT(cid >= 0);
MolOps::removeHs(*m);
std::string expectedMb =
"\n RDKit 3D\n\n 19 21 0 0 0 0 0 0 0 0999 V2000\n "
" 1.1258 -1.3888 0.9306 C 0 0 0 0 0 0 0 0 0 0 0 "
"0\n 1.0779 -0.1065 0.1565 C 0 0 0 0 0 0 0 0 0 0 0 "
" 0\n 2.2519 0.2795 -0.3483 C 0 0 0 0 0 0 0 0 0 0 "
"0 0\n 3.5245 -0.0901 0.2817 C 0 0 0 0 0 0 0 0 0 0 "
" 0 0\n 4.2551 0.9456 0.8411 C 0 0 0 0 0 0 0 0 0 "
"0 0 0\n 5.6137 0.8099 1.0965 C 0 0 0 0 0 0 0 0 0 "
" 0 0 0\n 6.2293 -0.3871 0.7552 C 0 0 0 0 0 0 0 0 "
"0 0 0 0\n 5.4107 -1.4793 0.4938 C 0 0 0 0 0 0 0 0 "
" 0 0 0 0\n 4.2354 -1.1874 -0.1873 C 0 0 0 0 0 0 0 "
"0 0 0 0 0\n -0.0943 0.0572 -0.7601 C 0 0 0 0 0 0 0 "
" 0 0 0 0 0\n -1.3242 0.2903 -0.0524 N 0 0 0 0 0 0 "
"0 0 0 0 0 0\n -2.1468 1.1490 -0.9044 C 0 0 0 0 0 0 "
" 0 0 0 0 0 0\n -3.1678 1.9193 -0.1239 C 0 0 0 0 0 "
"0 0 0 0 0 0 0\n -2.9879 1.6714 1.3508 C 0 0 0 0 0 "
" 0 0 0 0 0 0 0\n -3.3579 0.3480 1.7662 N 0 0 0 0 "
"0 0 0 0 0 0 0 0\n -3.4586 -0.6011 0.7007 C 0 0 0 0 "
" 0 0 0 0 0 0 0 0\n -2.1733 -0.8977 -0.0058 C 0 0 0 "
"0 0 0 0 0 0 0 0 0\n -2.5650 -1.1467 -1.4589 C 0 0 0 "
" 0 0 0 0 0 0 0 0 0\n -2.7401 0.2591 -1.9624 C 0 0 "
"0 0 0 0 0 0 0 0 0 0\n 1 2 1 0\n 2 3 2 0\n 3 4 1 "
"0\n 4 5 2 0\n 5 6 1 0\n 6 7 2 0\n 7 8 1 0\n 8 9 2 "
"0\n 2 10 1 0\n 10 11 1 0\n 11 12 1 0\n 12 13 1 0\n 13 14 1 "
"0\n 14 15 1 0\n 15 16 1 0\n 16 17 1 0\n 17 18 1 0\n 18 19 1 "
"0\n 9 4 1 0\n 17 11 1 0\n 19 12 1 0\nM CHG 1 15 1\nM "
"END\n";
std::string expectedMb = R"CTAB(
RDKit 3D
19 21 0 0 0 0 0 0 0 0999 V2000
1.1886 -1.4168 0.8579 C 0 0 0 0 0 0 0 0 0 0 0 0
1.0673 -0.0768 0.1995 C 0 0 0 0 0 0 0 0 0 0 0 0
2.2169 0.4750 -0.1935 C 0 0 0 0 0 0 0 0 0 0 0 0
3.5072 0.0051 0.3290 C 0 0 0 0 0 0 0 0 0 0 0 0
4.3384 0.9895 0.8425 C 0 0 0 0 0 0 0 0 0 0 0 0
5.6714 0.7376 1.1358 C 0 0 0 0 0 0 0 0 0 0 0 0
6.1353 -0.5269 0.8881 C 0 0 0 0 0 0 0 0 0 0 0 0
5.3159 -1.5094 0.3457 C 0 0 0 0 0 0 0 0 0 0 0 0
4.1414 -1.0880 -0.2477 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0961 0.0762 -0.7307 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3281 0.3264 -0.0331 N 0 0 0 0 0 0 0 0 0 0 0 0
-2.1244 1.2097 -0.8827 C 0 0 0 0 0 0 0 0 0 0 0 0
-3.2111 1.8916 -0.0980 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.9969 1.6208 1.3672 C 0 0 0 0 0 0 0 0 0 0 0 0
-3.3806 0.2980 1.7743 N 0 0 0 0 0 0 0 0 0 0 0 0
-3.4530 -0.6563 0.7070 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.1661 -0.8675 -0.0283 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.5534 -1.0960 -1.4823 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.6831 0.3159 -1.9837 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
3 4 1 0
4 5 2 0
5 6 1 0
6 7 2 0
7 8 1 0
8 9 2 0
2 10 1 0
10 11 1 0
11 12 1 0
12 13 1 0
13 14 1 0
14 15 1 0
15 16 1 0
16 17 1 0
17 18 1 0
18 19 1 0
9 4 1 0
17 11 1 0
19 12 1 0
M CHG 1 15 1
M END)CTAB";
RWMol *expected = MolBlockToMol(expectedMb);
unsigned int nat = expected->getNumAtoms();
TEST_ASSERT(nat == m->getNumAtoms());
compareConfs(m, expected, 0, 0);
delete m;
delete expected;
@@ -1695,7 +1715,10 @@ void testEmbedParameters() {
TEST_ASSERT(ref->getNumAtoms() == mol->getNumAtoms());
DGeomHelpers::EmbedParameters params;
params.randomSeed = 42;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1714,7 +1737,10 @@ void testEmbedParameters() {
DGeomHelpers::EmbedParameters params;
params.randomSeed = 42;
params.useExpTorsionAnglePrefs = true;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1734,7 +1760,10 @@ void testEmbedParameters() {
params.randomSeed = 42;
params.useExpTorsionAnglePrefs = true;
params.useBasicKnowledge = true;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1755,7 +1784,10 @@ void testEmbedParameters() {
params.useExpTorsionAnglePrefs = true;
params.useBasicKnowledge = true;
params.ETversion = 2;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1774,7 +1806,10 @@ void testEmbedParameters() {
DGeomHelpers::EmbedParameters params;
params.randomSeed = 42;
params.useBasicKnowledge = true;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1794,7 +1829,10 @@ void testEmbedParameters() {
TEST_ASSERT(ref->getNumAtoms() == mol->getNumAtoms());
DGeomHelpers::EmbedParameters params(DGeomHelpers::ETDG);
params.randomSeed = 42;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1812,7 +1850,10 @@ void testEmbedParameters() {
TEST_ASSERT(ref->getNumAtoms() == mol->getNumAtoms());
DGeomHelpers::EmbedParameters params(DGeomHelpers::ETKDG);
params.randomSeed = 42;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;
@@ -1830,7 +1871,10 @@ void testEmbedParameters() {
TEST_ASSERT(ref->getNumAtoms() == mol->getNumAtoms());
DGeomHelpers::EmbedParameters params(DGeomHelpers::KDG);
params.randomSeed = 42;
DGeomHelpers::EmbedMolecule(*mol, params);
TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol, params) == 0);
// std::cerr << MolToMolBlock(*ref) << std::endl;
// std::cerr << MolToMolBlock(*mol) << std::endl;
// std::cerr << fname << std::endl;
compareConfs(ref, mol);
delete ref;

View File

@@ -2,30 +2,30 @@
RDKit 3D
24 25 0 0 0 0 0 0 0 0999 V2000
-0.8098 -1.4111 0.7206 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3419 -0.7255 -0.4791 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7367 0.0993 -0.4222 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5777 0.0654 0.6681 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2691 -0.5589 1.9161 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8985 0.3955 0.3255 C 0 0 0 0 0 0 0 0 0 0 0 0
3.1835 1.2451 -0.7382 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0958 1.7391 -1.4099 C 0 0 0 0 0 0 0 0 0 0 0 0
0.9385 1.0063 -1.4166 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0265 1.2376 -2.3571 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0357 0.3123 -2.5310 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.1793 -0.6829 -1.5776 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2606 -0.7274 1.4246 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2826 -2.2989 1.0122 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.7820 -1.9364 0.4550 H 0 0 0 0 0 0 0 0 0 0 0 0
0.4994 -0.1615 2.5883 H 0 0 0 0 0 0 0 0 0 0 0 0
1.5588 -1.6265 2.0868 H 0 0 0 0 0 0 0 0 0 0 0 0
2.0978 -0.1352 2.5672 H 0 0 0 0 0 0 0 0 0 0 0 0
3.6855 -0.0149 0.9648 H 0 0 0 0 0 0 0 0 0 0 0 0
4.1809 1.6336 -0.7847 H 0 0 0 0 0 0 0 0 0 0 0 0
2.2381 2.5743 -2.0569 H 0 0 0 0 0 0 0 0 0 0 0 0
0.2338 1.8133 -3.2394 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.6232 0.3079 -3.4387 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.9672 -1.4325 -1.7183 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.8886 -1.3656 0.7012 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3279 -0.7429 -0.5236 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6732 0.1541 -0.3581 C 0 0 0 0 0 0 0 0 0 0 0 0
1.4631 0.1269 0.7486 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2102 -0.6171 1.9381 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7903 0.5103 0.5070 C 0 0 0 0 0 0 0 0 0 0 0 0
3.1548 1.3065 -0.5551 C 0 0 0 0 0 0 0 0 0 0 0 0
2.1590 1.6873 -1.4127 C 0 0 0 0 0 0 0 0 0 0 0 0
0.9325 1.0492 -1.3771 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0342 1.2556 -2.4096 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.9353 0.2792 -2.6141 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0176 -0.7788 -1.7179 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3540 -0.6147 1.2792 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2987 -2.1838 1.0406 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.8181 -1.9675 0.4275 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3752 -0.5564 2.5841 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8069 -1.5649 1.9236 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8765 -0.0872 2.7006 H 0 0 0 0 0 0 0 0 0 0 0 0
3.6018 0.0853 1.1023 H 0 0 0 0 0 0 0 0 0 0 0 0
4.1816 1.5721 -0.7393 H 0 0 0 0 0 0 0 0 0 0 0 0
2.2735 2.5676 -2.0369 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3910 1.7955 -3.2889 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5499 0.2799 -3.5152 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.8485 -1.4728 -1.8449 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
3 4 1 0
@@ -93,21 +93,21 @@ $$$$
RDKit 3D
15 14 0 0 0 0 0 0 0 0999 V2000
0.4956 -1.5767 1.0233 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0942 -0.5783 -0.0171 C 0 0 0 0 0 0 0 0 0 0 0 0
0.8343 0.5337 0.0501 C 0 0 0 0 0 0 0 0 0 0 0 0
0.5850 1.7946 -0.6706 C 0 0 0 0 0 0 0 0 0 0 0 0
0.1692 2.7818 0.4203 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6572 -1.0193 1.9819 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2363 -2.3412 1.2343 H 0 0 0 0 0 0 0 0 0 0 0 0
1.4440 -2.0280 0.6508 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3375 -0.7414 -0.9654 H 0 0 0 0 0 0 0 0 0 0 0 0
1.4300 0.7306 0.9507 H 0 0 0 0 0 0 0 0 0 0 0 0
1.5252 2.1092 -1.1127 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1707 1.7873 -1.4265 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.0333 3.7719 0.0201 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0281 2.8096 1.1322 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7465 2.3688 0.8855 H 0 0 0 0 0 0 0 0 0 0 0 0
0.4543 -1.5620 0.9760 C 0 0 0 0 0 0 0 0 0 0 0 0
0.1014 -0.5201 -0.0270 C 0 0 0 0 0 0 0 0 0 0 0 0
0.9463 0.5348 0.0353 C 0 0 0 0 0 0 0 0 0 0 0 0
0.5912 1.7983 -0.6396 C 0 0 0 0 0 0 0 0 0 0 0 0
0.1610 2.7612 0.4509 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6099 -1.0318 1.9504 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3101 -2.2923 1.2097 H 0 0 0 0 0 0 0 0 0 0 0 0
1.3871 -2.0288 0.6300 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3430 -0.7110 -1.0006 H 0 0 0 0 0 0 0 0 0 0 0 0
1.5789 0.6660 0.9271 H 0 0 0 0 0 0 0 0 0 0 0 0
1.5082 2.2077 -1.0818 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2371 1.6159 -1.3479 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.0467 3.7142 -0.0776 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0378 2.8462 1.1249 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7009 2.4042 1.0270 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
3 4 1 0
@@ -128,36 +128,36 @@ $$$$
RDKit 3D
30 33 0 0 0 0 0 0 0 0999 V2000
1.2111 2.3950 -0.0227 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0113 1.5363 -0.6850 C 0 0 0 0 0 0 0 0 0 0 0 0
2.4634 2.0065 -2.0149 C 0 0 0 0 0 0 0 0 0 0 0 0
2.4102 3.8053 -1.8633 S 0 0 0 0 0 0 0 0 0 0 0 0
1.4006 3.8101 -0.3578 C 0 0 0 0 0 0 0 0 0 0 0 0
2.1473 0.2916 -0.1587 N 0 0 0 0 0 0 0 0 0 0 0 0
1.1607 -0.2344 0.6155 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6844 -1.5247 0.8398 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7149 -1.5176 0.7987 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.9901 -0.2293 1.0877 N 0 0 0 0 0 0 0 0 0 0 0 0
0.1086 0.5270 1.0107 N 0 0 0 0 0 0 0 0 0 0 0 0
0.2451 1.8618 0.8235 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7128 2.5836 1.2271 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.5654 -2.3793 -0.0629 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2154 -3.7111 -0.2723 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2498 -4.2871 -1.5458 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3720 -3.4663 -2.6630 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0595 -2.2768 -2.4441 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.2816 -1.8512 -1.1385 C 0 0 0 0 0 0 0 0 0 0 0 0
3.5227 1.6990 -2.1055 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8284 1.6499 -2.8367 H 0 0 0 0 0 0 0 0 0 0 0 0
1.7997 4.4371 0.4316 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3958 4.1809 -0.6818 H 0 0 0 0 0 0 0 0 0 0 0 0
2.7150 -0.4093 -0.7088 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2779 -2.4231 0.7027 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.8195 -4.2427 0.5831 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7016 -5.2267 -1.6492 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7123 -3.5829 -3.5241 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.2187 -1.6139 -3.2961 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.6538 -0.8418 -0.9979 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2016 2.3626 -0.0846 C 0 0 0 0 0 0 0 0 0 0 0 0
1.9992 1.4880 -0.7282 C 0 0 0 0 0 0 0 0 0 0 0 0
2.4875 1.9525 -2.0439 C 0 0 0 0 0 0 0 0 0 0 0 0
2.4610 3.7454 -1.8939 S 0 0 0 0 0 0 0 0 0 0 0 0
1.3687 3.7770 -0.4782 C 0 0 0 0 0 0 0 0 0 0 0 0
2.1574 0.2690 -0.1444 N 0 0 0 0 0 0 0 0 0 0 0 0
1.1853 -0.2498 0.6514 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7013 -1.5324 0.8894 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.6972 -1.5145 0.8628 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.9489 -0.2249 1.1704 N 0 0 0 0 0 0 0 0 0 0 0 0
0.1423 0.5299 1.0295 N 0 0 0 0 0 0 0 0 0 0 0 0
0.2280 1.8520 0.7607 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7745 2.5594 1.0744 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.5598 -2.3615 -0.0010 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2005 -3.6826 -0.2455 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2075 -4.2312 -1.5253 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3587 -3.3887 -2.6224 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0424 -2.2005 -2.3839 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.2807 -1.8200 -1.0653 C 0 0 0 0 0 0 0 0 0 0 0 0
3.5215 1.5858 -2.1381 H 0 0 0 0 0 0 0 0 0 0 0 0
1.7977 1.6137 -2.8236 H 0 0 0 0 0 0 0 0 0 0 0 0
1.7047 4.4447 0.3098 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3656 4.0765 -0.8776 H 0 0 0 0 0 0 0 0 0 0 0 0
2.6918 -0.4426 -0.7151 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2948 -2.4307 0.7675 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7753 -4.2159 0.5984 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7081 -5.1903 -1.6677 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7086 -3.4646 -3.4964 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.2425 -1.5155 -3.2140 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.6890 -0.8251 -0.8737 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0
2 3 1 0
3 4 1 0
@@ -176,7 +176,7 @@ $$$$
16 17 2 0
17 18 1 0
18 19 2 0
1 12 1 0
12 1 1 0
5 1 1 0
11 7 1 0
19 14 1 0
@@ -197,24 +197,24 @@ $$$$
RDKit 3D
18 18 0 0 0 0 0 0 0 0999 V2000
-0.8607 -0.9716 -0.0131 C 0 0 0 0 0 0 0 0 0 0 0 0
0.4252 -1.5444 -0.4933 C 0 0 0 0 0 0 0 0 0 0 0 0
1.3639 -0.3992 -0.6815 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5523 0.2379 0.7010 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6637 1.4197 0.9073 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.8548 0.7744 0.2787 S 0 0 0 0 0 0 0 0 0 0 0 0
-1.2127 1.5131 -0.9638 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.7907 0.9044 1.4219 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.5072 -1.0805 -0.9376 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2996 -1.5822 0.7905 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9018 -2.1567 0.3327 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3131 -2.2701 -1.2657 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0334 0.3651 -1.4090 H 0 0 0 0 0 0 0 0 0 0 0 0
2.3839 -0.7249 -0.9228 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0584 -0.5362 1.3605 H 0 0 0 0 0 0 0 0 0 0 0 0
2.5619 0.3143 1.0600 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6643 1.6755 1.9864 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0884 2.2385 0.3195 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.8795 -0.9405 -0.1247 C 0 0 0 0 0 0 0 0 0 0 0 0
0.4764 -1.5310 -0.4687 C 0 0 0 0 0 0 0 0 0 0 0 0
1.4439 -0.4213 -0.6316 C 0 0 0 0 0 0 0 0 0 0 0 0
1.6334 0.2436 0.7207 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6572 1.3626 0.8911 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.8869 0.7349 0.3025 S 0 0 0 0 0 0 0 0 0 0 0 0
-1.3615 1.5290 -0.8955 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.9258 0.9388 1.3865 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.5658 -1.1039 -0.9640 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2854 -1.5418 0.7255 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8691 -2.1783 0.3630 H 0 0 0 0 0 0 0 0 0 0 0 0
0.3684 -2.2260 -1.2967 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9555 0.3145 -1.2904 H 0 0 0 0 0 0 0 0 0 0 0 0
2.4342 -0.7590 -0.9359 H 0 0 0 0 0 0 0 0 0 0 0 0
1.3027 -0.5382 1.4332 H 0 0 0 0 0 0 0 0 0 0 0 0
2.6635 0.4419 0.9922 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5552 1.6283 1.9627 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0299 2.2234 0.3016 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0
@@ -305,24 +305,24 @@ $$$$
RDKit 3D
18 18 0 0 0 0 0 0 0 0999 V2000
1.0328 -1.2465 0.0259 C 0 0 0 0 0 0 0 0 0 0 0 0
1.0729 -0.3282 -1.1439 C 0 0 0 0 0 0 0 0 0 0 0 0
0.1329 0.8186 -0.9394 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0860 1.2063 0.4733 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0705 0.1553 1.5081 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.1675 -1.2226 0.8862 C 0 0 0 0 0 0 0 0 0 0 0 0
1.9152 -1.1345 0.7123 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0534 -2.2777 -0.3841 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9250 -0.8355 -2.0958 H 0 0 0 0 0 0 0 0 0 0 0 0
2.1284 0.0595 -1.1866 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5993 1.6611 -1.5170 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.8201 0.6171 -1.4605 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.8848 1.9642 0.5841 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8217 1.8392 0.7176 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.9351 0.2408 2.1751 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8967 0.1149 2.0763 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.1215 -1.4089 0.4079 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.0081 -2.0460 1.6319 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1532 -1.8660 -1.7143 C 0 0 0 0 0 0 0 0 0 0 0 0
0.2748 -0.7104 -2.5753 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3134 0.4393 -1.8124 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0236 0.3759 -0.3636 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6240 -0.8257 0.2240 C 0 0 0 0 0 0 0 0 0 0 0 0
1.0049 -1.9523 -0.7281 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3596 -2.7888 -2.2447 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.0885 -1.6762 -1.1247 H 0 0 0 0 0 0 0 0 0 0 0 0
1.3610 -0.4938 -2.5650 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.0367 -0.8061 -3.6151 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.0535 1.3813 -2.3017 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.4147 0.3086 -1.9857 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6718 1.2715 -0.1681 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.9327 0.6340 0.1694 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1702 -1.3583 0.8134 H 0 0 0 0 0 0 0 0 0 0 0 0
1.4997 -0.6112 0.8673 H 0 0 0 0 0 0 0 0 0 0 0 0
1.0507 -2.9339 -0.2666 H 0 0 0 0 0 0 0 0 0 0 0 0
1.9646 -1.7279 -1.1923 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0
@@ -383,22 +383,22 @@ $$$$
RDKit 3D
16 17 0 0 0 0 0 0 0 0999 V2000
0.6422 0.2124 0.2732 C 0 0 0 0 0 0 0 0 0 0 0 0
1.9388 -0.1991 -0.0643 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0681 0.5103 -1.0198 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.4489 1.1792 0.1094 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0106 1.5658 1.4660 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0233 0.0425 1.5753 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8207 0.1517 0.5441 H 0 0 0 0 0 0 0 0 0 0 0 0
2.3339 0.0017 -1.1009 H 0 0 0 0 0 0 0 0 0 0 0 0
2.0355 -1.3167 -0.0584 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3597 -0.4929 -1.4349 H 0 0 0 0 0 0 0 0 0 0 0 0
0.4769 1.0790 -1.8189 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5253 0.8520 0.2626 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7229 2.0958 2.1025 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9842 2.0157 1.4978 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5059 -0.3520 2.4177 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.0701 -0.3036 1.3908 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5874 0.1008 0.2758 C 0 0 0 0 0 0 0 0 0 0 0 0
1.9647 -0.1192 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0410 0.3945 -1.0167 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.4501 1.1441 0.0747 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0506 1.5304 1.4315 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0502 0.0296 1.5860 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7493 -0.0598 0.7373 H 0 0 0 0 0 0 0 0 0 0 0 0
2.3503 0.6415 -0.7901 H 0 0 0 0 0 0 0 0 0 0 0 0
1.9885 -1.1306 -0.5405 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.4497 -0.5594 -1.4395 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5182 0.9573 -1.8154 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5303 0.8570 0.2504 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.6425 2.1560 2.0057 H 0 0 0 0 0 0 0 0 0 0 0 0
1.1200 1.8542 1.5113 H 0 0 0 0 0 0 0 0 0 0 0 0
0.4668 -0.4478 2.4057 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.1231 -0.3068 1.5060 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
1 3 1 0
3 4 1 0

View File

@@ -2,18 +2,18 @@ OCCC seed 42
RDKit 3D
12 11 0 0 0 0 0 0 0 0999 V2000
1.8836 -0.8171 -0.0444 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9178 0.1322 -0.3104 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2435 -0.0564 0.6545 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4983 0.0364 -0.2037 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7170 -0.3454 0.1677 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6165 0.0048 -1.3639 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2587 1.1689 -0.1881 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2852 0.7410 1.4249 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1584 -1.0218 1.1818 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.4519 1.0170 -0.7037 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.4061 -0.1359 0.3901 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.3501 -0.7238 -1.0048 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8772 -0.8302 -0.0243 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9180 0.1277 -0.3117 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2334 -0.0375 0.6486 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4952 0.0373 -0.2033 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7021 -0.3525 0.2041 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6228 -0.0298 -1.3733 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2807 1.1624 -0.2252 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2911 0.7835 1.4012 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1692 -0.9962 1.2092 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.4617 1.0009 -0.7327 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3996 -0.1238 0.4009 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.3505 -0.7418 -0.9936 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0

View File

@@ -1,19 +1,19 @@
OCCC seed 42
RDKit 3D
RDKit 3D
12 11 0 0 0 0 0 0 0 0999 V2000
2.0487 -0.4194 0.3735 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9171 -0.0011 -0.3041 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2816 -0.2568 0.6162 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4947 0.2186 -0.1733 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8244 0.0232 -0.0074 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8397 -0.5756 -1.2298 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8975 1.0715 -0.5474 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2063 0.3311 1.5415 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3354 -1.3174 0.8847 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2506 1.2137 -0.5600 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.4045 0.1651 0.4566 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5542 -0.4529 -1.0505 H 0 0 0 0 0 0 0 0 0 0 0 0
2.0416 -0.4503 0.3802 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9154 -0.0216 -0.3046 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2761 -0.2515 0.6106 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4908 0.2302 -0.1744 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8098 0.0613 0.0297 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8388 -0.6120 -1.2318 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9340 1.0474 -0.5648 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2096 0.3575 1.5290 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3533 -1.3216 0.9031 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2515 1.2122 -0.5899 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3972 0.2063 0.4638 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5612 -0.4579 -1.0511 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0

View File

@@ -2,18 +2,18 @@ OCCC seed 42
RDKit 3D
12 11 0 0 0 0 0 0 0 0999 V2000
2.0535 -0.4153 0.3706 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9236 -0.0151 -0.2942 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2871 -0.2551 0.6145 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4940 0.2052 -0.1749 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8206 0.0894 0.0086 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8405 -0.5772 -1.2270 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9094 1.0649 -0.5413 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2054 0.3197 1.5475 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3303 -1.3236 0.8867 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2537 1.2037 -0.5746 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.4141 0.1771 0.4397 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5632 -0.4737 -1.0557 H 0 0 0 0 0 0 0 0 0 0 0 0
2.0698 -0.4322 0.3549 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9219 -0.0411 -0.2944 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2712 -0.2541 0.6228 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4906 0.2074 -0.1862 C 0 0 0 0 0 0 0 0 0 0 0 0
2.8128 0.1355 0.0366 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8299 -0.6205 -1.2270 H 0 0 0 0 0 0 0 0 0 0 0 0
0.9163 1.0332 -0.5717 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2220 0.3951 1.5147 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.3720 -1.3076 0.9377 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.2386 1.1899 -0.5931 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3981 0.1920 0.4461 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.5582 -0.4975 -1.0403 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0
@@ -25,4 +25,4 @@ OCCC seed 42
4 10 1 0
4 11 1 0
4 12 1 0
M END
M END

View File

@@ -2,18 +2,18 @@ OCCC seed 42
RDKit 3D
12 11 0 0 0 0 0 0 0 0999 V2000
1.8869 -0.8181 -0.0405 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9210 0.1347 -0.3081 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2381 -0.0576 0.6544 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.5051 0.0343 -0.1991 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7203 -0.3462 0.1686 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6165 0.0069 -1.3629 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2627 1.1703 -0.1900 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2827 0.7398 1.4213 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1622 -1.0188 1.1779 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.4555 1.0157 -0.7019 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.4096 -0.1342 0.3910 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.3542 -0.7269 -1.0106 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8785 -0.8310 -0.0228 O 0 0 0 0 0 0 0 0 0 0 0 0
0.9200 0.1311 -0.3107 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2301 -0.0363 0.6497 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.5034 0.0353 -0.2012 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7085 -0.3542 0.2059 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6206 -0.0290 -1.3726 H 0 0 0 0 0 0 0 0 0 0 0 0
1.2807 1.1623 -0.2252 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.2888 0.7823 1.3979 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.1715 -0.9944 1.2067 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.4625 1.0047 -0.7314 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3989 -0.1238 0.3996 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.3530 -0.7469 -0.9958 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0
@@ -25,4 +25,4 @@ OCCC seed 42
4 10 1 0
4 11 1 0
4 12 1 0
M END
M END

View File

@@ -2,23 +2,23 @@
RDKit 3D
17 17 0 0 0 0 0 0 0 0999 V2000
0.5483 -1.5002 -0.2145 N 0 0 0 0 0 0 0 0 0 0 0 0
1.8718 -1.2649 -0.0915 C 0 0 0 0 0 0 0 0 0 0 0 0
2.2899 0.0287 0.1485 C 0 0 0 0 0 0 0 0 0 0 0 0
1.4146 1.0853 0.2672 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0687 0.7980 0.1342 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.9607 1.8587 0.2438 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3548 -0.4897 -0.1052 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.7131 -0.7196 -0.2295 O 0 0 0 0 0 0 0 0 0 0 0 0
-2.1080 -2.0147 -0.4683 N 0 0 0 0 0 0 0 0 0 0 0 0
2.6132 -2.0566 -0.1750 H 0 0 0 0 0 0 0 0 0 0 0 0
3.3357 0.2365 0.2493 H 0 0 0 0 0 0 0 0 0 0 0 0
1.7099 2.1010 0.4536 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.6042 2.5574 1.0529 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.9413 1.4928 0.5400 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.9787 2.4583 -0.7135 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.6812 -2.4108 0.3120 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.5100 -2.1601 -1.4041 H 0 0 0 0 0 0 0 0 0 0 0 0
0.6117 -1.4847 -0.2035 N 0 0 0 0 0 0 0 0 0 0 0 0
1.9222 -1.1995 -0.0866 C 0 0 0 0 0 0 0 0 0 0 0 0
2.2841 0.1202 0.1477 C 0 0 0 0 0 0 0 0 0 0 0 0
1.3644 1.1308 0.2628 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0296 0.7924 0.1359 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0227 1.8092 0.2449 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3390 -0.5138 -0.0965 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.6916 -0.7907 -0.2143 O 0 0 0 0 0 0 0 0 0 0 0 0
-2.0320 -2.1026 -0.4462 N 0 0 0 0 0 0 0 0 0 0 0 0
2.7087 -1.9284 -0.1631 H 0 0 0 0 0 0 0 0 0 0 0 0
3.3334 0.3575 0.2427 H 0 0 0 0 0 0 0 0 0 0 0 0
1.6114 2.1686 0.4450 H 0 0 0 0 0 0 0 0 0 0 0 0
-0.7126 2.5248 1.0511 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.0034 1.4211 0.5293 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.0506 2.4321 -0.6891 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.6733 -2.4881 0.2617 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3404 -2.2489 -1.4218 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0
2 3 1 0
3 4 2 0

View File

@@ -1,5 +1,6 @@
import os, sys
import os
import sys
import unittest
import math
@@ -14,91 +15,91 @@ from rdkit.Chem import rdMolTransforms as rdmt
class TestCase(unittest.TestCase):
def setUp(self):
pass
def setUp(self):
pass
def test1Shape(self):
fileN = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'ShapeHelpers', 'test_data',
'1oir.mol')
m = Chem.MolFromMolFile(fileN)
rdmt.CanonicalizeMol(m)
dims1, offset1 = rdshp.ComputeConfDimsAndOffset(m.GetConformer())
grd = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd, 0)
ovect = grd.GetOccupancyVect()
self.assertTrue(ovect.GetTotalVal() == 9250)
def test1Shape(self):
fileN = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'ShapeHelpers', 'test_data',
'1oir.mol')
m = Chem.MolFromMolFile(fileN)
rdmt.CanonicalizeMol(m)
dims1, offset1 = rdshp.ComputeConfDimsAndOffset(m.GetConformer())
grd = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd, 0)
ovect = grd.GetOccupancyVect()
self.assertEqual(ovect.GetTotalVal(), 7405)
m = Chem.MolFromMolFile(fileN)
trans = rdmt.ComputeCanonicalTransform(m.GetConformer())
dims, offset = rdshp.ComputeConfDimsAndOffset(m.GetConformer(), trans=trans)
dims -= dims1
offset -= offset1
self.assertAlmostEqual(dims.Length(), 0.0, 4)
self.assertAlmostEqual(offset.Length(), 0.0, 4)
m = Chem.MolFromMolFile(fileN)
trans = rdmt.ComputeCanonicalTransform(m.GetConformer())
dims, offset = rdshp.ComputeConfDimsAndOffset(m.GetConformer(), trans=trans)
dims -= dims1
offset -= offset1
self.assertAlmostEqual(dims.Length(), 0.0, 4)
self.assertAlmostEqual(offset.Length(), 0.0, 4)
grd1 = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd1, 0, trans)
ovect = grd1.GetOccupancyVect()
grd1 = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd1, 0, trans)
ovect = grd1.GetOccupancyVect()
self.assertTrue(ovect.GetTotalVal() == 9250)
self.assertEqual(ovect.GetTotalVal(), 7405)
grd2 = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd2, 0)
grd2 = geom.UniformGrid3D(30.0, 16.0, 10.0)
rdshp.EncodeShape(m, grd2, 0)
fileN2 = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'ShapeHelpers', 'test_data',
'1oir_conf.mol')
m2 = Chem.MolFromMolFile(fileN2)
fileN2 = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'ShapeHelpers', 'test_data',
'1oir_conf.mol')
m2 = Chem.MolFromMolFile(fileN2)
self.assertAlmostEqual(rdshp.ShapeTanimotoDist(m, m), 0.0, 4)
self.assertAlmostEqual(rdshp.ShapeTverskyIndex(m, m, 1.0, 1.0), 1.0, 4)
self.assertAlmostEqual(rdshp.ShapeTanimotoDist(m, m), 0.0, 4)
self.assertAlmostEqual(rdshp.ShapeTverskyIndex(m, m, 1.0, 1.0), 1.0, 4)
rmsd = rdMolAlign.AlignMol(m, m2)
self.assertAlmostEqual(rdshp.ShapeTanimotoDist(m, m2), 0.2813, 4)
self.assertAlmostEqual(rdshp.ShapeTverskyIndex(m, m2, 1.0, 1.0), 0.7187, 4)
rmsd = rdMolAlign.AlignMol(m, m2)
self.assertAlmostEqual(rdshp.ShapeTanimotoDist(m, m2), 0.3146, 4)
self.assertAlmostEqual(rdshp.ShapeTverskyIndex(m, m2, 1.0, 1.0), 0.6854, 4)
dist = rdshp.ShapeTanimotoDist(mol1=m, mol2=m2, confId1=0, confId2=0, gridSpacing=0.25,
stepSize=0.125)
self.assertAlmostEqual(dist, 0.3021, 4)
dist = rdshp.ShapeTanimotoDist(mol1=m, mol2=m2, confId1=0, confId2=0, gridSpacing=0.25,
stepSize=0.125)
self.assertAlmostEqual(dist, 0.3389, 4)
m = Chem.MolFromMolFile(fileN)
cpt = rdmt.ComputeCentroid(m.GetConformer())
dims, offset = rdshp.ComputeConfDimsAndOffset(m.GetConformer())
m = Chem.MolFromMolFile(fileN)
cpt = rdmt.ComputeCentroid(m.GetConformer())
dims, offset = rdshp.ComputeConfDimsAndOffset(m.GetConformer())
grd = geom.UniformGrid3D(dims.x, dims.y, dims.z, 0.5, DataStructs.DiscreteValueType.TWOBITVALUE,
offset)
dims -= geom.Point3D(13.927, 16.97, 9.775)
offset -= geom.Point3D(-4.353, 16.829, 2.782)
self.assertAlmostEqual(dims.Length(), 0.0, 4)
self.assertAlmostEqual(offset.Length(), 0.0, 4)
rdshp.EncodeShape(m, grd, 0)
grd = geom.UniformGrid3D(dims.x, dims.y, dims.z, 0.5, DataStructs.DiscreteValueType.TWOBITVALUE,
offset)
dims -= geom.Point3D(13.927, 16.97, 9.775)
offset -= geom.Point3D(-4.353, 16.829, 2.782)
self.assertAlmostEqual(dims.Length(), 0.0, 4)
self.assertAlmostEqual(offset.Length(), 0.0, 4)
rdshp.EncodeShape(m, grd, 0)
ovect = grd.GetOccupancyVect()
ovect = grd.GetOccupancyVect()
self.assertTrue(ovect.GetTotalVal() == 9275)
geom.WriteGridToFile(grd, '1oir_shape.grd')
self.assertEqual(ovect.GetTotalVal(), 7417)
geom.WriteGridToFile(grd, '1oir_shape.grd')
m = Chem.MolFromMolFile(fileN)
lc, uc = rdshp.ComputeConfBox(m.GetConformer())
rdmt.CanonicalizeMol(m)
lc1, uc1 = rdshp.ComputeConfBox(m.GetConformer())
m = Chem.MolFromMolFile(fileN)
lc, uc = rdshp.ComputeConfBox(m.GetConformer())
rdmt.CanonicalizeMol(m)
lc1, uc1 = rdshp.ComputeConfBox(m.GetConformer())
lc2, uc2 = rdshp.ComputeUnionBox((lc, uc), (lc1, uc1))
lc -= geom.Point3D(-4.353, 16.829, 2.782)
uc -= geom.Point3D(9.574, 33.799, 12.557)
self.assertAlmostEqual(lc.Length(), 0.0, 4)
self.assertAlmostEqual(uc.Length(), 0.0, 4)
lc2, uc2 = rdshp.ComputeUnionBox((lc, uc), (lc1, uc1))
lc -= geom.Point3D(-4.353, 16.829, 2.782)
uc -= geom.Point3D(9.574, 33.799, 12.557)
self.assertAlmostEqual(lc.Length(), 0.0, 4)
self.assertAlmostEqual(uc.Length(), 0.0, 4)
lc1 -= geom.Point3D(-10.7519, -6.0778, -3.0123)
uc1 -= geom.Point3D(8.7163, 5.3279, 3.1621)
self.assertAlmostEqual(lc1.Length(), 0.0, 4)
self.assertAlmostEqual(uc1.Length(), 0.0, 3)
lc1 -= geom.Point3D(-10.7519, -6.0778, -3.0123)
uc1 -= geom.Point3D(8.7163, 5.3279, 3.1621)
self.assertAlmostEqual(lc1.Length(), 0.0, 4)
self.assertAlmostEqual(uc1.Length(), 0.0, 3)
lc2 -= geom.Point3D(-10.7519, -6.0778, -3.01226)
uc2 -= geom.Point3D(9.574, 33.799, 12.557)
self.assertAlmostEqual(lc2.Length(), 0.0, 4)
self.assertAlmostEqual(uc2.Length(), 0.0, 4)
lc2 -= geom.Point3D(-10.7519, -6.0778, -3.01226)
uc2 -= geom.Point3D(9.574, 33.799, 12.557)
self.assertAlmostEqual(lc2.Length(), 0.0, 4)
self.assertAlmostEqual(uc2.Length(), 0.0, 4)
if __name__ == '__main__':
print("Testing Shape Helpers wrapper")
unittest.main()
print("Testing Shape Helpers wrapper")
unittest.main()

View File

@@ -39,7 +39,7 @@ void test1Encode() {
// RDGeom::writeGridToFile(grd, "junk.grd");
// MolToMolFile(m, "junk.mol", 0);
CHECK_INVARIANT(grd.getOccupancyVect()->getTotalVal() == 9250, "");
CHECK_INVARIANT(grd.getOccupancyVect()->getTotalVal() == 7405, "");
}
void test2Compare() {
@@ -68,9 +68,9 @@ void test2Compare() {
double rmsd = MolAlign::alignMol(*m, *m2);
CHECK_INVARIANT(rmsd >= 0.0, "");
dist = MolShapes::tanimotoDistance(*m, *m2);
CHECK_INVARIANT(RDKit::feq(dist, 0.2813), "");
CHECK_INVARIANT(RDKit::feq(dist, 0.3146), "");
dist = MolShapes::tverskyIndex(*m, *m2, 1.0, 1.0);
CHECK_INVARIANT(RDKit::feq(dist, 0.7187), "");
CHECK_INVARIANT(RDKit::feq(dist, 0.6854), "");
delete m2;
m2 = MolFileToMol(fname2);
@@ -84,7 +84,7 @@ void test2Compare() {
rmsd = MolAlign::alignMol(*m2, *m, 0, 0, &atomMap);
dist = MolShapes::tanimotoDistance(*m, *m2);
CHECK_INVARIANT(RDKit::feq(dist, 0.3244), "");
CHECK_INVARIANT(RDKit::feq(dist, 0.3593), "");
delete m;
delete m2;
}

View File

@@ -102,8 +102,8 @@ class TestCase(unittest.TestCase):
self.assertTrue(feq(tbl.GetAtomicWeight(6), 12.011))
self.assertTrue(feq(tbl.GetAtomicWeight("C"), 12.011))
self.assertTrue(tbl.GetAtomicNumber('C') == 6)
self.assertTrue(feq(tbl.GetRvdw(6), 1.950))
self.assertTrue(feq(tbl.GetRvdw("C"), 1.950))
self.assertTrue(feq(tbl.GetRvdw(6), 1.7))
self.assertTrue(feq(tbl.GetRvdw("C"), 1.7))
self.assertTrue(feq(tbl.GetRcovalent(6), 0.680))
self.assertTrue(feq(tbl.GetRcovalent("C"), 0.680))
self.assertTrue(tbl.GetDefaultValence(6) == 4)

View File

@@ -23,132 +23,147 @@ const double electronMass =
0.00054857991; // value from http://physics.nist.gov/cgi-bin/cuu/Value?me
}
// these data came from a variety of sources. If it's not explicitly listed
// here, then it has likely been lost in antiquity. Columns:
// atomic number
// symbol
// rCov
// rB0
// rVdw (taken from BODR v10.1)
// atomic mass
// # outershell electrons
// most common isotope
// most common isotopic mass
// list of allowed valences, -1 for anything
const std::string periodicTableAtomData =
"0 * 0 0 0 0 0 0 0 -1 \n \
1 H 0.23 0.33 1.2 1.008 1 1 1.007825032 1 \n \
2 He 0.93 0.7 1.4 4.003 2 4 4.002603254 0 \n \
3 Li 0.68 1.23 1.82 6.941 1 7 7.01600455 1 \n \
4 Be 0.35 0.9 1.7 9.012 2 9 9.0121822 2 \n \
5 B 0.830 0.82 2.08 10.812 3 11 11.0093054 3 \n \
6 C 0.68 0.77 1.95 12.011 4 12 12 4 \n \
7 N 0.68 0.7 1.85 14.007 5 14 14.003074 3 \n \
8 O 0.68 0.66 1.7 15.999 6 16 15.99491462 2 \n \
9 F 0.64 0.611 1.73 18.998 7 19 18.99840322 1 \n \
3 Li 0.68 1.23 2.2 6.941 1 7 7.01600455 1 \n \
4 Be 0.35 0.9 1.9 9.012 2 9 9.0121822 2 \n \
5 B 0.830 0.82 1.8 10.812 3 11 11.0093054 3 \n \
6 C 0.68 0.77 1.7 12.011 4 12 12 4 \n \
7 N 0.68 0.7 1.6 14.007 5 14 14.003074 3 \n \
8 O 0.68 0.66 1.55 15.999 6 16 15.99491462 2 \n \
9 F 0.64 0.611 1.5 18.998 7 19 18.99840322 1 \n \
10 Ne 1.12 0.7 1.54 20.18 8 20 19.99244018 0 \n \
11 Na 0.97 1.54 2.27 22.99 1 23 22.98976928 1 \n \
12 Mg 1.1 1.36 1.73 24.305 2 24 23.9850417 2 \n \
13 Al 1.35 1.18 2.05 26.982 3 27 26.98153863 3 6 \n \
11 Na 0.97 1.54 2.4 22.99 1 23 22.98976928 1 \n \
12 Mg 1.1 1.36 2.2 24.305 2 24 23.9850417 2 \n \
13 Al 1.35 1.18 2.1 26.982 3 27 26.98153863 3 6 \n \
14 Si 1.2 0.937 2.1 28.086 4 28 27.97692653 4 6 \n \
15 P 0.75 0.89 2.08 30.974 5 31 30.97376163 3 5 7 \n \
16 S 1.02 1.04 2 32.067 6 32 31.972071 2 4 6 \n \
17 Cl 0.99 0.997 1.97 35.453 7 35 34.96885268 1 \n \
15 P 0.75 0.89 1.95 30.974 5 31 30.97376163 3 5 7 \n \
16 S 1.02 1.04 1.8 32.067 6 32 31.972071 2 4 6 \n \
17 Cl 0.99 0.997 1.8 35.453 7 35 34.96885268 1 \n \
18 Ar 1.57 1.74 1.88 39.948 8 40 39.96238312 0 \n \
19 K 1.33 2.03 2.75 39.098 1 39 38.96370668 1 \n \
20 Ca 0.99 1.74 1.973 40.078 2 40 39.96259098 2 \n"
"21 Sc 1.44 1.44 1.7 44.956 3 45 44.9559119 -1 \n \
22 Ti 1.47 1.32 1.7 47.867 4 48 47.9479463 -1 \n \
23 V 1.33 1.22 1.7 50.942 5 50 49.9471585 -1 \n \
24 Cr 1.35 1.18 1.7 51.996 6 52 51.9405075 -1 \n \
25 Mn 1.35 1.17 1.7 54.938 7 55 54.9380451 -1 \n \
26 Fe 1.34 1.17 1.7 55.845 8 56 55.9349375 -1 \n \
27 Co 1.33 1.16 1.7 58.933 9 59 58.933195 -1 \n \
28 Ni 1.5 1.15 1.63 58.693 10 58 57.9353429 -1 \n \
29 Cu 1.52 1.17 1.4 63.546 11 63 62.9295975 -1 \n \
30 Zn 1.45 1.25 1.39 65.39 2 64 63.9291422 -1 \n \
31 Ga 1.22 1.26 1.87 69.723 3 69 68.9255736 3 \n \
32 Ge 1.17 1.188 1.7 72.61 4 74 73.9211778 4 \n \
33 As 1.21 1.2 1.85 74.922 5 75 74.9215965 3 5 7 \n \
19 K 1.33 2.03 2.8 39.098 1 39 38.96370668 1 \n \
20 Ca 0.99 1.74 2.4 40.078 2 40 39.96259098 2 \n"
"21 Sc 1.44 1.44 2.3 44.956 3 45 44.9559119 -1 \n \
22 Ti 1.47 1.32 2.15 47.867 4 48 47.9479463 -1 \n \
23 V 1.33 1.22 2.05 50.942 5 50 49.9471585 -1 \n \
24 Cr 1.35 1.18 2.05 51.996 6 52 51.9405075 -1 \n \
25 Mn 1.35 1.17 2.05 54.938 7 55 54.9380451 -1 \n \
26 Fe 1.34 1.17 2.05 55.845 8 56 55.9349375 -1 \n \
27 Co 1.33 1.16 2.0 58.933 9 59 58.933195 -1 \n \
28 Ni 1.5 1.15 2.0 58.693 10 58 57.9353429 -1 \n \
29 Cu 1.52 1.17 2.0 63.546 11 63 62.9295975 -1 \n \
30 Zn 1.45 1.25 2.1 65.39 2 64 63.9291422 -1 \n \
31 Ga 1.22 1.26 2.1 69.723 3 69 68.9255736 3 \n \
32 Ge 1.17 1.188 2.1 72.61 4 74 73.9211778 4 \n \
33 As 1.21 1.2 2.05 74.922 5 75 74.9215965 3 5 7 \n \
34 Se 1.22 1.17 1.9 78.96 6 80 79.9165213 2 4 6 \n \
35 Br 1.21 1.167 2.1 79.904 7 79 78.9183371 1 \n \
35 Br 1.21 1.167 1.9 79.904 7 79 78.9183371 1 \n \
36 Kr 1.91 1.91 2.02 83.8 8 84 83.911507 0 \n \
37 Rb 1.47 2.16 1.7 85.468 1 85 84.91178974 1 \n \
38 Sr 1.12 1.91 1.7 87.62 2 88 87.9056121 2 \n \
39 Y 1.78 1.62 1.7 88.906 3 89 88.9058483 -1 \n \
40 Zr 1.56 1.45 1.7 91.224 4 90 89.9047044 -1 \n"
"41 Nb 1.48 1.34 1.7 92.906 5 93 92.9063781 -1 \n \
42 Mo 1.47 1.3 1.7 95.94 6 98 97.9054082 -1 \n \
43 Tc 1.35 1.27 1.7 98 7 97 96.906365 -1 \n \
44 Ru 1.4 1.25 1.7 101.07 8 102 101.9043493 -1 \n \
45 Rh 1.45 1.25 1.7 102.906 9 103 102.905504 -1 \n \
46 Pd 1.5 1.28 1.63 106.42 10 106 105.903486 -1 \n \
47 Ag 1.59 1.34 1.72 107.868 11 107 106.905097 -1 \n \
48 Cd 1.69 1.48 1.58 112.412 2 114 113.9033585 -1 \n \
49 In 1.63 1.44 1.93 114.818 3 115 114.903878 3 \n \
50 Sn 1.46 1.385 2.17 118.711 4 120 119.9021947 4 \n \
37 Rb 1.47 2.16 2.9 85.468 1 85 84.91178974 1 \n \
38 Sr 1.12 1.91 2.55 87.62 2 88 87.9056121 2 \n \
39 Y 1.78 1.62 2.4 88.906 3 89 88.9058483 -1 \n \
40 Zr 1.56 1.45 2.3 91.224 4 90 89.9047044 -1 \n"
"41 Nb 1.48 1.34 2.15 92.906 5 93 92.9063781 -1 \n \
42 Mo 1.47 1.3 2.1 95.94 6 98 97.9054082 -1 \n \
43 Tc 1.35 1.27 2.05 98 7 97 96.906365 -1 \n \
44 Ru 1.4 1.25 2.05 101.07 8 102 101.9043493 -1 \n \
45 Rh 1.45 1.25 2.0 102.906 9 103 102.905504 -1 \n \
46 Pd 1.5 1.28 2.05 106.42 10 106 105.903486 -1 \n \
47 Ag 1.59 1.34 2.1 107.868 11 107 106.905097 -1 \n \
48 Cd 1.69 1.48 2.2 112.412 2 114 113.9033585 -1 \n \
49 In 1.63 1.44 2.2 114.818 3 115 114.903878 3 \n \
50 Sn 1.46 1.385 2.25 118.711 4 120 119.9021947 4 \n \
51 Sb 1.46 1.4 2.2 121.76 5 121 120.9038157 3 5 7 \n \
52 Te 1.47 1.378 2.06 127.6 6 130 129.9062244 2 4 6\n \
53 I 1.4 1.387 2.15 126.904 7 127 126.904473 1 2 5 \n \
52 Te 1.47 1.378 2.1 127.6 6 130 129.9062244 2 4 6\n \
53 I 1.4 1.387 2.1 126.904 7 127 126.904473 1 2 5 \n \
54 Xe 1.98 1.98 2.16 131.29 8 132 131.9041535 0 2 \n \
55 Cs 1.67 2.35 1.7 132.905 1 133 132.9054519 1 \n \
56 Ba 1.34 1.98 1.7 137.328 2 138 137.9052472 2 \n \
57 La 1.87 1.69 1.7 138.906 3 139 138.9063533 -1 \n \
58 Ce 1.83 1.83 1.7 140.116 4 140 139.9054387 -1 \n \
59 Pr 1.82 1.82 1.7 140.908 3 141 140.9076528 -1 \n \
60 Nd 1.81 1.81 1.7 144.24 4 142 141.9077233 -1 \n"
"61 Pm 1.8 1.8 1.7 145 5 145 144.912749 -1 \n \
62 Sm 1.8 1.8 1.7 150.36 6 152 151.9197324 -1 \n \
63 Eu 1.99 1.99 1.7 151.964 7 153 152.9212303 -1 \n \
64 Gd 1.79 1.79 1.7 157.25 8 158 157.9241039 -1 \n \
65 Tb 1.76 1.76 1.7 158.925 9 159 158.9253468 -1 \n \
66 Dy 1.75 1.75 1.7 162.5 10 164 163.9291748 -1 \n \
67 Ho 1.74 1.74 1.7 164.93 11 165 164.9303221 -1 \n \
68 Er 1.73 1.73 1.7 167.26 12 166 165.9302931 -1 \n \
69 Tm 1.72 1.72 1.7 168.934 13 169 168.9342133 -1 \n \
70 Yb 1.94 1.94 1.7 173.04 14 174 173.9388621 -1 \n \
71 Lu 1.72 1.72 1.7 174.967 15 175 174.9407718 -1 \n \
72 Hf 1.57 1.44 1.7 178.49 4 180 179.94655 -1 \n \
73 Ta 1.43 1.34 1.7 180.948 5 181 180.9479958 -1 \n \
74 W 1.37 1.3 1.7 183.84 6 184 183.9509312 -1 \n \
75 Re 1.35 1.28 1.7 186.207 7 187 186.9557531 -1 \n \
76 Os 1.37 1.26 1.7 190.23 8 192 191.9614807 -1 \n \
77 Ir 1.32 1.27 1.7 192.217 9 193 192.9629264 -1 \n \
78 Pt 1.5 1.3 1.72 195.078 10 195 194.9647911 -1 \n \
79 Au 1.5 1.34 1.66 196.967 11 197 196.9665687 -1 \n \
80 Hg 1.7 1.49 1.55 200.59 2 202 201.970643 -1 \n"
"81 Tl 1.55 1.48 1.96 204.383 3 205 204.9744275 3 \n \
82 Pb 1.54 1.48 2.02 207.2 4 208 207.9766521 4 \n \
83 Bi 1.54 1.45 1.7 208.98 5 209 208.9803987 3 5 7 \n \
84 Po 1.68 1.46 1.7 209 6 209 208.9824304 2 \n \
85 At 1.7 1.45 1.7 210 7 210 209.987148 1 \n \
86 Rn 2.4 2.4 1.7 222 8 211 210.990601 0 \n \
87 Fr 2 2 1.7 223 1 223 223.0197359 1 \n \
88 Ra 1.9 1.9 1.7 226 2 223 223.0185022 2 \n \
89 Ac 1.88 1.88 1.7 227 3 227 227.0277521 -1 \n \
90 Th 1.79 1.79 1.7 232.038 4 232 232.0380553 -1 \n \
91 Pa 1.61 1.61 1.7 231.036 3 231 231.035884 -1 \n \
92 U 1.58 1.58 1.86 238.029 4 238 238.0507882 -1 \n \
93 Np 1.55 1.55 1.7 237 5 236 236.04657 -1 \n \
94 Pu 1.53 1.53 1.7 244 6 238 238.0495599 -1 \n \
95 Am 1.51 1.07 1.7 243 7 241 241.0568291 -1 \n \
96 Cm 1.5 0 1.7 247 8 243 243.0613891 -1 \n \
97 Bk 1.5 0 1.7 247 9 247 247.070307 -1 \n \
98 Cf 1.5 0 1.7 251 10 249 249.0748535 -1 \n \
99 Es 1.5 0 1.7 252 11 252 252.08298 -1 \n \
100 Fm 1.5 0 1.7 257 12 257 257.095105 -1 \n"
"101 Md 1.5 0 1.7 258 13 258 258.098431 -1 \n \
102 No 1.5 0 1.7 259 14 259 259.10103 -1 \n \
103 Lr 1.5 0 1.7 262 15 262 262.10963 -1 \n \
104 Rf 1.57 0 1.7 267 2 267 267.12153 -1 \n \
105 Db 1.49 0 1.7 268 2 268 268.12545 -1 \n \
106 Sg 1.43 0 1.7 269 2 271 271.13347 -1 \n \
107 Bh 1.41 0 1.7 270 2 270 270.13362 -1 \n \
108 Hs 1.34 0 1.7 269 2 269 269.13406 -1 \n \
109 Mt 1.29 0 1.7 278 2 278 278.15481 -1 \n \
110 Ds 1.28 0 1.7 281 2 281 281.16206 -1 \n \
111 Rg 1.21 0 1.7 281 2 281 281.16537 -1 \n \
112 Cn 1.22 0 1.7 285 2 285 285.17411 -1 \n"
55 Cs 1.67 2.35 3.0 132.905 1 133 132.9054519 1 \n \
56 Ba 1.34 1.98 2.7 137.328 2 138 137.9052472 2 \n \
57 La 1.87 1.69 2.5 138.906 3 139 138.9063533 -1 \n \
58 Ce 1.83 1.83 2.48 140.116 4 140 139.9054387 -1 \n \
59 Pr 1.82 1.82 2.47 140.908 3 141 140.9076528 -1 \n \
60 Nd 1.81 1.81 2.45 144.24 4 142 141.9077233 -1 \n"
"61 Pm 1.8 1.8 2.43 145 5 145 144.912749 -1 \n \
62 Sm 1.8 1.8 2.42 150.36 6 152 151.9197324 -1 \n \
63 Eu 1.99 1.99 2.4 151.964 7 153 152.9212303 -1 \n \
64 Gd 1.79 1.79 2.38 157.25 8 158 157.9241039 -1 \n \
65 Tb 1.76 1.76 2.37 158.925 9 159 158.9253468 -1 \n \
66 Dy 1.75 1.75 2.35 162.5 10 164 163.9291748 -1 \n \
67 Ho 1.74 1.74 2.33 164.93 11 165 164.9303221 -1 \n \
68 Er 1.73 1.73 2.32 167.26 12 166 165.9302931 -1 \n \
69 Tm 1.72 1.72 2.3 168.934 13 169 168.9342133 -1 \n \
70 Yb 1.94 1.94 2.28 173.04 14 174 173.9388621 -1 \n \
71 Lu 1.72 1.72 2.27 174.967 15 175 174.9407718 -1 \n \
72 Hf 1.57 1.44 2.25 178.49 4 180 179.94655 -1 \n \
73 Ta 1.43 1.34 2.2 180.948 5 181 180.9479958 -1 \n \
74 W 1.37 1.3 2.1 183.84 6 184 183.9509312 -1 \n \
75 Re 1.35 1.28 2.05 186.207 7 187 186.9557531 -1 \n \
76 Os 1.37 1.26 2.0 190.23 8 192 191.9614807 -1 \n \
77 Ir 1.32 1.27 2.0 192.217 9 193 192.9629264 -1 \n \
78 Pt 1.5 1.3 2.05 195.078 10 195 194.9647911 -1 \n \
79 Au 1.5 1.34 2.1 196.967 11 197 196.9665687 -1 \n \
80 Hg 1.7 1.49 2.05 200.59 2 202 201.970643 -1 \n"
"81 Tl 1.55 1.48 2.2 204.383 3 205 204.9744275 3 \n \
82 Pb 1.54 1.48 2.3 207.2 4 208 207.9766521 4 \n \
83 Bi 1.54 1.45 2.3 208.98 5 209 208.9803987 3 5 7 \n \
84 Po 1.68 1.46 2.0 209 6 209 208.9824304 2 \n \
85 At 1.7 1.45 2.0 210 7 210 209.987148 1 \n \
86 Rn 2.4 2.4 2.0 222 8 211 210.990601 0 \n \
87 Fr 2 2 2.0 223 1 223 223.0197359 1 \n \
88 Ra 1.9 1.9 2.0 226 2 223 223.0185022 2 \n \
89 Ac 1.88 1.88 2.0 227 3 227 227.0277521 -1 \n \
90 Th 1.79 1.79 2.4 232.038 4 232 232.0380553 -1 \n \
91 Pa 1.61 1.61 2.0 231.036 3 231 231.035884 -1 \n \
92 U 1.58 1.58 2.3 238.029 4 238 238.0507882 -1 \n \
93 Np 1.55 1.55 2.0 237 5 236 236.04657 -1 \n \
94 Pu 1.53 1.53 2.0 244 6 238 238.0495599 -1 \n \
95 Am 1.51 1.07 2.0 243 7 241 241.0568291 -1 \n \
96 Cm 1.5 0 2.0 247 8 243 243.0613891 -1 \n \
97 Bk 1.5 0 2.0 247 9 247 247.070307 -1 \n \
98 Cf 1.5 0 2.0 251 10 249 249.0748535 -1 \n \
99 Es 1.5 0 2.0 252 11 252 252.08298 -1 \n \
100 Fm 1.5 0 2.0 257 12 257 257.095105 -1 \n"
"101 Md 1.5 0 2.0 258 13 258 258.098431 -1 \n \
102 No 1.5 0 2.0 259 14 259 259.10103 -1 \n \
103 Lr 1.5 0 2.0 262 15 262 262.10963 -1 \n \
104 Rf 1.57 0 2.0 267 2 267 267.12153 -1 \n \
105 Db 1.49 0 2.0 268 2 268 268.12545 -1 \n \
106 Sg 1.43 0 2.0 269 2 271 271.13347 -1 \n \
107 Bh 1.41 0 2.0 270 2 270 270.13362 -1 \n \
108 Hs 1.34 0 2.0 269 2 269 269.13406 -1 \n \
109 Mt 1.29 0 2.0 278 2 278 278.15481 -1 \n \
110 Ds 1.28 0 2.0 281 2 281 281.16206 -1 \n \
111 Rg 1.21 0 2.0 281 2 281 281.16537 -1 \n \
112 Cn 1.22 0 2.0 285 2 285 285.17411 -1 \n"
// The Blue Obelisk Data Repository has no VdW radii for those:
// Ds Rg Cn Uut Fl Mc Uup Lv Ts Og; we use 2.0 for all of them
// ---
// added from BODR 30.10.2016
// atomic mass data from NIST
// we leave Uut and Uup in here for backwards
// compatibility
"113 Nh 1.36 0 1.7 284 2 284 284.17873 -1 \n \
113 Uut 1.36 0 1.7 284 2 284 284.17873 -1 \n \
114 Fl 1.43 0 1.7 289 2 289 289.19042 -1 \n \
115 Mc 1.62 0 1.7 288 2 288 288.19274 -1 \n \
115 Uup 1.62 0 1.7 288 2 288 288.19274 -1 \n \
116 Lv 1.75 0 1.7 293 2 293 293.20449 -1 \n \
117 Ts 1.65 0 1.7 292 2 292 292.20746 -1 \n \
118 Og 1.57 0 1.7 294 2 294 294.21392 -1 \n \
"113 Nh 1.36 0 2.0 284 2 284 284.17873 -1 \n \
113 Uut 1.36 0 2.0 284 2 284 284.17873 -1 \n \
114 Fl 1.43 0 2.0 289 2 289 289.19042 -1 \n \
115 Mc 1.62 0 2.0 288 2 288 288.19274 -1 \n \
115 Uup 1.62 0 2.0 288 2 288 288.19274 -1 \n \
116 Lv 1.75 0 2.0 293 2 293 293.20449 -1 \n \
117 Ts 1.65 0 2.0 292 2 292 292.20746 -1 \n \
118 Og 1.57 0 2.0 294 2 294 294.21392 -1 \n \
";
atomicData::atomicData(const std::string &dataLine) {

View File

@@ -76,9 +76,9 @@ public class DistanceGeometryTests extends GraphMolTest {
double d1 = pt1j.minus(pt1i).length();
double d2 = pt2j.minus(pt2i).length();
if(m.getBondBetweenAtoms(i,j) != null){
assertEquals(d1, d2, 0.06);
assertTrue(Math.abs(d1-d2)/d1<0.06);
} else {
assertEquals(d1, d2, 0.15);
assertTrue(Math.abs(d1-d2)/d1<0.12);
}
}
}

View File

@@ -84,12 +84,12 @@ def ComputeMolVolume(mol, confId=-1, gridSpacing=0.2, boxMargin=2.0):
>>> AllChem.EmbedMolecule(mol)
0
>>> ComputeMolVolume(mol)
34...
28...
>>> mol = Chem.AddHs(Chem.MolFromSmiles('O'))
>>> AllChem.EmbedMolecule(mol)
0
>>> ComputeMolVolume(mol)
23...
20...
"""
mol = rdchem.Mol(mol)
@@ -214,7 +214,7 @@ def EnumerateLibraryFromReaction(reaction, sidechainSets, returnReactants=False)
>>> amines = (Chem.MolFromSmiles('N'+'C'*x) for x in range(10000))
... a set of 10000 acids
>>> acids = (Chem.MolFromSmiles('OC(=O)'+'C'*x) for x in range(10000))
... now the virtual library (1e8 compounds in principle):
@@ -360,7 +360,7 @@ def AssignBondOrdersFromTemplate(refmol, mol):
An example, start by generating a template from a SMILES
and read in the PDB structure of the molecule
>>> import os
>>> from rdkit.Chem import AllChem
>>> template = AllChem.MolFromSmiles("CN1C(=NC(C1=O)(c2ccccc2)c3ccccc3)N")
@@ -371,7 +371,7 @@ def AssignBondOrdersFromTemplate(refmol, mol):
22
Now assign the bond orders based on the template molecule
>>> newMol = AllChem.AssignBondOrdersFromTemplate(template, mol)
>>> len([1 for b in newMol.GetBonds() if b.GetBondTypeAsDouble() == 1.0])
8

View File

@@ -122,9 +122,9 @@ class TestCase(unittest.TestCase):
def test3Embed(self):
testResults = {
'mol_197': (218.80, 35.75, 110.33, 11.58, 109.66, 11.09, 90.35, 2.95, 0.00),
'mol_223': (259.19, 6.27, 134.13, 1.12, 134.06, 1.12, 85.74, 0.61, 0.00),
'mol_269': (204.51, 7.89, 103.89, 1.20, 102.66, 1.20, 88.07, 1.21, 6.00),
'mol_197': (218.61, 36.02, 110.32, 11.58, 109.65, 11.09, 90.35, 2.95, 0.00),
'mol_223': (250.46, 7.24, 134.74, 1.55, 134.66, 1.55, 85.27, 0.61, 0.00),
'mol_269': (215.52, 6.07, 103.94, 0.21, 102.76, 0.27, 88.22, 0.36, 6.00),
}
inF = gzip.open(os.path.join(self.dataDir, 'cdk2-syn-clip100.pkl.gz'), 'rb')
nDone = 0
@@ -154,8 +154,8 @@ class TestCase(unittest.TestCase):
randomSeed=23)
tgt = testResults[name]
self.assertEqual(len(tgt), len(stats))
# print(name)
# print(','.join(['%.2f' % x for x in stats]))
print(name)
print(','.join(['%.2f' % x for x in stats]))
# we'll use different tolerances for the different values:
self.assertTrue(feq(tgt[0], stats[0], 5.0), (tgt[0], stats[0]))
for i in range(2, len(tgt)):

View File

@@ -15,71 +15,73 @@ from rdkit.Chem.Subshape import SubshapeBuilder, SubshapeAligner, SubshapeObject
debug = False
if not debug:
SubshapeAligner.logger.setLevel(SubshapeAligner.RDLogger.ERROR)
SubshapeAligner.logger.setLevel(SubshapeAligner.RDLogger.ERROR)
class TestCase(unittest.TestCase):
def test1(self):
filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_data', '5ht3ligs.sdf')
suppl = Chem.SDMolSupplier(filename)
builder = SubshapeBuilder.SubshapeBuilder()
builder.gridDims = (20., 20., 10)
builder.gridSpacing = 0.5
builder.winRad = 4.
def test1(self):
filename = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'test_data', '5ht3ligs.sdf')
suppl = Chem.SDMolSupplier(filename)
builder = SubshapeBuilder.SubshapeBuilder()
builder.gridDims = (20., 20., 10)
builder.gridSpacing = 0.5
builder.winRad = 4.
ms = []
shapes = []
for m in suppl:
m = Chem.AddHs(m, addCoords=True)
AllChem.CanonicalizeConformer(m.GetConformer())
ms.append(m)
shape = builder(m, terminalPtsOnly=True)
shapes.append(shape)
ms = []
shapes = []
for m in suppl:
m = Chem.AddHs(m, addCoords=True)
AllChem.CanonicalizeConformer(m.GetConformer())
ms.append(m)
shape = builder(m, terminalPtsOnly=True)
shapes.append(shape)
self.assertEqual(len(ms), 4)
self.assertEqual(len(shapes), 4)
self.assertEqual([len(x.skelPts) for x in shapes], [5, 5, 5, 5])
self.assertEqual(len(ms), 4)
self.assertEqual(len(shapes), 4)
self.assertEqual([len(x.skelPts) for x in shapes], [5, 5, 5, 5])
refShape = builder.GenerateSubshapeShape(ms[0])
self.assertEqual(len(refShape.skelPts), 15)
refShape = builder.GenerateSubshapeShape(ms[0])
self.assertEqual(len(refShape.skelPts), 16)
aligner = SubshapeAligner.SubshapeAligner()
aligner.shapeDistTol = .30
aligner = SubshapeAligner.SubshapeAligner()
aligner.shapeDistTol = .30
algStore = []
for i, s1 in enumerate(shapes):
if not i or not s1:
algStore.append([])
continue
m1 = ms[i]
alignments = aligner.GetSubshapeAlignments(ms[0], refShape, m1, s1, builder)
algStore.append(alignments)
self.assertEqual([len(x) for x in algStore], [0, 2, 39, 0])
algStore = []
for i, s1 in enumerate(shapes):
if not i or not s1:
algStore.append([])
continue
m1 = ms[i]
alignments = aligner.GetSubshapeAlignments(ms[0], refShape, m1, s1, builder)
algStore.append(alignments)
self.assertEqual([len(x) for x in algStore], [0, 5, 28, 0])
algStore = []
for i, s1 in enumerate(shapes):
if not i or not s1:
algStore.append([])
continue
m1 = ms[i]
alignments = list(aligner(ms[0], refShape, m1, s1, builder))
algStore.append(alignments)
self.assertTrue([len(x) for x in algStore] == [0, 2, 39, 0])
algStore = []
for i, s1 in enumerate(shapes):
if not i or not s1:
algStore.append([])
continue
m1 = ms[i]
alignments = list(aligner(ms[0], refShape, m1, s1, builder))
algStore.append(alignments)
self.assertEqual([len(x) for x in algStore], [0, 5, 28, 0])
pruned = []
for i, mi in enumerate(ms):
alignments = algStore[i]
pruned.append(SubshapeAligner.ClusterAlignments(mi, alignments, builder, neighborTol=0.15))
self.assertEqual([len(x) for x in pruned], [0, 2, 29, 0])
pruned = []
for i, mi in enumerate(ms):
alignments = algStore[i]
pruned.append(SubshapeAligner.ClusterAlignments(
mi, alignments, builder, neighborTol=0.15))
self.assertEqual([len(x) for x in pruned], [0, 4, 12, 0])
class TestSubshapeObjects(unittest.TestCase):
def test_SubshapeShape(self):
shape = SubshapeObjects.SubshapeShape()
self.assertEqual(shape.shapes, [])
def test_SubshapeShape(self):
shape = SubshapeObjects.SubshapeShape()
self.assertEqual(shape.shapes, [])
if __name__ == '__main__':
unittest.main()
unittest.main()