Высокая загрузка ЦП, выключения и неверное имя команды 26.774817104116487?

Я запускаю код с помощью консоли tk в VMD (Visual Molecular Dynamics). Первая проблема, с которой я столкнулся, заключалась в том, что код потреблял слишком много вычислительной мощности моего компьютера и приводил к отключению VMD. Я думаю, это потому, что я печатал каждый результат в файл. Мне действительно нужно только посмотреть на результаты, где расстояние меньше 20. Ниже приведен исходный код, который вызывал закрытие VMD:

set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]

set file [open "Contact_map27.dat" w]

set list1 [$seg1 get index]
set list2 [$seg2 get index]

foreach atom1 $list1 {
    foreach atom2 $list2 {
            set index1 [atomselect top "index $atom1"]
            set index2 [atomselect top "index $atom2"]
            set resid1 [[atomselect top "index $atom1"] get resid]
            set resid2 [[atomselect top "index $atom2"] get resid]
            set resnm1 [[atomselect top "index $atom1"] get resname]
            set resnm2 [[atomselect top "index $atom2"] get resname]
 puts $file "$resnm1 $resid1 $resnm2 $resid2 [veclength [vecsub [measure center $index1] [measure center $index2]]]"
            $index1 delete
            $index2 delete
    }
}

close $file

Ниже приведена сделанная мной модификация, которая должна печатать значения только в том случае, если расстояние меньше 20:

set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]

set file [open "Contact_map27.dat" w]

set list1 [$seg1 get index]
set list2 [$seg2 get index]

foreach atom1 $list1 {
    foreach atom2 $list2 {
            set index1 [atomselect top "index $atom1"]
            set index2 [atomselect top "index $atom2"]
            set resid1 [[atomselect top "index $atom1"] get resid]
            set resid2 [[atomselect top "index $atom2"] get resid]
            set resnm1 [[atomselect top "index $atom1"] get resname]
            set resnm2 [[atomselect top "index $atom2"] get resname]
    set dist [[veclength [vecsub [measure center $index1] [measure center $index2]]]]
 if {$dist < 20} {
puts $file "$resnm1 $resid1 $resnm2 $resid2 $dist"}
else {puts $file " "}
            $index1 delete
            $index2 delete
    }
}

close $file

Сообщение об ошибке, которое я получаю, когда запускаю второй код: «Недопустимое имя команды» 26.774817104116487»

Если кто-нибудь может просто дать мне вторую пару глаз и сообщить мне, что происходит, я был бы очень признателен! Заранее спасибо!


person Heather Lynn    schedule 17.02.2015    source источник


Ответы (1)


У вас был дополнительный набор квадратных скобок вокруг вызова veclength.

Вы можете уменьшить количество используемого ЦП, переместив часть кода из внутреннего цикла во внешний цикл. Вызовы, которые зависят только от atom1, не должны находиться во внутреннем цикле.

Вы также можете уменьшить нагрузку на ЦП, используя заданные вами индексные переменные. Переменные не используются, и вызов atomselect повторяется. Я делаю предположение, что он каждый раз возвращает один и тот же индекс.

set seg1 [atomselect top "segname LA0 and name CA"]
set seg2 [atomselect top "segname RA0 and name CA"]

set file [open "Contact_map27.dat" w]

set list1 [$seg1 get index]
set list2 [$seg2 get index]

foreach atom1 $list1 {
    set index1 [atomselect top "index $atom1"]
    set resid1 [$index1 get resid]
    set resnm1 [$index1 get resname]
    foreach atom2 $list2 {
            set index2 [atomselect top "index $atom2"]
            set resid2 [$index2 get resid]
            set resnm2 [$index2 get resname]
    set dist [veclength [vecsub [measure center $index1] [measure center $index2]]]
 if {$dist < 20} {
puts $file "$resnm1 $resid1 $resnm2 $resid2 $dist"}
else {puts $file " "}
            $index2 delete
    }
    $index1 delete
}

close $file
person Brad Lanam    schedule 17.02.2015