2006年08月16日

PyDev & Frowns

これまでは、emacsやIDLEを利用してPythonのプログラムを書いていましたが、EclipseのプラグインであるPyDevが便利だと聞いたので試してみました。

@インストール
 http://sourceforge.net/projects/pydev/ からorg.python.pydev.feature-1_2_2.zipを取得して、適当な場所で展開します。そして、featuresとplugins下のファイルをeclipseのfeaturesとplugins下にコピーします。

Aインストールの確認
 eclipseを起動し、[Help]→[About Eclipse SDF]→[Plug-in Details]でpydevがインストールされているか確認できます。

B設定
 [Window]→[Preferences]で左側のTreeから[Pydev]→[Interpreter Python]を選択します。そして、右上の[New]ボタンを押してPythonの実行ファイルの場所を設定します。あとは、通常通り[File]→[New]→[Project]でPydev Projectが作成できます。

試しにfrownsをimportして使ってみました。

eclip.png

おお!コード補完されました。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:45| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

2006年06月13日

Pythonでケムインフォ:Fingerprint 2

FrownsでのFingerprintの使い方をメモしたいと思います。
 
 import frowns.Fingerprint

によりモジュールを読み込み、generateFingerprint関数によりFingerprintを生成します。

 def generateFingerprint(molecule, numInts=32, pathLength=7):

デフォルトでは、ビット長は32、部分構造のパス長が7となっています。
ここでは、生成したFingerprintを部分構造検索の前工程に利用するプログラムを作成致します。

プログラムの概要ですが、

1.
クエリー構造のFingerprintを作成する。ただし、ここでは、Smiles.smilinで変換可能なSMARTSパターンを入力すること。

2. #Fingerprint generation
標的となる化合物郡のFingerprintを全て生成し、dbリストに収める。

3. #Smarts Search
第3引数であるflagが1ならSMARTS検索の前工程としてFingerprint同士の一致を評価し、0なら評価しない。
その後、SMARTS検索。

実行例1:Fingerprintを利用しない。
$ python smartsearch2.py data.sdf "c1ccccc1OCCCCC" 0

出力:
C(=O)(O)c1c(OC(=O)CCCCC)cccc1
O(CCCCCCCCCCCC)c1ccc(C(=O)O)cc1
Time 4.43799996376
2 Hit compounds

実行例2:Fingerprintを利用する。
$ python smartsearch2.py data.sdf "c1ccccc1OCCCCC" 1

出力:
C(=O)(O)c1c(OC(=O)CCCCC)cccc1
O(CCCCCCCCCCCC)c1ccc(C(=O)O)cc1
Time 1.84400010109
2 Hit compounds

この例では、Fingerprintの利用により約2.4倍、検索速度のUPが確認できました。実際の検索システムでは、Fingerprintは化合物のデータベースへの登録時に、ビット文字列などで格納されることが多いと思います。

smartsearch2.py



banner_02.gif
人気ブログランキング(クリックして応援してね)



 
posted by わばのり at 08:06| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

2006年06月12日

Pythonでケムインフォ:Fingerprint

Fingerprintについてメモしたいと思います。化学構造のFingerprintでは、ビット列中の各ビットに部分構造(フラグメント)があてはめられています。例えば、1ビット目にあてはめられた部分構造が、化合物中に存在すれば"1"、存在しなければ"0"とセットします。Fingerprintの長さは、通常、数百〜数千ビット程度ではないでしょうか。

代表的なFingerprintの使い方は、類似性検索だと思います。分子Aと分子Bの類似性を評価する場合、Fingerprint A(分子Aより生成)とFingerprint B(分子Bより生成)間の距離を"類似性"の尺度とし評価します。この距離の計算には、Tanimoto係数、コサイン係数など多くの手法が提案されています。

もう1つのFingerprintの作り方として、ハッシングを用いる方法があります。上記方法では、ユーザが各ビットに特定の部分構造を設定しますが、ハッシングでは、与えられた部分構造からハッシュ値を計算し、その値で、何ビット目に1を立てるか決定します。利点としては、はじめに各ビットの部分構造を決定する必要がないこと。また、ハッシュ関数でハッシュ値の上限が設定できるため、ビット列長を自由に設定できることなどが挙げられます。逆に、欠点としては、ハッシュ値の衝突により、特定のビットに2つ以上の部分構造があてはめられることが挙げられます。したがって、類似性評価を行う場合、Fingerprint生成アルゴリズムはチェックすべき項目だと思います。

さて、部分構造検索は、グラフ理論でいうグラフの同形判定であり、この同形を判定する作業は、NP完全問題です。したがって、この部分における高速化は、かなりしんどいタスクとなります。そこで、同形判定をする前に、明らかに部分構造ではない化合物を取り除く工程でFingerprintが利用されています。ここでは、ハッシングによるFingerprintが活躍しています。

例えば、Fingerprint Aをクエリーとして、Fingerprint Bを標的とする場合、Fingerprint AがFingerprint Bの部分構造であるためには、Fingerprint Aの全ての1の立っているビットがBにおいても1である必要があります。この計算はビット演算子を用いて評価できますので、非常に高速に計算できます。そうは言っても、ハッシングによるFingerprintでは衝突が発生しますが、その後に同形判定は必ず行われますので、最終結果には影響を及ぼさないことになります。

次回、Frownsを使って、Fingerprint + SMARTSによる部分構造検索プログラムを作成したいと思います。


banner_02.gif
人気ブログランキング(クリックして応援してね)





posted by わばのり at 07:11| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

2006年06月09日

Pythonでケムインフォ: SMARTS検索

Frownsを用いて化合物の部分構造検索を行ってみます。
sdfからの分子の入力方法は、6/8の記事と同じ方法で行っています。
今回のプログラムのUsageは以下のとおりです。

 Usage: smartsearcher.py xxx.sdf 'PATTERN' > result.txt

まず、'PATTERN'として入力するSMARTS文字列をcompile関数に渡します。

 pattern = Smarts.compile(sys.argv[2])

compile関数は戻り値として、Matcherクラスのインスタンスを返します。

次にwhile文の中で順次読み込んでいるsdf中の分子とSMARTS文字列の一致判定を行います。この判定には、matchメソッドを利用し、第2引数に1を渡しています。
例えば、分子中にSMART文字列と一致する部分が5箇所あったとしても最大1つだけ見つければよいことを示しています。全ての一致が必要な場合は、-1を渡します。デフォルトが-1ですので、第2引数を渡さなければ全ての一致を検出します。

 match = pattern.match(mol,1)

matchメソッドは一致がない場合Noneオブジェクトを返しますので、以下の式で一致を判定します。

 if match != None:

また、逆に一致する場合、matchメソッドは、SMARTS文字列に一致したatomとbondのPathSetを返します。そして、次のような結果を表示します。

--------------------------------------------------
C1(=C2C(=C(C(=O)C=C2)Br)Oc3c(c(ccc13)O)Br)c4c(C(=O)O)cccc4
match 1
atoms (Atom(18), Atom(17), Atom(16), Atom(15), Atom(20), Atom(19), Atom(22))
bond (Bond(19), Bond(18), Bond(16), Bond(22), Bond(21), Bond(20), Bond(24))
--------------------------------------------------
c1(c(cc(c(c1)O)C(C)(C)C)O)C(C)(C)C
match 1
atoms (Atom(4), Atom(14), Atom(13), Atom(8), Atom(7), Atom(5), Atom(6))
bond (Bond(14), Bond(13), Bond(12), Bond(7), Bond(6), Bond(4), Bond(5))
--------------------------------------------------



Frownsでは、SMARTS検索の一部にgraph matching libraryであるVFLibを利用しています。興味のある方はチェックしてみてください。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:25| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

2006年06月08日

Pythonでケムインフォ:sdfの読み込み

今回は、Frownsを用いたsdfの読み込みについてメモしたいと思います。
FrownsのHPTutorialに例がありますので、これとは少し異なる方法をとってみます。
ちなみにTutorial中の例は古いバージョンのFrownsを使っている?と思われるため、Ver.0.9aを使う場合は、トップページ上にあるMOL File(example4.py)を利用した方がいいと思います。下記プログラムもVer.0.9aを用いています。

まず、組み込み関数open()に引数としてsdfのファイル名を渡します。そして、その戻り値をMDLモジュール内のsdinクラスの__init__メソッドに渡すことにより、そのインスタンスmdl_infoを生成させます。

次にwhile文を使ってsdfから順次分子を読み込み、それら分子のCanonical Smiles表記を表示します。
ここで、mol_info.next()は3つの戻り値をタプルで返します。
molにはMoleculeクラスのインスタンス、errにはエラーメッセージ、textには、sdfの中身がtextとして収められています。

while文からの脱出は、StopIterationにより行っています。





banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:01| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

2006年05月28日

Pythonでケムインフォ

Lightweight Language(LL)で手軽にケムインフォマティクスのライブラリを使いたい。研究現場でプログラムを書いているとこんなことをよく思います。他のLLでも同様のことが言えるかもしれませんが、Pythonには、cheminformatics toolkitであるFrownsが公開されています。この他にも例えば、ケモメトリックス/統計ではPyChem/PyRが、分子モデリングでは、MMTKPyQuanteが、分子グラフィクスでは、PyMolChimeraなどが公開されています。商用でも有益な製品が多く販売されています。これらを使えば、ちょっと思いついたアイデアを短時間に実装/テストができ便利ですね。

さて、今回は、cheminformatics toolkitであるFrownsについてメモしたいと思います。

Windowsでのインストール方法(Linux上でもほぼ同様です):

Frownsのサイトよりfrowns-0.9a.zipを入手する。
http://frowns.sourceforge.net/
Python2.2以上を事前にインストールしてください。
パスを通すのをお忘れなく!

適当なフォルダでfrowns-0.9a.zipを解凍。

解凍したフォルダに移動し、以下のコマンドをコマンドプロンプト上で実行する。
> python setup.py build
> python setup.py install
インストールの完了!

次に例として簡単なスクリプトを書いてみます。
ここでは、Smiles.smilinを用いてSMILESを入力し、arbsmiles()及びcansmiles()でそれを出力しています。前者は、入力されたSMILESをそのまま出力し、後者は規範化して出力します。
SMILESは、同じ分子を複数の表現方法で示すことができ、今回入力しているSMILESは全て同じ分子(フェノール)を示しています。したがって、cansmiles()では規範化され全て同じSMILESとなって出力されています。残念ながらOELibにはCanonical SMILESはまだ実装されていません。RoadMapにはのっていますが。

規範化といえば、データベース検索における重要な技術の一つであり、Morgan法があまりにも有名ですね。Morgan法は次の機会にでもメモしたいと思っています。

-------------------------------------------------------
ソースプログラム:test.py
from frowns import Smiles

mol1 = Smiles.smilin("Oc1ccccc1")
mol2 = Smiles.smilin("c1ccccc1O")
mol3 = Smiles.smilin("c1ccc(O)cc1")

print 'mol1:Smiles ' + mol1.arbsmiles()
print 'mol2:Smiles ' + mol2.arbsmiles();
print 'mol3:Smiles ' + mol3.arbsmiles();
print ''
print 'mol1:Canonical Smiles ' + mol1.cansmiles()
print 'mol2:Canonical Smiles ' + mol2.cansmiles();
print 'mol3:Canonical Smiles ' + mol3.cansmiles();
-------------------------------------------------------
実行:
> python test.py
-------------------------------------------------------
出力:
mol1:Smiles Oc1ccccc1
mol2:Smiles c1ccccc1O
mol3:Smiles c1ccc(O)cc1

mol1:Canonical Smiles c1(ccccc1)O
mol2:Canonical Smiles c1(ccccc1)O
mol3:Canonical Smiles c1(ccccc1)O
-------------------------------------------------------


banner_02.gif
人気ブログランキング(クリックして応援してね)


posted by わばのり at 13:22| Comment(0) | TrackBack(0) | Frowns | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。