【RDKit】Pythonを使って分子を描く（基本編）

## はじめに
**[RDKit](https://www.rdkit.org/docs/)で分子を描く方法を紹介いたします。**

- 初めてRDKitを使う方
- Pythonで分子を描いてみたいけど方法がよく分からないという方

の参考になれば幸いです。

※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

## RDKitとは
RDKitは化合物をPythonで扱うためのライブラリです。有志の方による[ドキュメントの日本語訳のページ](https://www.rdkit.org/docs_jp/index.html)もあります。[こちら](https://future-chem.com/rdkit-intro/)のサイトにもRDKitの概要が書かれておりますので、是非ご参考にして下さい。 

### 環境
- windows10
- conda 4.9.2
- python 3.7.1
- rdkit 2020.03.2.0

## 分子の描画
### 1分子の描画
「実践マテリアルズインフォマティクス」の第1章を参考にしていきます。データは[サポートページ](https://github.com/funatsu-lab/support-page/tree/master/data/delaney-solubility)から読み込みました。文献はCoLab環境で実行していますが、JupyterNotebook上では上手くデータの読み込みができなかったので、[こちら](https://qiita.com/ground0state/items/b9318d5443f3462aadeb)のサイトを参考にcsvファイルの読み込みを行いました。

```python
# データの読み込みを行い、読み込んだデータをデータフレームとして表示
import requests
import io
import pandas as pd

url = 'https://raw.githubusercontent.com/funatsu-lab/support-page/master/data/delaney-solubility/delaney-processed.csv'
res = requests.get(url).content
df = pd.read_csv(io.StringIO(res.decode('utf-8')), header=0, index_col=0)
df.head()
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/405ca87f-8620-f695-36cc-cfa54ebe18b9.png" width="120%">


データフレームの先頭行のAmigdalin(アミグダリン)を描画していきます。

```python
from rdkit import Chem
smiles = df.iloc[0,-1]
m = Chem.MolFromSmiles(smiles)
m
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/17044e68-c774-b34f-62ab-6b3e5425688a.png" width="40%">

Amigdalinを表示することができました。Amigdalinのsmiles表記は'OCC3OC(OCC2OC(OC(C#N)c1ccccc1)C(O)C(O)C2O)C(O)C(O)C3O 'であり、smiles表記を直接コードに打ち込んで描画することも可能です。

```python
m = Chem.MolFromSmiles('OCC3OC(OCC2OC(OC(C#N)c1ccccc1)C(O)C(O)C2O)C(O)C(O)C3O ')
m
```

描画した分子の画像は以下のコードで保存ができます。

```python
from rdkit.Chem import Draw
Draw.MolToFile(m, 'Amigdalin.png')
```

### 複数分子の描画
[RDKitのGitHubページ](https://github.com/rdkit/rdkit/tree/master/Docs/Book/data)から取得した"'5ht3ligs.sdf'"のデータを読み込んで、描画していきます。

```python
#複数データの読み込み（全4分子が含まれている）
suppl = Chem.SDMolSupplier('5ht3ligs.sdf')
#構造を可視化
Draw.MolsToGridImage(suppl, molsPerRow=len(suppl)) 
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/07c05701-1527-cae4-b515-3b017ea623e6.png" width="100%">

描画した分子の画像は以下のコードで保存ができます。

```python
img = Draw.MolsToGridImage(suppl,molsPerRow=len(suppl),subImgSize=(200,200))
img.save("5ht3ligs.png")
```

なお、以下のコードで読み込んだ分子の原子数やsmilesを表示することが可能です。読み込んだデータの中身を詳しく知りたいときに活用できるかと思います。

```python
#複数データの読み込み（全4分子が含まれている）
suppl = Chem.SDMolSupplier('5ht3ligs.sdf')
# smilesを格納するための空のリストを作成
smiles = []

for mol in suppl:
    #各分子の原子数の表示
    print(mol.GetNumAtoms())
    #mol→smilesへ変換してデータとして格納
    smiles.append(Chem.MolToSmiles(mol))
    print(Chem.MolToSmiles(mol))
```
```:出力結果
20
CN1CCCCC1COC(=O)c1c[nH]c2ccccc12
24
COCCOc1cc(N)c(Cl)cc1C(=O)NC1CN2CCC1CC2
24
C#CCn1c2c(c3ccccc31)C(=O)C(Cc1nc[nH]c1C)CC2
26
Cc1csc2c1-n1cccc1/C2=N/OC(CCN(C)C)c1ccccc1
```

## まとめ
RDKitを用いて、以下の2つの方法についてご紹介いたしました。

- 1分子を読み込み、描画する
- 複数分子を読み込み、描画する

### 参考
- [RDKit](https://www.rdkit.org/docs/)
- [RDKit日本語ドキュメント](https://www.rdkit.org/docs_jp/index.html)
- [化学の新しいカタチ](https://future-chem.com/rdkit-intro/)
- [実践マテリアルズインフォマティクス　サポートページ](https://github.com/funatsu-lab/support-page/tree/master/data/delaney-solubility)
- [CSVへの直URLからデータを読み込む](https://qiita.com/ground0state/items/b9318d5443f3462aadeb)