Python скрипт для Pymol с пользовательским вводом - PullRequest
1 голос
/ 10 апреля 2020

Я подготовил скрипт для Pymol, который хорошо работает при оценке значений RMSD для списка остатков представляющих интерес белков (целевые остатки генерируются встроенными командами скрипта). Однако я хотел реализовать скрипт, позволяющий пользователю выбирать анализируемые остатки. Я попытался использовать функцию ввода, но она не работает. Поскольку код немного длинный, я постепенно упростил сценарии. Таким образом, я получил следующие два скрипта:

"test.py":

import Bio.PDB
import numpy as np
from pymol import cmd
import os,glob
from LFGA_functions import user_entered

List_tot = user_entered()
print (List_tot)

, который вызывает простую функцию user_entered изнутри My_function.py script:

def user_entered():
    List_res = []
    List_tot = []
    a = input("Please indicate the number of residues to analyze/per monomer:")
    numberRes =int(a)
    for i in range(numberRes):
        Res = input("Please provide each residue NUMBER and hit ENTER:")
        Res1 = int(Res)
        Res2 = Res1+2000
        Res3 = Res1+3000
        Res4 = Res1+4000
        Res5 = Res1+5000
        Res6 = Res1+6000
        List_res = (str(Res1),str(Res2),str(Res3),str(Res4),str(Res5),str(Res6))
        List_tot.append(List_res)
    return List_tot

Скрипт "test.py" хорошо работает, когда выполняется Python (3.7.5, который устанавливается с Pymol 2.3.4, в Windows 7 Prof) из windows командная строка. Пример результата: [первый ввод, указывающий, что будут обрабатываться 2 случая, а затем идентификационный номер для каждого случая] [1]

Однако, когда скрипт запускается из Pymol GUI, я получаю следующее сообщение об ошибке: input (): lost sys.stdin

Кто-нибудь знает, в чем проблема. Очевидно, я очень примитивный Python пользователь ...

Я также хотел бы спросить кое-что, связанное с этой проблемой ... в оригинальном сценарии, который хорошо работает в Pymol, прежде чем пытаться реализовать "ввод" "вариант, я временно храню некоторые данные (имя остатка, тип и цепочку) в виде" набора ". Мне нужен набор, а не список, потому что он автоматически удаляет повторы данных. Однако, когда я пытаюсь запустить его с PYthon (думая о преодолении вышеупомянутой проблемы ввода), он останавливается с сообщением: имя 'close_to_A' не определено. Однако, как показано в части кода, показанной здесь ниже, и действительно работает в Pymol.

...
# Step 3: 
# listing of residues sufficiently close to chainA
# that will be considered in calculation of RMSD during trajectory

cmd.load("%s/%s" %(path3,"Average.pdb"), "Average", quiet=0)
cmd.select("around_A", "Average and chain B+C near_to 5 of chain A")
cmd.select("in_A", "Average and chain A near_to 5 of chain B+C")
close_to_A = set()
cmd.iterate("(around_A)","close_to_A.add((chain,resi,resn))")
cmd.iterate("(in_A)","close_to_A.add((chain,resi,resn))")
cmd.delete("around_A")
cmd.delete("in_A")
...

Как мне определить набор в Python 3? Почему это работает при запуске из Pymol?

Буду очень признателен, если вы поможете мне решить эти две проблемы. Заранее спасибо,

С наилучшими пожеланиями,

Луис

...