RDKitで原子に番号を表示できなくて困っていた話

## はじめに
__[RDKit](https://rdkit.org/docs/index.html)で表示した化合物の各原子に番号を表示する方法をご紹介__していきます。
フィンガープリントの生成ルールを勉強したくて、各原子に番号を表示させたいと思っていました。
（この記事の知見を参考にフィンガープリントの生成ルールについて[こちら](https://qiita.com/oki_kosuke/items/9a7b52911c4ef9d4edad)に記事を書きました）

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

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

## 問題

以下のコードで生成した化合物（今回は例としてibuprofenを扱います）の各原子に番号を表示させようとしていました。

```python
from rdkit import Chem
# ibuprofenの定義（smiles表記をmolに変換）
ibuprofen = Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
ibuprofen
```
実行するとこのように分子が描かれます。
![ibuprofen_wo_index1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/c98c4f4a-daac-e6d9-bd2c-0f592518547f.png)

この分子の各原子に番号を表示させることにします。[公式ページの該当しそうな記述](https://www.rdkit.org/docs/source/rdkit.Chem.Draw.MolDrawing.html)やろいろ検索してみると"includeAtomNumbers"のオプションが効いていそうと分かったので、以下コードを実行してみましたが各原子に番号は表示されずでした。

```python
from rdkit.Chem import Draw
# includeAtomNumbersをTrueにして番号の表示を試みる
Draw.MolToImage(ibuprofen, includeAtomNumbers = True)
```

また、「[実践マテリアルズインフォマティクス](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9-%E8%88%B9%E6%B4%A5-%E5%85%AC%E4%BA%BA/dp/4764906155)」に掲載されていたコードを参考に以下を実行してみましたが、結果は同じく各原子に番号は表示されずでした…

```python
import rdkit
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem.Draw.MolDrawing import DrawingOptions

#例としてイブプロフェンへの原子インデックスの表示を試みます
ibuprofen = Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')

#文献を参考に原子インデックスを表示する関数を定義
def molview(mole):
    DrawingOptions.includeAtomNumbers = True
    view = Chem.Draw.MolToImage(mole)
    return view

# 実行します
molview(ibuprofen)
```


## 解決法
[こちら](https://stackoverflow.com/questions/53321453/rdkit-how-to-show-moleculars-atoms-number)を参考に以下コードで実行すると各原子に番号が表示されました。

```python
from rdkit.Chem import MolFromSmiles
for atom in ibuprofen.GetAtoms():
    atom.SetProp("atomLabel", str(atom.GetIdx()))
ibuprofen
```

実行結果はこんな感じです。これがやりたかったことです！
![ibuprofen_with_index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/49a10a31-fa50-c89e-3668-4219753e702b.png)


また、[こちら](https://zhuanlan.zhihu.com/p/60796265)のコードを参考に以下のコードを実行すると原子も番号とセットで表示されます。（例としてアセトアミノフェンを描きます）

```python
Acetaminophen = Chem.MolFromSmiles('CC(=O)Nc1ccc(O)cc1')

def mol_with_atom_index(mol):
    atoms = mol.GetNumAtoms()
    for idx in range(atoms):
        mol.GetAtomWithIdx(idx).SetProp('molAtomMapNumber', str(mol.GetAtomWithIdx(idx).GetIdx()))
    return mol

mol_with_atom_index(Acetaminophen)
```

実行結果はこんな感じです。
![Acetaminophen_with_index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/85957ec8-da1f-6bcd-86e4-abb56dc80cc8.png)


## 原因
[問題](#問題)に示した方法（"includeAtomNumbers = True"に設定）では新バージョンにおいて原子に番号を表示することはできません。
どうやら__RDKitのバージョン`2020.03.1`以降で仕様が変更__になったようです。

## まとめ
RDKitで表示した化合物の各原子に番号を振る方法をご紹介しました。旧バージョンに対する対処方法で上手くいかずに悩んでいる方はぜひ参考にしていただければ幸いです。
上記の方法で各原子に番号を振ることができたので、この知見を使ってフィンガープリントの解釈などをしていきたいと思います。
（フィンガープリントの生成ルールの解釈について[こちら](https://qiita.com/oki_kosuke/items/9a7b52911c4ef9d4edad)に記事を書きました）

### 参考
- [RDKit Documentation](https://rdkit.org/docs/index.html)
- 「[実践マテリアルズインフォマティクス](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9-%E8%88%B9%E6%B4%A5-%E5%85%AC%E4%BA%BA/dp/4764906155)」
- [How to show molecular's atoms number](https://stackoverflow.com/questions/53321453/rdkit-how-to-show-moleculars-atoms-number)
- [使用RDkit可视化分子指纹](https://zhuanlan.zhihu.com/p/60796265)