Source code for schrodinger.application.desmond.cmdline
"""
Helper functions for dealing with desmond/multisim commandline.
"""
import base64
import os
import re
def _split_app_and_args(cmdline):
"""
Split a desmond-like commandline into an app and the rest of arguments.
:param cmdline: text of cmdline arg
:type cmdline: str
:return: user-facing name of application and remainder commandline
:rtype: tuple(str,str)
:raises: RuntimeError if we can't find a desmond-like program in input
"""
appnames = (os.path.join("utilities", "multisim"), "fep_plus", "watermap",
"fep_solubility", "mxmd")
for app_name in appnames:
# escape for re os.path.sep for windows
app_name = app_name.replace('\\', "\\\\")
match = re.match(r"(.*?%s) *(.*)" % app_name, cmdline)
if not match:
continue
return os.path.join("$SCHRODINGER", app_name), match.group(2)
raise ValueError(f"Could not find any desmond-like apps in {cmdline}")
[docs]def get_job_command_in_startup():
"""
Return a job launching command suitable for printing in a log file.
Munges common desmond applications (multisim, watermap, fep_plus)
to generate a friendlier commandline.
:param application_name: full application name
($SCHRODINGER/utilities/multisim or $SCHRODINGER/watermap)
:type application_name: str
:rtype: str
"""
cmdline = os.path.normpath(os.environ.get("SCHRODINGER_COMMANDLINE"))
try:
app_name, cmdline = _split_app_and_args(cmdline)
except ValueError:
return cmdline
return f"Job launching command:\n{app_name} {cmdline}\n"
[docs]def get_b64encoded_str(string):
"""
Encodes a string as base64 and returns a str, suitable for passing on a
commandline.
:param string: string to be encoded
:type string: str
:rtype: str
"""
# command data is most likely to be in utf-8 but if it is not, just
# replace with recognizable characters. This is for log display.
desc_bytes = string.encode("utf-8", errors="xmlcharrefreplace")
return base64.b64encode(desc_bytes).decode('ascii')
[docs]def get_b64decoded_str(encoded_str):
"""
Decodes a base64 string and returns as str.
"""
byte_array = encoded_str.encode('ascii')
return base64.b64decode(byte_array).decode('utf-8')