0

我有一个 229 个残基蛋白质,我需要从残基 1-12 的质心(单独)测量到每个其他原子,从残基 13 开始,我也需要每个帧。到目前为止我有这个

set pro [atomselect top "resid 1 and not water and not ion"] 
set atom [atomselect top "index 207"] 
set nf [molinfo top get numframes] 
set outfile [open test207.dat w] 
for {set i 0} {$i < $nf} {incr i} { 
    puts "frame $i of $nf" 
    $pro frame $i 
    $atom frame $i 
    set com1 [measure center $pro weight mass] 
    set com2 [measure center $atom weight mass] 
    set distance [veclength [vecsub $com1 $com2]] 
    puts $outfile "$i $distance" 
}

这在一定程度上可以测量残基 13 的第一个原子与所有帧的残基 1 的 com 之间的距离,但我不确定如何放置第二个循环,该循环将为每个原子循环,而不是运行脚本数千次(每次更改原子数)导致数千个文件。

有没有办法在同一个脚本中循环每个原子和每个帧?

4

2 回答 2

0

通常这是你放置两个循环的方式......

for (set j 0} {$j < $..} {incr j} {
   for {set i 0} {$i < $nf} {incr i} { 

   };   # inner loop ends
};      # outer loop ends
于 2013-03-08T14:03:54.590 回答
0

这是你想做的事情吗?

for {set resid 1} {$resid < 10} {incr resid} {
    set atomkey [format "resid %d and not water and not ion" $resid]
    puts $atomkey

    set filename [format "test%d.dat" $resid]
    set outfile [open $filename w] 

    # Do stuff
    close $outfile

}

这导致atomkeyfilename构建了嵌入其中的残差值。因此,这种技术将允许您创建密钥字符串和文件名。如果您不能使用 for 循环生成值,那么您还可以查看 foreach 循环:

foreach resid [list 1 2 4 6 7 99 12] {
    set atomkey [format "resid %d and not water and not ion" $resid]
    puts $atomkey
}

您可以仅使用 set 构建复合值,但我喜欢使用格式,因为我本质上是一名 C 程序员。

set atomkey "resid $resid and.."
于 2013-03-08T14:51:43.000 回答