RDKitで一気にタニモト係数を計算する

最近知ったのですがRDKit分子のリストからタニモト係数を一気に求めるには
BulkTanimotSimilarity関数を使うといいということでした。
今までは

from rdkit import Chem, DataStructs
from rdkit.Chem import AllChem
mols =[ m for m in Chem.SDMolSupplier("first_200.props.sdf") ]
fps = [ AllChem.GetMorganFingerprint(m,2) for m in mols ]

for i in range(len(fps)):
    tanimoto = DataStructus.TanimotoSimilarity(fps[0], fps[i])

とか書いて順次タニモト係数を計算して適当にリストに入れこんだりしていましたが

from rdkit import Chem, DataStructs
from rdkit.Chem import AllChem

mols =[ m for m in Chem.SDMolSupplier("first_200.props.sdf") ]
fps = [ AllChem.GetMorganFingerprintAsBitVect(m,2) for m in mols ]

tsims = DataStructs.BulkTanimotoSimilarity(fps[0],fps)

とするとindex 0 の分子とリストのタニモト係数の計算結果のリストを返してくれます。
コードがちょっと短くなります。
上の例だ自分自信のシミラリティも計算してしまうので

simmat = []
for i in range(len(fps)):
    tsims = DataStructs.BulkTanimotoSimilarity(fps[i],fps[:i])
    simmat.append(tsims)

とか書くと三角行列になるかと思います。
クラスタリングなんかに使えるかな。
距離にするなら1.0-タニモト係数の結果を使うとよさそうです。
補足
RDKitのMorgan法によるFingerPrintでは半径を指定するのでpipelinepilotのECFP4に相当するFPを得るためにはMorganFPでは2を引数に当てるようです。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s