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
Non-Chemical Functionality 〜RDKit 直訳 Day21〜
(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 21日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
binary value: 2進値、バイナリ値
sparsely: まばらな、低密度の
negate the vector: ベクトルの符号を反転する
completion: 補完
tooltip: ツールチップ
以下、訳
化学以外の機能(Non-Chemical Functionality)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#non-chemical-functionality
ビットベクトル(Bit vetors)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#bit-vectors
ビットベクトルは多数のバイナリ値(例えばフィンガープリントを表すバイナリ値)を効率的に格納するための入れ物です。RDKitには2つのタイプのフィンガープリントがあり、値を内部に格納する方法に違いがあります。2つのタイプは簡単に互いに変換することができますが、それぞれ最適な使用目的は異なっています:
- SparseBitVectsはベクトルに含まれるビットセットのリストだけを保存します。ファーマコフォアフィンガープリントのように非常に大きく、低密度のベクトルを保存するのにとても適しています。立っているビットのリストを取得するといった操作は非常に速いです。一方でベクトルの符号を反転するといった操作はとても、とても遅いです。
- ExplicitBitVectsは立っているビットも立っていないビットも両方の情報を記録します。一般にSparseBitVectsよりも速いですが、保存するのに必要なメモリーが大きくなります。
DIscrete value vectors
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#discrete-value-vectors
3D grids
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#d-grids
Points
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#points
ヘルプの使い方(Getting Help)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#getting-help
RDKitのdocistringにはたくさんのドキュメントが含まれており、利用することができます。Pythonのヘルプコマンドを使って参照することができます。
>>> m = Chem.MolFromSmiles('Cc1ccccc1') >>> m.GetNumAtoms() 7 >>> help(m.GetNumAtoms) Help on method GetNumAtoms: GetNumAtoms(...) method of rdkit.Chem.rdchem.Mol instance GetNumAtoms( (Mol)arg1 [, (int)onlyHeavy=-1 [, (bool)onlyExplicit=True]]) -> int : Returns the number of atoms in the molecule. ARGUMENTS: - onlyExplicit: (optional) include only explicit atoms (atoms in the molecular graph) defaults to 1. NOTE: the onlyHeavy argument is deprecated C++ signature : int GetNumAtoms(RDKit::ROMol [,int=-1 [,bool=True]]) >>> m.GetNumAtoms(onlyExplicit=False) 15
コマンドの補完やツールチップを使うことができる環境で作業する場合、利用可能なメソッドをとても簡単に確認することができます。Jupyternotebookをつかった使用例のスクリーンショットはこのようになります:
picutre_6.png
発展的なトピック/注意点(Advanced Topics/Warnings)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#advanced-topics-warnings
分子の編集(Editing Molecules)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#editing-molecules
RDKitで提供されているいくつかの機能では、"その場で"分子を編集することができます。
>>> m = Chem.MolFromSmiles('c1ccccc1') >>> m.GetAtomWithIdx(0).SetAtomicNum(7) >>> Chem.SanitizeMol(m) rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE >>> Chem.MolToSmiles(m) 'c1ccncc1'
サニタイゼーションを行うのを忘れないようにしてください。忘れると、(深く考えない限り)一見うまくいったかのような結果を返しますが、
>>> m = Chem.MolFromSmiles('c1ccccc1') >>> m.GetAtomWithIdx(0).SetAtomicNum(8) >>> Chem.MolToSmiles(m) 'c1ccocc1'
この結果はもちろん完全にナンセンスで、サニタイゼーションをしようとすれば分かります:
>>> Chem.SanitizeMol(m) Traceback (most recent call last): File "/usr/lib/python2.6/doctest.py", line 1253, in __run compileflags, 1) in test.globs File "<doctest default[0]>", line 1, in <module> Chem.SanitizeMol(m) ValueError: Sanitization error: Can't kekulize mol
より複雑な変換はrdkit.Chem.rdchem.RWMolクラスを使うことで実行できます:
[link] rdkit.Chem.rdchem.RWMol
>>> m = Chem.MolFromSmiles('CC(=O)C=CC=C') >>> mw = Chem.RWMol(m) >>> mw.ReplaceAtom(4,Chem.Atom(7)) >>> mw.AddAtom(Chem.Atom(6)) 7 >>> mw.AddAtom(Chem.Atom(6)) 8 >>> mw.AddBond(6,7,Chem.BondType.SINGLE) 7 >>> mw.AddBond(7,8,Chem.BondType.DOUBLE) 8 >>> mw.AddBond(8,3,Chem.BondType.SINGLE) 9 >>> mw.RemoveAtom(0) >>> mw.GetNumAtoms() 8
RWMolはROMolと同じように使うことができます:
>>> Chem.MolToSmiles(mw) 'O=CC1=NC=CC=C1' >>> Chem.SanitizeMol(mw) rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE >>> Chem.MolToSmiles(mw) 'O=Cc1ccccn1'
標準的な分子を扱うよりも、RWMolを使った方がナンセンスな結果を出しやすいです。化学的に妥当な結果が必要ならば、必ず結果にサニタイゼーションを行うようにしてください。
12/21/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0
Molecular Fragments 〜RDKit 直訳 Day20〜
(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。
こちらはRDKit直訳 Advent Calendar 2018 - Adventar 20日目の記事です。基本的な進め方は1日目の記事をご覧ください。
本日の訳出に困った用語
bit ranking functionality: ビットランキング機能
artificial example: モデルケース
以下、訳
分子フラグメント(Molecular Fragments)
[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#molecular-fragments
RDKitには分子のフラグメント化を行うツールと、生成したフラグメントを扱うためのツールが揃っています。フラグメントは互いに結合した原子団から成るものと定義されていて、原子団が付随する官能基を持つ場合もあります。説明するよりもやってみせたほうがわかりやすいでしょう:
>>> fName=os.path.join(RDConfig.RDDataDir,'FunctionalGroups.txt') >>> from rdkit.Chem import FragmentCatalog >>> fparams = FragmentCatalog.FragCatParams(1,6,fName) >>> fparams.GetNumFuncGroups() 39 >>> fcat=FragmentCatalog.FragCatalog(fparams) >>> fcgen=FragmentCatalog.FragCatGenerator() >>> m = Chem.MolFromSmiles('OCC=CC(=O)O') >>> fcgen.AddFragsFromMol(m,fcat) 3 >>> fcat.GetEntryDescription(0) 'C<-O>C' >>> fcat.GetEntryDescription(1) 'C=C<-C(=O)O>' >>> fcat.GetEntryDescription(2) 'C<-C(=O)O>=CC<-O>'
フラグメントはrdkit.Chem.rdfragcatalog.FragCatalogにエントリーとして格納されています。エントリーの記述が山括弧で囲まれた部分(例えば'<'と'>'の間)を含むことに注意してください。この部分はフラグメントに結合する官能基を表します。例えば、上記の例の場合、カタログエントリー0はアルコールが一方の炭素に結合したエチル基のフラグメントに相当し、エントリー1はカルボン酸が一方の炭素に結合したエチレンに相当します。官能基についての詳細な情報は、官能基のIDをフラグメントに問い合わせ、そのIDをrdkit.Chem.rdfragcatalog.FragCatParamsオブジェクトの中から探し出すことで得られます。
[link] rdkit.Chem.rdfragcatalog.FragCatalog
[link] rdkit.Chem.rdfragcatalog.FragCatParams
>>> list(fcat.GetEntryFuncGroupIds(2)) [34, 1] >>> fparams.GetFuncGroup(1) <rdkit.Chem.rdchem.Mol object at 0x...> >>> Chem.MolToSmarts(fparams.GetFuncGroup(1)) '*-C(=O)[O&D1]' >>> Chem.MolToSmarts(fparams.GetFuncGroup(34)) '*-[O&D1]' >>> fparams.GetFuncGroup(1).GetProp('_Name') '-C(=O)O' >>> fparams.GetFuncGroup(34).GetProp('_Name') '-O'
カタログは階層構造になっており、小さなフラグメントが合わさってより大きなフラグメントを構成します。rdkit.Chem.rdfragcatalog.FragCatalog.GetEntryDownIds()メソッドを使って、小さなフラグメントから、そのフラグメントが寄与するより大きなフラグメントを見つけることができます。
[link] rdkit.Chem.rdfragcatalog.FragCatalog.GetEntryDownIds()
>>> fcat=FragmentCatalog.FragCatalog(fparams) >>> m = Chem.MolFromSmiles('OCC(NC1CC1)CCC') >>> fcgen.AddFragsFromMol(m,fcat) 15 >>> fcat.GetEntryDescription(0) 'C<-O>C' >>> fcat.GetEntryDescription(1) 'CN<-cPropyl>' >>> list(fcat.GetEntryDownIds(0)) [3, 4] >>> fcat.GetEntryDescription(3) 'C<-O>CC' >>> fcat.GetEntryDescription(4) 'C<-O>CN<-cPropyl>'
多数の分子からつくったフラグメントをカタログに加えることもできます。
>>> suppl = Chem.SmilesMolSupplier('data/bzr.smi') >>> ms = [x for x in suppl] >>> fcat=FragmentCatalog.FragCatalog(fparams) >>> for m in ms: nAdded=fcgen.AddFragsFromMol(m,fcat) >>> fcat.GetNumEntries() 1169 >>> fcat.GetEntryDescription(0) 'Cc' >>> fcat.GetEntryDescription(100) 'cc-nc(C)n
カタログ内のフラグメントは一意に定められたユニークなもので、分子をもう一度追加しても新しいエントリーは増えません:
>>> fcgen.AddFragsFromMol(ms[0],fcat) 0 >>> fcat.GetNumEntries() 1169
一旦rdkit.Chem.rdfragcatalog.FragCatalogを生成すれば、それを用いて分子のフィンガープリント化を行うこともできます。
[link] rdkit.Chem.rdfragcatalog.FragCatalog
>>> fpgen = FragmentCatalog.FragFPGenerator() >>> fp = fpgen.GetFPForMol(ms[8],fcat) >>> fp <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x...> >>> fp.GetNumOnBits() 189
これで、フィンガープリントに関連づけられた残りの機能をフラグメントフィンガープリントに適用することができるようになりました。例えば、二つの分子について、それぞれのフィンガープリントの積集合をとることで、共通して存在するフラグメントを簡単に見つけることができます:
>>> fp2 = fpgen.GetFPForMol(ms[7],fcat) >>> andfp = fp&fp2 >>> obl = list(andfp.GetOnBits()) >>> fcat.GetEntryDescription(obl[-1]) 'ccc(cc)NC<=O>' >>> fcat.GetEntryDescription(obl[-5]) 'c<-X>ccc(N)cc'
また、ある分子を別の分子と区別するフラグメントを見つけることもできます:
>>> combinedFp=fp&(fp^fp2) # can be more efficent than fp&(!fp2) >>> obl = list(combinedFp.GetOnBits()) >>> fcat.GetEntryDescription(obl[-1]) 'cccc(N)cc'
rdkit.ML.InfoTheory.rdInfoTheory.InfoBitRankerクラスのビットランキング機能を使って活性化合物を不活性化合物と区別するフラグメントを見つけ出すこともできます。
[link] rdkit.ML.InfoTheory.rdInfoTheory.InfoBitRanker
>>> suppl = Chem.SDMolSupplier('data/bzr.sdf') >>> sdms = [x for x in suppl] >>> fps = [fpgen.GetFPForMol(x,fcat) for x in sdms] >>> from rdkit.ML.InfoTheory import InfoBitRanker >>> ranker = InfoBitRanker(len(fps[0]),2) >>> acts = [float(x.GetProp('ACTIVITY')) for x in sdms] >>> for i,fp in enumerate(fps): ... act = int(acts[i]>7) ... ranker.AccumulateVotes(fp,act) ... >>> top5 = ranker.GetTopN(5) >>> for id,gain,n0,n1 in top5: ... print(int(id),'%.3f'%gain,int(n0),int(n1)) ... 702 0.081 20 17 328 0.073 23 25 341 0.073 30 43 173 0.073 30 43 1034 0.069 5 53
上記の例で、各列はbitId、infoGain、nInactive、nActiveを表します。上記モデルケースではこの手法がさほどうまくいっていないことに注意してください。
12/20/2018
このブログ記事のライセンス
以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0