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は便利やわ。



0 件のコメント: