Diels-Alder Reaction (PerlMol)

PerlMolで化学反応のルーチンってどう書けばええの?と聞かれたことはないが、こんな感じで僕は書いてマスヨってことで、ひとつDiels-Alder反応をさせてみる。

dareact

適当に用意したこんな反応だ。

#!/usr/bin/perl

use strict;
use warnings;
use Chemistry::File::SMILES;
use Chemistry::File::SMARTS;
use Chemistry::Ring 'aromatize_mol';

#反応させる基質を用意
my $react1 = Chemistry::Mol->parse('ClC=C dienophile', format => 'smiles');
my $react2 = Chemistry::Mol->parse('OC=C-C=C diene', format => 'smiles');

#dieneとdienophileのパターンをSMARTSで定義
my $dienophile_pat = Chemistry::Pattern->parse("C=C", format => 'smarts');
my $diene_pat = Chemistry::Pattern->parse("C=C-C=C", format => 'smarts');

#まずおまじない
aromatize_mol($react1);
aromatize_mol($react2);

#生成物に名前をつけ,基質をくっつける。
my $name = $react1->name . "+" . $react2->name;
my $prod = Chemistry::Mol->new(name => $name);
$prod->combine($react1, $react2);

#dieneとdienophilieのパターンを探し、みつかったら各オブジェクトにマップ
$dienophile_pat->match($prod);
my @atom_map1 = $dienophile_pat->atom_map;
my @bond_map1 = $dienophile_pat->bond_map;

$diene_pat->match($prod);
my @atom_map2 = $diene_pat->atom_map;
my @bond_map2 = $diene_pat->bond_map;

#反応用の原子が揃っているかチェック
if ($atom_map1[0] && $atom_map1[1] && $atom_map2[0] && $atom_map2[3]) {

#結合の作成
    $prod->new_bond(atoms => [$atom_map1[0], $atom_map2[0]], order => '1');
    $prod->new_bond(atoms => [$atom_map1[1], $atom_map2[3]], order => '1');

#dieneとdienophileの結合次数を変える
    $bond_map1[0]->order(1);
    $bond_map2[0]->order(1);
    $bond_map2[1]->order(2);
    $bond_map2[2]->order(1);

my $smi = $prod->print(format => 'smiles', unique => 1, name => 1);

#SMILESで出力
    print "$smi\n";
}

早速実行してみると、

$dareac.pl 
OC1C=CCCC1Cl    dienophile+diene

jchempaintで確認してみると

daproduct

ちゃんと環まいとるヨ。

さて、スクリプトをくどくどと書いたけど、処理の流れは単純でわかりやすいのですヨ。

  • 基質の用意と反応する部分構造のパターン定義
  • 生成物のオブジェクトを作成し基質を放り込む(combine)
  • パターンマッチさせたら、原子と結合に位置のマップ
  • マップされた結合と原子に対して処理
  • 結合新しく作ったり、切り離したり
  • 原子オブジェクトの削除とか

エッジとノードで表現するせいなんだと思うがマップされた結合と原子に対して処理するルーチンが結構煩雑になり気味で、デバッグは大抵ココに集中したりする。dieneの端っこ結合作ったら、pな軌道が隣り合うから間は二重結合になるだろって思うが $bond_map2[1]->order(2)って明示しないと、ラジカルとして表現されちゃったりとか。sp2,sp3の情報入れとけば自動で判別するようにできるような気がするが難しいのだろうか?

あとは、サンプルなのではしょってますが、この反応ではpara体も生成させることは出来ます。

#結合の作成
    $prod->new_bond(atoms => [$atom_map1[0], $atom_map2[3]], order => '1');
    $prod->new_bond(atoms => [$atom_map1[1], $atom_map2[0]], order => '1');

って書けばpara体出来上がり。

というわけで、普通は二通りの生成物を提示するんだろうけど、

Diels-Alder反応

Diels-Alder付加体の二つの置換基はオルト位/パラ位を占めるように位置選択的に付加することが有機電子論から経験的に予測される(オルト-パラ則)。詳細にはFrontier軌道のローブ係数を求めて比較することで説明がなされる。すなわち、下図のようにHOMO/LUMOの係数が大きい点同士が重なるように付加する。

とあるように、軌道の計算してやればどっちが出来やすいか予測することは可能なので、反応処理ルーチンにPyQuanteみたいな量子化学計算モジュールを組み込んで判断させてやれれば素敵かなぁと思っている。

ケモインフォの日本語書籍

ケモインフォマティクスの日本語の書籍が出ていることを知った。

というかかなり高くないか、コレ。内容どうなんだろう、うーん悩む。中見てからじゃないと手が出しづらいなぁ。

で、2005/02にでてるのに、ケモインフォマティックスとかchemoinfomatics とか書いてあるから、今まで検索してもヒットしなかったのね。

ざっと調べたらこんな感じでしたぞ(by google)

  • cheminformatics : 216000
  • chemoinformatics :144000
  • cheminfomatics : 259
  • chemoinfomatics : 216

僕はケモ派だヨ。

Iterator::Utilをつかってみた ( デザパタPerl )

イテレータのサンプルを実際にIterator::Utilモジュール使って書いてみたゾ。

今回、用意したのはBook,BookShelf,mainだ。インターフェースにあたる部分は省略ってことで。

Bookはサンプルのコードをそのまま使用してます。 BookShelfはbooksメソッドで配列返すようにしといた。

package BookShelf;
use strict;

sub new {
    my $class = shift;
    my $self = {};
    $self->{maxsize} = shift;
    $self->{books} = [];
    $self->{last} = 0;
    bless $self, $class;
}

sub appendbook {
    my $self = shift;
    my $book = shift;
    $self->{books}->[$self->{last}] = $book;
    $self->{last}++;
}

sub books {
    my $self = shift;
    $self->{books};
}

1;

mainでIterator::Utilを呼ぶ。

!/usr/bin/perl

use strict; use BookShelf; use Book; use Iterator::Util;

my $bookshelf = BookShelf->new(5); $bookshelf->appendbook(Book->new('Java言語で学ぶデザインパターン入門')); $bookshelf->appendbook(Book->new('憂鬱なプログラマのためのオブジェクト指向開発講座')); $bookshelf->appendbook(Book->new('かんたんUML')); $bookshelf->appendbook(Book->new('プログラミングPerl')); $bookshelf->appendbook(Book->new('オブジェクト指向Perlマスターコース'));

my $it = iarray ($bookshelf->books);

while (my $book = $it->value) { print $book->getname."n"; }

実行結果はこんな感じ。最後のIterator is exhaustedがちょっと気持ち悪い。

$ perl main.pl 
Java言語で学ぶデザインパターン入門
憂鬱なプログラマのためのオブジェクト指向開発講座
かんたんUML
プログラミングPerl
オブジェクト指向Perlマスターコース
Iterator is exhausted at main.pl line 18

増補改訂版Java言語で学ぶデザインパターン入門あなたの考えを広げるためのヒント(ここがおもろい)には、

実装とは切り離して数え上げできることが重要

とか書いてあるので、まぁ、これでいいのかな。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


subclipse

株ロボのためにEclipseの勉強を始めたヨ。 手始めに、Eclipseでsubversionを扱うためにsubclipseをインストール。

EclipseWikiSubclipseプラグイン をみながら導入作業。

更新マネージャーから更新すればいいのでラク。ちなみにsubversionは構築済み

trac

プロジェクトマネージメントネタも結構気にはなっていて、っていうか重要でしょう。まぁ基本的にSECIモデルとか大好きなので。

MSのプロジェクトは少しいじってたけど、ダサい。そもそもマネジメントするためのツールだから、テックも含めた(マネジメントの)共有とかできないし、webクライアントとか貧弱すぎ。トップダウンで工程管理するのには向いてんのかも知れないけど、その場その場で意思決定を迫られつつ、現場との対話を汲み取ってダイナミックに方針を調整する実験系の入るプロジェクトに使うのには無理があるんでないかと。実際こういうプロジェクトにはめてみるといつまでに誰が何をやります的な議事録的な予定表にしかならんよ。

そういうわけなんで、チームの意識のコンセンサスをとるというか、問題の共有化を効率的に進めるなにかがずっと欲しくていろいろ探してはいます。ちょっとよさげなものとしてphpcollab触ってみたけど日本語化がうーん、、、、もう少し待とうかな。

で、tracなど惹かれています。そもそも実験系だとデータの一元化に注意を払うやつは少ないし、subversionなんか使ってみようかなと常々考えていたのでレポジトリのビューワーのあるtracはよいんではないかと。で、実験系の変更、追加なんてほとんとバグつぶしと一緒でしょみたいな印象があるのでバグトラッキングシステムにのっければいいのかななんて思っている。

Iterator ( デザパタPerl )

Perlの例だとインターフェースのクラスをdieしているので、最初これはどういう意味があるのかわかんなかったが、

naoyaのはてなダイアリー - prototype.js でデザインパターン - Iterator

デザパタ本のコードでは Java の interface をまず用意して、となるのですが例によって JavaScript は動的な言語かつ型がないのでサブクラスに実装を強制させるメカニズムがない。ということで、ここでは interface に相当するものは用意せずに Concrete クラスだけで実装します。

と書いてあったのを見てサブクラスで実装されてない場合によばれた場合のためのちょっとした仕組みなのだとわかった(あがきにちかいような気もするが)。で、試しにjavaで実際にインターフェースを実装してるクラスのメソッド名変えてみたらコンパイルできなかったし、をを~、javaのインターフェースって束縛としては便利だよなと思ったり。言語の違いってなかなかおもろいなぁと感じた瞬間だったり。

あと、こういうやり方もあるらしい。

オブジェクトをハッシュデータ構造と透過に扱う際に、tie ハッシュのインターフェースで NEXTKEY() というメソッドを実装しますが、これがまさに iterator なので、

って部分がイマイチ飲み込めなったので、実用PerlプログラミングのTieのとこと型グロブの章をよく読んでなんとなく理解した。(理解した気になった?)

ProductName 実用Perlプログラミング
スリラム スリニバサン
オライリー・ジャパン / ?円 ( 1998-11 )


で、CPANもいくらか調べてみたところ、Iterator::Utilというのがよさげなのかな?この場合はiappendを使えばいいのかな?

明日コードを書いてみよう。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


Chemrubyで構造描画 PNGに出力だ!

Chemruby web site初心者てのが出来てたので、初心者らしくRMagickを使ったテストをしてみたぞ。

をを~ pngで出力されるようになっとる !

早速、視覚化のサンプルもpngで落としてみることに

require 'RMagick' require 'chem' mol = Chem.open_mol("mol/C00019.mol") query = Chem.open_mol("mol/C00147.mol") m = mol.match_by_ullmann(query) matched_nodes = m.inject([]){|ret, i| ret.push(mol.nodes[i])} mol.edges.each do |bond, atom1, atom2| bond.color = [1, 0, 0] if matched_nodes.include?(atom1) and matched_nodes.include?(atom2) end mol.nodes.each{|node| node.visible = true unless node.element == :C} mol.save("chemrubytest.png") mol.save("chemrubytest.pdf")

でてきたpngはこれだ。

result

まだ、色はつかないのね。と、描画位置のバランスと、フォントの大きさとかちょっと気になる。結局そういうのは地道に綺麗にしていくだけなんで、個人的には大して気にならないが、最終的にはCDKよりは綺麗な絵が出力されるようになることを期待しますヨ。

あとsdf2png欲しい。まぁこれは自分で書けばいいのだが。よし、rubyの勉強も兼ねて書いてみよう。

支那そば家 毎度!で潮ラーメン

にんともかんとも駐車場がわかりにくいので、ちょっとはずれの有料駐車場に停めてしまうが、二度目なのに毎度な支那そば家にいってきたヨ。

毎度 毎度

塩な潮を注文。定休日が月火になったのと一部メニューの値段が変更で肩ロースのチャーシューが一枚100円に替わってた。

潮

麺は旨い。が、潮味よりも醤油のほうが好きかも。塩だとちょっとインパクト薄めになっちゃうかも。

あの麺を、せいろみたいに、醤油味のスープで蕎麦みたいにすすったらうまいかな

ささやかすぎる願望だヨ。

支那そば家

ChemDB

ChemDBはDBMSにポスグレつかってるらしい。他のDBとの比較があったので眺めたが、アノテーションの多さが売りのデータベースって感じかな。

ちなみに、マシンラーニング用のデータセット が遊ぶにはいい感じ。なんかいい記述子発生ソフトとかあればR使っていじってみたいところだが、オープンソースのdescriptorプロジェクトってあんのかな?ないのかな?サブストラクチャーベースのヤツだったらありそうな気もするけど。

あと、ChemDBで使われているOEChemのpythonライブラリが非常に気になったりしたヨ。そしてChEBIにはChemAxonの影が。

気になるといえば、第3回オープンバイオ研究会「ビジュアライズの技法」というパネルセッションも気になる(さすがにいけないけど)。スライドとか公開されんのかな?

16174682 16381955 15608238 16381840

Rの基本パッケージ中の古典的検定関数一覧

RjpWikiRの基本パッケージ中の古典的検定関数一覧ってのができてて、しかもそれぞれに簡単な説明とRのサンプルが超訳として書かれてるので便利。

あとで、全部トレースしておこう。

© kzfm 2003-2021