RDKit環境構築を行いjupyter-notebookでベンゼンを表示させる

# 概要

chemoinfomaticsで使われるpythonのmoduleのRDKitをjupyter-notebookで使う際、環境構築にてこづったのでここに書き記します。


# 環境

macOS Mojave version 10.12.2

# RDKitを使う仮想環境を構築

[RDKitの公式ドキュメント](https://www.rdkit.org/docs/Install.html#)に沿って、RDKitを使える仮想環境を``conda``コマンドで作成。

```
conda create -c rdkit -n my-rdkit-env rdkit # my-rdkit-env は任意の環境名
```
しばらくすると

```
Proceed ([y]/n)?
```
と聞かれるので``y``で続行。各種moduleのinstallが始まります。install終了後

```
conda activate my-rdkit-env
```
と入力。terminalの行の左に``(my-rdkit-env)``と出ているはずです。これは``my-rdkit_env``といい仮想環境に入っていることを表します。``conda deactivate``で仮想環境から出られます。

ここでこの仮想環境に必要なmoduleをinstallします。
ここではrdkitと一緒によく使われる``pubchempy``をinstallします。

```
pip install pubchempy
```

``python3``と入力し、python consoleに入ります。

```
>>> from rdkit import Chem
>>> Chem.MolFromSmiles('C1=CC=CC=C1') # 'C1=CC=CC=C1'はbenzeneのsmiles表記
<rdkit.Chem.rdchem.Mol object at 0x109bc6030>
```

となればとりあえず仮想環境構築完了です。

# jupyter-notebookで仮想環境を使用


[こちらの記事](http://d.hatena.ne.jp/mopper27/20181102/1541171288)が非常にわかりやすくまとめてくださっているので参考にします。

python cosoleから出て、

```
$ pip install environment_kernels
```

と入力し、Jupyter上でカーネルを切り替えるパッケージをインストール。次に、

```
jupyter notebook --generate-config
```
でjupyterの設定ファイルを作成。

``~/.jupyter/jupyter_notebook_config.py``の最終行に以下のcodeを追記。

```
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['C:/Program Files/Anaconda3/envs/']
```

```
pip install jupyter
```

でjupyterをinstallして、

```
jupyter notebook
```
でjupyter-notebookを起動させる。
すると``my-rdkit-env``を選べるようになっています。

<img width="624" alt="スクリーンショット 2019-01-28 21.27.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/350253/172225f5-d5a1-565e-31ea-74c2666aa4fe.png">


# ベンゼンを描く

さあ、ついにjupyter-notebookでベンゼンを描くところまできました！
以下のコードでbenzeneができます。

```
from rdkit import Chem
from rdkit.Chem import Draw
benzene = Chem.MolFromSmiles('C1=CC=CC=C1')
Draw.MolToImage(benzene)
```
![benzene.png](https://qiita-image-store.s3.amazonaws.com/0/350253/2896e792-7e6e-8f53-2369-dee91b3ae3a5.png)


ただ、少し表示が汚いですね...
本来は複数分子を表示するmethodですが、``MolsToGridImage``を使えば綺麗に表示できます。

```
Draw.MolsToGridImage([benzene])
```

![benzene2.png](https://qiita-image-store.s3.amazonaws.com/0/350253/aeb52be3-8505-31bf-1d47-546d1751935d.png)

``pubchempy``から取得した情報でも構造式を描くことができます。
ただし、``pcp.get_compounds``で取得したものは``pubchempy.Compound``型のlistであり``rdkit.Chem.rdchem.Mol``とは異なります。そのため要素を取り出し、smiles記法を介して``rdkit.Chem.rdchem.Mol``に変換します。


```
import pubchempy as pcp
tmp = pcp.get_compounds('benzene', 'name')[0]
benzene = Chem.MolFromSmiles(tmp.isomeric_smiles)
Draw.MolsToGridImage([benzene])
```
![benzene2.png](https://qiita-image-store.s3.amazonaws.com/0/350253/aeb52be3-8505-31bf-1d47-546d1751935d.png)


この方法を用いれば、化合物名があれば、smiles記法で指定しなくとも様々な分子を表示できます。

```
tmp = pcp.get_compounds('anthracene', 'name')[0]
anthracene = Chem.MolFromSmiles(tmp.isomeric_smiles)
Draw.MolsToGridImage([anthracene])
```

![anthracene.png](https://qiita-image-store.s3.amazonaws.com/0/350253/daa20a7d-d07e-5439-41f9-72dde8a6fa37.png)

さらに、pngファイル保存もできます。
ただ、少しダサい表示の方(Chem.Draw.NolTOImage)ですね...
jupiter-notebook上の画像を保存した方が良いかもしれません。

```
Draw.MolToFile(benzene, 'benzene.png')
```

![benzene.png](https://qiita-image-store.s3.amazonaws.com/0/350253/8c994359-ea49-50c2-4925-03b346103473.png)

# 参考

[RDKit公式ドキュメント](https://www.rdkit.org/docs)
[PubChemPy公式ドキュメント](https://pubchempy.readthedocs.io/en/latest/index.html)
[Anacondaで作った仮想環境をjupiter notebookで使う方法](http://d.hatena.ne.jp/mopper27/20181102/1541171288)