0

229残基のタンパク質があり、残基1〜12の質量中心から(個別に)1つおきの原子まで、残基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 までの距離を測定する範囲で機能していますが、すべての原子に対してループする 2 番目のループを配置する方法についてはわかりません。スクリプトを何千回も実行して(毎回アトム番号を変更して)、何千ものファイルが生成されます。

同じスクリプトで各アトムと各フレームをループする方法はありますか?

4

2 に答える 2

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

}

これにより、atomkeyresidfilenameの値が埋め込まれた状態で構築されます。したがって、このタイプの手法を使用すると、キー文字列とファイル名を作成できます。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 に答える
0

通常、これは2つのループを置く方法です...

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 に答える