计算化学公社

标题: 聊聊如何让让VMD的提示更人性化(气人),顺带提几句VMD的源码编译 [打印本页]

作者
Author:
ene    时间: 2020-2-25 03:21
标题: 聊聊如何让让VMD的提示更人性化(气人),顺带提几句VMD的源码编译
本帖最后由 ene 于 2020-2-25 11:53 编辑

        用过VMD里头psfgen模块给NAMD搭过模拟体系的人应该都知道,当由于种种原因psfgen出错的时候(比如不识别的氨基酸,segment重复,不小心打错命令等等),这倒霉软件会给你输出一个巨大的错误提示,然后把你整个模拟体系全都扬了(如下图)。由于一般搭体系的时候人都会很暴躁(尤其是反复构建失败/模拟崩溃的时候),所以楼主开始考虑能不能把这个气人的提示给做一些修改,让psfgen看起来有(更)人(气)味(人)一些。
(, 下载次数 Times of downloads: 22) (, 下载次数 Times of downloads: 31)
        首先根据这句错误提示,在vmd软件路径里面进行搜索:
  1. $ grep -ir "MOLECULE DESTROYED"
  2. Binary file plugins/LINUXAMD64/tcl/psfgen2.0/libpsfgen.so matches
复制代码
       可见这句提示的来源是libpsfgen.so,这是psfgen插件的库文件,VMD中psfgen插件的所有功能都要由这个二进制文件提供。如果想魔改提示语,只能从插件的源码下手,再源码编译插件。所以楼主只好下载了VMD的源码进行编译。VMD源码包解压之后分为两部分,分别是vmd-x.x.x和plugins。前者是VMD本体,后者是VMD的各种插件。由于我们并不需要更改VMD本身,所以这时只要编译插件即可。首先楼主先修改了要魔改的代码:psfgen的源码位于plugins/psfgen/src下面,通过grep可以定位到这句提示来自于tcl_psfgen.c这个文件中。打开文件,在对应位置(144行开始)可以看到:
  1. /*
  2. * Kills molecule to prevent user from saving bogus output.
  3. */
  4. void psfgen_kill_mol(Tcl_Interp *interp, psfgen_data *data) {
  5.   if (data->mol) {
  6.     Tcl_AppendResult(interp,
  7.         "\nMOLECULE DESTROYED BY FATAL ERROR!  Use resetpsf to start over.",
  8.         NULL);
  9.   }
  10.   topo_mol_destroy(data->mol);
  11.   data->mol = 0;
  12. }
复制代码
看来是一种保护措施,防止产生bug了。毕竟清掉所有操作重新开始是最安全的。这段代码里面第七行就是输出的错误提示,修改成喜欢的某句话即可。改好之后就可以编译了,这里需要注意的是,如果你用默认的Make-arch文件,psfgen插件是不会被编译的。打开plugins/psfgen/Makefile就可以发现,只有定义了TCL库文件的位置,才会编译出这个插件:
  1. ##
  2. ## Only build psfgen if we have a Tcl library
  3. ##
  4. ifdef TCLLIB
  5. ifdef TCLINC
  6. ifdef TCLLDFLAGS
  7. TARGETS = ${ARCHDIR} ${ARCHDIR}/libpsfgen.so
  8. endif
  9. endif
  10. endif
复制代码
而默认的plugins/Make-arch中,LINUXAMD64(这是楼主以及一般VMD用户的平台)选项中并没有定义TCLLIB和TCLINC:
  1. LINUXAMD64:
  2.         $(MAKE) dynlibs staticlibs bins \
  3.         "ARCH = LINUXAMD64" \
  4.         "COPTO = -fPIC -m64 -o " \
  5.         "LOPTO = -fPIC -m64 -lstdc++ -o " \
  6.         "CC = gcc" \
  7.         "CXX = g++" \
  8.         "DEF = -D" \
  9.         "CCFLAGS = -m64 -O2 -fPIC -Wall" \
  10.         "CXXFLAGS = -m64 -O2 -fPIC -Wall" \
  11.         "TCLLDFLAGS = -ltcl8.5 -ldl" \
  12.         "NETCDFLDFLAGS = -lnetcdf " \
  13.         "AR = ar" \
  14.         "NM = nm -p" \
  15.         "RANLIB = touch" \
  16.         "SHLD = gcc -shared"
复制代码
因此我们需要手动修改一下这个部分为:
  1. LINUXAMD64:
  2.         $(MAKE) dynlibs staticlibs bins \
  3.         "ARCH = LINUXAMD64" \
  4.         "COPTO = -fPIC -m64 -o " \
  5.         "LOPTO = -fPIC -m64 -lstdc++ -o " \
  6.         "CC = gcc" \
  7.         "CXX = g++" \
  8.         "DEF = -D" \
  9.         "CCFLAGS = -m64 -O2 -fPIC -Wall" \
  10.         "CXXFLAGS = -m64 -O2 -fPIC -Wall" \
  11.         "TCLLIB = -L/path/to/libtcl8.6.so" \
  12.         "TCLINC = -I/path/to/tcl.h" \
  13.         "TCLLDFLAGS = -ltcl8.6 -ldl" \
  14.         "NETCDFLDFLAGS = -lnetcdf " \
  15.         "AR = ar" \
  16.         "NM = nm -p" \
  17.         "RANLIB = touch" \
  18.         "SHLD = gcc -shared"
复制代码
可以看到编译依赖libtcl和libnetcdf,如果没有可以安装一下这两个依赖。最后输入命令编译
  1. $ export PLUGINDIR=$(pwd)/../vmd-x.x.x
  2. $ make LINUXAMD64
  3. $ make distrib
复制代码
随后在vmd-x.x.x目录下会产生一个叫LINUXAMD64的文件夹,我们编译的psfgen插件就位于LINUXAMD64/tcl/psfgen2.0中了。你可以把这个文件夹拷贝到你的VMD安装目录下:/path/to/vmd-x.x.x/plugins/LINUXAMD64/tcl/,替换掉原先的psfgen2.0文件夹。这时再启动vmd,就可以看到错误提示变成了我们所修改的(这里楼主把resetpsf的提示也一起修改了):
(, 下载次数 Times of downloads: 31)
终端下也一样:
(, 下载次数 Times of downloads: 37)
如果你也是Linux用户,可以在这里下载楼主编译的版本,替换到你的VMD目录中:

(, 下载次数 Times of downloads: 10)
Enjoy!





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3