magattacaのブログ

日付以外誤報

RDKitとcolabolatoryで前処理しようとして挫折した話

RDKitの使い方を調べたりインフォマティクスに関する本を読んでみたりしましたが、結局あまり実際には動かせていません。
おそらく、写経(?)したりして身につける必要があるのでしょうが、いまいちそれだと楽しくない(ダメな入門者の典型)。

何か面白いこと・・・ということで、調子に乗って創薬ちゃんさんの創薬レイドバトルに登録してしまいました。

どうしよう・・・

とりあえずどんな化合物から絞り込めば良いのか化合物ライブラリを眺めてみることにしました。

化合物ライブラリをダウンロード、解凍してみると以下の4つのsdfファイルが入っていました。

f:id:magattaca:20190113215243p:plain

試しにsdfを開いてみたらMarvinViewが起動し手軽に見ることができました。
いつのまにこんなソフトが?と思ったら、ChemDrawの代わりに使えるものをということでインストールしたMarvinSketchと一緒にダウンロードされていたみたい・・・ChemAxon社様様です。

f:id:magattaca:20190113215514p:plain

中身は上記のような感じ・・・。構造に加えてidnumber、heavy_atoms、LogSなどなどのカラムがあるようです。

思ったよりシンプルな化合物です。もっとドラッグライクな化合物はあるのでしょうが、なにぶんデータが多すぎてよくわからない。 これは前処理(?)というやつで、ある程度数を減らさないといけなさそうです。

しかし何をすれば良いかわからない・・・。

まずは専門家の真似をしよう!ということで、@yamasakit_ 先生の記事( raziのDocker-composeで創薬レイドバトル2018用のJupyter Notebookからアクセスできる化合物データベースを作った話 )とケモインフォマティクス若手の会の ハンズオン資料 を参考に前処理を行ってみました。*1

方針としては

  • Google Colaboratoryを使ってみる(サイズ大きいから)
  • 処理としてRDKitを使って
    1. 構造の標準化
    2. 脱塩(一番大きい左図のフラグメントだけを残す)
    3. 電荷の中和を行う
  • idnumberと構造だけ残してsdfファイルにする

という感じです。

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上に表示されます。

f:id:magattaca:20190113221309p:plain

それでは処理を行います。

# 分子の標準化を行うためのモジュールを読み込む
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
f:id:magattaca:20190113221438p:plain f:id:magattaca:20190113221503p:plain f:id:magattaca:20190113221520p:plain

無事、塩酸塩が脱塩されました! 標準化電荷の中和が必要かいまいち理解できませんが、とりあえず処理に含めておきます。

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として出力したいと思いますが、処理をおこなったので元々のプロパティのうち、
logSlogPなどは意味のない値になってしまってそうです。
そこで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で見るとこんな感じ・・・

f:id:magattaca:20190113222354p:plain

) 上の図は修正前のものです。見た目は変わってしまいますが、こちらの方がわかりやすいので残しておきます。

どれくらいメモリをつかったのか?

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:

お正月読書感想文

1月も12日目ですが、あけましておめでとうございます。

インシリコ創薬に興味を持ち勉強を始めてみましたが、そもそもインフォマティクス(?)に関する知識が全然無い・・・ということで、年末年始の休暇を利用して数冊本を流し読みしてみました。

 

コードも数式も理解できないので読み飛ばしてしまいましたが、折角なので、備忘録を兼ねて感想を書きます。

 

1冊目:よくわかるバイオインフォマティクス 入門 

よくわかるバイオインフォマティクス入門 (KS生命科学専門書)

よくわかるバイオインフォマティクス入門 (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データサイエンスハンドブック  

 

 過去の記事で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によるディープラーニング

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

 

 

 やはりディープな話題にも触れてみなければならないのではないのか、ということで購入。ネットで購入して届いたら予想以上に分厚くて読む前から挫折しそうになったのですが、非常に読みやすくなんとか読み通すことができました。

まあ、コードを読まずに、図を追いかけただけなんですけどね。何となく雰囲気はつかめたので良し。

 

目次をマイナビブックスさんから・・・(サポートサイトへのリンクもあります)

 Part 1 ディープラーニングの基礎

  1章 ディープラーニングとは何か

  2章 予習:ニューラルネットワークの数学的要素

  3章 入門:ニューラルネットワーク

  4章 機械学習の基礎

   Part 2 ディープラーニングの実践

      5章 コンピュータビジョンのためのディープラーニング

      6章 テキストとシーケンスのためのディープラーニング

      7章 高度なディープラーニングのベストプラクティス

      8章 ジェネレーティブディープラーニング

      9章 本書のまとめ

 

 ディプラーニングの基礎的な話から、具体的に行うにはどうすれば良いのかKerasを使って説明されてます。原書の著者はKerasの作成者(!)だそうで、「LEGOブロックを組み立てる」ように簡単な「ユーザーフレンドリなライブラリ」により「ディープラーニングが大衆化」し、新規参入者が増えたことが分野を後押ししている、とのことです。もちろん作成者だけに現状での限界や、できないことについても記述してあり、その点が非常に良いと思いました。

 

 ケモインフォマティクス の分野から勉強を始めたため、あまり認識していなかったのですがディープラーニングの強い分野はやはり画像認識、ということで様々な興味深い事例が紹介されていました。悪夢的な画像を生成するDeepDreamや、任意の画像をゴッホが描いたかのように変換するニューラルスタイル変換など、やはり画像に関する技術はビジュアル的なインパクトが強く、門外漢にとっては読んでいてワクワクする純粋に楽しめる内容でした。

 また、ケモインフォ の記事をみていて見かける化合物生成に関連する技術、変分オートエンコーダ(VAE)や敵対生成ネットワーク(GAN)についてもとりあげられており、元々はこういう技術だったのか!と出所がわかり面白かったです。

 

とりあえず、ネットワークの損失関数をオプティマイズすれば良いってさ (←よくわからなかった)

 

4冊目:データ解析のための統計モデリング入門

 

 流行りのディープラーニングについて浅すぎる理解ができたので、次は機械学習に関連して各所でオススメされている本を・・・ということで緑本(で、あってます?)を購入しました。ハードカバーと難しそうな単語が並ぶタイトルからしてハードルが高かったのですが、驚くほど分かり易く読み易い語り口で一気に読み通すことができました。いろいろなブログでオススメされているのも納得という良書・・・もちろんコードは追えていない

 

著者の久保拓弥先生のページで出版のもとになった講義のーと が公開されており、章立てと全体の流れの解説図があるため目次は割愛します。

 

 さて、先の「PythonとKerasによるディープラーニング」の中で、ディープラーニングと従来のシャローラーニング(表層学習)との違いとして、ニューラルネットワークは生のデータから有益な特徴量を自動的に抽出できるため、特徴エンジニアリング(特徴量をより単純な方法で表現することで、問題を容易にすること)を必要とせずに行うことができる、ということが挙げられていました(4章 p.106)。だからと言って特徴エンジニアリングを疎かにすべきではないし、重要性として

 ・リソースの消費を抑えた上で問題を的確に解決できる

 ・より少ないデータで解決できる

があげられていましたが、やはりディープラーニングの大きな長所として特徴抽出に関して何度も述べられていました。

 他方、「データ解析のための統計モデリング入門」はまさに上記と対になるような内容という印象でした(間違ってたらすみません)。与えらえれたデータをもとにどのようにしてモデルを構築すれば良いか? 最小二乗法によるシンプルな線形モデルから、より高度な一般化線形モデル、階層ベイズモデルへと順をおってより複雑なモデルが説明されています。データのバックグラウンドを考慮しながら、複雑な自然のデータを解釈するためのモデルを作り上げていく流れは、”ドメイン知識に基づく特徴の抽出”といった感じで、研究者の思考をたどるような面白さがありました。

 残念ながらベイズ統計(というより統計全体)を理解していないため、後半、話の流れを追えなかった部分もあるのですが、とりあえず初心者でも一度は目を通した方が良い本だ、と思いました。

 

5冊目:これならわかる最適化数学

これなら分かる最適化数学―基礎原理から計算手法まで

これなら分かる最適化数学―基礎原理から計算手法まで

 

 

 統計モデリング入門は大変分かりやすかったのですが、やはり数学的素養があまりにもなさすぎてところどころ理解できない部分がありました。そこで「化学の新しいカタチ」さんのこちらの記事 でDr. Tomさんがオススメされていた、こちらの本を購入しました。

目次はこのような感じ・・・

 第1章 数学的準備

 第2章 関数の極値

 第3章 関数の最適化

 第4章 最小二乗法

 第5章 統計的最適化

 第6章 線形計画法

 第7章 非線形計画法

 第8章 動的計画法

 

 やはりDr. Tomさんがオススメされているだけあって非常に良い本で、読み進めるための数学的基礎の準備から、いかに関数を処理し最適化を行えば良いか、非常に分かりやすく解説されています。特にたまに見かけるけどもよくわからないまま放置していた「ラグランジュの未定乗数法」についても取り扱われていたので、個人的にはそれだけで読む価値がありました(・・・普通の理系なら当たり前の知識かも)。

 私の浅い理解では、機械学習は「モデルの作成 → 最適化問題を解く」という感じなので、これから勉強する上で色々と役に立ちそう・・・と思っています。また、本書のまえがきで述べられているところによると、最適化数学(数理計画)は「経営学やオペレーションズリサーチ(OR)の分野の中心テーマ」ということのようなので、「ある制約の下で、できるだけ最大限の利益を得る(= 損失を最小にする)ための最適な解を求める」という考え方は、機械学習に限らず様々な局面で役立ちそうです。

 

・・・っていうか大学で教えて欲しかった

6冊目:プログラミングのための線形代数 

プログラミングのための線形代数

プログラミングのための線形代数

 

 

 さて、「これなら分かる最適化数学」は大変良い本だったのですが、致命的に数学ができない私はこれでもわからない・・・。「今、何で行列のカッコ取れた?」「転置どこいった?」という調子で、とにかく式変形が追えない。これはダメだ・・・ということで線形代数に再入門すべくこちらの本を購入しました。

 amazonの評価が高いだけあって、またしても良書でした! 本書の「はじめに」で述べられているように、

 ・「数学のプロではない」読者を対象に

 ・「数学のための数学ではなく」

 ・「何の役にたつのか」の説明に気を配った

との言葉通り、多数の図を使って線形代数の様々な操作がどういう意味をもつのか説明されていて、私でも「線形代数が何をしたいのか」わかった気になりました。

 

目次は割愛し、重要なメッセージを!

・「行列は写像だ!」

・「行列は写像だ!」

・「行列は写像だ!」

 そして、

「空間で発想だ!」

「たいていのものはズームアップすればほとんどまっすぐだ!」

 

以上! 

まとめ

 コツコツと読み進めるといった計画的な勉強ができないダメ人間なので、長期休暇を活用すべく思い切って6冊も本を購入してしまいました。しかも、どうしても電子書籍に馴染めないという旧世代の人間なので全て紙版・・・。正直、金銭的にかなり辛かったのですが、各所でオススメされている本を中心に購入しただけあって、どの本も大変素晴らしく読んでよかった!と、思える本ばかりでした。

やはり「3日で分かる・・・」とかそんなタイトルにつられて何冊も購入するよりも、評価の高い本を腰を据えて読むのが大事だなあ、と今更ながらに実感した次第です。

 

 当初は「大学で統計や線形代数は一度勉強してるしー」みたいな軽い気持ちだったのですが、思った以上に何も理解していなかっです。大学院まで行ってこの低レベルの私は一体・・・。というよりジョルダン標準形やらラグランジュの未定乗数法やらやった記憶が一切ないんですが、私は本当に理系なのか???

・・・

というわけで、本年も雰囲気理系として、ぼちぼちやっていきたいと思いますのでどうぞよろしくお願いいたします。

 

 

 

 

*1:ケモインフォ はこちらみたいな本をがあったら是非読みたい!

*2:腸内細菌叢と疾患の関わりに関する研究も熱いのでマクロは薬学と無関係という意味ではないです・・・念のため

*3:気持ちの悪い発言

RDKit直訳 総括

勢いだけで始めた RDKit直訳 Advent Calendar 2018 - Adventar ですが、なんとか日程を全て終えることができました。ご支援いただいた皆様ありがとうございました。

 

ご覧いただいているという嬉しいコメントもいただいたので、調子に乗って試訳をまとめたテストサイトを作成しました。よろしければご参照ください。こんな感じです↓ 

f:id:magattaca:20181230210225p:plain

 

以下、備忘録を兼ねて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というエディタというのを使って見たのですが、こちらのプレビュー機能というのがとても便利でした。こんな感じ↓

f:id:magattaca:20181230193800p:plain

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)

[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#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)

[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#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)

[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#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)

[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#getatomsmiles-generates-isomeric-smiles-by-default

以前のリリースでは、出力されるSMILESに立体化学や同位体ラベルについての情報を含めたい場合、オプションのisomericSmiles引数をtrueに設定する必要がありました。現在、このデフォルトの値はtrueとなっています。昔の動作に戻し、立体化学の情報を持たないSMILESを取得したい場合は、isomericSmilesをfalseに設定するだけです。

MCSコードのringMatchesRingOnlyオプションの変更点(Changes to ringMatchesRingOnly option in the MCS code)

[Link] https://www.rdkit.org/docs/BackwardsIncompatibleChanges.html#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では芳香族であるとは見なされません。

f:id:magattaca:20181222202346p:plain
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

電気陰性原子に結合する環外の結合は、環上の原子から価電子を"盗み"、ダミー原子は環を芳香族とするのに必要な数だけ無制限に寄与することに注意してください。

芳香族性に縮合多環系を使う場合、個々の環は非芳香族性なのに、環全体としては芳香族といった状況となることがあります。例を挙げるとアズレンです:

f:id:magattaca:20181222202413p:plain
picture_8.png

縮合多環系と環外二重結合の影響を示す極端な例をあげます:

f:id:magattaca:20181222202439p:plain
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

特別な場合をあげると、ラジカルのヘテロ原子は芳香族性の候補と見なされません。

f:id:magattaca:20181222202504p:plain
picture_10.png

電荷とラジカルをもつ炭素も芳香族とは見なされません:

f:id:magattaca:20181222202600p:plain
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),)
  • ヘテロ原子隣接クエリ:
    • アトムクエリzは指定した数のヘテロ原子(すなわちCやHでは無い)を隣接してもつ原子にマッチします。例えば、z2はCC(=O)Oの2番目のCにマッチします。
    • アトムクエリzは指定した数の脂肪族ヘテロ原子(すなわちCやHでは無い)を隣接してもつ原子にマッチします。
>>> 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

  1. アトムクエリの最後にアトムマップの情報を含めてください。つまり[C,N,O:1]や[C;R:1]の様にしてください。
  2. 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

f:id:magattaca:20181222202724j:plain
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

デフォルトでは、分子を解析する関数は全て、読み込まれた分子に対して"サニタイゼーション"の処理を行います。サニタイゼーションの考え方というのは、残りのコードのために有用な特性(混成の状態や、環構造に含まれるか否か、など)を算出することと、分子が"合理的である"ことを保証することです。合理的とはつまり、分子をオクテット則を完全に満たす様なルイス構造式であらわすことができるということです。

処理の過程を順番に示します。

  1. clearComputedProps: 分子とその原子、結合に既に存在する計算による特性を全て除去します。この処理はいつも行われます。

  2. 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

この処理では例外は生じないはずです。

  1. updatePropertyCache: 全ての原子の明示的原子価と暗に表される原子価を計算します。これは許容されるよりも高い価数の状態となっている原子には例外を生成します。この処理はいつも行われますが、もしこの過程を"スキップ"すると非標準的な原子価についてのテストは実行されません。

  2. symmetrizeSSSR: 対称化された"最小の環構造についての最小のセット"(SSSR: Smallest Set of Smallest Rings)のアルゴリズムを呼び出します(SSSRについてはGetting Started ドキュメントで議論しました)。

  3. Kekulize: 芳香環をケクレ形式に変換します。環構造をケクレ化できなかった場合や芳香族性の結合が環の外部に見つかった場合に例外を返します。

  4. assignRadicals:(存在する場合)各原子のラジカル電子の数を決定します。

  5. setAromaticity: 芳香環と環の系(ring system、上述)を同定し、原子と結合に芳香族フラグをセットし、結合次数を芳香族にセットします。

  6. setConjugation:どの結合が共役しているか同定します。

  7. setHybridization: 各原子の混成の状態を計算します。

  8. cleanupChirality: sp3混成ではない原子から不斉のタグを取り除きます。

  9. adjustHs: 化学を保存するのに必要な場所に明に示された水素原子を付け加えます。これは典型的には芳香環のヘテロ原子に必要とされます。古典的な例はピロールの窒素原子です。

個々の処理はMolOps::sanitizeMolChem.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.cContribプログラムの挙動と文献の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)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#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