import os,sys
def add_chain_id_to_pdb(pdb_file_path, chain_ids):
try:
with open(pdb_file_path, 'r') as pdb_file:
pdb_lines = pdb_file.readlines()
modified_pdb_lines = []
for line in pdb_lines:
if line.startswith('ATOM'):
modified_line = line[:21] + chain_id + line[22:]
modified_pdb_lines.append(modified_line)
else:
modified_pdb_lines.append(modified_line)
with open(pdb_file_path, 'w') as modified_pdb_file:
modified_pdb_file.writelines(modified_pdb_lines)
except FileNotFoundError:
return f"{pdb_file_path} not exist"
def main():
pdb_file_path = 'sample52_processed.pdb'
chain_id_to_add = ['A', 'H', 'L']
result = add_chain_id_to_pdb(pdb_file, chain_id_to_add)
if __name__ == '__main__':
main()
我想给复合物pdb加上链ID信息,比如说有A, H, L三条链,我的三条链的残基编号都是从1开始,也就是当残基编号为1时就用新的链ID, 程序该修改
import os, sys
def add_chain_id_to_pdb(pdb_file_path, chain_ids):
try:
with open(pdb_file_path, 'r') as pdb_file:
pdb_lines = pdb_file.readlines()
current_chain_id = None
modified_pdb_lines = []
for line in pdb_lines:
if line.startswith('ATOM'):
residue_number = int(line[22:26].strip())
if residue_number == 1:
# Update the chain ID for a new chain
current_chain_id = chain_ids.pop(0)
modified_line = line[:21] + current_chain_id + line[22:]
modified_pdb_lines.append(modified_line)
else:
modified_pdb_lines.append(line)
with open(pdb_file_path, 'w') as modified_pdb_file:
modified_pdb_file.writelines(modified_pdb_lines)
except FileNotFoundError:
return f"{pdb_file_path} not exist"
def main():
pdb_file_path = 'sample52_processed.pdb'
chain_ids_to_add = ['A', 'H', 'L']
result = add_chain_id_to_pdb(pdb_file_path, chain_ids_to_add)
if __name__ == '__main__':
main()
程序报错:
Traceback (most recent call last):
File "/home/yhm/Protein_design/RSVF/MD_em02/p0002/add_chain_name01.py", line 36, in <module>
main()
File "/home/yhm/Protein_design/RSVF/MD_em02/p0002/add_chain_name01.py", line 33, in main
result = add_chain_id_to_pdb(pdb_file_path, chain_ids_to_add)
File "/home/yhm/Protein_design/RSVF/MD_em02/p0002/add_chain_name01.py", line 17, in add_chain_id_to_pdb
current_chain_id = chain_ids.pop(0)
IndexError: pop from empty list
修改
import os, sys
def add_chain_id_to_pdb(pdb_file_path, chain_ids):
try:
with open(pdb_file_path, 'r') as pdb_file:
pdb_lines = pdb_file.readlines()
current_chain_id = None
modified_pdb_lines = []
for line in pdb_lines:
if line.startswith('ATOM'):
residue_number = int(line[22:26].strip())
if residue_number == 1:
# Check if there are still chain IDs available
if chain_ids:
current_chain_id = chain_ids.pop(0)
else:
# Handle the case when there are more residues than chain IDs
current_chain_id = 'Z' # You can choose another character or handle it differently
modified_line = line[:21] + current_chain_id + line[22:]
modified_pdb_lines.append(modified_line)
else:
modified_pdb_lines.append(line)
with open(pdb_file_path, 'w') as modified_pdb_file:
modified_pdb_file.writelines(modified_pdb_lines)
except FileNotFoundError:
return f"{pdb_file_path} not exist"
def main():
pdb_file_path = 'sample52_processed.pdb'
chain_ids_to_add = ['A', 'H', 'L']
result = add_chain_id_to_pdb(pdb_file_path, chain_ids_to_add)
if __name__ == '__main__':
main()