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类。
运行结果如下: