ExactMassを求める

そういえば多数の化合物からなるsdfからExactMassってどうやって計算したらいいのかね?と尋ねられて、

うーんそれはね、perlでChemistry::OpenBabelモジュールを使ってだなぁ、ごにょごにょとやればいいんだよ、ほら楽勝だろ。

とか言ってみたんだけど、別にpythonでもいいので書いてみた。

import openbabel as ob

obconv = ob.OBConversion()
obconv.SetInFormat("sdf");
obmol = ob.OBMol()

notatend = obconv.ReadFile(obmol, "test.sdf");
while notatend:
    print obmol.GetExactMass()
    obmol = ob.OBMol()
    notatend = obconv.Read(obmol)

たぶんPlutoだったら

from pluto import *

for mol in Molecule.readfile("test.sdf"):
    print mol.ExactMass

と書けるようになるはず。

でも今夜はOBChemTsfmとかいうクラスがねーとかいう謎の深みにはまりかけ、SWIGやらC++にやられっぱなしでそれどころじゃないのであった。

plutoで結合をいじくる

こんな感じで。 titleとかはmol.title("newtitle")にしたほうがいいのかこのままでいいのか決めかねているのでそのうちちゃんと考える。

エタンをエチレンに変えてみた

>>> from pluto import *
>>> mol = Molecule.readstring("CC\tethane")
>>> mol.bond([1,2]).order(2)
>>> mol.title = "ethylene"
>>> mol.writestring()
'C=C\tethylene\n'

あとはmolecule同士のの結合とatomの追加と削除を実装すればよさそう

Pluto : Python module for chemoinformatics

PythonでもPerlMolみたいに化学反応を手軽に扱えるツールが欲しいなぁという欲求があったので書いてみることにした。PybelみたいなOpenBabelのラッパーだけど。

そういえば、PyMOLPyChemという、それっぽい名前は既に使われてるんですよな。

で、アトムにちなんでみた。

ProductName PLUTO (1) (ビッグコミックス)
浦沢 直樹
小学館 / ¥ 550 ()
在庫あり。

でも、国内しかわからなんだろうな。海外だとastro boyなんでしょ?まぁいいや。

>>> from pluto import *
>>> mol = Molecule.readstring("c1ccccc1O")
>>> mol.title = "phenol"
>>> mol.writestring()
'c1c(cccc1)O\tphenol\n'

とりあえず、readとwriteまではできた。SMARTSのクラスも作ってあるのだけどアトムばっか返ってきてボンドの返し方がよく分からん。

diels-alder反応ぐらいまで書けるようにするとこまではとっととやる。

plutoでExactMass,分子量,化学式

というわけで、分子量とかformulaとか出せるようにしておいた。

CCC       propane
CC        ethane
c1ccccc1  benzene
CO        methanol

というsmilesを

babel -ismi test.smi -osdf testsdf

で変換したファイルを使った。ExactMassを計算する場合は

>>> from pluto import *
>>> mols = Molecule.readfile("test.sdf")
>>> for mol in mols:
...   print mol.exactmass
...
44.062600256
30.046950192
78.046950192
32.026214748

ついでに分子量と化学式も

>>> from pluto import *
>>> mols = Molecule.readfile("test.sdf")
>>> for mol in mols:
...   print mol.formula, mol.molwt
...
C3H8 44.09562
C2H6 30.06904
C6H6 78.11184
CH4O 32.04186

openbabelにはPerlMolでいうところのcombineみたいなメソッドがないので反応させるところで悩み中。

Open Babel 2.2.0をmacbookにインストール

Open Babel 2.2.0にバージョンがあがったのでインストールをした。ソースから。

同時に、perl,python,rubyのバインディングもコンパイルしてインストールしておく。

WindowsにおいてあるPlutoのファイル群を持ってくる

Windowsで開発しているPlutoをmacでもいじれるようにする。windowsのほうはhg serveと打てばhttpサーバーが立ち上がり、port8000番でアクセスできるようになる。

macのほうはディレクトリを作って初期化してpullしてupdate

mkdir Pluto
cd Pluto
hg init
hg pull http://192.168.XXX.XXX:8000/
hg update

これでOK