多様性を保ちながらできるだけコンパクトに
あなたは大規模な化合物データセットからin silicoスクリーニングを行い、有望な5000化合物のリストを作成しました。
しかし、この化合物リストをアッセイ担当の研究者に渡すと
「5000化合物もアッセイできるわけないでしょう、30個ぐらいに絞ってください」
と言われてしまいました。
このような場合、あなたは素直にin silicoスクリーニング上位の30化合物に絞るでしょうか?
ほとんどの場合はNoです。なぜなら上位30の化合物は似たものばかり(置換基の位置が微妙に違うとか)が集まっていることが多いからです。
そこで、現実的には in silicoスクリーニングでのスコアがある程度以上の化合物から、多様性を考慮して30化合物を選ぶことになるでしょう。
では化合物の多様性をどのように評価すればよいのでしょう?
ひとつの方法は適当なフィンガープリント手法によって化合物をベクトル化し、サンプル間の距離を評価することです。 この方法はよく行われるし有用ではあるのですが、化合物間の距離に大小について人間では直感的に理解しづらい傾向があります。 horomary.hatenablog.com
今回は、よりシンプルなやり方を採用しましょう。
Murcko scaffolds に基づき、化合物骨格で分子をざっくりとクラスタリングした上で各クラスタの上位化合物を候補化合物として提出するのです。
この手法は人間的直観によく合致するので、人間(つまりはあなたが)が候補化合物リストとにらめっこして化合物を絞る作業を自動化するような効果が期待できます。
Murcko scaffolds とは
Murcko scaffolds については、下記の論文で詳細に記述されています。
The Properties of Known Drugs. 1. Molecular Frameworks https://pubs.acs.org/doi/10.1021/jm9602928
Murcko scaffoldsでは、化合物から余分な側鎖を取り払い、"環構造"とそれらをつないでいる"Linker"のみで表現することでより単純な化合物表現を行います。
下記は少し異なるBemis-Murcko scaffoldsですが視覚的にわかりやすい図を掲載しています。
docs.chemaxon.com
RDkitでMurcko scaffoldsの取得
使用したマルチsdfはdelaney水溶解度データセットから作成しました。
from rdkit import Chem from rdkit.Chem.Scaffolds import MurckoScaffold sdfloader = Chem.SDMolSupplier("delaney.sdf") ### load from multisdfile mol_list = [ mol for mol in [sdfloader[i] for i in range(len(sdfloader))] if mol is not None] smi_scaffolds = [ MurckoScaffold.MurckoScaffoldSmiles(mol=mol, includeChirality=False) for mol in mol_list] mol_scaffolds = [Chem.MolFromSmiles(smi_scaffold) for smi_scaffold in smi_scaffolds]
結果を可視化してみましょう。
from rdkit.Chem import Draw from rdkit.Chem.Draw import IPythonConsole Draw.MolsToGridImage(mol_list[:12], molsPerRow=4, subImgSize=(200,200)) # source compounds Draw.MolsToGridImage(mol_scaffolds[:12], molsPerRow=4, subImgSize=(200,200)) # Murco scaffolds
元の化合物 Murcko scaffolds 環構造を全く持たない化合物についてはMurcko scaffoldsが定義されないことに注意しましょう。
Murcko scaffoldsに基づくクラスタリング
1128化合物で構成されるdelaney dataset を Murcko scaffolds でクラスタリングしていきます。
scaffolds = {} clusters_list =[] idx = 1 for mol in mol_list: scaffold_smi = MurckoScaffold.MurckoScaffoldSmiles(mol=mol, includeChirality=False) if scaffold_smi not in scaffolds.keys(): scaffolds[scaffold_smi] = idx idx+=1 cluster_id = scaffolds[scaffold_smi] clusters_list.append(cluster_id)
print("Num of dataset:",len(mol_list)) >>> Num of dataset: 1128 print("Num of Murcko scaffolds in dataset:",len(scaffolds.keys())) >>> Num of Murcko scaffolds in dataset: 269
1128化合物が269のクラスタに分類されました。
テストとしてcluster_id == 15 のクラスタにどのような化合物が含まれるか確かめてみましょう。
import numpy as np clusters_list = np.array(clusters_list) idx_c15 = np.where(clusters_list==15)[0] mol_list_c15 = [ mol_list[i] for i in idx_c15] Draw.MolsToGridImage(mol_list_c15, molsPerRow=3, subImgSize=(200,200))
どうやらクラスター15はピリミジン誘導体のクラスタだったようです。
おわりに
分子フィンガープリントと分子骨格に基づく多様性評価を併用することは、例えばより良いハイスループットスクリーニング用の分子ライブラリを作成したい場合などに有用でしょう。
また、化合物構造活性相関において機械学習を行いたい場合にも有用です。 DeepChemの Scaffold spliter は、Murcko scaffolds に基づいて化合物データセットを分割しています。