12012010 chemoinformatics perl R bioinformatics Python
perl,python,Rでオームな解析をするための本。ツールやデータベースの説明が主なので、ハウツーな感じではなくて、インフォマティクス側からみたバイオロジーとかケミストリーのサービスとかツールのレビューに近い感じかも。
個人的には5章のケモインフォのとこと、9章のRの章が面白かった。
12012010 chemoinformatics perl R bioinformatics Python
perl,python,Rでオームな解析をするための本。ツールやデータベースの説明が主なので、ハウツーな感じではなくて、インフォマティクス側からみたバイオロジーとかケミストリーのサービスとかツールのレビューに近い感じかも。
個人的には5章のケモインフォのとこと、9章のRの章が面白かった。
12012010 chemoinformatics Python GASTON
SDFからGASTON実行できるようにしたので、結果を解釈するためにsmilesに変換するコードを用意した。
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) > 0 and l[0] == 'v':
a = mol.NewAtom()
atomic_num = int(l.split(' ')[2])
a.SetAtomicNum(atomic_num)
elif len(l) > 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) > 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]
実行結果
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
頻度の高いフラグメントのSMILESと、その分子のIDが出力される
それにしてもpythonの正規表現はややこしいなぁと、みんなのpythonを読み返して復習
正規表現文字列 -> コンパイル -> 正規表現オブジェクト -> マッチ処理 -> マッチオブジェクト
12012010 chemoinformatics Python openbabel GASTON
gSpanやGASTONの入力はラベル付きのvertexとedgeなので、openbabelでsdfを読み込んで、GASTONのinputに変換するものを作ってみた。
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)
SDFはpubchemから適当に選んだがCID: 16757835は外しといた。
./gaston 11 pubchem_data pubchem_out
GASTONを実行した出力の一部
# 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
アロマティックなボンドは3みたいに別のラベルを与える必要がある気はするが、、、
後は、GASTONの出力ファイルから構造を構築するものを用意すれば、頻出する部分構造を扱えるようになる。
Inline::Pythonのバージョンがあがったのでmacbookに入れて遊んでみた。
generatorが使いたかったのだけど、nextを呼ぼうとすると
Can't call method "next" without a package or object reference at test.pl line 3.
と怒られてしまうのであった。
12012010 chemoinformatics Python
今度の発表の掴みを考えてみた。
htsはアッセイという関数を引数にとりコンパウンドリストを返す高階関数と考えることができる。
def hts(assay,library):
criteria = 50 # %inh
return [c for c in library if assay(c) > criteria]
うーん、マニアすぎるか
def chemist(comp):
return modify_compound(c)
これまたあれだな。
12012010 chemoinformatics Python
おー、このタイムライン分かりやすい。
インフラとしてはディスクリプターをどう発生させとくか(毎度毎度モデル構築のたびに発生させるのはだるいし、基本的に一回作っとけば良いのでコンパウンドをどっかに登録するタイミングでバックグラウンドでやればいい仕事)とデータへのアクセス方法(いまはRESTっぽいのがいいんじゃないかと思ってる)をきちんとやっておけば、僕らはモデル構築の試行錯誤にそのリソースのほとんどを投入できていいよね。
あと、こういう状況だと、モデル構築能力的には常に最先端のアプローチを試せるような状況にしとかないとまずいから、自然とデフォルトの環境がRになるような気がするし、立ち位置もデータマイニング寄りになると思うんだよね。
そして、立ち位置がマイニング寄りになっちゃうと、ケモインフォマティクスとかバイオインフォマティクスってのは、新しいモデル化の方法を試すための一つのターゲットに過ぎなくて、プロジェクトのモデル化とか創薬ビジネスモデル構築とかのほうに興味が移っちゃうのだよなぁ。
12012010 Python
僕は最近プログラミングのセミナーよくいくんですよねー(楽しいし)的な話をしていて、pythonも関西のほうで時々集まりがあるらしいですよ。とか話したんだけど、どこでみかけたのか思い出せなかった。
僕も職場ではpython比率が高まっているのだけど、最近はpythonでさくさく書けるようになってきたので、そろそろgaucheあたりに移行しようかと。
openbabelのバインディングでも書いてみたい。そして、schemeでchemoinformaticsとか言ってみたい気もする。というか、なんかのSARモデルを構築したと仮定して、そのモデルを満たすような化合物をヒューリスティックに探索するとかいう場合に継続を使うと面白そうな気がするのだ。
12012010 Python
import thisとやるとThe Zen of Pythonがずらずらっと表示されるわけだけど、ソースのぞいたらカエサル暗号が施されていた。
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)
print "".join([d.get(c, c) for c in s])
"Abj vf orggre guna arire."
12012010 Python
どっちを使うのが良いのかわからんが、とりあえず気になったので調べてみた。というより、pythonの標準モジュールのソースを読むのは初めてじゃなかろうか、、、
commands.getoutputは結局下と同じらしい。
pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
text = pipe.read()
sts = pipe.close()
ということは標準エラー出力も補足するのか。
標準モジュールのソースを読むのも楽しいかも