パトコアの技術ブログ

化学情報管理・創薬支援のためのケモインフォマティクス製品を扱うパトコアです。本ブログは技術チームにより運営されており、各種ツールを使うとどんなことができるの?という観点から、技術情報をお届けします。

パトコアの技術ブログ

Instant JChemによる化合物のクラスタリングと可視化

f:id:patcore:20210909183356p:plain

投稿者 Patcore, Inc.

化合物のライブラリーサイズが増加していることに伴い、類似の性質・構造を持つ化合物群に分類する手法が発達してきました。化学構造のフィンガープリントを使った構造類似度に基づく分類法(ウォード法、k平均法)や、部位構造に着目した分類法(MCS、BMF)が挙げられます。この目的でChemAxonからはJKlusterというパッケージが提供されています。

分析方法は置いておいて、本記事ではある化合物ライブラリーから目的の骨格を持つ化合物レコードを探し出して可視化するための方法について紹介します。可視化のためにはInstant JChem1という化学データ閲覧・可視化アプリケーションを使いました。Instant JChem(以下IJC)はPostISIS時代から長年定評があり、デスクトップのGUI上の操作で化合物データベースを作成することができます。以前にJChem for Excelを使った簡易的な化合物データベース作成方法について紹介しましたが、Instant JChemを使うと大規模な(~数百万構造)化合物ライブラリーを堅牢なRDBMS上に構築することができます。



目次


Bemis Murcko Framework (BMF)

化学構造から骨格情報を抽出するアルゴリズムとして、Bemis Murcko Frameworkはよく利用されます。分子グラフ理論においてノードとエッジが原子と結合を表しますが、それぞれからラベル情報を削除することにより構造を簡素化させることができます。そして、さらに側鎖を削除することにより、環構造とリンカーのみで構成される骨格を抽出することができます。

ChemAxonではStructural Calculator Pluginsを使い、BMFを生成します。また、簡素化の度合いを変えたBMF Looseも生成できます。それぞれ、以下の図のような骨格となります。

f:id:patcore:20210909183430p:plain:w600

今回はこのBMFの骨格構造を使って化合物ライブラリーをグルーピング、及び可視化してみます。


TL;DR

BMF構造を使った化合物ライブラリーのグルーピング方法として、1)Tree Tableを使った簡易的グルーピング、2)テーブル間定義によるデータの階層化と可視化、の2つを紹介します。それぞれ、最終的に以下のような結果が得られます。

f:id:patcore:20210909183421p:plain

BMF構造によるグルーピングという限定されたテーマではありますが、紹介する手順は汎用性が高く他の目的でも使えます。特に2)のテーブル間定義を用いる手順は重要で、化合物構造のデータテーブルとその他様々なアッセイデータが管理されているテーブルを紐づけ、一つのフォームでデータを閲覧する目的で広く使われています。


Tree Tableを使ったグルーピング

サンプル化合物ライブラリーの読み込み

IJCでは主に3階層でデータを管理します。最上位階層にはProject、その下にSchema、その下にData Treeとして3階層を構成します。それぞれのData Treeには表示を行うためのViewを作成することができます。データはRDBMSであるOracle, PostgreSQLなどに作成するよう設定することもできますが、ローカルにデータファイルとして持つこともできます。今回はローカルにデータを保存します。

まずProjectを作成しますので、IJCのホーム画面からNew Projectを選択し、プロジェクト名を入力します。指定した名前のプロジェクトファイルと、ローカルデータベースを選択したため「localdb」というSchemaが作成されました。

f:id:patcore:20210909183505p:plain

作成されたlocaldbを右クリックし、Import Fileメニューからサンプル化合物ライブラリーとして用意したSDFファイル(CORP2000.sdf)を読み込みます。このファイルには2000の化合物レコードとその他に化合物番号や純度、登録日といった情報が含まれています。IJCではデータ型を自動で認識するので、データ型(VARCHAR、DOUBLE、DATE、BOOLEAN等)を逐一設定する必要が無く、テーブルが作成されます。

f:id:patcore:20210909183437p:plain


BMFの生成

次に、BMFを生成します。ChemAxonの製品ではChemical Termsという独自言語を使うことで、製品間においてシームレスに化学計算を利用できるようになっています。Chemical Termsでは、bmf()、bmfl()の関数を使うことで、それぞれBMFとBMF Looseが自動で生成されます。

とても簡単にBMFのアルゴリズムを利用できるのですが、標準では戻り値がChemAxon標準のmrv形式になってしまうことに注意です。mrv形式はXML形式で化学構造、およびそれに付随する原子プロパティや座標情報が記録され情報のロスが無いフォーマットなのですが、今回はBMFの構造により検索するのでデータ量が多いことは好ましくありません。また、mrv形式はcannonical(≈一意)ではありません。このため、bmf関数から戻ってくる値をmolFormat()関数を使って一意であることが保証されるunique smiles "smiles:u"に変換します。

IJCから新しくChemical Termsを使ったフィールド作成ボタンをクリックし、Chemical Termsの関数を入力します。

f:id:patcore:20210909183405p:plain

新しいフィールドにSMILES Stringが挿入されました。テキストのままでは見にくいので、Custom Widget Settingからレンダラーのオプション設定を変更し、SMILES Stringを読み取って構造が描画されるようにした結果が以下のようになります。

f:id:patcore:20210909183451p:plain


Tree Tableの作成

データテーブルとしてはこれまでの操作で作成できましたが、見にくいのでBMFの構造でグルーピングさせた閲覧用の画面を作成したいと思います。IJCでは閲覧用にForm Viewというデータの見せ方をデザインできる機能があります。この閲覧用コンポーネントの中に「Tree Table」というものがあり、グルーピングの要素(テキストや数値データ等)を指定することでテーブルをTree形式に階層化させて閲覧できます。

新たにBMF_TreeViewというForm Viewを作成し、Tree Tableの設定を行います。グルーピングのフィールドとして生成されたBMF_SMILESフィールド(テキスト)を指定し、値としてテーブルに表示させるフィールドを選択します。今回はBMF_SMILESフィールドのみをグルーピングに使いましたが、その他リング構造の数など、テキストや数値を組合わせた複数フィールドを使ってグルーピングさせることもできます。

f:id:patcore:20210909183500p:plain:w600

テーブルデータがBMF_SMILESによりグルーピングされ、同じBMF構造を持つレコードが一つのグループにまとめられました。BMF_SMILESをクリックすることにより、グループを展開/折り畳むこともできます。

f:id:patcore:20210909183456p:plain


テーブル間定義を使った階層化

Tree Tableを使った方法では簡易的にグルーピングさせて確認するためには便利なのですが、本格的な分析を行うためには物足りません。IJCはRDBMSのフロントエンドアプリケーションとしてデータベースを作成できますが、そうであるならば当然外部キー制約を使って参照整合性を保証したり、テーブル間を結合させたデータ参照もできるはずです。このテーブル間定義を設定する機能を使って、より複雑なデータ構造を持つ化合物ライブラリーにも対応できます。

まず、Tree Tabelを作成した時にIJCに作ったテーブルデータを使って、元データ (CORP2000.sdf)、bmf_table.csv、relationship_table.csvの3つのファイルを用意しました。 数も少ないのでExcel上で簡単なデータ処理を行い、作成しました。

新たに作成したbmf_table.csvでは生成したBMFのSMILES、一意の番号、元データにおける出現回数をレコードに持ちます。

BMF_SMILES,BMF_ID,BMF_NUM
C1CCCCC1,1,8
C1CCC2CCCCC2C1,2,1
C1CCC2CC3CCCCC3CC2C1,3,1
C1CCC2CC(CCC2C1)C1CCCC2CCCCC12,4,5
...

relationship_table.csvでは元データとbmf_tableをそれぞれ自社化合物番号(CorpID)、BMF番号(BMF_ID)で紐づけるためのテーブルです。

CorpId,BMF_ID
PAT-0001522,1
PAT-0001357,1
PAT-0001343,1
PAT-0000470,1
...

それぞれのテーブル間は1対1、1対多の関係性を持っています。DBの正規化構造に従っており、以下のER図で表されます。

f:id:patcore:20210909183417p:plain:w600


データの読み込み

IJCでは化合物ファイル以外にもcsvなどのデータ形式を読み込むことができますので、SDFの時と同様にImport Fileメニューからテーブルデータを読み込みます。CORP2000, bmf_table, relationship_tableの3つのData Treeが作成されました。後でグラフを作成したいので、CORP2000にはChemical Termsを使ってlogPとTPSAフィールドを新たに作成しました。

f:id:patcore:20210909183412p:plain


テーブル間定義の作成

テーブル間の関係性を定義するためには、Schemaエディターを使います。localdbのSchemaを右クリックし、Schemaエディター画面に移ります。ここで各データテーブル(エンティティ)を開いて、関連付けに使いたいフィールドをキーとしてテーブル間定義を作成します。今回の場合はCORP2000とrelation_table間をCorpIdを使って1対1に、bmf_tableとrelation_table間をBMF_IDを使って1対多の多重度で定義しました。

f:id:patcore:20210909183446p:plain

キーとして使うフィールドは検索に使われるため、レコード数が数十万を超えるような場合はインデックスを張っておくとパフォーマンスが向上します。インデックスの作成もIJC上で行うことができます。


ビューの作成

これまでの作業でシステム上はテーブル間が関連付けされましたので、今度はユーザーにとってデータを閲覧しやすいようにForm Viewを使って閲覧画面をカスタマイズします。まず、3つのテーブルデータを関連付けたData Treeを作成します。localdbのスキーマを右クリックをしてNew Data Treeを選択し、新規のData Treeを作成します。「BMF階層化」という名前をつけました。1対多の関係性で階層化するので、bmf_tableが親階層となります。以下の図のように親階層であるbmf_tableからrelation_tableを介して、CORP2000を子階層として関連付けできました。

f:id:patcore:20210909183511p:plain:w600

この階層化により、一つのBMF構造から紐づいた1つ以上のCORP2000のリコードを参照できるようになりました。後はTree Tableを作った時と同様に、適当にForm Viewをカスタマイズします。以下の最終的な画面では左上のBMF構造を選択すると、それに紐づくCORP2000のレコードを参照できるようにしてあります。BMF構造に紐づくCORP2000のリコードがいくつあるのか表示すると便利なので、BMF_NUMの値をBMF構造と一緒に表示するよう、Extra Fieldsに設定しました。ついでに、選択したCORP2000のレコードの分子量分布、logPとTPSAの散布図、logP, TPSA, Purity, 分子量の4要素のレーダーチャートによりデータをグラフ化しています。各構造・値は動的に紐づいているため、グラフ上の要素をクリックすると対応するCORP2000レコード、BMF構造を引き当てることもできます。

f:id:patcore:20210909183441p:plain


IJCについて

今回の記事ではIJCを使うことにより、以下ができることを紹介しました。

  • SDF, CSVからデータテーブルを作成
  • BMF, LogP, TPSAをChemical Termsを使って計算
  • 閲覧用のForm Viewのカスタマイズ
  • Tree Tableによるグルーピング
  • テーブル間定義の作成
  • 複数テーブル間を関連付けて階層化
  • グラフ化・可視化

上記はIJCの機能の内のごく一部です。IJCは非常に多機能な化学デスクトップアプリケーションであり、その他にも便利な機能が多くあります。色々なことができるということは多くのユーザーのニーズを満たせるという一方、習熟に時間がかかることの裏返しでもあります。そんな時のための技術サポートチームですので、既存のお客様も新規の方もお気軽にご相談ください。