import os import subprocess import logging LOG = logging.getLogger(__name__) def generate_pymol_image(pdb_path, chopping, image_out_path, path_to_script, pymol_executable): """ This function generates a pymol script which describes how one protein should be visualized and saved as a png file. Script is then executed via subprocess. Delimit separate domains with commas , and discontinuous domains with underscores _. Residue ranges separated by hyphens -, e.g. 1-100,101-200_300-340 :param pdb_path: string which is the path to a .pdb file :param bounds: domain boundaries expressed in residue author numbers in the pdb file e.g. 1-100,101-200_300-340 :param path_to_script: where the pymol bash script is saved :param pymol_executable: path to pymol executable :return: None """ script_text = f""" load {pdb_path}, structure hide everything bg_color white as cartoon, structure set ray_opaque_background,1 color white, structure\n""" color_list = ['green', 'red', 'cyan', 'magenta', 'blue', 'orange', 'dirtyviolet', 'olive', 'limon', 'salmon', 'deepteal', 'yellow', 'sand', 'purpleblue', 'black'] bounds = chopping.split(',') for i, bound in enumerate(bounds): if len(bound): domain_color = color_list[i % len(color_list)] for segment in bound.split('_'): start, end = segment.split('-') script_text += f"color {domain_color}, structure and resi {start}-{end}\n" script_text += "orient\n" script_text += f"png {image_out_path}, ray=1, width=20cm, dpi=300,\n" script_text += f"save {image_out_path.split('.')[0] + '.pse'}\n" with open(path_to_script, 'w') as filehandle: filehandle.write(script_text) bash_command = f"{pymol_executable} -c {path_to_script}" status = subprocess.run(bash_command.split(), timeout=120) os.remove(path_to_script) return status