2009年12月25日金曜日

OpenBabel:SuperCanonicalizer()

前回はSmilesの/と\で表現される立体異性体の問題を解決してOKかと思ったのですが、またも落とし穴を発見。

それは@です。

@と@@は原子のChirality(鏡像異性)を表してあり、それぞれ反時計回り、時計回りのChiralを表します。

SuperCanonicalをするためにはこのChiralityを取り除く必要があります。

OpenBabelのOBMolクラスにはIsChiral()というMethodがあり原子がChiralかどうか判定できます。これがTrueのときにUnsetStereo()を適用することでChiralを消すことが出来ます。


2009年12月18日金曜日

OpenBabel : Frameworkerを作ろう

FrameWorkを作るには各Fragmentの結合の組み合わせをすべてもれなくPick Upする必要があります。

たとえば下記のFragment構造を持った分子の場合、



可能な組み合わせは
A,B,C,D,E,F
A-B,B-C,B-D,D-E,D-F
A-B-C,A-B-D,C-B-D,B-D-E,B-D-F,D-E-F
・・・
などと組み合わせていく必要があります。

6Fragmentからなる分子の場合で3Fragmentから成るFrameworkは6C3=6*5*4/(3*2*1) = 20通りのなかから連結したFragmentを探すことになります。これらを1~Fragment数分の組み合わせを探すことが必要です。

最初は各Fragmentの連結情報からFragment長にあう組み合わせを網羅的にかつ有機的に探していこうとしました。しかし、分岐問題をスマートに解決する手法がなかなか思いつかず、それならすべての組み合わせの中からちゃんと連結したFragmentを組み合わせを探して、それをFrameWorkとしよう、ということにしました。

これなら、ちょっとだけ時間はかかるけど漏れなくFrameWorkを探せるな、ということです。


2009年12月17日木曜日

OpenBabel:SuperCanonicalizer()

前回は価数の超過に対応して、もうこれで大丈夫と思ったのですが、またまた落とし穴を発見。

今回はStereo Isomerです。

Smilesでは/はUpper Bond、\はDown Bondを表します。これらもinchiで除けるかと思ったのですがだめでした。inchiをかえしてもUpper/Downはそのままでした。

これは一発のコマンドではどうしようもなかったので

foreach (OBBond oneBond in Mol.Bonds())
{
    if(OneBond.IsUp()){oneBond.UnsetUp();}
    if(OneBond.IsDown()){oneBond.UnsetDown();}
}

というような感じで、一個一個Bondをチェックして標準化しました。

しかし、SmilesのくせにStereo Isomerを表現するとは生意気だ。

まだ落とし穴があるかも・・・。

2009年12月16日水曜日

OpenBabel:Tautomer(互変異性)を標準化する

前回、Tautomer(互変異性)を標準化する関数を作ったのですが、落とし穴がありました。

よくあることなのですが、自動で部分構造をSmilesで切り出す際に、原子の価数が超過してしまうことがあります。たとえばこのような構造が出力されることがあります。



この分子の原子のうちSは価数を超えているのでS+と表記すべきですが、Smilesではそのような表現がされないまま出力されてしまいます。これを先日のTautomersStandardizerにかけても修正されません。修正されないどころか、場合によっては芳香性もなくなって変な脂溶性構造になることまであります。こわい。

しかし、変換前に水素を全部取ってやるとちゃんとした




になることがわかりました。

ついでに関数名も変えて、Canonicalで出力するようにしてます。



static string SuperCanonicalizer(string inSmiles)
{
OBMol mol = new OBMol();
OBConversion obconvSmiToInchi = new OBConversion();
OBConversion obconvInchiToSmi = new OBConversion();

obconvSmiToInchi.SetInFormat("smi");
obconvSmiToInchi.SetOutFormat("inchi");
obconvInchiToSmi.SetInFormat("inchi");
obconvInchiToSmi.SetOutFormat("can");

obconvSmiToInchi.ReadString(mol, inSmiles);
mol.DeleteHydrogens();
obconvInchiToSmi.ReadString(mol,obconvSmiToInchi.WriteString(mol));


return obconvInchiToSmi.WriteString(mol);
}



これでどんなSmilesもすべて標準化できそうです。

2009年12月10日木曜日

OpenBabel:Tautomer(互変異性)を標準化する

芳香環を持つ化合物は共鳴構造を取ることから、表記上複数の構造を取りえます。

しかし、実際はひとつの同じ化合物であり、コンピューター上で構造の重複処理をする際に問題となります。このような、表記上異なる構造であるが同一の構造であることをTautomer(互変異性)といいます。

Smilesで処理するとどうしてもこのTautomer(互変異性)を標準化・同一化することが出来ません。お金を出して専用ソフトを買うとたいていこのTautomer処理機能はついています。

しかしOpenBabelでもその機能を組み合わせるとこのTautomer(互変異性)標準化ができます。

OpenBabelはさまざまな化合物形式をサポートしていますので、これを使ってやってみます。使うのがInChIという構造フォーマットです。

InChIは、立体構造を含めた化合物の構造を一意的に記述することを目的にIUPACと米国の国立標準技術研究所(NIST)が策定した標準。また、機械処理のための短い識別子であるInChIKeyも各化合物に付与される。既に普及している米国化学会のCAS登録番号と異なり、誰でも自由に使えることが特徴。・・・とのことです。

SmilesをいったんInChIに変換するとTautomer(互変異性)は同一の記述になります。そこでそのあとでまたSmilesに戻してやると同じSmilesになるというわけです。

using System;
using OpenBabel;

namespace SmilesTest
{
class Program
{
static OBConversion obconvSmiToInchi = new OBConversion();
static OBConversion obconvInchiToSmi = new OBConversion();

static void Main(string[] args)
{
OBMol tautomer1 = new OBMol();
OBMol tautomer2 = new OBMol();

string smiles1 = "Oc1ccccn1";
string smiles2 = "O=c1cccc[nH]1";

Console.WriteLine(smiles1);
Console.WriteLine(smiles2);

Console.WriteLine(TautomersStandardizer(smiles1));
Console.WriteLine(TautomersStandardizer(smiles2));

Console.In.ReadLine();
}
/// <summary>
/// Tautomers Standardizer
/// 互変異性標準化する関数
/// tautomerの構造の違いをStandarlizeする
/// </summary>
/// <param name="inSmiles">Smiles文字列</param>
/// <returns>標準化Smiles文字列</returns>
static string TautomersStandardizer(string inSmiles)
{
OBMol mol = new OBMol();
OBConversion obconvSmiToInchi = new OBConversion();
OBConversion obconvInchiToSmi = new OBConversion();

obconvSmiToInchi.SetInFormat("smi");
obconvSmiToInchi.SetOutFormat("inchi");
obconvInchiToSmi.SetInFormat("inchi");
obconvInchiToSmi.SetOutFormat("smi");

obconvSmiToInchi.ReadString(mol, inSmiles);
obconvInchiToSmi.ReadString(mol,obconvSmiToInchi.WriteString(mol));


return obconvInchiToSmi.WriteString(mol);
}
}
}

これを実行すると下記のようになります。



やっぱOpenBabeは便利やわ。



2009年12月8日火曜日

OpenBabel:OBMol.Bonds()とDeleteBond()の関係

OpenBabelの分子を表現するClassにOBMolがあります。OpenBabelの最も重要なClassです。

化合物の構造を変換するときなどはOBMolに含まれるMethodをいろいろ使うわけですが、その中のBonds()というMethodがあります。このMethodはMolに含まれるBondすべてのIEnumerableリストを返します。

例えば、その中の特定のBondを切断したければ

foreach(IEnumerable<OBBond> oneBond in inMol.Bonds())
{
if(・・・条件式・・・)
{inMol.DeleteBond(oneBond);}
}

などとやりますが、これでは実は正常に動きません。

DeleteBond()を呼ぶとBonds()で取得できるIEnumerable<OBBond>の中身がどうも変わってしまうようで、一度に複数回DeleteBondをCallすると予期せぬBondが切れてしまいます。

よって、DeleteBondを呼んだあとで、今一度
IEnumerable<OBBond> oneBond in inMol.Bonds()
などでリストを再構築する必要があります。

この原因がわかるのに1日を費やしました(涙)。

2009年12月6日日曜日

卑弥呼の宮へ

今日は卑弥呼に会いに纏向に行きました。

まずは黒塚古墳へ。ここは1997年に三角縁神獣鏡がものすごい数出たということで、三大紙のトップニュースになるほどの大騒ぎになったところです。

これだけまとまった数の神獣鏡が出るのは、間違いなく邪馬台国と関係があるはず、と思われたのですが、やはり鏡しか出なかったということで、邪馬台国大和説の決定的な証拠にはできませんでした。

私も当時現説(現地説明会)に行って、寒空の中3時間並んで、2~3分あっという間通り過ぎるなか、発掘したばかりの古墳を見ました。見たとき、これは間違いなくこの近くに邪馬台国があるはず、とわくわくしたのを思い出します。

その後、資料館が出来て、「鹿男あおによし」でもロケに使われたのは知っていて、今回は古墳は二度目、資料館は初めて行きました。近くの国道のサークルKの裏に専用駐車場もあり、行きやすくなってます。



すごくきれいになっていて、ちゃんと復元された石室が見れます。しかも無料!地域住民の皆さんで運営されているとのこと。感謝です>住民の皆さん。

展示されている三角縁神獣鏡はレプリカですが、近くまで見て写真も取れます。本物は橿原考古学研究所に保管されています(展示はされていないとのことでしたが、あとで行くと何枚か展示されていました)。





三輪そうめん「山本」でお昼を取って、お店お人に車を置きっぱなしにすることをお断りして散策に出かけました。纏向石塚古墳やら纏向勝山古墳を見て、いよいよ今回の「纏向遺跡第166次調査地」へ。先月の巨大施設跡の発掘で大ニュースになった、卑弥呼の宮殿跡です。





説明会は先月に終わってしまっていましたが、桜井市教育委員会の方がいて、たぶん見張りでいるんだと思いますが、一通り説明してくれました。ラッキー!ビニールシート越しでしたが、ここに卑弥呼がいたんだな、ここが大和政権の発祥の地なんだと思うと、感動しきり。


桜井市の人いわく。
  •  現地は個人所有の土地。市が買い上げて史跡公園にするほどの予算はない。
  •  来週には埋め戻して地主に返す。
  •  6月には隣接する土地を調査する予定。
埋め戻して民家かアパートがたってしまうのは非常に残念。国が買い上げて公園化するなどの対応がどうして取れないのか、悲しくなりました。民主党、たばこ税上げてもいいから、保存せよ!


その後は箸墓古墳、橿原考古学研究所を見ました。橿原考古学研究所でも研究所の人と思われる解説ガイドのおじさんが纏向遺跡の発掘に触れながら弥生時代から奈良時代までの展示品を説明してくれて、これまたラッキー!


しかも、前回行った時は藤ノ木古墳の金の装飾品などの副葬品はレプリカだったのが、今回はなんと本物を展示してました。しかも国宝指定なので間違いなく本物!これには感動!


今回はいろいろ「もうかった」ミニ旅行でした。