今回はRDKitで反応式の取り扱いに関して紹介します。
この記事では個人的に分かりづらいと感じた部分を中心に触れますので、
基本的な部分については化学の新しいカタチさんの以下の記事をご参照ください。
これまでの記事のシリーズは以下をご覧ください。
[RDKit入門①:まずは環境構築][1]
[RDKit入門②:1分子の読み込みと部分構造検索][2]
[RDKit入門③:複数分子の読み込み (前編)と分子群の描画][3]
[RDKit入門④:複数分子の読み込み (後編)とデータフレームの加工][4]
[RDKit入門⑤:データフレーム内の分子群に対する部分構造検索][5]
[RDKit入門⑥:Morganフィンガープリントの作成とそれを用いたタニモト係数の計算による分子類似性評価][6]
[1]:https://qiita.com/Ru-PNP/items/ed5a8530611ef0d712b7
[2]:https://qiita.com/Ru-PNP/items/58d733ef327677d273fd
[3]:https://qiita.com/Ru-PNP/items/1cea34b864e993e4e1e1
[4]:https://qiita.com/Ru-PNP/items/62a108d92c1ddd522e58
[5]:https://qiita.com/Ru-PNP/items/b469ac1b907909a9d821
[6]:https://qiita.com/Ru-PNP/items/79873f0e3eab444f5bfe
###環境
- Windows 10
- python 3.8.8
- RDKit 2021.03.1
先にパッケージの読み込みを行います。
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
#パッケージの読み込み
続いて反応を定義します。今回はエステルとアミンが反応してアミドができる反応を扱います。
AllChem.ReactionFromSmarts()メソッドを使用し、反応をReaction SMARTSの形式で記述します。
amidation = AllChem.ReactionFromSmarts("[*:1]O[C:2](=[O])[#6:3].[Nh:4]>>[N:4][C:2](=[O])[#6:3].[*:1][Oh]")
#エステルとアミンが反応してアミドができる反応をamidationと定義した。
続いて基質をそれぞれ定義します。今回はエステル側を反応点が2つのジエステルとします。
aniline = Chem.MolFromSmiles("Nc1ccccc1")
diester = Chem.MolFromSmiles("CC(C)(CCC(=O)ON1C(=O)CCC1=O)C(=O)OC1=CC=C(C=C1)[N+]([O-])=O")
#基質となるアニリンとジエステルをそれぞれaniline, diesterと定義した。
念のため、この2つが先に定義したamidationの基質であるかを確認しておきましょう。
(Reactionオブジェクト名).IsMoleculeReactant(Molオブジェクト名)メソッドを使用します。
基質となる場合はTrue, ならない場合はFalseが返ります。
amidation.IsMoleculeReactant(aniline) #True
amidation.IsMoleculeReactant(diester) #True
#anilineとdiesterがそれぞれamidationの基質であるかどうか確認した。
両方ともamidationの基質であることを確認できたため、続いて実際に反応を実施します。
(Reactionオブジェクト名).RunReactants([Molオブジェクト])メソッドを使用します。
今回は反応式左辺が2成分の反応を定義したので[]内にはMolオブジェクトを2つ並べます。
products_amidation = amidation.RunReactants([diester, aniline])
#diesterとanilineをamidationに適用し、生成物群をproducts_amidationと定義した。
出力結果products_amidationはタプルの中にタプルがある二重構造となっています。
今回は反応点が2つあり、生成物が2成分となる反応なので((Mol, Mol), (Mol, Mol))となりました。
反応点の数や生成物の成分数によらず二重のタプルの形式で出力されます。
それぞれ化合物の画像の下のラベルを打ち込むことで個々のMolオブジェクトを取り出せます。
1反応点・1生成物の系で試したときなぜ二重のタプルの形式で出力されるのか疑問でしたが、
多反応点・多成分系で出力すると理解しやすいかと思います。
##おわりに
今回はRDKitを用いて以下の内容を実施いたしました。
- AllChem.ReactionFromSmarts関数を用いた反応の定義
- Reaction.IsMoleculeReactant関数を用いた基質かどうかの判定
- Reaction.RunReactant関数を用いた反応の実施
複数の反応点がある基質に対して1箇所反応させる例を今回紹介しましたが、
後編では自作関数を定義して繰り返し反応を実施する例を紹介したいと思います。
###参考
追記:記事中で使用した画像(の元)を出力する自作関数の紹介記事を執筆いたしました。
併せてご覧ください。
[RDKitで化学反応を扱った際の生成物群を整理し図示する方法][10]
[10]:https://qiita.com/Ru-PNP/items/baebf99e269bd7fb2fb5