三次元座標の生成

アクオスビエラブラビア、レグザ・・・3D化が進むテレビ業界ですが、
三次元情報を使いこなすには、まだ少し時間がかかりそうですね。


分子記述子にも、三次元情報を活用したものが数多く存在するのですが、
今まで紹介してきた一次元/二次元記述子と比ぶると、
いまひとつ浸透していないようです。
次回からしばらく、これら「三次元記述子」を扱ってみたいと思います。


となると入力ファイルは、SMILESではなく、SDFやMOL2のような、
xyz座標を格納できるファイル形式が適切です。
以下では、SMILESから適当な三次元座標を生成して、SDF形式で保存してみます。


/* gen3d.java */

import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
import java.io.FileWriter;
import org.openscience.cdk.io.SDFWriter;
import org.openscience.cdk.modeling.builder3d.ModelBuilder3D;

class gen3d {

public static void main(String args[]){

if(args.length!=2){
System.err.println("getMW <smiles-file> <sdf-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingSMILESReader isr = null;
try{
fis = new FileInputStream(new File(args[0]));
isr = new IteratingSMILESReader(fis);
} catch (Exception e) {
e.printStackTrace();
}

FileWriter fw = null;
SDFWriter mw = null;
try {
fw = new FileWriter(new File(args[1]));
mw = new SDFWriter(fw);
} catch (IOException e) {
e.printStackTrace();
}

while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");

try {
ModelBuilder3D mb3d = ModelBuilder3D.getInstance();
IMolecule mol3d = mb3d.generate3DCoordinates(imol, false);
mw.write( mol3d );
} catch (Exception e) {
e.printStackTrace();
}
}
try {
mw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

いざ実行してみますとエラーがようけ出てきましたが、大丈夫なのかな。


ちなみにopenbabelを使うと

babel --gen3d -ismi -osdf

シェルコマンド1行でできてしまいます。