ここでは ChEMBL のデータを取り込んでみる。
対象は chembl_21.sdf.gz
* ftp.ebi.ac.uk から取得(releases 21)。$$$$の件数で1,583,897件

テーブル作成

chembl_21.sdf.gzは構造式のMDLMOLとプロパティーとしてのchembl_idだけで構成されている。
RDKit/Cartridge/PubChemと同じようにするため、RDKitから作られるsmilesを入れるフィールド(RDKit_smiles)を持つテーブルchembleを用意した

フィールド名制約備考
MDLMOLtextM ENDまでの構造式(MDL MOL形式)
RDKit_smilesmolRDKitによりMDLMOLから作成
chembl_idvarchar(30)primary key主キー

っで、作成するSQLは下記とした

CREATE TABLE chemble (
  MDLMOL       text,                    --- MDL MOL形式
  RDKit_smiles mol,                     --- RDKitのデータ型
  chembl_id    varchar(30) primary key  --- ID
);

データ登録

RDKit/Cartridge/PubChem/登録と同じように python script(ChEMBLReg.py) を作ってみた

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
-
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#!/bin/python
import sys,gzip,os,re
import psycopg2
from rdkit import Chem
from rdkit.Chem import Descriptors
 
argvs=sys.argv
if ( len(argvs) != 2 ):
   print "usage: ChEMBLReg.py (sdf or sdf.gz)"
   quit()
inF = sys.argv[1]
if not os.path.isfile(inF):
   print "not found: " + inF
   quit()
 
if inF.endswith(".sdf.gz") or inF.endswith(".sd.gz"):
  sdf = Chem.ForwardSDMolSupplier(gzip.open(sys.argv[1]))
else:
  sdf = Chem.SDMolSupplier(inF)
 
db=psycopg2.connect("dbname=chemdb host=localhost user=caster")
c=db.cursor()
 
for mol in sdf:
  if mol is None: continue
  for key in mol.GetPropNames():
    sql = "INSERT INTO chemble(MDLMOL,chembl_id) VALUES('" + Chem.MolToMolBlock(mol) \
           + "','" + mol.GetProp("chembl_id") + "')"
  c.execute(sql)
db.commit()
c.close()
db.close()

これを使ってchembl_21.sdf.gzchemble にインポートした。

[root@c ~]# python ChEMBLReg.py chembl_21.sdf.gz

途中、

[01:14:27]  S group SUP ignored on line 105325440
[01:15:07] Explicit valence for atom # 36 F, 3, is greater than permitted
[01:15:07] ERROR: Could not sanitize molecule ending on line 106434949
[01:15:07] ERROR: Explicit valence for atom # 36 F, 3, is greater than permitted
 :

などエラーが発生したが、その部分は飛ばしてインポートが進み、

[root@c ~]# psql -U caster -d chemdb
psql (9.3.4)
Type "help" for help.
 
chemdb=> \dti+ chemble*
                             リレーションの一覧
 スキーマ |     名前     |      型      | 所有者 | テーブル | サイズ  | 説明
----------+--------------+--------------+--------+----------+---------+------
 public   | chemble      | テーブル     | caster |          | 1593 MB |
 public   | chemble_pkey | インデックス | caster | chemble  | 64 MB   |
(2 行)
 
chemdb=> select count(*) from chemble;
  count
---------
 1583849
(1 行)
 
chemdb=>

と1,583,849件のインポートに成功した。
元が1,583,897件なので、48件入らなかった

smilesの作成

RDKitは基本がsmilesなので、そのsmilesをMDLMOLフィールドを使って作成します。

[root@c ~]# psql -U caster -d chemdb
psql (9.2.15)
"help" でヘルプを表示します.
 
chemdb=> \d chemble
            テーブル "public.chemble"
      列      |          型           |  修飾語
--------------+-----------------------+----------
 mdlmol       | text                  |
 rdkit_smiles | mol                   |
 chembl_id    | character varying(30) | not null
インデックス:
    "chemble_pkey" PRIMARY KEY, btree (chembl_id)
 
chemdb=> \timing
タイミングは on です。
chemdb=> 
chemdb=> UPDATE chemble SET rdkit_smiles = mol_from_ctab(mdlmol::cstring);
UPDATE 1583849
時間: 1851406.780 ms
chemdb=>

1851406.780 msは、1851secで、つまりは30minほどで完了

構造式検索向けIndexの作成

このままでも一応構造式検索はできるが、RDKit_smilesフィールドからfingerprintを作成して構造式検索をより早く行わせる。fingerprintは別テーブルに収めてもいいが、ここではchembleテーブル内に用意した。

  1
  2
  3
  4
  5
  6
  7
[root@c ~]# psql -U caster -d chemdb
psql (9.2.15)
"help" でヘルプを表示します.
 
chemdb=> ALTER TABLE chemble ADD COLUMN pairbv bfp;
chemdb=> ALTER TABLE chemble ADD COLUMN torsionbv bfp;
chemdb=> ALTER TABLE chemble ADD COLUMN morganbv bfp;

次に、追加したフィールドに各種のfingerprintで更新する。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
chemdb=> \timing 
chemdb=> UPDATE chemble SET pairbv = atompairbv_fp(rdkit_smiles), 
chemdb->                    torsionbv = torsionbv_fp(rdkit_smiles),
chemdb->                    morganbv = morganbv_fp(rdkit_smiles,2);
UPDATE 1583849
時間: 2656309.129 ms    *44.2718 分
chemdb=>
chemdb=> CREATE INDEX chemble_apbvidx on chemble using gist(pairbv);
chemdb=> CREATE INDEX chemble_torsbvidx on chemble using gist(torsionbv);
chemdb=> CREATE INDEX chemble_morganbvidx on chemble using gist(morganbv);
chemdb=>
chemdb=> \dti+ chemble*
                                 リレーションの一覧
 スキーマ |        名前         |      型      | 所有者 | テーブル | サイズ  | 説明
----------+---------------------+--------------+--------+----------+---------+------
 public   | chemble             | テーブル     | caster |          | 4485 MB |
 public   | chemble_apbvidx     | インデックス | caster | chemble  | 727 MB  |
 public   | chemble_morganbvidx | インデックス | caster | chemble  | 213 MB  |
 public   | chemble_pkey        | インデックス | caster | chemble  | 122 MB  |
 public   | chemble_torsbvidx   | インデックス | caster | chemble  | 367 MB  |
(5 行)
 
chemdb=>

と4GBを超えた。場合によってはfingerprintを別テーブルで管理するのが宜しいかもしれない。
別テーブルにするには SELECT-INTO 文を使って、

  1
  2
  3
  4
  5
  6
  7
SELECT
  chembl_id,
  atompairbv_fp(rdkit_smiles) as pairbv,
  torsionbv_fp(rdkit_smiles)  as torsionbv,
  morganbv_fp(rdkit_smiles,2) as morganbv
INTO chemble_fps
FROM chemble;

とかにする。

検索してみる

実行時間を計測するには \timing を使う
intel N3700(1.60GHz)なマシンでは、

  1
  2
  3
  4
  5
  6
  7
chemdb=> \timing
chemdb=> SELECT chembl_id,rdkit_smiles from chemble where rdkit_smiles @>'Nc1ccnc2cc(Cl)ccc12';
(略)
(3922 行)
 
時間: 176240.703 ms
chemdb=>

176240.703 msは 2.9373 分。当然早いマシンではもっと短縮される。
でもpostgreSQLのLIMITオプションを使うと

  1
  2
  3
  4
  5
  6
  7
  8
  9
chemdb=> SELECT chembl_id,rdkit_smiles FROM chemble WHERE rdkit_smiles @>'Nc1ccnc2cc(Cl)ccc12' LIMIT 10;
   chembl_id   |                                             rdkit_smiles
---------------+-------------------------------------------------------------------------------------------------------
 CHEMBL503452  | CCN1CCN(c2nc(Nc3ccccc3)nc(N3CCN(CCNc4ccnc5cc(Cl)ccc45)CC3)n2)CC1
(略
(10 行)
 
時間: 715.143 ms
chemdb=>

と0.7秒に短縮。次の10件を表示させるにはOFFSETオプションを用いて

  1
  2
  3
  4
  5
  6
  7
  8
  9
chemdb=> SELECT chembl_id,rdkit_smiles FROM chemble WHERE rdkit_smiles @>'Nc1ccnc2cc(Cl)ccc12' LIMIT  10 OFFSET 10;
   chembl_id   |                    rdkit_smiles
---------------+-----------------------------------------------------
 CHEMBL3309577 | C[C@H](Nc1ccnc2cc(Cl)ccc12)C(=O)N1CCN(C)CC1
(略
(10 行)
 
時間: 221.113 ms
chemdb=>

とすればいいみたい。

類似構造検索

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
chemdb=> set rdkit.tanimoto_threshold=0.4;
chemdb=> SELECT chembl_id,rdkit_smiles FROM chemble
chemdb->  WHERE morganbv_fp('CC1=CC(=O)C=CC1=O',1) % morganbv;
   chembl_id   |                       rdkit_smiles
---------------+----------------------------------------------------------
 CHEMBL8320    | O=C1C=CC(=O)C=C1
 CHEMBL16028   | CC1=CC(=O)C(=O)C=C1C
(略
(21 行)
 
時間: 1606.153 ms
chemdb=>

1.6秒で帰ってきた


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2016-09-25 (日) 12:50:14 (1346d)