CDK是一个非常优秀的开发工具,几乎综合了化学信息学中所有常用的功能。但是这个工具似乎受众并不是太多,而且教程很少。可能的原因是毕竟它是个开源开发工具,化学工作者们可能对基于这工具的软件产品更有兴趣,因为他们不喜欢开发,喜欢打包的程序。

花了几天的功夫,终于会了几个基本的功能以及概念。在研究的过程中,我也问过别人,有什么方法可以避免沉浸在API中的“方法与类的海洋”。别人回答我,无论怎样,你都必须阅读API。这确实不假,API全面的介绍了每个类、每个方法的使用方法,开始可能觉得不习惯,随着对CDK的熟悉,慢慢也就能够轻松地阅读API了,不再感觉到一头雾水,有点像看英英词典时可能发现自己连注释的内容都看不懂,有生词,把自己绕进去了。

由于本人更喜欢Python,所以就用了Jython这个中间体,既可以享受Python语法的简约之美,又能用到Java扩展包,调用CDK。建议在使用Jython前(如果之前没用过的话),还是多去用Java写代码,调用CDK,看看别人的代码,以免感觉到不适应。

1. IDE环境:Eclipse,Pydev插件,Jython2.5,配置方法类似于

2. 新建Pydev项目,添加CDK的扩展包:

我安装好Pydev插件后,原本新建Java项目的位置自然就变成了Pydev Project,如果没有可以选择Other,然后找到Pydev项目,然后添加源码文件夹src,添加包test,与java类似。添加扩展包的方法也与java类似,打开项目属性,在PyDev-PYTHONPATH选项卡中找到 External Library,点击Add zip/jar/egg,然后选择cdk-*.jar

!

3. 添加PyDev moudle 即可开始开发。

这里介绍几个简单的API功能

1) SmilesParser,用于将SMILES转化成分子

2)IAtomContainer,可以理解为描述分子的类

3)StructureDiagramGenerator,用户产生2维构象

4)Renderer, generator,用于渲染成图片

def create_a_mol():

smiles = ‘OC(=O)c(cccc1)c1OC(=O)C’

smilesParser = SmilesParser(DefaultChemObjectBuilder.getInstance())

molecule = smilesParser.parseSmiles(smiles)

sdg = StructureDiagramGenerator()

sdg.setMolecule(molecule)

sdg.generateCoordinates()

molecule = sdg.getMolecule()

return molecule

这个命令可以得到阿司匹林的分子文件

class StructureComponent(JComponent):

def init(self):

self.molecule = create_a_mol()

#self.match = create_a_SMARTSmatcher(self.molecule)

#self.molecule.setProperty(HighlightGenerator.ID_MAP,get_ids(self.molecule,self.match))

self.generators = ArrayList()

self.generators.add(BasicGenerator())

self.generators.add(BasicSceneGenerator())

#self.generators.add(HighlightGenerator())

self.renderer = AtomContainerRenderer(self.generators,AWTFontManager())

def paintComponent(self,gra):

g2 = gra

g2.setColor(Color.WHITE)

g2.fillRect(0, 0, self.getWidth(), self.getHeight())

drawArea = Rectangle(self.getWidth(), self.getHeight())

self.renderer.setup(self.molecule, drawArea)

self.renderer.paint(self.molecule, AWTDrawVisitor(g2),self.bounds,True)

这个类用于绘制分子的图片,JComponent是一个Java.swing里的包,与JFrame一起用,可以生成图形界面。上面讲JComponent派生,相当于改变图形界面里的一些东西。init中是对render的配置,其实主要就是配置“渲染产生器”。paintComponent就是具体的绘画内容。

最后,在文件的后面写上

if name == ‘main‘:

comp = StructureComponent()

frame = JFrame()

frame.getContentPane().add(comp)

frame.setMinimumSize(Dimension(600,400))

frame.pack()

frame.setVisible(True)

print ‘I love you.’

即可产生一个JFrame的图形界面。

上面注释掉的一些代码是因为源代码中还增加了高亮子结构(乙酰氧基)的功能,这里就不详细介绍,有兴趣的读者可以看源码研究,主要用到了SMARTSQueryTool类。