InChiKeyで出力したい

InChiKeyはInChiを固定長の文字列(25文字)で表現したもので、化合物表現ではなく単なるハッシュ値が欲しい時に便利です。特に、化合物の大きさによらず固定長の文字列となるので見た目にもよろしいです。

openbabelモジュールを利用する場合には'K'オプションを与えることでInChiではなくInChiKeyを出力するようになります。キラリティを決められない場合にwarningが出るのでそれを抑止するためにwオプションも与えています。

import openbabel as ob 
mol = ob.OBMol()       
obc = ob.OBConversion()

obc.SetInAndOutFormats('smi','inchi')
obc.AddOption('w',ob.OBConversion.OUTOPTIONS)
obc.AddOption('K',ob.OBConversion.OUTOPTIONS)

obc.ReadString(mol, 'CCC(O)Cl')
print obc.WriteString(mol,True)  

化合物の描画をしたい

pybelには簡単に構造描画をするためのメソッドが用意されています。

ただし、このメソッドを使うためにはPILOASAの2つのライブラリが必要なので別途インストールしておきましょう。

import pybel
mymol = pybel.readstring('smi','CCOC(=O)C1=C(NC(=C(C1C2=CC=CC=C2Cl)C(=O)OC)C)COCCN')
mymol.draw(filename="norvasc.png", show=False)

とたった数行でSMILES形式の化合物が画像として描画されます。

OASAライブラリのほうで二次元の座標は計算してくれますが構造がかぶったりしたときの処理はこれから改善されていくとよいですね。

ちなみに今回サンプルとして使用したノルバスクは高血圧の薬で、塩を含んでいますが今回は除きました。

化合物の立体構造を計算したい(pybelで)

pybelはopenbabelのpythonラッパーをもっとpythonらしく書けるようにしたラッパー関数群です。

openbabel-2.2.0に付属しているpybelはmake3Dというメソッドが利用できるのでこれを使うとopenbabelラッパーより見通しのよいコードの記述ができます

import pybel
mymol = pybel.readstring("smi", "COC=CC")
mymol.make3D()
output = pybel.Outputfile("sdf", "comp3d.sdf")
output.write(mymol) 

化合物の立体構造を計算したい

openbabel-2.2.0のpythonバインディングはOBBuilderを呼べないのでラッパーを使います。OBOp.FindType('Gen3D')がそれです。

import openbabel

obConversion = openbabel.OBConversion()
obConversion.SetInAndOutFormats("smi", "mdl")
 
mol = openbabel.OBMol()
obConversion.ReadString(mol, "c1ccccc1")

builder = openbabel.OBOp.FindType('Gen3D')
builder.Do(mol)

mol.AddHydrogens()

print obConversion.WriteString(mol) 

ただし、これで得た構造は荒いので、最適化構造を求めたければさらに精度の高い計算を行う必要があります。

SmilesをInChiにコンバートしたい

SMILESだと構造の一意性が保証されず、重複が出てしまったりと何かと不便なところがありますが、InChiではそのようなことがないのです。

openbabelに同梱されているperlバインディングを利用すれば、InChiの入出力ができます。

use Chemistry::OpenBabel;

my $obMol = new Chemistry::OpenBabel::OBMol;
my $obConversion = new Chemistry::OpenBabel::OBConversion;
$obConversion->SetInAndOutFormats("smi", "inchi");
$obConversion->ReadString($obMol, "C1=CC=CS1");
my $outInChi = $obConversion->WriteString($obMol);

print $outInChi;