Source code for openff.interchange.drivers.all

"""Functions for running energy evluations with all available engines."""
from typing import TYPE_CHECKING, Dict

from openff.utilities.utilities import requires_package

from openff.interchange.drivers.amber import get_amber_energies
from openff.interchange.drivers.gromacs import get_gromacs_energies
from openff.interchange.drivers.lammps import get_lammps_energies
from openff.interchange.drivers.openmm import get_openmm_energies
from openff.interchange.drivers.report import EnergyReport
from openff.interchange.exceptions import AmberError, GMXRunError, LAMMPSRunError

if TYPE_CHECKING:
    from pandas import DataFrame

    from openff.interchange.components.interchange import Interchange


[docs]def get_all_energies(interchange: "Interchange") -> Dict[str, EnergyReport]: """ Given an Interchange object, return single-point energies as computed by all available engines. """ # TODO: Return something nan-like if one driver fails, but still return others that succeed # TODO: Have each driver return the version of the engine that was used all_energies = { "OpenMM": get_openmm_energies(interchange), } for engine_name, engine_driver, engine_exception in [ ("Amber", get_amber_energies, AmberError), ("GROMACS", get_gromacs_energies, GMXRunError), ("LAMMPS", get_lammps_energies, LAMMPSRunError), ]: try: all_energies[engine_name] = engine_driver(interchange) # type: ignore[operator] except engine_exception: pass return all_energies
[docs]@requires_package("pandas") def get_summary_data(interchange: "Interchange") -> "DataFrame": """Return a pandas DataFrame with summaries of energies from all available engines.""" from openff.units import unit from pandas import DataFrame kj_mol = unit.kilojoule / unit.mol energies = get_all_energies(interchange) for k, v in energies.items(): for kk in v.energies: energies[k].energies[kk] = energies[k].energies[kk].m_as(kj_mol) # type: ignore[union-attr] return DataFrame({k: v.energies for k, v in energies.items()}).T