1

我一直在尝试使用 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 Radius。

谢谢你,哈维尔

4

1 回答 1

1

您正在构建一个作为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 年发布。只是有点过时了。

幸运的是,Tcler 的 Wiki 页面eval{*}仍然展示了构建列表并将其用作 的参数的历史替代方案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
于 2021-10-08T05:09:52.033 回答