LoginSignup
14
13

More than 3 years have passed since last update.

Python 化合物前処理大全

Last updated at Posted at 2020-08-29

はじめに

Pythonでよく使われる化合物の前処理を整理してみた。

環境

今回は以下のライブラリを使用した。インストール方法は参考文献を参照のこと。
MolVSは、化合物の前処理に特化したライブラリだが、RDKitにも取り込まれてるっぽい。

  • rdkit 2020.03.5
  • molvs 0.1.1

前処理大全

RDKit : SanitizeMol

ケクレ化、原子価の確認、芳香族性の設定、共役、ハイブリダイゼーションなどを行う。
参考:
http://rdkit.org/docs/source/rdkit.Chem.rdmolops.html

RDKitからSmilesからmolオブジェクトを生成した場合は、デフォルトで実施されているように見える。自分でmolオブジェクトを編集した後に使う感じ?

MolVS : Normarize

参考:
https://molvs.readthedocs.io/en/latest/guide/standardize.html

一般的な描画エラーを修正し、機能グループを標準化するための一連の変換(直訳っす)。
電荷の修正とか?

とりあえずやってみよう。

from rdkit import Chem
from molvs.normalize import Normalizer, Normalization

old_smiles = "[Na]OC(=O)c1ccc(C[S+2]([O-])([O-]))cc1"
print("PREV:" + old_smiles)
old_mol = Chem.MolFromSmiles(old_smiles)
normalizer = Normalizer(normalizations=[Normalization('Sulfone to S(=O)(=O)', '[S+2:1]([O-:2])([O-:3])>>[S+0:1](=[O-0:2])(=[O-0:3])')])
new_mol = normalizer.normalize(old_mol)
new_smiles = Chem.MolToSmiles(new_mol)
print("NEW:" + new_smiles)

上は、"Sulfone to S(=O)(=O)" で定義されている正規化処理を選択的に実行させている。
その結果は以下の通りとなり、硫黄原子、酸素原子の電荷が変わっている。
なお、引数なしで Normalizer を生成すると、事前にMolVSで定義されている全ての正規化処理が行われる。

PREV:[Na]OC(=O)c1ccc(C[S+2]([O-])([O-]))cc1
NEW: O=C(O[Na])c1ccc(C[S](=O)=O)cc1

MolVS : TautomerCanonicalizer

参考: https://molvs.readthedocs.io/en/latest/guide/tautomer.html
Tautomerとは水素原子の移動を通じて互いに容易に相互変換する分子のセットということらしい。
代表的なものとして、フェノール があげられるそうだ。
(フェノールの例)https://en.wikipedia.org/wiki/File:Phenol_tautomers.svg

やってみよう。

from rdkit import Chem
from molvs.tautomer import TAUTOMER_TRANSFORMS, TAUTOMER_SCORES, MAX_TAUTOMERS, TautomerCanonicalizer, TautomerEnumerator, TautomerTransform

tautomerCanonicalizer = TautomerCanonicalizer((
    TautomerTransform('1,7 aromatic heteroatom H shift r', '[#7,S,O,Se,Te,CX4;!H0]-[#6,#7X2]=[#6]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[NX2,S,O,Se,Te]'),
    ))

mol = Chem.MolFromSmiles("O=C1CC=CC=C1")
print("prev:" + Chem.MolToSmiles(mol))
mol2 = tautomerCanonicalizer.canonicalize(mol)
print("after: "+ Chem.MolToSmiles(mol2))

上は、'1,7 aromatic heteroatom H shift r' というルールで定義されているTautoemerの処理を、フェノールのTautomerに対し、選択的に実行させている。
その結果、以下の通りフェノールが生成される。
なお、引数なしでTautomerCanonicalizerを生成すると、事前にMolVSで定義されている全てのTautoemerの処理が行われる。

prev:O=C1C=CC=CC1
after: Oc1ccccc1

MolVS : LargestFragmentChooser

参考:https://molvs.readthedocs.io/en/latest/api.html#molvs-fragment
ざっくりいうと、複数の分子が含まれる場合に、最大の分子をかえすものである。

やってみよう

from rdkit import Chem
from molvs.fragment import LargestFragmentChooser

flagmentChooser1 = LargestFragmentChooser()
old_smiles = "O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1.[Br-]"
print("prev:" + old_smiles)
mol = Chem.MolFromSmiles(old_smiles)
mol2 = flagmentChooser1(mol)
print("after:" + Chem.MolToSmiles(mol2))

上は、臭素イオンと別の分子がイオン結合したものに LargestFragmentChooser をかけているが、下のように臭素イオンが除かれたものが生成される。

prev:O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1.[Br-]
after:O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1

MolVS : Uncharger (中和)

参考:https://molvs.readthedocs.io/en/latest/api.html#molvs-charge

分子上のイオン化された酸、塩基を中和しようとするものである。
やってみよう。

from molvs.charge import Reionizer, Uncharger

uncharger = Uncharger()
mol = Chem.MolFromSmiles("c1cccc[nH+]1")
print("prev:" + Chem.MolToSmiles(mol))
mol2 = uncharger(mol)
print("after:" + Chem.MolToSmiles(mol2))

上は、イオン化された酸、塩基を含む分子であるが、Uncharger をかけると下のように中和される。

prev:c1cc[nH+]cc1
after:c1ccncc1

おわりに

今回紹介できなかったものとして、"MolVS : reionization"、"MolVS : Disconnect metals" 等の処理があったが、いまいち対象の化合物がイメージできなかったので説明を省略している。詳細は参考文献を見てほしい。

参考文献

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13