"""
LiveDesign protocol pse helper functions
Copyright Schrodinger, LLC. All rights reserved.
"""
import os
import sys
from contextlib import contextmanager
from schrodinger.utils.fileutils import get_mmshare_scripts_dir
sys.path.append(get_mmshare_scripts_dir())
[docs]@contextmanager
def clear_ld_library_path():
"""
Used to call external applications that may not work inside
$SCHRODINGER/run environment.
"""
try:
ld_library_path = os.environ['LD_LIBRARY_PATH']
except KeyError:
ld_library_path = ""
os.environ['LD_LIBRARY_PATH'] = ""
try:
yield
finally:
os.environ['LD_LIBRARY_PATH'] = ld_library_path
[docs]def generate_watermap_pse(watermap_proc, script_name, lib_path):
"""
Generate a PyMOL script to render a WaterMap result file object with the properties
"""
# save the watermat_st to a temp file
watermap_file = "watermap.maegz"
watermap_proc.wm_st.write(watermap_file)
if watermap_proc.params["reflig"]:
watermap_proc.reflig_st.append(watermap_file)
# load libraries
pml = [
'import uuid', 'import sys', f'sys.path.append("{lib_path}")',
'import cubes'
]
color_prop = watermap_proc.params["color_prop"]
if not watermap_proc.params["reflig"]:
# FIXME add it back when the WebPyMOL bug is fixed
# if color_prop is not None:
# label_prop = color_prop.strip('r_watermap_')
# pml += [
# "set label_relative_mode, 1",
# "set label_screen_point, [0,-0.66,1]", "pseudoatom foo",
# f"label foo, '{label_prop}'"
# ]
pml += ['save ligand.pse', 'delete foo', 'set label_relative_mode, 0']
pml.append(
f'load {watermap_file}, wm, mimic=1, object_props=*, atom_props=*')
if watermap_proc.params["reflig"]:
# FIXME add it back when the WebPyMOL bug is fixed
# if color_prop is not None:
# label_prop = color_prop.strip('r_watermap_')
# pml += [
# 'extract reference_ligand, bonded',
# 'hide everything, not bonded', "set label_relative_mode, 1",
# "set label_screen_point, [0,-0.66,1]",
# f"label reference_ligand, '{label_prop}'"
# 'save ligand.pse', 'delete reference_ligand',
# 'set label_relative_mode, 0'
# ]
# else:
pml += [
'extract reference_ligand, bonded', 'hide everything, not bonded',
'save ligand.pse', 'delete reference_ligand'
]
# color
pml += [
"colors = {}",
"iterate wm, colors[chain, resi, name] = int('0x40%02x%02x%02x' % (int(p.r_watermap_color_r * 255), "
"int(p.r_watermap_color_g * 255), int(p.r_watermap_color_b * 255)), 16)",
"alter wm, color = int(colors.get((chain, resi, name), color))",
"recolor"
]
# shape
pml.append("hide everything")
if watermap_proc.params["shape"] is None:
pml += [
"show spheres", "alter visible, s.sphere_scale = 0.5",
f'alter visible, s.sphere_transparency = {watermap_proc.params["transparency"]}'
]
else:
pml += [
f"{watermap_proc.params['shape']}",
f"set cgo_transparency, {watermap_proc.params['transparency']}"
]
# show property
if watermap_proc.params["show_prop"]:
pml.append(f'label all, "%.2f\\n" % (properties["{color_prop}"])')
# color ramp
if color_prop is not None:
pml += [
"cmd.extract('watermap', cmd.get_object_list()[0])",
f"ramp_new legend,watermap,[{watermap_proc.params['color_min']},{watermap_proc.params['color_max']}],[green,red]"
]
# save pse file
pml += [
"for obj in cmd.get_object_list(): cmd.set_name(obj, uuid.uuid1())",
"save protein.pse"
]
# write the pml script
pml_script = "\n".join(pml)
with open(script_name, "w") as f:
f.write(pml_script)
return