Source code for aiida_amber.cli.tleap

#!/usr/bin/env python
"""Command line utility to run amber tleap command with AiiDA.

Usage: aiida_tleap --help
"""

import os

import click

from aiida import cmdline, engine
from aiida.orm import SinglefileData
from aiida.plugins import CalculationFactory, DataFactory

from aiida_amber import helpers
from aiida_amber.data.tleap_input import TleapInputData

# from aiida_amber.utils import searchprevious


[docs] def launch(params): """Run tleap. Uses helpers to add amber on localhost to AiiDA on the fly. - get inputs and outputs - check if they are files - add them as nodes """ # Prune unused CLI parameters from dict. params = {k: v for k, v in params.items() if v is not None} # dict to hold our calculation data. inputs = { "metadata": { "description": params.pop("description"), }, } # If code is not initialised, then setup. if "code" in inputs: inputs["code"] = params.pop("code") else: computer = helpers.get_computer() inputs["code"] = helpers.get_code(entry_point="tleap", computer=computer) # Prepare input parameters in AiiDA formats. # Set the tleap script as a TleapInputData type node inputs["tleapscript"] = TleapInputData( file=os.path.join(os.getcwd(), params.pop("f")) ) # Find the inputs and outputs referenced in the tleap script calc_inputs, calc_outputs = inputs["tleapscript"].calculation_inputs_outputs # add input files and dirs referenced in tleap file into inputs inputs.update(calc_inputs) inputs.update(calc_outputs) print(inputs) if "i" in params: for i, subdir in enumerate(params["i"]): inputs["dirs"][f"dir{i}"] = SinglefileData( file=os.path.join(os.getcwd(), subdir) ) params.pop("i") TleapParameters = DataFactory("amber.tleap") inputs["parameters"] = TleapParameters(params) # need to search previous processes properly # check if inputs are outputs from prev processes # inputs = searchprevious.append_prev_nodes(inputs, inputs["input_list"]) # check if a pytest test is running, if so run rather than submit aiida job # Note: in order to submit your calculation to the aiida daemon, do: # pylint: disable=unused-variable if "PYTEST_CURRENT_TEST" in os.environ: future = engine.run(CalculationFactory("amber.tleap"), **inputs) else: future = engine.submit(CalculationFactory("amber.tleap"), **inputs)
@click.command() @cmdline.utils.decorators.with_dbenv() @cmdline.params.options.CODE() # Plugin options @click.option( "--description", default="record tleap data provenance via the aiida_amber plugin", type=str, help="Short metadata description", ) # Input file options @click.option( "-f", default="tleapscript", type=str, help="input script for tleap commands" ) @click.option( "-I", type=str, multiple=True, help="dir containing leaprc files", ) def cli(*args, **kwargs): # pylint: disable=unused-argument # pylint: disable=line-too-long """Run example. Example usage: $ aiida_tleap --code tleap@localhost -f input_files/tleap.in Alternative (automatically tried to create amber@localhost code, but requires amber to be installed and available in your environment path): $ aiida_tleap -f input_files/tleap.in Help: $ aiida_tleap --help """ launch(kwargs) if __name__ == "__main__": cli() # pylint: disable=no-value-for-parameter