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

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

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

```python
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

やってみよう。

```python
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
ざっくりいうと、複数の分子が含まれる場合に、最大の分子をかえすものである。

やってみよう

```python
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

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

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

#参考文献
- http://www.rdkit.org/
- https://molvs.readthedocs.io/en/latest/index.html