4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RDKit入門②:1分子の読み込みと部分構造検索

Posted at

##はじめに
この記事は以下の記事の続きとなります。
[RDKit入門①:まずは環境構築][1]
[1]:https://qiita.com/Ru-PNP/items/ed5a8530611ef0d712b7
今回はRDKitを用いてSMILES構造式からmolオブジェクトを生成し、部分構造検索を行います。
###環境

  • windows 10
  • python 3.8.5
  • RDKit 2020.09.4

##molオブジェクトの作成
まずはmolオブジェクトの作成を行います。
molオブジェクトの作成にはChem.MolFromSmiles()もしくはChem.MolFromSmarts()を用います。
前者はSMILES記法を、後者はSMARTS記法を用いたmolオブジェクト作成を行います。
今回は前者を用い、アトルバスタチンのSMILES構造式からのmolオブジェクト作成を試しましょう。

from rdkit import Chem
#パッケージの読み込み

Atorvastatin = Chem.MolFromSmiles("O=C(O)C[C@H](O)C[C@H](O)CCn2c(c(c(c2c1ccc(F)cc1)c3ccccc3)C(=O)Nc4ccccc4)C(C)C")
#アトルバスタチンのSMILES構造式からmolオブジェクトを生成し、Atorvastatinと定義した。

生成したmolオブジェクトを呼び出してみると以下の画像が出力されます。

Atorvastatin

image.png
念の為、今回生成したAtorvastatinの型についても調べておきましょう。

print(type(Atorvastatin))
#<class 'rdkit.Chem.rdchem.Mol'>

なお、RDKitが与えられたSMILES構造式をうまく解釈できない場合(価数や結合数が変な場合等)、
molオブジェクトが生成されずにNoneオブジェクトが返されることがあります。
試しに結合数が5本の炭素を含むSMILES構造式を与えてみましょう。

test = Chem.MolFromSmiles("CC(C)(C)(C)C")
print(type(test))
#<class 'NoneType'>

##部分構造検索
部分構造検索の方法として以下の3つを紹介します。

Mol.HasSubstructMatch(query)
Mol.GetSubstructMatch(query)
Mol.GetSubstructMatches(query)

Molの部分とqueryの部分にはいずれもmolオブジェクトを入れます。
###HasSubstructMatchについて
最初に紹介するHasSubstructMatchは、Molの中にqueryで指定した部分構造が含まれるか否かを調べるメソッドです。
含まれる場合はTrue, 含まれない場合はFalseが返ります。
先に生成したAtorvastatinの中にアミド(含まれる)とピリジン環(含まれない)があるかどうか調べてみましょう。

amide = Chem.MolFromSmiles("C(=O)N")
Atorvastatin.HasSubstructMatch(amide)
#True

Atorvastatin.HasSubstructMatch(Chem.MolFromSmiles("n1ccccc1"))
#False

###GetSubstructMatchについて
次に紹介するGetSubstructMatchは、検索した部分構造のアトムインデックスを返す関数です。
molオブジェクトにはどの原子が何番という番号が振られており、その番号を取得することができます。
試しにAtorvastatinのカルボン酸部分のアトムインデックスのタプルを取得してみましょう。

Atorvastatin.GetSubstructMatch(Chem.MolFromSmiles("C(=O)O"))
#(1, 0, 2)

部分構造として存在しない構造を検索すると空のタプルが得られます。

Atorvastatin.GetSubstructMatch(Chem.MolFromSmiles("n1ccccc1"))
#()

ただし、GetSubstructMatch()関数は検索したい部分構造が複数含まれる場合でも1箇所分のアトムインデックスしか返してくれません。
試しにベンゼン環(Atorvastatin中に3つ含まれる)で検索してみましょう。

Atorvastatin.GetSubstructMatch(Chem.MolFromSmiles("c1ccccc1"))
#(16, 17, 18, 19, 21, 22)

###GetSubstructMatchesについて
最後に紹介するGetSubstructMatchesは、検索した部分構造に該当する全ての部分のアトムインデックスを返すメソッドです。
出力はタプルのタプルとして与えられます。
この関数を用いて再度ベンゼン環構造の検索を行いましょう。

Atorvastatin.GetSubstructMatches(Chem.MolFromSmiles("c1ccccc1"))
#((16, 17, 18, 19, 21, 22), (23, 24, 25, 26, 27, 28), (32, 33, 34, 35, 36, 37))

len()関数と組み合わせれば該当する部分構造がいくつ含まれるかも分かります。

len(Atorvastatin.GetSubstructMatches(Chem.MolFromSmiles("c1ccccc1")))
#3

##おわりに
今回はRDKitを用いて以下の内容を実施いたしました。

  • SMILES構造式からのmolオブジェクトの生成
  • molオブジェクトに対する部分構造検索の実施(3種類)

###参考
今回の記事を書くにあたっては化学の新しいカタチさんの以下の記事を参考にいたしました。

また、関連する内容として以下の記事を紹介いたします。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?