通常情况下,一个蛋白质所包含的信息是非常多的,与结构相关的包括:包括链名、氨基酸残基序列、原子坐标等。一个蛋白质的结构相关的信息可以以pdb文件的形式保存,这些文件可以直接从PDB、NCBI等数据库获取,也可以利用biopython获取。
获取某个蛋白的pdb文件,我们可以转成文本格式查看相关信息,不过这样很不利于数据分析。所以利用biopython解析蛋白质结构信息是十分方便的。
- from Bio import Entrez
- Entrez.email='邮箱名' #如'123456789@qq.com'
- 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'。最后将数据保存在文件中即可。
- 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,参数值为指定文件夹的绝对路径。
- 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,之后的方法都是相同的。
chains=structure.get_chains()
得到的chains为chains类对象,它包含该蛋白质所有肽链。
- print(list(chains))
-
- '''------------------'''
- >>> [
id=A>, id=B>]
例如这里的2rbg.pdb,其中包含了A、B两条链。
从structure、chain中获取residues方法是相同的,structure 是从整体蛋白质获取残基,chain是指定某条链获取残基。
- chains=structure.get_chains()
- chain_A=list(chains)[0]
- residues_A=chain_A.get_residues()
以A链为例,把chains转成列表,列表中第一个
若从structure获取所有残基,用下面方法即可。
residues=structure.get_residues()
将residues转成列表,列表中每个值为一个残基类,包含该残基相关信息。
- print(list(residues))
- '''--------------------'''
- >>> [
3 icode= >, 4 icode= >, 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))
- '''------------------'
- >>>[
, , , , , , , , , -
, , ]
residue中其它方法:
get_segid:返回segid
get_unpacked_list:undisordered原子组成的列表。
sort():将原子排序,N,CA,C,O等排在前面。
is_disordered():判断氨基酸中十分含有disordered原子,若含有则返回True。
从residues中获取atoms方法前面已讲述,从structure、chain中获取原子信息方法是与前面相同的,仍使用get_atoms()函数。
- atoms=structures.get_atoms()
- atoms_chain_A=chain_A.get_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等。