RDKit / PostgresSQL

RDKitはPostgresSQLと連携させて構造情報を色々と扱うことができます。
ChemBL DBはPostgresSQL用のファイルが利用できますし、
ローカルにDBを作って作業すると、自分の幅が少し広がりそうです。
SQLなんかの勉強にもなる?
取りあえずやってみました。
まずpostgresql9.2.4をビルドしました。
マニュアルに従って、、、、

./configure
make
su
make install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
pg_ctl start

でOK
続いてRDKitの設定

cd $RDBASE/Code/PgSQL/rdkit
make
make install
make installcheck

でエラーが出なかったら成功。
途中で何個かwarningでましたが、一応自分の環境では8個のテスト全部パスしました。
ちなみに
RDKit2013_03_2
PostgreSQL 9.2.4
BOOST 1.53.0でビルドしました。
で実際にデーターベースを作ってみます。
先ほどのフォルダの直下にdataという1000件のsmilesが入ったファイルがあったのでこれを使ってみます。

cd ./data
createdb testdb
psql testdb

これでテスト用のDBを作りました。
続いてファイルを読み込みます。

psql testdb
testdb=# create table moltable (id integer primary key, smiles text);
testdb=# copy moltable from filedir/data;

copy xxx from yyy;でファイルを取り込みます。デフォルトの区切りはタブなのでそのまま。
続いてrdkitの機能を入れる(という表現がいいのか不明ですが)

testdb=# create extension if not exists rdkit;
testdb=# create shcema rdk;
testdb=# select * into mols from (select id,mol_from_smiles(smiles::cstring) m from moltable) tmp where m is not null;
testdb=# create index molidx on mols using gist(m);

でmolsテーブルができました。

testdb=# select * from mols limit 10;
   id    |                                     m                                      
---------+----------------------------------------------------------------------------
 6308684 | O=C1C=Cc2ccccc2/C1=N/Nc1nccs1
 6061070 | O=C1C=CC(=Nc2cc(Cl)c3c(c2[N+](=O)[O-])NON3)C=C1
 5485201 | Cl.O=C1CC[C@@]2(O)[C@H]3Cc4ccc(O)c5c4[C@@]2(CCN3CC2CC2)[C@H]1O5
 5307588 | O=C(C1CCN(S(=O)(=O)c2cccc3cccnc32)CC1)N1CCn2c3ccccc3nc21
 5243548 | CC1(C)CC(=O)C(=CNc2cccnc2NC=C2C(=O)CC(C)(C)CC2=O)C(=O)C1
 4209216 | O=C(NN=Cc1cccc2cccnc12)c1ccccc1O
 3746037 | C[N+]1=C2C=CC=CC=C2SC12C([N+](=O)[O-])=CC(=[N+]([O-])[O-])C=C2[N+](=O)[O-]
 3240530 | O=C(C1CCN(S(=O)(=O)c2cccc3nsnc32)CC1)N1CCn2c3ccccc3nc21
 3128208 | O=[N+]([O-])c1c2nonc2c(Cl)cc1Nc1cccc(O)c1
 2772102 | O=[N+]([O-])c1c2nonc2c(Cl)cc1Nc1ccccn1
(10 rows)

Time: 10.815 ms

次にプロパティの計算をしてみます。

testdb=# select id, mol_amw(m) as amw , mol_logp(m) as logp into props from mols;
SELECT 1000
Time: 1699.063 ms
testdb=# \dt
          List of relations
 Schema |   Name   | Type  |  Owner   
--------+----------+-------+----------
 public | data     | table | postgres
 public | fps      | table | postgres
 public | mols     | table | postgres
 public | moltable | table | postgres
 public | props    | table | postgres
(5 rows)

testdb=# select * from props limit 100;
    id    |   amw   |  logp   
----------+---------+---------
  6308684 | 255.302 |  2.5552
  6061070 | 306.665 |  2.6998
  5485201 | 377.868 |  1.9472
  5307588 | 461.547 |   3.032
  5243548 | 409.486 |  3.5896
  4209216 |  291.31 |  2.7043
  3746037 | 362.323 |  1.3066
  3240530 | 468.564 |  2.4885
  3128208 | 306.665 |  3.2336
  2772102 | 291.654 |   2.923
  2104451 | 339.298 |  4.0692
  2082098 | 304.396 | 3.40552
   972880 | 268.345 | 3.65212
   852940 | 257.318 |  2.1271
  5224323 | 345.402 |  3.6678
  3712088 | 402.473 |  4.8402
  3623511 | 329.743 |  3.6509
  2193022 | 363.156 |   4.669
   571783 | 273.723 |   2.889
   161167 |  284.34 |  3.0356
 16219722 | 529.611 |  2.5168
 16129550 | 726.194 |   3.201
  5719581 | 306.665 |  2.6998
Time: 1.419 ms

1000件の分子量とlogpの計算が2秒弱なので早いですね。(と思うんですがどうでしょう。)

Advertisements