2010年1月28日木曜日

SOM

TIBCO SpotfireでSOMをすべく、R Integrationを作ってます。

とりあえず版はできたけど、精度が大丈夫なのかがよく分からない。DSの結果と比べて検証しなきゃ。

2010年1月26日火曜日

OpenBabelでOBMolインスタンスのコピー

OpenBabelでOBMolのインスタンスをコピーする時、デバッグに苦労する現象に遭遇しました。

OBMol mol1 = new OBMol();
OBMol mol2 = new OBMol();
(この間、mo1,2lの操作をする)
mol1 = mol2;

この代入でエラーは出ませんが、mol1のインスタンスは非常に不安定で、突然消えたりします。

これは、mol1のインスタンスのメモリー領域がmol2で上書きされることで、(おそらく)mol1のポインターが確保されないまま操作されていることによります。たちの悪いことに、この操作でのエラーは何も出ません。

mol1にmol2を上書きする場合は

mol1 = new OBMol(mol2)

として、mol1をちゃんと初期化してmol2をコピーしましょう。

これが原因で10日ほど悩みました。

2010年1月23日土曜日

構造編集用の.NET Framework Class library:Hyleos

構造編集に便利そうな.NET Framework Class libraryを見つけました。

http://www.hyleos.net/

このサイトが会社なのか有志なのか分かりません。少なくともOpen Sourceではなさそうです。でもFreeでの配布とのことでちょっと使ってみました。

ここで配布しているClass libraryを使うと、構造編集用のBoxが使えて、ダブルクリックでDrawingソフトが起動し、構造の修正ができます。

ISISのStructure Boxのような感じで、とりあえずSymyx Drawとの連動は正常に動作しました。

構造編集ソフトとの連携が通常のようにMIMEタイプでやり取りしていればほとんどのDraw系ソフトと連携できるはずで、ISIS Drawとの連携も出来そう。

Boxからの構造の取り出し、Smiles変換機能など、必要な機能は一通り揃っています。OpenBabelへのSmilesでの連携も確認できました。

早速、月曜日に試してみようっと。ちゃんと動作すればTIBCO Spotfireへ組み込んでみよう。

2010年1月20日水曜日

Oracleでも正規表現が使える

Oracleの格納した文字列に対して10g以上では正規表現が使えるようです。

http://www.atmarkit.co.jp/fdb/rensai/sqlclinic01/sqlclinic01_1.html

化合物の部分構造情報を文字列としてCLOBに格納しておいても正規表現で検索できるので何かに使えそう。

select CompId from CompDB where REGEXP_LIKE(CompKey, 'c1ccccc1|C1CCCCC1')

でベンゼンとシクロヘキサンを含む構造が取得できるとか。

2010年1月19日火曜日

TIBCO Spotfire上でsdf2smi

っつーわけでCDKをTIBCO Spotfireに組み込んでsdf2smi、Daylightで言うところのmol2smiを作ってみました。

とりあえず動きました。とりあえずというのは遅い!もう速くするのが課題。

ついでに言うと、OpenBabelを使ったsmi2sdf、Daylightでいうところのsmi2molも組み込みました。こちらはそこそこ実用的な速度が出てます。

このあたり、JavaのLibraryを少し無理に.NET Frameworkに移した影響があるのかも。
ようはOpenBabelが早く2D変換をサポートしてくれれば済むのですが。

2010年1月17日日曜日

JMEも.NETで使える

JMEも.NETで使えるらしい。

http://chemhack.com/archives/tag/chemoinformatics/

.NETでCDKを使う

CDKはjavaのmolecular class libraryのようなものです。java版のpipeline pilotであるKnimeではメインのChemistry engineとして採用されています。

CDKを.NET環境で使うためのやり方が紹介されていたのでやってみました。

Using the CDK with the .Net framework and Mono

まずjavaのjarファイルを.NETのクラスライブラリー化するためのツールIKVMをダウンロードします。私が落としたのは「ikvmbin-0.42.0.3」です。

ついでCDKのjarファイルを落とします。私が落としたのは「cdk-1.2.4.1.jar」です。

IKVMを使ってこのCDKをdll化します。
コマンドプロンプトでikvm.exeのあるフォルダーに移動して

ikvmc -assembly:cdk_dotnet -target:library cdk-1.2.4.1.jar

と打つとcdk_dotnet.dllが出来ます。この際にWarningが多く出ますが無視。

VisualStudio2008のC#のコンソールアプリケーションを作成して、参照設定にcdk_dotnet.dllを含めikvmのbinフォルダーの中のdllをすべて登録します。



これでCDKが使えるようになりました。

具体的なコードは上記のサンプルコードを参照してください。Molファイルを読み込んで計算値を出力してくれました。

using System;

namespace CDK_test
{
    //Using aliases for convenience and to avoid importing whole
    //packages
    using FReader = java.io.FileReader;
    using TPSA = org.openscience.cdk.qsar.descriptors.molecular.TPSADescriptor;
    using LogP = org.openscience.cdk.qsar.descriptors.molecular.XLogPDescriptor;
    using DoubleResult = org.openscience.cdk.qsar.result.DoubleResult;
    using Builder = org.openscience.cdk.DefaultChemObjectBuilder;
    using IMol = org.openscience.cdk.interfaces.IMolecule;
    using MolReader = org.openscience.cdk.io.iterator.IteratingMDLReader;
    using Consts = org.openscience.cdk.CDKConstants;

    class Program
    {
        static void Main(string[] args)
        {
            FReader fReader = new FReader("C:\Test.mol");
            MolReader molReader = new MolReader(fReader, Builder.getInstance());
            IMol mol;
            DoubleResult dr;
            LogP logP = new LogP();
            TPSA tpsa = new TPSA();
            double logPVal, tpsaVal;
            string name;

            while (molReader.hasNext())
            {
                mol = (IMol)molReader.next();
                dr = (DoubleResult)logP.calculate(mol).getValue();
                logPVal = dr.doubleValue();
                dr = (DoubleResult)tpsa.calculate(mol).getValue();
                tpsaVal = dr.doubleValue();

                //the title of each mol in the file is the name of the mol
                name = (String)mol.getProperty(Consts.TITLE);

                Console.WriteLine("{0} {1} {2}", name, logPVal, tpsaVal);
            }
            Console.ReadLine();
        }
    }
}

今回は純粋な.NETのclass libraryしか参照していないので、そのままSpotfireのツールに出来そうです。

2010年1月15日金曜日

OpenBabelをTIBCO Spotfireへ実装する

OpenBabelをTIBCO Spotfireへ実装することにしました。

Spotfireはご存知の通り、大量データの可視化ツールですが、開発環境にC#を採用することで、適用できるツールの範囲が広がりました。

もちろんOpenBabelの.NETモジュールを使うことでTIBCO Spotfireなら比較的簡単に実装が可能です。

ひとつ問題があります。旧タイプのDLL(Win32 APIなどを呼び出すときの仕様)はVisualStudioでは使用可能ですが、TIBCO SpotfireのBuilderでは登録を拒否されます。このあたりは要改善事項です。

OpenBabel .NETはこのタイプのDLLを使っているので、そのままでは登録できません。

あれやこれやと悩んだのですが、ようやく解決策が見つかりました。DLLのファイルをいったん拡張子をtxtにします。TextファイルならSpotfireのBuilderも安心して登録することが出来るのでClientに送信が出来ます。起動するときにこれらのTextファイルの拡張子をdllに戻してやります。するとOpenBabelがちゃんとdllを認識して動作するというわけです。

なんかウィルスの動きをミミックしているみたいで、どうゆうわけかやな気分ですが、とりあえず動きそうなんで、この仕様でがんばろうっと。

2010年1月12日火曜日

Smilesから2D構造を表示する

Smiles文字列を見ただけで2D構造が浮かぶ人ようなすごい人はいいのですが、全く浮かばない私はSmilesから2D構造を表示して見たいわけです。

通常はDaylight Toolkitのsmi2molを使ってSmilesをSDファイルに変換してからISISやSpotfireなどで見る訳ですが、WindowsとUnixを行ったり来たりするのはうざい。なんとかWindows環境だけで2D構造を起こせないかと探していたらありました。


Indigoの中のDingoというモジュールを使えばSmilesやSmartsに加えてMolファイルやRxnファイルを読み込んで、構造を画像(PDF、PNG、SVG、HDC、Bitマップ、Metaファイル)として出力できます。とりあえず見るという目的ならこれで充分。

しかも.NET Class LibraryもついているのでVisualStudioですぐに動かせます。TIBCO SpotfireのRendererにも転用可能です(というかもう作った)。

これで座標の入ったMolファイルとしても出せればいいのですが、調べたところでは出来なさそう・・・。