def test_init_from_and_to_stream(self): mols = makeStereoExamples() * 10 holder = rdSubstructLibrary.CachedSmilesMolHolder() # one day I'll fix this, but we need to write text but read binary # grrr.... something about the python_streambuf handler. slib = rdSubstructLibrary.SubstructLibrary(holder, None) for mol in mols: holder.AddSmiles(Chem.MolToSmiles(mol, isomericSmiles=True)) if rdSubstructLibrary.SubstructLibraryCanSerialize(): fd, path = tempfile.mkstemp() with open(path, 'w') as file: slib.ToStream(file) with open(path, 'rb') as file: slib2 = rdSubstructLibrary.SubstructLibrary() slib2.InitFromStream(file) self.assertEqual(len(slib), len(slib2)) from io import StringIO, BytesIO s = StringIO() slib.ToStream(s) sb = BytesIO(s.getvalue().encode("ascii")) self.assertTrue(len(sb.getvalue()) > 0) slib3 = rdSubstructLibrary.SubstructLibrary() slib3.InitFromStream(sb) self.assertEqual(len(slib), len(slib2))
def test0SubstructLibrary(self): for fpholderCls in [None, rdSubstructLibrary.PatternHolder]: for holder in [ rdSubstructLibrary.MolHolder(), rdSubstructLibrary.CachedMolHolder(), rdSubstructLibrary.CachedSmilesMolHolder() ]: if fpholderCls: fpholder = fpholderCls() else: fpholder = None slib = rdSubstructLibrary.SubstructLibrary(holder, fpholder) for i in range(100): m = Chem.MolFromSmiles("c1ccccc1") self.assertEqual(slib.AddMol(m), i) res = slib.GetMatches(m) t2 = time.time() self.assertTrue(len(res) == 100) res = slib.GetMatches(m) self.assertEqual(len(res), 100) self.assertTrue(set(res) == set(list(range(100)))) res = slib.GetMatches(m, maxResults=100) self.assertEqual(len(res), 100) self.assertEqual( len(slib.GetMatches(m, startIdx=0, endIdx=100)), 100) self.assertTrue(slib.HasMatch(m)) self.assertEqual(slib.CountMatches(m), 100)
def test0SubstructLibrary(self): for fpholderCls in [None, rdSubstructLibrary.PatternHolder]: for holder in [rdSubstructLibrary.MolHolder(), rdSubstructLibrary.CachedMolHolder(), rdSubstructLibrary.CachedSmilesMolHolder()]: if fpholderCls: fpholder = fpholderCls() else: fpholder = None slib_ = rdSubstructLibrary.SubstructLibrary(holder, fpholder) for i in range(100): m = Chem.MolFromSmiles("c1ccccc1") self.assertEqual(slib_.AddMol(m), i) libs = [slib_] if rdSubstructLibrary.SubstructLibraryCanSerialize(): serialized1 = pickle.loads(pickle.dumps(slib_)) serialized2 = rdSubstructLibrary.SubstructLibrary(slib_.Serialize()) libs.append(serialized1) libs.append(serialized2) for slib in libs: res = slib.GetMatches(m) t2 = time.time() self.assertTrue(len(res) == 100) res = slib.GetMatches(m) self.assertEqual(len(res), 100) self.assertTrue(set(res) == set(list(range(100)))) res = slib.GetMatches(m, maxResults=100); self.assertEqual(len(res), 100) self.assertEqual(len(slib.GetMatches(m, startIdx=0, endIdx=100)), 100) self.assertTrue(slib.HasMatch(m)) self.assertEqual(slib.CountMatches(m), 100)
def testSmilesCache(self): mols = makeStereoExamples() * 10 holder = rdSubstructLibrary.CachedSmilesMolHolder() slib_ = rdSubstructLibrary.SubstructLibrary(holder, None) for mol in mols: holder.AddSmiles(Chem.MolToSmiles(mol, isomericSmiles=True)) libs = [slib_] if rdSubstructLibrary.SubstructLibraryCanSerialize(): serialized1 = pickle.loads(pickle.dumps(slib_)) serialized2 = rdSubstructLibrary.SubstructLibrary( slib_.Serialize()) libs.append(serialized1) libs.append(serialized2) for slib in libs: core = Chem.MolFromSmarts("C-1-C-C-O-C(-*)(-*)1") res = slib.GetMatches(core) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=True) ])) core = Chem.MolFromSmarts("C-1-C-C-O-C(-[O])(-[N])1") core.SetProp("core", "core") res = slib.GetMatches(core, useChirality=False) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=False) ])) core = Chem.MolFromSmarts("C-1-C-C-O-[C@@](-[O])(-[N])1") res = slib.GetMatches(core, useChirality=False) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=False) ])) core = Chem.MolFromSmarts("C-1-C-C-O-[C@@](-[O])(-[N])1") res = slib.GetMatches(core) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=True) ]))
def test_basic_addpatterns(self): # add mols pdb_ligands = [ "CCS(=O)(=O)c1ccc(OC)c(Nc2ncc(-c3cccc(-c4ccccn4)c3)o2)c1", "COc1ccc(S(=O)(=O)NCC2CC2)cc1Nc1ncc(-c2cccc(-c3cccnc3)c2)o1", "COc1ccc(-c2oc3ncnc(N)c3c2-c2ccc(NC(=O)Nc3cc(C(F)(F)F)ccc3F)cc2)cc1", "COC(=O)Nc1nc2ccc(Oc3ccc(NC(=O)Nc4cc(C(F)(F)F)ccc4F)cc3)cc2[nH]1", "COc1cc(Nc2ncnc(-c3cccnc3Nc3ccccc3)n2)cc(OC)c1OC", "O=C(Nc1ccc(Oc2ccccc2)cc1)c1cccnc1NCc1ccncc1", "O=C(Nc1ccc(Oc2ccccc2)cc1)c1cccnc1NCc1ccncc1", "CNC(=O)c1cc(Oc2ccc3[nH]c(Nc4ccc(Cl)c(C(F)(F)F)c4)nc3c2)ccn1", "CNC(=O)c1cc(Oc2ccc3oc(Nc4ccc(Cl)c(OCC5CCC[NH+]5C)c4)nc3c2)ccn1", "CNC(=O)c1cc(Oc2ccc3oc(Nc4ccc(Cl)c(OCC5CCC[NH+]5C)c4)nc3c2)ccn1", "COc1cc2nccc(Oc3ccc4c(c3)OCCN4C(=O)Nc3ccc(Cl)cc3)c2cc1OC", "CNC(=O)c1c(C)oc2cc(Oc3cc[nH+]c4cc(OCCN5CCOCC5)ccc34)ccc12", "COc1cc2[nH+]ccc(Oc3ccc4c(C(=O)Nc5ccc(Cl)cc5)cccc4c3)c2cc1OC", "COc1cc2[nH+]ccc(Oc3ccc4c(C(=O)Nc5ccc(Cl)cc5)cccc4c3)c2cc1OC", "COc1cc2[nH+]ccc(Oc3ccc4c(C(=O)NC5CC5)cccc4c3)c2cc1OC", "COc1cc2[nH+]ccc(Oc3ccc4c(C(=O)NC5CC5)cccc4c3)c2cc1OC", "Cc1ccc(C(=O)Nc2cc(CCC[NH+](C)C)cc(C(F)(F)F)c2)cc1Nc1ncccc1-c1ccncn1", "COc1cc(Nc2nccc(Nc3ccc4c(C)n[nH]c4c3)n2)cc(OC)c1OC", "COc1cc(Nc2nccc(N(C)c3ccc4c(C)n[nH]c4c3)n2)cc(OC)c1OC", "Cc1ccn(-c2ccc3c(c2)NCC3(C)C)c(=O)c1-c1ccc2nc(N)ncc2c1", "Cc1ccn(-c2ccc3c(c2)NCC3(C)C)c(=O)c1-c1ccc2nc(N)ncc2c1", "Cc1ccc(C(=O)NCCC2CCCC2)cc1C(=O)Nc1ccc(N)nc1", "Cc1ccc(C(=O)NCCC2CCCC2)cc1C(=O)Nc1ccc(N)nc1", "Cc1ccn(-c2cccc(C(F)(F)F)c2)c(=O)c1-c1ccc2nc(N)ncc2c1", "Cc1ccn(-c2cccc(C(F)(F)F)c2)c(=O)c1-c1ccc2nc(N)ncc2c1", "O=C(Nc1cncnc1)c1c(Cl)ccc2c(Nc3cccc(C(F)(F)F)c3)noc12", "O=C(Nc1cncnc1)c1c(Cl)ccc2c(Nc3cccc(C(F)(F)F)c3)noc12", "CC1(C)CNc2cc(NC(=O)c3cccnc3NCc3ccncc3)ccc21", "CC1(C)CNc2cc(NC(=O)c3cccnc3NCc3ccncc3)ccc21" ] for holder in [ rdSubstructLibrary.CachedSmilesMolHolder(), rdSubstructLibrary.CachedTrustedSmilesMolHolder() ]: for smi in pdb_ligands: holder.AddSmiles(smi) for patttern in [ None, rdSubstructLibrary.PatternHolder(), rdSubstructLibrary.TautomerPatternHolder() ]: lib = rdSubstructLibrary.SubstructLibrary(holder) rdSubstructLibrary.AddPatterns(lib, numThreads=-1) self.assertEqual(len(lib.GetMolHolder()), len(lib.GetFpHolder())) for smi in pdb_ligands: self.assertTrue(lib.CountMatches(Chem.MolFromSmiles(smi)))
def testSmilesCache(self): mols = makeStereoExamples() * 10 holder = rdSubstructLibrary.CachedSmilesMolHolder() slib = rdSubstructLibrary.SubstructLibrary(holder, None) for mol in mols: holder.AddSmiles(Chem.MolToSmiles(mol, isomericSmiles=True)) core = Chem.MolFromSmarts("C-1-C-C-O-C(-*)(-*)1") res = slib.GetMatches(core) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=True) ])) core = Chem.MolFromSmarts("C-1-C-C-O-C(-[O])(-[N])1") core.SetProp("core", "core") res = slib.GetMatches(core, useChirality=False) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=False) ])) core = Chem.MolFromSmarts("C-1-C-C-O-[C@@](-[O])(-[N])1") res = slib.GetMatches(core, useChirality=False) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=False) ])) core = Chem.MolFromSmarts("C-1-C-C-O-[C@@](-[O])(-[N])1") res = slib.GetMatches(core) self.assertEqual( len(res), len([ x for x in mols if x.HasSubstructMatch(core, useChirality=True) ]))
def test1SubstructLibrary(self): for fpholderCls in [None, rdSubstructLibrary.PatternHolder]: for holder in [ rdSubstructLibrary.MolHolder(), rdSubstructLibrary.CachedMolHolder(), rdSubstructLibrary.CachedSmilesMolHolder() ]: if fpholderCls: fpholder = fpholderCls() else: fpholder = None slib = rdSubstructLibrary.SubstructLibrary(holder, fpholder) mols = [] for i in range(100): m = Chem.MolFromSmiles("c1ccccc1") self.assertEqual(slib.AddMol(m), i * 2) mols.append(m) m2 = Chem.MolFromSmiles("CCCC") self.assertEqual(slib.AddMol(m2), i * 2 + 1) mols.append(m2) res = slib.GetMatches(m) self.assertEqual(len(res), 100) self.assertEqual(set(res), set(list(range(0, 200, 2)))) res = slib.GetMatches(m2) self.assertEqual(len(res), 100) self.assertTrue(set(res) == set(list(range(1, 200, 2)))) res = slib.GetMatches(m) self.assertEqual(len(res), 100) res = slib.GetMatches(m, maxResults=100) self.assertEqual(len(res), 100) self.assertEqual( len(slib.GetMatches(m, startIdx=0, endIdx=50 * 2)), 50) self.assertEqual( len(slib.GetMatches(m2, startIdx=1, endIdx=50 * 2 + 1)), 50) self.assertTrue(slib.HasMatch(m)) self.assertTrue(slib.HasMatch(m2)) self.assertEqual(slib.CountMatches(m), 100) self.assertEqual(slib.CountMatches(m2), 100)
def test1SubstructLibrary(self): for keyholderCls in [None, rdSubstructLibrary.KeyFromPropHolder]: for fpholderCls in [None, rdSubstructLibrary.PatternHolder]: for holder in [ rdSubstructLibrary.MolHolder(), rdSubstructLibrary.CachedMolHolder(), rdSubstructLibrary.CachedSmilesMolHolder() ]: if fpholderCls: fpholder = fpholderCls() else: fpholder = None if keyholderCls: keyholder = keyholderCls() self.assertEqual(keyholder.GetPropName(), "_Name") else: keyholder = None slib_ = rdSubstructLibrary.SubstructLibrary( holder, fpholder, keyholder) mols = [] for i in range(100): m = Chem.MolFromSmiles("c1ccccc1") m.SetProp("_Name", str(i * 2)) self.assertEqual(slib_.AddMol(m), i * 2) mols.append(m) m2 = Chem.MolFromSmiles("CCCC") m2.SetProp("_Name", str(i * 2 + 1)) self.assertEqual(slib_.AddMol(m2), i * 2 + 1) mols.append(m2) libs = [slib_] if rdSubstructLibrary.SubstructLibraryCanSerialize(): serialized1 = pickle.loads(pickle.dumps(slib_)) serialized2 = rdSubstructLibrary.SubstructLibrary( slib_.Serialize()) libs.append(serialized1) libs.append(serialized2) for slib in libs: res = slib.GetMatches(m) self.assertEqual(len(res), 100) self.assertEqual(set(res), set(list(range(0, 200, 2)))) if keyholderCls: self.assertEqual( [str(idx) for idx in res], [str(idx) for idx in range(0, 200, 2)]) res = slib.GetMatches(m2) self.assertEqual(len(res), 100) self.assertTrue( set(res) == set(list(range(1, 200, 2)))) if keyholderCls: self.assertEqual( [str(idx) for idx in res], [str(idx) for idx in range(1, 200, 2)]) res = slib.GetMatches(m) self.assertEqual(len(res), 100) res = slib.GetMatches(m, maxResults=100) self.assertEqual(len(res), 100) self.assertEqual( len(slib.GetMatches(m, startIdx=0, endIdx=50 * 2)), 50) self.assertEqual( len( slib.GetMatches(m2, startIdx=1, endIdx=50 * 2 + 1)), 50) self.assertTrue(slib.HasMatch(m)) self.assertTrue(slib.HasMatch(m2)) self.assertEqual(slib.CountMatches(m), 100) self.assertEqual(slib.CountMatches(m2), 100)