请选择 进入手机版 | 继续访问电脑版

分子模拟论坛 Molecular Simulation Forums

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 214|回复: 9

用vmd的dcdplugin插件来分析dcd文件

[复制链接]

31

主题

205

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
发表于 2011-6-30 17:13:00 | 显示全部楼层 |阅读模式
vmd给我们提供了非常好的tcl脚本分析的功能,我们几乎可以用tcl脚本分析所有的模拟结果,但是tcl毕竟是脚本语言,天生比较慢,如果分析的数据比较大,计算比较复杂(尤其是多重的循环迭代的时候),tcl脚本的运行速度会叫人疯掉的,即便是用上bigdcd.tcl脚本或者手动指定读入删除的帧数也无法根本解决tcl运行慢的问题。如果直接用C或者fortran这样的高级语言来编写分析程序运行速度会快很多,虽然网上有提供二进制dcd文件的数据格式和可能可以使用的读取dcd头的fortran代码,但是对于我这种只读过谭浩强的C语言编程基础的菜鸟来讲无法直接用得上。最近把vmd的源码中专门读取dcd文件的dcdplugin.c程序大致看了一下,取出其中必要的文件,在高手的指点下加上一两句宏定义取消掉不必要的宏的功能,就可以直接用c编译器编译出来一个可以读取dcd文件的程序了,在这里和各位NAMD的同行分享,希望能够为大家的工作提供一些帮助。
dcdplugin所涉及到的所有文件是下列几个:
main函数所在的 dcdplugin.c
其他的头文件:   fastio.h
          endianswap.h
          vmdplugin.h
          molfile_plugin.h
在dcdplugin.c的开头加上这样的一个宏定义:
#define TEST_DCDPLUGIN
以对应后面的#ifdef TEST_DCDPLUGIN开始的宏,因为main函数在这个宏当中。
这样这个程序就能直接被编译了。
最主要的语句是dcdplugin.c的第1130行:
printf("fr=%8did=%8d, x=%10.3f y=%10.3f z=%10.3f \n",i,j,timestep.coords[j*3],timestep.coords[j*31],timestep.coords[j*32]);
这句可以输出dcd文件中第i帧,第j个原子的x,y,z坐标,所以通过这句就能知道如何读取dcd中的所有坐标了。所有的修改可以根据这句对比着写。
回复

使用道具 举报

42

主题

336

帖子

720

积分

高级会员

Rank: 4

积分
720
发表于 2011-7-6 10:46:00 | 显示全部楼层
支持。。。。
回复

使用道具 举报

29

主题

162

帖子

359

积分

中级会员

Rank: 3Rank: 3

积分
359
发表于 2011-7-6 15:28:00 | 显示全部楼层

Amber里面也有读取dcd文件的程序
回复

使用道具 举报

8

主题

68

帖子

150

积分

注册会员

Rank: 2

积分
150
发表于 2011-7-16 01:52:00 | 显示全部楼层
收益非浅
回复

使用道具 举报

173

主题

2919

帖子

6017

积分

论坛元老

Rank: 8Rank: 8

积分
6017
发表于 2011-10-8 09:58:00 | 显示全部楼层
提供一个精简版, 只有20余行, 是dcdplugin 的main 函数去掉了处理时间部分.
将这个文件和那一堆放在一起编译就行了#include "dcdplugin.c"
int main(int argc, char *argv[]) {
molfile_timestep_t timestep;
void *v;
dcdhandle *dcd;
int i, j, natoms;
while (--argc) {
  argv;
  natoms = 0;
  v = open_dcd_read(*argv, "dcd", &natoms);
  if (!v) { fprintf(stderr, "main) open_dcd_read failed for file %s\n", *argv); return 1; }
  dcd = (dcdhandle *)v;
  timestep.coords = (float *)malloc(3*sizeof(float)*natoms);
  for (i= 0; i nsets; i) {
  if (read_next_timestep(v, natoms, &timestep)) { fprintf(stderr, "error in read_next_timestep on frame %d\n", i); return 1; }
  for (j= 0; j 复制代码
回复

使用道具 举报

11

主题

65

帖子

147

积分

注册会员

Rank: 2

积分
147
发表于 2011-11-1 23:03:00 | 显示全部楼层
仔细研究一下。
回复

使用道具 举报

48

主题

128

帖子

310

积分

中级会员

Rank: 3Rank: 3

积分
310
发表于 2011-11-3 16:25:00 | 显示全部楼层
我想问的是,要阅读的文件名在那里,
或者这样问,如果我的dcd文件叫my.dcd,该替换程序里面的什么东东?因为不懂,所以问题很菜
回复

使用道具 举报

1

主题

14

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2012-4-11 14:43:00 | 显示全部楼层
应该是在v = open_dcd_read(*argv, "dcd", &natoms) 中的*argv变量吧
回复

使用道具 举报

31

主题

92

帖子

221

积分

中级会员

Rank: 3Rank: 3

积分
221
发表于 2012-4-11 16:00:00 | 显示全部楼层
这个超经典,bay兄真是出神入化的人物!
回复

使用道具 举报

1

主题

2

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2017-11-19 18:56:02 | 显示全部楼层
bay__gulf618 发表于 2011-10-8 09:58
提供一个精简版, 只有20余行, 是dcdplugin 的main 函数去掉了处理时间部分.
将这个文件和那一堆放在一起编 ...

你好,我试了一下,好像不行。请问这个精简版是不是少了一部分代码?
回复

使用道具 举报

Archiver|手机版|小黑屋|分子模拟论坛  

GMT+8, 2017-12-13 05:41 , Processed in 0.337777 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表