Ошибка Tcl: неправильно # args: должно быть "set varName? NewValue?"

Я попытался запустить следующий сценарий Tcl и получил ошибку: неправильно # args: должно быть "set varName? NewValue?"

Что это значит?

Примечание. Сценарий включает в себя термины, относящиеся к программе VMD, такие как мол и остаток. Пожалуйста, не обращайте на них внимания.

#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 ..

Спасибо

2 ответа

Решение

Это сообщение:

неправильно # args: должно быть "set varName?newValue?"

стандартная ошибка, возникающая, когда встроенная команда получает неверное количество аргументов для оценки. В этом случае это исходит от set команда, и указывает, что вы либо сказали set сам по себе, или дал более двух дополнительных аргументов.

Если вы исследуете трассировку стека (обычно выводится сообщение об ошибке при использовании стандартного tclsh, хотя это можно изменить с помощью пользовательского кода), тогда вам сообщат, где возникла проблема. Тем не менее, в этом случае мы можем просмотреть и увидеть эту строку в нижней части скрипта:

            set ag_around_water resid [$ag_around_water get resid]

имеет то, что кажется пробелом вместо подчеркивания в имени переменной. Теперь пробелы допустимы в именах переменных, но тогда имя переменной нужно заключать в кавычки, и это может немного раздражать. Обычно лучше всего избегать их использования. Без цитирования Tcl не знает, что это должно быть одно слово; общий слой анализа решает, что там действительно четыре слова (set, ag_around_water, resid и комплекс [$ag_around_water get resid]) и рассказывает set иметь дело с тем, что ему не нравится.

Помните, что общий синтаксический синтаксический анализ Tcl происходит в первую очередь, прежде чем аргументы команды будут интерпретированы семантически. Всегда.

Линия set ag_around_water resid [$ag_around_water get resid] должен быть изменен. Вы, вероятно, хотите ag_around_water_resid вместо.

Другие вопросы по тегам