2013-03-08 105 views
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所有帧的第一个原子之间的距离的范围内,但我不确定要怎么放第二个循环将循环使用每个原子,而不是每次运行脚本数千次(每次更改原子数)导致数千个文件。

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

+0

你能澄清你的问题吗?你想让所有'puts'进入一个文件吗?你会如何选择原子?你显然正在使用一些我和其他用户不熟悉的Tcl库 - 它是哪一个? – cfi 2013-03-08 14:03:08

+0

我认为某些示例输出(如果可能,使用虚拟值?)会很好理解,以便更容易理解您尝试获得的内容。 – Jerry 2013-03-08 15:49:59

回答

0

通常,这是你如何把两个圈......

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

    }; # inner loop ends 
};  # outer loop ends 
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 
} 

,您只需构建一套使用复合值,但我喜欢用的格式我是C程序员的心脏。

set atomkey "resid $resid and.." 
+0

将单个文件上的内容分解到自己的过程中可能是一个想法。使它更容易理解,修复,测试和类似的东西。 – 2013-03-08 18:27:41