USRCAT = Ultrafast Shape recognition with pharmacophoric constrains
RDKit のMLで興味深い報告があったので
実装してみました。
OETookit以外にRDKitもオッケーというのはとても魅力的です。
ShapeベースのバーチャルスクリーニングにてScaffold Hopingにも使える可能性があることや
ElectroShapeと比較しても遜色ないEFを出している点はちょっと引かれます。
まずここからダウンロードします。
あとはマニュアルに従って
$ cd /usr/local/src
$ mv ~/Downloads/usrcat*
$ cd /usr/loca/usrcat
$ sudo python setup.py install
でOK
PYTHONPATHに上記のフォルダを指定しておけば、何所からでも呼び出せます。
その後、
①まずSDF読み込み
②三次元配座の発生UFFによるエネルギーの計算
③usrcatモジュールでのモーメントの算出
④類似性の計算
を行わせてみました。
usrcatのgenerate_momentsはmolオブジェクトが持つ全配座のモーメントを計算します。
次のsimilarity(m1,m2)で発生させたモーメント同士の類似性をみていています。
モーメントは配座の数だけあるようですが
m1は最初のconfId=0のものだけしか使わないようなので
最低エネルギーのは配座を持ってくるか、PDBからリガンドを持ってくるのがいいのかと思います。
下の例はそのまま使っているので
あまりいい例じゃないです。
取りあえず動いたレベル。
コードも助長だったり見にくかったり。。。
from rdkit import Chem from rdkit.Chem import AllChem from usrcat import sim from usrcat.toolkits.rd import generate_moments import sys #mols = [Chem.AddHs(m) for m in Chem.SDMolSupplier(sys.argv[1])] mols = [Chem.AddHs(m) for m in Chem.SDMolSupplier("first.sdf")] min_id_list = {} count=0 for m in mols: cids=AllChem.EmbedMultipleConfs(m) energylist = [] for cid in cids: AllChem.UFFOptimizeMolecule(m, confId=cid) ff=AllChem.UFFGetMoleculeForceField(m, confId=cid) ff.Minimize() e=ff.CalcEnergy() energylist.append(e) min_id =energylist.index(min(energylist)) min_id_list[m]=min_id count+=1 print count,min_id, energylist[min_id] momentslist=[] for m,min_id in min_id_list.items(): moments = generate_moments(m) momentslist.append(moments) print len(momentslist) for i in range(len(momentslist)): for j in range(i): similarity=sim.similarity(momentslist[i],momentslist[j]) #if similarity[1] >= 0.6: print i, j, similarity print "finished"
ChEMBLのデータで何か解析してみないと。