Tcl列表中不匹配的左引号.VMD MMPBSA错误



我一直在尝试使用CAFE运行MMPBSA计算,但是,当我使用-pb_rad charmm时。VMD在开始执行PB计算时打印以下错误:列表中不匹配的左引号

我怀疑错误来自cafe_mmpsa脚本的以下部分:

if { $pb } {
show -info "Calculating the PB term"
set start [clock seconds]
# assign radii
set ar_args "$currmol $pb_rad"
if { $pb_rad eq "charmm" } {
foreach p $parfile { append ar_args " "$p"" }
} elseif { $pb_rad eq "parm7" } {
append ar_args " "$topfile""
}
eval assign_radii $ar_args
set com_pb_list [calc_pb $currmol com $comsel]
if { $recsel ne "" } {
set rec_pb_list [calc_pb $currmol rec $recsel]
}
if { $ligsel ne "" } {
set lig_pb_list [calc_pb $currmol lig $ligsel]
}
foreach { d h m s } [timer $start] { break }
show -info "It took $d days $h hrs $m min $s sec"
}

但是,我需要帮助确定需要纠正的部分。我希望有人能帮助我或推荐任何其他我可以使用的PB半径。

谢谢你,Javier

您正在构建一个tcl命令字符串,并对其求值。你所做的部分工作是在参数周围添加引号,这可以处理参数中的空格之类的事情,但如果它们本身有引号,你必须采取特殊措施来避免问题。

一个你可能会遇到的事情的演示:

% set demo "list "
list
% append demo ""foo bar""
list "foo bar"
% set x "another "string""
another "string"
% append demo " "$x""
list "foo bar" "another "string""
% eval $demo
extra characters after close-quote

tcl的现代版本中,解决这个问题的简单方法是构建一个参数列表,而不是字符串,并使用{*}展开它:

set ar_args [list $currmol $pb_rad]
if { $pb_rad eq "charmm" } {
lappend ar_args {*}$parfile
} elseif { $pb_rad eq "parm7" } {
lappend ar_args $topfile
}
assign_radii {*}$ar_args

一些快速搜索表明这个VMD程序仍然使用tcl 8.4.1,它是在…2002. 只是有点过时了。

幸运的是,eval上的Tcler的Wiki页面仍然展示了{*}的历史替代方案,它构建一个列表并将其用作eval的参数,依靠字符串化来处理引用问题:

% set demo [list list]
list
% lappend demo ""foo bar""
list {"foo bar"}
% lappend demo $x
list {"foo bar"} {another "string"}
% eval $demo
{"foo bar"} {another "string"}

或者,根据你的代码:

set ar_args [list assign_radii $currmol $pb_rad]
if { $pb_rad eq "charmm" } {
# foreach p $parfile { lappend ar_args $p }
eval [linsert $parfile 0 lappend ar_args] ;# Avoid a loop
} elseif { $pb_rad eq "parm7" } {
lappend ar_args $topfile
}
eval $ar_args

最新更新