実践ケモインフォマティクス

〜主にケモインフォマティクス, 個人的な備忘録〜

RDkitを用いた分子操作(分子のフラグメント化)


逆解析(分子探索)を行う際の、分子の生成に使用する部分構造(フラグメント)を準備する。

今回は、水溶解度データ(金子研究室HPのデータセット)に含まれる1290分子の構造をフラグメント化する。

検討するフラグメント手法は以下の2つ

  • RECAP:分子を合成する際に逆合成の可能性が高い構造(アミド基やエステル基など11種類の部分構造)に基づいてフラグメント化する。(Retrosynthetic Combinatorial Analysis Procedure)
  • BRICS:RECAPで着目していた11種類の構造を16種類に拡張したもの。(Breaking of Retrosynthetically Interesting Chemical Substructures)

前準備

モジュールのインストール

conda install -c conda-forge rdkit

メインコード

モジュールのインポート

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw, BRICS, Recap

データの準備

suppl = Chem.SDMolSupplier('logSdataset1290_2d.sdf')
mols_list = [mol for mol in suppl if mol is not None]

RECAPによるフラグメント化

1分子のみ分解してみる(お試し)

mol_test = Chem.MolFromSmiles('O=c1c(OC2OC(CO)C(O)C(O)C2O)c(-c2ccc(O)c(O)c2)oc2cc(O)cc(O)c12')
Draw.MolToFile(mol_test,'mol_test.png')
f:id:chemoinfo-ottantacinque:20210130231427p:plain
#RECAPの実行分解
decomp = Chem.Recap.RecapDecompose(mol_test)

#1段階目のフラグメント化で得られた分子を描画してみる。
first_gen = [node.mol for node in decomp.children.values()]
img = Draw.MolsToGridImage(first_gen, molsPerRow=4, legends=[Chem.MolToSmiles(m) for m in first_gen])
img.save('first_gen.png')
f:id:chemoinfo-ottantacinque:20210130231516p:plain
#leaf(これ以上分解できないフラグメント)を描画する
leaves = [leaf.mol for leaf in decomp.GetLeaves().values()]
img = Draw.MolsToGridImage(leaves, molsPerRow=4,legends=[Chem.MolToSmiles(m) for m in leaves])
img.save('leaves.png')
f:id:chemoinfo-ottantacinque:20210130231553p:plain

三つのフラグメントに分割できた。

1290分子を分解する

leaves_list = []
for mol in mols_list:
    decomp = Chem.Recap.RecapDecompose(mol)
    leaves = [leaf.mol for leaf in decomp.GetLeaves().values()]
    leaves_list = leaves_list + leaves
    
#smilesに変換して重複を削除する
leaves_list = list(set([Chem.MolToSmiles(mol) for mol in leaves_list]))
print('number of fragments:', len(leaves_list))
# >>>number of fragments: 537

#先頭10フラグメントだけ描画してみる
fragments10 = [Chem.MolFromSmiles(smiles) for smiles in leaves_list[:10]]
img = Draw.MolsToGridImage(fragments10, molsPerRow=5,legends=leaves_list[:10])
img.save('fragments10_RECAP.png')
f:id:chemoinfo-ottantacinque:20210130231637p:plain

合計537個のフラグメントに分割できた。

BRICSによるフラグメント化

1分子のみ分解してみる(お試し)

mol_test = Chem.MolFromSmiles('O=c1c(OC2OC(CO)C(O)C(O)C2O)c(-c2ccc(O)c(O)c2)oc2cc(O)cc(O)c12')
Draw.MolToFile(mol_test,'mol_test.png')

#BRICSの実行
decomp = BRICS.BRICSDecompose(mol_test)
fragments = [Chem.MolFromSmiles(smiles) for smiles in decomp]

img = Draw.MolsToGridImage(fragments, molsPerRow=5,legends=leaves_list[:10])
img.save('fragments_BRICS.png')
f:id:chemoinfo-ottantacinque:20210130231718p:plain

切断位置にダミーアトム([1]や[2]など)を挿入したSMILESのsetが得られる。 また、分解の際に考慮する構造の種類が多いため、RECAPの場合と比べて生成したフラグメントの数が多い。

1290分子を分解する

fragment_set = set()
for mol in mols_list:
    fragment = BRICS.BRICSDecompose(mol)
    fragment_set = fragment_set | fragment

fragment_list = list(fragment_set)

print('number of fragments:', len(leaves_list))
# >>>number of fragments: 1121

#先頭10フラグメントだけ描画してみる
fragments10 = [Chem.MolFromSmiles(smiles) for smiles in fragment_list[:10]]
img = Draw.MolsToGridImage(fragments10, molsPerRow=5,legends=fragment_list[:10])
img.save('fragments10_BRICS.png')
f:id:chemoinfo-ottantacinque:20210130231800p:plain

RECAPでは537個のフラグメントを生成したのに対して、BRICSでは1121個ものフラグメントが生成できた。

ダミーアトムのナンバリングが異なるフラグメントは同一構造だとみなされていないため、厳密には全てのナンバリングを "*" へ変換してカウントする必要がある。

参考