Source code for custodian.lobster.jobs

"""This module implements jobs for Lobster runs. """

import logging
import os
import shutil
import subprocess

from monty.io import zopen
from monty.shutil import compress_file

from custodian.custodian import Job

__author__ = "Janine George, Guido Petretto"
__copyright__ = "Copyright 2020, The Materials Project"
__version__ = "0.1"
__maintainer__ = "Janine George"
__email__ = "janine.george@uclouvain.be"
__date__ = "April 27, 2020"

LOBSTERINPUT_FILES = ["lobsterin"]
LOBSTEROUTPUT_FILES = [
    "lobsterout",
    "CHARGE.lobster",
    "COHPCAR.lobster",
    "COOPCAR.lobster",
    "DOSCAR.lobster",
    "GROSSPOP.lobster",
    "ICOHPLIST.lobster",
    "ICOOPLIST.lobster",
    "lobster.out",
    "projectionData.lobster",
]

logger = logging.getLogger(__name__)


[docs]class LobsterJob(Job): """ Runs the Lobster Job """ def __init__( self, lobster_cmd: str, output_file: str = "lobsterout", stderr_file: str = "std_err_lobster.txt", gzipped: bool = True, add_files_to_gzip=[], backup: bool = True, ): """ Args: lobster_cmd: command to run lobster output_file: usually lobsterout stderr_file: standard output gzipped: if True, Lobster files and add_files_to_gzip will be gzipped add_files_to_gzip: list of files that should be gzipped backup: if True, lobsterin will be copied to lobsterin.orig """ self.lobster_cmd = lobster_cmd self.output_file = output_file self.stderr_file = stderr_file self.gzipped = gzipped self.add_files_to_gzip = add_files_to_gzip self.backup = backup
[docs] def setup(self): """ will backup lobster input files """ if self.backup: for f in LOBSTERINPUT_FILES: shutil.copy(f, f"{f}.orig")
[docs] def run(self): """ runs the job """ cmd = self.lobster_cmd logger.info(f"Running {' '.join(cmd)}") with zopen(self.output_file, "w") as f_std, zopen(self.stderr_file, "w", buffering=1) as f_err: # use line buffering for stderr return subprocess.Popen(cmd, stdout=f_std, stderr=f_err) # pylint: disable=R1732
[docs] def postprocess(self): """ will gzip relevant files (won't gzip custodian.json and other output files from the cluster) """ if self.gzipped: for file in LOBSTEROUTPUT_FILES: if os.path.exists(file): compress_file(file, compression="gz") for file in LOBSTERINPUT_FILES: if os.path.exists(file): compress_file(file, compression="gz") if self.backup: if os.path.exists("lobsterin.orig"): compress_file("lobsterin.orig", compression="gz") for file in self.add_files_to_gzip: compress_file(file, compression="gz")