はじめに
CDKは、分子に関する記述子の他、原子や結合、原子と原子同士に関する記述子も用意されている。今回は、原子の記述子である次数を求める記述子を使ってみたのでメモっておく。CDKネタが続いて恐縮であるが、もともとCDKに興味を持ったのが原子や結合の記述子が用意されており、これを試したかったからである。
環境
- Windows 10
- Java 11
- CDK 2.2
ソースコード
以下の通りである。
AtomicDescritor.java
import org.openscience.cdk.DefaultChemObjectBuilder;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.io.iterator.IteratingSDFReader;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.smiles.SmiFlavor;
import org.openscience.cdk.smiles.SmilesGenerator;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
import org.openscience.cdk.qsar.descriptors.atomic.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class AtomicDescriptor {
public static void main(String args[]){
if(args.length!=1){
System.err.println("AtomicDescriptor <sd-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingSDFReader isr = null;
try{
fis = new FileInputStream(new File(args[0]));
isr = new IteratingSDFReader(fis, DefaultChemObjectBuilder.getInstance() );
while( isr.hasNext() ) {
IAtomContainer mol = (IAtomContainer) isr.next();
String id = (String) mol.getProperty("cdk:Title");
SmilesGenerator sg = new SmilesGenerator(SmiFlavor.Generic |SmiFlavor.UseAromaticSymbols);
AtomContainerManipulator acm = new AtomContainerManipulator();
AtomDegreeDescriptor add = new AtomDegreeDescriptor();
try {
String can = sg.create(acm.removeHydrogens(mol));
System.out.println(id + ":" +can);
for (IAtom atom : mol.atoms()) {
System.out.println(" " + atom.getAtomicNumber() + ":" + add.calculate(atom, mol).getValue());
}
}catch(Exception e){
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(isr != null) {
try {
isr.close();
}catch(IOException e2) {
e2.printStackTrace();;
}
}
if(fis != null) {
try {
fis.close();
}catch(IOException e2) {
e2.printStackTrace();
}
}
}
}
}
結果
こんな感じ。原子番号と次数が表示されている。構造がないと分かりにくいと思うが。
n-pentane:CCCCC
6:1
6:2
6:2
6:2
6:1
cyclopentane:C1CCCC1
6:2
6:2
6:2
6:2
6:2
何をしているか
今回は原子の次数を求めた。次数とは、水素以外の置換基の数である。
例えばCCCCCは、両端の炭素は、3つの水素と1つの炭素と結合してることから次数=1である。真ん中の3つの炭素は、両隣の2つの炭素および、2つの水素と結合してるため、次数=2となる。
他にもさまざまな記述子が用意されているため、今後調査していきたい。
参考
どのようなDiscriptorが用意されているかは、以下を参照。
- CDKのJavaDoc