Source code for swamp.parsers.refmacparser

from swamp.parsers.parser import Parser


[docs]class RefmacParser(Parser): """Refmac output parser :param str stdout: the stdout to be parsed (default None) :param `~swamp.logger.swamplogger.SwampLogger` logger: logging interface for the parser (default None) :ivar str rfactor: the Rfactor as parsed from the :py:attr:`~swamp.parsers.parser.fname` :ivar tuple rfactor_delta: the intial and final Rfactor as parsed from the :py:attr:`~swamp.parsers.parser.fname` :ivar str rfree: the Rfree as parsed from the :py:attr:`~swamp.parsers.parser.fname` :ivar tuple rfree_delta: the intial and final Rfree as parsed from the :py:attr:`~swamp.parsers.parser.fname` :ivar tuple bondlenght_delta: the intial and final Bond length parsed from :py:attr:`~swamp.parsers.parser.fname` :ivar tuple bondangle_delta: the intial and final Bond angle parsed from :py:attr:`~swamp.parsers.parser.fname` :ivar tuple chirvol_delta: the intial and final Chirvol as parsed from the :py:attr:`~swamp.parsers.parser.fname` :example: >>> from swamp.parsers import RefmacParser >>> my_parser = RefmacParser('<stdout>') >>> my_parser.parse() """ def __init__(self, stdout, logger=None): self.rfactor = "NA" self.rfree = "NA" self.rfactor_delta = ("NA", "NA") self.rfree_delta = ("NA", "NA") self.bondlenght_delta = ("NA", "NA") self.bondangle_delta = ("NA", "NA") self.chirvol_delta = ("NA", "NA") super(RefmacParser, self).__init__(fname=None, stdout=stdout, logger=logger) @property def summary(self): """A summary of the figures of merit""" return self.rfactor, self.rfree, self.rfactor_delta, self.rfree_delta, \ self.bondlenght_delta, self.bondangle_delta, self.chirvol_delta
[docs] def parse(self): """Extract the figures of merit from :py:attr:`~swamp.parsers.parser.stdout`""" reached_end = False for line in self.stdout.split("\n"): if "Final results" in line: reached_end = True elif reached_end and "R factor" in line: self.rfactor = line.split()[3].rstrip().encode('utf-8') self.rfactor_delta = (line.split()[2].rstrip().encode('utf-8'), self.rfactor) elif reached_end and "R free" in line: self.rfree = line.split()[3].rstrip().encode('utf-8') self.rfree_delta = (line.split()[2].rstrip().encode('utf-8'), self.rfree) elif reached_end and "Rms BondLength" in line: self.bondlenght_delta = ( line.split()[2].rstrip().encode('utf-8'), line.split()[3].rstrip().encode('utf-8')) elif reached_end and "Rms BondAngle" in line: self.bondangle_delta = ( line.split()[2].rstrip().encode('utf-8'), line.split()[3].rstrip().encode('utf-8')) elif reached_end and "Rms ChirVolume" in line: self.chirvol_delta = ( line.split()[2].rstrip().encode('utf-8'), line.split()[3].rstrip().encode('utf-8')) # If there is no rfree or rfactor, there was an error if self.rfactor == "NA" and self.rfree == "NA": self.logger.error("Refmac did not report Rfree and Rfactor !") self.error = True