Python 如何计算具有多个模型/构象的蛋白质的平均结构

Python 如何计算具有多个模型/构象的蛋白质的平均结构,python,pandas,bioinformatics,pandas-groupby,biopython,Python,Pandas,Bioinformatics,Pandas Groupby,Biopython,我有一个PDB文件'1abz'(),包含23种不同模型(编号为模型1-23)的蛋白质结构坐标。请忽略标题备注,有趣的信息从第276行开始,上面写着“模型1” 我想计算一种蛋白质的平均结构。蛋白质的PDB文件包含多个构象/模型,我想计算每个残基的单个原子的平均坐标,这样我就得到了一个构象/模型 我不知道如何用Biopython来计算,所以我试着用Pandas来计算平均坐标。我想我已经设法计算出了平均值,但现在的问题是我有一个csv文件,它不再是PDB格式的,所以我不能将这个文件加载到PyMol中

我有一个PDB文件'1abz'(),包含23种不同模型(编号为模型1-23)的蛋白质结构坐标。请忽略标题备注,有趣的信息从第276行开始,上面写着“模型1”

我想计算一种蛋白质的平均结构。蛋白质的PDB文件包含多个构象/模型,我想计算每个残基的单个原子的平均坐标,这样我就得到了一个构象/模型

我不知道如何用Biopython来计算,所以我试着用Pandas来计算平均坐标。我想我已经设法计算出了平均值,但现在的问题是我有一个csv文件,它不再是PDB格式的,所以我不能将这个文件加载到PyMol中

我的问题是,如何将csv文件转换为PDB格式。更好的是,如何在不影响原始pdb文件格式的情况下获得Biopython或Python中的平均坐标

这是我用来计算熊猫平均坐标的代码

#I first converted my pdb file to a csv file

import pandas as pd
import re

pdbfile = '1abz.pdb'
df = pd.DataFrame(columns=['Model','Residue','Seq','Atom','x','y','z']) #make dataframe object
i = 0 #counter

b = re.compile("MODEL\s+(\d+)")
regex1 = "([A-Z]+)\s+(\d+)\s+([^\s]+)\s+([A-Z]+)[+-]?\s+([A-Z]|)"
regex2 = "\s+(\d+)\s+([+-]?\d+\.\d+\s+[+-]?\d+\.\d+\s+[+-]?\d+\.\d+)"
reg = re.compile(regex1+regex2)

with open(pdbfile) as f:
    columns = ('label', 'ident', 'atomName', 'residue', 'chain', 'sequence', 'x', 'y', 'z', 'occ', 'temp', 'element')
    data = []
    for line in f:
        n = b.match(line)
        if n:
            modelNum = n.group(1)

        m = reg.match(line)
        if m:
            d = dict(zip(columns, line.split()))
            d['model'] = int(modelNum)
            data.append(d)

df = pd.DataFrame(data)
df.to_csv(pdbfile[:-3]+'csv', header=True, sep='\t', mode='w')

#Then I calculated the average coordinates

df = pd.read_csv('1abz.csv', delim_whitespace = True, usecols = [0,5,7,8,10,11,12]) 
df1 = df.groupby(['atomName','residue','sequence'],as_index=False)['x','y','z'].mean()
df1.to_csv('avg_coord.csv', header=True, sep='\t', mode='w')

这在biopython中当然是可行的。让我举一个例子来帮助您忽略pdb文件中的HETRES:

首先用所有模型解析pdb文件:

import Bio.PDB
import numpy as np

parser = Bio.PDB.PDBParser(QUIET=True)  # Don't show me warnings
structure = parser.get_structure('1abz', '1abz.pdb')  # id of pdb file and location
好的,现在我们有了文件的内容,假设所有模型中都有相同的原子,得到一个列表,其中每个原子都有一个唯一的标识符(例如:链+剩余位置+原子名称):

注意,我忽略了带有
a.parent.id[0]=''
的杂合残基。现在让我们得到每个原子的平均值:

atom_avgs = {}
for atom in atoms:
    atom_avgs[atom] = []
    for model in structure:
        atom_ = atom.split('-')
        coor = model[atom_[0]][int(atom_[1])][atom_[2]].coord
        atom_avgs[atom].append(coor)
    atom_avgs[atom] = sum(atom_avgs[atom]) / len(atom_avgs[atom])  # average
现在,让我们使用结构的一个模型创建新的pdb:

ns = Bio.PDB.StructureBuilder.Structure('id=1baz')  #  new structure
ns.add(structure[0])  # add model 0
for atom in ns[0].get_atoms():
    chain = atom.parent.parent
    res = atom.parent
    if res.id[0] != ' ':
        chain.detach_child(res)  # detach hetres
    else:
        coor = atom_avgs[chain.id + '-' + str(res.id[1]) + '-' + atom.name]
        atom.coord = coor
现在,让我们编写pdb

io = Bio.PDB.PDBIO()
io.set_structure(ns)
io.save('new_1abz.pdb')

阅读并提供问题中的表格示例(没有人喜欢访问外部链接),没有嘈杂的行。那么:您的CSV文件示例在哪里?非常感谢您的帮助和花时间解释您的代码!只是我注意到的一个很小的错误。我认为应该是
structure=parser.get_structure('1abz','1abz.pdb')
。当我使用
structure=parser('1abz','1abz.pdb')
运行代码时,我遇到了一个“TypeError:'PDBParser'对象不可调用”。无论如何,再次感谢您的帮助!非常感谢!事实上,你是对的(我编辑了代码),否则代码会起作用吗?
io = Bio.PDB.PDBIO()
io.set_structure(ns)
io.save('new_1abz.pdb')