计算化学公社

标题: 任意pdb对其中的蛋白质的chainID重新命名方法求助 [打印本页]

作者
Author:
bingzan    时间: 2022-3-30 16:21
标题: 任意pdb对其中的蛋白质的chainID重新命名方法求助
各位老师好,我想请教的问题是:我有一个pdb文件,其中有36个蛋白。pdb中第22列是chainID.目前这些蛋白的chainID都是乱的,有数字、有字母、有空缺。我需要给所有蛋白的chainID重新命名,规则是ABCD…Zabcd…z0123…9。因为每个蛋白有好几百个原子,所以手动一个个更改第22列的方法工作量实在太大了。请问有什么除了手动之外,重命名chainID的方法吗?谢谢

作者
Author:
rpestana94    时间: 2022-3-30 22:05
you can create a script using python with the biopython library or try with pdb-tools
作者
Author:
bingzan    时间: 2022-3-30 22:22
rpestana94 发表于 2022-3-30 22:05
you can create a script using python with the biopython library or try with pdb-tools

Thanks a lot for your info! I go to check biopython and pub-tools :)
作者
Author:
对抗路达摩    时间: 2022-3-31 14:41
本帖最后由 对抗路达摩 于 2022-3-31 14:45 编辑

其实不需要用biopython或者pdb-tools这些包这是我写给别人的一个添加元素名称的小脚本,里面写了中文注释,简单修改就可以实现你得功能主要是一个简单的“读pdb”和"写pdb“的实现
allLine = []
#把这里的.pdb改成你自己的pdb文件名
for line in open('system1_MD_element.pdb', 'r'):
    oneLine = line.split()
    #只处理开头是ATOM的行
    if oneLine[0] != 'ATOM':
        continue
    #oneline是一个数组,是把你的一行按空格断开然后存入
    #编号0到10依次是ATOM,原子序号原子名称,残基名称,链标识符,残基序列号
    #X坐标,Y坐标,Z坐标,占有率,温度因子
    #根据原子名称判断是否是碳元素        
    if oneLine[2] == 'C' or oneLine[2] == 'C1' or oneLine[2] == 'C2' or oneLine[2] == 'C3' or oneLine[2] == 'C4' or oneLine[2] == 'C5' or oneLine[2] == 'C6' or oneLine[2] == 'C8' or oneLine[2] == 'C9' or oneLine[2] == 'C10' or oneLine[2] == 'C13' or oneLine[2] == 'C15' or oneLine[2] == 'C16':
        element = 'C'
    elif oneLine [2] == 'N13' or oneLine [2] == 'N15':
        element = 'N'
    elif oneLine [2] == 'OW' or oneLine [2] == 'O3' or oneLine [2] == 'O5' or oneLine [2] == 'O7' or oneLine [2] == 'O11' or oneLine [2] == 'O12' or oneLine [2] == 'O14' or oneLine [2] == 'O17' or oneLine [2] == 'O19' or oneLine [2] == 'O21' or oneLine [2] == 'O23':
        element = 'O'
    else:
        element = 'H'
    #把链标识符去掉 后面的很多没残基序列号
    if len(oneLine) >= 11:
        oneLine.pop(4)
    oneLine.append(element)
    allLine.append(oneLine)

f = open ('output.pdb', 'w')
for line in allLine:
    f.write(line[0])
    #根据原子编号的长度确认打的空格数目
    k = 7 - len(line[1])
    for i in range(0, k):
        f.write(' ')
    f.write(line[1])
    f.write('  ')
    f.write(line[2])
    k = 4 - len(line[2])
    for i in range (0, k):
        f.write(' ')
    f.write(line[3])
    k = 6 - len(line[4])
    for i in range(0, k):
        f.write(' ')
    f.write(line[4])
    k = 12 - len(line[5])
    for i in range(0, k):
        f.write(' ')
    f.write(line[5])
    k = 8 - len(line[6])
    for i in range(0, k):
        f.write(' ')
    f.write(line[6])
    k = 8 - len(line[7])
    for i in range(0, k):
        f.write(' ')
    f.write(line[7])
    f.write('  ')
    f.write(line[8])
    f.write('  ')
    f.write(line[9])
    f.write('           ')
    f.write(line[10])
    f.write('\n')





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3