def test7UniformGridIndices(self): ugrid = geom.UniformGrid3D(20, 18, 15) idx = ugrid.GetGridIndex(3, 2, 1) xi, yi, zi = ugrid.GetGridIndices(idx) self.assertEqual(xi, 3) self.assertEqual(yi, 2) self.assertEqual(zi, 1)
def ComputeMolShape(mol, confId=-1, boxDim=(20, 20, 20), spacing=0.5, **kwargs): """ returns a grid representation of the molecule's shape """ res = rdGeometry.UniformGrid3D(boxDim[0], boxDim[1], boxDim[2], spacing=spacing) EncodeShape(mol, res, confId, **kwargs) return res
def test5GridOps(self): grd = geom.UniformGrid3D(10, 10, 10) grd.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.0, 0.25) grd.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.0, 0.25) grd2 = geom.UniformGrid3D(10, 10, 10) grd2.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.0, 0.25) grd2.SetSphereOccupancy(geom.Point3D(2.0, 2.0, 0.0), 1.0, 0.25) self.assertTrue(geom.TanimotoDistance(grd, grd) == 0.0) self.assertTrue(geom.TanimotoDistance(grd, grd2) == 1.0) grd3 = copy.deepcopy(grd) grd3 |= grd2 self.assertTrue(geom.TanimotoDistance(grd3, grd) == .5) self.assertTrue(geom.TanimotoDistance(grd3, grd2) == .5) grd3 = copy.deepcopy(grd) grd3 += grd2 self.assertTrue(geom.TanimotoDistance(grd3, grd) == .5) self.assertTrue(geom.TanimotoDistance(grd3, grd2) == .5) grd3 -= grd self.assertTrue(geom.TanimotoDistance(grd3, grd) == 1.0) self.assertTrue(geom.TanimotoDistance(grd3, grd2) == 0) grd4 = geom.UniformGrid3D(10, 10, 10) grd4.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.0, 0.25) grd4.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.0, 0.25) grd4.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.0, 0.25) self.assertTrue(feq(geom.TanimotoDistance(grd4, grd), .3333)) self.assertTrue(feq(geom.TanimotoDistance(grd4, grd2), .75)) grd4 &= grd2 self.assertTrue(feq(geom.TanimotoDistance(grd4, grd), 1.0)) self.assertTrue(feq(geom.TanimotoDistance(grd4, grd2), .5))
def test4GridPickles(self): grd = geom.UniformGrid3D(10.0, 9.0, 8.0, 0.5) self.assertTrue(grd.GetNumX() == 20) self.assertTrue(grd.GetNumY() == 18) self.assertTrue(grd.GetNumZ() == 16) grd.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(2.0, 2.0, 0.0), 1.5, 0.25) self.assertTrue(geom.TanimotoDistance(grd, grd) == 0.0) grd2 = pickle.loads(pickle.dumps(grd)) self.assertTrue(grd2.GetNumX() == 20) self.assertTrue(grd2.GetNumY() == 18) self.assertTrue(grd2.GetNumZ() == 16) self.assertTrue(geom.TanimotoDistance(grd, grd2) == 0.0)
def ComputeMolVolume(mol, confId=-1, gridSpacing=0.2, boxMargin=2.0): """ Calculates the volume of a particular conformer of a molecule based on a grid-encoding of the molecular shape. """ mol = rdchem.Mol(mol) conf = mol.GetConformer(confId) CanonicalizeConformer(conf) box = ComputeConfBox(conf) sideLen = (box[1].x - box[0].x + 2 * boxMargin, box[1].y - box[0].y + 2 * boxMargin, box[1].z - box[0].z + 2 * boxMargin) shape = rdGeometry.UniformGrid3D(sideLen[0], sideLen[1], sideLen[2], spacing=gridSpacing) EncodeShape(mol, shape, confId, ignoreHs=False, vdwScale=1.0) voxelVol = gridSpacing**3 occVect = shape.GetOccupancyVect() voxels = [1 for x in occVect if x == 3] vol = voxelVol * len(voxels) return vol
def test3UniformGrid(self): ugrid = geom.UniformGrid3D(20, 18, 15) self.failUnless(ugrid.GetNumX() == 40) self.failUnless(ugrid.GetNumY() == 36) self.failUnless(ugrid.GetNumZ() == 30) dvect = ugrid.GetOccupancyVect() ugrid = geom.UniformGrid3D(20, 18, 15, 0.5, DataStructs.DiscreteValueType.TWOBITVALUE) dvect = ugrid.GetOccupancyVect() self.failUnless( dvect.GetValueType() == DataStructs.DiscreteValueType.TWOBITVALUE) grd = geom.UniformGrid3D(10.0, 10.0, 10.0, 0.5) grd.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.5, 0.25) grd.SetSphereOccupancy(geom.Point3D(2.0, 2.0, 0.0), 1.5, 0.25) geom.WriteGridToFile(grd, "junk.grd") grd2 = geom.UniformGrid3D(10.0, 10.0, 10.0, 0.5) grd2.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.5, 0.25) grd2.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.5, 0.25) grd2.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.5, 0.25) dist = geom.TanimotoDistance(grd, grd2) self.failUnless(dist == 0.25) dist = geom.ProtrudeDistance(grd, grd2) self.failUnless(dist == 0.25) dist = geom.ProtrudeDistance(grd2, grd) self.failUnless(dist == 0.0) grd2 = geom.UniformGrid3D(10.0, 10.0, 10.0, 0.5, DataStructs.DiscreteValueType.FOURBITVALUE) grd2.SetSphereOccupancy(geom.Point3D(-2.0, -2.0, 0.0), 1.5, 0.25, 3) grd2.SetSphereOccupancy(geom.Point3D(-2.0, 2.0, 0.0), 1.5, 0.25, 3) grd2.SetSphereOccupancy(geom.Point3D(2.0, -2.0, 0.0), 1.5, 0.25, 3) self.failUnlessRaises(ValueError, lambda: geom.TanimotoDistance(grd, grd2)) grd2 = geom.UniformGrid3D(10.0, 10.0, 10.0, 1.0) self.failUnlessRaises(ValueError, lambda: geom.TanimotoDistance(grd, grd2)) grd2 = geom.UniformGrid3D(11.0, 10.0, 10.0, 1.0) self.failUnlessRaises(ValueError, lambda: geom.TanimotoDistance(grd, grd2))
def testSymmetry(self): grd = geom.UniformGrid3D(10.0, 10.0, 10.0, 0.5) grd.SetSphereOccupancy(geom.Point3D(-2.2, -2.0, 0.0), 1.65, 0.25) grd.SetSphereOccupancy(geom.Point3D(2.2, -2.0, 0.0), 1.65, 0.25) bPt1 = geom.Point3D(-4.0, -2.0, -2.0) bPt2 = geom.Point3D(4.0, -2.0, -2.0) for k in range(8): bPt1 += geom.Point3D(0.0, 0.0, 0.5) bPt2 += geom.Point3D(0.0, 0.0, 0.5) for j in range(8): bPt1 += geom.Point3D(0.0, 0.5, 0.0) bPt2 += geom.Point3D(0.0, 0.5, 0.0) for i in range(8): bPt1 += geom.Point3D(0.5, 0.0, 0.0) bPt2 -= geom.Point3D(0.5, 0.0, 0.0) self.assertTrue(grd.GetValPoint(bPt1) == grd.GetValPoint(bPt2)) bPt1.x = -4.0 bPt2.x = 4.0 bPt1.y = -2.0 bPt2.y = -2.0
def get_molec_shape(mol, conf, confId, vdwScale=1.0, boxMargin=2.0, spacing=0.2): """ Get the shape of a conformer of a molecule as a grid representation. """ box = Chem.ComputeConfBox(conf) sideLen = (box[1].x-box[0].x + 2*boxMargin, box[1].y-box[0].y + 2*boxMargin, box[1].z-box[0].z + 2*boxMargin) shape = rdGeometry.UniformGrid3D(2*sideLen[0], 2*sideLen[1], 2*sideLen[2], spacing=spacing) Chem.EncodeShape( mol, shape, confId=confId, ignoreHs=False, vdwScale=vdwScale ) return box, sideLen, shape
def ComputeMolVolume(mol, confId=-1, gridSpacing=0.2, boxMargin=2.0): """ Calculates the volume of a particular conformer of a molecule based on a grid-encoding of the molecular shape. A bit of demo as well as a test of github #1883: >>> from rdkit import Chem >>> from rdkit.Chem import AllChem >>> mol = Chem.AddHs(Chem.MolFromSmiles('C')) >>> AllChem.EmbedMolecule(mol) 0 >>> ComputeMolVolume(mol) 34... >>> mol = Chem.AddHs(Chem.MolFromSmiles('O')) >>> AllChem.EmbedMolecule(mol) 0 >>> ComputeMolVolume(mol) 23... """ mol = rdchem.Mol(mol) conf = mol.GetConformer(confId) CanonicalizeConformer(conf, ignoreHs=False) box = ComputeConfBox(conf) sideLen = (box[1].x - box[0].x + 2 * boxMargin, box[1].y - box[0].y + 2 * boxMargin, box[1].z - box[0].z + 2 * boxMargin) shape = rdGeometry.UniformGrid3D(sideLen[0], sideLen[1], sideLen[2], spacing=gridSpacing) EncodeShape(mol, shape, confId, ignoreHs=False, vdwScale=1.0) voxelVol = gridSpacing**3 occVect = shape.GetOccupancyVect() voxels = [1 for x in occVect if x == 3] vol = voxelVol * len(voxels) return vol
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.failUnless(ovect.GetTotalVal() == 9250) m = Chem.MolFromMolFile(fileN) trans = rdmt.ComputeCanonicalTransform(m.GetConformer()) dims, offset = rdshp.ComputeConfDimsAndOffset(m.GetConformer(), trans=trans) dims -= dims1 offset -= offset1 self.failUnless(feq(dims.Length(), 0.0)) self.failUnless(feq(offset.Length(), 0.0)) grd1 = geom.UniformGrid3D(30.0, 16.0, 10.0) rdshp.EncodeShape(m, grd1, 0, trans) ovect = grd1.GetOccupancyVect() self.failUnless(ovect.GetTotalVal() == 9250) 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) rmsd = rdMolAlign.AlignMol(m, m2) self.failUnless(feq(rdshp.ShapeTanimotoDist(m, m2), 0.2813)) dist = rdshp.ShapeTanimotoDist(mol1=m, mol2=m2, confId1=0, confId2=0, gridSpacing=0.25, stepSize=0.125) self.failUnless(feq(dist, 0.3021)) 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.failUnless(feq(dims.Length(), 0.0)) self.failUnless(feq(offset.Length(), 0.0)) rdshp.EncodeShape(m, grd, 0) ovect = grd.GetOccupancyVect() self.failUnless(ovect.GetTotalVal() == 9275) 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()) 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.failUnless(feq(lc.Length(), 0.0)) self.failUnless(feq(uc.Length(), 0.0)) lc1 -= geom.Point3D(-10.7519, -6.0778, -3.0123) uc1 -= geom.Point3D(8.7163, 5.3279, 3.1621) self.failUnless(feq(lc1.Length(), 0.0)) self.failUnless(feq(uc1.Length(), 0.0)) lc2 -= geom.Point3D(-10.7519, -6.0778, -3.01226) uc2 -= geom.Point3D(9.574, 33.799, 12.557) self.failUnless(feq(lc2.Length(), 0.0)) self.failUnless(feq(uc2.Length(), 0.0))