2013-03-08 103 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