我正在VMD(Visual Molecular Dynamics)中使用tk控制台运行一个代码。我遇到的第一个问题是,代码占用了我电脑太多的处理能力,导致VMD关闭。我想这是因为我让它把每个结果都打印到文件中。我真的只需要看看距离小于20的结果。以下是导致VMD关闭的原始代码:
set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]
set file [open "Contact_map27.dat" w]
set list1 [$seg1 get index]
set list2 [$seg2 get index]
foreach atom1 $list1 {
foreach atom2 $list2 {
set index1 [atomselect top "index $atom1"]
set index2 [atomselect top "index $atom2"]
set resid1 [[atomselect top "index $atom1"] get resid]
set resid2 [[atomselect top "index $atom2"] get resid]
set resnm1 [[atomselect top "index $atom1"] get resname]
set resnm2 [[atomselect top "index $atom2"] get resname]
puts $file "$resnm1 $resid1 $resnm2 $resid2 [veclength [vecsub [measure center $index1] [measure center $index2]]]"
$index1 delete
$index2 delete
}
}
close $file
以下是我所做的修改,只应在距离小于20:时打印值
set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]
set file [open "Contact_map27.dat" w]
set list1 [$seg1 get index]
set list2 [$seg2 get index]
foreach atom1 $list1 {
foreach atom2 $list2 {
set index1 [atomselect top "index $atom1"]
set index2 [atomselect top "index $atom2"]
set resid1 [[atomselect top "index $atom1"] get resid]
set resid2 [[atomselect top "index $atom2"] get resid]
set resnm1 [[atomselect top "index $atom1"] get resname]
set resnm2 [[atomselect top "index $atom2"] get resname]
set dist [[veclength [vecsub [measure center $index1] [measure center $index2]]]]
if {$dist < 20} {
puts $file "$resnm1 $resid1 $resnm2 $resid2 $dist"}
else {puts $file " "}
$index1 delete
$index2 delete
}
}
close $file
当我运行第二个代码时,我得到的错误消息是"无效命令名"26.774817104116487"
如果有人能再给我一双眼睛,让我知道发生了什么,我将不胜感激!提前感谢!
在对veclength的调用周围有一组额外的括号。
您可以通过将一些代码从内部循环移到外部循环来减少CPU的使用量。只依赖atom1的调用不需要在内部循环中。
您还可以通过使用您设置的索引变量来减少CPU的数量。不使用变量,并重复"atomselect"调用。我假设它每次都返回相同的索引。
set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]
set file [open "Contact_map27.dat" w]
set list1 [$seg1 get index]
set list2 [$seg2 get index]
foreach atom1 $list1 {
set index1 [atomselect top "index $atom1"]
set resid1 [$index1 get resid]
set resnm1 [$index1 get resname]
foreach atom2 $list2 {
set index2 [atomselect top "index $atom2"]
set resid2 [$index2 get resid]
set resnm2 [$index2 get resname]
set dist [veclength [vecsub [measure center $index1] [measure center $index2]]]
if {$dist < 20} {
puts $file "$resnm1 $resid1 $resnm2 $resid2 $dist"}
else {puts $file " "}
$index2 delete
}
$index1 delete
}
close $file