<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>GASTON / Drkcore</title><link>http://blog.kzfmix.com/GASTON</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Tue, 12 Jan 2010 10:43:22 +0919</lastBuildDate><item><title>GASTONの出力ファイルをsmilesに変換する</title><link>http://blog.kzfmix.com/entry/1229844675</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1229730069"&gt;SDFからGASTON実行できるようにした&lt;/a&gt;ので、結果を解釈するためにsmilesに変換するコードを用意した。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import re
import openbabel as ob

def convert(gf):
    obc = ob.OBConversion()
    obc.SetOutFormat('smi')
    mol = ob.OBMol()

    for l in gf.split('\n'):
        if len(l) &amp;gt; 0 and l[0] == 'v':
            a = mol.NewAtom()
            atomic_num = int(l.split(' ')[2])
            a.SetAtomicNum(atomic_num)

        elif len(l) &amp;gt; 0 and l[0] == 'e':
            begin_atom_idx = int(l.split(' ')[1]) + 1
            end_atom_idx   = int(l.split(' ')[2]) + 1
            bond_order     = int(l.split(' ')[3])
            b = mol.AddBond(begin_atom_idx, end_atom_idx, bond_order)

        elif len(l) &amp;gt; 0 and l[0] == '#':
            title = l.split(' ')[1]
            mol.SetTitle(title)

    return obc.WriteString(mol)

if __name__ == '__main__':
    txt = open('gaston.out').read()
    p = re.compile('#.+?(?=(#|$))',re.S)
    m = p.finditer(txt)

    for ss in m:
        print convert(ss.group())[:-1]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行結果&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NC  11
NCC 11
NCCC    11
NCC(=C)C    11
NCCC=C  11
NCC(=C)C=C  11
NCCC=CC 11
NCC(=C)C=CC 11
NCC=C   11
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;頻度の高いフラグメントのSMILESと、その分子のIDが出力される&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;それにしてもpythonの正規表現はややこしいなぁと、みんなのpythonを読み返して復習&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/479733665X/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/41%2BgqZ9stAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;みんなのPython&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
柴田 淳 &lt;br /&gt;
ソフトバンククリエイティブ / ￥ 2,940 ()&lt;br /&gt;
&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;正規表現文字列 -&amp;gt; コンパイル -&amp;gt; 正規表現オブジェクト -&amp;gt; マッチ処理 -&amp;gt; マッチオブジェクト&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:43:22 +0919</pubDate><category>chemoinformatics</category><category>Python</category><category>GASTON</category></item><item><title>SDFからGASTON用のファイルを作る</title><link>http://blog.kzfmix.com/entry/1229730069</link><description>&lt;p&gt;&lt;a href="http://homepage3.nifty.com/DO/gspan.pdf"&gt;gSpan&lt;/a&gt;や&lt;a href="http://www.liacs.nl/~snijssen/gaston/index.html"&gt;GASTON&lt;/a&gt;の入力はラベル付きのvertexとedgeなので、openbabelでsdfを読み込んで、GASTONのinputに変換するものを作ってみた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import openbabel as ob

def convert(sdf):
    obc = ob.OBConversion()
    obc.SetInAndOutFormats('sdf','smi')

    mol = ob.OBMol()
    next = obc.ReadFile(mol,sdf)
    molnum = 0
    while next:
        # mol
        print "t # %d" % molnum
        # atom
        for i,atom in enumerate(ob.OBMolAtomIter(mol)): 
            print "v %d %d " % (i,atom.GetAtomicNum())

        # bond
        for i,bond in enumerate(ob.OBMolBondIter(mol)): 
            print "e %d %d %d" % (bond.GetBeginAtomIdx()-1,bond.GetEndAtomIdx()-1,bond.GetBondOrder())

        mol = ob.OBMol()
        next = obc.Read(mol)

        molnum += 1
    return True

if __name__ == "__main__":
    sdffile = 'pubchem_sample.sdf'

    convert(sdffile)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;SDFは&lt;a href="http://www.ncbi.nlm.nih.gov/sites/entrez?db=pccompound&amp;amp;dbfrom=pcassay&amp;amp;cmd=link&amp;amp;linkname=pcassay_pccompound_active&amp;amp;IdsFromResult=889"&gt;pubchem&lt;/a&gt;から適当に選んだがCID: 16757835は外しといた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./gaston 11 pubchem_data pubchem_out
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;GASTONを実行した出力の一部&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# 14
t 163
v 0 6
v 1 6
v 2 1
e 0 1 2
e 1 2 1
# 12
t 164
v 0 6
v 1 6
v 2 1
v 3 1
e 0 1 2
e 0 3 1
e 1 2 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;アロマティックなボンドは3みたいに別のラベルを与える必要がある気はするが、、、&lt;/p&gt;

&lt;p&gt;後は、GASTONの出力ファイルから構造を構築するものを用意すれば、頻出する部分構造を扱えるようになる。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:43:01 +0919</pubDate><category>chemoinformatics</category><category>Python</category><category>openbabel</category><category>GASTON</category></item></channel></rss>