计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1575|回复 Reply: 5
打印 Print 上一主题 Last thread 下一主题 Next thread

[VMD] 怎么修改脚本可以导出显示粒子运动轨迹及原分子为pdb文件

[复制链接 Copy URL]

71

帖子

0

威望

694

eV
积分
765

Level 4 (黑子)

显示粒子运动轨迹的VMD脚本
http://sobereva.com/65


在利用上面方法绘制出一个原子的轨迹后,如下图,怎么修改脚本可将图中红色轨迹以及原始的分子导出一个pdb文件?以便之后可以直接导入这个pdb观看整个原分子构型和红色轨迹。



20150609214054_20186.gif (11.91 KB, 下载次数 Times of downloads: 30)

20150609214054_20186.gif

313

帖子

2

威望

3905

eV
积分
4258

Level 6 (一方通行)

2#
发表于 Post on 2023-6-13 23:12:53 | 只看该作者 Only view this author
本帖最后由 lyj714 于 2023-6-13 23:15 编辑

我记得你之前sob老师不是回复过你吗。直接输出成xyz格式,顶多改一下原子数目。不要自己puts成pdb格式,因为pdb格式的每一列和列宽是有严格定义的,如果你不了解输出的pdb格式就不对。

71

帖子

0

威望

694

eV
积分
765

Level 4 (黑子)

3#
 楼主 Author| 发表于 Post on 2023-6-14 10:03:51 | 只看该作者 Only view this author
lyj714 发表于 2023-6-13 23:12
我记得你之前sob老师不是回复过你吗。直接输出成xyz格式,顶多改一下原子数目。不要自己puts成pdb格式,因 ...

是呀,自己尝试写了一个没搞定,如下,还请不吝赐教。多谢!
proc showtrj {fps1 fps2 space selection output} {
    set selnow [atomselect top $selection frame $fps1]
    set selnext [atomselect top $selection frame $fps1]
    set num [$selnow num]
   
    set outfile [open $output w]
   
    for {set fps $fps1} {$fps < $fps2} {incr fps $space} {
        $selnow frame $fps
        $selnext frame [expr $fps + $space]
        $selnow update
        $selnext update
        
        puts $outfile "MODEL        $fps"
        for {set i 0} {$i < $num} {incr i 1} {
            set x [lindex [$selnext get x] $i]
            set y [lindex [$selnext get y] $i]
            set z [lindex [$selnext get z] $i]
            set atomname [lindex [$selnext get name] $i]
            set resid [lindex [$selnext get resid] $i]
            set segname [lindex [$selnext get segname] $i]
            draw line [lindex [$selnow get {x y z}] $i] [lindex [$selnext get {x y z}] $i]
            draw sphere [lindex [$selnext get {x y z}] $i] radius 0.12
            puts $outfile "ATOM  $i  $atomname  $segname  $resid  $x  $y  $z  1.00  0.00"
        }
        puts $outfile "ENDMDL"
        
        puts "Frame $fps done"
    }
   
    close $outfile
}

313

帖子

2

威望

3905

eV
积分
4258

Level 6 (一方通行)

4#
发表于 Post on 2023-6-14 10:38:51 | 只看该作者 Only view this author
本帖最后由 lyj714 于 2023-6-14 10:41 编辑
landian666 发表于 2023-6-14 10:03
是呀,自己尝试写了一个没搞定,如下,还请不吝赐教。多谢!
proc showtrj {fps1 fps2 space selection  ...
  1. puts $outfile "ATOM  $i  $atomname  $segname  $resid  $x  $y  $z  1.00  0.00"
复制代码

这就有问题啊,我前面都已经说了你不要出输出pdb,你这根本就是错误的pdb格式,根本没有按照标准的pdb格式输出,你为什么还要用。


71

帖子

0

威望

694

eV
积分
765

Level 4 (黑子)

5#
 楼主 Author| 发表于 Post on 2023-6-14 13:13:25 | 只看该作者 Only view this author
lyj714 发表于 2023-6-14 10:38
这就有问题啊,我前面都已经说了你不要出输出pdb,你这根本就是错误的pdb格式,根本没有按照标准的pdb ...

proc showtrj {fps1 fps2 space selection output} {
set selnow [atomselect top $selection frame $fps1]
set selnext [atomselect top $selection frame $fps1]
set num [$selnow num]

set outfile [open $output w]

for {set fps $fps1} {$fps < $fps2} {incr fps $space} {
    $selnow frame $fps
    $selnext frame [expr $fps + $space]
    $selnow update
    $selnext update

    puts $outfile "$num"
    puts $outfile "Frame $fps"
    for {set i 0} {$i < $num} {incr i 1} {
        set x [lindex [$selnext get x] $i]
        set y [lindex [$selnext get y] $i]
        set z [lindex [$selnext get z] $i]
        set atomname [lindex [$selnext get name] $i]

        draw line [lindex [$selnow get {x y z}] $i] [lindex [$selnext get {x y z}] $i]
        draw sphere [lindex [$selnext get {x y z}] $i] radius 0.12

   
        puts $outfile "$atomname $x $y $z"
    }
    puts $outfile ""

    puts "Frame $fps done"
}

close $outfile

}

修改了一下如上,现在的问题是
1、没有把每一个红色的轨迹点都输出,只输出了一部分。
2、没有输出轨迹红点间的连线。
3、没有输出原始的分子构型。

想请教一下还需如何修改可以解决上述三个问题,感谢!!!

71

帖子

0

威望

694

eV
积分
765

Level 4 (黑子)

6#
 楼主 Author| 发表于 Post on 2023-6-15 16:36:32 | 只看该作者 Only view this author
landian666 发表于 2023-6-14 13:13
proc showtrj {fps1 fps2 space selection output} {
set selnow [atomselect top $selection frame $fp ...

修改了一下脚本,可以成功导出每一个轨迹点的xyz格式的文件,方便作图和测量,供大家参考。

用法为:showtrj 0 1001 10 "resname LIG and name O1" "/path/1.xyz”
可以导出LIG上O1所有的轨迹点。

proc showtrj {fps1 fps2 space selection output} {
    set selnow [atomselect top $selection frame $fps1]
    set num [$selnow num]

    set outfile [open $output w]

    puts $outfile [expr {$num *(int(($fps2 - $fps1) / $space) + 1)}]
    puts $outfile "Merged Frame"

    for {set i 0} {$i < $num} {incr i 1} {
        set x [lindex [$selnow get x] $i]
        set y [lindex [$selnow get y] $i]
        set z [lindex [$selnow get z] $i]
        set atomname [lindex [$selnow get name] $i]
        puts $outfile "$atomname $x $y $z"
    }

    for {set fps [expr $fps1 + $space]} {$fps < $fps2} {incr fps $space} {
        $selnow frame $fps
        $selnow update

        for {set i 0} {$i < $num} {incr i 1} {
            set x [lindex [$selnow get x] $i]
            set y [lindex [$selnow get y] $i]
            set z [lindex [$selnow get z] $i]
            set atomname [lindex [$selnow get name] $i]
            puts $outfile "$atomname $x $y $z"
        }
    }

    close $outfile
    puts "Merged frame generated."
}

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-2-25 19:34 , Processed in 0.306057 second(s), 23 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list