TMACCという記述子

新しい記述子発生ソフトをGPLで使えることを知った。TMACCというそうだ。むーjavaか~とか言わないで、週末にでも実際に動かしてみる。そしてそのうちperlから呼べるように変える。実際、CDKが一番盛り上がってる感じだから、追っかけないとあかんなぁ。と同時に、オープンな記述子発生ソフトは貴重というか、増えてくると色々できて面白い。

Topological MAximum Cross-Correlation

論文によると解釈可能なcorrelation descriptorだそう。

  • positive,negativeのチャージのプロパティを正負二つの特性として分けて考えるよ
  • autocorrelationだけじゃなくてcross-correlationも考慮するよ。pos-posだけじゃなくて、pos-negative logSみたいな
  • sum()は評価しないで、GRINDのように、最大値max()をとるよ

三番目の理由により、記述子とその位置が対応するので、どのアトムのどういうプロパティが重要かっていう解釈が可能。つまりMACCだとそういうことができて、CoMFAなノリ(はGRIND)でなくてトポロジカルな勢いで記述子作ってみたよってのがTMACC

という流れなので、モデル構築は普通にPLS

比較対照はHQSAR。これはなんかdayrightのハッシュっぽいやり方。GRIND,HQSARは下のURLを参照 http://chem.clubsse.com/Tripos/Tech/QSAR/Almond/Product.html http://chem.clubsse.com/Tripos/Tech/QSAR/HQSAR/product.html

HQSARみたいに部分構造から記述子つくるんだったらベイズみたいなほうが精度が上がるような気がするんだけど。という風に考えれば、TMACCを使ってベイズでモデル構築してもいいかもしんない。

TMACC-PLSで重要そうな原子をピックアップしてから、ファーマコフォアモデルを作成するっていう流れでもいいかもな感じだけどこれはトレーニングセット次第の気がする。

ちなみに、僕は解釈できる記述子信奉派です。よくわからない謎記述子は、仮に重要なファクターだって示唆されても、じゃぁどこをどういじればよさげな方向にいくのさ?て悩んで終わるだけだし。

planetにfaviconを表示させてみる

外部リンクにFaviconを表示するjavascript | caramel*vanillaを参考にPlanet Chemoinformaticsで購読しているフィードのfaviconを表示するようにしてみた。

favicon

実験ノート電子化ってみんな考えるのね

オープンソースで、blogカスタマイズしてラボノートっぽくするのはおもろいかもーと思う。

僕も、暗黙知を共有するというあたりに興味があって、イントラブログとかの流れで僕もあれやこれやと試したことがある。実験的というかお遊びというか、ほとんどぽしゃってるけど。

断片はここら辺に。

s2k's eye 2nd Ed.

以前に誰かが同じ実験をしていたとしても、それを紙ベースの記録から探し出すのは大変な作業です。そうこうしているうちに、実は同じ失敗実験を何人もの人が繰り返している…なんてことも実際にはあるようです。

こういうノウハウ共有化っぽいものは、pukiwikiなんかを使ってマニュアルにノウハウを加えていって充実させたりするくらいでも結構効果がある。pukiwikiを4年くらい使っているが、それのおかげで生産性はかなりあがった(というかヒトの転職に対してロバストになってる)のは実感している。ノウハウがヒト依存から組織依存になったっていうか。

s2k's eye 2nd Ed.: 実験ノート電子化考

ブログシステムの重要な利点に、トラックバックシステムがあります。ある実験が別の実験を参考にしていたり、また多くの実験はそれ単独ではなく連続したステップの一つになっています。それらを有機的に相互リンクで結びつけるのに、トラックバックは最適です。

トラックバックは、トラックバックする相手を探さないといけないのでユーザーに処理させると結構面倒くさがる。WikiNameとかはてなキーワードみたいに単語に反応して勝手にリンクが張られるか、規約の中に押し込んで、実験者が意識しなくてもつながるような仕組みにしたほうが良い気がしてる。知らないヒトにトラックバックの意義とかをきちんと説明するのは意外に難しい。

その当時学んだことは、

  • ラボのレポーティングの単位がもっとマイクロコンテンツにならないと駄目っぽい
  • リテラシーの一番低いところにあわせてUIを考えないといけないので結構厳しそう(費用対効果が見合わんしwebブラウザの表現力が、、、、)
  • プリントアウトしたがるから、そういった部分のケアが必須だし、既存の出力のサポートは必須
  • エトセトラエトセトラ

まずはリテラシをあげるのが先かなとか思ってるが、ここら辺はツールが先でもヒトの意識が先でもどっちでもいいんでしょうね。種だけまいとけば。

バイオプログラミング―バイオインフォマティクス演習

bioinformatics,chemoinfomaticsのあれこれをc++で解説してある本。でも、解説は少なめ、ソースコードまんまのせすぎめ。写経にはちょうどいいので、今は夜な夜な写経してる。

分かりやすく言うとソースコード集。もっと分かりやすく言うとビッグワンガム

  • ソースコード:プラモ
  • 本文+注釈:申し訳程度のガム

と考えればよいかと。

どっちかというとクックブック的な構成なのだけど、Makefileが全章分まとめて作ってあるのはいただけない。項目ごとに個別のコードを動かしたいときにはMakefileを書き直す必要があるし、章ごとに完結していないので使いづらい。さらに、ソースコードはオーム社のページからダウンロードできますと書いてあるのに関わらず、本の記載にはない変更箇所がちょこちょことが見受けられたりして紛らわしい。(あとはアーカイブにスワップファイルが含まれてたりとか)

読む本としてみた場合に、全体的にちぐはぐ感があるのは、まずコードありきで、執筆の為に本文適当にでっち上げたからなんでしょうなぁ、などと邪推してみたり。擬似コードなどでアルゴリズムの概要を示したりとか、解説しているコードの場所をきちんと明示するようにして欲しかった。

だから、対象読者も初学者とか、情報系でバイオインフォに興味があるというヒトではなくて、本に載ってるようなツールを既に使っていて中身がどうなってんのか知りたいとか、LLで遅い部分を速くするためにcとかc++で書き直したいナァと考えているヒトが対象でないかと。(かなりニッチな気が)
まぁ、本書の「はじめに」にソースコードをじっくり読んで欲しいって書いてあるし。

読む本としては、読みづらいところが多いが、C++でバイオインフォ、ケモインフォのコードを解説している本はあまり見かけないので貴重だし、僕はSWIG使ってPerlから使えるようにしたかったのでjavaでなくC++の本を探していたために★x4.5ぐらいの満足度。使いたいヒトというよりは作りたいヒト向けの書籍だ。

で、正月休みを利用して、C++入門と適当な入門書を本屋で購入して一通り読んでから、写経を始めてるが、結構楽しい。

smi2pngの幅と高さを指定できるようにした

高さとか幅とか指定して画像に出力するように、コマンドを書いた。というわけで、これよりは使いやすくなった。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/perl

use strict;
use warnings;
use CDK::Smi2Png;
use Getopt::Long;

my $width = 300;
my $height = 300;
my $output = "output.png";

my $result = GetOptions(
                        "width=i" => \$width,
                        "height=i" => \$height,
                        "output=s" => \$output,
);

sub usage
{
  print <<EOF;
usage:

smi2png [-w <width>] [-h <height>] [-o <output>] <SMILES>

  -w, --width             width of output
  -h, --height            height of output
  -o, --output            output PNG file name

EOF
print "\n";
exit;
}

my $smi = shift || usage();

$smi = (split(/\t/, $smi))[0];

my $smic = CDK::Smi2Png->new();
$smic->writePNG($smi,$width,$height,$output);

使い方は、

smi2png -w 200 -h 200 -o thiophene.png "C1=CSC=C1"

とか。

あとは、ベンゼン環をチオフェンに変換するようなモジュールをChemichoに追加した。

benzene

これで、6員環が生物学的等価体の5員環に置換されるようになった。

thiophene

chemicho2png

chemichoの出力をpngにしたのでPioglitazone で試してみた。

設定はこんな感じで。

Generation: 10
Cycle: 1
Prefix: Piogli

Plugins:
  - module: AddCarbon
    weight: 1
  - module: Aromatize
    weight: 0.8
  - module: Bulky
    weight: 1
  - module: DeAromatize
    weight: 0.2
  - module: DecreaseBondOrder
    weight: 1
  - module: GenerateRing
    weight: 0.5
  - module: Halogenize
    weight: 1
  - module: Hydroxylation
    weight: 2
  - module: HeteroCyclization
    weight: 2
  - module: IncreaseBondOrder
    weight: 2
  - module: IntroduceAcid
    weight: 1

6番目の出力から10番目の出力はこんな感じ。

piogli5 piogli6

piogli7 piogli8

piogli9 piogli10

あんまバルキーな変異はよくないな。もうちょいヘテロを導入したりとか、ヘテロ原子増やさずに自由度を減らすような変異をいれたほうがいいかも。芳香環を壊しちゃうのも気になるナァ。

ポスター出します

またもや、個人的ネタで恐縮ですが、今週末のスポッポファイアーのユーザー会でポスター出します(多分)。

しかも名前だけで発表はしないでうろうろします。単なる質問要員としてノミネート。

発表自体は、ITインフラ系構築ネタになる予定。明日から2人で作り始めます。Ajaxとかバリバリ取り入れてるので、そこらへんの話になるかなぁ。か、いわゆる(インフォマティクス的に)テックレイヤーの人達に如何にデータトラッキングの重要性とか、一元管理を浸透させたかとかそういう苦労話メインになるかなぁ。明日、オーバービュー書きながらどっちに転ぶか決めまする。

ホントは、スポッポファイア meets Ajaxとかいうネタがやれればよかったんだけど、手動かす暇なくて。僕の頭の中で腐りかけてル。

gSpan

テキストいじったり、化合物検索したりとグラフ構造いじることが多いのでgSpan をちゃんと覚えようと。

gspan-del.icio.us

DFS-CODEとか枝刈りのあたりとか断片的には理解できるけど、全体としてイメージできてないな。

ちゃんと理解するために、あとでperlで書いてみよう。で、 Chemruby使ってこんなこともやれるみたいなので、同じことをPerlMol使ってできないかなとか思った。gSpanPPで。

MT距離ってのがいまいちつかめてない

CRANのNewsletterが更新されていたので、一昨日の帰りの新幹線の中で読んでたら、fingerprintっていうパッケージが追加されてた。

CRAN - Package fingerprint

This package contains functions to manipulate binary fingerprints of arbitrary length. A fingerprint is represented by an object of S4 class 'fingerprint' which is internally represented a vector of integers, such that each element represents the position in the fingerprint that is set to 1. The bitwise logical functions in R are overridden so that they can be used directly with 'fingerprint' objects. Distances metrics are also available. Fingerprints can be converted to Euclidean vectors (i.e., points on the unit hypersphere)i and can also be folded using XOR. Arbitrary fingerprint formats can be handled via line handlers. Currently handlers are provided for CDK, MOE and BCI fingerprint data.

CDKとかMOE,BCI用のハンドラがついてるようです。で、Similarity metricは何使えんのかな?とマニュアル読んでみると、

  • tanimoto
  • euclidean
  • mt
  • dice

の4つ。このなかで、MT係数って聞いたことないナァ。ちょっと調べてみたけどわからなかったので直接ソースを読んでみることにした。はじめてのパッケージイントロスペクション。

で読んでみたら、あー、Rのパッケージ読むの単なる食わず嫌いだったかも。思ったよりややこしいことはしてませんな、これからは積極的に読んだほうがいいかもと思った。

というわけで、ちょっとまとめておいた。前提としてフィンガープリントの共通のビットが立つかどうかを下の表であらわしておく。

fp1 bitありfp1 bitなし
fp2 bitありCB
fp2 bitなしAD

tanimoto

まずはわかりやすいタニモト係数から。

 dist <- c / (a+b+c)

dは考慮されない、つまりビットの立たないもの同士は類似とみなされない。

euclidean

dist <- sqrt((d+c) / (a+b+c+d))

ユークリッド距離はお互いビットが立ってないという情報も似ていると判断されるわけですな。

dice

dist <- c / (.5*a + .5*b + c)

diceの距離も基本的にはタニモトと一緒。僕はあまり使わない。

mt

size <- length(fp1)

t1 <- c/(size-d)
t0 <- d/(size-c)
phat <- ((size-d) + c)/(2*size)
dist <- (2-phat)*t1/3 + (1+phat)*t0/3

t1はc/(a+b+c)、t0はd/(a+b+d)とかける。phatは全フィンガープリントでのビットの立っている割合(ビットの密度)。ビットの密度を考慮してるのはわかったんだが、t1,t0の分母の意味がちょっと理解できてないかも(aとbの情報を考慮してんだろうな)。おそらくビットの密度に偏りがある場合にできるだけ補正できるような距離なのかなとか思った。タニモトにビットが立たない場合の情報の扱いを加えた感じか。

と、ここまで考えてやっと気付いた。

MTってもしかしてModified Tanimoto?

ビンゴだった。

chemicho

昔作ったコードが気に入らなかったので書き直したら、そこそこ動くようになったので、Chemicho-0.01.tar.gzとしてダウンロードできるようにしておいた。これはPerlMolを使って実装された化合物にランダムに変異を入れていくツールで、例えば、H2Lでヒット化合物に修飾を軽く加えてみたりとかしてくれる、ケミストチックな小人さんに育つことを期待してるわけだ。

  • AddCarbon(メチル基付加)
  • Aromatize(ジエンを芳香環化)
  • DeAromatize(芳香環をジエン化)
  • DecreaseBondOrder(結合次数を減らす)
  • GenerateRing(環化)
  • Halogenize(メチルをハロゲンに)
  • IncreaseBondOrder(結合次数を増やす)

設定はYAMLで。

Generationは世代数で、cycleは世代で生成される化合物の数。ちなみに第0世代は親。例えばcycle3で第三世代まで発生させると3^3で27化合物で4世代目には3^4で81化合物できる。ランダムな置換の頻度はweightで変えられるようになってる。

reactionはSMARTS使ってこんな感じで反応させてる。

いまんとこ、変異用のモジュールが少ないのでバリエーションが少ないのだけど、これから増やす予定。あと、cycle間で重複を許しているのでこの部分は改善する。

TODO

  • コンバーター作成
  • c1ccccc1 をc1cscc1に変える
  • 極性基の導入、削除
  • エステル化
  • 芳香環に極性基の導入
  • その他
  • 重複チェック
  • オブジェクトをsmilesにしてsqliteで管理する
  • QSAR的なツールと絡めて、変異の頻度を自由に変えられるように。(例えばclogpがでかくなったら極性導入の頻度を高くしたり、MWTが大きくなりすぎたら、大胆に削るとか)
  • wikiかなんかにちゃんとしたドキュメントとか書く。