我有一个复合物pdb, pdb的文件名为sample52_processed.pdb,, 包含三条链,但我的pdb文件中并不包含三条链的链ID, 我的三条链的残基编号都是从1开始,第一条链残基编号为179,第二条链残基编号为1114,第三条链残基编号为1~107,我想请你帮我写一个python程序,将第一条链的ID添加为A, 第二条链的ID添加为H, 第三条链的ID添加为L。
当你处理PDB文件时,可以使用Python的脚本来修改链的标识符。以下是一个简单的Python脚本,它使用正则表达式来找到并替换PDB文件中的链标识符。
import re
def add_chain_ids(input_pdb, output_pdb):
with open(input_pdb, 'r') as f:
pdb_content = f.readlines()
# 定义链的信息
chain_info = [
{'start': 1, 'end': 79, 'new_chain_id': 'A'},
{'start': 80, 'end': 193, 'new_chain_id': 'H'},
{'start': 194, 'end': 300, 'new_chain_id': 'L'}
]
# 遍历每一行,查找并替换链标识符
for i, line in enumerate(pdb_content):
if line.startswith('ATOM') or line.startswith('HETATM'):
for info in chain_info:
if info['start'] <= int(line[22:26].strip()) <= info['end']:
pdb_content[i] = line[:21] + info['new_chain_id'] + line[22:]
# 写入输出文件
with open(output_pdb, 'w') as f:
f.writelines(pdb_content)
# 调用函数
add_chain_ids('sample52_processed.pdb', 'sample52_processed_modified.pdb')
此脚本假定PDB文件中的链标识符位于每行的第22到第26列之间。它会遍历文件的每一行,查找每个残基的编号,并根据链的信息替换链标识符。最后,将修改后的内容写入新的PDB文件中。在这个例子中,新的PDB文件名为sample52_processed_modified.pdb。你可以根据实际情况调整链的信息和文件名。
三条链的残基编号分别都是从1开始的,还有仅需要添加链ID并不需要替换什么
如果你只需要添加链的标识符而不替换任何内容,以下是相应的 Python 脚本:
def add_chain_ids(input_pdb, output_pdb):
with open(input_pdb, 'r') as f:
pdb_content = f.readlines()
chain_ids = ['A', 'H', 'L']
chain_index = 0
for i, line in enumerate(pdb_content):
if line.startswith('ATOM') or line.startswith('HETATM'):
# 在每条链的第一个残基前添加链标识符
if int(line[22:26].strip()) == 1:
pdb_content[i] = line[:21] + chain_ids[chain_index] + line[22:]
chain_index += 1
with open(output_pdb, 'w') as f:
f.writelines(pdb_content)
# 调用函数
add_chain_ids('sample52_processed.pdb', 'sample52_processed_modified.pdb')
此脚本会遍历 PDB 文件,找到每条链的第一个残基,并在该残基前添加相应的链标识符。这样,每条链的所有残基都会被标记上正确的链 ID。
不止需要在每一条链的第一个残基添加链ID, 而是需要每一条链的每一个氨基酸都要添加对应的链ID。
下面是修改后的代码:
def add_chain_ids(input_pdb, output_pdb):
with open(input_pdb, 'r') as f:
pdb_content = f.readlines()
chain_ids = ['A', 'H', 'L']
current_chain = None
for i, line in enumerate(pdb_content):
if line.startswith('ATOM') or line.startswith('HETATM'):
chain_id = line[21]
if current_chain is None or chain_id != current_chain:
current_chain = chain_id
chain_index = chain_ids.index(current_chain)
pdb_content[i] = line[:21] + chain_ids[chain_index] + line[22:]
with open(output_pdb, 'w') as f:
f.writelines(pdb_content)
# 调用函数
add_chain_ids('sample52_processed.pdb', 'sample52_processed_modified.pdb')
这个修改后的代码将为每一条链的每个氨基酸添加相应的链 ID。