Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@kimisyo

CDK(Chemical Development Toolkit)でSMILESを生成する

はじめに

SDFファイルを読み込んでSMILESに吐き出すプログラムを作成した。併せてSMILES生成のオプションについても確認した。

環境

  • Windows 10
  • Java 11
  • CDK 2.2

ソースコード

以下のソースでできた。

Sdf2Smiles.java
import org.openscience.cdk.DefaultChemObjectBuilder;
import org.openscience.cdk.smiles.SmiFlavor;
import org.openscience.cdk.smiles.SmilesGenerator;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;

public class Sdf2Smiles {

    public static void main(String args[]){

        if(args.length!=1){
            System.err.println("Sdf2Smiles <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();
                try {
                    // sg.setUseAromaticityFlag(true);
                    String can = sg.create(acm.removeHydrogens(mol));
                    System.out.printf("%s\t%s\n", can, id);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }

        } catch (IOException 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();
                }
            }
        }
    }
}

結果はこんな感じ。

CCCCC   n-pentane
C1CCCC1 cyclopentane
CCCCCC  n-hexane
CCCC(C)C    2-methylpentane
CCC(C)(C)C  2,2-dimethylbutane
C1CCCCC1    cyclohexane
C1CCCC1C    methylcyclopentane
CCCCCCC n-heptane
C1CCCCC1C   methylcyclohexane
CCCCCCCC    n-octane

SMILES生成オプションについて

SmilesGeneratorのコンストラクタの引数によって、SMILESの生成方法を指定できる。

オプション Canonical 同位体または立体性をエンコード
SmiFlavor.Generic × ×
SmiFlavor.Unique ×
SmiFlavor.Isomeric ×
SmiFlavor.Absolute

上は代表的なものであるが、SmiFlavor.Stereoや、SmiFlavor.AtomicMass等により詳細なオプションを指定することも可能である。さらに、SmiFlavor.UseAromaticSymbolsによってAromatic記号を使うかどうかも指定できる。もっとも各原子が芳香環に属するかどうかは、IAtom#setIsAromatic等によって明示的に指定する必要がありそうだ。(そこが最も面倒なところなのだが。。)

参考文献

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What is going on with this article?