#はじめに
RDKitで、クエリ化合物に対し、ターゲットデータベース(といってもただのSDF)から類似化合物を検索するのにどの程度の時間がかかるのだろうか、ということが気になったためコマンドを書いてみた。
#ソース
類似度を計算する場合、フィンガープリントを生成し、Tanimoto係数で類似度スコアを求めるのが一般的だ。フィンガープリントは化学構造をビット化したもので様々な手法が存在する。ここではビット数が少なくメジャーなMACCS Keysを利用してみた。
import argparse
from rdkit import Chem
from rdkit.Chem import Descriptors, AllChem
from rdkit import rdBase, Chem, DataStructs
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-query", type=str, required=True)
parser.add_argument("-target_db", type=str, required=True)
args = parser.parse_args()
# queryの読み込み
mol_block = ""
with open(args.query) as f:
for line in f:
mol_block += line
query_mol = Chem.MolFromMolBlock(mol_block)
# SDFの読み込み
target_sdf_sup = Chem.SDMolSupplier(args.target_db)
# FignerPrintの計算(query)
query_fp = AllChem.GetMACCSKeysFingerprint(query_mol)
# FignerPrintの計算(target)
target_fps = [AllChem.GetMACCSKeysFingerprint(mol) for mol in target_sdf_sup]
for i, target_fp in enumerate(target_fps):
result = DataStructs.TanimotoSimilarity(query_fp, target_fp)
print(i, result)
if __name__ == "__main__":
main()
#使い方
こんな感じ。argparseちゃんありがとう。
usage: StructureSimilaritySearch.py [-h] -query QUERY -target_db TARGET_DB
optional arguments:
-h, --help show this help message and exit
-query QUERY(mol)
-target_db TARGET_DB(sdf)
#処理時間
例によってRDkitのSolubilityのtrainデータ1024件をtargetにして検索。queryは適当です。
そうすると、1秒程度で返却。万単位ならこのままでもそこそこいけそうだ。
#参考