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月には隣接する土地を調査する予定。
埋め戻して民家かアパートがたってしまうのは非常に残念。国が買い上げて公園化するなどの対応がどうして取れないのか、悲しくなりました。民主党、たばこ税上げてもいいから、保存せよ!


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


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


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


2009年12月5日土曜日

さかりは過ぎましたが・・・

今日は永観堂~南禅寺~知恩院を散策しました。

出発したときは冷たい雨に凍えましたが、そのうち晴れてきてよかった。

紅葉はさかりを過ぎてはいましたが、人でが少なかったのでゆっくり見れたし、まだ少し紅葉が残っていて、意外とよかったわ。



南禅寺を散策した後、定番の湯豆腐へ。

「奥丹」は混んでたので、「順正」へ。実は順正は初めてだったのですが、庭も見れるしお豆腐はおいしいし、ちょっと儲かった気分。



んでもって、知恩院・青蓮院門跡に国宝の「青不動明王」を見に行きました。

これが混んでるわ、グッズを売りまくってるわ、祈祷受付まくってるわで、さしずめ「仏教テーマパーク」化していて、ちょっとがっかり。

青不動はちゃんと見れましたが、あまりの商売根性丸出しイベントに↓でした。

2009年12月4日金曜日

OpenBabel:Aromaticity

分子がAromaticかどうか知りたいときがありますよね。
そんなときのお気楽関数「Aromaticity」です。

原理は単純。Aromatic原子数/全原子数だけです。
完全Aromatic分子なら1、Aliphaticなら0になるというわけです。

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Diagnostics;

using OpenBabel;

・・・・・・・

/// <summary>
/// Aromaticity:Aromatic原子数/全原子数
/// </summary>
/// <param name="inMol">OBMolインスタンス</param>
/// <returns>0~1の数値</returns>
public static double Aromaticity(OBMol inMol)
{
int atomCount = 0;
int aromaticAtomCount = 0;
foreach (OBAtom item in inMol.Atoms())
{
if (item.IsAromatic()) { aromaticAtomCount += 1; }
atomCount += 1;
}
return aromaticAtomCount / atomCount;
}

OpenBabel : Frameworkerを作ろう

先日の投稿のフローチャートで致命的な欠点に気付いてしまいました。

先の構想では
  1. 化合物をSmilesで表記する
  2. Smartsを「aA」とする
  3. 化合物をこのSmartsにかけると、Aromatic any atom - Aliphatic any atomで切れる。つまり芳香環とLinkerまたは側鎖の間が切れる
という流れだったのですが、これだと













こんなことになってしまって、せっかくの環構造が切れてしまう。

ということで作戦を修正。








  1. 化合物をSmilesで表記する
  2. 化合物からSSSRを取得し、さらに縮合環をまとめてRing構造を抽出
  3. Ring構造から伸びるBondのうち、Ring外に伸びるBondをすべて切断する。このとき構造を完全に切ってしまうのではなく、「切れ目」の状態で化合物を保持しておく
  4. 切れ目を参考にして、化合物を「Fragment」に分ける
  5. 切れ目を参考にして、FragmentとFragmentを連続的につないでいく。このとき、Fragmentと隣り合うFragmentを管理しておくと、一つのFragmentから連続的につながった部分構造が取れる
  6. Aromatic Ringをスタートとして奇数セット(3Fragment、5Fragment・・・)とつないでいけばAromatic ~Aliphatic ~Aromatic の順で部分構造が取れる。すなわちこれがひとつの「Framework」になる
  7. 重原子の種類を無視する場合は、処理後にすべての原子をa,Aなどに置き換えれば、あとですぐSmartsに変更できる


ということで、来週から一部修正作業をしなきゃ。