rdMolDraw2Dモジュールを使って構造式描画をカスタマイズ

[ブログ本編（実践ケモインフォマティクス）](https://datadriven-rnd.com/2021-02-11-141541/)もよろしくお願いします。

類似度マップ（SmililarityMaps）を用いずに、描画方法をカスタマイズ（構造式にハイライトをつけたり、原子をインデックス表示にしたり etc...）についてまとめた。
（本記事は<a href="https://future-chem.com/rdkit-2ddraw-svg/">「化学の新しいカタチ」</a>の内容を簡潔にまとめたものです。より詳しい内容は、そちらに載っています）
<h2 id="描画の流れ">描画の流れ</h2>
描画を色々カスタマイズする場合には、<strong>rdMolDraw2Dモジュール</strong>を使用する。
このモジュールを使用する場合には、以下の手順をふむ必要がある。

<a href="https://future-chem.com/rdkit-2ddraw-svg/#rdMolDraw2D">参考HP</a>より
<blockquote>
<ol>
 	<li>コンテナとなるオブジェクトの作成</li>
 	<li>コンテナの細かい描画設定</li>
 	<li>コンテナに描画したい分子を追加</li>
 	<li>コンテナファイナライズして書き込んだデータを取り出す</li>
 	<li>データを描画，またはファイルとして保存</li>
</ol>
</blockquote>
<h2 id="コード">コード</h2>
<h3 id="モジュールのインストール">モジュールのインストール</h3>

```
conda install -c conda-forge rdkit
```

<h3 id="分子の準備">分子の準備</h3>

```python
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from matplotlib.colors import ColorConverter

mol = Chem.MolFromSmiles('Cn1c(=O)c2c(ncn2C)n(C)c1=O')
smiles = Chem.MolToSmiles(mol)

# とりあえずDraw.MolToImage(mol)で描画
img = Draw.MolToImage(mol)
img.save('caffeine_molecule.png',bbox_inches='tight')
img
```

<center><img class="aligncenter size-full wp-image-360" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210211140758.png" alt="" width="320" height="280" /></center>
<h3 id="基本操作">基本操作</h3>

```python
# 1. コンテナを準備（コンテナサイズは300x300とする)
view = rdMolDraw2D.MolDraw2DSVG(300, 300)

# 2.描画設定
option = view.drawOptions()
option.circleAtoms=False
option.continuousHighlight=False

# 3.コンテナに分子を追加
#単一分子の追加
tm = rdMolDraw2D.PrepareMolForDrawing(mol)
#tm = rdMolDraw2D.DrawMolecules(mols)

#複数分子の追加
#tm = rdMolDraw2D.DrawMolecules(mols)
view.DrawMolecule(tm)

# 4.コンテナファイナライズして書き込んだデータを取り出す
view.FinishDrawing()

# 5.6コンテナの描画と保存
svg = view.GetDrawingText()

#保存
with open('caffein_test.svg', 'w') as f:
	f.write(svg)
	
#描画
SVG(svg)
```

&nbsp;

<center><img class="aligncenter size-full wp-image-362" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210211140758-1.png" alt="" width="320" height="280" /></center>
何も設定を変えていないのでDraw.MolToImage(mol)使用時と同じ絵になる。
<h3 id="それぞれのメソッドのオプションなど">それぞれのメソッドのオプションなど</h3>
（<a href="https://future-chem.com/rdkit-2ddraw-svg/#rdMolDraw2D">新しい化学のカタチ</a>より転記）

<details><summary>MolDraw2DSVG.DrawMolecule(mol)などのDrawメソッド</summary>
<div>

&nbsp;
<table>
<thead>
<tr>
<th style="text-align: center;">オプション</th>
<th style="text-align: left;">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">highlightAtoms</td>
<td style="text-align: left;">ハイライトする原子のリスト</td>
</tr>
<tr>
<td style="text-align: center;">highlightAtomColors</td>
<td style="text-align: left;">ハイライトする原子の色</td>
</tr>
<tr>
<td style="text-align: center;">highlightAtomRadii</td>
<td style="text-align: left;">ハイライトする原子の半径を設定</td>
</tr>
<tr>
<td style="text-align: center;">highlightBonds</td>
<td style="text-align: left;">ハイライトする結合のリスト</td>
</tr>
<tr>
<td style="text-align: center;">highlightBondColors</td>
<td style="text-align: left;">ハイライトする結合の色</td>
</tr>
<tr>
<td style="text-align: center;">legend(s)</td>
<td style="text-align: left;">凡例</td>
</tr>
</tbody>
</table>
&nbsp;

</div>
</details><details><summary>MolDraw2DSVG.drawOptions()</summary>
<div>

<strong>オプション</strong>
<table>
<thead>
<tr>
<th style="text-align: center;">オプション</th>
<th style="text-align: left;">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">atomLabelDeuteriumTritium</td>
<td style="text-align: left;">重水素をD， トリチウムをTで表記</td>
</tr>
<tr>
<td style="text-align: center;">atomLabels</td>
<td style="text-align: left;">原子Idで指定した原子のラベルを設定</td>
</tr>
<tr>
<td style="text-align: center;">additionalAtomLabelPadding</td>
<td style="text-align: left;">元素記号と結合との間にどの程度マージンを取るか</td>
</tr>
<tr>
<td style="text-align: center;">circleAtoms</td>
<td style="text-align: left;">ハイライトするアトムを円で表示するかどうか
デフォルト：True</td>
</tr>
<tr>
<td style="text-align: center;">continuousHighlight</td>
<td style="text-align: left;">ハイライト領域を塗りつぶすかどうか
デフォルト：True</td>
</tr>
<tr>
<td style="text-align: center;">fillHighlights</td>
<td style="text-align: left;">ハイライトするアトムの円を塗りつぶすかどうか
デフォルト：True</td>
</tr>
<tr>
<td style="text-align: center;">padding</td>
<td style="text-align: left;">描画領域のうちのマージンの割合（０〜１）</td>
</tr>
<tr>
<td style="text-align: center;">legendFontSize</td>
<td style="text-align: left;">凡例のフォントサイズ（px単位）</td>
</tr>
<tr>
<td style="text-align: center;">multipleBondOffset</td>
<td style="text-align: left;">多重結合の2つ目以降の線をどの程度離して描画するか
（オングストローム単位）</td>
</tr>
<tr>
<td style="text-align: center;">addAtomIndices</td>
<td style="text-align: left;">原子Idを構造式中に表示
デフォルト：False</td>
</tr>
<tr>
<td style="text-align: center;">addBondIndices</td>
<td style="text-align: left;">結合Idを構造式中に表示
デフォルト：False</td>
</tr>
<tr>
<td style="text-align: center;">annotationFontScale</td>
<td style="text-align: left;">原子や結合に付記する注釈のフォントサイズ（割合指定）
デフォルト：0.75</td>
</tr>
<tr>
<td style="text-align: center;">addStereoAnnotation</td>
<td style="text-align: left;">絶対配置R/Sや幾何異性E/Zの表示有無
デフォルト：False</td>
</tr>
</tbody>
</table>
<strong>メソッド</strong>
<table>
<thead>
<tr>
<th style="text-align: center;">メソッド</th>
<th style="text-align: left;">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">useBWAtomPalette</td>
<td style="text-align: left;">構造式を白黒で描画する</td>
</tr>
<tr>
<td style="text-align: center;">useDefaultAtomPalette</td>
<td style="text-align: left;">構造式描画に用いる色をデフォルトに戻す</td>
</tr>
<tr>
<td style="text-align: center;">updateAtomPalette</td>
<td style="text-align: left;">構造式描画に用いる色を，原子番号とRGBのタプルを組とする辞書形式で指定する</td>
</tr>
<tr>
<td style="text-align: center;">setBackgroundColour</td>
<td style="text-align: left;">キャンバス色の変更する</td>
</tr>
<tr>
<td style="text-align: center;">setHighlightColour</td>
<td style="text-align: left;">ハイライト領域のデフォルト色を変更する</td>
</tr>
</tbody>
</table>
</div>
</details>
<h3 id="描画をカスタマイズする">描画をカスタマイズする</h3>
原子のラベルとハイライトする色を変更してみる。その他にも細々設定する（コード内に説明付記）
（ハイライトする色はmatplotlibをつかって生成したRGBカラーコードを使う）

```python
#RGBカラーコードを生成
color1 = ColorConverter().to_rgb('cyan')
color2 = ColorConverter().to_rgb('skyblue')
color3 = ColorConverter().to_rgb('yellow')
print('cyan:',color1)
print('skyblue:',color2)
print('yellow:',color3)
"""output
cyan: (0.0, 1.0, 1.0)
skyblue: (0.5294117647058824, 0.807843137254902, 0.9215686274509803)
yellow: (1.0, 0.0, 0.0)
"""

# ハイライトする原子と色，円の半径を設定
atoms = [6,8]
atom_colors = {6: color1, 8: color2}
radii = {6: 0.5, 8: 0.5}

# ハイライトする結合と色を指定
bonds = [1,2,3,4,5]
bonds_colors = {1:color1,2:color2,3:color3,4:color3,5:color3}

# コンテナの準備
view = rdMolDraw2D.MolDraw2DSVG(300,350)
tm = rdMolDraw2D.PrepareMolForDrawing(mol)

# 描画オプションの設定
#フォントサイズをやや小さくする
view.SetFontSize(0.9 * view.FontSize())
option = view.drawOptions()

#原子ラベルを設定する
option.atomLabels[6] = 'N1'
option.atomLabels[8] = 'N2'

#二重結合の幅
option.multipleBondOffset=0.07

#描画領域のマージン
option.padding=0.11

#レジェンドのフォントサイズ
option.legendFontSize=20

# コンテナに分子を登録
view.DrawMolecule(tm,
highlightAtoms=atoms,
highlightAtomColors=atom_colors,
highlightAtomRadii=radii,
highlightBonds=bonds,
highlightBondColors=bonds_colors,
legend='caffeine')

#ファイナライズ、保存、描画
view.FinishDrawing()
svg = view.GetDrawingText()
with open('caffein_test.svg', 'w') as f:
	f.write(svg)
SVG(svg)
```

<center><img class="aligncenter size-full wp-image-363" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210211140638.png" alt="" width="303" height="335" /></center>
<h2 id="参考">参考</h2>
<ul>
 	<li><a href="https://future-chem.com/rdkit-2ddraw-svg/#rdMolDraw2D">RDKitでの構造式描画を詳しく解説</a></li>
</ul>