Source code for custodian.feff.jobs
""" This module implements basic kinds of jobs for FEFF runs."""
import logging
import os
import shutil
import subprocess
from monty.shutil import decompress_dir
from custodian.custodian import Job
from custodian.utils import backup
logger = logging.getLogger(__name__)
__author__ = "Chen Zheng"
__version__ = "0.1"
__maintainer__ = "Chen Zheng"
__email__ = "chz022@ucsd.edu"
__status__ = "Alpha"
__date__ = "10/20/17"
FEFF_INPUT_FILES = {"feff.inp"}
FEFF_BACKUP_FILES = {"ATOMS", "HEADER", "PARAMETERS", "POTENTIALS"}
[docs]class FeffJob(Job):
"""
A basic FEFF job, run whatever is in the directory.
"""
def __init__(
self,
feff_cmd,
output_file="feff.out",
stderr_file="std_feff_err.txt",
backup=True,
gzipped=False,
gzipped_prefix="feff_out",
):
"""
This constructor is used for a standard FEFF initialization
Args:
feff_cmd (str): the name of the full executable for running FEFF
output_file (str): Name of file to direct standard out to.
Defaults to "feff.out".
stderr_file (str): Name of file direct standard error to.
Defaults to "std_feff_err.txt".
backup (bool): Indicating whether to backup the initial input files.
If True, the feff.inp will be copied with a ".orig" appended.
Defaults to True.
gzipped (bool): Whether to gzip the final output. Defaults to False.
gzipped_prefix (str): prefix to the feff output files archive. Defaults
to feff_out, which means a series of feff_out.1.tar.gz, feff_out.2.tar.gz, ...
will be generated.
"""
self.feff_cmd = feff_cmd
self.output_file = output_file
self.stderr_file = stderr_file
self.backup = backup
self.gzipped = gzipped
self.gzipped_prefix = gzipped_prefix
[docs] def setup(self):
"""
Performs initial setup for FeffJob, do backing up.
Returns:
"""
decompress_dir(".")
if self.backup:
for f in FEFF_INPUT_FILES:
shutil.copy(f, f"{f}.orig")
for f in FEFF_BACKUP_FILES:
if os.path.isfile(f):
shutil.copy(f, f"{f}.orig")
[docs] def run(self):
"""
Performs the actual FEFF run
Returns:
(subprocess.Popen) Used for monitoring.
"""
with open(self.output_file, "w") as f_std, open(self.stderr_file, "w", buffering=1) as f_err:
# Use line buffering for stderr
# On TSCC, need to run shell command
return subprocess.Popen(self.feff_cmd, stdout=f_std, stderr=f_err, shell=True) # pylint: disable=R1732
[docs] def postprocess(self):
"""
Renaming or gzipping all the output as needed
"""
if self.gzipped:
backup("*", prefix=self.gzipped_prefix)