はじめに
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" 等の処理があったが、いまいち対象の化合物がイメージできなかったので説明を省略している。詳細は参考文献を見てほしい。