2017-04-26 10 views
0

私はしばらくベクトルを抽出するために使用していたtclスクリプトが突然動作を停止しましたが、なぜ私は確信しています。また、エラーも意味をなさないと思われます。無効なコマンド名 ""のエラー

私が実行しているコードは次のとおりです。私が受けた

for {set resd 501} {$resd < 502} {incr resd 1} { 
set basefile1 "CCvector$resd" 

set workdir [pwd] 
set nf [molinfo top get numframes] 

set fil [open $basefile1.dat w] 

for {set frame 0} {$frame < $nf} {incr frame 1} { 
    animate goto $frame 
    display update ui 
    set c1 [atomselect top "name C1 and resid $resd and resname G130"] 
    set c3 [atomselect top "name C3 and resid $resd and resname G130"] 
    set c1c [$c1 get {x y z} ] 
    set c3c [$c3 get {x y z} ] 
    set c1c3x [expr [$c3 get x]-[$c1 get x]] 
    set c1c3y [expr [$c3 get y]-[$c1 get y]] 
    set c1c3z [expr [$c3 get z]-[$c1 get z]] 
    set st [expr $frame] 
    puts $fil [list $st $c1c3x $c1c3y $c1c3z ] 
    $c3 delete 
    $c1 delete 
} 
close $fil 

元のエラーが「 @でオペランドがありません」でした、しかし、私はコードの部分になる置き換え:

for {set frame 0} {$frame < $nf} {incr frame 1} { 
    animate goto $frame 
    display update ui 
    set c1 [atomselect top "name C1 and resid $resd and resname G130"] 
    set c3 [atomselect top "name C3 and resid $resd and resname G130"] 
    set c1x [$c1 get x] 
    set c3x [$c3 get x] 
    set c1c3x [expr [$c3x - $c1x]] 
    set c1y [$c1 get y] 
    set c3y [$c3 get y] 
    set c1c3y [expr [$c3y - $c1y]] 
    set c1z [$c1 get z] 
    set c3z [$c3 get z] 
    set c1c3z [expr [$c3z - $c1z]] 
    set st [expr $frame] 
    puts $fil [list $st $c1c3x $c1c3y $c1c3z ] 
    $c3 delete 
    $c1 delete 
} 
close $fil 

これではなく、「無効なコマンド名」エラーが表示されています。どこが間違っていますか?

追加情報:。で、私は

答えて

3

にロードされたGROMACS軌道から座標を抽出するためにVMDを使用して、これを実行している:あなたは-$c3zコマンドを実行しようとしているのだ

set c1c3z [expr [$c3z - $c1z]] 

と引数として$c1zの内容を返します(そして、その戻り値をexprの引数として渡します)。

コードの以前のバージョンと同等であるために、それは次のようになります。しかし

set c1c3z [expr $c3z - $c1z] 

$c3zは(そうでない数)空のようですから、あなたはおそらくより多くの問題を抱えています。コメントでドナルにより示唆されるように、あなたが代わりに書いた場合

$ tclsh <<< 'expr " - "' 
missing operand at [email protected]_ 
in expression " - [email protected]_" 

expr" - "式を評価し、あなたが戻って見になります意味$c3z$c1zが最も可能性の高い空の状態でここ

、 :

set c1c3z [expr {$c3z - $c1z}] 

代わりに、その後、リテラル$c3z - $c1zexprに渡されるとexprはあなたに多くの有益なエラーを与えることができるだろうメッセージには、それを評価しようとする:

$ tclsh <<< 'set a ""; expr {$a - $a}' 
can't use empty string as operand of "-" 

expr TCL man pageはあなたにそれがそれに{} -enclosed式を渡すことが一般的に好ましいのです理由として、より多くの情報が得られます。

+0

さらに、 'c1c3z [expr {$ c3z - $ c1z}]'を設定すれば、あらゆる種類のトラブルを避け、より高速なコンパイルが可能になります。 –

+0

@Donal、良い点。編集を参照してください。 –

関連する問題