ChemAxon API を用いて分子の読み込み・書き込みをする

化合物情報を扱う際には一般的にRDKitがよく用いられており、そのユーザー数の多さから様々な記事がウェブ上で見つかります。 ChemAxonもマイナーではありますが研究で用いられているにも関わらず、そのAPIの使い方についてまとめているのは公式ドキュメントのみであまり情報としては充実していません。 そこでこれからいくつかの記事に分けて、ChemAxon API の基本的な使い方に関して解説していこうと思います。

注意事項・Notice

ChemAxonは基本有償(Academic free license)であり、その出力結果等は著作権に関わるため記載しません。 そのため、APIを用いたソースコードのみ記載します。

This post does NOT contain any outputs using ChemAxon API to prevent copyright infringement. This post only contains Java source codes using ChemAxon API, whose documents are open to the public.

環境

  • JChem Engines: 20.13.0
  • Java: 1.8

ChemAxonのインストールが終わってない人は「ChemAxon Academic License取得方法&インストール方法」を参考にしてください。

分子の読み込み

基本的には MolImporter Class を使えば良いです。 読み込める形式としては、一般的なフォーマットは大体対応しています (e.g., smi, mol, sdf)。 ここではとりあえず、

  1. smilesの読み込み
  2. molファイルからの読み込み
  3. sdfファイルからの読み込み

それぞれについてまとめておきます。

smilesの読み込み

readMoleculeFromSmiles.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import chemaxon.formats.MolFormatException;
import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;

public class readMoleculeFromSmiles {
public static void main(String[] args) {
String smiles = "CC(=O)OC1=CC=CC=C1C(O)=O"; // アスピリン
try {
Molecule mol = MolImporter.importMol(smiles); // 分子の読み込み
//
System.out.println(String.format("Atom Count: %s", mol.getAtomCount()));
System.out.println(String.format("Molecular weight: %s", mol.getMass()));
} catch (MolFormatException e) {
e.printStackTrace();
}
}
}

molファイルからの読み込み

aspirin.mol をダウンロードして同じディレクトリに配置してください。
readMoleculeFromMolFile.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;

import java.io.FileInputStream;
import java.io.IOException;

public class readMoleculeFromMolFile {
public static void main(String[] args) {
try (MolImporter mi = new MolImporter(new FileInputStream("aspirin.mol"))) {
Molecule mol = mi.read();
//
System.out.println(String.format("Atom Count: %s", mol.getAtomCount()));
System.out.println(String.format("Molecular weight: %s", mol.getMass()));
} catch (IOException e) {
e.printStackTrace();
}
}
}

sdfファイルからの読み込み

aspirin_penicilin.sdf をダウンロードして同じディレクトリに配置してください。
readMoleculeFromSdf.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;

import java.io.FileInputStream;
import java.io.IOException;

public class readMoleculeFromSdf {
public static void main(String[] args) {
Molecule mol;
try (MolImporter mi = new MolImporter(new FileInputStream("aspirin_penicilin.sdf"))) {
while ((mol = mi.read()) != null) {
System.out.println(mol.getName());
System.out.println(String.format("Atom Count: %s", mol.getAtomCount()));
System.out.println(String.format("Molecular weight: %s\n", mol.getMass()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

分子の書き込み

基本的にはMolExporter Class を使えば良いです。 ここでは、Molecule instance を

  1. SMARTS string で出力
  2. SDFフォーマットで書き込み
  3. 画像ファイルとして書き込み

する方法についてまとめておきます。

exportMolecule.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import chemaxon.formats.MolExporter;
import chemaxon.formats.MolFormatException;
import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;

import java.io.*;

public class exportMolecule {
public static void main(String[] args) {
String smiles = "CC(=O)OC1=CC=CC=C1C(O)=O";
Molecule mol = null;
// 分子の読み込み
try {
mol = MolImporter.importMol(smiles);
System.out.println(MolExporter.exportToFormat(mol, "smarts")); // SMARTSで出力
} catch (IOException e) {
e.printStackTrace();
}
// SDFで書き込み
try (MolExporter me = new MolExporter("aspirin.sdf", "sdf")) {
me.write(mol);
} catch (IOException e) {
e.printStackTrace();
}
// 2次元画像をPNGファイルで保存
try (BufferedOutputStream bfs = new BufferedOutputStream(
new FileOutputStream(new File("aspirin.png")))) {
byte[] bPng = (byte[]) MolExporter.exportToObject(mol, "png:w250,h200,b32,#ffffff");
bfs.write(bPng);
} catch (IOException e) {
e.printStackTrace();
}
}
}

終わりに

この記事ではChemAxon API を用いて簡単な分子の読み書きについてまとめました。 実際はもっと色々な使い方ができますので、興味がある方は参照のAPI Documentsを見てください。

それでは。

参照