Source code for swamp.wrappers.phenixcc
import os
import shutil
from pyjob import cexec
from swamp.wrappers.wrapper import Wrapper
from swamp.parsers import PhenixParser
[docs]class PhenixCC(Wrapper):
"""Wrapper around phenix.get_cc_mtz_pdb
:param str workdir: working directory
:param str mtzin: file name of the mtz with the phase information to calculate correlation coefficient
:param str pdbin: pdb file name to calculate correlation coefficient
:param `~swamp.logger.swamplogger.SwampLogger` logger: logging interface for the wrapper (default None)
:param bool silent_start: if True, the logger will not display the start banner (default False)
:ivar bool error: if True an error has occurred along the process
:ivar str ovarall_CC: overall correlation coefficient between the phases in the mtz file and the pdb file
:ivar str local_CC: local correlation coefficient between the phases in the mtz file and the pdb file
:example:
>>> from swamp.wrappers import PhenixCC
>>> my_pehnix = PhenixCC('<workdir>', '<pdbin>', '<mtzin>')
>>> my_pehnix.run()
"""
def __init__(self, workdir, pdbin, mtzin, logger=None, silent_start=False):
super(PhenixCC, self).__init__(workdir=workdir, logger=logger, silent_start=silent_start)
self.overall_CC = "NA"
self.local_CC = "NA"
self.pdbin = pdbin
self.mtzin = mtzin
@property
def wrapper_name(self):
"""The name of this `~swamp.wrapper.wrapper.Wrapper` child class (phenix_cc)"""
return "phenix.get_cc_mtz_pdb"
@property
def source(self):
"""Override :py:attr:`~swamp.wrappers.wrapper.Wrapper.source` to include PHENIX/build/bin instead of CCP4/bin"""
return os.path.join(os.environ['PHENIX'], 'build', 'bin', self.wrapper_name)
@property
def cmd(self):
"""Command to be executed on the shell"""
return [self.source, self.mtzin, self.pdbin]
@property
def keywords(self):
"""No keywords are used through stdin in phenix.get_cc_mtz_pdb"""
return None
@property
def summary_results(self):
"""A summary with the obtained figures of merit"""
return "Results: Local CC - %s Overall CC - %s" % (self.local_CC, self.overall_CC)
def _check_error(self):
"""Check if errors have occurred during execution of :py:attr:`~swamp.wrappers.phenixcc.PhenixCC.cmd`"""
if not os.path.isfile(self.logfile):
self.logger.error("No phenix output, aborting!")
self.error = True
def _clean_files(self):
"""Remove annoying files"""
try:
shutil.rmtree(os.path.join(self.workdir, "temp_dir"))
os.remove(os.path.join(self.workdir, "cc.log"))
os.remove(os.path.join(self.workdir, "offset.pdb"))
except OSError:
self.logger.warning("Unable to clean files after phenix.get_cc! Current wd : %s" % self.workdir)
def _run(self):
"""Run :py:attr:`~swamp.wrappers.phenixcc.PhenixCC.cmd` and store the results"""
# Manage workdirs
self.make_workdir()
current_workdir = os.getcwd()
os.chdir(self.workdir)
# Run phenix.get_cc
self.logger.debug(" ".join(self.cmd))
self.logcontents = cexec(self.cmd, permit_nonzero=True)
self.make_logfile()
self._clean_files()
self._check_error()
if self.error:
return
self.get_scores()
# Return to original working directory
os.chdir(current_workdir)
[docs] def get_scores(self, logfile=None):
"""Use :py:obj:`~swamp.parsers.phenixparser.PhenixParser` to parse the log file and obtain values for \
:py:attr:`~swamp.wrappers.phenixcc.PhenixCC.local_CC` and \
:py:attr:`~swamp.wrappers.phenixcc.PhenixCC.overall_CC`
:param logfile: Not in use
"""
parser = PhenixParser(logger=self.logger, stdout=self.logcontents)
parser.parse()
if parser.error:
self.error = True
self.logger.warning('Previous errors while parsing phenix.get_cc output detected!')
else:
self.local_CC, self.overall_CC = parser.summary