Help us understand the problem. What is going on with this article?

Python 化合物前処理大全

はじめに

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

参考文献

kimisyo
主にライフサイエンス分野向けサービス開発を行っています。これからはライフサイエンスの時代です。化学、AI(機械学習)を中心に、学んだこと、経験したことをシェアしていきます。
https://github.com/kimisyo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした