RDKitとcolabolatoryで前処理しようとして挫折した話
RDKitの使い方を調べたりインフォマティクスに関する本を読んでみたりしましたが、結局あまり実際には動かせていません。
おそらく、写経(?)したりして身につける必要があるのでしょうが、いまいちそれだと楽しくない(ダメな入門者の典型)。
何か面白いこと・・・ということで、調子に乗って創薬ちゃんさんの創薬レイドバトルに登録してしまいました。
どうしよう・・・
とりあえずどんな化合物から絞り込めば良いのか化合物ライブラリを眺めてみることにしました。
化合物ライブラリをダウンロード、解凍してみると以下の4つのsdfファイルが入っていました。
試しにsdfを開いてみたらMarvinViewが起動し手軽に見ることができました。
いつのまにこんなソフトが?と思ったら、ChemDrawの代わりに使えるものをということでインストールしたMarvinSketchと一緒にダウンロードされていたみたい・・・ChemAxon社様様です。
中身は上記のような感じ・・・。構造に加えてidnumber、heavy_atoms、LogSなどなどのカラムがあるようです。
思ったよりシンプルな化合物です。もっとドラッグライクな化合物はあるのでしょうが、なにぶんデータが多すぎてよくわからない。 これは前処理(?)というやつで、ある程度数を減らさないといけなさそうです。
しかし何をすれば良いかわからない・・・。
まずは専門家の真似をしよう!ということで、@yamasakit_ 先生の記事( raziのDocker-composeで創薬レイドバトル2018用のJupyter Notebookからアクセスできる化合物データベースを作った話 )とケモインフォマティクス若手の会の ハンズオン資料 を参考に前処理を行ってみました。*1
方針としては
- Google Colaboratoryを使ってみる(サイズ大きいから)
- 処理としてRDKitを使って
- 構造の標準化
- 脱塩(一番大きい左図のフラグメントだけを残す)
- 電荷の中和を行う
- idnumberと構造だけ残してsdfファイルにする
という感じです。
- Google colaboratoryで使うためのデータセットの準備
- Google colaboratoryでの作業
- どれくらいメモリをつかったのか?
- Google ドライブを使いたくない場合?
- 残念なお知らせ
- まとめ
Google colaboratoryで使うためのデータセットの準備
Google colaboratoryからデータセットを使うには、Googleドライブへのアップロードが必要そうでした。
まずは、サイズが大きいのでデータセットを圧縮します。
gzip -c Enamine_Advanced_collection.sdf > Enamine_Advanced_collection.sdf.gz gzip -c Enamine_HTS_collection.sdf > Enamine_HTS_collection.sdf.gz gzip -c Enamine_Premium_collection.sdf > Enamine_Premium_collection.sdf.gz gzip -c UOS_HTS.sdf > UOS_HTS.sdf.gz
Googleドライブにログインして上記のファイルをアップロードしましたが、圧縮してあっても時間がかかるので、この間にGoogle colaboratoryの準備をしました。
Google colaboratoryでの作業
1. Google colaboで新しいnotebookを作成
Google Colaboにアクセスして、「ファイル」から「Python 3の新しいノートブック」をクリックするだけで使えます。すごい・・・ *2
2. rdkitをインストール(ハンズオン資料そのまま)
!curl -Lo rdkit_installer.py https://git.io/fxiPZ
import rdkit_installer
%time rdkit_installer.install()
3. Google ドライブのファイルにアクセスするための準備
Google colaboratoryからGoogleドライブのファイルを使用する方法は脚注の記事(→*3 )を参考にしました。
!pip install -U -q PyDrive from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive from google.colab import auth from oauth2client.client import GoogleCredentials auth.authenticate_user() gauth = GoogleAuth() gauth.credentials = GoogleCredentials.get_application_default() drive = GoogleDrive(gauth)
Google Cloud SDKの認証リンクが出てくるので、認証を行います。
4. GoogleドライブからファイルをColaboratoryのローカルにファイルを持ってくる
先の脚注の参考記事に従ってGoogle ドライブから共有リンク('id='以降)を取得します。 まずは一番ファイルサイズの小さいEnamine_Premium_collection から進めます。
id = 'Googleドライブのファイルのidをここに書く' downloaded = drive.CreateFile({'id': id}) downloaded.GetContentFile('Enamine_Premium_collection.sdf.gz')
これでColaboratoryからsdfファイルを使う準備ができました。
5. RDKitを使ってSDFファイルを読み込む
今回は圧縮したファイルなので、SDMolSupplierではなくForwardSDMolSupplierを使用します。
読み込み方法の詳細は脚注のページを参考にしました。(→ *4 )
from rdkit import Chem import gzip EPc_gz = gzip.open('Enamine_Premium_collection.sdf.gz') EPc_mols = [mol for mol in Chem.ForwardSDMolSupplier(EPc_gz) if mol is not None]
読み込むことができた分子の総数を確認します。
len(EPc_mols)
「128816」と出力されました。 戦闘力13万・・・強い・・・
6. プロパティの確認
SDFから読み込んだMolオブジェクトに、元々のSDFの情報がどのように紐づいているか確認するため、構造以外の情報を確認してみます。 Molオブジェクトのリストから最初の一つを取り出して、プロパティを取得しました。
詳細は「化学の新しいカタチ」さんの記事 *5 などを参考にしてください。
EPc_test = EPc_mols[0] names=list(EPc_test.GetPropNames()) print(names)
プロパティのリストが出力されました。
['idnumber', 'heavy_atoms', 'LogS', 'LogP', 'rotating_bonds', 'PSA', 'hb_acceptors', 'hb_donors']
MarvinViewでみたときとプロパティが違う・・・(linkというプロパティがない)。
先ほどMarvinViewでみたのはEnamine_HTS_collectionだったので、どうやらsdfファイルによって含むプロパティは違うみたいです。
7. 前処理の試し打ち
いよいよ本題です。
ハンズオン資料によると、MolStandardizeというモジュールを使うことで前処理ができるみたいです。
まずは試しに一つやってみます。 塩酸塩は無事、脱塩処理されるでしょうか?
まずは元の構造の確認
#構造式をnotebook上で表示させるための設定 from rdkit.Chem.Draw import IPythonConsole from IPython.display import display #塩酸塩のエントリー例 EPc_mols[2]
こんな構造がnotebook上に表示されます。
それでは処理を行います。
# 分子の標準化を行うためのモジュールを読み込む from rdkit.Chem import MolStandardize #標準化 normalizer =MolStandardize.normalize.Normalizer() test_mol_norm = normalizer.normalize(test_mol) #一番大きいサイズのフラグメントのみ残す(ここで脱塩されるみたい) lfc = MolStandardize.fragment.LargestFragmentChooser() test_mol_desalt = lfc.choose(test_mol_norm) #電荷の中和 uc = MolStandardize.charge.Uncharger() test_mol_neu = uc.uncharge(test_mol_desalt)
処理後の構造をそれぞれnotebook上に描画した結果は以下の通り・・・
test_mol_norm | test_mol_desalt | test_mol_neu |
---|---|---|
無事、塩酸塩が脱塩されました! 標準化と電荷の中和が必要かいまいち理解できませんが、とりあえず処理に含めておきます。
8. 前処理本番
時間がかかりそうなので、時間も測定してみます。
#セルの処理の時間測定 %%time #前処理を実行して新しいMOlオブジェクトのリストを作る #空のリストを作成 processed_EPc_mols = [] #ループを回せ!!! for i in range(len(EPc_mols)): mol = EPc_mols[i] #構造の標準化 normalizer =MolStandardize.normalize.Normalizer() mol_norm = normalizer.normalize(mol) #一番大きいサイズのフラグメントのみ残す lfc = MolStandardize.fragment.LargestFragmentChooser() mol_desalt = lfc.choose(mol_norm) #電荷の中和 uc = MolStandardize.charge.Uncharger() mol_neu = uc.uncharge(mol_desalt) #新しいリストに追加 processed_EPc_mols.append(mol_neu)
かかった時間・・・
CPU times: user 3min 6s, sys: 12.4 s, total: 3min 19s Wall time: 3min 19s
これならカップ麺作ってる間に前処理できる!!
念のため処理した後に残った分子の数を確認
len(processed_EPc_mols)
「128816」と出力されました。全部うまくいったみたいです。
9. 出力用のSDFを作成
SDFとして出力したいと思いますが、処理をおこなったので元々のプロパティのうち、
logSやlogPなどは意味のない値になってしまってそうです。
そこでidnumberと構造だけを含むSDFとしたいと思います。
SDFの出力にはSDWriterを使い、SetPropで紐づけたいプロパティを指定します。
#構造とidnumberのみを残したsdfファイルを作成 #SDWriterを使用する writer = Chem.SDWriter('Enamine_Premium_collection_processed.sdf') #プロパティの設定 #右だとうまくいきません。プロパティはリストで渡す必要があります。→ writer.SetProps('idnumber') writer.SetProps(['idnumber']) #ループを回せ!! for mol in processed_EPc_mols: writer.write(mol) #そっ閉じ writer.close()
これでSDFができました。あとは自分のPCにもってくるだけ・・・ とりあえずGoogleドライブに出力します。
10. Googleドライブに出力
Google Colaboratoryローカルに入力する際に参考にした記事に、出力方法も載っていました。
念のため圧縮して出力します。
#大きいので圧縮 #colaboratoryでは"!"を先につけるらしい !gzip -c Enamine_Premium_collection_processed.sdf > Enamine_Premium_collection_processed.sdf.gz #Googleドライブへ出力 upload_file = drive.CreateFile() upload_file.SetContentFile('Enamine_Premium_collection_processed.sdf.gz') upload_file.Upload()
Googleドライブで無事出力されていることが確認できました!
ローカルPCにもってきてMarvinViewで見るとこんな感じ・・・
注 ) 上の図は修正前のものです。見た目は変わってしまいますが、こちらの方がわかりやすいので残しておきます。
どれくらいメモリをつかったのか?
Google colaboratoryは一度のセッションで12GBまでしか使えないそうです。
上記の処理では、最もファイルの大きさの小さいEnamine_Premium_collectionを使いましたが、
出力まで終えて「使用したRAM 3.91GB」でした。
Google ドライブを使いたくない場合?
今回、「Google colaboratoryのローカルにGoogleドライブからファイルをもってくる」、 という入力を行いましたが、後から考えたら「colabolatory上でファイルをダウンロードしてもよかったかな」、と思いました。
一応確認・・・
!wget https://xxxxxx #創薬レイドバトルのページにある化合物ライブラリのリンクをはる #library.tar.gz というのがcolaboratoryローカルにダウンロードされる #解凍する !tar -xvf library.tar.gz
解凍されて以下ができました。
- souyakuchan_library/
- souyakuchan_library/Enamine_Advanced_collection.sdf
- souyakuchan_library/Enamine_HTS_collection.sdf
- souyakuchan_library/Enamine_Premium_collection.sdf
- souyakuchan_library/UOS_HTS.sdf
これをさらにcolaboratory上でダウンロードしても使えるみたいなのですが、
試しにやってみたらとても遅いので、先述のGoogleドライブを経由する方法の方が良さそうでした。
残念なお知らせ
よし!残りのファイルも同じ感じでやるぞ!と思ったのですが
Enamine_HTS_collectionで同じ操作をおこなったところ、
メモリの使いすぎ(?)のためかエラーが出てしまいました。
ランタイムをリセットしてやり直しても12GBにおさまらず、前処理の途中で力尽きてしまいました。
自分のPCでは遅いからこっちでやろうと思ったのですが・・・残念
まとめ
以上、RDKit と Google colaboratory を使ってみた話でした。
お手元にRDKitをインストールしていない場合でもGoogle colaboratory上で遊べるっていうのはとても良いですね。
SDFをいい感じに分割したら、他のファイルも同じ処理ができるのではないかと思うのですが、私の能力では無理でした・・・
わかりやすくするために省きましたが、実際には例で検証したりせず、いきなり全構造処理したり、その他様々なトラブルで見事に丸一日を無駄にしましたよ!!! sdf一つしか処理できなかった・・・
追記(01/14) SDWriterの設定が間違っていたので修正しました。 SetPropsはプロパティをリストかタプルで渡す必要があるので、 writer.SetProps('idnumber') を writer.SetProps(['idnumber']) のように修正する必要があります。
また、この記事の通りにやった場合、脱塩処理された化合物(フラグメントの大きい方が取り出されたもの)については idnumberがなくなってしまいます。
こちらは修正方法を検討して別の記事で書きます(いつか・・・)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*1:
ハンズオン資料はtwitterをさまよってたらありました。とても素晴らしい資料ですよ!
@yamasakit_ 先生の記事の通りにやならかったのは、Dockerの使い方がわからなかったからです。。。
*2: 環境構築不要でPython入門!Google Colaboratoryの使い方を分かりやすく説明
*3:
*4:
「化学の新しいカタチ」さんの記事 RDKitでケモインフォマティクスに入門
-
*5:
お正月読書感想文
1月も12日目ですが、あけましておめでとうございます。
インシリコ創薬に興味を持ち勉強を始めてみましたが、そもそもインフォマティクス(?)に関する知識が全然無い・・・ということで、年末年始の休暇を利用して数冊本を流し読みしてみました。
コードも数式も理解できないので読み飛ばしてしまいましたが、折角なので、備忘録を兼ねて感想を書きます。
- 1冊目:よくわかるバイオインフォマティクス 入門
- 2冊目:Pythonデータサイエンスハンドブック
- 3冊目:PythonとKerasによるディープラーニング
- 4冊目:データ解析のための統計モデリング入門
- 5冊目:これならわかる最適化数学
- 6冊目:プログラミングのための線形代数
- まとめ
1冊目:よくわかるバイオインフォマティクス 入門
よくわかるバイオインフォマティクス入門 (KS生命科学専門書)
- 作者: 岩部直之,川端猛,浜田道昭,門田幸二,須山幹太,光山統泰,黒川顕,森宙史,東光一,吉沢明康,片山俊明,藤博幸
- 出版社/メーカー: 講談社
- 発売日: 2018/11/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
ケモインフォマティクス についての入門書はどれを読めば良いか分からなかったので、まずはバイオインフォマティクス の本をということでTwitterでオススメされていたこちらの本を購入しました。*1
目次をご覧いただくのが一番早いと思うので講談社サイエンティフィク さんのページより拝借・・・
1章 配列解析
2章 分子進化
3章 タンパク質の立体構造解析
4章 ncRNA解析
5章 NGSデータ概論
6章 ゲノム解析
7章 トランスクリプトーム解析
8章 エピゲノム解析
9章 メタゲノム解析
10章 プロテオーム解析
11章 データベース
12章 バイオのための機械学習概論
バイオインフォマティクスに関し全くの門外漢だったのですが、分子生物学を中心として、遺伝子(上流、1次元)からタンパク質の構造・機能解析(下流、3次元)まで、さまざまな段階においてデータ解析を活用した研究を行うといった印象でした。
各トピックに関して「そもそもそれをなぜ研究したいのか」という分野の意義の説明から、その分野において「インフォマティクスの技術はどう使えるか」、また「実際に使うにはどうすれば良いか」という具体的なデータベースのアクセス・解析の原理と方法についてカラーの図で解説してあり非常に面白かったです。
ところで、分子生物学というと細胞内部や、個体内部といったミクロな視点がメインという印象を勝手にいだいていたのですが、こちらの本ではよりマクロな視点も取り扱われていました。具体的には、「1章 配列解析」における、生物種間でのタンパク質の差異の検証に基づき進化の分岐点を探る、といった歴史を辿るような試みや、「9章 メタゲノム解析」における、ある場所に存在する多種多様な微生物の集まりをひとまとめにして、遺伝子プールという観点からその集団の持つ特性を評価する、という群としての取り扱いなども取り上げられています。
私は薬学部出身なのですが、大学に進学した際に「高校の生物学ではエンドウ豆のシワの話やら、淡水魚・海水魚と浸透圧、みたいな話をしていてわかりやすかったのに、なぜ大学はタンパク質の話しかしないんだ??? もっとマクロな話はどうなった??」と、「生体内分子の機能を明らかにすることで生物を理解する」という趣旨を理解するのにとても時間がかかったダメ学生でした・・・農学部や理学部に行ったら違ったのかも。なので、この本を読んで「マクロな生物学の解析にこんな風に進んでいたのか!」と非常に面白かったです。*2
個人的に最もオススメしたいのは「6章 ncRNA解析」です。セントラルドグマのせいかRNAに対して「DNAとタンパク質の間をつなぐ影の存在」的な印象を抱いていたので、タンパク質には翻訳されずRNA自身が生体内で機能する(noncoding RNA: ncRNA)の研究が近年急速に進歩していること、機能と結びつくRNAの2次・高次構造解析、RNA-RNA / RNA-タンパク質 相互作用解析 といった研究が広がっていることを知りませんでした。20ページもありませんが、その中でncRNAの基礎から最新の研究への流れと、今後の展望について一気に語られており、「急速に知識を詰め込まれていく感じとても気持ち良い!」*3という感じです。
総じて、各章「そもそもそれをなぜ研究したいのか」という分野の意義の説明から、その分野において「インフォマティクスの技術はどう使えるか」、また「実際に使うにはどうすれば良いか」という具体的なデータベースのアクセス・解析の原理と方法についてカラーの図で解説してあり非常に面白かったです。カラーなのでお値段高めですが、理工書としてはお手頃ですしこれから入門したいという方にはオススメ!
2冊目:Pythonデータサイエンスハンドブック
Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習
- 作者: Jake VanderPlas,菊池彰
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/05/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
過去の記事でPandasのdataframeを使ってみたりしましたが、「そもそもPandasって何だ?ハードル高いエクセルか?もうエクセルでよくない???」ぐらいの低レベルなので購入してみました。 エクセルもsumしか使えないんですけどね・・・
原書は無料で公開されているそうですが、英語だと多分1年かかるし紙の本じゃないと140字以上読めない・・・。
*こちらブログの書評が素晴らしいので有用な情報が欲しい方はこちらをお読みください。
→ 『Pythonデータサイエンスハンドブック』は良書(NumPy, pandasほか) | note.nkmk.me
目次はこんな感じ
1章 IPython : Pythonより優れたPython
2章 NumPyの基礎
3章 pandasを使ったデータ操作
4章 Matplotlibによる可視化
5章 機械学習
Pythonを使ってデータ解析を行う際に基礎となるライブラリが紹介されているそうです。データ解析をやったことないのでよくわかりませんが、とりあえず素人理解では、
・IPython → インタラクティブに検証可能なので解析が捗る
・NumPy → 科学計算でPythonを扱うのに有用な数値配列のパッケージ
・Pandas → NumPyの上に構築されたデータ操作に有用なパッケージ
・Matplotlib → 綺麗なグラフ描ける
・機械学習 → scikit-learnを使えば原理をよくわからなくても試すことができる
ということみたいです。
章を読み進めるに従って、
・NumPyがPythonの配列よりもなぜ効率がよく効果的か
・NumPyの制限をPandasがいかに解決したか
・Pandasで扱うデータをMatplotlibを使えばどう効果的にビジュアル化できるか
順番に理解していくことができるため、初心者にとって非常にわかりやすい構成になっていました。 (読み飛ばしましたが)コピペして使えそうなコードが多数あり、また「4章 Matplotlib」では描きたグラフを描くための細かな調整の方法が詳しく書いてあるので、手元に置いておいて困った時に参照しよう、という内容になっています。
また、先の「よくわかるバイオインフォマティクス 入門」の「12章 バイオのための機械学習概論」は名前の通り概論で機械学習の具体的な内容まではよくわからなかったのですが、こちらの「Pythonデータサイエンスハンドブック」ではデータサイエンスを謳っているだけあり、機械学習の事例・実行するためのコードについて多数紹介されていて先の補完の意味でもとても勉強になりました。
とりあえず大きなデータを扱ってやりたい分析をできるようにするには、この本で紹介されているような内容を把握なければいけなさそう・・・ということで出発点として非常に良い本なのかな、という感想です。
3冊目:PythonとKerasによるディープラーニング
- 作者: Francois Chollet,巣籠悠輔,株式会社クイープ
- 出版社/メーカー: マイナビ出版
- 発売日: 2018/05/28
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
やはりディープな話題にも触れてみなければならないのではないのか、ということで購入。ネットで購入して届いたら予想以上に分厚くて読む前から挫折しそうになったのですが、非常に読みやすくなんとか読み通すことができました。
まあ、コードを読まずに、図を追いかけただけなんですけどね。何となく雰囲気はつかめたので良し。
目次をマイナビブックスさんから・・・(サポートサイトへのリンクもあります)
Part 1 ディープラーニングの基礎
1章 ディープラーニングとは何か
2章 予習:ニューラルネットワークの数学的要素
3章 入門:ニューラルネットワーク
4章 機械学習の基礎
Part 2 ディープラーニングの実践
5章 コンピュータビジョンのためのディープラーニング
6章 テキストとシーケンスのためのディープラーニング
8章 ジェネレーティブディープラーニング
9章 本書のまとめ
ディプラーニングの基礎的な話から、具体的に行うにはどうすれば良いのかKerasを使って説明されてます。原書の著者はKerasの作成者(!)だそうで、「LEGOブロックを組み立てる」ように簡単な「ユーザーフレンドリなライブラリ」により「ディープラーニングが大衆化」し、新規参入者が増えたことが分野を後押ししている、とのことです。もちろん作成者だけに現状での限界や、できないことについても記述してあり、その点が非常に良いと思いました。
ケモインフォマティクス の分野から勉強を始めたため、あまり認識していなかったのですがディープラーニングの強い分野はやはり画像認識、ということで様々な興味深い事例が紹介されていました。悪夢的な画像を生成するDeepDreamや、任意の画像をゴッホが描いたかのように変換するニューラルスタイル変換など、やはり画像に関する技術はビジュアル的なインパクトが強く、門外漢にとっては読んでいてワクワクする純粋に楽しめる内容でした。
また、ケモインフォ の記事をみていて見かける化合物生成に関連する技術、変分オートエンコーダ(VAE)や敵対生成ネットワーク(GAN)についてもとりあげられており、元々はこういう技術だったのか!と出所がわかり面白かったです。
とりあえず、ネットワークの損失関数をオプティマイズすれば良いってさ (←よくわからなかった)
4冊目:データ解析のための統計モデリング入門
データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)
- 作者: 久保拓弥
- 出版社/メーカー: 岩波書店
- 発売日: 2012/05/19
- メディア: 単行本
- 購入: 16人 クリック: 163回
- この商品を含むブログ (29件) を見る
流行りのディープラーニングについて浅すぎる理解ができたので、次は機械学習に関連して各所でオススメされている本を・・・ということで緑本(で、あってます?)を購入しました。ハードカバーと難しそうな単語が並ぶタイトルからしてハードルが高かったのですが、驚くほど分かり易く読み易い語り口で一気に読み通すことができました。いろいろなブログでオススメされているのも納得という良書・・・もちろんコードは追えていない
著者の久保拓弥先生のページで出版のもとになった講義のーと が公開されており、章立てと全体の流れの解説図があるため目次は割愛します。
さて、先の「PythonとKerasによるディープラーニング」の中で、ディープラーニングと従来のシャローラーニング(表層学習)との違いとして、ニューラルネットワークは生のデータから有益な特徴量を自動的に抽出できるため、特徴エンジニアリング(特徴量をより単純な方法で表現することで、問題を容易にすること)を必要とせずに行うことができる、ということが挙げられていました(4章 p.106)。だからと言って特徴エンジニアリングを疎かにすべきではないし、重要性として
・リソースの消費を抑えた上で問題を的確に解決できる
・より少ないデータで解決できる
があげられていましたが、やはりディープラーニングの大きな長所として特徴抽出に関して何度も述べられていました。
他方、「データ解析のための統計モデリング入門」はまさに上記と対になるような内容という印象でした(間違ってたらすみません)。与えらえれたデータをもとにどのようにしてモデルを構築すれば良いか? 最小二乗法によるシンプルな線形モデルから、より高度な一般化線形モデル、階層ベイズモデルへと順をおってより複雑なモデルが説明されています。データのバックグラウンドを考慮しながら、複雑な自然のデータを解釈するためのモデルを作り上げていく流れは、”ドメイン知識に基づく特徴の抽出”といった感じで、研究者の思考をたどるような面白さがありました。
残念ながらベイズ統計(というより統計全体)を理解していないため、後半、話の流れを追えなかった部分もあるのですが、とりあえず初心者でも一度は目を通した方が良い本だ、と思いました。
5冊目:これならわかる最適化数学
統計モデリング入門は大変分かりやすかったのですが、やはり数学的素養があまりにもなさすぎてところどころ理解できない部分がありました。そこで「化学の新しいカタチ」さんのこちらの記事 でDr. Tomさんがオススメされていた、こちらの本を購入しました。
目次はこのような感じ・・・
第1章 数学的準備
第2章 関数の極値
第3章 関数の最適化
第4章 最小二乗法
第5章 統計的最適化
第6章 線形計画法
第7章 非線形計画法
第8章 動的計画法
やはりDr. Tomさんがオススメされているだけあって非常に良い本で、読み進めるための数学的基礎の準備から、いかに関数を処理し最適化を行えば良いか、非常に分かりやすく解説されています。特にたまに見かけるけどもよくわからないまま放置していた「ラグランジュの未定乗数法」についても取り扱われていたので、個人的にはそれだけで読む価値がありました(・・・普通の理系なら当たり前の知識かも)。
私の浅い理解では、機械学習は「モデルの作成 → 最適化問題を解く」という感じなので、これから勉強する上で色々と役に立ちそう・・・と思っています。また、本書のまえがきで述べられているところによると、最適化数学(数理計画)は「経営学やオペレーションズリサーチ(OR)の分野の中心テーマ」ということのようなので、「ある制約の下で、できるだけ最大限の利益を得る(= 損失を最小にする)ための最適な解を求める」という考え方は、機械学習に限らず様々な局面で役立ちそうです。
・・・っていうか大学で教えて欲しかった
6冊目:プログラミングのための線形代数
さて、「これなら分かる最適化数学」は大変良い本だったのですが、致命的に数学ができない私はこれでもわからない・・・。「今、何で行列のカッコ取れた?」「転置どこいった?」という調子で、とにかく式変形が追えない。これはダメだ・・・ということで線形代数に再入門すべくこちらの本を購入しました。
amazonの評価が高いだけあって、またしても良書でした! 本書の「はじめに」で述べられているように、
・「数学のプロではない」読者を対象に
・「数学のための数学ではなく」
・「何の役にたつのか」の説明に気を配った
との言葉通り、多数の図を使って線形代数の様々な操作がどういう意味をもつのか説明されていて、私でも「線形代数が何をしたいのか」わかった気になりました。
目次は割愛し、重要なメッセージを!
・「行列は写像だ!」
・「行列は写像だ!」
・「行列は写像だ!」
そして、
・「空間で発想だ!」
・「たいていのものはズームアップすればほとんどまっすぐだ!」
以上!
まとめ
コツコツと読み進めるといった計画的な勉強ができないダメ人間なので、長期休暇を活用すべく思い切って6冊も本を購入してしまいました。しかも、どうしても電子書籍に馴染めないという旧世代の人間なので全て紙版・・・。正直、金銭的にかなり辛かったのですが、各所でオススメされている本を中心に購入しただけあって、どの本も大変素晴らしく読んでよかった!と、思える本ばかりでした。
やはり「3日で分かる・・・」とかそんなタイトルにつられて何冊も購入するよりも、評価の高い本を腰を据えて読むのが大事だなあ、と今更ながらに実感した次第です。
当初は「大学で統計や線形代数は一度勉強してるしー」みたいな軽い気持ちだったのですが、思った以上に何も理解していなかっです。大学院まで行ってこの低レベルの私は一体・・・。というよりジョルダン標準形やらラグランジュの未定乗数法やらやった記憶が一切ないんですが、私は本当に理系なのか???
・・・
というわけで、本年も雰囲気理系として、ぼちぼちやっていきたいと思いますのでどうぞよろしくお願いいたします。
RDKit直訳 総括
勢いだけで始めた RDKit直訳 Advent Calendar 2018 - Adventar ですが、なんとか日程を全て終えることができました。ご支援いただいた皆様ありがとうございました。
ご覧いただいているという嬉しいコメントもいただいたので、調子に乗って試訳をまとめたテストサイトを作成しました。よろしければご参照ください。こんな感じです↓
以下、備忘録を兼ねてRDKit直訳アドベントカレンダーの総括を記載しておきます。
1. 振り返り
当初の予定では、
①「 The RDKit Documentation 」のうち「Getting Started with the RDKit in Python」を対象とし、
② 専門用語についてはtwitterでハッシュタグを使いながら修正していこう
と、考えていました。
最終的に、
①については「The RDKit Documentation」のうち、「Python API Reference」を除く主要な項目の試訳を作成することができました。
②については、試訳の作成だけで手いっぱいとなり、SNS活用能力の低さも相まって最初の1週間もしないうちに諦めてしまいました。
結果として、素人が専門用語もわからずにとりあえず日本語化した、というなんとも歪なものとなってしまいましたが、たたき台にでもしていただければ幸いです。
2. 日本語版サイトの追加項目について
さて、試訳をまとめたサイトを作成するにあたって、日本語版の追加の項目として「Getting Started with the RDKit in Python」の補遺と、翻訳時に訳につまづいた単語の訳語対応表を追加しました。
1) 日本語版補遺を追加した意図
オンラインドキュメンテーションを訳している間、具体的にどのような操作が行われているのかイマイチわかりませんでした。理由としては
・ 私がPython初心者でコードが読めない
ということに加えて
・SMILES、SMARTSといった表記法に馴染みがないため、操作の意味が想像できない
ということがあると思いました。
そこで、各コードで使われている線形表記を構造式におこしたFigureを作成し、日本語版の補遺として追加することとしました(*1)。
2) 訳語対応表を追加した意図
用いた訳語の日英対応を掲載した理由は、
・単純に不適切な訳語を使用している可能性が高いため、後で修正する際の参考としたい
ということに加えて
・モジュール、関数の名称が専門用語を反映しているように見えたので、英語の言い回しについて辿れるようにしておけば、RDKitを用いたコードを理解するうえで役に立つのではないか、
と考えたためです。
各日程で訳出に困った単語を集めて並べただけなのですが、まとめてみると
・「非専門家の私が訳出に困る単語」 = 「ケモインフォマティクス の専門用語の可能性が高い」
というわけで、「専門用語集的な役割も果たせるのでは??」という気もしてきました。 (自分で褒めていくスタイル!!)
3. テクニカルな話
翻訳の記法として、はてなブログが対応しているからという理由でMarkdown記法を採用しJupyter notebookでぼちぼち作成していたのですが、日程最終段階でもっといい方法があるということがわかりました。念のため備忘録。
① エディタは大事
ふとしたきっかけでAtomというエディタというのを使って見たのですが、こちらのプレビュー機能というのがとても便利でした。こんな感じ↓
左半分のMarkdownを編集すると、右側のプレビューが随時変化していくため、見た目を確認しながら作業を進めることができます。また、コードや段落、リンクといった箇所をそれぞれ色分けして表示してくれるため、記載のおかしい部分を随時把握することができます(*2)。
② reStructuredText
試訳をまとめたサイトを作成するにあたってMarkdownからreStructuredTextに記法を変更しました (*3)。
Markdownよりも優れていると感じた点は、
・脚注の記載方法(リンクが相互なので、行ったり来たりしやすい)
・文書間のリンクを作成しやすい
と、いった点です。一方で
・テーブルの表記方法は字数を合わせないとすぐに崩れてしまうため、全角半角混合なものを書こうとすると幅を合わせるのが難しい
といった点は少し使いづらいと感じました(*4)。
必要に応じて table generator のtext table作成などを活用するのが良いかと思います。
MarkdownからreStructuredTextへの変換にあたってはこちら の記事を参考にPandocを使用しました。とても簡単につかえて便利なのでオススメです。また、AtomでreStructuredTextを使うには拡張(reSTへの対応 と reSTのプレビュー機能 の追加)が必要なのでご注意ください(*5)。
③ Sphinx
公開するページの作成にあたってはこちらの記事などを参考にさせていただきつつ、Sphinxを使って見ました。Sphinxの日本ユーザ会 のページはとても内容が豊富でわかりやすいのでオススメです。
またサイトの見た目(theme)にはこちら を参考にRead the Docs「sphinx_rtd_theme」を使用しました。themeを変えるためのconf.pyの設定については岐阜大学藤沢研究室のこちらのページを参考にさせていただきました(*6)。
以上、備忘録を兼ねてざっと便利だと思ったソフトウェアや注意点を振り返りました。
4. まとめ
思いつきで始めた翻訳で思った以上に大変だったのですが、RDKitだけでなく翻訳や技術文書に関する周辺についても色々と知ることができとても勉強になりました。また、必要に迫られないと調べないモチベーションの低い人間なので、アドベントカレンダーを利用するというのは、逃げ道を断つというのと、強制的にスケジュール管理せざるを得ないという点で、とても有効だと思いました。
・・・残念ながら翻訳に必死で肝心のRDKitのPythonのコードを読む余裕はなかった
ふとしたきっかけでこのブログを始めてから、今年はとてもたくさんの方にお世話になりました。この場を借りてお礼申し上げます。
今更ながらにとても驚いたのがツイッターにはすごい方々がたくさんいらっしゃって、情報をたくさん発信してくださっている、というのが今年の1番の発見でした。田舎だと情報手に入らないなーとぼんやり過ごしていたのですが、まさかこんな手段があったとは! 来年も気が向いたらぼちぼちやっていこうと思いますので、皆様どうぞよろしくお願い申し上げます。
良いお年を!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*1) 構造式の作成にMarvinSketchを使って、RDKitを使っていない時点で「1ヶ月やって何も学んでない!」と怒られてしまいそうですが、MarvinSketch自由度高くて使い勝手良さすぎた・・・許してください
*2) 初日に知りたかった!!Jupyter notebookで「Shift+ Enter」「セルの追加」を連打し続けた日々を返して欲しい・・・
*3) RDKitオリジナルサイトはMarkdownのものとreSTのものがどちらもありましたが、「技術書、翻訳」で検索したらreSTをオススメする記事がたくさん出てきたのでこちらに統一しました。
*4) RDKitのオリジナルサイトを流用したため表記が難しかったですが、
csv形式など幅を気にしなくてもいい表記方法もあるみたいです。
*5) reST表記を理解していなかったため変換ミスと思って削除した「\」が、実はエスケープ文字で必須だったと後で気付いた時は発狂しそうになりました・・・思い込みで作業するのは良くない
*6) Sphinxの使い方以外にも生物学的対称性の説明など面白そうな記事がいっぱいありました。
研究室のHP →藤澤研究室
Backwards incompatible changes 〜RDKit 直訳 Day25〜
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 25日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
backward compatibility: 後方互換性
break compatibility: 互換性を破る
break down: 分類する
以下、訳
後方互換性の無い変更(Backwards incompatible changes)
[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#backwards-incompatible-changes
リリース間の後方互換性を維持しようと本当に努めていますが、互換性を破る必要がある事例がまれにあります。このドキュメントの目的は、RDKitで行われた後方互換性の無い変更についての情報を補足することです。リリースサイクルによって分類されており、だいたいにおいてバグの修正で生じた結果による変更は含んでいません; バグの修正はリリースノートで注意喚起するようにしています。
Release 2018.03
[LInk] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#release-2018-03
デフォルトではMolToSmiles()はisomeric SMILESを生成します(MolToSmiles() generates isomeric SMILES by default)
以前のリリースでは、出力されるSMILESに立体化学や同位体ラベルについての情報を含めたい場合、オプションのisomericSmiles
引数をtrueに設定する必要がありました。現在、このデフォルトの値はtrueとなっています。昔の動作に戻し、立体化学の情報を持たないSMILESを取得したい場合は、isomericSmiles
をfalseに設定するだけです。
MolToMolBlock()はincludeStereoフラグがセットされると2Dコンフォメーションを生成する(MolToMolBlock() generates a 2D conformation when the includeStereo flag is set)
Mol blockの立体化学を取得したい場合、出力が座標の情報を有する必要があります。以前のRDKitのバージョンでは、座標の生成を忘れずに自分で行う必要がありました。現在では、includeStereo
がセットされている場合、コンフォメーションを持たない分子に対してはデフォルトで座標が生成されます。
現在のデフォルトではコンフォメーション生成コードはETKDGを使う(The conformation generation code now uses ETKDG by default)
以前のRDKitのリリースでは、デフォルトでは、標準的なデジスタンスジオメトリー法を使ってコンフォメーションを生成していました。新しいデフォルトの設定では、Sereina RinikerによるETKDGアルゴリズムを使います。少し遅いですが、ずっと良い結果を出すことが示されています。
Release 2018.09
[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#release-2018-09
デフォルトではGetAtomSmile()はisomeric SMILESを生成する(GetAtomSmiles() generates isomeric SMILES by default)
以前のリリースでは、出力されるSMILESに立体化学や同位体ラベルについての情報を含めたい場合、オプションのisomericSmiles
引数をtrueに設定する必要がありました。現在、このデフォルトの値はtrueとなっています。昔の動作に戻し、立体化学の情報を持たないSMILESを取得したい場合は、isomericSmiles
をfalseに設定するだけです。
MCSコードのringMatchesRingOnlyオプションの変更点(Changes to ringMatchesRingOnly option in the MCS code)
FindMCS()関数のringMatchesRingOnlyオプションは結合と結合のマッチングと同様に、原子と原子のマッチングにも適用されます。
現在のデフォルトではPythonから呼び出すとコンフォメーション生成コードはETKDGを使う(The conformation generation code now uses ETKDG by default when called from Python)
[Link]
現在デフォルトでは、Python関数のEmbedMolecule()とEmbedMultipleConfs()は標準的なデジスタンスジオメトリーの代わりにETKDGアルゴリズムを使用します。
License
[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#license
この文書の著作権は copyright (C) 2013-2018 by Greg Landrum に所属しています。
この文書はCreative Commons Attribution-ShareAlike 4.0 Licenseのもとでライセンスされています。このライセンスを見るためにはhttp://creativecommons.org/licenses/by-sa/4.0/ にアクセスするか、Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. に手紙を送ってください。
このライセンスの意図はRDKitそのものの意図と似ています。簡単に言えば "これを使ってなんでもやりたいことをやっていいけど、私たちの功績にも言及してね”
12/25/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0
The RDKit database cartridge 〜RDKit 直訳 Day24〜
(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 24日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
timing information: タイミング情報、時間情報
configuration: 構成、環境設定
populate: 格納する
dump:(メモリー内容を)ダンプする
configuration variable: 構成変数
degree query : 分岐数(級)
sparse count vector fingerprint:スパースカウントベクトルフィンガープリント
bit vector fingerprint:ビットベクトルフィンガープリント
connectivity invariant: 結合関係の不変量
chemical-feature invariant: 化学的特徴の不変量
hashed molecular subgraphs: ハッシュ化された分子のサブグラフ
element-wise: 要素ごとの
boolean: ブールの、ブール値
int argument: 整数の引数
bytea: byteaデータ型 PostgreSQLにおけるバイナリ列を保存するデータ型
binary string representation: バイナリ列表現
aggregation function: 集合関数
以下、訳
RDKitデータベースカートリッジ(The RDKit database cartridge)
[Link] https://www.rdkit.org/docs/Cartridge.html#the-rdkit-database-cartridge
このページについて(What is this?)
[Link] https://www.rdkit.org/docs/Cartridge.html#what-is-this
このページRDKit PostgreSQL cartridgeのチュートリアルとリファレンスガイドです。
間違いを見つけたり、より良い方法を提案する場合は、ソースドキュメント(.mdファイル)をご自身で修正していただくか、メーリングリスト: rdkit-discuss@lists.sourceforge.net に送ってください。(メーリングリストを利用する場合はまず加入する必要があります。)
チュートリアル(Tutorial)
[Link] https://www.rdkit.org/docs/Cartridge.html#tutorial
イントロダクション(Introduction)
[Link] https://www.rdkit.org/docs/Cartridge.html#introduction
データベースの作成(Creating databases)
[Link] https://www.rdkit.org/docs/Cartridge.html#creating-databases
環境設定(Configuration)
[Link] https://www.rdkit.org/docs/Cartridge.html#configuration
以下のタイミングの情報は、ごく一般的なデスクトップPC(Dell Studio XPS with a 2.9GHz i7 CPU and 8GB of RAM)上でUbuntu 12.04を実行し、PostgreSQL v9.1.4.を用いた場合の結果です。データベースはデフォルトのパラメータでインストールされています。
データベースの読み込みとインデックスを作成している間のパフォーマンスを向上させるため、postgresql.confにあるpostgresqlの環境設定を2、3変更しました。
synchronous_commit = off # immediate fsync at commit full_page_writes = off # recover from partial
また、探索の性能を向上させるため、postgresqlが使用可能なメモリを、デフォルトの極めて控えめな設定よりも多くしています。
shared_buffers = 2048MB # min 128kB # (change requires restart) work_mem = 128MB # min 64kB
ファイルからデータベースを作成する(Creating a database from a file)
[Link] https://www.rdkit.org/docs/Cartridge.html#creating-a-database-from-a-file
この例では、emolecules.comのURL http://www.emolecules.com/doc/plus/download-database.php からダウンロード可能な、購入可能な化合物に関するSMILESファイルからデータベースを読み込む方法をお見せします。
この例をそっくりそのままご自身で繰り返してみようとされる場合、600万行のデータベースの読み込みと、全てのフィンガープリンの生成に数時間要することには気をつけてください。
まず最初にデータベースを作成し、カートリッジをインストールします。
~/RDKit_trunk/Data/emolecules > createdb emolecules
~/RDKit_trunk/Data/emolecules > psql -c 'create extension rdkit' emolecules
次に、生のデータを持つテーブルを作成し、データを格納します:
~/RDKit_trunk/Data/emolecules > psql -c 'create table raw_data (id SERIAL, smiles text, emol_id integer, parent_id integer)' emolecules NOTICE: CREATE TABLE will create implicit sequence "raw_data_id_seq" for serial column "raw_data.id" CREATE TABLE ~/RDKit_trunk/Data/emolecules > zcat emolecules-2013-02-01.smi.gz | sed '1d; s/\\/\\\\/g' | psql -c "copy raw_data (smiles,emol_id,parent_id) from stdin with delimiter ' '" emolecules
次に分子のテーブルを作成しますが、RDKitが処理できるSMILESのみのテーブルとなります:
~/RDKit_trunk/Data/emolecules > psql emolecules psql (9.1.4) Type "help" for help. emolecules=# select * into mols from (select id,mol_from_smiles(smiles::cstring) m from raw_data) tmp where m is not null; WARNING: could not create molecule from SMILES 'CN(C)C(=[N+](C)C)Cl.F[P-](F)(F)(F)(F)F' ... a lot of warnings deleted ... SELECT 6008732 emolecules=# create index molidx on mols using gist(m); CREATE INDEX
最後のステップは、部分構造検索をするつもりの時のみ必要となります。
ChEMBLの読み込み(Loading ChEMBL)
[Link] https://www.rdkit.org/docs/Cartridge.html#loading-chembl
ChEMBLのウェブサイト ftp://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/latest からpostsqlgre ダンプをダウンロードし、インストールすることから始めます。
データベースに接続、カートリッジをインストールし、そしてこれから使うスキーマを作成します:
chembl_23=# create extension if not exists rdkit; chembl_23=# create schema rdk;
分子を作成し、部分構造検索のインデックスを構築します:
chembl_23=# select * into rdk.mols from (select molregno,mol_from_ctab(molfile::cstring) m from compound_structures) tmp where m is not null; SELECT 1727081 chembl_23=# create index molidx on rdk.mols using gist(m); CREATE INDEX chembl_23=# alter table rdk.mols add primary key (molregno); ALTER TABLE
フィンガープリントをいくつか作成し、類似度検索のインデックスを構築します:
chembl_23=# select molregno,torsionbv_fp(m) as torsionbv,morganbv_fp(m) as mfp2,featmorganbv_fp(m) as ffp2 into rdk.fps from rdk.mols; SELECT 1727081 chembl_23=# create index fps_ttbv_idx on rdk.fps using gist(torsionbv); CREATE INDEX chembl_23=# create index fps_mfp2_idx on rdk.fps using gist(mfp2); CREATE INDEX chembl_23=# create index fps_ffp2_idx on rdk.fps using gist(ffp2); CREATE INDEX chembl_23=# alter table rdk.fps add primary key (molregno); ALTER TABLE
psqlプロンプトにペーストするだけでいいように、以下の一つのブロックの中に、ここ(とこれ以降)で使ったコマンドをまとめておきます:
create extension if not exists rdkit; create schema rdk; select * into rdk.mols from (select molregno,mol_from_ctab(molfile::cstring) m from compound_structures) tmp where m is not null; create index molidx on rdk.mols using gist(m); alter table rdk.mols add primary key (molregno); select molregno,torsionbv_fp(m) as torsionbv,morganbv_fp(m) as mfp2,featmorganbv_fp(m) as ffp2 into rdk.fps from rdk.mols; create index fps_ttbv_idx on rdk.fps using gist(torsionbv); create index fps_mfp2_idx on rdk.fps using gist(mfp2); create index fps_ffp2_idx on rdk.fps using gist(ffp2); alter table rdk.fps add primary key (molregno); create or replace function get_mfp2_neighbors(smiles text) returns table(molregno integer, m mol, similarity double precision) as $$ select molregno,m,tanimoto_sml(morganbv_fp(mol_from_smiles($1::cstring)),mfp2) as similarity from rdk.fps join rdk.mols using (molregno) where morganbv_fp(mol_from_smiles($1::cstring))%mfp2 order by morganbv_fp(mol_from_smiles($1::cstring))<%>mfp2; $$ language sql stable ;
部分構造検索(Substructure searches)
[Link] https://www.rdkit.org/docs/Cartridge.html#substructure-searches
例として用いたクエリの分子はeMolecules home Pageから取得しました:
[link] eMolecules home Page
chembl_23=# select count(*) from rdk.mols where m@>'c1cccc2c1nncc2' ; count ------- 447 (1 row) Time: 107.602 ms chembl_23=# select count(*) from rdk.mols where m@>'c1ccnc2c1nccn2' ; count ------- 1013 (1 row) Time: 216.222 ms chembl_23=# select count(*) from rdk.mols where m@>'c1cncc2n1ccn2' ; count ------- 1775 (1 row) Time: 88.266 ms chembl_23=# select count(*) from rdk.mols where m@>'Nc1ncnc(N)n1' ; count ------- 5842 (1 row) Time: 327.855 ms chembl_23=# select count(*) from rdk.mols where m@>'c1scnn1' ; count ------- 15962 (1 row) Time: 568.675 ms chembl_23=# select count(*) from rdk.mols where m@>'c1cccc2c1ncs2' ; count ------- 18986 (1 row) Time: 998.104 ms chembl_23=# select count(*) from rdk.mols where m@>'c1cccc2c1CNCCN2' ; count ------- 1613 (1 row) Time: 1922.273 ms
最後の2つのクエリでは、実行し全ての結果の数を数え始めるまでに時間がかかったことに注意してください。
170万化合物全体から検索していることを考えれば、これらの検索時間が信じられないほど遅いというわけではありませんが、もっと速くなるならそれに越したことはないでしょう。
特に大きな数の結果を返すクエリにおいて、検索を加速する簡単な方法のひとつは、限られた数の結果のみを取得することです:
chembl_23=# select * from rdk.mols where m@>'c1cccc2c1CNCCN2' limit 100; molregno | m ----------+----------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------- 908048 | O=C1CN(C(=O)c2ccc(Br)o2)C(c2ccc(F)cc2)c2cc(F)ccc2N1 931972 | Cl.c1ccc(CC2CNc3ccccc3CN2)cc1 904450 | CCOC(=O)[C@H]1[C@H]2COc3ccc(Cl)cc3[C@@H]2N2C(=O)c3ccc(Cl)cc3NC(=O)[C@@]12C 226391 | C/C=C1/CC2C(OC)Nc3cc(OC)c(OC)cc3C(=O)N2C1 930820 | CN1CC(=O)N(CC(=O)Nc2ccc(N(C)C)cc2)c2ccccc2C1=O 18576 | CO[C@H]1Nc2c(ccc(C)c2O)C(=O)N2C=C(/C=C/C(N)=O)C[C@@H]12 249934 | O=C(c1cccc2ccccc12)N1CCN(Cc2cncn2Cc2ccccc2)c2ccccc2C1 ... 91020 | CC(C)C[C@H]1C(=O)N2c3ccccc3[C@@](O)(C[C@@H]3NC(=O)c4ccccc4N4C(=O)c5ccccc5NC34)[C@H]2N1C(=O)C(CCCNC(=O)OCc1ccccc1)NC(=O)OC(C)(C)C 91225 | CC(C)C[C@H]1C(=O)N2c3ccccc3[C@@](O)(C[C@@H]3NC(=O)c4ccccc4N4C(=O)c5ccccc5NC34)[C@H]2N1C(=O)CCC(=O)[O-].[Na+] 348798 | O=C(O)CN1C(=O)C(c2ccc(Cl)cc2)N(C(C(=O)O)c2ccc(Cl)cc2)C(=O)c2cc(I)ccc21 348972 | C[C@H](c1ccc(Cl)cc1)N1C(=O)c2cc(I)ccc2N(CCCCC(=O)O)C(=O)[C@@H]1c1ccc(C(F)(F)F)cc1 ...skipping 23 lines Time: 97.357 ms
SMARTSベースのクエリ(SMARTS-based queries)
[Link] https://www.rdkit.org/docs/Cartridge.html#smarts-based-queries
オキサジアゾールあるいはチアジアゾール:
chembl_23=# select * from rdk.mols where m@>'c1[o,s]ncn1'::qmol limit 500; molregno | m ----------+-------------------------------------------------------------------------------------------------------------- 1370170 | Fc1cccc(-c2nc(NCC3COc4ccccc4O3)no2)c1F 1370417 | COc1cc(CN2CCC(Cc3nc(-c4ccc5c(c4)CCO5)no3)C2)ccc1F 1370526 | Cl.Cn1cc(-c2noc(/C=C3/CCN4CCCC[C@@H]4C3)n2)c2ccccc21 1379267 | CCC(c1ccccc1)c1noc(CCN(CC)CC)n1 1404150 | OC[C@H]1O[C@H](c2nc(-c3nc(-c4cccs4)no3)cs2)C[C@@H]1O 1217463 | CC(C)(C)c1ccc(-c2noc(CCC(=O)N3CCCCC3)n2)cc1 ... 1517753 | CC(C)c1noc(N2CCC(CO[C@H]3CC[C@H](c4ccc(S(C)(=O)=O)cc4F)CC3)CC2)n1 1263024 | COc1cc(Nc2nc3c(s2)CCCC3c2ccccc2)ccc1-c1nc(C)no1 1264016 | O=C(O)CCc1nc2cc(-c3noc(-c4cc(C(F)(F)F)cc(C(F)(F)F)c4)n3)ccc2[nH]1 1847733 | Cc1cc(-c2noc([C@H]3CCCCN3C(=O)COc3ccccc3)n2)no1 (500 rows) Time: 761.847 ms
純粋なSMILESのクエリと比較すると遅いですが、これはSMARTSベースのクエリには一般的に当てはまることです。
立体化学の使用方法(Using Stereochemistry)
[Link] https://www.rdkit.org/docs/Cartridge.html#using-stereochemistry
デフォルトでは部分構造クエリを実行する際に立体化学が考慮されないことに気をつけてください:
chembl_23=# select * from rdk.mols where m@>'NC(=O)[C@@H]1CCCN1C=O' limit 10; molregno | m ----------+----------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------- 87611 | CNCC(=O)N[C@@H](CCCN=C(N)N)C(=O)N1C[C@H]2C[C@H]1C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](C(=O)N[C@@H](Cc1c[nH]cn1)C(=O)N1CCC[C@H]1C(=O)N[C@@H](Cc1ccccc1)C(=O )O)CCSS2 88372 | CNCCCC[C@H](NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@@H](CCCCNC)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](CO)NC(=O)[C@@H](Cc1ccccc1)NC(=O)[C@@H](Cc1ccccc1)NC(=O)[C@@H](C c1ccc2ccccc2c1)NC(C)=O)C(=O)N1CCC[C@@H]1C(=O)N[C@H](C)C(=O)O 88322 | CC(=O)N[C@H](Cc1ccc2ccccc2c1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@@H](CO)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](CCCCNC(C)C)C(=O)N[C@@H](Cc1 ccccc1)C(=O)N[C@@H](CCCCNC(C)C)C(=O)N1CCC[C@@H]1C(=O)N[C@H](C)C(=O)O 88168 | CC(=O)N[C@H](Cc1ccc2ccccc2c1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@@H](CO)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](CCCN=C(N)N)C(=O)N[C@@H](Cc1 ccccc1)C(=O)N[C@@H](CCCCNC1CCCC1)C(=O)N1CCC[C@@H]1C(=O)N[C@H](C)C(=O)O 88150 | CC(=O)N[C@H](Cc1ccc2ccccc2c1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@@H](CO)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](CCCN=C(N)N)C(=O)N[C@@H](Cc1 ccccc1)C(=O)N[C@@H](CCCCNCc1ccc(C)cc1)C(=O)N1CCC[C@@H]1C(=O)N[C@H](C)C(=O)O 88373 | CC(=O)N[C@H](Cc1ccc2ccccc2c1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@H](Cc1ccccc1)C(=O)N[C@@H](CO)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](CCCCNC1CCCCC1)C(=O)N[C@@H]( Cc1ccccc1)C(=O)N[C@@H](CCCCNC1CCCCC1)C(=O)N1CCC[C@@H]1C(=O)N[C@H](C)C(=O)O 93377 | CC(=O)N[C@@H](Cc1ccc([N+](=O)[O-])cc1)C(=O)N1CCC[C@H]1C(=O)N[C@@H](CCC/N=C(/N)NS(=O)(=O)c1c(C)c(C)c2c(c1C)CCC(C)(C)O2)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H]( CCC/N=C(/N)NS(=O)(=O)c1c(C)c(C)c2c(c1C)CCC(C)(C)O2)C(=O)N[C@H](C(=O)NCC(=O)N[C@@H](COC(C)(C)C)C(=O)N[C@@H](CCCCNC(=O)c1ccccc1N)C(=O)NCC(=O)O)[C@@H](C)OC(C)(C)C 94493 | CC(C)C[C@@H]1NC(=O)[C@H]([C@@H](C)O)NC(=O)[C@H](Cc2c[nH]c3ccccc23)NC(=O)[C@H](C(C)C)NC(=O)[C@H](NC(=O)[C@H](CCCCN)NC(=O)[C@@H]2CCCN2C(=O)[C@H](CCC(N)=O)NC (=O)CNC(=O)CN)CSSC[C@@H](C(=O)N[C@@H](Cc2ccc(O)cc2)C(=O)N[C@@H](CO)C(=O)N[C@H](C(=O)NCC(=O)NCC(N)=O)[C@@H](C)O)NC(=O)[C@H](Cc2c[nH]cn2)NC(=O)[C@H](Cc2ccccc2)NC(=O)CNC (=O)[C@@H]2CCCN2C1=O ...skipping 1 line 89559 | CC1(C)SSC(C)(C)[C@@H](C(=O)N[C@@H](Cc2c[nH]cn2)C(=O)N2CCC[C@H]2C(=O)N[C@@H](Cc2ccccc2)C(=O)O)NC(=O)[C@H](Cc2ccc(O)cc2)NC(=O)[C@H]1NC(=O)[C@H](CCCN=C(N)N)N C(=O)[C@@H](N)CC(=O)O (10 rows)
rdkit.do_chiral_sss構成変数を使うことで設定を変えることができます:
chembl_23=# set rdkit.do_chiral_sss=true; SET Time: 0.241 ms chembl_23=# select * from rdk.mols where m@>'NC(=O)[C@@H]1CCCN1C=O' limit 10; molregno | m ----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------- 87611 | CNCC(=O)N[C@@H](CCCN=C(N)N)C(=O)N1C[C@H]2C[C@H]1C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](C(=O)N[C@@H](Cc1c[nH]cn1)C(=O)N1CCC[C@H]1C(=O)N[C@@H](Cc1ccccc1)C(=O)O) CCSS2 93377 | CC(=O)N[C@@H](Cc1ccc([N+](=O)[O-])cc1)C(=O)N1CCC[C@H]1C(=O)N[C@@H](CCC/N=C(/N)NS(=O)(=O)c1c(C)c(C)c2c(c1C)CCC(C)(C)O2)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](CCC /N=C(/N)NS(=O)(=O)c1c(C)c(C)c2c(c1C)CCC(C)(C)O2)C(=O)N[C@H](C(=O)NCC(=O)N[C@@H](COC(C)(C)C)C(=O)N[C@@H](CCCCNC(=O)c1ccccc1N)C(=O)NCC(=O)O)[C@@H](C)OC(C)(C)C 94493 | CC(C)C[C@@H]1NC(=O)[C@H]([C@@H](C)O)NC(=O)[C@H](Cc2c[nH]c3ccccc23)NC(=O)[C@H](C(C)C)NC(=O)[C@H](NC(=O)[C@H](CCCCN)NC(=O)[C@@H]2CCCN2C(=O)[C@H](CCC(N)=O)NC(=O )CNC(=O)CN)CSSC[C@@H](C(=O)N[C@@H](Cc2ccc(O)cc2)C(=O)N[C@@H](CO)C(=O)N[C@H](C(=O)NCC(=O)NCC(N)=O)[C@@H](C)O)NC(=O)[C@H](Cc2c[nH]cn2)NC(=O)[C@H](Cc2ccccc2)NC(=O)CNC(=O)[C @@H]2CCCN2C1=O 89558 | NC(N)=NCCC[C@H](NC(=O)[C@@H](N)CC(=O)O)C(=O)N[C@H]1CCSSC[C@@H](C(=O)N[C@@H](Cc2c[nH]cn2)C(=O)N2CCC[C@H]2C(=O)N[C@@H](Cc2ccccc2)C(=O)O)NC(=O)[C@H](Cc2ccc(O)cc 2)NC1=O 89559 | CC1(C)SSC(C)(C)[C@@H](C(=O)N[C@@H](Cc2c[nH]cn2)C(=O)N2CCC[C@H]2C(=O)N[C@@H](Cc2ccccc2)C(=O)O)NC(=O)[C@H](Cc2ccc(O)cc2)NC(=O)[C@H]1NC(=O)[C@H](CCCN=C(N)N)NC(= O)[C@@H](N)CC(=O)O 126618 | NC(=O)[C@@H]1CCCN1C(=O)[C@@H]1CCCN1C(=O)[C@@H](O)[C@H](N)Cc1ccccc1 152339 | O=C(O)CN[C@H](CC1CCCCC1)C(=O)N1CCC[C@H]1C(=O)NCCCc1c[nH]cn1 152504 | N[C@H](CC1CCCCC1)C(=O)N1[C@H](C(=O)NC/C=C/c2c[nH]cn2)C[C@@H]2CCCC[C@@H]21 152383 | N[C@H](CC1CCCCC1)C(=O)N1CCC[C@H]1C(=O)NCCCCc1c[nH]cn1 151837 | N[C@H](CC1CCCCC1)C(=O)N1CCC[C@H]1C(=O)NC/C=C/c1c[nH]cn1 (10 rows) Time: 6.181 ms
クエリの調整(Tuning queries)
[Link] https://www.rdkit.org/docs/Cartridge.html#tuning-queries
複雑なSMARTSクエリを構築する必要無しに、部分構造クエリをもう少しコントロールすることができれば、しばしば役に立つでしょう。カートリッジの関数mol_adjust_query_properties()
はちょうどこの目的のため使うことができます。2,6-二置換ピリジンのクエリを使って、デフォルトの場合どのような動きを示すか例をお見せします:
chembl_23=# select molregno,m from rdk.mols where m@>mol_adjust_query_properties('*c1cccc(NC(=O)*)n1') limit 10; molregno | m ----------+------------------------------------------------------------------------------------------- 1993749 | Cn1c(Nc2c(Cl)ccc(CNC(=O)C(C)(C)C)c2Cl)nc2cc(C(=O)Nc3cccc(C(F)(F)F)n3)c(N3CCC(F)(F)C3)cc21 1988455 | Cc1cccc(C(=O)Nc2cccc(Oc3cccnc3)n2)c1 1870095 | COC(=O)CN(C(=O)C(C)c1c(F)cccc1F)c1cccc(C)n1 1870023 | CCC(C)C(=O)N(CC(=O)OC)c1cccc(C)n1 1873944 | Cc1ccc(C(=O)N(C)CC(=O)Nc2cccc(C)n2)cn1 1873968 | Cc1cccc(NC(=O)CN(C)C(=O)c2ccc(-n3cccc3)nc2)n1 1882693 | Cc1cccc(NC(=O)CCNCc2c(C)nn(C)c2N(C)C)n1 1882711 | COc1c(CNCCC(=O)Nc2cccc(C)n2)c(C)nn1C 1868705 | CCOc1cccc(NC(=O)c2cnc(C)cn2)n1 1875177 | Cc1cccc(NC(=O)[C@@H]2CCCN2Cc2nc(C)c(C)o2)n1 (10 rows) Time: 11.895 ms
デフォルトではmol_adjust_query_properties()
は次の変更を分子に施します:
* ダミーアトムを"any"クエリに変換する
* 環の原子全てに級クエリを追加し、置換が与えられているものと合致するようにする
* 芳香族性の認識が行われる(まだ行われていない場合)
追加のJSON引数を与えることで、動きを制御することができます。ここでは追加の級クエリを機能させなくする例を示します:
chembl_23=# select molregno,m from rdk.mols where m@>mol_adjust_query_properties('*c1cccc(NC(=O)*)n1', chembl_23(# '{"adjustDegree":false}') limit 10; molregno | m ----------+------------------------------------------------------------------------------------------- 1993749 | Cn1c(Nc2c(Cl)ccc(CNC(=O)C(C)(C)C)c2Cl)nc2cc(C(=O)Nc3cccc(C(F)(F)F)n3)c(N3CCC(F)(F)C3)cc21 1957849 | COc1ccc2ncc(F)c(C[C@H](O)C3CCC(NCc4nc5c(cc4F)OCC(=O)N5)CO3)c2n1 1959611 | O=C1COc2ccc(CNC3CCN(CCn4c(=O)ccc5ncc(OCc6cccnn6)cc54)CC3)nc2N1 1988455 | Cc1cccc(C(=O)Nc2cccc(Oc3cccnc3)n2)c1 1870095 | COC(=O)CN(C(=O)C(C)c1c(F)cccc1F)c1cccc(C)n1 1870023 | CCC(C)C(=O)N(CC(=O)OC)c1cccc(C)n1 1873944 | Cc1ccc(C(=O)N(C)CC(=O)Nc2cccc(C)n2)cn1 1873968 | Cc1cccc(NC(=O)CN(C)C(=O)c2ccc(-n3cccc3)nc2)n1 1882693 | Cc1cccc(NC(=O)CCNCc2c(C)nn(C)c2N(C)C)n1 1882711 | COc1c(CNCCC(=O)Nc2cccc(C)n2)c(C)nn1C (10 rows) Time: 10.780 ms
あるいは、環構造の原子にもダミー(鎖状構造の原子と結合しているもの)にも追加の級クエリを付加しない例を示します:
chembl_23=# select molregno,m from rdk.mols where m@>mol_adjust_query_properties('*c1cccc(NC(=O)*)n1', chembl_23(# '{"adjustDegree":true,"adjustDegreeFlags":"IGNORERINGS|IGNOREDUMMIES"}') limit 10; molregno | m ----------+------------------------------------------------------------------------------------------- 1993749 | Cn1c(Nc2c(Cl)ccc(CNC(=O)C(C)(C)C)c2Cl)nc2cc(C(=O)Nc3cccc(C(F)(F)F)n3)c(N3CCC(F)(F)C3)cc21 1957849 | COc1ccc2ncc(F)c(C[C@H](O)C3CCC(NCc4nc5c(cc4F)OCC(=O)N5)CO3)c2n1 1959611 | O=C1COc2ccc(CNC3CCN(CCn4c(=O)ccc5ncc(OCc6cccnn6)cc54)CC3)nc2N1 1988455 | Cc1cccc(C(=O)Nc2cccc(Oc3cccnc3)n2)c1 1873944 | Cc1ccc(C(=O)N(C)CC(=O)Nc2cccc(C)n2)cn1 1873968 | Cc1cccc(NC(=O)CN(C)C(=O)c2ccc(-n3cccc3)nc2)n1 1882693 | Cc1cccc(NC(=O)CCNCc2c(C)nn(C)c2N(C)C)n1 1882711 | COc1c(CNCCC(=O)Nc2cccc(C)n2)c(C)nn1C 1884388 | Cc1noc(COCC(=O)Nc2ccc(Br)c(C)n2)n1 1868705 | CCOc1cccc(NC(=O)c2cnc(C)cn2)n1 (10 rows) Time: 12.827 ms
利用可能なオプションは以下の通りです:
- adjustDegree(default: true) : 入力の原子の級とマッチするようにクエリを付与する
- adjustDegreeFlags (default: ADJUST_IGNOREDUMMIES | ADJUST_IGNORECHAINS) 級が調整されている場所をコントロールする
- adjustRingCount (default: false) : 入力の環構造の数にマッチするようにクエリを付与する
- adjustRingCountFlags (default: ADJUST_IGNOREDUMMIES | ADJUST_IGNORECHAINS) 環構造の数が調整されている場所をコントロールする
- makeDummiesQueries (default: true) : 入力構造のダミーアトムをany-atomクエリに変換する
- aromatizeIfPossible (default: true) : 入力構造に芳香族性を認識するアルゴリズムの処理を行う(注: SMILESから構築された分子はいつも芳香族の認識処理が行われているので、これは多くの場合余分な処理です)
- makeBondsGeneric (default: false) : 結合をany-bondクエリに変換する
- makeBondsGenericFlags (default: false) : どの結合を一般的なものにするかコントロールする
- makeAtomsGeneric (default: false) : 原子をany-atomクエリに変換する
- makeAtomsGenericFlags (default: false) : どの原子を一般的なものとするかコントロールする
上で述べた、特定のオプションが適用されている場所をコントロールするさまざまなFlags
引数は,
下のリストにある操作を|
記号で連結することで構築されています。
- IGNORENONE : 操作を全ての原子に適用する
- IGNORERINGS : 環構造の原子に操作を適用しない
- IGNORECHAINS : 鎖状構造の原子に操作を適用しない
- IGNOREDUMMIES : ダミー原子に操作を適用しない
- IGNORENONDUMMIES : 非ダミー原子に操作を適用しない
- IGNOREALL : anyアトムに操作を適用しない
類似度検索(Similarity searches)
[Link] https://www.rdkit.org/docs/Cartridge.html#similarity-searches
基本的な類似度検索:
chembl_23=# select count(*) from rdk.fps where mfp2%morganbv_fp('Cc1ccc2nc(-c3ccc(NC(C4N(C(c5cccs5)=O)CCC4)=O)cc3)sc2c1'); count ------- 67 (1 row) Time: 177.579 ms
一般的に我々は、付随するSMILESと一緒に、近傍の分子のソートされた一覧を見つけ出したいと思っています。このSQL関数はそのような形式を簡単にします。
chembl_23=# create or replace function get_mfp2_neighbors(smiles text) returns table(molregno integer, m mol, similarity double precision) as $$ select molregno,m,tanimoto_sml(morganbv_fp(mol_from_smiles($1::cstring)),mfp2) as similarity from rdk.fps join rdk.mols using (molregno) where morganbv_fp(mol_from_smiles($1::cstring))%mfp2 order by morganbv_fp(mol_from_smiles($1::cstring))<%>mfp2; $$ language sql stable ; CREATE FUNCTION Time: 0.856 ms chembl_23=# select * from get_mfp2_neighbors('Cc1ccc2nc(-c3ccc(NC(C4N(C(c5cccs5)=O)CCC4)=O)cc3)sc2c1') limit 10; molregno | m | similarity ----------+------------------------------------------------------------+------------------- 471319 | Cc1ccc2nc(-c3ccc(NC(=O)C4CCN(S(=O)(=O)c5cccs5)C4)cc3)sc2c1 | 0.638888888888889 1032469 | O=C(Nc1nc2ccc(Cl)cc2s1)[C@@H]1CCCN1C(=O)c1cccs1 | 0.623188405797101 751668 | COc1ccc2nc(NC(=O)[C@@H]3CCCN3C(=O)c3cccs3)sc2c1 | 0.619718309859155 471318 | Cc1ccc2nc(-c3ccc(NC(=O)C4CN(S(=O)(=O)c5cccs5)C4)cc3)sc2c1 | 0.611111111111111 740754 | Cc1ccc(NC(=O)C2CCCN2C(=O)c2cccs2)cc1C | 0.606060606060606 732905 | O=C(Nc1ccc(S(=O)(=O)N2CCCC2)cc1)C1CCCN1C(=O)c1cccs1 | 0.602941176470588 1087495 | Cc1ccc(NC(=O)C2CCCN2C(=O)c2cccs2)c(C)c1 | 0.597014925373134 471462 | CCS(=O)(=O)N1CCC(C(=O)Nc2ccc(-c3nc4ccc(C)cc4s3)cc2)CC1 | 0.585714285714286 810850 | Cc1cc(C)n(-c2ccc(NC(=O)C3CCCCN3C(=O)c3cccs3)cc2)n1 | 0.583333333333333 1224407 | O=C(Nc1cccc(S(=O)(=O)N2CCCC2)c1)C1CCCN1C(=O)c1cccs1 | 0.579710144927536 (10 rows) Time: 28.909 ms chembl_23=# select * from get_mfp2_neighbors('Cc1ccc2nc(N(C)CC(=O)O)sc2c1') limit 10; molregno | m | similarity ----------+-------------------------------------------------------+------------------- 1044892 | Cc1ccc2nc(N(CCN(C)C)C(=O)c3cc(Cl)sc3Cl)sc2c1 | 0.518518518518518 1040496 | Cc1ccc2nc(N(CCCN(C)C)C(=O)CCc3ccccc3)sc2c1 | 0.517857142857143 1049393 | Cc1ccc2nc(N(CCCN(C)C)C(=O)CS(=O)(=O)c3ccccc3)sc2c1 | 0.517857142857143 441378 | Cc1ccc2nc(NC(=O)CCC(=O)O)sc2c1 | 0.510204081632653 1047691 | Cc1ccc(S(=O)(=O)CC(=O)N(CCCN(C)C)c2nc3ccc(C)cc3s2)cc1 | 0.509090909090909 911501 | Cc1ccc2nc(N(CCN(C)C)C(=O)c3cc(Cl)sc3Cl)sc2c1.Cl | 0.509090909090909 1042958 | Cc1ccc2nc(N(CCN(C)C)C(=O)c3ccc4ccccc4c3)sc2c1 | 0.509090909090909 775269 | Cc1ccc2nc(N(CCCN(C)C)C(=O)CCc3ccccc3)sc2c1.Cl | 0.508771929824561 1045663 | Cc1ccc2nc(N(CCCN(C)C)C(=O)COc3ccc(Cl)cc3)sc2c1 | 0.5 1015485 | Cc1ccc2nc(N(Cc3cccnc3)C(=O)Cc3ccccc3)sc2c1 | 0.5 (10 rows) Time: 41.623 ms
類似度のカットオフの調整(Adjusting the similarity cutoff)
[Link] https://www.rdkit.org/docs/Cartridge.html#adjusting-the-similarity-cutoff
デフォルトでは類似度検索で返される最小の類似度は0.5です。この値はrdkit.tanimoto_threshold(及び rdkit.dice_threshold)構成変数により調整することができます:
chembl_23=# select count(*) from get_mfp2_neighbors('Cc1ccc2nc(N(C)CC(=O)O)sc2c1'); count ------- 20 (1 row) Time: 181.438 ms chembl_23=# set rdkit.tanimoto_threshold=0.7; SET Time: 0.047 ms chembl_23=# select count(*) from get_mfp2_neighbors('Cc1ccc2nc(N(C)CC(=O)O)sc2c1'); count ------- 0 (1 row) Time: 161.228 ms chembl_23=# set rdkit.tanimoto_threshold=0.6; SET Time: 0.045 ms chembl_23=# select count(*) from get_mfp2_neighbors('Cc1ccc2nc(N(C)CC(=O)O)sc2c1'); count ------- 1 (1 row) Time: 184.275 ms chembl_23=# set rdkit.tanimoto_threshold=0.5; SET Time: 0.055 ms chembl_23=# select count(*) from get_mfp2_neighbors('Cc1ccc2nc(N(C)CC(=O)O)sc2c1'); count ------- 20 (1 row) Time: 181.100 ms
MCSコードの使い方(Using the MCS Code)
[Link] https://www.rdkit.org/docs/Cartridge.html#using-the-mcs-code
最も簡単なMCSコードの使い方は、分子のグループから最大共通部分構造を見つけ出すことです:
chembl_23=# select fmcs(m::text) from rdk.mols join compound_records using (molregno) where doc_id=4; fmcs ------------------------------------------------------------------------ [#6](-[#6]-[#7]-[#6]-[#6](-,:[#6])-,:[#6])-,:[#6]-,:[#6]-,:[#6]-,:[#6] (1 row) Time: 31.041 ms chembl_23=# select fmcs(m::text) from rdk.mols join compound_records using (molregno) where doc_id=5; fmcs ------------------------------------------------------------------------------------------------------------------------------------------ [#6]-[#6](=[#8])-[#7]-[#6](-[#6](=[#8])-[#7]1-[#6]-[#6]-[#6]-[#6]-1-[#6](=[#8])-[#7]-[#6](-[#6](=[#8])-[#8])-[#6]-[#6])-[#6](-[#6])-[#6] (1 row) Time: 705.535 ms
同じことがSMILESのカラムでできます:
chembl_23=# select fmcs(canonical_smiles) from compound_structures join compound_records using (molregno) where doc_id=4; fmcs ------------------------------------------------------------------------ [#6](-[#7]-[#6]-[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6])-[#6](-,:[#6])-,:[#6] (1 row) Time: 128.879 ms
このページを書いている時点(2017_03リリース)では幾分骨の折れる作業ですが、パラメータのいくつかをFMCSアルゴリズムに合わせることも可能です。
chembl_23=# select fmcs_smiles(str,'{"Threshold":0.8}') from chembl_23-# (select string_agg(m::text,' ') as str from rdk.mols chembl_23(# join compound_records using (molregno) where doc_id=4) as str ; fmcs_smiles ------------------------------------------------------------------------------------------------------------------------------------------------------------------ [#6]-[#6]-[#8]-[#6](-[#6](=[#8])-[#7]-[#6](-[#6])-[#6](-,:[#6])-,:[#6])-[#6](-[#8])-[#6](-[#8])-[#6](-[#8]-[#6]-[#6])-[#6]-[#7]-[#6](-[#6])-[#6](-,:[#6])-,:[#6] (1 row) Time: 9673.949 ms chembl_23=# chembl_23=# select fmcs_smiles(str,'{"AtomCompare":"Any"}') from chembl_23-# (select string_agg(m::text,' ') as str from rdk.mols chembl_23(# join compound_records using (molregno) where doc_id=4) as str ; fmcs_smiles ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [#6]-,:[#6,#7]-[#8,#6]-[#6,#7](-[#6,#8]-[#7,#6]-,:[#6,#7]-,:[#6,#7]-,:[#7,#6]-,:[#6])-[#6,#7]-[#6]-[#6](-[#8,#6]-[#6])-[#6,#7]-[#7,#6]-[#6]-,:[#6,#8]-,:[#7,#6]-,:[#6] (1 row) Time: 304.332 ms
注 "AtomCompare":"Any"
と1.0よりも小さい"Threshold"
の組み合わせは、極めて一般的な検索となり、とても長い検索時間がかかるという結果になりうる可能性があります。この組み合わせを使う場合は"Tmieout"
を使うことを推奨します:
chembl_23=# select fmcs_smiles(str,'{"AtomCompare":"Any","CompleteRingsOnly":true,"Threshold":0.8,"Timeout":60}') from chembl_23-# (select string_agg(m::text,' ') as str from rdk.mols chembl_23(# join compound_records using (molregno) where doc_id=3) as str ; WARNING: findMCS timed out, result is not maximal fmcs_smiles ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------- [#8]=[#6](-[#7]-[#6]1:[#6]:[#6]:[#6](:[#6]:[#6]:1)-[#6](=[#8])-[#7]1-[#6]-[#6]-[#6]-[#6,#7]-[#6]2:[#6]-1:[#6]:[#6]:[#16]:2)-[#6]1:[#6]:[#6]:[#6]:[#6]:[#6]:1-[#6]1:[#6]: [#6]:[#6]:[#6]:[#6]:1 (1 row) Time: 60479.753 ms
利用可能なパラメータとデフォルトの値は以下の通りです:
- MaximizeBonds (true)
- Threshold (1.0)
- Timeout (-1, no timeout)
- MatchValences (false)
- MatchChiralTag (false) 原子に適用
- RingMatchesRingOnly (false)
- CompleteRingsOnly (false)
- MatchStereo (false) 結合に適用
- AtomCompare (“Elements”) 選択肢は“Elements”、“Isotopes”あるいは“Any”
- BondCompare (“Order”) 選択肢は“Order”、“OrderExact”あるいは“Any”
レファレンスガイド(Reference Guide)
[Link] https://www.rdkit.org/docs/Cartridge.html#reference-guide
新しい型(New Types)
[Link] https://www.rdkit.org/docs/Cartridge.html#new-types
- mol : rdkitにおける分子(rdkit molecule)。SMILESから直接、型を変更することで作ることができます。例えば:‘c1ccccc1’::mol は、SMILES‘c1ccccc1’で表される分子を作成します。
- qmol :クエリ機能を含むrdkitの分子(すなわち、SMARTSから構築されたもの)。SMARTSから直接、型を変更することで作ることができます。例えば: ‘c1cccc[c,n]1’::qmol はSMARTS ‘c1cccc[c,n]1’で表されるクエリ分子を作成します。
- sfp : スパースカウントベクトルフィンガープリント(sparse count vector fingerprint)(C++とPythonのSparseIntVect)
- bfp : ビットベクトルフィンガープリント(bit vector fingerprint)(C++とPythonのExplicitBitVect)
パラメータ(Parameters)
[Link] https://www.rdkit.org/docs/Cartridge.html#parameters
- rdkit.tanimoto_threshold : タニモト類似度演算子のための閾値。タニモト類似度を使った検索では、少なくともこの閾値以上の類似度をもつ結果のみ返されます。
- rdkit.dice_threshold : Dice類似度演算子のための閾値。Dice類似度を使った検索では、少なくともこの閾値以上の類似度をもつ結果のみ返されます。
- rdkit.do_chiral_sss : 部分構造マッチングで立体化学が使われているかいないかを切り替えます。(2013_03リリースから利用可能)
- rdkit.sss_fp_size : 部分構造検索スクリーニングで使われるフィンガープリントのサイズ(ビット数)。
- rdkit.morgan_fp_size : Morganフィンガープリントのサイズ(ビット数)。
- rdkit.featmorgan_fp_size : FeatMorganフィンガープリントのサイズ(ビット数)。
- rdkit.layered_fp_size : 層化(layered)フィンガープリントのサイズ(ビット数)
- rdkit.rdkit_fp_size : RDKitフィンガープリントのサイズ(ビット数)
- rdkit.torsion_fp_size : トポロジカルトーションビットベクトルフィンガープリントのサイズ(ビット数)
- rdkit.atompair_fp_size : アトムペアビットベクトルフィンガープリントのサイズ(ビット数)
- rdkit.avalon_fp_size : Avalonフィンガープリントのサイズ(ビット数)
演算子(Operators)
[Link] https://www.rdkit.org/docs/Cartridge.html#operators
類似度検索(Similarity search)
[Link] https://www.rdkit.org/docs/Cartridge.html#similarity-search
- % : タニモト類似度を使った検索で使われる演算子。2つのフィンガープリント(sfp値2つ、あるいはbfp値2つ)の間のタニモト類似度が閾値 rdkit.tanimoto_threshold を超えているか否かを返します。
- # : Dice類似度を使った検索で使われる演算子。2つのフィンガープリント(sfp値2つ、あるいはbfp値2つ)の間のDice類似度が閾値 rdkit.dice_threshold を超えているか否かを返します。
- <%> : タニモト k近傍法検索に使われます(近傍の分子の並べ替えられたリストを返すために使われます)。
- <#> : Dice k近傍法検索に使われます(近傍の分子の並べ替えられたリストを返すために使われます)。
部分構造検索と正確な構造の検索(Substructure and exact strucure search)
[Link] https://www.rdkit.org/docs/Cartridge.html#substructure-and-exact-structure-search
- @> : 部分構造検索の演算子。演算子の右側におかれたmolあるいはqmolが、左側のmolの部分構造であるか否かを返します。
- <@ : 部分構造検索の演算子。演算子の左側におかれたmolあるいはqmolが、右側のmolの部分構造であるか否かを返します。
- @= : 2つの分子が同一であるか否かを返します。
分子の比較(Molecule comparison)
[Link] https://www.rdkit.org/docs/Cartridge.html#molecule-comparison
- < : 左側のmolが右側もmolよりも小さいか否かを返します。
- > : 左側のmolが右側もmolよりも大きいか否かを返します。
- = : 左側のmolが右側のmolと等しいか否かを返します。
- <= : 左側のmolが右側のmol以下であるか否かを返します。
- >= : 左側のmolが右側のmol以上であるか否かを返します。
注意 2つの分子は次の比較を順番に行うことで比べられます。より後の順番の比較は、それより前の値が等しい時だけ行われます:
# Number of atoms # Number of bonds # Molecular weight # Number of rings
上記の全てが同じ値で、2つ目の分子が最初の分子の部分構造の場合、分子は等しいと宣言されます。さもなくば(そうなるべきではありませんが)最初の分子は、2番目よりも小さいと勝手に定義されます。
カートリッジには他にも演算子が定義されていますが、これらは内部の目的のためだけに使われます。
関数(Functions)
[Link] https://www.rdkit.org/docs/Cartridge.html#functions
フィンガープリント関連(Fingerpront Related)
[Link] https://www.rdkit.org/docs/Cartridge.html#fingerprint-related
フィンガープリントの生成(Generating fingerprints)
[Link] https://www.rdkit.org/docs/Cartridge.html#generating-fingerprints
- morgan_fp(mol,int default 2) : 結合関係の不変量を使って求めた、カウントベースのMorganフィンガープリントであるsfpを返します。2つ目の引数は半径を与えます。ECFPに類似したフィンガープリントです。
- morganbv_fp(mol,int default 2) : 結合関係の不変量を使って求めた、ビットベクトルのMorganフィンガープリントであるbfpを返します。2つ目の引数は半径を与えます。ECFPに類似したフィンガープリントです。
- featmorgan_fp(mol,int default 2) : 化学的特徴の不変量を使って求めた、カウントベースのMorganフィンガープリントであるsfpを返します。2つ目の引数は半径を与えます。FCFPに類似したフィンガープリントです。
- featmorganbv_fp(mol,int default 2) : 化学的特徴の不変量を使って求めた、ビットベクトルのMorganフィンガープリントであるbfpを返します。2つ目の引数は半径を与えます。FCFPに類似したフィンガープリントです。
- rdkit_fp(mol) : RDKitフィンガープリントのbfpを返します。ハッシュ化された分子のサブグラフをつかったDaylightフィンガープリントです。.
- atompair_fp(mol) : カウントベースのアトムペアフィンガープリントであるsfpを返します。
- atompairbv_fp(mol) : ビットベクトルのアトムペアフィンガープリントであるbfpを返します。
- torsion_fp(mol) : カウントベースのトポロジカルトーションフィンガープリントであるsfpを返します。
- torsionbv_fp(mol) : ビットベクトルのトポロジカルトーションフィンガープリントであるbfpを返します。
- layered_fp(mol) : 層化(layered)フィンガープリントであるbfpを返します。ハッシュ化された分子のサブグラフを使った実験的な部分構造のフィンガープリントです。
- maccs_fp(mol) : MACCSフィンガープリントであるbfpを返します(2013_01リリースから利用可能です)。
フィンガープリントの取り扱い(Working with fingerpritns)
[Link] https://www.rdkit.org/docs/Cartridge.html#working-with-fingerprints
- tanimoto_sml(fp,fp) : 同じタイプの2つのフィンガープリント(sfp値2つかbfp値2つ)の間のタニモト類似度を返します。
- dice_sml(fp,fp) : 同じタイプの2つのフィンガープリント(sfp値2つかbfp値2つ)の間のDice類似度を返します。
- size(bfp) : bfp(のビット数)の長さを返します。
- add(sfp,sfp) : 2つのsfp引数の要素ごとの足し算によって作成される1つのsfpを返します。
- subtract(sfp,sfp) : 2つのsfp引数の要素ごとの引き算によって作成される1つのsfpを返します。
- all_values_lt(sfp,int) : sfpの引数の全ての要素が、整数の引数よりも小さいか否かを示すブール値を返します。
- all_values_gt(sfp,int) : sfpの引数の全ての要素が、整数の引数よりも大きいか否かを示すブール値を返します。
フィンガープリントの入出力(Fingerprint I/O)
[Link] https://www.rdkit.org/docs/Cartridge.html#fingerprint-i-o
- bfp_to_binary_text(bfp) : 他のソフトウェアでRDKitフィンガープリントに変換し直すことができる、フィンガープリントのバイナリ列表現を保存したbytea型を返します。(Q3 2012(2012_09)リリースから利用可能)
- bfp_from_binary_text(bytea) : フィンガープリントのバイナリ列表現からbfpを作成します。
分子関連(Molecule Related)
[Link] https://www.rdkit.org/docs/Cartridge.html#molecule-related
分子の入出力と妥当性の検証(Molecule I/O and Validation)
[Link] https://www.rdkit.org/docs/Cartridge.html#molecule-i-o-and-validation
- is_valid_smiles(smiles) : SMILES文字列が妥当なRDKit分子を生成しているか否かを返します。
- is_valid_ctab(ctab) : CTAB(mol block)文字列が妥当なRDKit分子を生成しているか否かを返します。
- is_valid_smarts(smarts) : SMARTS文字列が妥当なRDKit分子を生成しているか否かを返します。
- is_valid_mol_pkl(bytea) : バイナリ列(bytea型)がRDKit分子に変換しなおすことができるか否かを返します。(Q3 2012(2012_09)リリースから利用可能)
- mol_from_smiles(smiles) : SMILES文字列に対して分子を返し、分子の構築が失敗した場合はNULLを返します。
- mol_from_smarts(smarts) : SMARTS文字列に対して分子を返し、分子の構築が失敗した場合はNULLを返します。
- mol_from_ctab(ctab, bool default false) : CTAB(mol block)文字列に対して分子を返し、分子の構築が失敗した場合はNULLを返します。オプションの2つ目の引数は分子の座標を保存するか否かをコントロールします。
- mol_from_pkl(bytea) : バイナリ列(bytea型)に対して分子を返し、分子の構築が失敗した場合はNULLを返します。(Q3 2012(2012_09)リリースから利用可能)
- qmol_from_smiles(smiles) : SMILES文字列にたいしてクエリ分子を返し、分子の構築が失敗した場合NULLを返します。SMILESの中で明示的に表されている水素原子は、水素原子が結合している原子のクエリフィーチャーに変換されます。
- qmol_from_ctab(ctab, bool default false) : CTAB(mol block)文字列にたいしてクエリ分子を返し、分子の構築が失敗した場合NULLを返します。SMILESの中で明示的に表されている水素原子は、水素原子が結合している原子のクエリフィーチャーに変換されます。オプションの2つ目の引数は分子の座標を保存するか否かをコントロールします。
- mol_to_smiles(mol) : 分子のカノニカルSMILESを返します。
- mol_to_smarts(mol) : 分子のSMARTS文字列を返します。
- mol_to_pkl(mol) : 分子のバイナリ列(bytea型)を返します。(Q3 2012(2012_09)リリースから利用可能)
- mol_to_ctab(mol,bool default true) : 分子のCTAB(mol block)文字列を返します。オプションの2つ目の引数は、座標を持っていない分子に対して2D座標を生成するか否かをコントロールします。
- mol_to_svg(mol,string default ‘’,int default 250, int default 200, string default ‘’) : 分子の描画を有するSVGを返します。オプションのパラメータは、凡例として使われる文字列、画像の幅、高さ、そして追加のレンダリングについてのパラメータを有するJSONです。(2016_09リリースから利用可能)
部分構造操作(Substructure operations)
[Link] https://www.rdkit.org/docs/Cartridge.html#substructure-operations
- substruct(mol,mol) : 2つ目のmolが1つ目の部分構造であるか否かを返します。
- substruct_count(mol,mol,bool default true) : 2つ目の分子と1つ目の分子の間でマッチしている部分構造の数を返します。3つ目の引数は部分構造のマッチングを重複を除いたユニークなものとするか否かを切り替えます。(2013_03リリースから利用可能)
- mol_adjust_query_properties(mol,string default ‘’) : 追加のクエリ情報が付加された新しい分子を返します。(2016_09リリースから利用可能)
記述子(Descriptors)
[Link] https://www.rdkit.org/docs/Cartridge.html#descriptors
- mol_amw(mol) : 分子のAMWを返します。
- mol_logp(mol) : 分子のMOlLogPを返します。
- mol_tpsa(mol) : 分子のトポロジカル極性表面積を返します(Q1 2011(2011_03)リリースから利用可能です)。
- mol_fractioncsp3(mol) : sp3混成の炭素の割合を返します(2013_03リリースから利用可能)。
- mol_hba(mol) : 分子のリピンスキーの水素結合アクセプターの数(すなわち、OとNの数)を返します。
- mol_hbd(mol) : 分子のリピンスキーの水素結合ドナーの数(すなわち、少なくとも1つHをもつOとNの数)を返します。
- mol_numatoms(mol) : 分子に含まれる原子の総数を返します。
- mol_numheavyatoms(mol) : 分子に含まれるヘビーアトムの数を返します。
- mol_numrotatablebonds(mol) : 分子に含まれる回転可能な結合の数を返します(Q1 2011(2011_03)リリースから利用可能)。
- mol_numheteroatoms(mol) : 分子に含まれるヘテロ原子の数を返します(Q1 2011(2011_03)リリースから利用可能)。
- mol_numrings(mol) : 分子に含まれる環構造の数を返します(Q1 2011(2011_03)リリースから利用可能)。
- mol_numaromaticrings(mol) : 分子に含まれる芳香環の数を返します(2013_03リリースから利用可能)。
- mol_numaliphaticrings(mol) : 分子に含まれる脂肪族(少なくとも一つ非芳香族結合をもつ)環構造の数を返します(2013_03リリースから利用可能)。
- mol_numsaturatedrings(mol) : 分子に含まれる飽和環の数を返します(2013_03リリースから利用可能)。
- mol_numaromaticheterocycles(mol) : 分子に含まれる芳香族ヘテロ環の数を返します(2013_03リリースから利用可能)。
- mol_numaliphaticheterocycles(mol) : 分子に含まれる脂肪族(少なくとも一つ非芳香族結合をもつ)環構造の数を返します(2013_03リリースから利用可能)。
- mol_numsaturatedheterocycles(mol) : 分子に含まれる飽和ヘテロ環の数を返します(2013_03リリースから利用可能)。
- mol_numaromaticcarbocycles(mol) : 分子に含まれる芳香族炭素環の数を返します(2013_03リリースから利用可能)。
- mol_numaliphaticcarbocycles(mol) : 分子に含まれる脂肪族(少なくとも一つ非芳香族結合をもつ)炭素環の数を返します(2013_03リリースから利用可能)。
- mol_numsaturatedcarbocycles(mol) : 分子に含まれる飽和炭素環の数を返します(2013_03リリースから利用可能)。
- mol_inchi(mol) : 分子のInChIを返します。(2011_06リリースから利用可能で、RDKitがInChIサポートとともにビルドされている必要があります)。
- mol_inchikey(mol) : 分子のInChI keyを返します。(2011_06リリースから利用可能で、RDKitがInChIサポートとともにビルドされている必要があります)。
- mol_formula(mol,bool default false, bool default true) : 分子式をもつ文字列を返します。2つ目の引数は分子式に同位体の情報を含むかどうかをコントロールします;3つ目の引数は"D"と"T"を、[2H]と[3H]の代わりに使うかどうかをコントロールします。(2014_03リリースから利用可能)
結合関係記述子(Connectivity Desctiptors)
[Link] https://www.rdkit.org/docs/Cartridge.html#connectivity-descriptors
- mol_chi0v(mol) - mol_chi4v(mol) : x=0-4のChiXvの値を返します(2012_01リリースから利用可能)
- mol_chi0n(mol) - mol_chi4n(mol) : x=0-4のChiXnの値を返します(2012_01リリースから利用可能)
- mol_kappa1(mol) - mol_kappa3(mol) : x=1-3のkappaXの値を返します(2012_01リリースから利用可能)
- mol_numspiroatoms : 分子に含まれるスピロ原子の数を返します(2015_09リリースから利用可能)
- mol_numbridgeheadatoms : 分子に含まれる橋頭位の原子の数を返します(2015_09リリースから利用可能)。
MCS
[Link] https://www.rdkit.org/docs/Cartridge.html#mcs
- fmcs(mols) : 分子のセットについてMCSを計算する集合関数
- fmcs_smiles(text, json default ‘’) : スペースで区切られたSMILESのセットについてMCSを計算します。オプションのjson引数はMCSコードにパラメータを与えるために使われます。
その他(Other)
[Link] https://www.rdkit.org/docs/Cartridge.html#other
- rdkit_version() : カートリッジのバージョン番号をを持つ文字列を返します。
カートリッジには他にも演算子が定義されていますが、これらは内部の目的のためだけに使われます。
Pythonからカートリッジを使う方法(Using the Cartridge from Python)
[Link] https://www.rdkit.org/docs/Cartridge.html#using-the-cartridge-from-python
postgresqlに接続するためのお勧めのアダブタはpyscopg2です(https://pypi.python.org/pypi/psycopg2 )。
我々のChEMBLのローカルコピーに接続し、基本的な部分構造検索を行った場合の例を示します:
>>> import psycopg2 >>> conn = psycopg2.connect(database='chembl_16') >>> curs = conn.cursor() >>> curs.execute('select * from rdk.mols where m@>%s',('c1cccc2c1nncc2',)) >>> curs.fetchone() (9830, 'CC(C)Sc1ccc(CC2CCN(C3CCN(C(=O)c4cnnc5ccccc54)CC3)CC2)cc1')
各分子に対してSMILESを返します。分子を取得した後で、さらに操作を行いたいなら、postgresqlにpickel形式で分子を返すよう要求するのがより効率的です。
>>> curs.execute('select molregno,mol_send(m) from rdk.mols where m@>%s',('c1cccc2c1nncc2',)) >>> row = curs.fetchone() >>> row (9830, <read-only buffer for 0x...>)
これらのpickelは分子に変換することができます。
>>> from rdkit import Chem >>> m = Chem.Mol(str(row[1])) >>> Chem.MolToSmiles(m,True) 'CC(C)Sc1ccc(CC2CCN(C3CCN(C(=O)c4cnnc5ccccc54)CC3)CC2)cc1'
License
[Link] https://www.rdkit.org/docs/Cartridge.html#license
この文書の著作権は copyright (C) 2013-2018 by Greg Landrum に所属しています。
この文書はCreative Commons Attribution-ShareAlike 4.0 Licenseのもとでライセンスされています。このライセンスを見るためにはhttp://creativecommons.org/licenses/by-sa/4.0/ にアクセスするか、Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. に手紙を送ってください。
このライセンスの意図はRDKitそのものの意図と似ています。簡単に言えば "これを使ってなんでもやりたいことをやっていいけど、私たちの功績にも言及してね”
12/24/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0
The RDKit Book 〜RDKit 直訳 Day23〜
(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 23日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
electron-contribution count: 電子の寄与のカウント
fused ring: 縮合環
computational expediency: 計算の都合上
dative bond: 配位結合
hybridization query: 混成クエリ
Heteroatom neighbor query: ヘテロ原子隣接クエリ
atom query: アトムクエリ
range query: レンジクエリ
shorthand: 簡略表記法
atom weight: 原子の重み
substructure match: 部分構造のマッチング
octet-complete Lewis dot structures: オクテット則を完全に満たす様なルイス構造式
以下、訳
RDKitブック(The RDKit Book)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#the-rdkit-book
その他ケモインフォマティクスの話題(Misc Chemoinformatics Topics)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#misc-cheminformatics-topics
芳香族性(Aromaticity)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#aromaticity
芳香族性は単純であると同時にどうしようもなく複雑な不愉快な話題の一つです。実験化学者も理論化学者もその定義についてお互いに同意に達することができないので、どれかひとつを恣意的に選びとり、そしてそれを貫き通す必要があります。RDKitがとっている方法は次のようなものです。
知られている芳香族系に合うようなパターンを使用する代わりに、RDKitの芳香族を認識するコードは一連のルールを使います。そのルールは比較的直接的なものです。
芳香族性とは環構造に含まれる原子と結合の特性です。芳香族結合は芳香族原子の間でなければなりませんが、芳香族原子間の結合が芳香族結合である必要はありません。
例えば、ここで二つの6員環の連結に使われている結合はRDKitでは芳香族であるとは見なされません。
picture_9.png
>>> from rdkit import Chem >>> m = Chem.MolFromSmiles('C1=CC2=C(C=C1)C1=CC=CC=C21') >>> m.GetAtomWithIdx(3).GetIsAromatic() True >>> m.GetAtomWithIdx(6).GetIsAromatic() True >>> m.GetBondBetweenAtoms(3,6).GetIsAromatic() False
RDKitは多数の異なる芳香族モデルをサポートしており、芳香族性を割り当てる関数を提供することでユーザーが独自の定義をできるようにしています。
RDKit芳香族性モデル(The RDKit Aromaticity Model)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#the-rdkit-aromaticity-model
一つの環、あるいは縮合多環系は、4N+2ルールに従う場合、芳香族であるとみなされます。数え上げられる電子への寄与は、アトムタイプと周囲の環境によって定義されます。いくつか例をあげます:
フラグメント | π電子の数 |
---|---|
c(a)a | 1 |
n(a)a | 1 |
An(a)a | 2 |
o(a)a | 2 |
s(a)a | 2 |
se(a)a | 2 |
te(a)a | 2 |
O=c(a)a | 0 |
N=c(a)a | 0 |
*(a)a | 0, 1, or 2 |
表記法 a: any aromatic atom; A: any atom, include H;*:a dummy atom
電気陰性原子に結合する環外の結合は、環上の原子から価電子を"盗み"、ダミー原子は環を芳香族とするのに必要な数だけ無制限に寄与することに注意してください。
芳香族性に縮合多環系を使う場合、個々の環は非芳香族性なのに、環全体としては芳香族といった状況となることがあります。例を挙げるとアズレンです:
picture_8.png
縮合多環系と環外二重結合の影響を示す極端な例をあげます:
picture_7.png
>>> m=Chem.MolFromSmiles('O=C1C=CC(=O)C2=C1OC=CO2') >>> m.GetAtomWithIdx(6).GetIsAromatic() True >>> m.GetAtomWithIdx(7).GetIsAromatic() True >>> m.GetBondBetweenAtoms(6,7).GetIsAromatic() False
特別な場合をあげると、ラジカルのヘテロ原子は芳香族性の候補と見なされません。
picture_10.png
電荷とラジカルをもつ炭素も芳香族とは見なされません:
picture_12.png
>>> m = Chem.MolFromSmiles('C1=CC=CC=C[C+]1') >>> m.GetAtomWithIdx(0).GetIsAromatic() False >>> m.GetAtomWithIdx(6).GetIsAromatic() False >>> m.GetAtomWithIdx(6).GetFormalCharge() 1 >>> m.GetAtomWithIdx(6).GetNumRadicalElectrons() 1
ですが、ラジカルをもつ電気的に中性な炭素は、芳香族と見なされます:
>>> m = Chem.MolFromSmiles('C1=[C]NC=C1') >>> m.GetAtomWithIdx(0).GetIsAromatic() True >>> m.GetAtomWithIdx(1).GetIsAromatic() True >>> m.GetAtomWithIdx(1).GetNumRadicalElectrons() 1
単純芳香族性モデル(The Simple Aromaticity Model)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#the-simple-aromaticity-model
このモデルとても単純です。5員環と6員環の単純な環構造だけが芳香族性の候補として考慮されます。上述のリストと同じ、電子の寄与のカウント方法が使われます。
MDL芳香属性モデル(The MDL Aromaticity Model)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#the-mdl-aromaticity-model
このモデルはあまり詳細な説明が手に入りません(少なくとも公的にはドキュメント化されていません)。そこで我々はoechemのドキュメント(https://docs.eyesopen.com/toolkits/python/oechemtk/aromaticity.html)で提供されているものを再現しようとしました。
* 縮合環(すなわち、アズレン)は芳香族になりうる
* 5員環は芳香族では無い(縮合環系の一部にはなりうる)
* CとNだけが芳香族になりうる
* 電子のドナーは一つだけ許容される
* 環外に飛び出す二重結合を持つ原子は芳香族では無い
注: 計算の都合上の理由で、構成原子の総数が多くても24原子の縮合環系にだけ、芳香属性の判断が適用されます。
SMILESのサポートと拡張(SMILES Support and Extensions)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#smiles-support-and-extensions
RDKitはDaylight SMILES[脚注2]の全ての標準的な特徴と、有用な拡張をカバーしています。
これが、拡張のリスト(のおそらく一部分)です:
* 芳香属性: te
(芳香属性 Te)は許容されます
* 配位結合: <-
と->
が原子間の配位結合を作ります。方向が重要です。
* 原子の番号による原子の特定: SMARTSの要素[#6]
もSMILESでサポートされています。
[脚注2] http://www.daylight.com/dayhtml/doc/theory/theory.smiles.html
SMARTSのサポートと拡張(SMARTS Support and Extensions)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#smarts-support-and-extensions
RDKitはDaylight SMARTS[脚注3]の標準的な特徴のほとんどと、いくつかの有用な拡張をカバーしています。
これが、RDKitでサポートされていないSMARTSの特徴のリスト(網羅できていると良いのですが)です:
* 非-四面体のキラルクラス
* @?
オペレーター
* 明示的な原子量(同位体クエリーはサポートされています)
* 異なる構成要素への適合を要請する構成要素レベルのグループ化、すなわち (C).(C)
これが、拡張のリスト(のおそらく一部分)です:
* 混成クエリ:
* ^0
はS混成原子にマッチ
* ^1
はSP混成原子にマッチ
* ^2
はSP2混成原子にマッチ
* ^3
はSP3混成原子にマッチ
* ^4
はSP3D混成原子にマッチ
* ^5
はSP3D2混成原子にマッチ
>> Chem.MolFromSmiles('CC=CF').GetSubstructMatches(Chem.MolFromSmarts('[^2]')) ((1,), (2,))
- 配位結合:
<-
と->
は相当する配位結合に対応し、方向が重要です
>>> Chem.MolFromSmiles('C1=CC=CC=N1->[Fe]').GetSubstructMatches(Chem.MolFromSmarts('[#7]->*')) ((5, 6),) >>> Chem.MolFromSmiles('C1=CC=CC=N1->[Fe]').GetSubstructMatches(Chem.MolFromSmarts('*<-[#7]')) ((6, 5),)
- ヘテロ原子隣接クエリ:
>>> Chem.MolFromSmiles('O=C(O)c1nc(O)ccn1').GetSubstructMatches(Chem.MolFromSmarts('[z2]')) ((1,), (3,), (5,)) >>> Chem.MolFromSmiles('O=C(O)c1nc(O)ccn1').GetSubstructMatches(Chem.MolFromSmarts('[Z2]')) ((1,),) >>> Chem.MolFromSmiles('O=C(O)c1nc(O)ccn1').GetSubstructMatches(Chem.MolFromSmarts('[Z1]')) ((5,),)
- レンジクエリ: 数値を要求する多くのタイプのクエリのため、値の範囲を提供することができます:
D{2-4}
は2から4の間(両端の値を含む)の明示的な結合をもつ原子にマッチします。D{-3}
は3とそれより少ない数の明示的な結合を持つ原子にマッチします。D{2-}
は少なくとも2つの明示的な結合を持つ原子にマッチします。
>>> Chem.MolFromSmiles('CC(=O)OC').GetSubstructMatches(Chem.MolFromSmarts('[z{1-}]')) ((1,), (4,)) >>> Chem.MolFromSmiles('CC(=O)OC').GetSubstructMatches(Chem.MolFromSmarts('[D{2-3}]')) ((1,), (3,)) >>> Chem.MolFromSmiles('CC(=O)OC.C').GetSubstructMatches(Chem.MolFromSmarts('[D{-2}]')) ((0,), (2,), (3,), (4,), (5,))
[脚注3] http://www.daylight.com/dayhtml/doc/theory/theory.smarts.html
環の同定とSSSR(Ring Finding and SSSR)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#ring-finding-and-sssr
他の人たちが、私が意図していたよりも大きなエネルギーと雄弁さでわめき出したように、分子の「最小の環構造の最小のセット(smallest set of smallest rings:SSSR)」の定義は一つではありません。対称性の高い分子では"本当の"SSSRで得られる結果は魅力的ではありません。例えばキュバンのSSSRは環構造を5つとしますが、"明らかに"6つあります。この問題は、対称的な結果を返す、「最小の環構造の(最小ではなく)小さいセット」のアルゴリズムを実装することで修正することができます。これがRDKitで用いている手法です。
分子に含まれるSSSR 環構造の数を数えることができると役に立つこともあるので、rdkit.Chem.rdmolops.GetSSSR()関数が提供されていますが、これはSSSRの数を返すだけで、潜在的に一意ではない環構造のセットを返すわけではありません。
[link] rdkit.Chem.rdmolops.GetSSSR()
化学反応の取り扱い(Chemical Reaction Handling)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#chemical-reaction-handling
Reaction SMARTS
[Link] https://www.rdkit.org/docs/RDKit_Book.html#reaction-smarts
SMIRKS[脚注1]でもなく、SMILES[脚注2]でもなく、SMARTS[脚注3]から派生したものです。
[脚注1] http://www.daylight.com/dayhtml/doc/theory/theory.smirks.html
[脚注2] http://www.daylight.com/dayhtml/doc/theory/theory.smiles.html
[脚注3] http://www.daylight.com/dayhtml/doc/theory/theory.smarts.html
reaction SMARTSの一般的な文法は以下の様なものです
reaction ::= reactants ">>" products reactants ::= molecules products ::= molecules molecules ::= molecule molecules "." molecule molecule ::= a valid SMARTS string without "." characters "(" a valid SMARTS string without "." characters ")"
いくつかの特徴(Some features)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#some-features
生成物のテンプレート上にマッピングされたダミー原子は、反応物質の対応する原子によって置き換えられます:
>>> from rdkit.Chem import AllChem >>> rxn = AllChem.ReactionFromSmarts('[C:1]=[O,N:2]>>[C:1][*:2]') >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('CC=O'),))[0]] ['CCO'] >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('CC=N'),))[0]] ['CCN']
ですが、マッピングされなかったダミー原子はダミーのままです:
>>> rxn = AllChem.ReactionFromSmarts('[C:1]=[O,N:2]>>*[C:1][*:2]') >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('CC=O'),))[0]] ['*C(C)O']
生成物の"どの様な"結合でも、反応物質の対応する結合によって置き換えられます:
>>> rxn = AllChem.ReactionFromSmarts('[C:1]~[O,N:2]>>*[C:1]~[*:2]') >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('C=O'),))[0]] ['*C=O'] >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('CO'),))[0]] ['*CO'] >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('C#N'),))[0]] ['*C#N']
分子内の反応は、反応物質を丸括弧に囲むことで、柔軟に表現することができます。閉環メタセシス[脚注4]を例に、実際にやってみます。
[脚注4] Thanks to James Davidson for this example.
>>> rxn = AllChem.ReactionFromSmarts("([C:1]=[C;H2].[C:2]=[C;H2])>>[*:1]=[*:2]") >>> m1 = Chem.MolFromSmiles('C=CCOCC=C') >>> ps = rxn.RunReactants((m1,)) >>> Chem.MolToSmiles(ps[0][0]) 'C1=CCOC1'
キラリティー(Chirality)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#chirality
このセクションは、反応の定義においてキラリティーの情報がどうやって扱われるかについて説明します。セクションを通して、2級アルコールのエステル化を例として扱います[脚注5]。
[脚注5] Thanks to JP Ebejer and Paul Finn for this example.
もし反応の定義にキラリティーの情報がないなら、反応物質の立体化学は保持されます:
>>> alcohol1 = Chem.MolFromSmiles('CC(CCN)O') >>> alcohol2 = Chem.MolFromSmiles('C[C@H](CCN)O') >>> alcohol3 = Chem.MolFromSmiles('C[C@@H](CCN)O') >>> acid = Chem.MolFromSmiles('CC(=O)O') >>> rxn = AllChem.ReactionFromSmarts('[CH1:1][OH:2].[OH][C:3]=[O:4]>>[C:1][O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@@H](C)CCN'
マッピングされた原子が反応物質と生成物両方で同じキラリティーを持つ場合、同じ結果(立体化学の保持)が得られます。
>>> rxn = AllChem.ReactionFromSmarts('[C@H1:1][OH:2].[OH][C:3]=[O:4]>>[C@:1][O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@@H](C)CCN'
反応物質と生成物で異なるキラリティーを持つマッピングされた原子は、立体が反転します。
>>> rxn = AllChem.ReactionFromSmarts('[C@H1:1][OH:2].[OH][C:3]=[O:4]>>[C@@:1][O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@@H](C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN'
反応物質のマッピングされた原子のキラリティーが指定されていて、生成物では指定されていない場合、反応によって不斉中心のキラリティーの情報は失われます:
>>> rxn = AllChem.ReactionFromSmarts('[C@H1:1][OH:2].[OH][C:3]=[O:4]>>[C:1][O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)OC(C)CCN'
そして、最後に、キラリティーが生成物で指定されていて、反応物質では指定されていない場合、反応によって指定したキラリティーが作られます。
>>> rxn = AllChem.ReactionFromSmarts('[CH1:1][OH:2].[OH][C:3]=[O:4]>>[C@:1][O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN'
反応の定義で立体の中心の周りの環境について、もう少し情報を含めないと、これはあまり意味をなさないことに注意してください:
>>> rxn = AllChem.ReactionFromSmarts('[CH3:5][CH1:1]([C:6])[OH:2].[OH][C:3]=[O:4]>>[C:5][C@:1]([C:6])[O:2][C:3]=[O:4]') >>> ps=rxn.RunReactants((alcohol1,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol2,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN' >>> ps=rxn.RunReactants((alcohol3,acid)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(=O)O[C@H](C)CCN'
キラリティーの指定がクエリの一部としては使われないことに気をつけてください。キラリティーの指定されていない分子は、キラリティーが指定されている反応物質とマッチします。
一般的に、反応機能ではできる限り立体化学に関する情報を保とうとします。これは不斉中心で新しい結合が一つ形成される場合はうまくいきます。
>>> rxn = AllChem.ReactionFromSmarts('[C:1][C:2]-O>>[C:1][C:2]-S') >>> alcohol2 = Chem.MolFromSmiles('C[C@@H](O)CCN') >>> ps=rxn.RunReactants((alcohol2,)) >>> Chem.MolToSmiles(ps[0][0],True) 'C[C@@H](S)CCN'
ですが、2つあるいはそれ以上の結合が形成される場合はうまくいきません。
>>> rxn = AllChem.ReactionFromSmarts('[C:1][C:2](-O)-F>>[C:1][C:2](-S)-Cl') >>> alcohol = Chem.MolFromSmiles('C[C@@H](O)F') >>> ps=rxn.RunReactants((alcohol,)) >>> Chem.MolToSmiles(ps[0][0],True) 'CC(S)Cl'
この場合、情報が保存されるために十分な情報がないだけです。マッピングに関する情報を加えるだけで解決することができます。
ルールと警告(Rules and caveats)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#rules-and-caveats
- アトムクエリの最後にアトムマップの情報を含めてください。つまり[C,N,O:1]や[C;R:1]の様にしてください。
- SMARTSで指定されていない結合は、単結合かあるいは芳香族性の結合であることを忘れない様にしてください。生成物のテンプレートの結合次数は、生成物のテンプレート自体が生成された時に割り当てられるので、その結合が単結合であるべきか、芳香族性であるべきかをいつでも指示できるわけではありません:
>>> rxn = AllChem.ReactionFromSmarts('[#6:1][#7,#8:2]>>[#6:1][#6:2]') >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('C1NCCCC1'),))[0]] ['C1CCCCC1'] >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('c1ncccc1'),))[0]] ['c1ccccc-1']
なので、反応物質から結合次数をコピーしたい場合は、"Any"結合を使ってください。
>>> rxn = AllChem.ReactionFromSmarts('[#6:1][#7,#8:2]>>[#6:1]~[#6:2]') >>> [Chem.MolToSmiles(x,1) for x in rxn.RunReactants((Chem.MolFromSmiles('c1ncccc1'),))[0]] ['c1ccccc1']
特徴定義ファイル形式(FDefファイル)(The Feature Definition File Format)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#the-feature-definition-file-format
FDefファイルは化学的特徴(フィーチャー)のセットを定義するのに必要な情報を全て含みます。DaylightのSMARTS言語を使って構築されたクエリーから定義された特徴のタイプの定義を含みます。[脚注3] FDefファイルはオプションで、特徴の定義をもっと読みやすくするために使われるアトムタイプの定義を含むこともできます。
[脚注3] http://www.daylight.com/dayhtml/doc/theory/theory.smarts.html
化学的特徴(Chemical Features)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#chemical-features
化学的特徴はフィーチャータイプ[Feature Type]とフィーチャーファミリー[Feature Family]で定義されています。フィーチャーファミリーは("水素結合ドナー"や"芳香族"といった)一般的な特徴の分類で、フィーチャータイプは特徴に関する追加の、より詳細な情報を提供します。ファーマコフォアマッチングはフィーチャーファミリーを使って行われます。各フィーチャータイプには次の情報を含みます:
- (一つ、またはそれ以上の)フィーチャータイプにマッチする原子を表現するSMARTSパターン
- フィーチャーを定義する原子の位置に基づき特徴の位置を決定するのに使われる重み
FDefファイルの文法(Syntax of the FDef file)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#syntax-of-the-fdef-file
AtomTypeの定義(AtomType definitions)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#atomtype-definitions
アトムクエリを定義するSMARTS文字列の代わりに、アトムタイプ[AtomType]の定義を使って簡略表記法を割り当てることができます。これによりFDefファイルをもっとずっと読みやすくすることができます。例えば、非極性炭素原子を次の様に定義することで、FDefファイルの他のどこでも使うことができる新しい名前を作成することができ、このSMARTSを使うのに役立ちます。
AtomType Carbon_NonPolar [C&!$(C=[O,N,P,S])&!$(C#N)]
アトムタイプを参照するには、中括弧にその名前を含めるだけです。例えば、FDefファイルからのこの抜粋は、Carbon_NonPolarの定義を参照する他のアトムタイプ(Hphobe)を定義します。
AtomType Carbon_NonPolar [C&!$(C=[O,N,P,S])&!$(C#N)] AtomType Hphobe [{Carbon_NonPolar},c,s,S&H0&v2,F,Cl,Br,I]
{Carbon_Nonpolar}
が、追加の修飾無しに、新しいアトムタイプを定義するのに使われていることに注目してください(角括弧やrecursive SMARTSのマーカーは必要とされていません)。
アトムタイプを繰り返すことで、SMARTSの","(or)オペレーターを使って二つの定義を結合したものが得られます。これが例です:
AtomType d1 [N&!H0] AtomType d1 [O&!H0]
これは次と等価です:
AtomType d1 [N&!H0,O&!H0]
次のもっと効率的な定義と等価です:
AtomType d1 [N,O;!H0]
これらの例ではSMARTSの優先度が高いアンドオペレーター"&"を使う傾向があり、優先度が低い”;”ではないことに注意してください。アトムタイプが連結される場合や繰り返される場合に重要となります。SMARTSの","オペレーターは";"よりも優先度が高く、従って";"を使う定義は予期せぬ結果に繋がる可能性があります。
否定するネガティブアトムタイプクエリを定義することもできます。
AtomType d1 [N,O,S] AtomType !d1 [H0]
ネガティブクエリは最初のものと組み合わされ、次の様なものと同一の定義を生成します:
AtomType d1 [!H0;N,O,S]
ネガティブアトムタイプがクエリの最初に付け足されることに注意してください。
フィーチャーの定義(Feature definitions)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#feature-definitions
フィーチャーの定義はアトムタイプの定義よりも複雑で、複数の行に渡ります:
DefineFeature HDonor1 [N,O;!H0] Family HBondDonor Weights 1.0 EndFeature
フィーチャーの定義の最初の行はフィーチャータイプとフィーチャーを定義するSMARTS文字列を含みます。次の2行(順番は重要ではありません)はフィーチャーのファミリーと原子の重み(フィーチャーを定義する原子の数と同じ長さの、カンマで区切られたリスト)を定義します。原子の重みは、フィーチャーを定義する原子の位置の平均の重みに基づき、フィーチャーの場所を計算するのに使われます。これに関してさらに詳細は下を参照してください。フィーチャーの定義の最後の行はEndFeatureである必要があります。FDefファイルでアトムタイプの定義とフィーチャーの定義を混合することは完全に正当な方法です。たった一つのルールはアトムタイプは参照される前位に定義されなければならないということです。
その他の文法上の注意点(Additional syntax notes):
[Link] https://www.rdkit.org/docs/RDKit_Book.html#additional-syntax-notes
- #symbonで始まるどの行もコメントとして認識され、無視されます。
- 行の終わりのバックスラッシュ記号は継続記号です。そのラインのデータが次の行に続いていることを示します。これらの追加行の最初の余白は無視されます。例えば、このアトムタイプの定義は:
AtomType tButylAtom [$([C;!R](-[CH3])(-[CH3])(-[CH3])),\ $([CH3](-[C;!R](-[CH3])(-[CH3])))]
これと完全に等価です:
AtomType tButylAtom [$([C;!R](-[CH3])(-[CH3])(-[CH3])),$([CH3](-[C;!R](-[CH3])(-[CH3])))]
(最初の形式の方がとても読みやすいですが!)
原子の重みとフィーチャーの場所(Atom weights and feature locations)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#atom-weights-and-feature-locations
FAQ(Frequently Asked Question(s))
[Link] https://www.rdkit.org/docs/RDKit_Book.html#frequently-asked-question-s
フィーチャータイプがファイルの中で繰り返された場合どんなことが起こるのか?これが例です:
DefineFeature HDonor1 [O&!H0] Family HBondDonor Weights 1.0 EndFeature DefineFeature HDonor1 [N&!H0] Family HBondDonor Weights 1.0 EndFeature
この場合HDonor1のフィーチャータイプの定義はどちらもアクティブです。機能的には次と同一です。
DefineFeature HDonor1 [O,N;!H0] Family HBondDonor Weights 1.0 EndFeature
ですが、この複製されたフィーチャーの定義は、より単純な物を組み合わせた定義よりもかなり効率が悪く、より混乱を招きやすくなります。
ファーマコフォアフィンガープリントの表現(Representation of Pharmacophore Fingerprints)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#representation-of-pharmacophore-fingerprints
RDKitの体系ではファーマコフォアフィンガープリントのビットIDはハッシュ化されていません:それぞれのビットはフィーチャーと距離の特定の組み合わせに相当します。与えられたビットIDは、解釈するために、対応するフィーチャーのタイプと距離に再度変換し直すことができます。2Dファーマコフォアのイラストによる説明をFigure1: Bit numbering in pharmacophore fingerprintsに示しています。
[link] Figure1: Bit numbering in pharmacophore fingerprints
picture_10.jpg
部分構造クエリにおける原子同士のマッチング(Atom-Atom Matching in Substructure Queries)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#atom-atom-matching-in-substructure-queries
SMARTSから導かれたクエリと部分構造のマッチングを行うときに、分子のどの原子がクエリのどの原子にマッチするべきかのルールが十分に定義されます[脚注3]。クエリの分子がmol blockあるいはSMILESから導かれたときには、必ずしも同様にルールが十分に定義されるとは限りません。
[脚注3] http://www.daylight.com/dayhtml/doc/theory/theo
RDKitで使われている一般的なルールでは、もしクエリの特性を明示しなければマッチングの判断基準の一部として使われず、そして水素原子は無視されます。従って次の様な動きをします。
Molecule | Query | Match |
---|---|---|
CCO | CCO | Yes |
CC[O-] | CCO | Yes |
CCO | CC[O-] | No |
CC[O-] | CC[O-] | Yes |
CC[O-] | CC[OH] | Yes |
CCOC | CC[OH] | Yes |
CCOC | CCO | Yes |
CCC | CCC | Yes |
CC[14C] | CCC | Yes |
CCC | CC[14C] | No |
CC[14C] | CC[14C] | Yes |
OCO | C | Yes |
OCO | [CH] | No |
OCO | [CH2] | No |
OCO | [CH3] | No |
OCO | O[CH3] | Yes |
O[CH2]O | C | Yes |
O[CH2]O | [CH2] | No |
実際にやってみましょう:
>>> Chem.MolFromSmiles('CCO').HasSubstructMatch(Chem.MolFromSmiles('CCO')) True >>> Chem.MolFromSmiles('CC[O-]').HasSubstructMatch(Chem.MolFromSmiles('CCO')) True >>> Chem.MolFromSmiles('CCO').HasSubstructMatch(Chem.MolFromSmiles('CC[O-]')) False >>> Chem.MolFromSmiles('CC[O-]').HasSubstructMatch(Chem.MolFromSmiles('CC[O-]')) True >>> Chem.MolFromSmiles('CC[O-]').HasSubstructMatch(Chem.MolFromSmiles('CC[OH]')) True >>> Chem.MolFromSmiles('CCOC').HasSubstructMatch(Chem.MolFromSmiles('CC[OH]')) True >>> Chem.MolFromSmiles('CCOC').HasSubstructMatch(Chem.MolFromSmiles('CCO')) True >>> Chem.MolFromSmiles('CCC').HasSubstructMatch(Chem.MolFromSmiles('CCC')) True >>> Chem.MolFromSmiles('CC[14C]').HasSubstructMatch(Chem.MolFromSmiles('CCC')) True >>> Chem.MolFromSmiles('CCC').HasSubstructMatch(Chem.MolFromSmiles('CC[14C]')) False >>> Chem.MolFromSmiles('CC[14C]').HasSubstructMatch(Chem.MolFromSmiles('CC[14C]')) True >>> Chem.MolFromSmiles('OCO').HasSubstructMatch(Chem.MolFromSmiles('C')) True >>> Chem.MolFromSmiles('OCO').HasSubstructMatch(Chem.MolFromSmiles('[CH]')) False >>> Chem.MolFromSmiles('OCO').HasSubstructMatch(Chem.MolFromSmiles('[CH2]')) False >>> Chem.MolFromSmiles('OCO').HasSubstructMatch(Chem.MolFromSmiles('[CH3]')) False >>> Chem.MolFromSmiles('OCO').HasSubstructMatch(Chem.MolFromSmiles('O[CH3]')) True >>> Chem.MolFromSmiles('O[CH2]O').HasSubstructMatch(Chem.MolFromSmiles('C')) True >>> Chem.MolFromSmiles('O[CH2]O').HasSubstructMatch(Chem.MolFromSmiles('[CH2]')) False
分子のサニタイゼーション(Molecular Sanitization)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#molecular-sanitization
デフォルトでは、分子を解析する関数は全て、読み込まれた分子に対して"サニタイゼーション"の処理を行います。サニタイゼーションの考え方というのは、残りのコードのために有用な特性(混成の状態や、環構造に含まれるか否か、など)を算出することと、分子が"合理的である"ことを保証することです。合理的とはつまり、分子をオクテット則を完全に満たす様なルイス構造式であらわすことができるということです。
処理の過程を順番に示します。
clearComputedProps
: 分子とその原子、結合に既に存在する計算による特性を全て除去します。この処理はいつも行われます。cleanup
: 少数の非標準的な原子価の状態を標準化します。クリーンアップの処理は:- Oと二重結合している中性の5価のNは両性イオンの形式に変換されます。
例:
N(=O)=O -> [N+](=O)[O-]
- 他のNと三重結合している中性の5価のNは両性イオンの形式に変換されます。
例:
C-N=N#N -> C-N=[N+]=[N-]
- Oとの二重結合が一つと、もう一つ二重結合をCあるいはPとしている中性の5価のリン原子は両性イオンの形式に変換されます。
例:
C=P(=O)O -> C=[P+]([O-])O
- Oとだけ隣接している中性のCl、BrあるいはIで、3価、5価あるいは7価のものは両性イオンの形式に変換されます。亜塩素酸や塩素酸、過塩素酸の様なものを含みます。
例:
O=Cl(=O)O -> [O-][Cl+2][O-]O
- Oと二重結合している中性の5価のNは両性イオンの形式に変換されます。
例:
この処理では例外は生じないはずです。
updatePropertyCache
: 全ての原子の明示的原子価と暗に表される原子価を計算します。これは許容されるよりも高い価数の状態となっている原子には例外を生成します。この処理はいつも行われますが、もしこの過程を"スキップ"すると非標準的な原子価についてのテストは実行されません。symmetrizeSSSR
: 対称化された"最小の環構造についての最小のセット"(SSSR: Smallest Set of Smallest Rings)のアルゴリズムを呼び出します(SSSRについてはGetting Started ドキュメントで議論しました)。Kekulize
: 芳香環をケクレ形式に変換します。環構造をケクレ化できなかった場合や芳香族性の結合が環の外部に見つかった場合に例外を返します。assignRadicals
:(存在する場合)各原子のラジカル電子の数を決定します。setAromaticity
: 芳香環と環の系(ring system、上述)を同定し、原子と結合に芳香族フラグをセットし、結合次数を芳香族にセットします。setConjugation
:どの結合が共役しているか同定します。setHybridization
: 各原子の混成の状態を計算します。cleanupChirality
: sp3混成ではない原子から不斉のタグを取り除きます。adjustHs
: 化学を保存するのに必要な場所に明に示された水素原子を付け加えます。これは典型的には芳香環のヘテロ原子に必要とされます。古典的な例はピロールの窒素原子です。
個々の処理はMolOps::sanitizeMol
かChem.SanitizeMol
を呼び出すことで、実行するか否かを切り替えることができます。
実装の詳細(Implementation Details)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#implementation-details
"マジック”プロパティの値("Magic" Property Values)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#magic-property-values
次のプロパティの値はRDKitのコードベースで正式に使われているものですが、クライアントコードでも役にたつかもしれません。
ROMol(Mol in Python)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#romol-mol-in-python
Property Name | Use |
---|---|
MolFileComments | CTABのコメント行からの読み込みと書き込み |
MolFileInfo | CTABのinfo行からの読み込みと書き込み |
_MolFileChiralFlag | CTABの不斉フラグからの読み込みと書き込み |
_Name | CTABのname行からの読み込みと書き込み |
_smilesAtomOutputOrder | SMILESに書かれている原子の順番 |
Atom
[Link] https://www.rdkit.org/docs/RDKit_Book.html#atom
Property Name | Use |
---|---|
_CIPCode | 原子のCIPコード(RかSか) |
_CIPRank | 原子の整数値のCIPランク |
_ChiralityPossible | 原子が不斉中心になる可能性がある場合にセットされる |
_MolFileRLabel | 原子に貼られる整数値のRグループラベルで、CTABからの読み込身と書き込みが行われる |
_ReactionDegreeChanged | 反応において級[degree]が変化したときに、生成物のテンプレートの原子にセットされる |
_protected | このプロパティがセットされた原子は反応において、マッチングする反応物質の原子の対象から外れる |
dummyLabel | (ダミー原子のラベルで)アトムシンボルとしてCTABからの読み込みと書き込みが行われる |
molAtomMapNumber | 原子のアトムマップナンバーで、SMILESとCTABからの読み込みと書き込みに使われる |
molfileAlias | (Aタグに続く)原子のmolファイルのエイリアスで、 CTABからの読み込みと書き込みが行われる |
molFileValue | (Vタグに続く)原子のmolファイルの値で、 CTABからの読み込みと書き込みが行われる |
molFileInversionFlag | 反応で原子の立体化学が変化したか否かを示すのに使われるフラグで、CTABからの読み込みと書き込みが行われ、SMILESから自動的に決定される |
molRxnComponent | 反応のどの構成要素に原子が属するかを示し、CTABからの読み込みと書き込みが行われる |
molRxnRole | 反応において原子がどのような役割を担うか(1=反応物質、2=生成物、3=試薬)で、CTABからの読み込みと書き込みが行われる |
smilesSymbol | SMILESに書き込まれる原子のシンボルを決定する |
スレッドの安全性とRDKit(Thread safety and the RDKit)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#thread-safety-and-the-rdkit
RDKitを書いている間、コードがマルチスレッド環境でも作動することを保証するために、グローバル変数の使用を避けることや、その他のことを試みました。ですが、コードスレッドを安全にすることは全くもって些細なことではなく、いくつかギャップがあることは疑いようがありません。このセクションではスレッドの安全性のため、明確にテストされたコードベースについて説明します。
注: numThreads
引数をとる少数のメソッドと関数を例外として、このセクションはRDKitをPythonのスレッドから使う際にはあてはまりません。Boost.Pythonはどの時点においてもスレッド一つだけがC++コードを呼び出すことを保証します。Pythoで並列処理を行うにはmultiprocessingモジュールを使うか、他の標準的なPythonの方法を使ってください。
テスト済みのもの(What has been tested)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#what-has-been-tested
- SMILES/SMARTS/Mol blockからの分子の読み込み
- SMILES/SMARTS/Mol blockへの分子の書き込み
- 2D座標の生成
- ディスタンスジオメトリー法のコードを使った3Dコンフォメーションの生成
- UFFあるいはMMFFを使った分子の最適化
- フィンガープリントの生成
- $RDBASE/Code/GraphMol/Descriptors内にある記述子の計算機
- 部分構造探索(注:クエリの分子が再起的なクエリを含む場合、マルチスレッドで並行して使うのは安全ではないかもしれません。下記を参照してください)
- Subgraphコード
- ChemTransformsコード
- chemical reactionsコード
- Open3DAlignコード
- MolDraw2D 描画コード
把握済みの問題(Known problems)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#known-problems
InChiの生成と(おそらく)解析。これはIUPAC InChiコードの限界である様に見えます。コードをマルチスレッド環境で使える様にするため、確実に一度にスレッド一つだけがIUPACコードを使うことを保証するようミューテックスが使われます。これはRDKitが
RDK_TEST_MULTITHREADED
オプションを有効にしてビルドされている場合のみ利用可能です。MolSuppliers(例えばSDMolSupplierやSmilesMolSupplier?)は分子が読み込まれたときに内部の状態を変えます。2つ以上のスレッドで一つのsupplierを使うのは安全ではありません。
再起的なクエリを含むクエリ分子を使った部分構造検索。再起的クエリは検索が実行されているとき内部の状態を修正します。したがって同じクエリをマルチスレッドで並行して使うのは安全ではありません。コードが
RDK_BUILD_THREADSAFE_SSS
引数を使って作られている場合(我々が提供しているバイナリのデフォルトです)、一度にスレッド一つだけが与えられた再起的クエリを使っていることを確実に保証するためミューテックスが使われます。
TPSA記述子の実装(Implementation of the TPSA Descriptor)
[Link] https://www.rdkit.org/docs/RDKit_Book.html#implementation-of-the-tpsa-descriptor
RDKitに実装されているトポロジカル極性表面積(TPSA)記述子は、Peter Ertlらによる文献(https://pubs.acs.org/doi/abs/10.1021/jm000942e)に説明されています。RDKitの実装はこの文献に記載されているものと異なります。このセクションでは違いと、なぜ異なるのかについて説明します。
RDKitのTPSAの実装ではデフォルトではNとO原子からの寄与のみ含んでいます。ですが、TPSAの文献のTable 1はNとOに加えて極性のSとPについてのパラメータを含んでいます。何が起こっているのでしょうか?
Daylight Contrib dir (http://www.daylight.com/download/contrib/tpsa.html) の元々のTPSAの実装では極性のSあるいはPからの寄与を含んでおらず、TPSAの文献に含まれている参照値もSやPの寄与を含んでいないということがわかりました。例えば、Table 3に提示されているホスカルネット(SMILES OC(=O)P(=O)(O)O
)のTPSAは94.8ですが、Oの寄与の合計- 3x20.23 + 2x17.07 = 94.8
-に一致します。Pの寄与- 9.81
-を加えるとPSAの値は104.6となります。これはTable 3のPとSを含む他の化合物にも当てはまります。
RDKitの実装では、tpsa.c
Contribプログラムの挙動と文献のTable 3で提示されているものを再現することを選択しました。したがって極性のSとPは無視されます。2、3のユーザーからのリクエストに基づき、RDKitの2018.09
リリースからSとPの寄与を含めるオプションを加えました。
>>> from rdkit.Chem import Descriptors >>> Descriptors.TPSA(Chem.MolFromSmiles('OC(=O)P(=O)(O)O')) # foscarnet 94.83 >>> Descriptors.TPSA(Chem.MolFromSmiles('OC(=O)P(=O)(O)O'), includeSandP=True) 104.64... >>> Descriptors.TPSA(Chem.MolFromSmiles('Cc1ccccc1N1C(=O)c2cc(S(N)(=O)=O)c(Cl)cc2NC1C')) # metolazone 92.5 >>> Descriptors.TPSA(Chem.MolFromSmiles('Cc1ccccc1N1C(=O)c2cc(S(N)(=O)=O)c(Cl)cc2NC1C'), includeSandP=True) 100.88
License
[Link] https://www.rdkit.org/docs/RDKit_Book.html#license
この文書の著作権は copyright (C) 2013-2018 by Greg Landrum に所属しています。
この文書はCreative Commons Attribution-ShareAlike 4.0 Licenseのもとでライセンスされています。このライセンスを見るためにはhttp://creativecommons.org/licenses/by-sa/4.0/ にアクセスするか、Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. に手紙を送ってください。
このライセンスの意図はRDKitそのものの意図と似ています。簡単に言えば "これを使ってなんでもやりたいことをやっていいけど、私たちの功績にも言及してね”
12/23/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0
Miscellaneous Tips and Hints 〜RDKit 直訳 Day22〜
(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 22日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
inertia: 慣性
principal moment of inertia: 主慣性モーメント
以下、訳
雑多なテクニックとヒント(Miscellaneous Tips and Hints)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#miscellaneous-tips-and-hints
ChemかAllChemか(Chem vs AllChem)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#chem-vs-allchem
"基本的な"化学に関する機能の大部分(例: 分子の読み込み・書き出し、部分構造検索、分子を綺麗に整える、など)はrdkit.Chemモジュールに入っています。より発展的で、使用頻度が低い機能はrdkit.Chem.AllChemに入っています。両者の違いは、操作を開始するまでのスピードを速くするか、それともインポートの回数を少なくするかにあります。2、3の分子を読み込んだり、書き出したりすることに興味があるだけなら、2Dの分子を3Dにするライブラリーや力場の実装を読み込むのは無駄です。もしChem/AllChemの選択が煩わしいなら、pythonの"import ... as ..."構文を使ってストレスをなくすことができます:
[link] rdkit.Chem
[link] rdkit.Chem.AllChem
>>> from rdkit.Chem import AllChem as Chem >>> m = Chem.MolFromSmiles('CCC')
SSSR問題(The SSSR Problem)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#the-sssr-problem
他の人たちが、私が意図していたよりも大きなエネルギーと雄弁さでわめき出したように、分子の「最小の環構造の最小のセット(smallest set of smallest rings:SSSR)」の定義は一つではありません。対称性の高い分子では"本当の"SSSRで得られる結果は魅力的ではありません。例えばキュバンのSSSRは環構造を5つとしますが、"明らかに"6つあります。この問題は、対称的な結果を返す、「最小の環構造の(最小ではなく)小さいセット」のアルゴリズムを実装することで修正することができます。これがRDKitで用いている手法です。
分子に含まれるSSSR 環構造の数を数えることができると役に立つこともあるので、rdkit.Chem.rdmolops.GetSSSR()関数が提供されていますが、これはSSSRの数を返すだけで、潜在的に一意ではない環構造のセットを返すわけではありません。
[link] rdkit.Chem.rdmolops.GetSSSR()
利用可能な記述子のリスト(List of Available Descriptors)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#list-of-available-descriptors
記述子/記述子のファミリー | 注釈 | 言語 |
---|---|---|
Gasteiger/Marsili Partial Charges | Tetrahedron 36:3219-28 (1980) | C++ |
BalabanJ | Chem. Phys. Lett. 89:399-404 (1982) | Python |
BertzCT | J. Am. Chem. Soc. 103:3599-601 (1981) | Python |
Ipc | J. Chem. Phys. 67:4517-33 (1977) | Python |
HallKierAlpha | Rev. Comput. Chem. 2:367-422 (1991) | C++ |
Kappa1 - Kappa3 | Rev. Comput. Chem. 2:367-422 (1991) | C++ |
Chi0, Chi1 | Rev. Comput. Chem. 2:367-422 (1991) | Python |
Chi0n - Chi4n | Rev. Comput. Chem. 2:367-422 (1991) | C++ |
Chi0v - Chi4v | Rev. Comput. Chem. 2:367-422 (1991) | C++ |
MolLogP | Wildman and Crippen JCICS 39:868-73 (1999) | C++ |
MolMR | Wildman and Crippen JCICS 39:868-73 (1999) | C++ |
MolWt | C++ | |
ExactMolWt | C++ | |
HeavyAtomCount | C++ | |
HeavyAtomMolWt | C++ | |
NHOHCount | C++ | |
NOCount | C++ | |
NumHAcceptors | C++ | |
NumHDonors | C++ | |
NumHeteroatoms | C++ | |
NumRotatableBonds | C++ | |
NumValenceElectrons | C++ | |
NumAmideBonds | C++ | |
Num{Aromatic,Saturated,Aliphatic}Rings | C++ | |
Num{Aromatic,Saturated,Aliphatic}{Hetero,Carbo}cycles | C++ | |
RingCount | C++ | |
FractionCSP3 | C++ | |
NumSpiroAtoms | スピロ原子の数 (正確に一つの原子を共有する環構造の間で共有されている原子) |
C++ |
NumBridgeheadAtoms | 橋頭位原子の数 (少なくとも二つの結合を共有する環構造の間で共有されている原子) |
C++ |
TPSA | J. Med. Chem. 43:3714-7, (2000) 原文献との違いはthe RDKi bookのセクションを参照 |
C++ |
LabuteASA | J. Mol. Graph. Mod. 18:464-77 (2000) | C++ |
PEOE_VSA1 - PEOE_VSA14 | 部分電荷と表面積の寄与を使ったMOEタイプの記述子 http://www.chemcomp.com/journal/vsadesc.htm |
C++ |
SMR_VSA1 - SMR_VSA10 | MRの寄与と表面積の寄与を使ったMOEタイプの記述子 http://www.chemcomp.com/journal/vsadesc.htm |
C++ |
SlogP_VSA1 - SlogP_VSA12 | LogPの寄与と表面積の寄与を使ったMOEタイプの記述子 http://www.chemcomp.com/journal/vsadesc.htm |
C++ |
EState_VSA1 - EState_VSA11 | EStateインデックスと表面積の寄与を使ったMOEタイプの記述子(RDで開発され、CCGペーパーには記述されていない) | Python |
VSA_EState1 - VSA_EState10 | EStateインデックスと表面積の寄与を使ったMOEタイプの記述子(RDで開発され、CCGペーパーには記述されていない) | Python |
MQNs | Nguyen et al. ChemMedChem 4:1803-5 (2009) | C++ |
Topliss fragments | $(RDBASE)/Data/FragmentDescriptors.csv のSMARTS定義のセットを使った実装 | Python |
Autocorr2D | 2017.09リリースで新しく導入 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
利用可能な3D記述子のリスト(List of Available 3D Descriptors)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#list-of-available-3d-descriptors
これらは全て分子が3次元のコンフォマーをもつことを必要とします。
記述子/記述子のファミリー | 注釈 | 言語 |
---|---|---|
Plane of best fit (PBF) | Nicholas C. Firth, Nathan Brown, and Julian Blagg, JCIM 52:2516-25 | C++ |
PMI1, PMI2, PMI3 | 主慣性モーメント | C++ |
NPR1, NPR2 | 標準化された主モーメントの比 Sauer and Schwarz JCIM 43:987-1003 (2003) |
C++ |
Radius of gyration | G. A. Arteca “Molecular Shape Descriptors” Reviews in Computational Chemistry vol 9 http://dx.doi.org/10.1002/9780470125861.ch5 |
C++ |
Inertial shape factor | Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
Eccentricity | G. A. Arteca “Molecular Shape Descriptors” Reviews in Computational Chemistry vol 9 http://dx.doi.org/10.1002/9780470125861.ch5 |
C++ |
Asphericity | A. Baumgaertner, “Shapes of flexible vesicles” J. Chem. Phys. 98:7496 (1993) http://dx.doi.org/10.1063/1.464689 |
C++ |
Spherocity Index | Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
Autocorr3D | 2017.09リリースで新しく導入。 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
RDF | 2017.09リリースで新しく導入。 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
MORSE | 2017.09リリースで新しく導入。 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 |
C++ |
WHIM | 2017.09リリースで新しく導入。 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 注意 DRAGONを使って求めたこれらの記述子の値を正確に再現するには十分な情報が手にはいりません。 我々はこれが近い実装と信じています。 |
C++ |
GETAWAY | 2017.09リリースで新しく導入。 Todeschini and Consoni “Descriptors from Molecular Geometry” Handbook of Chemoinformatics http://dx.doi.org/10.1002/9783527618279.ch37 注意 DRAGONを使って求めたこれらの記述子の値を正確に再現するには十分な情報が手にはいりません。 我々はこれが近い実装と信じています。 |
C++ |
利用可能なフィンガープリントのリスト(List of Available Fingerprints)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#list-of-available-fingerprints
フィンガープリントのタイプ | 注釈 | 言語 |
---|---|---|
RDKit | 分子サブグラフのハッシュ化に基づくDaylight類似のフィンガープリント | C++ |
Atom Pairs | JCICS 25:64-73 (1985) | C++ |
Topological Torsions | JCICS 27:82-5 (1987) | C++ |
MACCS keys | 166の公開キーを使いSMARTSで実装 | C++ |
Morgan/Circular | ECFP/FCFPフィンガープリントに類似した、Morganアルゴリズムに基づくフィンガープリント JCIM 50:742-54 (2010). |
C++ |
2D Pharmacophore | ファーマコフォアポイント間のトポロジカルな距離を使用 | C++ |
Pattern | 部分構造探索に最適化されたトポロジカルなフィンガープリント | C++ |
Extended Reduced Graphs | JCIM 46:208-20(2006)で提案されたStieflらによるErGフィンガープリントから派生 注意: これらの関数は通常のフィンガープリントタイプではなくfloat型のアレイを返す |
C++ |
Morganフィンガープリントで使われているフィーチャーの定義(Feature Definitions Used in the Morgan Fingerprints)
これらはGobbi, A. & Poppinger, D. “Genetic optimization of combinatorial libraries.” Biotechnology and Bioengineering 61, 47-54 (1998)に記載されている定義を用いて作られています。
フィーチャー | SMARTS |
---|---|
Donor | [$([N;!H0;v3,v4&+1]),$([O,S;H1;+0]),n&H1&+0] |
Acceptor | [$([O,S;H1;v2;!$(*-*=[O,N,P,S])]),$([O,S;H0;v2]),$([O,S;-]),$([N;v3;!$(N-*=[O,N,P,S])]),n&H0&+0,$([o,s;+0;!$([o,s]:n);!$([o,s]:c:n)])] |
Aromatic | [a] |
Halogen | [F,Cl,Br,I] |
Basic | [#7;+,$([N;H2&+0][$([C,a]);!$([C,a](=O))]),$([N;H1&+0]([$([C,a]);!$([C,a](=O))])[$([C,a]);!$([C,a](=O))]),$([N;H0&+0]([C;!$(C(=O))])([C;!$(C(=O))])[C;!$(C(=O))])] |
Acidic | [$([C,S](=[O,S,P])-[O;H1,-1])] |
12/22/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0