Source code for aiida_gromacs.parsers.make_ndx

"""
Parsers provided by aiida_gromacs.

This calculation configures the ability to use the 'gmx make_ndx' executable.
"""
import os
from pathlib import Path
from aiida.common import exceptions
from aiida.engine import ExitCode
from aiida.orm import SinglefileData
from aiida.parsers.parser import Parser
from aiida.plugins import CalculationFactory

Make_ndxCalculation = CalculationFactory("gromacs.make_ndx")


[docs] class Make_ndxParser(Parser): """ Parser class for parsing output of calculation. """
[docs] def __init__(self, node): """ Initialize Parser instance Checks that the ProcessNode being passed was produced by a Make_ndxCalculation. :param node: ProcessNode of calculation :param type node: :class:`aiida.orm.nodes.process.process.ProcessNode` """ super().__init__(node) if not issubclass(node.process_class, Make_ndxCalculation): raise exceptions.ParsingError("Can only parse Make_ndxCalculation")
[docs] def parse(self, **kwargs): """ Parse outputs, store results in database. :returns: an exit code, if parsing fails (or nothing if parsing succeeds) """ # the directory for storing parsed output files output_dir = Path(self.node.get_option("output_dir")) # Map output files to how they are named. outputs = ["stdout"] output_template = { "o": "n_file_out", } for item in output_template: if item in self.node.inputs.parameters.keys(): outputs.append(output_template[item]) # Grab list of retrieved files. files_retrieved = self.retrieved.base.repository.list_object_names() # Grab list of files expected and remove the scheduler stdout and stderr files. files_expected = [files for files in self.node.get_option("retrieve_list") if files not in ["_scheduler-stdout.txt", "_scheduler-stderr.txt"]] # Check if the expected files are a subset of retrieved. if not set(files_expected) <= set(files_retrieved): self.logger.error( f"Found files '{files_retrieved}', expected to find '{files_expected}'" ) return self.exit_codes.ERROR_MISSING_OUTPUT_FILES # Map retrieved files to data nodes. for i, f in enumerate(files_expected): self.logger.info(f"Parsing '{f}'") with self.retrieved.base.repository.open(f, "rb") as handle: output_node = SinglefileData(filename=f, file=handle) self.out(outputs[i], output_node) # If not in testing mode, then copy back the files. if "PYTEST_CURRENT_TEST" not in os.environ: self.retrieved.copy_tree(output_dir) return ExitCode(0)