0

我是 PyMOL 的新手,我正在尝试编写一个 python 脚本来生成一个 .txt 文件并将 PyMOL 命令输出保存到它。假设它有一个包含 pdb 文件名称的数组和一个将每个文件与某个特定蛋白质对齐的 for 循环:

pdb = ["191L", "192L", "193L", "194L"]

cmd.fetch("190L")

for i in pdb:
cmd.fetch(i)
cmd.align(i, "190L")

PyMOL 将计算每个对齐的 RMSD。如何编写脚本以获取每个 RMSD 并将其保存到文本文件中?

这是我到目前为止所拥有的:

def get_rmsd():

cmd.fetch("190L")
for i in pdb:
   cmd.fetch(i)
   output = open("rmsd.txt", "w")
   data = cmd.align(i, "190L")
   data = str(data)
   output.write(data)
   stored.f.close()

当我在 PyMOL 上调用该函数时,它会按预期方式获取并对齐文件,但不会创建文本文件。

4

3 回答 3

0
for i in pdb:
   cmd.fetch(i)
   output = open("rmsd.txt", "w")
   data = cmd.align(i, "190L")
   data = str(data)
   output.write(data)
   stored.f.close()

尝试:

for i in pdb:
   cmd.fetch(i)
   output = open("rmsd.txt", "a")
   data = cmd.align(i, "190L")
   output.write("%s\n" % data)
   output.close()

应该做的工作

于 2021-06-02T16:43:50.217 回答
0

我不会使用这个pymol.Scratch_Storage类。我会保持简单并执行以下操作:

  1. 创建一个新文件“test.py”

  2. 复制以下内容:

    from pymol import cmd
    import os
    
    
    def get_rmsd(pdbs, align_to):
        # a bit more reusable
        cmd.fetch(align_to)
        with open("rmsd.txt", "w") as w:
            # using context management will close the rmsd.txt automatically
            for pdb in pdbs:
                cmd.fetch(pdb)
                line = cmd.align(pdb, align_to)
                w.write(f"{line}\n")
    
        print(f"outfile: {os.path.join(os.getcwd(), 'rmsd.txt')}")
    
    
    get_rmsd(["191L", "192L", "193L", "194L"], "190l")
    
  3. 从 PyMOL 终端运行脚本:run test.py

于 2020-08-25T10:38:42.197 回答
0

想出了我自己问题的答案,解决方案非常简单,哈哈。

将变量分配给每个所需的输出,例如:

output = cmd.align("190L", "191L")

按原样在 PyMOL 中运行脚本,然后将 python 代码逐行输入其中,以“python”开头并以“python end”结束。就我而言,类似:

python
with open("rmsd.txt", "w") as f:
   f.write(output)
f.close()
python end

一个非常基本的例子,但这就是它的要点。

于 2020-08-29T18:46:00.317 回答