PubChemを取り込むテーブルpubchemを用意した。RDKit/Cartridge/PubChem。

ここではPubChemのデータを実際に登録してみる。使用するのはRDKit/Cartridge/PubChemで示した
Compound_000000001_000025000.sdf.gz
である。

データ検索RDKit/Cartridge/PubChem/検索
以前RDKit/Cartridge/登録150426

登録用ツール†

pythonで登録用のスクリプトを作った。
直接postgreSQLにinsertを行うので別途「python-psycopg2」パッケージが必要です。

[root@c ~]# yum install python-psycopg2

っで、スクリプトの中身がこれ。

�����鴻�������������鴻�����������
  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
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
-
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#!/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: PubChemReg.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
  field=[]
  value=[]
  for key in mol.GetPropNames():
    mdlmol = Chem.MolToMolBlock(mol)
    field.append(key)
    if key == "PUBCHEM_COORDINATE_TYPE":
      value.append( "'{"+ mol.GetProp(key).replace('\n',',') + "}'" )
    elif key == "PUBCHEM_NONSTANDARDBOND":
      value.append( "'{\""+ mol.GetProp(key).replace('\n','","') + "\"}'" )
    elif key == "PUBCHEM_BONDANNOTATIONS":
      value.append( "'{\""+ mol.GetProp(key).replace('\n','","') + "\"}'" )
    elif key == "PUBCHEM_COMPOUND_CANONICALIZED":
      if mol.GetProp(key) == 1:
        value.append( 'TRUE')
      else:
        value.append( 'FALSE')
 
    else:
      if bool(re.compile("^[-+]?\d+(\.\d+)?\Z").match( mol.GetProp(key) )):
        value.append( mol.GetProp(key) )
      else:
        value.append( "'" + mol.GetProp(key).replace('\'', '\'\'') + "'" )
 
  sql = "INSERT INTO pubchem(MDLMOL," + ','.join(field) + ") VALUES('" + mdlmol + "'," + ','.join(value) + ")"
  c.execute(sql)
db.commit()
c.close()
db.close()

一応これで登録はできる。
使い方

[root@c ~]# python ./PubChemReg.py Compound_000000001_000025000.sdf
(あるいは)
[root@c ~]# python ./PubChemReg.py Compound_000000001_000025000.sdf.gz

登録途中で、RDKitの規定な原子価と違う構造式があると下記のようなメッセージが最後に表示されます

[23:28:33] Explicit valence for atom # 0 As, 7, is greater than permitted
[23:28:33] ERROR: Could not sanitize molecule ending on line 4065775
[23:28:33] ERROR: Explicit valence for atom # 0 As, 7, is greater than permitted
[23:28:33] Explicit valence for atom # 0 As, 7, is greater than permitted
[23:28:33] ERROR: Could not sanitize molecule ending on line 4065890
 :
 :

テーブルサイズ†

Compound_000000001_000025000.sdf.gz(15MB、展開後117MB、$$$$の件数で23,238件)を取り込んだらテーブルのサイズは下記のようになった

chemdb=> \dti+
                             リレーションの一覧
 スキーマ |     名前     |      型      | 所有者 | テーブル | サイズ | 説明
----------+--------------+--------------+--------+----------+--------+------
 public   | pubchem      | テーブル     | caster |          | 36 MB  |
 public   | pubchem_pkey | インデックス | caster | pubchem  | 528 kB |
(2 行)
 
chemdb=>
chemdb=> select count(*) from pubchem;
 count
-------
 23229
(1 行)
 
chemdb=>

23,229件が登録。8件ほど取り込めなかったみたい。

原子価の変更†

RDKitに規定されている原子価を変更するには、ソースを編集するしかないみたい。
編集対象場所は $RDBASE/Code/GraphMol/atomic_data.cpp である。
Compound_000000001_000025000.sdf.gzの取り込み中に原子価により撥ねられた原子は下記である。

(抜粋)
15      P       0.75    0.89    2.08    30.974  5       31      30.97376163     3       5 \n \
17      Cl      0.99    0.997   1.97    35.453  7       35      34.96885268     1 \n \
35      Br      1.21    1.167   2.1     79.904  7       79      78.9183371      1 \n \
52      Te      1.47    1.378   2.06    127.6   6       130     129.9062244     2 \n \
33      As      1.21    1.2     1.85    74.922  5       75      74.9215965      3       5 \n \

エラーメッセージから各原子の原子価を変更して、再コンパイルしてみる。

[root@c ~]# cd $RDBASE/Code/GraphMol
[root@c GraphMol]#
[root@c GraphMol]# cp -a atomic_data.cpp atomic_data.cpp.orig
[root@c GraphMol]# vi atomic_data.cpp
[root@c GraphMol]# diff -u atomic_data.cpp.orig atomic_data.cpp
--- atomic_data.cpp.orig        2014-12-09 11:27:38.000000000 +0900
+++ atomic_data.cpp     2015-04-29 06:57:32.765411683 +0900
@@ -34,9 +34,9 @@
 12     Mg      1.1     1.36    1.73    24.305  2       24      23.9850417      2 \n \
 13     Al      1.35    1.18    2.05    26.982  3       27      26.98153863     6 \n \
 14     Si      1.2     0.937   2.1     28.086  4       28      27.97692653     4       6 \n \
-15     P       0.75    0.89    2.08    30.974  5       31      30.97376163     3       5 \n \
+15     P       0.75    0.89    2.08    30.974  5       31      30.97376163     3       5       7 \n \
 16     S       1.02    1.04    2       32.067  6       32      31.972071       2       4       6 \n \
-17     Cl      0.99    0.997   1.97    35.453  7       35      34.96885268     1 \n \
+17     Cl      0.99    0.997   1.97    35.453  7       35      34.96885268     1       3       5       7 \n \
 18     Ar      1.57    1.74    1.88    39.948  8       40      39.96238312     0 \n \
 19     K       1.33    2.03    2.75    39.098  1       39      38.96370668     1 \n \
 20     Ca      0.99    1.74    1.973   40.078  2       40      39.96259098     2 \n"
@@ -52,9 +52,9 @@
 30     Zn      1.45    1.25    1.39    65.39   2       64      63.9291422      -1 \n \
 31     Ga      1.22    1.26    1.87    69.723  3       69      68.9255736      3          \n \
 32     Ge      1.17    1.188   1.7     72.61   4       74      73.9211778      4          \n \
-33     As      1.21    1.2     1.85    74.922  5       75      74.9215965      3       5 \n \
+33     As      1.21    1.2     1.85    74.922  5       75      74.9215965      3       5       7 \n \
 34     Se      1.22    1.17    1.9     78.96   6       80      79.9165213      2       4       6 \n \
-35     Br      1.21    1.167   2.1     79.904  7       79      78.9183371      1 \n \
+35     Br      1.21    1.167   2.1     79.904  7       79      78.9183371      1       3       5 \n \
 36     Kr      1.91    1.91    2.02    83.8    8       84      83.911507       0 \n \
 37     Rb      1.47    2.16    1.7     85.468  1       85      84.91178974     1 \n \
 38     Sr      1.12    1.91    1.7     87.62   2       88      87.9056121      2 \n \
@@ -71,7 +71,7 @@
 49     In      1.63    1.44    1.93    114.818 3       115     114.903878      3 \n \
 50     Sn      1.46    1.385   2.17    118.711 4       120     119.9021947     4 \n \
 51     Sb      1.46    1.4     2.2     121.76  5       121     120.9038157     3       5 \n \
-52     Te      1.47    1.378   2.06    127.6   6       130     129.9062244     2 \n \
+52     Te      1.47    1.378   2.06    127.6   6       130     129.9062244     2       6       7 \n \
 53     I       1.4     1.387   2.15    126.904 7       127     126.904473      1       2       5 \n \
 54     Xe      1.98    1.98    2.16    131.29  8       132     131.9041535     0       2 \n \
 55     Cs      1.67    2.35    1.7     132.905 1       133     132.9054519     1 \n \
[root@c GraphMol]#
最新の60件
2026-10-14 2026-10-12 2026-10-08 2026-10-07 2026-10-06 2026-10-05 2026-10-04 2026-10-02 2026-10-01 2026-09-30 2026-09-28 2026-09-27 2026-09-26 2026-09-22 2026-09-17 2026-09-11 2026-09-06 2026-08-31 2026-08-27 2026-08-24 2026-08-20 2026-08-19 2026-08-18 2026-08-17 2026-08-16 2026-08-15 2026-08-13 2026-08-12 2026-08-11 2026-08-09 2026-07-30 2026-07-25 2026-07-24 2026-07-20 2026-07-18 2026-07-17 2026-07-16 2026-07-08 2026-07-06

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-09-25 (日) 11:53:13