天天看點

Chemistry Development Kit (CDK)原子類型、描述、分子式和子結構搜尋

文章目錄

    • 介紹
    • 示例代碼
      • 建立一個分子對象并輸出其SMILES表示
      • 使用CDK進行分子子結構搜尋
      • 化學反應預測
      • 摩爾品質計算
      • 化學圖像生成
    • 應用案例

介紹

CDK(Chemistry Development Kit)是一個開源的Java化學資訊學工具包,提供了分子的計算機表示和分子資訊學操作的方法,包括分子的描述、圖形化的分子編輯、分子資料庫查詢、分子特征描述符生成、分子結構搜尋、化學反應預測和化學圖像生成等功能。

CDK由德國國家研究中心資訊技術研究所(Fraunhofer Institute for Algorithms and Scientific Computing)和Unilever Center for Molecular Science Informatics(UCMSI)等機構共同開發和維護,遵循LGPL協定,可以免費使用和修改。

CDK的特點包括:

  • 基于Java語言,可以跨平台運作;
  • 提供豐富的分子描述符、化學反應和結構搜尋等算法;
  • 支援SMILES、InChI等分子格式的輸入和輸出;
  • 可以通過外部程式接口(API)擴充自定義功能;
  • 提供了圖形使用者界面(GUI)工具,友善使用者使用。

    CDK已經成為化學資訊學領域廣泛使用的工具之一,被許多研究機構和企業用于分子的計算機表示和分子資訊學分析。

示例代碼

建立一個分子對象并輸出其SMILES表示

// 導入CDK包
import org.openscience.cdk.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.*;
import org.openscience.cdk.io.formats.*;
import java.io.*;

public class CDKExample {
    public static void main(String[] args) throws Exception {
        // 建立一個分子對象
        IAtomContainer mol = new AtomContainer();
        // 添加原子
        IAtom c = new Atom("C");
        mol.addAtom(c);
        IAtom h1 = new Atom("H");
        mol.addAtom(h1);
        IAtom h2 = new Atom("H");
        mol.addAtom(h2);
        IAtom h3 = new Atom("H");
        mol.addAtom(h3);
        // 添加鍵
        IBond b1 = new Bond(c, h1, IBond.Order.SINGLE);
        mol.addBond(b1);
        IBond b2 = new Bond(c, h2, IBond.Order.SINGLE);
        mol.addBond(b2);
        IBond b3 = new Bond(c, h3, IBond.Order.SINGLE);
        mol.addBond(b3);
        // 輸出SMILES表示
        SmilesGenerator sg = new SmilesGenerator();
        String smiles = sg.create(mol);
        System.out.println(smiles);
    }
}

           

使用CDK進行分子子結構搜尋

// 導入CDK包
import org.openscience.cdk.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.*;
import org.openscience.cdk.io.formats.*;
import org.openscience.cdk.isomorphism.*;
import org.openscience.cdk.smiles.*;
import java.io.*;

public class CDKExample {
    public static void main(String[] args) throws Exception {
        // 建立一個分子對象
        SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance());
        IAtomContainer mol = sp.parseSmiles("CC(=O)Oc1ccccc1C(=O)O");
        // 建立一個查詢分子對象
        IQueryAtomContainer query = sp.parse("c1ccccc1");
        // 建立一個子結構搜尋器
        UniversalIsomorphismTester uit = new UniversalIsomorphismTester();
        boolean isSubstructure = uit.isSubgraph(mol, query);
        System.out.println(isSubstructure);
    }
}

           

化學反應預測

// 建立反應對象
IReaction reaction = new Reaction();

// 向反應中添加反應物
IAtomContainer reactant1 = new Molecule();
// 添加原子和鍵到reactant1
reaction.addReactant(reactant1);

// 向反應中添加反應物
IAtomContainer reactant2 = new Molecule();
// 添加原子和鍵到reactant2
reaction.addReactant(reactant2);

// 定義反應條件
Map<Object, Object> properties = new HashMap<>();
// 設定反應條件的屬性

// 進行反應預測
IReactionPredictor predictor = ReactionPredictorFactory.getInstance().createPredictor(ReactionPredictor.class);
List<IReaction> products = predictor.predict(reaction, properties);

// 輸出反應産物
for (IReaction product : products) {
    for (IAtomContainer molecule : product.getProducts()) {
        System.out.println(new SmilesGenerator().create(molecule));
    }
}

           

摩爾品質計算

import org.openscience.cdk.formula.MolecularFormula;
import org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator;

public class MoleculeMassCalculator {
    
    public static void main(String[] args) {
        
        // Define a molecular formula for caffeine
        String formula = "C8H10N4O2";
        
        // Create a MolecularFormula object
        MolecularFormula molecularFormula = MolecularFormulaManipulator.getMolecularFormula(formula);
        
        // Calculate the monoisotopic mass
        double mass = MolecularFormulaManipulator.getMonoisotopicMass(molecularFormula);
        
        // Print the result
        System.out.println("The monoisotopic mass of " + formula + " is " + mass + " Da.");
    }
}

           

化學圖像生成

// 建立分子對象
IAtomContainer molecule = new Molecule();
// 向分子中添加原子和鍵

// 建立2D渲染器
Renderer2D renderer = new Renderer2D();

// 渲染分子
IAtomContainerSet set = new AtomContainerSet();
set.addAtomContainer(molecule);
renderer.setup(set);
renderer.paint(set);

// 儲存渲染後的圖像
BufferedImage image = renderer.getImage();
ImageIO.write(image, "png", new File("molecule.png"));

           

應用案例

以下是更多的CDK案例:

  • 分子描述和計算化學性質:CDK可以用于計算分子的實體化學性質,如分子量、表面積、藥效團、分子極性等,并生成分子描述符用于分子描述和分類。
  • 藥物設計:CDK可以用于藥物分子設計,包括藥效團分析、構象生成、分子對接、QSAR/QSPR模組化等。
  • 化學資訊學:CDK可以用于從化學結構資料庫中提取化合物資訊,包括化合物屬性、相似性搜尋、互補性搜尋等。
  • 化學圖像生成:CDK可以用于生成化學結構圖像,支援多種圖像格式,如SVG、PNG等。
  • 化學反應預測:CDK可以用于預測化學反應,包括反應物和生成物的結構預測、反應路徑預測等。
  • 分子動力學模拟:CDK可以用于分子動力學模拟,包括分子結構優化、分子動力學模拟、分子軌迹分析等。
  • 分子可視化:CDK可以用于分子可視化,包括分子三維結構可視化、分子動畫、分子編輯等。
  • 分子資料庫建構:CDK可以用于建構分子資料庫,包括分子結構資料存儲、查詢和檢索等。

這些案例展示了CDK在計算化學、藥物設計、化學資訊學等領域的應用,說明了CDK在化學研究和開發中的重要性和實用性。