分子記述子への各原子の寄与率を可視化する

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

原子ごとに類似度の寄与率を可視化することができるメソッド<strong>SimilarityMaps</strong>を使って、TPSAなどの分子記述子に対する各原子の寄与を可視化する方法についてまとめた。
(本記事は<a href="https://future-chem.com/rdkit-similarity-map/">「化学の新しいカタチ」</a>の内容を簡潔にまとめたものです。より詳しい内容は、そちらに載っています。
<h2 id="準備">準備</h2>
<h3 id="モジュールのインストール">モジュールのインストール</h3>

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

<h2 id="コード">コード</h2>
<h3 id="分子の準備">分子の準備</h3>
練習用分子としてカフェイン分子を使用する。

```python
import numpy as np
import matplotlib.pyplot as plt
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw, rdMolDescriptors
from rdkit.Chem.Draw import SimilarityMaps

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

img = Draw.MolToImage(mol)
img.save('caffeine_molecule.png',bbox_inches='tight')
img
```


<center>
<img class="aligncenter size-full wp-image-352" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210210232623.png" alt="" width="300" height="300" /></center>
<h3 id="MolLogPへの寄与の計算と可視化">MolLogPへの寄与の計算と可視化</h3>

```python
#_CalcCrippenContribs:各原子ごとに（MolLogPへの寄与，MolMRへの寄与）を格納したタプルが得られる。
crippen = rdMolDescriptors._CalcCrippenContribs(mol)
mol_log = []
mol_mr = []

for x, y in crippen:
	mol_log.append(x)
	mol_mr.append(y)
	
fig = SimilarityMaps.GetSimilarityMapFromWeights(mol,
												mol_log,
												colorMap='PRGn',
												alpha=0.5)
												
fig.savefig('MollogP.png',bbox_inches='tight')
```

<center>
<img class="aligncenter size-full wp-image-354" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210210232949.png" alt="" width="464" height="464" /></center>
<h3 id="棒グラフでの寄与可視化">棒グラフでの寄与可視化</h3>
定量的に分かるように棒グラフでも可視化してみた。

```python
#ついでに各原子の寄与を棒グラフでも表現してみる
atom_list = ['{}{}'.format(atom.GetSymbol(),atom.GetIdx()) for atom in mol.GetAtoms()]

#棒グラフの作成
x = np.arange(len(atom_list))
width = 0.8
fig, ax = plt.subplots()
bar = ax.bar(x, mol_log, width)
ax.set_xticks(x)
ax.set_xticklabels(atom_list)
ax.set_ylabel('Contribution to MollogP',fontsize=12)
plt.grid(linestyle='--',axis='y')
plt.savefig('bar_graph_mollogp.png')
plt.show()
```

<center>
<img class="aligncenter size-full wp-image-355" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210210233027.png" alt="" width="432" height="288" /></center>
<h3 id="TPSAへの寄与の計算と可視化">TPSAへの寄与の計算と可視化</h3>

```python
#_CalcTPSAContribs(mol)：:各原子ごとにのTPSAへの寄与を格納したタプルが得られる。
tpsa = rdMolDescriptors._CalcTPSAContribs(mol)
fig = SimilarityMaps.GetSimilarityMapFromWeights(mol,
weights=tpsa)
fig.savefig('tpsa.png',bbox_inches='tight')
```

<img class="aligncenter size-full wp-image-356" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210210233108.png" alt="" width="464" height="464" /></center>
<h3 id="棒グラフでの寄与可視化-1">棒グラフでの寄与可視化</h3>
MolLogPと同様に棒グラフでも可視化してみた。

```python
#ついでに各原子の寄与を棒グラフでも表現してみる
atom_list = ['{}{}'.format(atom.GetSymbol(),atom.GetIdx()) for atom in mol.GetAtoms()]

#棒グラフの作成
x = np.arange(len(atom_list))
width = 0.8
fig, ax = plt.subplots()
bar = ax.bar(x, tpsa, width)
ax.set_xticks(x)
ax.set_xticklabels(atom_list)
ax.set_ylabel('Contribution to TPSA',fontsize=12)
plt.grid(linestyle='--',axis='y')
plt.savefig('bar_graph_tpsa.png')
plt.show()
```

<center>
<img class="aligncenter size-full wp-image-357" src="https://datadriven-rnd.com/wp-content/uploads/2021/02/20210210233207.png" alt="" width="432" height="288" /></center>
<h2 id="参考">参考</h2>
<ul>
 	<li><a href="https://future-chem.com/rdkit-similarity-map/">RDKitの類似度マップを用いて原子ごとの寄与を可視化する</a></li>
</ul>