化合物の最適化のグラフ表現

化合物の最適化の過程というもをグラフ表現にしてとっておけば、あとあと色々と使いまわせていいんじゃないかと思っている。

で、エッヂは化合物でいいとして、ノードは有向グラフで表したいが、部分構造を内包するかどうかで親子関係を決めるのがいいのか、それとも、時系列で古いほうを親にするのがいいのかそれとももっといいやり方があるのか悩ましい。

可視化は、Cytoscapeが丁度よさそうだったんだけど、Python から Graphviz を使うを見て、NetworkXというものがあるのを知った。

matplotlibで綺麗に出力できるし、これはなかなか楽しそうだ。

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++にやられっぱなしでそれどころじゃないのであった。

pythonのenumerate

enumerateなんて知らんかった

>>> for i in enumerate(range(5,10)):
...   print i
...
(0, 5)
(1, 6)
(2, 7)
(3, 8)
(4, 9)

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反応ぐらいまで書けるようにするとこまではとっととやる。

py.testを試している

ここ数日unittest使ってみたんだけどなんかちょっと窮屈な感じがするのでもうちょっと楽にテストを書きたいなぁと思った。それから、自分ひとりで開発するときにはなんか変更を加えたタイミングでテストを走らせたいし、出来れば勝手に走るとうれしい。

そんな感じのテストのフレームワークはないかと探したところ、py.testにたどり着いた。ほぼ日本語化されたマニュアルもあった。

使い方は、例えばmodule.pyとtest_module.pyっていうファイルを作って

pytest -vf

と-fオプションをつけるとコマンドを実行したディレクトリを監視するようになって、ファイルが更新されるたびにテストが走るようになる(vは冗長モード)。

doctestもサポートしているらしいのでこれもあとで試してみる。

Paste = Pythonのmodule-starterみたいなもん

Python版のmodule-starterみたいなもんはないのかなとつぶやいたらPasteが使えることを教えてもらった。ありがとうございます。

しかしよりによってPasteがこんな風に使えるとは。

paster create -t pylons helloworld

pylonの組み込みコマンドの癖に-t pylonsってなんじゃそらとか思ってたのだけど実は組み込みコマンドじゃなかったという。

Pasteの使い方は

paster create mymodule

で対話的に入力していって答え終わると雛形完成。でディレクトリに移って

hg init
hg add
hg commit

までやるとあら不思議、分散リポジトリに管理されたPythonのモジュールスケルトンが数分で出来あがり。

ここまでやると、開発、実行(テスト)、リポジトリの管理がMeadowで全部出来るので楽チン。

あとsetuptoolsとか覚える

Pybelのペーパーが出てた

なかなか面白い内容だった。

Pybel: a Python wrapper for the OpenBabel cheminformatics toolkit

Pybelボンドとか扱えないような感じなんで、ちょっと複雑なことやろうとすると結局Openbabelのインターフェースからアクセスしちゃうんだよなー。OpenBabelのラッパーとしてPerlMolみたいなの書けばいいんだろうけど。

とか思いながら、OpenBabelのAPIなどみてたら、PerlMolと同等なものを書けそうな気がしてきたので少しやってみることにする。

pydevcamp08w終了

初めてpydevcampに参加したわけですが充実した三日間でした。幹事とセッションリーダーの皆様ありがとうございました。

さて、今回はユニットテストの話とかNodeBoxとか(mac持ってないけど)pylonsとか面白そうな話題が目白押しで色々目移りしたのだけど、電子工作力を強化してきた。

帰りの電車の中でpylonsまわりをいじってみたのだけどAuthKitのあたりがちょっと理解できなかったので、もうちょっとpylons力も強めないとなと思った次第。というか何か作ろう。あとpylonsのMLもできたナイス即参加。

あとは、折角参加するんだったら、なんか発表しないとだめだなぁと。次回はLTでなんか話す気概で臨む。

電子工作のセッション

Gainerというキットとpythonを使うと、信号を受け取ったり信号を外に送ったりとコンピュタの中だけで閉じるのではなく、現実世界へ干渉するということがおこなえると。 フィジカル・コンピューティングというらしいですが、これがわりとお手軽に出来てしまうので驚きですな。

初日はgainerに慣れるということで、LEDを光らせたりとかコードを読んだりとか何をやっているのかを知るのに時間がかかった。

こんな感じでLEDが交互に光るだけでかなり嬉しい。

出力に慣れたら今度は入力を受け取ってみる。センサとしてヴォリュームをつないで抵抗値を変えたりしてみた後は、みんな大好きな?加速度センサーをつないでみる。結構簡単な回路でOK。下のほうにちょこんと刺さっている黒い物体が加速度センサ(小さい)。

1205070143

ぶんぶん振ると、それに応じて入力が変わる。撮りかたが悪いので数字が分からないけど。

これだと、あまり面白くないのでpygameを使って、グラフィカルな表現にしてみる。

1205070128

x,y,zの傾きに応じて四角がそれぞれ動きます。おーすげー。

ここまでくるとあとは思い思いに好きなものをつくりはじめていきます。なんという集中力!ってな感じで黙々と作業。

隣のヒトのブロック崩し。傾きでブロックを打ち返すヤツを制御してる。楽しそう!。

えと、僕は傾きに応じて円の大きさや色を変えて、偽アートっぽいことをしてみたのだけど、うっかりとるのを忘れたので手元に動画がない、という。もう少し綺麗なのを作ったらアップしよう。

あと、リアルチョロQリモート操作がすごかった。電子工作2.0!

さらに、これいじると大空へ羽ばたけるかな?マイハンダごてとか欲しくなりますなー。

ProductName エアロソアラ タトアージュレッド(Bバンド)

タカラトミー / ¥ 2,625 (2006-07-15)


ビジュアル系だとNodeBox on jythonが立ち上がってるし、jythonからprocessing呼ぶっていう手もあるかなーと(それだったら最初からprocessingでって突っ込みは無しで)。

ProductName Built with Processing [改訂版]
前川 峻志,田中 孝太郎
ビー・エヌ・エヌ新社 / ¥ 3,570 ()


Built with Processing [改訂版] も出るらしいのでちょっとアツイかもしれませんな。

いろいろと刺激を受けた三日間だった

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みたいなメソッドがないので反応させるところで悩み中。