[RDKit入門⑦:反応式の取り扱い(前編)][1]の記事ではRDKitによる化学反応の取り扱いを紹介しました。
記事の中で出力結果が二重のタプルとなることを以下のような画像とともに説明しました。
[1]:https://qiita.com/Ru-PNP/items/49a080a015414553bbad
解説用にこのような画像を出力する関数を自作しましたが、なかなか便利そうなので
今回はその自作関数を紹介したいと思います。
###環境
- Windows 10
- python 3.8.8
- RDKit 2021.03.1
先にパッケージの読み込みを行います。
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
from itertools import chain
#パッケージの読み込み
以下が自作した関数になります。
def Draw_Products_Labels(products_str: str):
if type(products_str) != str : raise ValueError('変数名を文字列として入力してください!')
#注意!変数にはリストそのものではなくリストの名前を文字列として入れること!
products = globals()[products_str]
#products_strという名前の変数を取得し、productsと定義した。
products_all = list(chain.from_iterable(products))
#反応生成物群の中に含まれる化合物をリストに並べてproducts_allと定義した。
products_list = []
for i in range(len(products)):
for j in range(len(products[i])):
title_products = '{0}[{1}][{2}]'.format(products_str,i,j)
products_list.append(title_products)
#中身のMolオブジェクトを個別に呼び出す際の名前を順に格納したリストをproducts_listと定義した。
return Draw.MolsToGridImage(products_all, molsPerRow = len(products[0]), legends = products_list)
#画像を描画する。
ピリジン環をニトリル+アルキン×2に分解する反応を例にして紹介します。
rxn = AllChem.ReactionFromSmarts("[n:1]1[c:2][c:4][c:5][c:6][c:7]1>>[n:1]#[C:2].[C:4]#[C:5].[C:6]#[C:7]")
#ピリジン環をニトリル+アルキン×2に分解する反応をrxnと定義した。
bipyridine = Chem.MolFromSmiles("CCC1=C(C=NC(=C1)C(C)C)C1=C(C=NC(C)=C1)C(C)(C)C")
#今回の基質をbipyridineと定義した。構造は以下参照。
反応を実施し、出力結果を先に作成した自作関数Draw_Products_Labelsに投入します。
この際、出力結果を“ダブルクオーテーション”で括って文字列として渡すようにしてください!
(括らずに渡さなかった場合エラーメッセージを返すようにはしてあります)
test = rxn.RunReactants([bipyridine])
#rxnにbipyridineを基質として適用し、出力結果をtestと定義した。
Draw_Products_Labels("test")
#Draw_Products_Labelsに反応の結果を"test"として代入し、画像を出力した。""で括ることに注意!
##おわりに
今回はRDKitで化学反応を扱った際の生成物群を整理・図示する自作関数を紹介いたしました。
関数に代入する際に“”で括って文字列として渡さないといけないのが現状大きな問題点ですが、
ひとまず整理・図示する目的は果たせたかと思います。
変数名から文字列を取得する操作がうまくできれば改善可能なのですが……
方法をご存知の方はコメントいただけると幸いです。