# $Id$ # # Copyright (C) 2005 greg Landrum and Rational Discovery LLC # All Rights Reserved # import RDConfig import unittest,cPickle,os,sys from Dbase.DbConnection import DbConnect from Dbase import DbModule import Chem def feq(v1,v2,tol=1e-4): return abs(v1-v2)=8) curs.execute(""" SELECT rd_tanimoto(rd_similarityfp_bits('C1CCC1'),rd_similarityfp_bits('C1CCC1C')) """) res = curs.fetchone() self.failUnless(res[0]>=0.0) self.failUnless(res[0]<1.0) curs.execute(""" SELECT rd_tanimoto(rd_similarityfp('C1CCC1'),rd_similarityfp('C1CCC1C')) """) res = curs.fetchone() self.failUnless(res[0]>=0.0) self.failUnless(res[0]<1.0) def test8(self): " Canonical smiles: " curs = self.conn.GetCursor() curs.execute("SELECT rd_canonsmiles('C1COCCC1');") ref = curs.fetchone()[0] self.failUnless(ref) curs.execute("SELECT rd_canonsmiles('C1CCOCC1');") smi = curs.fetchone()[0] self.failUnless(ref==smi) curs.execute("SELECT rd_canonsmiles('C1CCCCO1');") smi = curs.fetchone()[0] self.failUnless(ref==smi) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_canonsmiles('Fail');")) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_canonsmiles('');")) def test9(self): " substructure counts " curs = self.conn.GetCursor() curs.execute("SELECT rd_substructcount('O','OCCC(=O)O')") self.failUnless(curs.fetchone()[0]==3) curs.execute("SELECT rd_substructcount('N','OCCC(=O)O')") self.failUnless(curs.fetchone()[0]==0) curs.execute("SELECT rd_substructcount('[O,S]','SCCC(=O)O')") self.failUnless(curs.fetchone()[0]==3) curs.execute("SELECT rd_substructcount('[O,S]','OCCC(=O)O')") self.failUnless(curs.fetchone()[0]==3) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_substructcount('QcC','c1ccccc1C');")) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_substructcount('QcC','c1ccccc1C');")) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_substructcount('cC','Qc1ccccc1C');")) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute("SELECT rd_substructcount('nC','c1ccccn1C');")) pkl1 = DbModule.binaryHolder(Chem.MolFromSmiles('O').ToBinary()) pkl2 = DbModule.binaryHolder(Chem.MolFromSmiles('OCCC(=O)O').ToBinary()) cmd = "SELECT rd_substructcount(cast (%s as bytea),cast (%s as bytea))" curs.execute(cmd,(pkl1,pkl2)) self.failUnless(curs.fetchone()[0]==3) pkl1 = DbModule.binaryHolder(Chem.MolFromSmiles('N').ToBinary()) curs.execute(cmd,(pkl1,pkl2)) self.failUnless(curs.fetchone()[0]==0) pkl1 = DbModule.binaryHolder(Chem.MolFromSmiles('O').ToBinary()) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute(cmd,('',pkl2))) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute(cmd,(pkl1,''))) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute(cmd,('',''))) def test10(self): " substructures with pickles " curs = self.conn.GetCursor() curs.execute("SELECT rd_hassubstruct(rd_molpickle('O'),rd_molpickle('OCCC(=O)O'))") self.failUnless(curs.fetchone()[0]) curs.execute("SELECT rd_substructcount(rd_molpickle('N'),rd_molpickle('OCCC(=O)O'))") self.failIf(curs.fetchone()[0]) def test11(self): " descriptors " from Chem import Crippen,Descriptors curs = self.conn.GetCursor() smi = "c1ncccc1" m = Chem.MolFromSmiles(smi) pkl= DbModule.binaryHolder(m.ToBinary()) ref = Crippen.MolLogP(m,addHs=1) curs.execute("SELECT rd_mollogp(%s)",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_mollogp(cast (%s as bytea))",(pkl,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_mollogp(rd_molpickle(%s))",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) ref = Descriptors.MolWt(m) curs.execute("SELECT rd_molamw(%s)",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_molamw(cast (%s as bytea))",(pkl,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_molamw(rd_molpickle(%s))",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) smi = "CCOCC(C)(C)C" m = Chem.MolFromSmiles(smi) pkl= DbModule.binaryHolder(m.ToBinary()) ref = Crippen.MolLogP(m,addHs=1) curs.execute("SELECT rd_mollogp(%s)",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_mollogp(cast (%s as bytea))",(pkl,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_mollogp(rd_molpickle(%s))",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) ref = Descriptors.MolWt(m) curs.execute("SELECT rd_molamw(%s)",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_molamw(cast (%s as bytea))",(pkl,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) curs.execute("SELECT rd_molamw(rd_molpickle(%s))",(smi,)) v = curs.fetchone()[0] self.failUnlessAlmostEqual(ref,v,4) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute('select rd_mollogp(%s)',('',))) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute('select rd_mollogp(%s)',('QC',))) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute('select rd_mollogp(cast (%s as bytea))',('',))) self.failUnlessRaises(DbModule.OperationalError, lambda : curs.execute('select rd_mollogp(cast (%s as bytea))',('randomtext',))) def test12(self): " using functions: " fnDef=""" create or replace function rd_lipinskicount(smiles text) returns int as $BODY$ DECLARE res int; BEGIN res := 0; if rd_substructcount('[#7,#8]',smiles) > 10 then res := res + 1; end if; if rd_substructcount('[#7,#8;!H0]',smiles) > 5 then res := res + 1; end if; if rd_molamw(smiles) > 500 then res := res + 1; end if; if rd_mollogp(smiles) > 5 then res := res + 1; end if; RETURN res; END $BODY$ LANGUAGE plpgsql immutable; """ curs = self.conn.GetCursor() curs.execute(fnDef) curs.execute("select rd_lipinskicount('Nc1cccc(O)c1')") self.failUnless(curs.fetchone()[0]==0) curs.execute("select rd_lipinskicount('Cc1ccc(-c2ccc(S(C)(=O)=O)cc2)n1-c1ccc(C)cc1')") self.failUnless(curs.fetchone()[0]==1) curs.execute("select rd_lipinskicount('Cc1n(-c2ccc(F)cc2)c(-c2ccc(S(C)(=O)=O)cc2)cc1C(Oc1cc(Cl)ccc1)C(F)(F)F')") self.failUnless(curs.fetchone()[0]==2) curs.execute("select rd_lipinskicount('Cc1cc(Cl)cc(-c2nc(C(F)(F)F)cn2-c2ccc(S(C)(=O)=O)cc2)c1')") self.failUnless(curs.fetchone()[0]==1) if __name__ == '__main__': unittest.main()