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

〜主にケモインフォマティクス, 個人的備忘録, 理論より実践重視〜

BRICSBuildによる分子構造生成

はじめに

BRICSによって生成したフラグメントを組み合わせることで新しい分子構造を生成する。(BRICSについて) 生成した分子群(仮想分子ライブラリー)は逆解析時の候補分子として利用可能。 このような構造生成器を Building blockタイプと呼ばれる。このタイプは化学構造としては妥当なものを生成しやすいことが長所。

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

前準備

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

conda install -c conda-forge rdkit

コード

モジュールのインポート

import numpy as np
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw, BRICS, Recap, Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors

フラグメントの準備

水溶解度データ(金子研究室HPのデータセット)に含まれる1290分子の構造をフラグメント化する。 複雑な構造(分子量300以上)のフラグメントは削除する。

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

###1290分子を分解してフラグメントを準備する
fragment_set = set()
for mol in mols_list:
    fragment = BRICS.BRICSDecompose(mol)
    fragment_set = fragment_set | fragment

fragment_smiles = list(fragment_set)
fragment_list = np.array([Chem.MolFromSmiles(smiles) for smiles in fragment_smiles])

#複雑なフラグメント(分子量300以上)は削除する
descriptor_calc = MoleculeDescriptors.MolecularDescriptorCalculator(['MolWt'])
MolWt_list = np.array([descriptor_calc.CalcDescriptors(mol)[0] for mol in fragment_list])

fragment_list = np.array(fragment_list)[np.where(MolWt_list<=300)]

#先頭6フラグメントだけ描画してみる
img = Draw.MolsToGridImage(fragment_list[:3], molsPerRow=3,legends=fragment_smiles[:3])
img.save('fragment_BRICS.png')
img

image.png

BRICSBuildを用いた分子生成

### smilesをMOLオブジェクトに変換し,ジェネレーターを作成
builder = BRICS.BRICSBuild(fragment_list)

### 分子2000個を作成し,シャッフル
generated_mols = [next(builder) for x in range(2000)]

#返された分子はサニタイズされていない(=整えられていない?)ので、原子価を更新した方がよいとのこと。
for mol in generated_mols:
    mol.UpdatePropertyCache(strict=True)
    
#25分子だけ描画してみる
np.random.shuffle(generated_mols)
img = Draw.MolsToGridImage(generated_mols[:25], molsPerRow=5)
img.save('generated_mols.png')
img

image.png

参考