蛋白质结构信息获取与解析(基于Biopython)

通常情况下,一个蛋白质所包含的信息是非常多的,与结构相关的包括:包括链名、氨基酸残基序列、原子坐标等。一个蛋白质的结构相关的信息可以以pdb文件的形式保存,这些文件可以直接从PDB、NCBI等数据库获取,也可以利用biopython获取。

获取某个蛋白的pdb文件,我们可以转成文本格式查看相关信息,不过这样很不利于数据分析。所以利用biopython解析蛋白质结构信息是十分方便的。

(一)基于Biopython蛋白质文件获取

(1)Entrez方法(获取数据并保存于文件中)

from Bio import Entrez
Entrez.email='邮箱名'  #如'[email protected]'
handle=Entrez.esearch(db='protein',term='2rbg')
record=Entrez.read(handle)
id=record['IdList'][0]
handle=Entrez.efetch(db='protein',id=id,rettype='gb',retmode='text')
with open('2rbg.pdb','w') as f:
    for i in handle.readlines():
        f.write(i)

Biopython中Entrez函数主要用于蛋白质、核酸等数据的获取。

Entrez.email是用于获取你的地址(如果过度使用该工具,NCBI会在阻止访问之前通过该电子邮件通知你)。

Entrez.esearch()用于从数据库中搜索你所需要的文件的相关信息。参数db表示数据库,这里的'protein'表示蛋白质数据库,其它的数据库可参考NCBI官网首页中'All Databases'中各个数据库(如'nucleotide'核酸数据库等)。参数term表示需要获取的蛋白名称(也可以是核酸数据库中基因名等,这里以2rbg为例)。最终返回的handle是一个对象,通过Entrez.read()获取handle中的数据。读取后得到的record是一个字典。

record={'Count': '3', 'RetMax': '3', 'RetStart': '0', 
'IdList': ['2057065522', '208435533', '208435532'], 'TranslationSet': [], 
'TranslationStack': [{'Term': '2rbg[All Fields]', 'Field': 'All Fields', 'Count': '3', 'Explode': 'N'}, 'GROUP'], 
'QueryTranslation': '2rbg[All Fields]'}

record中IdList列表包含了所获取的文件id号,这里有3个文件,我们可以从中选取1个id进行文件数据获取。

通过Entrez.efetch(),根据数据库,id号来获取该蛋白质数据。db与前面Entrez.esearch()相同,id表示id号,rettype表示字节,如'kb','mb'等,这里需要使用gb。retmode表示数据格式,这里是'text'。最后将数据保存在文件中即可。

(2)retrieve_pdb_file(直接获取数据文件)

from Bio import PDB
PDB.PDBList().retrieve_pdb_file(pdb_code='2FAT',file_format='mmCif')

retrieve_pdb_file函数中pdb_code表示蛋白文件名,file_format表示文件格式,如''pdb'、'mmCif'等。如果需要下载到指定文件夹,需要使用参数pdir,参数值为指定文件夹的绝对路径。

(二)蛋白质结构解析

(1)获取structure类对象

from Bio import PDB
parser=PDB.PDBParser(QUIET=True)
structure=parser.get_structure(file='2rbg.pdb',id=None)

先使用PDBParser()创建PDB解析器parser,再用parser从pdb文件中解析蛋白质结构,得到structure类对象。parser.get_structure()函数中file参数表示解析的蛋白质文件,id是一个编号,可以用数、字符串等标记,也可以用None。得到的structure用于后面肽链chain、氨基酸残基residues、原子atom、模型model等数据的获取。

:除了pdb文件,对于其它类型的文件,可以使用相应的PDB.MMCIFParser()、PDB.FastMMCIFParser()解析器,使用get_structure()得到structure,之后的方法都是相同的。

(2)从structure中获取chains

chains=structure.get_chains()

得到的chains为chains类对象,它包含该蛋白质所有肽链。

print(list(chains))

'''------------------'''
>>> [<Chain id=A>, <Chain id=B>]

例如这里的2rbg.pdb,其中包含了A、B两条链。

(3)从structure/chain中获取residues

从structure、chain中获取residues方法是相同的,structure 是从整体蛋白质获取残基,chain是指定某条链获取残基。

chains=structure.get_chains()
chain_A=list(chains)[0]
residues_A=chain_A.get_residues()

以A链为例,把chains转成列表,列表中第一个<Chain id=A>表示A链对象,之后用get_residues()函数即可。

若从structure获取所有残基,用下面方法即可。

residues=structure.get_residues()

将residues转成列表,列表中每个值为一个残基类,包含该残基相关信息。

print(list(residues))
'''--------------------'''
>>> [<Residue TYR het=  resseq=3 icode= >, 
<Residue LYS het=  resseq=4 icode= >, 
<Residue ASN het=  resseq=5 icode= >,.....]

其中Residue表示氨基酸名;het是异质域,'W'表示水,'H_残基名'表示非标准氨基酸,空表示标准氨基酸;resseq为氨基酸序列编号;icode为插入码。

对于每个残基,使用get_resname()可获取残基名,使用get_atoms()函数可以获取该residue中所有原子。

resname=list(residues)[0].get_resnames()
atoms=list(residues)[0].get_atoms()

上述代码第一行获取第一个氨基酸残基名,第二行获取氨基酸残基所有原子。

print(list(atoms))
'''------------------'
>>>[<Atom N>, <Atom CA>, <Atom C>, <Atom O>, <Atom CB>, 
<Atom CG>, <Atom CD1>, <Atom CD2>, <Atom CE1>,
 <Atom CE2>, <Atom CZ>, <Atom OH>]

residue中其它方法:

get_segid:返回segid

get_unpacked_list:undisordered原子组成的列表。

sort():将原子排序,N,CA,C,O等排在前面。

is_disordered():判断氨基酸中十分含有disordered原子,若含有则返回True。

(4)从structure/chain/residues中获取原子

从residues中获取atoms方法前面已讲述,从structure、chain中获取原子信息方法是与前面相同的,仍使用get_atoms()函数。

atoms=structures.get_atoms()
atoms_chain_A=chain_A.get_atoms()

(5)从atoms中获取原子信息

get_vector():原子坐标的vector。

get_coord():原子坐标。

get_fullname():原子全名。

get_serial_number() or serial number():原子序号(从1开始)。

get_sigatm():原子坐标标准差。

get_bfactor():bfactor温度因子。

set_?:设置属性,'?'可以为coord、bfactor、serial_number等。

猜你喜欢

转载自blog.csdn.net/weixin_60737527/article/details/126152198
今日推荐