Source code for aiida_amber.calculations.sander

"""
Calculations provided by aiida_amber.

Register calculations via the "aiida.calculations" entry point in setup.json.
"""
import os

from aiida.common import CalcInfo, datastructures
from aiida.engine import CalcJob
from aiida.orm import SinglefileData
from aiida.plugins import DataFactory

SanderParameters = DataFactory("amber.sander")


[docs] class SanderCalculation(CalcJob): """ AiiDA calculation plugin wrapping the sander executable. AiiDA plugin wrapper for the amber 'sander' command. """
[docs] @classmethod def define(cls, spec): """Define inputs and outputs of the calculation.""" # yapf: disable super().define(spec) # set default values for AiiDA options spec.inputs['metadata']['options']['withmpi'].default = False spec.inputs["metadata"]["options"]["resources"].default = { "num_machines": 1, "num_mpiprocs_per_machine": 1, } # required inputs spec.inputs["metadata"]["options"]["parser_name"].default = "amber.sander" spec.input('metadata.options.output_filename', valid_type=str, default='sander.out') spec.input('metadata.options.output_dir', valid_type=str, default=os.getcwd(), help='Directory where output files will be saved when parsed.') spec.input('parameters', valid_type=SanderParameters, help='Command line parameters for sander') spec.input("mdin", valid_type=SinglefileData, help="input control data for the min/md run.") spec.input("prmtop", valid_type=SinglefileData, help="input molecular topology, force field, " "periodic box type, atom and residue names.") spec.input("inpcrd", valid_type=SinglefileData, help="input initial coordinates and (optionally) " "velocities and periodic box size.") # optional inputs spec.input("refc", valid_type=SinglefileData, required=False, help="input (optional) reference coords for position " "restraints; also used for targeted MD.") spec.input("mtmd", valid_type=SinglefileData, required=False, help="input (optional) containing list of files and " "parameters for targeted MD to multiple targets.") spec.input("inptraj", valid_type=SinglefileData, required=False, help="input coordinate sets in trajectory format, when " "imin=5 or 6.") spec.input("inpdip", valid_type=SinglefileData, required=False, help="input polarizable dipole file, when indmeth=3.") spec.input("cpin", valid_type=SinglefileData, required=False, help="input protonation state definitions.") spec.input("cprestrt", valid_type=SinglefileData, required=False, help="protonation state definitions, final protonation " "states for restart (same format as cpin).") spec.input("cein", valid_type=SinglefileData, required=False, help="input redox state definitions.") spec.input("cerestrt", valid_type=SinglefileData, required=False, help="redox state definitions, final redox states for " "restart (same format as cein).") spec.input("evbin", valid_type=SinglefileData, required=False, help="input input for EVB potentials.") # required outputs spec.output('stdout', valid_type=SinglefileData, help='stdout') spec.output("mdout", valid_type=SinglefileData, help="output user readable state info and diagnostics -o " "stdout will send output to stdout (to the terminal) " "instead of to a file.") spec.output("mdinfo", valid_type=SinglefileData, help="output latest mdout-format energy info.") # optional outputs spec.output("mdcrd", valid_type=SinglefileData, required=False, help="output coordinate sets saved over trajectory.") spec.output("mdvel", valid_type=SinglefileData, required=False, help="output velocity sets saved over trajectory.") spec.output("mdfrc", valid_type=SinglefileData, required=False, help="output force sets saved over trajectory.") spec.output("mden", valid_type=SinglefileData, required=False, help="output extensive energy data over trajectory " "(not synchronized with mdcrd or mdvel).") spec.output("restrt", valid_type=SinglefileData, required=False, help="output final coordinates, velocity, and box " "dimensions if any - for restarting run.") spec.output("rstdip", valid_type=SinglefileData, required=False, help="output polarizable dipole file, when indmeth=3.") spec.output("cpout", valid_type=SinglefileData, required=False, help="output protonation state data saved over trajectory.") spec.output("ceout", valid_type=SinglefileData, required=False, help="output redox state data saved over trajectory.") spec.output("suffix", valid_type=str, required=False, help="output this string will be added to all unspecified " "output files that are printed (for multisander runs, it " "will append this suffix to all output files).") spec.exit_code(300, "ERROR_MISSING_OUTPUT_FILES", message="Calculation did not produce all expected output files.")
[docs] def prepare_for_submission(self, folder): """ Create input files. :param folder: an `aiida.common.folders.Folder` where the plugin should temporarily place all files needed by the calculation. :return: `aiida.common.datastructures.CalcInfo` instance """ codeinfo = datastructures.CodeInfo() # Setup data structures for files. input_options = [ "mdin", "prmtop", "inpcrd", "refc", "mtmd", "inptraj", "inpdip", "cpin", "cein", "evbin", ] output_options = [ "o", "inf", "x", "v", "frc", "e", "r", "rdip", "cprestrt", "cpout", "cerestrt", "ceout", "suffix", ] cmdline_input_files = {} input_files = [] output_files = [] # Map input files to AiiDA plugin data types. for item in input_options: if item in self.inputs: cmdline_input_files[item] = self.inputs[item].filename input_files.append( ( self.inputs[item].uuid, self.inputs[item].filename, self.inputs[item].filename, ) ) # Add output files to retrieve list. output_files.append(self.metadata.options.output_filename) for item in output_options: if item in self.inputs.parameters: output_files.append(self.inputs.parameters[item]) # Form the commandline. codeinfo.cmdline_params = self.inputs.parameters.cmdline_params( cmdline_input_files ) codeinfo.code_uuid = self.inputs.code.uuid codeinfo.stdout_name = self.metadata.options.output_filename codeinfo.withmpi = self.inputs.metadata.options.withmpi # Prepare a `CalcInfo` to be returned to the engine calcinfo = CalcInfo() calcinfo.codes_info = [codeinfo] calcinfo.local_copy_list = input_files calcinfo.retrieve_list = output_files return calcinfo