Source code for schrodinger.application.matsci.jaguar_restart
"""
Utilities for Jaguar restarts.
Copyright Schrodinger, LLC. All rights reserved.
"""
import glob
import os
import zipfile
from schrodinger.application.jaguar.output import JaguarOutput
from schrodinger.application.matsci import jobutils
from schrodinger.utils import fileutils
[docs]def needs_restart(base_name):
"""
Return True if the Jaguar job corresponding to the given base name
needs to be restarted.
:type base_name: str
:param base_name: the base name
:rtype: bool
:return: True if the job needs to be restarted
"""
out_file = f'{base_name}.out'
if not os.path.exists(out_file):
return True
jout = JaguarOutput(out_file)
if jout.status != JaguarOutput.OK or jout.fatal_error:
return True
files = [f'{base_name}.01.in', f'{base_name}.01.mae']
return not all(map(os.path.exists, files))
[docs]def get_existing_files(files=None,
patterns=None,
base_names=None,
base_name_exts=None):
"""
Return existing files.
:type files: iterable or None
:param files: file names
:type patterns: iterable or None
:param patterns: shell file patterns to glob for
:type base_names: iterable or None
:param base_names: base names of files
:type base_name_exts: iterable or None
:param base_name_exts: base name extensions of files, if None
then Jaguar `*.out`, `*.01.in`, and `*.01.mae` are used
:rtype: set
:return: existing files
"""
assert files or patterns or base_names
files = files or []
patterns = patterns or []
base_names = base_names or []
base_name_exts = base_name_exts or ['.out', '.01.in', '.01.mae']
files = set(files)
for base_name in base_names:
for base_name_ext in base_name_exts:
files.add(f'{base_name}{base_name_ext}')
existing_files = set()
for afile in files:
if os.path.exists(afile):
existing_files.add(afile)
for pattern in patterns:
existing_files.update(glob.glob(pattern))
return existing_files
[docs]def get_restart_zip_files(base_names=None, base_name_patterns=None):
"""
Return the restart zip files.
:type base_names: iterable or None
:param base_names: base names of `*zip` files
:type base_name_patterns: iterable or None
:param base_name_patterns: shell base name patterns to glob for
:rtype: list
:return: restart zip files
"""
base_name_patterns = base_name_patterns or []
base_name_patterns = [f'{pattern}.zip' for pattern in base_name_patterns]
files = get_existing_files(patterns=base_name_patterns,
base_names=base_names,
base_name_exts=['.zip'])
return list(files)
[docs]def prepare_restart_dirs(zip_files):
"""
Prepare the restart directories.
:type zip_files: iterable
:param zip_files: the zip files
"""
for afile in zip_files:
obj = zipfile.ZipFile(afile, 'r')
obj.extractall(fileutils.get_basename(afile))
obj.close()
fileutils.force_remove(afile)
[docs]def remove_driver_log_file(default_job_name):
"""
Remove the driver log file.
:type default_job_name: str
:param default_job_name: the default job name
"""
# for restarted jobs if a *-driver.log file using the same job name exists
# it will not be overwritten, appended to, etc. (perhaps related to
# MATSCI-6430) so force remove it here
log_file_name = jobutils.get_jobname(default_job_name) + '-driver.log'
fileutils.force_remove(log_file_name)