2

我尝试运行以下 Tcl 脚本并得到错误:错误 # args: 应该是“set varName ?newValue?”

这是什么意思?

注意:该脚本包含特定于 VMD 程序的术语,例如 mol 和 resid。请无视他们。

#count water molecules between chain A and chain C or between #chain B and chain C


set input_file [open ./name_3_pdb_chain_renamed.dat r]

set data [read $input_file]
set data [split $data "\n"]
close $input_file

set chain_list [lindex $data 0]

cd 7_count_water

set outfile [open count_water3.dat w]


set chain_compare ""

set pdblen [llength $chain_list]

for {set i 0} {$i<$pdblen} {incr i} {
    set pid [lindex [lindex $chain_list $i] 0]

    set len [llength [lindex $chain_list $i]]

    mol load pdb ../2_chain_rename/${pid}_chain_revised.pdb


    mol modstyle 0 top NewCartoon



    if {$len==4} {
        set chain_compare [lappend chain_compare $pid]
    }

    set 11 [atomselect top all]

    set mid [$11 molid]

    mol delete $mid
}




set lll [llength $chain_compare]

for {set j 0} {$j< $lll} {incr j} {

    set pid [lindex $chain_compare $j]

    mol load pdb ../2_chain_rename/${pid}_chain_revised.pdb

    set 11 [atomselect top "chain A and name CA"]

    set res_len [llength [$11 get resid]]

    set res_id [$11 get resid]

    #residue length for chain C
    set ag [atomselect top "chain C and name CA"]
    set ag_len [llength [$ag get resid]]
    set ag_id [$ag get resid]


    #loop water between chain A and chain C
    for {set k 0} {$k<$res_len} {incr k} {

        set water_around_a [atomselect top "{resname HOH and {within 5.0 of {chain A and resid [lindex $res_id $k]} and {within 5.0 of chain C}}} "]


        set water_around_a_resid [$water_around_a get resid]
        set water_around_a_resname [$water_around_a get resname]

        #loop antigen residues around water
        for {set g 0} {$g < $ag_len} {incr g} {

          set ag_around_water [atomselect top "{chain C and resid [lindex $ag_id $g] and {within 5.0 of {resname HOH and {within 5.0 of {chain A and resid [lindex $res_id $k]}}}}} "]

            set ag_around_water resid [$ag_around_water get resid]

            set ag_around_water_resname [$ag_around_water get resname]


            puts $outfile "$pid [lindex $res_id $k] [lindex [$11 get resname] $k] $ag_around_water_resname A: $water_around_a_resname"
       }
    }



    set b11 [atomselect top "chain B and name CA"]

    set b_res_len [llength [$b11 get resid]]

    set b_res_id [$b11 get resid]

    #residue length for chain C
    set ag [atomselect top "chain C and name CA"]
    set ag_len [llength [$ag get resid]]
    set ag_id [$ag get resid]

    for {set k 0} {$k<$res_len} {incr k} {


        set water_around_b [atomselect top "{resname HOH and {within 5.0 of {chain B and resid [lindex $b_res_id $k]} and {within 5.0 of chain C}}} "]

        set water_around_b_resid [$water_around_b get resid]
        set water_around_b_resname [$water_around_b get resname]

        #loop antigen residues around water
        for {set g 0} {$g < $ag_len} {incr g} {

             set ag_around_water [atomselect top "{chain C and resid [lindex $ag_id $g] and {within 5.0 of {resname HOH and {within 5.0 of {chain B and resid [lindex $b_res_id $k]}}}}} "]


            set ag_around_water resid [$ag_around_water get resid]

            set ag_around_water_resname [$ag_around_water get resname]

            puts $outfile "$pid [lindex $b_res_id $k] [lindex [$b11 get resname] $k] $ag_around_water_resname A: $water_around_b_resname"


        }

    }

}


close $outfile

cd ..

谢谢

4

2 回答 2

7

那条信息:

错误 #args: 应该是“set varName ?newValue?”

是当内置命令获取错误数量的要评估的参数时引发的标准错误。在这种情况下,它来自set命令,表明您要么set自己说了,要么给它两个以上的参数。

如果您检查堆栈跟踪(通常在使用 standard 时打印错误消息tclsh,尽管它可以通过用户代码进行更改),那么您会被告知问题发生在哪里。但是,在这种情况下,我们可以查看并看到靠近脚本底部的这一行:

            set ag_around_water resid [$ag_around_water get resid]

变量名中有一个空格而不是下划线。现在,空格在变量名中是合法的,但是变量名需要被引用,这可能会有点烦人。通常最好避免这样使用它们。没有引用,Tcl 不知道那是一个词。通用解析层决定那里确实有四个词(set,ag_around_waterresidcomplex [$ag_around_water get resid])并告诉set处理它,它不喜欢。

请记住,Tcl 的通用句法分析首先发生,然后命令参数被语义解释。总是。

于 2015-12-04T22:36:27.020 回答
3

该行set ag_around_water resid [$ag_around_water get resid]需要更改。你可能想要ag_around_water_resid

于 2015-12-04T19:34:54.427 回答