From 325657fc89b71eba95e4b2e462a342f28fb4b93a Mon Sep 17 00:00:00 2001 From: IAlibay Date: Thu, 19 Sep 2024 20:01:44 +0100 Subject: [PATCH] dry test #1 --- .../protocols/solvation/asfe_protocol.py | 12 +++-- src/pontibus/protocols/solvation/base.py | 13 +++-- src/pontibus/protocols/solvation/settings.py | 9 +++- src/pontibus/tests/protocols/__init__.py | 0 .../tests/protocols/solvation/__init__.py | 0 .../tests/protocols/solvation/test_dry_run.py | 51 +++++++++++++++++++ 6 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 src/pontibus/tests/protocols/__init__.py create mode 100644 src/pontibus/tests/protocols/solvation/__init__.py create mode 100644 src/pontibus/tests/protocols/solvation/test_dry_run.py diff --git a/src/pontibus/protocols/solvation/asfe_protocol.py b/src/pontibus/protocols/solvation/asfe_protocol.py index 9a6af6f..2064c2e 100644 --- a/src/pontibus/protocols/solvation/asfe_protocol.py +++ b/src/pontibus/protocols/solvation/asfe_protocol.py @@ -33,7 +33,7 @@ MDOutputSettings, InterchangeFFSettings, PackmolSolvationSettings, - AlchemicalSettings, + ExperimentalAlchemicalSettings, LambdaSettings, ) from pontibus.protocols.solvation import ( @@ -71,7 +71,9 @@ def _default_settings(cls): """ return ASFESettings( protocol_repeats=3, - solvent_forcefield_settings=InterchangeFFSettings(), + solvent_forcefield_settings=InterchangeFFSettings( + nonbonded_method='pme', + ), vacuum_forcefield_settings=InterchangeFFSettings( nonbonded_method="nocutoff", ), @@ -79,7 +81,7 @@ def _default_settings(cls): temperature=298.15 * unit.kelvin, pressure=1 * unit.bar, ), - alchemical_settings=AlchemicalSettings(), + alchemical_settings=ExperimentalAlchemicalSettings(), lambda_settings=LambdaSettings( lambda_elec=[ 0.0, @@ -355,7 +357,7 @@ def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: * thermo_settings : ThermoSettings * charge_settings : OpenFFPartialChargeSettings * solvation_settings : PackmolSolvationSettings - * alchemical_settings : AlchemicalSettings + * alchemical_settings : ExperimentalAlchemicalSettings * lambda_settings : LambdaSettings * engine_settings : OpenMMEngineSettings * integrator_settings : IntegratorSettings @@ -437,7 +439,7 @@ def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: * thermo_settings : ThermoSettings * charge_settings : OpenFFPartialChargeSettings * solvation_settings : PackmolSolvationSettings - * alchemical_settings : AlchemicalSettings + * alchemical_settings : ExperimentalAlchemicalSettings * lambda_settings : LambdaSettings * engine_settings : OpenMMEngineSettings * integrator_settings : IntegratorSettings diff --git a/src/pontibus/protocols/solvation/base.py b/src/pontibus/protocols/solvation/base.py index d83a415..0bfe24c 100644 --- a/src/pontibus/protocols/solvation/base.py +++ b/src/pontibus/protocols/solvation/base.py @@ -159,7 +159,6 @@ def _get_omm_objects( * For now this method solely calls interchange system creation for solvation. """ - if self.verbose: self.logger.info("Parameterizing system") @@ -179,12 +178,12 @@ def _get_omm_objects( # Create your interchange object with without_oechem_backend(): interchange, comp_resids = interchange_packmol_creation( - settings["forcefield_settings"], - settings["solvation_settings"], - protein_component, - solvent_component, - solvent_offmol, - smc_components, + ffsettings=settings["forcefield_settings"], + solvation_settings=settings["solvation_settings"], + smc_components=smc_components, + protein_component=protein_component, + solvent_component=solvent_component, + solvent_offmol=solvent_offmol, ) # Get omm objects back diff --git a/src/pontibus/protocols/solvation/settings.py b/src/pontibus/protocols/solvation/settings.py index ec261cc..e513042 100644 --- a/src/pontibus/protocols/solvation/settings.py +++ b/src/pontibus/protocols/solvation/settings.py @@ -38,6 +38,13 @@ from pydantic.v1 import validator +class ExperimentalAlchemicalSettings(AlchemicalSettings): + experimental: bool = False + """ + Turn on experimental alchemy settings + """ + + class InterchangeFFSettings(BaseForceFieldSettings): """ Parameters to set up the force field using Interchange and the @@ -56,7 +63,7 @@ class InterchangeFFSettings(BaseForceFieldSettings): ] """List of force field ffxmls to apply""" - nonbonded_method = "PME", "NoCutoff" + nonbonded_method: Literal['pme', 'nocutoff'] = "pme" """ Method for treating nonbonded interactions, currently only PME and NoCutoff are allowed. Default PME. diff --git a/src/pontibus/tests/protocols/__init__.py b/src/pontibus/tests/protocols/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/protocols/solvation/__init__.py b/src/pontibus/tests/protocols/solvation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/protocols/solvation/test_dry_run.py b/src/pontibus/tests/protocols/solvation/test_dry_run.py new file mode 100644 index 0000000..1a6e790 --- /dev/null +++ b/src/pontibus/tests/protocols/solvation/test_dry_run.py @@ -0,0 +1,51 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +import pytest +from gufe import ChemicalSystem +from pontibus.protocols.solvation import ASFEProtocol, ASFESolventUnit, ASFEVacuumUnit +from pontibus.components import ExtendedSolventComponent + + +@pytest.mark.parametrize("method", ["repex", "sams", "independent", "InDePeNdENT"]) +def test_dry_run_vacuum_benzene(benzene_modifications, method, tmpdir): + s = ASFEProtocol.default_settings() + s.protocol_repeats = 1 + s.vacuum_simulation_settings.sampler_method = method + + protocol = ASFEProtocol( + settings=s, + ) + + stateA = ChemicalSystem( + { + "benzene": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ) + + stateB = ChemicalSystem( + { + "solvent": ExtendedSolventComponent(), + } + ) + + # Create DAG from protocol, get the vacuum and solvent units + # and eventually dry run the first vacuum unit + dag = protocol.create( + stateA=stateA, + stateB=stateB, + mapping=None, + ) + prot_units = list(dag.protocol_units) + + assert len(prot_units) == 2 + + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + + assert len(vac_unit) == 1 + assert len(sol_unit) == 1 + + with tmpdir.as_cwd(): + vac_sampler = vac_unit[0].run(dry=True)["debug"]["sampler"] + assert not vac_sampler.is_periodic