在python平台上利用pymol来查找PDB文件中蛋白质的相互作用位点

这篇代码写的可能有点问题,大家如果有需要,去看另一篇吧。如果有啥不足,请批评指正。

在python平台上利用pymol来查找PDB文件中蛋白质的相互作用位点

关于蛋白质结合位点,查阅了很多篇文献,大多数都是关于如何定义结合位点的,却没有说明该如何去找结合位点。大多数都是说从PDB库中下载蛋白质结构数据,但是却没有说下载过数据之后该怎么做。偶然间从论坛上看到利用pymol软件可以解析PDB文件中的原子坐标,也可以查找选中片段范围内的氨基酸,比如3.5A内的氨基酸。经过半个多月的摸索,发现可以直接在python上利用pymol包来找结合位点。

1. 利用pymol来找结合位点

下图是利用pymol来找结合位点,只要选中链中的配体,然后在命令窗口输入select 2,byres sele around 3.5。2中就会显示出来3.5A内的作用位点
pdb文件在pymol中的显示
这样可以一个一个的来找结合位点,如果数据不多,可以通过该方法来找结合位点。

2. 代码实现

对于数据比较多的情况来说,我们可以利用pymol包,在python上面来寻找结合位点,并输出为列表。下面直接上代码

from pymol import cmd

import os
import re

sumlist = []

outfile = open('C:\\Users\\Desktop\\找到的结合位点.txt','a')#该文件为找到的结合位点
#####
aa_codes = {
     'ALA':'A', 'CYS':'C', 'ASP':'D', 'GLU':'E',
     'PHE':'F', 'GLY':'G', 'HIS':'H', 'LYS':'K',
     'ILE':'I', 'LEU':'L', 'MET':'M', 'ASN':'N',
     'PRO':'P', 'GLN':'Q', 'ARG':'R', 'SER':'S',
     'THR':'T', 'VAL':'V', 'TYR':'Y', 'TRP':'W'}#定义一个字典,将三字母氨基酸转换为单字母

DNA = ['DT','DG','DA','DC']##定义一个DNA列表

RNA = ['G', 'C', 'U', 'A']##定义一个RNA列表

#####

####定义函数来找配体


def search(lig,sym,chainID):
    srlig =[]
    cmd.load(file_path + '\\' + i)
    sss = lig
    cmd.remove('solvent')
    cmd.select('1', ' resn %s in chain %s' % (sss,chainID))
    # cmd.set_name('')
    cmd.select('2', 'byres 1 around 3.5')#3.5原子间的距离
    srlig.append(i[0:4])
    for a in cmd.get_model("2").atom:
        if a.resn in aa_codes:
            aazong = aa_codes[a.resn] + a.resi
            if aazong not in srlig:
                srlig.append(aazong)
    srlig.insert(1, sym)
    if len(srlig)>2 and srlig not in sumlist: #剔除没有配体的列表
        sumlist.append(srlig)
    cmd.delete('all')


#######函数结束



file_path = 'C:\\Users\\Desktop\\蛋白结合位点质\\protein_site'###这个地方是pdb文件的路径

file = os.listdir(file_path)

for i in file:
    f = open(file_path+'\\'+i)
    ls = []

    otherlig = []  # 定义从序列中找出的配体列表 otherlig 是小分子,金属离子
    DNAlig = [] ###与DNA相互作用
    RNAlig = []#与RNA相互作用
    proteinlig = []# 与蛋白质相互作用
    HET = []
    AAA=[]
    '''
    判断分辨率是否大于3.5A
    '''
    g = open(file_path + '\\' + i)
    for reso in g:
         if reso[10:15] =='X-RAY':
             for reso in g:
                 if reso[0:22] == 'REMARK   2 RESOLUTION.':
                    AA = re.findall('\d+',reso[22:])
                    Aa = ''.join(AA)
                    AAA.append(Aa)
    if AAA:
        if int(AAA[0])<=350:###定义分辨率大于3.5A
            for j in f:
                if j[0:6]=='SEQRES':
                    colume = j.split()
                    if [colume[2],colume[3]] not in ls:
                        ls.append([colume[2],colume[3]])
            f.close()
            # print(ls)
            minls = []
            for m in ls:
                minls.append(int(m[1]))
            minnum = min(minls)
            chainls = []
            chainssssssla = []
            for m in ls:
                if int(m[1])==minnum:
                    chainls.append(m[0])
            n = open(file_path+'\\'+i)
            for j in n:
                if j[0:6]=='SEQRES':
                    colume = j.split()
                    if colume[2] in chainls and len(ls)>1:
                        for col in colume[4:]:
                            if col in DNA and col not in DNAlig:
                                DNAlig.append(col)
                            elif col in RNA and col not in RNAlig:
                                RNAlig.append(col)
                            elif col in aa_codes and col not in proteinlig:
                                proteinlig.append(col)
                            elif col not in otherlig and col not in aa_codes and col not in RNA and col not in DNA:
                                otherlig.append(col)
                HETlist = ['HETNAM','HETSYN','HETATM']
                if j[0:3]=='HET' and j[0:6] not in HETlist:
                    colume = j.split()
                    if colume[1] not in HETlist:
                        HET.append(colume[1])
                    if colume[2] not in chainssssssla:
                        chainssssssla.append(colume[2])
            if proteinlig:
                ligand = '+'.join(proteinlig)
                chainID = '+'.join(chainls)
                search(ligand,'III',chainID)
            if DNAlig:
                ligand = '+'.join(DNAlig)
                chainID = '+'.join(chainls)
                search(ligand,'DNA',chainID)
            if RNAlig:
                ligand = '+'.join(RNAlig)
                chainID = '+'.join(chainls)
                search(ligand,'RNA',chainID)
            if otherlig:
                chainID = '+'.join(chainls)
                for ligand in otherlig:
                    search(ligand,ligand,chainID)
            if HET:
                chainID = '+'.join(chainssssssla)
                for ligand in HET:
                    search(ligand,ligand,chainID)
for list in sumlist:
    print(list)

结果输出

在这里插入图片描述
结果中,1为pdb号,2为配体,3-最后是结合位点,字母为氨基酸,数字为结合残基在序列中的位置

  • 17
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值