(Off Topic) Qt下的分子编辑器——Avogadro

右京样一 | 2011/03/27

开源世界是一个大宝库,关键看您是不是耐心地发掘。我所用过的科学方面的软件中gnuplot(绘图)、maxima(代数)、Ghemical(计算化学)等等都是极好极强大的软件。本来我想介绍Kalzium(KDE元素周期表,是我所用过的最棒的元素周期表软件),但一来Kalzium不是非常有趣,二来里面专业词汇多,现在似乎仍有一些翻译问题。故今天先介绍一款叫做Avogadro(居然叫阿伏伽德罗orz)的化学分子编辑器。

学有机化学(以及无机关于晶体、配合物、复杂无机物等)的朋友很多时候可能会因为很难想象复杂的空间结构而感到非常郁闷,这时候最好的办法是找到或者自己构建一个立体结构来看一看。有一些强大的关于计算化学的商业软件可以胜任这个工作,不过往往又贵又复杂,不搞科研的话实在没必要去碰那玩意。而Avogadro这款软件则介于庞大的商业软件和不实用的玩具之间,并且基于Qt,操作简单,实乃研究分子结构之绝佳工具。由于篇幅和本人水平有限,在此仅介绍一些本软件的基本功能,希望引起读者的一些兴趣。

我们先看一下Avogadro的基本界面:

Avogadro界面

Avogadro界面

嗯,由于是我自己调试过的,阁下开始使用时的界面和我的可能不太相同。不过很容易在视图里面调节。基本上最重要的结构都一目了然。工具栏那里从左到右依次是绘制、导航(视角移动)、化学键操作、原子操作、选择、自动旋转、结构优化(计算化学)、测量、对齐等工具。有了它们基本就可以一些基本的原子、分子并且进行一些研究了。

我们先用绘制工具来画一个原子结构。可以指定元素和化学键的类型。这里以一个丙氨酸为例:

绘制选项

绘制选项

绘制分子

绘制分子

嗯……画得似乎有点歪歪扭扭,暂时先不必太关注它的形态。我们只需在这一步保证其在空间上的次序正确以及形态“大体正确”。这里特别要注意的是手性原子,比如这个氨基酸中的alpha碳。如果无法正确创建,可以用导航工具把分子转一转角度。

创建完毕之后,我们可对其进行进一步调节:
(由于原子操作、选择工具都比较简单,在此不再赘述)

化学键调节

化学键调节

这是化学键调节功能,通过这个可以对化学键方向进行精调。之所以在此要调节,是因为后面我们会看到,自动优化功能并不一定得到我们需要的结果,甚至可能得到一些明显不符合逻辑的结果。所以有时我们仍然需要自己设置。

下面进行自动优化:

自动优化设置

自动优化设置

在我这里,Avogadro有个Bug。就是启动后必须再新建一个窗口,然后用新建窗口进行编辑。否则自动优化里面的“力场”将不可选,自然也无法进行计算。

所谓“力场”是指用来描述原子彼此间能量与位置关系的一些近似公式。使用力场计算比使用量子物理规律,进行所谓的“从头计算”要快得多(看看那些@home项目就知道真正要计算一个化学结构有多么困难),并且能得到相对较好的精度。Avogadro中支持使用多种力场。由于我安装了Ghemical,可以使用Ghemical的力场进行计算。

算法这里,“分子动力学xxxK”指的(貌似)是分子在某一绝对温度下的运动状态,不断运算的话可以模拟分子的运动。最速下降和共轭梯度法则都是通过不断向相邻位置搜索得到最稳定结构的能量,但二者得到的结果可能略有不同。

更新步骤数代表计算时每搜多多少步会把结构反映在屏幕上(所以间接代表能量“下降”的速度),这个数字并不是越大越好,因为不同的初始取向可能算出不同的结果。速度调低后,可以边进行计算边拖动某个原子,让其向自己所想的方向优化,防止与自己的构型设想渐行渐远。

之后开始计算,此时会发现屏幕上的分子逐渐改变其形态,此时也可以用原子选择工具进行干预。当能量不再降低时,表示算出了和初始结构最类似的,能量达到极小值(注意未必是最小值)的状态。

键角和键长

键角和键长

有必要的话,还可以测量键长、键角等参数。当然这不仅可以用于计算之后进行测量,也可用于在创建分子初期就使得整个分子尽量接近其原本的状态,保证算出正确的结果。

计算完成后的分子结构

计算完成后的分子结构

 

 

经过这一系列过程之后,我们终于得到了一个令人满意的结果。这时候我们就可以仔细地把玩一番我们自创的分子了。

除了上述这些基本功能外,Avogadro还可以完成一些更加高级的任务,例如创建晶胞,研究分子在不同界面、不同pH等状态下的状态等等,这就有待于阁下自行发掘了。

Tags:

8 FEEDBACKS

Leave a Reply

Your email address will not be published. Required fields are marked *

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).

This site uses Akismet to reduce spam. Learn how your comment data is processed.