From 51418ffb32c956a583f3dc70aa44fd4363c9184b Mon Sep 17 00:00:00 2001 From: IAlibay Date: Mon, 19 Jan 2026 21:18:23 +0000 Subject: [PATCH 01/32] Add various CI runners --- .github/workflows/ci-latest.yaml | 70 ++++++++++++ .github/workflows/gpu-integration-tests.yaml | 109 +++++++++++++++++++ devtools/latest_environment.yml | 38 +++++++ 3 files changed, 217 insertions(+) create mode 100644 .github/workflows/ci-latest.yaml create mode 100644 .github/workflows/gpu-integration-tests.yaml create mode 100644 devtools/latest_environment.yml diff --git a/.github/workflows/ci-latest.yaml b/.github/workflows/ci-latest.yaml new file mode 100644 index 0000000..1b6e4d7 --- /dev/null +++ b/.github/workflows/ci-latest.yaml @@ -0,0 +1,70 @@ +name: "Lastest deps CI" +on: + # pull_request: + # branches: + # - main + # paths-ignore: + # - "docs/*" + # push: + # branches: + # - main + schedule: + # At 07:00 UTC on Monday and Thursday + - cron: "0 7 * * *" + workflow_dispatch: + + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +defaults: + run: + shell: bash -l {0} + +jobs: + tests: + runs-on: ${{ matrix.os }} + name: "${{ matrix.os }} - ${{ matrix.python-version }}" + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "macos-latest"] + python-version: + - "3.13" + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: "Setup Micromamba" + uses: mamba-org/setup-micromamba@v2 + with: + environment-file: devtools/latest_environment.yml + environment-name: pontibus + create-args: >- + python=${{ matrix.python-version }} + init-shell: bash + + - name: "Install" + run: python -m pip install --no-deps -e . + + - name: "Test imports" + run: | + # if we add more to this, consider changing to for + env vars + python -Ic "import pontibus; print(pontibus.__version__)" + + - name: "Environment Information" + run: | + micromamba info + micromamba list + pip list + + - name: "Run tests" + env: + PONTIBUS_SLOW_TESTS: TRUE + PONTIBUS_CPUVSLOW_TESTS: FALSE + PONTIBUS_GPU_TESTS: FALSE + DUECREDIT_ENABLE: 'yes' + run: | + pytest -n logical -v --durations=10 diff --git a/.github/workflows/gpu-integration-tests.yaml b/.github/workflows/gpu-integration-tests.yaml new file mode 100644 index 0000000..0af4061 --- /dev/null +++ b/.github/workflows/gpu-integration-tests.yaml @@ -0,0 +1,109 @@ +name: GPU Integration Tests (manual dispatch) +on: + workflow_dispatch: + +jobs: + start-aws-runner: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + outputs: + mapping: ${{ steps.aws-start.outputs.mapping }} + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS + aws-region: us-east-2 + - name: Create cloud runner + id: aws-start + uses: omsf/start-aws-gha-runner@v1.0.0 + with: + aws_image_id: ami-076a54ed41e67782d + aws_instance_type: g4dn.xlarge + aws_home_dir: /home/ubuntu + aws_root_device_size: 125 + env: + GH_PAT: ${{ secrets.GH_PAT }} + + self-hosted-test: + runs-on: self-hosted + timeout-minutes: 720 # 12 hours + defaults: + run: + shell: bash -leo pipefail {0} + + needs: + - start-aws-runner + steps: + - uses: actions/checkout@v4 + + - name: Print disk usage + run: "df -h" + + - name: Print Docker details + run: "docker version || true" + + - name: Check for nvidia-smi + run: "nvidia-smi" + + - name: "Setup Micromamba" + uses: mamba-org/setup-micromamba@v2 + with: + environment-file: environment.yml + environment-name: pontibus + condarc: | + channels: + - conda-forge + create-args: >- + python=3.13 + cuda-version=12.8 + + - name: "Check if OpenMM can get a GPU" + run: python -m openmm.testInstallation + + - name: "Install" + run: python -m pip install --no-deps -e . + + - name: "Test imports" + run: | + # if we add more to this, consider changing to for + env vars + python -Ic "import pontibus; print(pontibus.__version__)" + + - name: "Environment Information" + run: | + micromamba info + micromamba list + pip list + + - name: "Run tests" + env: + DUECREDIT_ENABLE: 'yes' + PONTIBUS_CPUVSLOW_TESTS: FALSE + PONTIBUS_GPU_TESTS: TRUE + run: | + # The -m flag will only run tests with @pytest.mark.gpu + pytest -n logical -vv --durations=10 -m gpu + + stop-aws-runner: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + needs: + - start-aws-runner + - self-hosted-test + if: ${{ always() }} + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS + aws-region: us-east-2 + - name: Stop instances + uses: omsf/stop-aws-gha-runner@v1.0.0 + with: + instance_mapping: ${{ needs.start-aws-runner.outputs.mapping }} + env: + GH_PAT: ${{ secrets.GH_PAT }} diff --git a/devtools/latest_environment.yml b/devtools/latest_environment.yml new file mode 100644 index 0000000..6514168 --- /dev/null +++ b/devtools/latest_environment.yml @@ -0,0 +1,38 @@ +name: pontibus +channels: + - conda-forge +dependencies: + - pip + - gufe >=1.7 + - openff-toolkit >0.16.0 + - openff-interchange >=0.4.8 + - openff-nagl-base >=0.3.3 + # OpenFE stack deps + - duecredit<0.10 + - kartograf>=1.0.0 + - konnektor + - lomap2>=3.0.0 + - numpy + - networkx + - rdkit + - packaging + - pip + - pydantic >=2.0 + - pyyaml + - coverage + - cinnabar ~=0.5.0 + - click + - typing-extensions + - openmm >=8.0.0,!=8.1.0,<8.3.0 + - openmmtools >=0.25.0 + - openmmforcefields + - openfe-analysis >=0.3.1 + - plugcli + - tqdm + # Testing deps + - pytest + - pytest-cov + - pytest-xdist + # pip deps + - pip: + - git+https://github.com/OpenFreeEnergy/openfe@main From 99c310b578cb1bbdfc08d92886024fe43f6c452b Mon Sep 17 00:00:00 2001 From: IAlibay Date: Mon, 19 Jan 2026 21:22:19 +0000 Subject: [PATCH 02/32] Add cpu vslow runner --- .github/workflows/cpu-vslow-tests.yaml | 103 +++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .github/workflows/cpu-vslow-tests.yaml diff --git a/.github/workflows/cpu-vslow-tests.yaml b/.github/workflows/cpu-vslow-tests.yaml new file mode 100644 index 0000000..1dd9804 --- /dev/null +++ b/.github/workflows/cpu-vslow-tests.yaml @@ -0,0 +1,103 @@ +name: CPU Very Slow Tests (manual dispatch) +on: + workflow_dispatch: + +jobs: + start-aws-runner: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + outputs: + mapping: ${{ steps.aws-start.outputs.mapping }} + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS + aws-region: us-east-2 + - name: Create cloud runner + id: aws-start + uses: omsf/start-aws-gha-runner@v1.0.0 + with: + aws_image_id: ami-0b7f661c228e6a4bb + aws_instance_type: c7i.xlarge + aws_home_dir: /home/ubuntu + aws_root_device_size: 125 + env: + GH_PAT: ${{ secrets.GH_PAT }} + + self-hosted-test: + runs-on: self-hosted + timeout-minutes: 720 # 12 hours + defaults: + run: + shell: bash -leo pipefail {0} + + needs: + - start-aws-runner + steps: + - uses: actions/checkout@v4 + + - name: Print disk usage + run: "df -h" + + - name: Print Docker details + run: "docker version || true" + + - name: "Setup Micromamba" + uses: mamba-org/setup-micromamba@v2 + with: + environment-file: environment.yml + environment-name: pontibus + condarc: | + channels: + - conda-forge + create-args: >- + python=3.13 + + - name: "Check if OpenMM can get a GPU" + run: python -m openmm.testInstallation + + - name: "Install" + run: python -m pip install --no-deps -e . + + - name: "Test imports" + run: | + python -Ic "import pontibus; print(pontibus.__version__)" + + - name: "Environment Information" + run: | + micromamba info + micromamba list + pip list + + - name: "Run tests" + env: + DUECREDIT_ENABLE: 'yes' + PONTIBUS_CPUVSLOW_TESTS: TRUE + PONTIBUS_GPU_TESTS: FALSE + run: | + pytest -n logical -vv --durations=10 --cpuvslow + + stop-aws-runner: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + needs: + - start-aws-runner + - self-hosted-test + if: ${{ always() }} + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS + aws-region: us-east-2 + - name: Stop instances + uses: omsf/stop-aws-gha-runner@v1.0.0 + with: + instance_mapping: ${{ needs.start-aws-runner.outputs.mapping }} + env: + GH_PAT: ${{ secrets.GH_PAT }} From 7af3b9d7be8a97defbf28ef032df888c1e3537aa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 21:29:07 +0000 Subject: [PATCH 03/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .github/workflows/cpu-vslow-tests.yaml | 4 ++-- .github/workflows/gpu-integration-tests.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cpu-vslow-tests.yaml b/.github/workflows/cpu-vslow-tests.yaml index 1dd9804..0c1825a 100644 --- a/.github/workflows/cpu-vslow-tests.yaml +++ b/.github/workflows/cpu-vslow-tests.yaml @@ -23,13 +23,13 @@ jobs: aws_image_id: ami-0b7f661c228e6a4bb aws_instance_type: c7i.xlarge aws_home_dir: /home/ubuntu - aws_root_device_size: 125 + aws_root_device_size: 125 env: GH_PAT: ${{ secrets.GH_PAT }} self-hosted-test: runs-on: self-hosted - timeout-minutes: 720 # 12 hours + timeout-minutes: 720 # 12 hours defaults: run: shell: bash -leo pipefail {0} diff --git a/.github/workflows/gpu-integration-tests.yaml b/.github/workflows/gpu-integration-tests.yaml index 0af4061..d5939b8 100644 --- a/.github/workflows/gpu-integration-tests.yaml +++ b/.github/workflows/gpu-integration-tests.yaml @@ -29,7 +29,7 @@ jobs: self-hosted-test: runs-on: self-hosted - timeout-minutes: 720 # 12 hours + timeout-minutes: 720 # 12 hours defaults: run: shell: bash -leo pipefail {0} @@ -69,7 +69,7 @@ jobs: - name: "Test imports" run: | # if we add more to this, consider changing to for + env vars - python -Ic "import pontibus; print(pontibus.__version__)" + python -Ic "import pontibus; print(pontibus.__version__)" - name: "Environment Information" run: | From 36d56c223bfeffa7fa95725ee318b50e7937b035 Mon Sep 17 00:00:00 2001 From: Alyssa Travitz Date: Mon, 23 Feb 2026 15:55:28 -0800 Subject: [PATCH 04/32] update dev env --- devtools/{latest_environment.yml => environment_dev.yml} | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) rename devtools/{latest_environment.yml => environment_dev.yml} (80%) diff --git a/devtools/latest_environment.yml b/devtools/environment_dev.yml similarity index 80% rename from devtools/latest_environment.yml rename to devtools/environment_dev.yml index 6514168..0579c18 100644 --- a/devtools/latest_environment.yml +++ b/devtools/environment_dev.yml @@ -1,9 +1,9 @@ -name: pontibus +# env for testing against pre-release versions of openfe (and any other dependencies). +name: pontibus-dev channels: - conda-forge dependencies: - pip - - gufe >=1.7 - openff-toolkit >0.16.0 - openff-interchange >=0.4.8 - openff-nagl-base >=0.3.3 @@ -36,3 +36,5 @@ dependencies: # pip deps - pip: - git+https://github.com/OpenFreeEnergy/openfe@main + - git+https://github.com/OpenFreeEnergy/gufe@main + From fd1694f8ef30b7a9ba44da6736257fb09a167784 Mon Sep 17 00:00:00 2001 From: Alyssa Travitz Date: Mon, 23 Feb 2026 15:57:05 -0800 Subject: [PATCH 05/32] update ci for testing against deps main branches --- .../{ci-latest.yaml => ci-dev-main.yaml} | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) rename .github/workflows/{ci-latest.yaml => ci-dev-main.yaml} (84%) diff --git a/.github/workflows/ci-latest.yaml b/.github/workflows/ci-dev-main.yaml similarity index 84% rename from .github/workflows/ci-latest.yaml rename to .github/workflows/ci-dev-main.yaml index 1b6e4d7..d19142e 100644 --- a/.github/workflows/ci-latest.yaml +++ b/.github/workflows/ci-dev-main.yaml @@ -1,13 +1,8 @@ -name: "Lastest deps CI" +name: "CI - main branch of deps" on: - # pull_request: - # branches: - # - main - # paths-ignore: - # - "docs/*" - # push: - # branches: - # - main + push: + branches: + - main schedule: # At 07:00 UTC on Monday and Thursday - cron: "0 7 * * *" @@ -29,9 +24,9 @@ jobs: strategy: fail-fast: false matrix: - os: ["ubuntu-latest", "macos-latest"] + os: ["ubuntu-latest"] python-version: - - "3.13" + - "3.12" steps: - uses: actions/checkout@v4 with: @@ -41,7 +36,7 @@ jobs: uses: mamba-org/setup-micromamba@v2 with: environment-file: devtools/latest_environment.yml - environment-name: pontibus + environment-name: pontibus-dev create-args: >- python=${{ matrix.python-version }} init-shell: bash From 0c874f9b6e8e9ded5d73c25161596f1727ce87ed Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sat, 7 Mar 2026 14:32:49 +0000 Subject: [PATCH 06/32] First attempt at updating for openfe v1.9 --- src/pontibus/protocols/relative/__init__.py | 10 +- .../protocols/relative/hybridtop_protocol.py | 106 ++- .../relative/hybridtop_protocol_results.py | 14 + .../protocols/relative/hybridtop_units.py | 655 +++++------------- src/pontibus/protocols/solvation/__init__.py | 23 +- .../protocols/solvation/asfe_protocol.py | 269 ++----- .../solvation/asfe_protocol_results.py | 15 + .../solvation/asfe_protocol_units.py | 69 ++ src/pontibus/protocols/solvation/base.py | 12 +- .../tests/protocols/relative/test_protocol.py | 49 +- .../tests/protocols/relative/test_results.py | 3 + .../protocols/relative/test_tokenization.py | 11 +- .../tests/protocols/solvation/test_dry_run.py | 49 +- .../tests/protocols/solvation/test_results.py | 4 + .../protocols/solvation/test_tokenization.py | 17 +- 15 files changed, 511 insertions(+), 795 deletions(-) create mode 100644 src/pontibus/protocols/relative/hybridtop_protocol_results.py create mode 100644 src/pontibus/protocols/solvation/asfe_protocol_results.py create mode 100644 src/pontibus/protocols/solvation/asfe_protocol_units.py diff --git a/src/pontibus/protocols/relative/__init__.py b/src/pontibus/protocols/relative/__init__.py index 4817b4f..b22ff0d 100644 --- a/src/pontibus/protocols/relative/__init__.py +++ b/src/pontibus/protocols/relative/__init__.py @@ -4,16 +4,14 @@ Run relative free energy calculations using OpenMM and OpenMMTools. """ -from .hybridtop_protocol import ( - HybridTopProtocol, - HybridTopProtocolResult, -) -from .hybridtop_units import HybridTopProtocolUnit +from .hybridtop_protocol import HybridTopProtocol +from .hybridtop_protocol_results import HybridTopProtocolResult +from .hybridtop_units import HybridTopProtocolSetupUnit from .settings import HybridTopProtocolSettings __all__ = [ "HybridTopProtocol", "HybridTopProtocolSettings", "HybridTopProtocolResult", - "HybridTopProtocolUnit", + "HybridTopProtocolSetupUnit", ] diff --git a/src/pontibus/protocols/relative/hybridtop_protocol.py b/src/pontibus/protocols/relative/hybridtop_protocol.py index f7d8c11..65de7c4 100644 --- a/src/pontibus/protocols/relative/hybridtop_protocol.py +++ b/src/pontibus/protocols/relative/hybridtop_protocol.py @@ -22,14 +22,16 @@ from gufe.settings import ThermoSettings from openfe.protocols.openmm_rfe.equil_rfe_methods import ( RelativeHybridTopologyProtocol, - RelativeHybridTopologyProtocolResult, - _validate_alchemical_components, ) from openfe.protocols.openmm_rfe.equil_rfe_settings import ( AlchemicalSettings, LambdaSettings, ) -from openfe.protocols.openmm_utils import system_validation +from openfe.protocols.openmm_rfe.hybridtop_units import ( + HybridTopologyMultiStateAnalysisUnit, + HybridTopologyMultiStateSimulationUnit, +) +from openfe.protocols.openmm_utils import settings_validation, system_validation from openfe.protocols.openmm_utils.omm_settings import ( IntegratorSettings, MultiStateOutputSettings, @@ -39,7 +41,8 @@ ) from openff.units import unit -from pontibus.protocols.relative.hybridtop_units import HybridTopProtocolUnit +from pontibus.protocols.relative.hybridtop_protocol_results import HybridTopProtocolResult +from pontibus.protocols.relative.hybridtop_units import HybridTopProtocolSetupUnit from pontibus.protocols.relative.settings import HybridTopProtocolSettings from pontibus.utils.settings import ( InterchangeFFSettings, @@ -47,14 +50,6 @@ ) -class HybridTopProtocolResult(RelativeHybridTopologyProtocolResult): - """ - Results class for the HybridTopologyProtocol class. - Inherits from - :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocolResult`. - """ - - class HybridTopProtocol(RelativeHybridTopologyProtocol): """ Relative Free Energy calculations using OpenMM and OpenMMTools. @@ -67,7 +62,7 @@ class HybridTopProtocol(RelativeHybridTopologyProtocol): :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocol` :class:`pontibus.protocols.relative.HybridTopSettings` :class:`pontibus.protocols.relative.HybridTopResult` - :class:`pontibus.protocols.relative.HybridTopProtocolUnit` + :class:`pontibus.protocols.relative.HybridTopProtocolSetupUnit` """ result_cls = HybridTopProtocolResult @@ -107,20 +102,26 @@ def _default_settings(cls): output_settings=MultiStateOutputSettings(), ) - def _create( + def _validate( self, stateA: ChemicalSystem, stateB: ChemicalSystem, mapping: ComponentMapping | list[ComponentMapping] | None, - extends: ProtocolDAGResult | None, - ) -> list[ProtocolUnit]: - if extends: # pragma: no cover - raise NotImplementedError("Can't extend simulations yet") + extends: ProtocolDAGResult | None = None, + ) -> None: + # Check we're not trying to extend + if extends: + raise ValueError("Can't extend simulations yet") + + # Validate the end states + self._validate_endstates(stateA, stateB) - # Get alchemical components & validate them + mapping + # Validate the mapping alchem_comps = system_validation.get_alchemical_components(stateA, stateB) - _validate_alchemical_components(alchem_comps, mapping) - ligandmapping = mapping[0] if isinstance(mapping, list) else mapping + self._validate_mapping(mapping, alchem_comps) + + # Validate the small molecule components + self._validate_smcs(stateA, stateB) # Validate solvent component nonbond = self.settings.forcefield_settings.nonbonded_method @@ -129,22 +130,67 @@ def _create( # Validate protein component system_validation.validate_protein(stateA) - # actually create and return Units + # Validate integrator things + settings_validation.validate_timestep( + self.settings.forcefield_settings.hydrogen_mass, + self.settings.integrator_settings.timestep, + ) + + def _create( + self, + stateA: ChemicalSystem, + stateB: ChemicalSystem, + mapping: ComponentMapping | list[ComponentMapping] | None, + extends: ProtocolDAGResult | None, + ) -> list[ProtocolUnit]: + # Run validation + self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends) + + # Get alchemical components & mapping + alchem_comps = system_validation.get_alchemical_components(stateA, stateB) + ligandmapping = mapping[0] if isinstance(mapping, list) else mapping + Anames = ",".join(c.name for c in alchem_comps["stateA"]) Bnames = ",".join(c.name for c in alchem_comps["stateB"]) - # our DAG has no dependencies, so just list units n_repeats = self.settings.protocol_repeats - units = [ - HybridTopProtocolUnit( + + setup_units = [] + simulation_units = [] + analysis_units = [] + + for i in range(n_repeats): + repeat_id = int(uuid.uuid4()) + + setup = HybridTopProtocolSetupUnit( protocol=self, stateA=stateA, stateB=stateB, ligandmapping=ligandmapping, + alchemical_components=alchem_comps, generation=0, - repeat_id=int(uuid.uuid4()), - name=f"{Anames} to {Bnames} repeat {i} generation 0", + repeat_id=repeat_id, + name=f"HybridTop Setup: {Anames} to {Bnames} repeat {i} generation 0", ) - for i in range(n_repeats) - ] - return units + simulation = HybridTopologyMultiStateSimulationUnit( + protocol=self, + setup_results=setup, + generation=0, + repeat_id=repeat_id, + name=f"HybridTop Simulation: {Anames} to {Bnames} repeat {i} generation 0", + ) + + analysis = HybridTopologyMultiStateAnalysisUnit( + protocol=self, + setup_results=setup, + simulation_results=simulation, + generation=0, + repeat_id=repeat_id, + name=f"HybridTop Analysis: {Anames} to {Bnames} repeat {i} generation 0", + ) + + setup_units.append(setup) + simulation_units.append(simulation) + analysis_units.append(analysis) + + return [*setup_units, *simulation_units, *analysis_units] diff --git a/src/pontibus/protocols/relative/hybridtop_protocol_results.py b/src/pontibus/protocols/relative/hybridtop_protocol_results.py new file mode 100644 index 0000000..7a639e8 --- /dev/null +++ b/src/pontibus/protocols/relative/hybridtop_protocol_results.py @@ -0,0 +1,14 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +from openfe.protocols.openmm_rfe.equil_rfe_methods import ( + RelativeHybridTopologyProtocolResult, +) + + +class HybridTopProtocolResult(RelativeHybridTopologyProtocolResult): + """ + Results class for the HybridTopologyProtocol class. + Inherits from + :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocolResult`. + """ diff --git a/src/pontibus/protocols/relative/hybridtop_units.py b/src/pontibus/protocols/relative/hybridtop_units.py index 5155920..9eb33ca 100644 --- a/src/pontibus/protocols/relative/hybridtop_units.py +++ b/src/pontibus/protocols/relative/hybridtop_units.py @@ -5,38 +5,21 @@ """ import logging -import os import pathlib import warnings -from itertools import chain from typing import Any import mdtraj import numpy as np -import openmmtools +import numpy.typing as npt from gufe import SmallMoleculeComponent, SolventComponent from gufe.settings import ThermoSettings from gufe.settings.typing import GufeArrayQuantity from openfe.protocols.openmm_rfe import _rfe_utils -from openfe.protocols.openmm_rfe.equil_rfe_methods import ( - RelativeHybridTopologyProtocolUnit, - _get_alchemical_charge_difference, -) -from openfe.protocols.openmm_rfe.equil_rfe_settings import ( - AlchemicalSettings, - LambdaSettings, -) -from openfe.protocols.openmm_utils import ( - multistate_analysis, - omm_compute, - settings_validation, - system_validation, -) +from openfe.protocols.openmm_rfe.hybridtop_units import HybridTopologySetupUnit +from openfe.protocols.openmm_utils import settings_validation, system_validation from openfe.protocols.openmm_utils.omm_settings import ( - BasePartialChargeSettings, IntegratorSettings, - MultiStateOutputSettings, - MultiStateSimulationSettings, ) from openfe.utils import without_oechem_backend from openff.interchange import Interchange @@ -47,9 +30,7 @@ from openmm import CMMotionRemover, MonteCarloBarostat, System from openmm import unit as omm_unit from openmm.app import Topology -from openmmtools import multistate -from pontibus.protocols.relative.settings import HybridTopProtocolSettings from pontibus.protocols.solvation.base import _get_and_charge_solvent_offmol from pontibus.utils.settings import ( InterchangeFFSettings, @@ -68,31 +49,14 @@ logger = logging.getLogger(__name__) -class HybridTopProtocolUnit(RelativeHybridTopologyProtocolUnit): - @staticmethod - def _write_hybrid_pdb( - positions: omm_unit.Quantity, - topology: mdtraj.Topology, - selection_indices: list[int], - atom_classes: dict[str, list[int]], - filename: pathlib.Path, - ) -> None: - """ - Write out a PDB of the hybrid state - """ - if not len(selection_indices) > 0: - return - - bfactors = np.zeros_like(selection_indices, dtype=float) - bfactors[np.in1d(selection_indices, list(atom_classes["unique_old_atoms"]))] = 0.25 # lig A - bfactors[np.in1d(selection_indices, list(atom_classes["core_atoms"]))] = 0.50 # core - bfactors[np.in1d(selection_indices, list(atom_classes["unique_new_atoms"]))] = 0.75 # lig B +class HybridTopProtocolSetupUnit(HybridTopologySetupUnit): + """ + Setup unit for the HybridTopProtocol. - traj = mdtraj.Trajectory( - positions[selection_indices, :], - topology.subset(selection_indices), - ) - traj.save_pdb(filename, bfactors=bfactors) + Overrides :meth:`_get_omm_objects` to use Interchange-based + parameterization instead of OpenMM's SystemGenerator, enabling + support for arbitrary solvents and force fields via OpenFF Interchange. + """ @staticmethod def _check_position_overlap( @@ -169,15 +133,51 @@ def _get_barostat( @staticmethod def _get_interchanges( - small_mols, + mapping, + small_mols: dict[SmallMoleculeComponent, OFFMolecule], protein_component, - solvent_component, - forcefield_settings, + solvent_component: SolventComponent | None, + forcefield_settings: InterchangeFFSettings, solvation_settings, charge_settings, - ): - # Create an smc comp dictionary for stateA - stateA_smc_comps = dict(chain(small_mols["stateA"], small_mols["both"])) + ) -> tuple[Interchange, Interchange, dict[str, npt.NDArray]]: + """ + Build Interchange objects for state A and state B. + + Parameters + ---------- + mapping : LigandAtomMapping + The atom mapping between the alchemical ligands. + small_mols : dict[SmallMoleculeComponent, OFFMolecule] + All small molecule components for both states (flat dict). + protein_component : ProteinComponent | None + The protein component, if present. + solvent_component : SolventComponent | None + The solvent component, if present. + forcefield_settings : InterchangeFFSettings + Force field settings. + solvation_settings : PackmolSolvationSettings or similar + Solvation settings. + charge_settings : OpenFFPartialChargeSettings + Partial charge settings. + + Returns + ------- + interA : Interchange + Interchange for state A. + interB : Interchange + Interchange for state B (built by replacing ligand A with ligand B + in interA's solvated box). + alchem_resids : dict[str, npt.NDArray] + Residue indices for the alchemical ligand in each state. + """ + alchem_A = mapping.componentA + alchem_B = mapping.componentB + molA = small_mols[alchem_A] + molB = small_mols[alchem_B] + + # State A includes all molecules except the state-B-only alchemical mol + stateA_smc_comps = {smc: mol for smc, mol in small_mols.items() if smc != alchem_B} # Get solvent offmol if necessary if solvent_component is not None: @@ -189,7 +189,7 @@ def _get_interchanges( else: solvent_offmol = None - # Get the stateA interchange + # Build state A interchange with without_oechem_backend(): interA, comp_residsA = interchange_system_creation( ffsettings=forcefield_settings, @@ -200,32 +200,28 @@ def _get_interchanges( solvent_offmol=solvent_offmol, ) - # Get the smc_components for state B - stateB_smc_comps = dict(chain(small_mols["stateB"], small_mols["both"])) - - # Get a list of the charged molecules to create stateB - stateB_charged_mols = [*stateB_smc_comps.values()] + # State B includes all molecules except the state-A-only alchemical mol + stateB_smc_comps = {smc: mol for smc, mol in small_mols.items() if smc != alchem_A} + stateB_charged_mols = list(stateB_smc_comps.values()) if solvent_component is not None and solvation_settings.assign_solvent_charges: stateB_charged_mols.append(solvent_offmol) - # Get molB and set its key property to keep track of it - smcB = small_mols["stateB"][0][0] - molB = small_mols["stateB"][0][1] - molB.properties["key"] = str(smcB.key) + # Tag molB so copy_interchange_with_replacement can identify it + molB.properties["key"] = str(alchem_B.key) - # Set the stateB interchange + # Build state B interchange by swapping ligand A → ligand B in the + # pre-solvated state A box with without_oechem_backend(): interB = copy_interchange_with_replacement( interchange=interA, - del_mol=small_mols["stateA"][0][1], + del_mol=molA, insert_mol=molB, ffsettings=forcefield_settings, charged_molecules=stateB_charged_mols, protein_component=protein_component, ) - # get the comp_resid dict for stateB comp_residsB = _get_comp_resids( interchange=interB, smc_components=stateB_smc_comps, @@ -233,16 +229,15 @@ def _get_interchanges( protein_component=protein_component, ) - # Fetch the alchemical resids for each state from the comp_resids alchem_resids = { - "stateA": comp_residsA[small_mols["stateA"][0][0]], - "stateB": comp_residsB[small_mols["stateB"][0][0]], + "stateA": comp_residsA[alchem_A], + "stateB": comp_residsB[alchem_B], } return interA, interB, alchem_resids - def _get_omm_objects( - self, + @staticmethod + def _omm_from_interchange( interchange: Interchange, forcefield_settings: InterchangeFFSettings, thermo_settings: ThermoSettings, @@ -250,181 +245,150 @@ def _get_omm_objects( solvent_component: SolventComponent | None, ) -> tuple[Topology, omm_unit.Quantity, System]: """ - Helper method to extract OpenMM objects from an Interchange object. + Extract OpenMM Topology, positions, and System from an Interchange. Parameters ---------- interchange : Interchange - The Interchange object to get OpenMM objects from. + The Interchange object to convert. forcefield_settings : InterchangeFFSettings - The force field settings + Force field settings (for hydrogen mass). thermo_settings : ThermoSettings - The thermodynamic parameter settings. + Thermodynamic settings (for barostat temperature/pressure). integrator_settings : IntegratorSettings - The integrator settings. + Integrator settings (for barostat frequency). solvent_component : SolventComponent | None - The SolventComponent, if there is one. + The solvent component; if not None a barostat is added. + + Returns + ------- + topology : openmm.app.Topology + positions : openmm.unit.Quantity + system : openmm.System """ topology = interchange.to_openmm_topology(collate=True) - positions = to_openmm_positions( - interchange, - include_virtual_sites=True, - ) + positions = to_openmm_positions(interchange, include_virtual_sites=True) system = interchange.to_openmm_system(hydrogen_mass=forcefield_settings.hydrogen_mass) - adjust_system( - system=system, - remove_force_types=CMMotionRemover, - add_forces=self._get_barostat( - solvent_component=solvent_component, - thermo_settings=thermo_settings, - integrator_settings=integrator_settings, - ), - ) - return topology, positions, system - def run( - self, *, dry=False, verbose=True, scratch_basepath=None, shared_basepath=None - ) -> dict[str, Any]: - """Run the relative free energy calculation. + barostat = None + if solvent_component is not None: + barostat = MonteCarloBarostat( + to_openmm(thermo_settings.pressure), + to_openmm(thermo_settings.temperature), + integrator_settings.barostat_frequency.m, + ) - Parameters - ---------- - dry : bool - Do a dry run of the calculation, creating all necessary hybrid - system components (topology, system, sampler, etc...) but without - running the simulation. - verbose : bool - Verbose output of the simulation progress. Output is provided via - INFO level logging. - scratch_basepath: Pathlike, optional - Where to store temporary files, defaults to current working directory - shared_basepath : Pathlike, optional - Where to run the calculation, defaults to current working directory + adjust_system(system=system, remove_force_types=CMMotionRemover, add_forces=barostat) - Returns - ------- - dict - Outputs created in the basepath directory or the debug objects - (i.e. sampler) if ``dry==True``. + return topology, positions, system - Raises - ------ - error - Exception if anything failed + def _subsample_topology( + self, + hybrid_topology, + hybrid_positions, + output_selection: str, + output_filename: str, + atom_classes: dict, + ): """ - if verbose: - self.logger.info("Preparing the hybrid topology simulation") - if scratch_basepath is None: - scratch_basepath = pathlib.Path(".") - if shared_basepath is None: - # use cwd - shared_basepath = pathlib.Path(".") - - # 0. General setup and settings dependency resolution step - - # Extract relevant settings - protocol_settings: HybridTopProtocolSettings = self._inputs["protocol"].settings - stateA = self._inputs["stateA"] - stateB = self._inputs["stateB"] - mapping = self._inputs["ligandmapping"] - - forcefield_settings: InterchangeFFSettings = protocol_settings.forcefield_settings - thermo_settings: ThermoSettings = protocol_settings.thermo_settings - alchem_settings: AlchemicalSettings = protocol_settings.alchemical_settings - lambda_settings: LambdaSettings = protocol_settings.lambda_settings - charge_settings: BasePartialChargeSettings = protocol_settings.partial_charge_settings - solvation_settings: InterchangeOpenMMSolvationSettings | PackmolSolvationSettings = ( - protocol_settings.solvation_settings + Override of parent to additionally write the full hybrid topology + as ``full_hybrid_system.pdb``. + """ + selection_indices = super()._subsample_topology( + hybrid_topology=hybrid_topology, + hybrid_positions=hybrid_positions, + output_selection=output_selection, + output_filename=output_filename, + atom_classes=atom_classes, ) - sampler_settings: MultiStateSimulationSettings = protocol_settings.simulation_settings - output_settings: MultiStateOutputSettings = protocol_settings.output_settings - integrator_settings: IntegratorSettings = protocol_settings.integrator_settings - # is the timestep good for the mass? - settings_validation.validate_timestep( - forcefield_settings.hydrogen_mass, integrator_settings.timestep - ) - # TODO: Also validate various conversions? - # Convert various time based inputs to steps/iterations - steps_per_iteration = settings_validation.convert_steps_per_iteration( - simulation_settings=sampler_settings, - integrator_settings=integrator_settings, + # Write the full (unsubsampled) hybrid topology + super()._subsample_topology( + hybrid_topology=hybrid_topology, + hybrid_positions=hybrid_positions, + output_selection="all", + output_filename=f"full_{output_filename}", + atom_classes=atom_classes, ) - equil_steps = settings_validation.get_simsteps( - sim_length=sampler_settings.equilibration_length, - timestep=integrator_settings.timestep, - mc_steps=steps_per_iteration, - ) - prod_steps = settings_validation.get_simsteps( - sim_length=sampler_settings.production_length, - timestep=integrator_settings.timestep, - mc_steps=steps_per_iteration, - ) + return selection_indices - solvent_comp, protein_comp, small_mols = system_validation.get_components(stateA) - alchem_comps = system_validation.get_alchemical_components(stateA, stateB) - # We already do this in the Protocol but check the number of alchemical comps - for state in alchem_comps.values(): - assert len(state) == 1, "too many alchemical components found in one state" - - # Get the change difference between the end states - # and check if the charge correction used is appropriate - charge_difference = _get_alchemical_charge_difference( - mapping, - forcefield_settings.nonbonded_method, - alchem_settings.explicit_charge_correction, - solvent_comp, - ) + def _get_omm_objects( + self, + stateA, + stateB, + mapping, + settings: dict, + protein_component, + solvent_component: SolventComponent | None, + small_mols: dict[SmallMoleculeComponent, OFFMolecule], + ) -> tuple: + """ + Get OpenMM objects for both end states using Interchange. - # 1. Create stateA system - self.logger.info("Parameterizing molecules") - - # a. create (SMC, offmol) dictionaries and assign partial charges - # calculate partial charges manually if not already given - # convert to OpenFF here, - # and keep the molecule around to maintain the partial charges - off_small_mols: dict[str, list[tuple[SmallMoleculeComponent, OFFMolecule]]] - off_small_mols = { - "stateA": [(alchem_comps["stateA"][0], alchem_comps["stateA"][0].to_openff())], - "stateB": [(alchem_comps["stateB"][0], alchem_comps["stateB"][0].to_openff())], - "both": [ - (m, m.to_openff()) - for m in small_mols - if (m != alchem_comps["stateA"][0] and m != alchem_comps["stateB"][0]) - ], - } + Overrides :meth:`HybridTopologySetupUnit._get_omm_objects` to use + OpenFF Interchange for parameterization instead of OpenMM's + SystemGenerator. - self._assign_partial_charges(charge_settings, off_small_mols) + Parameters + ---------- + stateA : ChemicalSystem + ChemicalSystem defining end state A. + stateB : ChemicalSystem + ChemicalSystem defining end state B. + mapping : LigandAtomMapping + The mapping between alchemical components in state A and B. + settings : dict[str, SettingsBaseModel] + Protocol settings dictionary. + protein_component : ProteinComponent | None + The common protein component, if present. + solvent_component : SolventComponent | None + The common solvent component, if present. + small_mols : dict[SmallMoleculeComponent, OFFMolecule] + All small molecules from both end states (flat dict). - # Get stateA and stateB interchanges - stateA_interchange, stateB_interchange, alchem_resids = self._get_interchanges( - off_small_mols, - protein_comp, - solvent_comp, - forcefield_settings, - solvation_settings, - charge_settings, + Returns + ------- + stateA_system, stateA_topology, stateA_positions, + stateB_system, stateB_topology, stateB_positions, + system_mappings + """ + if self.verbose: + self.logger.info("Parameterizing systems with Interchange") + + forcefield_settings = settings["forcefield_settings"] + thermo_settings = settings["thermo_settings"] + integrator_settings = settings["integrator_settings"] + solvation_settings = settings["solvation_settings"] + charge_settings = settings["charge_settings"] + alchemical_settings = settings["alchemical_settings"] + + interA, interB, alchem_resids = self._get_interchanges( + mapping=mapping, + small_mols=small_mols, + protein_component=protein_component, + solvent_component=solvent_component, + forcefield_settings=forcefield_settings, + solvation_settings=solvation_settings, + charge_settings=charge_settings, ) - # get topology & positions - stateA_topology, stateA_positions, stateA_system = self._get_omm_objects( - interchange=stateA_interchange, + stateA_topology, stateA_positions, stateA_system = self._omm_from_interchange( + interchange=interA, forcefield_settings=forcefield_settings, thermo_settings=thermo_settings, integrator_settings=integrator_settings, - solvent_component=solvent_comp, + solvent_component=solvent_component, ) - stateB_topology, stateB_positions, stateB_system = self._get_omm_objects( - interchange=stateB_interchange, + stateB_topology, stateB_positions, stateB_system = self._omm_from_interchange( + interchange=interB, forcefield_settings=forcefield_settings, thermo_settings=thermo_settings, integrator_settings=integrator_settings, - solvent_component=solvent_comp, + solvent_component=solvent_component, ) - # c. Define correspondence mappings between the two systems - ligand_mappings = _rfe_utils.topologyhelpers.get_system_mappings( + system_mappings = _rfe_utils.topologyhelpers.get_system_mappings( mapping.componentA_to_componentB, stateA_system, stateA_topology, @@ -432,291 +396,40 @@ def run( stateB_system, stateB_topology, alchem_resids["stateB"], - # These are non-optional settings for this method fix_constraints=True, ) - # Sanity check the mappings looking at position overlaps self._check_position_overlap( - ligand_mappings, + system_mappings, from_openmm(stateA_positions), from_openmm(stateB_positions), ) - # d. if a charge correction is necessary, select alchemical waters - # and transform them - if alchem_settings.explicit_charge_correction: + if alchemical_settings.explicit_charge_correction: + charge_difference = mapping.get_alchemical_charge_difference() alchem_water_resids = _rfe_utils.topologyhelpers.get_alchemical_waters( stateA_topology, from_openmm(stateA_positions).m, charge_difference, - alchem_settings.explicit_charge_correction_cutoff, + alchemical_settings.explicit_charge_correction_cutoff, ) _rfe_utils.topologyhelpers.handle_alchemical_waters( alchem_water_resids, stateB_topology, stateB_system, - ligand_mappings, + system_mappings, charge_difference, - solvent_comp, + solvent_component, ) - # 3. Create the hybrid topology - hybrid_factory = _rfe_utils.relative.HybridTopologyFactory( + return ( stateA_system, - stateA_positions, stateA_topology, + stateA_positions, stateB_system, - stateB_positions, stateB_topology, - old_to_new_atom_map=ligand_mappings["old_to_new_atom_map"], - old_to_new_core_atom_map=ligand_mappings["old_to_new_core_atom_map"], - use_dispersion_correction=alchem_settings.use_dispersion_correction, - softcore_alpha=alchem_settings.softcore_alpha, - softcore_LJ_v2=alchem_settings.softcore_LJ.lower() == "gapsys", - softcore_LJ_v2_alpha=alchem_settings.softcore_alpha, - interpolate_old_and_new_14s=alchem_settings.turn_off_core_unique_exceptions, - ) - - # 4. Create lambda schedule - lambdas = _rfe_utils.lambdaprotocol.LambdaProtocol( - functions=lambda_settings.lambda_functions, windows=lambda_settings.lambda_windows - ) - - # pin lambda schedule spacing to n_replicas - n_replicas = sampler_settings.n_replicas - if n_replicas != len(lambdas.lambda_schedule): - errmsg = ( - f"Number of replicas {n_replicas} " - f"does not equal the number of lambda windows " - f"{len(lambdas.lambda_schedule)}" - ) - raise ValueError(errmsg) - - # 9. Create the multistate reporter - # Get the sub selection of the system to print coords for - selection_indices = hybrid_factory.hybrid_topology.select(output_settings.output_indices) - - # a. Create the multistate reporter - # convert checkpoint_interval from time to iterations - chk_intervals = settings_validation.convert_checkpoint_interval_to_iterations( - checkpoint_interval=output_settings.checkpoint_interval, - time_per_iteration=sampler_settings.time_per_iteration, - ) - - nc = shared_basepath / output_settings.output_filename - chk = output_settings.checkpoint_storage_filename - - if output_settings.positions_write_frequency is not None: - pos_interval = settings_validation.divmod_time_and_check( - numerator=output_settings.positions_write_frequency, - denominator=sampler_settings.time_per_iteration, - numerator_name="output settings' position_write_frequency", - denominator_name="sampler settings' time_per_iteration", - ) - else: - pos_interval = 0 - - if output_settings.velocities_write_frequency is not None: - vel_interval = settings_validation.divmod_time_and_check( - numerator=output_settings.velocities_write_frequency, - denominator=sampler_settings.time_per_iteration, - numerator_name="output settings' velocity_write_frequency", - denominator_name="sampler settings' time_per_iteration", - ) - else: - vel_interval = 0 - - reporter = multistate.MultiStateReporter( - storage=nc, - analysis_particle_indices=selection_indices, - checkpoint_interval=chk_intervals, - checkpoint_storage=chk, - position_interval=pos_interval, - velocity_interval=vel_interval, - ) - - # Write out PDBs of the hybrid state (subsampled and then full) - self._write_hybrid_pdb( - hybrid_factory.hybrid_positions, - hybrid_factory.hybrid_topology, - selection_indices, - hybrid_factory._atom_classes, - shared_basepath / output_settings.output_structure, - ) - - self._write_hybrid_pdb( - hybrid_factory.hybrid_positions, - hybrid_factory.hybrid_topology, - [i for i in range(hybrid_factory.hybrid_system.getNumParticles())], - hybrid_factory._atom_classes, - shared_basepath / f"full_{output_settings.output_structure}", - ) - - # 10. Get compute platform - # restrict to a single CPU if running vacuum - restrict_cpu = forcefield_settings.nonbonded_method.lower() == "nocutoff" - platform = omm_compute.get_openmm_platform( - platform_name=protocol_settings.engine_settings.compute_platform, - gpu_device_index=protocol_settings.engine_settings.gpu_device_index, - restrict_cpu_count=restrict_cpu, - ) - - # 11. Set the integrator - # a. Validate integrator settings for current system - # Virtual sites sanity check - ensure we restart velocities when - # there are virtual sites in the system - if hybrid_factory.has_virtual_sites: - if not integrator_settings.reassign_velocities: - errmsg = ( - "Simulations with virtual sites without velocity " - "reassignments are unstable in openmmtools" - ) - raise ValueError(errmsg) - - # b. create langevin integrator - integrator = openmmtools.mcmc.LangevinDynamicsMove( - timestep=to_openmm(integrator_settings.timestep), - collision_rate=to_openmm(integrator_settings.langevin_collision_rate), - n_steps=steps_per_iteration, - reassign_velocities=integrator_settings.reassign_velocities, - n_restart_attempts=integrator_settings.n_restart_attempts, - constraint_tolerance=integrator_settings.constraint_tolerance, - ) - - # 12. Create sampler - self.logger.info("Creating and setting up the sampler") - rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations( - simulation_settings=sampler_settings, - ) - # convert early_termination_target_error from kcal/mol to kT - early_termination_target_error = ( - settings_validation.convert_target_error_from_kcal_per_mole_to_kT( - thermo_settings.temperature, - sampler_settings.early_termination_target_error, - ) - ) - - if sampler_settings.sampler_method.lower() == "repex": - sampler = _rfe_utils.multistate.HybridRepexSampler( - mcmc_moves=integrator, - hybrid_factory=hybrid_factory, - online_analysis_interval=rta_its, - online_analysis_target_error=early_termination_target_error, - online_analysis_minimum_iterations=rta_min_its, - ) - elif sampler_settings.sampler_method.lower() == "sams": - sampler = _rfe_utils.multistate.HybridSAMSSampler( - mcmc_moves=integrator, - hybrid_factory=hybrid_factory, - online_analysis_interval=rta_its, - online_analysis_minimum_iterations=rta_min_its, - flatness_criteria=sampler_settings.sams_flatness_criteria, - gamma0=sampler_settings.sams_gamma0, - ) - elif sampler_settings.sampler_method.lower() == "independent": - sampler = _rfe_utils.multistate.HybridMultiStateSampler( - mcmc_moves=integrator, - hybrid_factory=hybrid_factory, - online_analysis_interval=rta_its, - online_analysis_target_error=early_termination_target_error, - online_analysis_minimum_iterations=rta_min_its, - ) - - else: - raise AttributeError(f"Unknown sampler {sampler_settings.sampler_method}") - - sampler.setup( - n_replicas=sampler_settings.n_replicas, - reporter=reporter, - lambda_protocol=lambdas, - temperature=to_openmm(thermo_settings.temperature), - endstates=alchem_settings.endstate_dispersion_correction, - minimization_platform=platform.getName(), - # Turns off minimization when running in dry mode - # otherwise do a very small one to avoid NaNs - minimization_steps=100 if not dry else 0, + stateB_positions, + system_mappings, ) - try: - # Create context caches (energy + sampler) - energy_context_cache = openmmtools.cache.ContextCache( - capacity=None, - time_to_live=None, - platform=platform, - ) - - sampler_context_cache = openmmtools.cache.ContextCache( - capacity=None, - time_to_live=None, - platform=platform, - ) - sampler.energy_context_cache = energy_context_cache - sampler.sampler_context_cache = sampler_context_cache - - if not dry: # pragma: no-cover - # minimize - if verbose: - self.logger.info("Running minimization") - - sampler.minimize(max_iterations=sampler_settings.minimization_steps) - - # equilibrate - if verbose: - self.logger.info("Running equilibration phase") - - sampler.equilibrate(int(equil_steps / steps_per_iteration)) - - # production - if verbose: - self.logger.info("Running production phase") - - sampler.extend(int(prod_steps / steps_per_iteration)) - - self.logger.info("Production phase complete") - - self.logger.info("Post-simulation analysis of results") - # calculate relevant analyses of the free energies & sampling - # First close & reload the reporter to avoid netcdf clashes - analyzer = multistate_analysis.MultistateEquilFEAnalysis( - reporter, - sampling_method=sampler_settings.sampler_method.lower(), - result_units=unit.kilocalorie_per_mole, - ) - analyzer.plot(filepath=shared_basepath, filename_prefix="") - analyzer.close() - - else: - # clean up the reporter file - fns = [ - shared_basepath / output_settings.output_filename, - shared_basepath / output_settings.checkpoint_storage_filename, - ] - for fn in fns: - os.remove(fn) - finally: - # close reporter when you're done, prevent - # file handle clashes - reporter.close() - - # clear GPU contexts - # TODO: use cache.empty() calls when openmmtools #690 is resolved - # replace with above - for context in list(energy_context_cache._lru._data.keys()): - del energy_context_cache._lru._data[context] - for context in list(sampler_context_cache._lru._data.keys()): - del sampler_context_cache._lru._data[context] - # cautiously clear out the global context cache too - for context in list(openmmtools.cache.global_context_cache._lru._data.keys()): - del openmmtools.cache.global_context_cache._lru._data[context] - - del sampler_context_cache, energy_context_cache - - if not dry: - del integrator, sampler - - if not dry: # pragma: no-cover - return {"nc": nc, "last_checkpoint": chk, **analyzer.unit_results_dict} - else: - return {"debug": {"sampler": sampler}} diff --git a/src/pontibus/protocols/solvation/__init__.py b/src/pontibus/protocols/solvation/__init__.py index 541b58e..857f261 100644 --- a/src/pontibus/protocols/solvation/__init__.py +++ b/src/pontibus/protocols/solvation/__init__.py @@ -4,18 +4,25 @@ Run absolute solvation free energy calculations using OpenMM and OpenMMTools. """ -from .asfe_protocol import ( - ASFEProtocol, - ASFEProtocolResult, - ASFESettings, - ASFESolventUnit, - ASFEVacuumUnit, +from .asfe_protocol import ASFEProtocol, ASFESettings +from .asfe_protocol_units import ( + ASFESolventAnalysisUnit, + ASFESolventSetupUnit, + ASFESolventSimUnit, + ASFEVacuumAnalysisUnit, + ASFEVacuumSetupUnit, + ASFEVacuumSimUnit, ) +from .asfe_protocol_results import ASFEProtocolResult __all__ = [ "ASFEProtocol", "ASFESettings", "ASFEProtocolResult", - "ASFEVacuumUnit", - "ASFESolventUnit", + "ASFEVacuumSetupUnit", + "ASFEVacuumSimUnit", + "ASFEVacuumAnalysisUnit", + "ASFESolventSetupUnit", + "ASFESolventSimUnit", + "ASFESolventAnalysisUnit", ] diff --git a/src/pontibus/protocols/solvation/asfe_protocol.py b/src/pontibus/protocols/solvation/asfe_protocol.py index a065e80..6f50112 100644 --- a/src/pontibus/protocols/solvation/asfe_protocol.py +++ b/src/pontibus/protocols/solvation/asfe_protocol.py @@ -8,10 +8,7 @@ import numpy as np from gufe import ChemicalSystem, SolventComponent from gufe.settings import ThermoSettings -from openfe.protocols.openmm_afe import ( - AbsoluteSolvationProtocol, - AbsoluteSolvationProtocolResult, -) +from openfe.protocols.openmm_afe import AbsoluteSolvationProtocol from openfe.protocols.openmm_afe.equil_afe_settings import LambdaSettings from openfe.protocols.openmm_utils import settings_validation, system_validation from openfe.protocols.openmm_utils.omm_settings import ( @@ -25,7 +22,15 @@ ) from openff.units import unit -from pontibus.protocols.solvation.base import BaseASFEUnit +from pontibus.protocols.solvation.asfe_protocol_results import ASFEProtocolResult +from pontibus.protocols.solvation.asfe_protocol_units import ( + ASFESolventAnalysisUnit, + ASFESolventSetupUnit, + ASFESolventSimUnit, + ASFEVacuumAnalysisUnit, + ASFEVacuumSetupUnit, + ASFEVacuumSimUnit, +) from pontibus.protocols.solvation.settings import ( ASFESettings, ExperimentalAlchemicalSettings, @@ -34,17 +39,6 @@ ) -class ASFEProtocolResult(AbsoluteSolvationProtocolResult): - """ - Results class for the ASFEProtocol. - - Notes - ----- - * Derives from OpenFE's AbsoluteSolvationProtocolResult with the intent - of extending further if necessary in the future. - """ - - class ASFEProtocol(AbsoluteSolvationProtocol): result_cls = ASFEProtocolResult _settings_cls = ASFESettings @@ -257,195 +251,54 @@ def _create( alchname = alchem_comps["stateA"][0].name - # Create list units for vacuum and solvent transforms - solvent_units = [ - ASFESolventUnit( - protocol=self, - stateA=stateA, - stateB=stateB, - alchemical_components=alchem_comps, - generation=0, - repeat_id=int(uuid.uuid4()), - name=(f"Absolute Solvation, {alchname} solvent leg: repeat {i} generation 0"), - ) - for i in range(self.settings.protocol_repeats) - ] - - vacuum_units = [ - ASFEVacuumUnit( - protocol=self, - stateA=stateA, - stateB=stateB, - alchemical_components=alchem_comps, - generation=0, - repeat_id=int(uuid.uuid4()), - name=(f"Absolute Solvation, {alchname} vacuum leg: repeat {i} generation 0"), - ) - for i in range(self.settings.protocol_repeats) - ] - - return solvent_units + vacuum_units - - -class ASFEVacuumUnit(BaseASFEUnit): - """ - Protocol Unit for the vacuum phase of an absolute solvation free energy - """ - - simtype: str = "vacuum" - - def _get_components(self): - """ - Get the relevant components for a vacuum transformation. - - Returns - ------- - alchem_comps : dict[str, list[Component]] - A list of alchemical components - solv_comp : None - For the gas phase transformation, None will always be returned - for the solvent component of the chemical system. - prot_comp : Optional[ProteinComponent] - The protein component of the system, if it exists. - small_mols : dict[Component, OpenFF Molecule] - The openff Molecules to add to the system. This - is equivalent to the alchemical components in stateA (since - we only allow for disappearing ligands). - """ - stateA = self._inputs["stateA"] - alchem_comps = self._inputs["alchemical_components"] - - off_comps = {m: m.to_openff() for m in alchem_comps["stateA"]} - - _, prot_comp, _ = system_validation.get_components(stateA) - - # Notes: - # 1. Our input state will contain a solvent, we ``None`` that out - # since this is the gas phase unit. - # 2. Our small molecules will always just be the alchemical components - # (of stateA since we enforce only one disappearing ligand) - return alchem_comps, None, prot_comp, off_comps - - def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: - """ - Extract the relevant settings for a vacuum transformation. - - Returns - ------- - settings : dict[str, SettingsBaseModel] - A dictionary with the following entries: - * forcefield_settings : InterchangeFFSettings - * thermo_settings : ThermoSettings - * charge_settings : OpenFFPartialChargeSettings - * solvation_settings : PackmolSolvationSettings - * alchemical_settings : ExperimentalAlchemicalSettings - * lambda_settings : LambdaSettings - * engine_settings : OpenMMEngineSettings - * integrator_settings : IntegratorSettings - * equil_simulation_settings : MDSimulationSettings - * equil_output_settings : MDOutputSettings - * simulation_settings : SimulationSettings - * output_settings: MultiStateOutputSettings - """ - prot_settings = self._inputs["protocol"].settings - - settings = {} - settings["forcefield_settings"] = prot_settings.vacuum_forcefield_settings - settings["thermo_settings"] = prot_settings.thermo_settings - settings["charge_settings"] = prot_settings.partial_charge_settings - settings["solvation_settings"] = prot_settings.solvation_settings - settings["alchemical_settings"] = prot_settings.alchemical_settings - settings["lambda_settings"] = prot_settings.lambda_settings - settings["engine_settings"] = prot_settings.vacuum_engine_settings - settings["integrator_settings"] = prot_settings.integrator_settings - settings["equil_simulation_settings"] = prot_settings.vacuum_equil_simulation_settings - settings["equil_output_settings"] = prot_settings.vacuum_equil_output_settings - settings["simulation_settings"] = prot_settings.vacuum_simulation_settings - settings["output_settings"] = prot_settings.vacuum_output_settings - - settings_validation.validate_timestep( - settings["forcefield_settings"].hydrogen_mass, - settings["integrator_settings"].timestep, - ) - - return settings - - -class ASFESolventUnit(BaseASFEUnit): - """ - Protocol Unit for the solvent phase of an absolute solvation free energy - """ - - simtype: str = "solvent" - - def _get_components(self): - """ - Get the relevant components for a solvent transformation. - - Returns - ------- - alchem_comps : dict[str, Component] - A list of alchemical components - solv_comp : SolventComponent - The SolventComponent of the system - prot_comp : Optional[ProteinComponent] - The protein component of the system, if it exists. - small_mols : dict[SmallMoleculeComponent: OFFMolecule] - SmallMoleculeComponents to add to the system. - """ - stateA = self._inputs["stateA"] - alchem_comps = self._inputs["alchemical_components"] - - solv_comp, prot_comp, small_mols = system_validation.get_components(stateA) - off_comps = {m: m.to_openff() for m in small_mols} - - # We don't need to check that solv_comp is not None, otherwise - # an error will have been raised when calling `validate_solvent` - # in the Protocol's `_create`. - # Similarly we don't need to check prot_comp since that's also - # disallowed on create - return alchem_comps, solv_comp, prot_comp, off_comps - - def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: - """ - Extract the relevant settings for a vacuum transformation. - - Returns - ------- - settings : dict[str, SettingsBaseModel] - A dictionary with the following entries: - * forcefield_settings : InterchangeFFSettings - * thermo_settings : ThermoSettings - * charge_settings : OpenFFPartialChargeSettings - * solvation_settings : PackmolSolvationSettings - * alchemical_settings : ExperimentalAlchemicalSettings - * lambda_settings : LambdaSettings - * engine_settings : OpenMMEngineSettings - * integrator_settings : IntegratorSettings - * equil_simulation_settings : MDSimulationSettings - * equil_output_settings : MDOutputSettings - * simulation_settings : MultiStateSimulationSettings - * output_settings: MultiStateOutputSettings - """ - prot_settings = self._inputs["protocol"].settings - - settings = {} - settings["forcefield_settings"] = prot_settings.solvent_forcefield_settings - settings["thermo_settings"] = prot_settings.thermo_settings - settings["charge_settings"] = prot_settings.partial_charge_settings - settings["solvation_settings"] = prot_settings.solvation_settings - settings["alchemical_settings"] = prot_settings.alchemical_settings - settings["lambda_settings"] = prot_settings.lambda_settings - settings["engine_settings"] = prot_settings.solvent_engine_settings - settings["integrator_settings"] = prot_settings.integrator_settings - settings["equil_simulation_settings"] = prot_settings.solvent_equil_simulation_settings - settings["equil_output_settings"] = prot_settings.solvent_equil_output_settings - settings["simulation_settings"] = prot_settings.solvent_simulation_settings - settings["output_settings"] = prot_settings.solvent_output_settings - - settings_validation.validate_timestep( - settings["forcefield_settings"].hydrogen_mass, - settings["integrator_settings"].timestep, - ) - - return settings + unit_classes = { + "solvent": { + "setup": ASFESolventSetupUnit, + "simulation": ASFESolventSimUnit, + "analysis": ASFESolventAnalysisUnit, + }, + "vacuum": { + "setup": ASFEVacuumSetupUnit, + "simulation": ASFEVacuumSimUnit, + "analysis": ASFEVacuumAnalysisUnit, + }, + } + + protocol_units: dict[str, list[gufe.ProtocolUnit]] = {"solvent": [], "vacuum": []} + + for phase in ["solvent", "vacuum"]: + for i in range(self.settings.protocol_repeats): + repeat_id = int(uuid.uuid4()) + + setup = unit_classes[phase]["setup"]( + protocol=self, + stateA=stateA, + stateB=stateB, + alchemical_components=alchem_comps, + generation=0, + repeat_id=repeat_id, + name=f"ASFE Setup: {alchname} {phase} leg: repeat {i} generation 0", + ) + + simulation = unit_classes[phase]["simulation"]( + protocol=self, + stateA=stateA, + alchemical_components=alchem_comps, + setup_results=setup, + generation=0, + repeat_id=repeat_id, + name=f"ASFE Simulation: {alchname} {phase} leg: repeat {i} generation 0", + ) + + analysis = unit_classes[phase]["analysis"]( + protocol=self, + setup_results=setup, + simulation_results=simulation, + generation=0, + repeat_id=repeat_id, + name=f"ASFE Analysis: {alchname} {phase} leg: repeat {i} generation 0", + ) + + protocol_units[phase] += [setup, simulation, analysis] + + return protocol_units["solvent"] + protocol_units["vacuum"] diff --git a/src/pontibus/protocols/solvation/asfe_protocol_results.py b/src/pontibus/protocols/solvation/asfe_protocol_results.py new file mode 100644 index 0000000..0f2ad0b --- /dev/null +++ b/src/pontibus/protocols/solvation/asfe_protocol_results.py @@ -0,0 +1,15 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +from openfe.protocols.openmm_afe import AbsoluteSolvationProtocolResult + + +class ASFEProtocolResult(AbsoluteSolvationProtocolResult): + """ + Results class for the ASFEProtocol. + + Notes + ----- + * Derives from OpenFE's AbsoluteSolvationProtocolResult with the intent + of extending further if necessary in the future. + """ diff --git a/src/pontibus/protocols/solvation/asfe_protocol_units.py b/src/pontibus/protocols/solvation/asfe_protocol_units.py new file mode 100644 index 0000000..0f1c51d --- /dev/null +++ b/src/pontibus/protocols/solvation/asfe_protocol_units.py @@ -0,0 +1,69 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +from openfe.protocols.openmm_afe.ahfe_units import ( + SolventComponentsMixin, + SolventSettingsMixin, + VacuumComponentsMixin, + VacuumSettingsMixin, +) +from openfe.protocols.openmm_afe.base_afe_units import ( + BaseAbsoluteMultiStateAnalysisUnit, + BaseAbsoluteMultiStateSimulationUnit, +) + +from pontibus.protocols.solvation.base import BaseASFEUnit + + +class ASFEVacuumSetupUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseASFEUnit): + """ + Protocol Unit for setting up the vacuum phase of an absolute solvation + free energy transformation. + """ + + simtype: str = "vacuum" + + +class ASFEVacuumSimUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseAbsoluteMultiStateSimulationUnit): + """ + Protocol Unit for running the vacuum phase multistate simulation of an + absolute solvation free energy transformation. + """ + + simtype: str = "vacuum" + + +class ASFEVacuumAnalysisUnit(VacuumSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit): + """ + Protocol Unit for analysing the vacuum phase of an absolute solvation + free energy transformation. + """ + + simtype: str = "vacuum" + + +class ASFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseASFEUnit): + """ + Protocol Unit for setting up the solvent phase of an absolute solvation + free energy transformation. + """ + + simtype: str = "solvent" + + +class ASFESolventSimUnit(SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteMultiStateSimulationUnit): + """ + Protocol Unit for running the solvent phase multistate simulation of an + absolute solvation free energy transformation. + """ + + simtype: str = "solvent" + + +class ASFESolventAnalysisUnit(SolventSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit): + """ + Protocol Unit for analysing the solvent phase of an absolute solvation + free energy transformation. + """ + + simtype: str = "solvent" diff --git a/src/pontibus/protocols/solvation/base.py b/src/pontibus/protocols/solvation/base.py index d1fa493..1b948cf 100644 --- a/src/pontibus/protocols/solvation/base.py +++ b/src/pontibus/protocols/solvation/base.py @@ -12,7 +12,7 @@ SolventComponent, ) from gufe.settings import SettingsBaseModel -from openfe.protocols.openmm_afe.base import BaseAbsoluteUnit +from openfe.protocols.openmm_afe.base_afe_units import BaseAbsoluteSetupUnit from openfe.protocols.openmm_afe.equil_afe_settings import AlchemicalSettings from openfe.protocols.openmm_utils.omm_settings import ( IntegratorSettings, @@ -37,7 +37,7 @@ logger = logging.getLogger(__name__) -class BaseASFEUnit(BaseAbsoluteUnit): +class BaseASFEUnit(BaseAbsoluteSetupUnit): simtype: str @staticmethod @@ -71,7 +71,7 @@ def _get_omm_objects( settings: dict[str, SettingsBaseModel], protein_component: ProteinComponent | None, solvent_component: SolventComponent | None, - smc_components: dict[SmallMoleculeComponent, OFFMolecule], + small_mols: dict[SmallMoleculeComponent, OFFMolecule], ) -> tuple[app.Topology, openmm.System, openmm.unit.Quantity, dict[str, npt.NDArray]]: """ Get the OpenMM Topology, Positions and System of the @@ -85,7 +85,7 @@ def _get_omm_objects( Protein component for the system. solvent_component : Optional[SolventComponent] Solvent component for the system. - smc_components : dict[str, OFFMolecule] + small_mols : dict[SmallMoleculeComponent, OFFMolecule] SmallMoleculeComponents defining ligands to be added to the system Returns @@ -108,7 +108,7 @@ def _get_omm_objects( self.logger.info("Parameterizing system") # Set partial charges for all smcs - self._assign_partial_charges(settings["charge_settings"], smc_components) + self._assign_partial_charges(settings["charge_settings"], small_mols) # Get solvent offmol if necessary if solvent_component is not None: @@ -125,7 +125,7 @@ def _get_omm_objects( interchange, comp_resids = interchange_system_creation( ffsettings=settings["forcefield_settings"], solvation_settings=settings["solvation_settings"], - smc_components=smc_components, + smc_components=small_mols, protein_component=protein_component, solvent_component=solvent_component, solvent_offmol=solvent_offmol, diff --git a/src/pontibus/tests/protocols/relative/test_protocol.py b/src/pontibus/tests/protocols/relative/test_protocol.py index 9552441..ad9bf68 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol.py +++ b/src/pontibus/tests/protocols/relative/test_protocol.py @@ -19,10 +19,9 @@ PeriodicTorsionForce, ) from openmm import unit as omm_unit -from openmmtools.multistate import MultiStateSampler from rdkit import Chem -from pontibus.protocols.relative import HybridTopProtocol, HybridTopProtocolUnit +from pontibus.protocols.relative import HybridTopProtocol, HybridTopProtocolSetupUnit from pontibus.utils.settings import InterchangeOpenMMSolvationSettings, PackmolSolvationSettings @@ -73,7 +72,7 @@ def test_position_overlap_fail(): positionsB = np.array([[1, 1, 2.1]] * 4) * unit.angstrom with pytest.raises(ValueError, match="deviates by more than"): - HybridTopProtocolUnit._check_position_overlap( + HybridTopProtocolSetupUnit._check_position_overlap( mapping, positionsA, positionsB, @@ -86,7 +85,7 @@ def test_position_overlap_warn(): positionsB = np.array([[1, 1, 2.1]] * 4) * unit.angstrom with pytest.warns(UserWarning, match="deviates by more than"): - HybridTopProtocolUnit._check_position_overlap( + HybridTopProtocolSetupUnit._check_position_overlap( mapping, positionsA, positionsB, @@ -117,13 +116,11 @@ def test_dry_run_default_vacuum( dag_unit = list(dag.protocol_units)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] - assert isinstance(sampler, MultiStateSampler) - assert not sampler.is_periodic - assert sampler._thermodynamic_states[0].barostat is None - - # Check hybrid OMM and MDTtraj Topologies - htf = sampler._hybrid_factory + result = dag_unit.run(dry=True) + htf = result["hybrid_factory"] + assert not htf.hybrid_system.usesPeriodicBoundaryConditions() + barostats = [f for f in htf.hybrid_system.getForces() if isinstance(f, MonteCarloBarostat)] + assert len(barostats) == 0 # 16 atoms: # 11 common atoms, 1 extra hydrogen in benzene, 4 extra in toluene # 12 bonds in benzene + 4 extra toluene bonds @@ -265,8 +262,8 @@ def test_dry_core_element_change(vac_settings, tmpdir): dag_unit = list(dag.protocol_units)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] - system = sampler._hybrid_factory.hybrid_system + result = dag_unit.run(dry=True) + system = result["hybrid_factory"].hybrid_system assert system.getNumParticles() == 12 # Average mass between nitrogen and carbon assert pytest.approx(system.getParticleMass(1)._value) == 12.0008030 @@ -314,11 +311,11 @@ def test_dry_run_ligand( dag_unit = list(dag.protocol_units)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] - assert isinstance(sampler, MultiStateSampler) - assert sampler.is_periodic - assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) - assert sampler._thermodynamic_states[1].pressure == 1 * omm_unit.bar + result = dag_unit.run(dry=True) + htf = result["hybrid_factory"] + assert htf.hybrid_system.usesPeriodicBoundaryConditions() + barostats = [f for f in htf.hybrid_system.getForces() if isinstance(f, MonteCarloBarostat)] + assert len(barostats) == 1 # Check we have the right number of atoms in the PDBs pdb = mdt.load_pdb("hybrid_system.pdb") @@ -327,7 +324,7 @@ def test_dry_run_ligand( assert pdb.n_atoms == n_atoms # Check system forces - system = sampler._hybrid_factory.hybrid_system + system = htf.hybrid_system assert len(system.getForces()) == 10 def assert_force_num(system, forcetype, number): @@ -355,10 +352,10 @@ def assert_force_num(system, forcetype, number): assert custom_nonbond[0].getSwitchingDistance() == 0.8 * omm_unit.nanometer # Check the unique, core & env atoms - assert len(sampler._hybrid_factory._unique_old_atoms) == 1 - assert len(sampler._hybrid_factory._unique_new_atoms) == 4 - assert len(sampler._hybrid_factory._core_old_to_new_map) == 11 - assert len(sampler._hybrid_factory._env_old_to_new_map) == (n_atoms - 16) + assert len(htf._unique_old_atoms) == 1 + assert len(htf._unique_new_atoms) == 4 + assert len(htf._core_old_to_new_map) == 11 + assert len(htf._env_old_to_new_map) == (n_atoms - 16) def test_dry_run_vacuum_user_charges(benzene_modifications, vac_settings, tmpdir): @@ -426,8 +423,8 @@ def check_propchgs(smc, charge_array): dag_unit = list(dag.protocol_units)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] - htf = sampler._factory + result = dag_unit.run(dry=True) + htf = result["hybrid_factory"] hybrid_system = htf.hybrid_system # get the standard nonbonded force @@ -531,8 +528,6 @@ def test_dry_run_complex( # Check we have the right number of atoms in the PDB pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 2629 - pdb = mdt.load_pdb("full_hybrid_system.pdb") - assert pdb.n_atoms == n_atoms # Check system forces system = sampler._hybrid_factory.hybrid_system diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index 7e7157b..3cdf483 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -3,6 +3,9 @@ import json import gufe +import pytest + +pytestmark = pytest.mark.skip(reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable") import numpy as np import openfe import pytest diff --git a/src/pontibus/tests/protocols/relative/test_tokenization.py b/src/pontibus/tests/protocols/relative/test_tokenization.py index 4137eef..05b6c99 100644 --- a/src/pontibus/tests/protocols/relative/test_tokenization.py +++ b/src/pontibus/tests/protocols/relative/test_tokenization.py @@ -9,7 +9,7 @@ from pontibus.protocols.relative import ( HybridTopProtocol, HybridTopProtocolResult, - HybridTopProtocolUnit, + HybridTopProtocolSetupUnit, ) @@ -72,8 +72,8 @@ def test_repr(self, instance): class TestSolventUnit(GufeTokenizableTestsMixin): - cls = HybridTopProtocolUnit - repr = "HybridTopProtocolUnit(" + cls = HybridTopProtocolSetupUnit + repr = "HybridTopProtocolSetupUnit(" key = None @pytest.fixture() @@ -92,8 +92,8 @@ def test_repr(self, instance): class TestVacuumUnit(GufeTokenizableTestsMixin): - cls = HybridTopProtocolUnit - repr = "HybridTopProtocolUnit(" + cls = HybridTopProtocolSetupUnit + repr = "HybridTopProtocolSetupUnit(" key = None @pytest.fixture() @@ -111,6 +111,7 @@ def test_repr(self, instance): assert self.repr in repr(instance) +@pytest.mark.skip(reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable") class TestProtocolResult(GufeTokenizableTestsMixin): cls = HybridTopProtocolResult key = None diff --git a/src/pontibus/tests/protocols/solvation/test_dry_run.py b/src/pontibus/tests/protocols/solvation/test_dry_run.py index f2b0062..38c99c8 100644 --- a/src/pontibus/tests/protocols/solvation/test_dry_run.py +++ b/src/pontibus/tests/protocols/solvation/test_dry_run.py @@ -22,7 +22,7 @@ ) from pontibus.components import ExtendedSolventComponent -from pontibus.protocols.solvation import ASFEProtocol, ASFESolventUnit, ASFEVacuumUnit +from pontibus.protocols.solvation import ASFEProtocol, ASFESolventSetupUnit, ASFEVacuumSetupUnit @pytest.fixture() @@ -64,20 +64,18 @@ def test_dry_run_vacuum_benzene(charged_benzene, dry_settings, method, tmpdir): ) prot_units = list(dag.protocol_units) - assert len(prot_units) == 2 + assert len(prot_units) == 6 - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] assert len(vac_unit) == 1 assert len(sol_unit) == 1 with tmpdir.as_cwd(): - debug = vac_unit[0].run(dry=True)["debug"] - vac_sampler = debug["sampler"] - assert not vac_sampler.is_periodic - - system = debug["alchem_system"] + result = vac_unit[0].run(dry=True) + system = result["alchem_system"] + assert not system.usesPeriodicBoundaryConditions() assert len(system.getForces()) == 12 @@ -140,23 +138,22 @@ def test_dry_run_solv_benzene( ) prot_units = list(dag.protocol_units) - assert len(prot_units) == 2 + assert len(prot_units) == 6 - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] assert len(vac_unit) == 1 assert len(sol_unit) == 1 with tmpdir.as_cwd(): - debug = sol_unit[0].run(dry=True)["debug"] - sol_sampler = debug["sampler"] - assert sol_sampler.is_periodic + result = sol_unit[0].run(dry=True) + system = result["alchem_system"] + assert system.usesPeriodicBoundaryConditions() pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 12 - system = debug["alchem_system"] assert len(system.getForces()) == 9 _assert_num_forces(system, NonbondedForce, 1) @@ -237,11 +234,11 @@ def test_dry_run_benzene_in_benzene_user_charges(charged_benzene, dry_settings, ) prot_units = list(dag.protocol_units) - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] with tmpdir.as_cwd(): - debug = sol_unit[0].run(dry=True)["debug"] - system = debug["alchem_system"] + result = sol_unit[0].run(dry=True) + system = result["alchem_system"] # Should be benzenes all the way down assert system.getNumParticles() % 12 == 0 @@ -304,12 +301,12 @@ def test_dry_run_solv_benzene_opc(charged_benzene, dry_settings, tmpdir): ) prot_units = list(dag.protocol_units) - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] with tmpdir.as_cwd(): - debug = sol_unit[0].run(dry=True)["debug"] - sol_sampler = debug["sampler"] - assert sol_sampler.is_periodic + result = sol_unit[0].run(dry=True) + system = result["alchem_system"] + assert system.usesPeriodicBoundaryConditions() pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 12 @@ -342,13 +339,13 @@ def test_confgen_fail_AFE(benzene_modifications, dry_settings, tmpdir): mapping=None, ) prot_units = list(dag.protocol_units) - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] with tmpdir.as_cwd(): with mock.patch("rdkit.Chem.AllChem.EmbedMultipleConfs", return_value=0): - vac_sampler = vac_unit[0].run(dry=True)["debug"]["sampler"] + result = vac_unit[0].run(dry=True) - assert vac_sampler + assert result """ diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 5f5917f..99eea9d 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -3,6 +3,10 @@ import itertools import json +import pytest + +pytestmark = pytest.mark.skip(reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable") + import gufe import numpy as np import openfe diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 1a9aa45..d5b3a48 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -11,8 +11,8 @@ from pontibus.protocols.solvation import ( ASFEProtocol, ASFEProtocolResult, - ASFESolventUnit, - ASFEVacuumUnit, + ASFESolventSetupUnit, + ASFEVacuumSetupUnit, ) @@ -39,14 +39,14 @@ def protocol_units(protocol, benzene_modifications): @pytest.fixture def solvent_protocol_unit(protocol_units): for pu in protocol_units: - if isinstance(pu, ASFESolventUnit): + if isinstance(pu, ASFESolventSetupUnit): return pu @pytest.fixture def vacuum_protocol_unit(protocol_units): for pu in protocol_units: - if isinstance(pu, ASFEVacuumUnit): + if isinstance(pu, ASFEVacuumSetupUnit): return pu @@ -75,8 +75,8 @@ def test_repr(self, instance): class TestSolventUnit(GufeTokenizableTestsMixin): - cls = ASFESolventUnit - repr = "ASFESolventUnit(Absolute Solvation, benzene solvent leg" + cls = ASFESolventSetupUnit + repr = "ASFESolventSetupUnit(ASFE Setup: benzene solvent leg" key = None @pytest.fixture() @@ -95,8 +95,8 @@ def test_repr(self, instance): class TestVacuumUnit(GufeTokenizableTestsMixin): - cls = ASFEVacuumUnit - repr = "ASFEVacuumUnit(Absolute Solvation, benzene vacuum leg" + cls = ASFEVacuumSetupUnit + repr = "ASFEVacuumSetupUnit(ASFE Setup: benzene vacuum leg" key = None @pytest.fixture() @@ -114,6 +114,7 @@ def test_repr(self, instance): assert self.repr in repr(instance) +@pytest.mark.skip(reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable") class TestProtocolResult(GufeTokenizableTestsMixin): cls = ASFEProtocolResult key = None From fd1cda08ccd9d7a88754e8ce37e6d50b41f74e16 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sat, 7 Mar 2026 15:54:20 +0000 Subject: [PATCH 07/32] unpin openfe --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 7214bce..037b524 100644 --- a/environment.yml +++ b/environment.yml @@ -8,7 +8,7 @@ dependencies: - openff-interchange >=0.4.8 - openff-nagl-base >=0.3.3 # OpenFE stack deps - - openfe ~= 1.8.0 + - openfe >= 1.9.0 - duecredit<0.10 - kartograf>=1.0.0 - konnektor From 47ed1292ac12ff54bcb44b17c5a182662012e83f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:58:34 +0000 Subject: [PATCH 08/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pontibus/protocols/relative/hybridtop_units.py | 8 -------- src/pontibus/protocols/solvation/__init__.py | 2 +- src/pontibus/protocols/solvation/asfe_protocol_units.py | 8 ++++++-- src/pontibus/tests/protocols/relative/test_results.py | 4 +++- .../tests/protocols/relative/test_tokenization.py | 4 +++- src/pontibus/tests/protocols/solvation/test_results.py | 4 +++- .../tests/protocols/solvation/test_tokenization.py | 4 +++- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/pontibus/protocols/relative/hybridtop_units.py b/src/pontibus/protocols/relative/hybridtop_units.py index 9eb33ca..479416e 100644 --- a/src/pontibus/protocols/relative/hybridtop_units.py +++ b/src/pontibus/protocols/relative/hybridtop_units.py @@ -5,11 +5,8 @@ """ import logging -import pathlib import warnings -from typing import Any -import mdtraj import numpy as np import numpy.typing as npt from gufe import SmallMoleculeComponent, SolventComponent @@ -17,7 +14,6 @@ from gufe.settings.typing import GufeArrayQuantity from openfe.protocols.openmm_rfe import _rfe_utils from openfe.protocols.openmm_rfe.hybridtop_units import HybridTopologySetupUnit -from openfe.protocols.openmm_utils import settings_validation, system_validation from openfe.protocols.openmm_utils.omm_settings import ( IntegratorSettings, ) @@ -34,8 +30,6 @@ from pontibus.protocols.solvation.base import _get_and_charge_solvent_offmol from pontibus.utils.settings import ( InterchangeFFSettings, - InterchangeOpenMMSolvationSettings, - PackmolSolvationSettings, ) from pontibus.utils.system_creation import ( _get_comp_resids, @@ -431,5 +425,3 @@ def _get_omm_objects( stateB_positions, system_mappings, ) - - diff --git a/src/pontibus/protocols/solvation/__init__.py b/src/pontibus/protocols/solvation/__init__.py index 857f261..fb4c041 100644 --- a/src/pontibus/protocols/solvation/__init__.py +++ b/src/pontibus/protocols/solvation/__init__.py @@ -5,6 +5,7 @@ """ from .asfe_protocol import ASFEProtocol, ASFESettings +from .asfe_protocol_results import ASFEProtocolResult from .asfe_protocol_units import ( ASFESolventAnalysisUnit, ASFESolventSetupUnit, @@ -13,7 +14,6 @@ ASFEVacuumSetupUnit, ASFEVacuumSimUnit, ) -from .asfe_protocol_results import ASFEProtocolResult __all__ = [ "ASFEProtocol", diff --git a/src/pontibus/protocols/solvation/asfe_protocol_units.py b/src/pontibus/protocols/solvation/asfe_protocol_units.py index 0f1c51d..58607e8 100644 --- a/src/pontibus/protocols/solvation/asfe_protocol_units.py +++ b/src/pontibus/protocols/solvation/asfe_protocol_units.py @@ -24,7 +24,9 @@ class ASFEVacuumSetupUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseASFEUn simtype: str = "vacuum" -class ASFEVacuumSimUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseAbsoluteMultiStateSimulationUnit): +class ASFEVacuumSimUnit( + VacuumComponentsMixin, VacuumSettingsMixin, BaseAbsoluteMultiStateSimulationUnit +): """ Protocol Unit for running the vacuum phase multistate simulation of an absolute solvation free energy transformation. @@ -51,7 +53,9 @@ class ASFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseASF simtype: str = "solvent" -class ASFESolventSimUnit(SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteMultiStateSimulationUnit): +class ASFESolventSimUnit( + SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteMultiStateSimulationUnit +): """ Protocol Unit for running the solvent phase multistate simulation of an absolute solvation free energy transformation. diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index 3cdf483..785955a 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -5,7 +5,9 @@ import gufe import pytest -pytestmark = pytest.mark.skip(reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable") +pytestmark = pytest.mark.skip( + reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable" +) import numpy as np import openfe import pytest diff --git a/src/pontibus/tests/protocols/relative/test_tokenization.py b/src/pontibus/tests/protocols/relative/test_tokenization.py index 05b6c99..346aab9 100644 --- a/src/pontibus/tests/protocols/relative/test_tokenization.py +++ b/src/pontibus/tests/protocols/relative/test_tokenization.py @@ -111,7 +111,9 @@ def test_repr(self, instance): assert self.repr in repr(instance) -@pytest.mark.skip(reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable") +@pytest.mark.skip( + reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable" +) class TestProtocolResult(GufeTokenizableTestsMixin): cls = HybridTopProtocolResult key = None diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 99eea9d..9b3d4f4 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -5,7 +5,9 @@ import pytest -pytestmark = pytest.mark.skip(reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable") +pytestmark = pytest.mark.skip( + reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable" +) import gufe import numpy as np diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index d5b3a48..1a4177e 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -114,7 +114,9 @@ def test_repr(self, instance): assert self.repr in repr(instance) -@pytest.mark.skip(reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable") +@pytest.mark.skip( + reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable" +) class TestProtocolResult(GufeTokenizableTestsMixin): cls = ASFEProtocolResult key = None From a5e8c30c7a9bd7400e20200a7a9b6ca9e831b89c Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sat, 7 Mar 2026 16:52:26 +0000 Subject: [PATCH 09/32] add more tokenization tests for asfe --- .../protocols/solvation/test_tokenization.py | 134 ++++++++++++------ 1 file changed, 88 insertions(+), 46 deletions(-) diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 1a4177e..9ba2fe5 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -12,7 +12,11 @@ ASFEProtocol, ASFEProtocolResult, ASFESolventSetupUnit, + ASFESolventSimUnit, + ASFESolventAnalysisUnit, ASFEVacuumSetupUnit, + ASFEVacuumSimUnit, + ASFEVacuumAnalysisUnit, ) @@ -36,18 +40,40 @@ def protocol_units(protocol, benzene_modifications): return list(pus.protocol_units) -@pytest.fixture -def solvent_protocol_unit(protocol_units): - for pu in protocol_units: - if isinstance(pu, ASFESolventSetupUnit): +def _get_unit(pus, pu_class): + for pu in pus: + if isinstance(pu, pu_class): return pu @pytest.fixture -def vacuum_protocol_unit(protocol_units): - for pu in protocol_units: - if isinstance(pu, ASFEVacuumSetupUnit): - return pu +def solvent_protocol_setup_unit(protocol_units): + return _get_unit(protocol_units, ASFESolventSetupUnit) + + +@pytest.fixture +def solvent_protocol_sim_unit(protocol_units): + return _get_unit(protocol_units, ASFESolventSimUnit) + + +@pytest.fixture +def solvent_protocol_analysis_unit(protocol_units): + return _get_unit(protocol_units, ASFESolventAnalysisUnit) + + +@pytest.fixture +def vacuum_protocol_setup_unit(protocol_units): + return _get_unit(protocol_units, ASFEVacuumSetupUnit) + + +@pytest.fixture +def vacuum_protocol_sim_unit(protocol_units): + return _get_unit(protocol_units, ASFEVacuumSimUnit) + + +@pytest.fixture +def vacuum_protocol_analysis_unit(protocol_units): + return _get_unit(protocol_units, ASFEVacuumAnalysisUnit) @pytest.fixture @@ -57,14 +83,7 @@ def protocol_result(afe_solv_water_transformation_json): return pr -class TestProtocol(GufeTokenizableTestsMixin): - cls = ASFEProtocol - key = None - repr = "ASFEProtocol-" - - @pytest.fixture() - def instance(self, protocol): - return protocol +class ModifiedGufeTokenizableTestsMixin(GufeTokenizableTestsMixin): def test_repr(self, instance): """ @@ -74,50 +93,80 @@ def test_repr(self, instance): assert self.repr in repr(instance) -class TestSolventUnit(GufeTokenizableTestsMixin): +class TestProtocol(ModifiedGufeTokenizableTestsMixin): + cls = ASFEProtocol + key = None + repr = "ASFEProtocol-" + + @pytest.fixture() + def instance(self, protocol): + return protocol + + +class TestSolventSetupUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFESolventSetupUnit repr = "ASFESolventSetupUnit(ASFE Setup: benzene solvent leg" key = None @pytest.fixture() - def instance(self, solvent_protocol_unit): - return solvent_protocol_unit + def instance(self, solvent_protocol_setup_unit): + return solvent_protocol_setup_unit - def test_key_stable(self): - pytest.skip() - def test_repr(self, instance): - """ - Overwrites the base `test_repr` call. - """ - assert isinstance(repr(instance), str) - assert self.repr in repr(instance) +class TestSolventSimUnit(ModifiedGufeTokenizableTestsMixin): + cls = ASFESolventSimUnit + repr = "ASFESolventSimUnit(ASFE Simulation: benzene solvent leg" + key = None + + @pytest.fixture() + def instance(self, solvent_protocol_sim_unit): + return solvent_protocol_sim_unit -class TestVacuumUnit(GufeTokenizableTestsMixin): +class TestSolventSetupUnit(ModifiedGufeTokenizableTestsMixin): + cls = ASFESolventAnalysisUnit + repr = "ASFESolventAnalysisUnit(ASFE Analysis: benzene solvent leg" + key = None + + @pytest.fixture() + def instance(self, solvent_protocol_analysis_unit): + return solvent_protocol_analysis_unit + + +class TestVacuumSetupUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFEVacuumSetupUnit repr = "ASFEVacuumSetupUnit(ASFE Setup: benzene vacuum leg" key = None @pytest.fixture() - def instance(self, vacuum_protocol_unit): - return vacuum_protocol_unit + def instance(self, vacuum_protocol_setup_unit): + return vacuum_protocol_setup_unit - def test_key_stable(self): - pytest.skip() - def test_repr(self, instance): - """ - Overwrites the base `test_repr` call. - """ - assert isinstance(repr(instance), str) - assert self.repr in repr(instance) +class TestVacuumSimUnit(ModifiedGufeTokenizableTestsMixin): + cls = ASFEVacuumSimUnit + repr = "ASFEVacuumSimUnit(ASFE Simulation: benzene vacuum leg" + key = None + + @pytest.fixture() + def instance(self, vacuum_protocol_sim_unit): + return vacuum_protocol_sim_unit + + +class TestVacuumSetupUnit(ModifiedGufeTokenizableTestsMixin): + cls = ASFEVacuumAnalysisUnit + repr = "ASFEVacuumAnalysisUnit(ASFE Analysis: benzene vacuum leg" + key = None + + @pytest.fixture() + def instance(self, vacuum_protocol_analysis_unit): + return vacuum_protocol_analysis_unit @pytest.mark.skip( reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable" ) -class TestProtocolResult(GufeTokenizableTestsMixin): +class TestProtocolResult(ModifiedGufeTokenizableTestsMixin): cls = ASFEProtocolResult key = None repr = "ASFEProtocolResult-" @@ -125,10 +174,3 @@ class TestProtocolResult(GufeTokenizableTestsMixin): @pytest.fixture() def instance(self, protocol_result): return protocol_result - - def test_repr(self, instance): - """ - Overwrites the base `test_repr` call. - """ - assert isinstance(repr(instance), str) - assert self.repr in repr(instance) From eb1b4f0dbbb46872652ab0f5ffd0eace429abcbd Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sat, 7 Mar 2026 19:26:15 +0000 Subject: [PATCH 10/32] deal with duplicates --- src/pontibus/tests/protocols/solvation/test_tokenization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 9ba2fe5..88f4fb8 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -123,7 +123,7 @@ def instance(self, solvent_protocol_sim_unit): return solvent_protocol_sim_unit -class TestSolventSetupUnit(ModifiedGufeTokenizableTestsMixin): +class TestSolventAnalysisUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFESolventAnalysisUnit repr = "ASFESolventAnalysisUnit(ASFE Analysis: benzene solvent leg" key = None @@ -153,7 +153,7 @@ def instance(self, vacuum_protocol_sim_unit): return vacuum_protocol_sim_unit -class TestVacuumSetupUnit(ModifiedGufeTokenizableTestsMixin): +class TestVacuumAnalysisUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFEVacuumAnalysisUnit repr = "ASFEVacuumAnalysisUnit(ASFE Analysis: benzene vacuum leg" key = None From fbd56abf72da2c50e8901b93000881de7a0d3f7d Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 08:13:14 +0000 Subject: [PATCH 11/32] Some fixes --- .../protocols/relative/hybridtop_units.py | 277 ++++++++++-------- 1 file changed, 149 insertions(+), 128 deletions(-) diff --git a/src/pontibus/protocols/relative/hybridtop_units.py b/src/pontibus/protocols/relative/hybridtop_units.py index 479416e..4a0bd4b 100644 --- a/src/pontibus/protocols/relative/hybridtop_units.py +++ b/src/pontibus/protocols/relative/hybridtop_units.py @@ -9,8 +9,17 @@ import numpy as np import numpy.typing as npt -from gufe import SmallMoleculeComponent, SolventComponent -from gufe.settings import ThermoSettings +from gufe import ( + SmallMoleculeComponent, + SolventComponent, + ProteinComponent, + ChemicalSystem, + LigandAtomMapping, +) +from gufe.settings import ( + ThermoSettings, + SettingsBaseModel, +) from gufe.settings.typing import GufeArrayQuantity from openfe.protocols.openmm_rfe import _rfe_utils from openfe.protocols.openmm_rfe.hybridtop_units import HybridTopologySetupUnit @@ -23,6 +32,7 @@ from openff.toolkit import Molecule as OFFMolecule from openff.units import Quantity, unit from openff.units.openmm import from_openmm, to_openmm +import openmm from openmm import CMMotionRemover, MonteCarloBarostat, System from openmm import unit as omm_unit from openmm.app import Topology @@ -48,8 +58,7 @@ class HybridTopProtocolSetupUnit(HybridTopologySetupUnit): Setup unit for the HybridTopProtocol. Overrides :meth:`_get_omm_objects` to use Interchange-based - parameterization instead of OpenMM's SystemGenerator, enabling - support for arbitrary solvents and force fields via OpenFF Interchange. + parameterization instead of OpenMM's SystemGenerator. """ @staticmethod @@ -70,8 +79,8 @@ def _check_position_overlap( The system A positions. positionsB : openff.units.Quantity The system B positions. - tolerance : openff.units.Quantity - The maximum deivation allowed before an error or warning is raised. + threshold : openff.units.Quantity + The maximum deviation allowed before an error or warning is raised. Raises ------ @@ -93,41 +102,10 @@ def _check_position_overlap( warnings.warn(msg) logging.warning(msg) - @staticmethod - def _get_barostat( - solvent_component: SolventComponent | None, - thermo_settings: ThermoSettings, - integrator_settings: IntegratorSettings, - ) -> MonteCarloBarostat | None: - """ - Helper to get a barostat for the system. - - Parameters - ---------- - solvent_component: SolventComponent | None - The system's SolventComponent, if there is one. - thermo_settings : ThermoSettings - The thermodynamic settings. - integrator_settings : IntegratorSettings - The integrator settings - - Returns - ------- - MonteCarloBarostat | None - None is there is no solvent, a MonteCarloBarostat otherwise. - """ - if solvent_component is None: - return None - - return MonteCarloBarostat( - to_openmm(thermo_settings.pressure), - to_openmm(thermo_settings.temperature), - integrator_settings.barostat_frequency.m, - ) - @staticmethod def _get_interchanges( - mapping, + stateA: ChemicalSystem, + stateB: ChemicalSystem, small_mols: dict[SmallMoleculeComponent, OFFMolecule], protein_component, solvent_component: SolventComponent | None, @@ -140,8 +118,10 @@ def _get_interchanges( Parameters ---------- - mapping : LigandAtomMapping - The atom mapping between the alchemical ligands. + stateA : ChemicalSystem + ChemicalSystem defining end state A. + stateB : ChemicalSystem + ChemicalSystem defining end state B. small_mols : dict[SmallMoleculeComponent, OFFMolecule] All small molecule components for both states (flat dict). protein_component : ProteinComponent | None @@ -165,13 +145,18 @@ def _get_interchanges( alchem_resids : dict[str, npt.NDArray] Residue indices for the alchemical ligand in each state. """ - alchem_A = mapping.componentA - alchem_B = mapping.componentB - molA = small_mols[alchem_A] - molB = small_mols[alchem_B] + def _filter_small_mols(smols, state): + return {smc: offmol for smc, offmol in smols.items() if state.contains(smc)} + + stateA_small_mols = _filter_small_mols(small_mols, stateA) + stateB_small_mols = _filter_small_mols(small_mols, stateB) - # State A includes all molecules except the state-B-only alchemical mol - stateA_smc_comps = {smc: mol for smc, mol in small_mols.items() if smc != alchem_B} + # Get the alchemical components. + # We assume a single alchemical component, since we check for this + # early in the Protocol. + state_diff = stateA.component_diff(stateB) + alchem_A = state_diff[0][0] + alchem_B = state_diff[1][0] # Get solvent offmol if necessary if solvent_component is not None: @@ -188,20 +173,18 @@ def _get_interchanges( interA, comp_residsA = interchange_system_creation( ffsettings=forcefield_settings, solvation_settings=solvation_settings, - smc_components=stateA_smc_comps, + smc_components=stateA_small_mols, protein_component=protein_component, solvent_component=solvent_component, solvent_offmol=solvent_offmol, ) - # State B includes all molecules except the state-A-only alchemical mol - stateB_smc_comps = {smc: mol for smc, mol in small_mols.items() if smc != alchem_A} - - stateB_charged_mols = list(stateB_smc_comps.values()) + stateB_charged_mols = list(stateB_small_mols.values()) if solvent_component is not None and solvation_settings.assign_solvent_charges: stateB_charged_mols.append(solvent_offmol) # Tag molB so copy_interchange_with_replacement can identify it + molB = stateB_small_mols[alchem_B] molB.properties["key"] = str(alchem_B.key) # Build state B interchange by swapping ligand A → ligand B in the @@ -209,7 +192,7 @@ def _get_interchanges( with without_oechem_backend(): interB = copy_interchange_with_replacement( interchange=interA, - del_mol=molA, + del_mol=stateA_small_mols[alchem_A], insert_mol=molB, ffsettings=forcefield_settings, charged_molecules=stateB_charged_mols, @@ -218,7 +201,7 @@ def _get_interchanges( comp_residsB = _get_comp_resids( interchange=interB, - smc_components=stateB_smc_comps, + smc_components=stateB_small_mols, solvent_component=solvent_component, protein_component=protein_component, ) @@ -257,66 +240,64 @@ def _omm_from_interchange( Returns ------- topology : openmm.app.Topology + OpenMM Topology for the system. positions : openmm.unit.Quantity + Positions of all particles in the system. system : openmm.System + OpenMM System with hydrogen mass repartitioning applied, and a + MonteCarloBarostat if ``solvent_component`` is not ``None``. """ - topology = interchange.to_openmm_topology(collate=True) - positions = to_openmm_positions(interchange, include_virtual_sites=True) - system = interchange.to_openmm_system(hydrogen_mass=forcefield_settings.hydrogen_mass) - - barostat = None - if solvent_component is not None: - barostat = MonteCarloBarostat( + def _get_barostat( + solvent_component: SolventComponent | None, + thermo_settings: ThermoSettings, + integrator_settings: IntegratorSettings, + ) -> MonteCarloBarostat | None: + """ + Helper function to add a MonteCarloBarostat + if a solvent component is present. + """ + if solvent_component is None: + return None + + return MonteCarloBarostat( to_openmm(thermo_settings.pressure), to_openmm(thermo_settings.temperature), integrator_settings.barostat_frequency.m, ) - adjust_system(system=system, remove_force_types=CMMotionRemover, add_forces=barostat) - - return topology, positions, system - - def _subsample_topology( - self, - hybrid_topology, - hybrid_positions, - output_selection: str, - output_filename: str, - atom_classes: dict, - ): - """ - Override of parent to additionally write the full hybrid topology - as ``full_hybrid_system.pdb``. - """ - selection_indices = super()._subsample_topology( - hybrid_topology=hybrid_topology, - hybrid_positions=hybrid_positions, - output_selection=output_selection, - output_filename=output_filename, - atom_classes=atom_classes, - ) + topology = interchange.to_openmm_topology(collate=True) + positions = to_openmm_positions(interchange, include_virtual_sites=True) + system = interchange.to_openmm_system(hydrogen_mass=forcefield_settings.hydrogen_mass) - # Write the full (unsubsampled) hybrid topology - super()._subsample_topology( - hybrid_topology=hybrid_topology, - hybrid_positions=hybrid_positions, - output_selection="all", - output_filename=f"full_{output_filename}", - atom_classes=atom_classes, + adjust_system( + system=system, + remove_force_types=CMMotionRemover, + add_forces=_get_barostat( + solvent_component=solvent_component, + thermo_settings=thermo_settings, + integrator_settings=integrator_settings, + ), ) - - return selection_indices + return topology, positions, system def _get_omm_objects( self, - stateA, - stateB, - mapping, - settings: dict, - protein_component, + stateA: ChemicalSystem, + stateB: ChemicalSystem, + mapping: LigandAtomMapping, + settings: dict[str, SettingsBaseModel], + protein_component: ProteinComponent | None, solvent_component: SolventComponent | None, small_mols: dict[SmallMoleculeComponent, OFFMolecule], - ) -> tuple: + ) -> tuple[ + openmm.System, + openmm.app.Topology, + openmm.unit.Quantity, + openmm.System, + openmm.app.Topology, + openmm.unit.Quantity, + dict[str, dict[int, int]], + ]: """ Get OpenMM objects for both end states using Interchange. @@ -331,54 +312,60 @@ def _get_omm_objects( stateB : ChemicalSystem ChemicalSystem defining end state B. mapping : LigandAtomMapping - The mapping between alchemical components in state A and B. + The mapping for alchemical components between state A and B. settings : dict[str, SettingsBaseModel] - Protocol settings dictionary. + Settings for the transformation. protein_component : ProteinComponent | None - The common protein component, if present. + The common ProteinComponent between the end states, if there is one. solvent_component : SolventComponent | None - The common solvent component, if present. - small_mols : dict[SmallMoleculeComponent, OFFMolecule] - All small molecules from both end states (flat dict). + The common SolventComponent between the end states, if there is one. + small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule] + The small molecules for both end states. Returns ------- - stateA_system, stateA_topology, stateA_positions, - stateB_system, stateB_topology, stateB_positions, - system_mappings + stateA_system : openmm.System + OpenMM System for state A. + stateA_topology : openmm.app.Topology + OpenMM Topology for the state A System. + stateA_positions : openmm.unit.Quantity + Positions of all particles in state A System. + stateB_system : openmm.System + OpenMM System for state B. + stateB_topology : openmm.app.Topology + OpenMM Topology for the state B System. + stateB_positions : openmm.unit.Quantity + Positions of all particles in state B System. + system_mappings : dict[str, dict[int, int]] + Dictionary of mappings defining the correspondence between + the two state Systems. """ if self.verbose: - self.logger.info("Parameterizing systems with Interchange") - - forcefield_settings = settings["forcefield_settings"] - thermo_settings = settings["thermo_settings"] - integrator_settings = settings["integrator_settings"] - solvation_settings = settings["solvation_settings"] - charge_settings = settings["charge_settings"] - alchemical_settings = settings["alchemical_settings"] + self.logger.info("Parameterizing systems.") interA, interB, alchem_resids = self._get_interchanges( - mapping=mapping, + stateA=stateA, + stateB=stateB, small_mols=small_mols, protein_component=protein_component, solvent_component=solvent_component, - forcefield_settings=forcefield_settings, - solvation_settings=solvation_settings, - charge_settings=charge_settings, + forcefield_settings=settings["forcefield_settings"], + solvation_settings=settings["solvation_settings"], + charge_settings=settings["charge_settings"], ) stateA_topology, stateA_positions, stateA_system = self._omm_from_interchange( interchange=interA, - forcefield_settings=forcefield_settings, - thermo_settings=thermo_settings, - integrator_settings=integrator_settings, + forcefield_settings=settings["forcefield_settings"], + thermo_settings=settings["thermo_settings"], + integrator_settings=settings["integrator_settings"], solvent_component=solvent_component, ) stateB_topology, stateB_positions, stateB_system = self._omm_from_interchange( interchange=interB, - forcefield_settings=forcefield_settings, - thermo_settings=thermo_settings, - integrator_settings=integrator_settings, + forcefield_settings=settings["forcefield_settings"], + thermo_settings=settings["thermo_settings"], + integrator_settings=settings["integrator_settings"], solvent_component=solvent_component, ) @@ -390,6 +377,7 @@ def _get_omm_objects( stateB_system, stateB_topology, alchem_resids["stateB"], + # non-optional setting for this method fix_constraints=True, ) @@ -399,13 +387,15 @@ def _get_omm_objects( from_openmm(stateB_positions), ) - if alchemical_settings.explicit_charge_correction: + if settings["alchemical_settings"].explicit_charge_correction: + # Note: we don't need to modify the positions after this + # since stateB retains the hydrogens but as dummy atoms charge_difference = mapping.get_alchemical_charge_difference() alchem_water_resids = _rfe_utils.topologyhelpers.get_alchemical_waters( stateA_topology, from_openmm(stateA_positions).m, charge_difference, - alchemical_settings.explicit_charge_correction_cutoff, + settings["alchemical_settings"].explicit_charge_correction_cutoff, ) _rfe_utils.topologyhelpers.handle_alchemical_waters( alchem_water_resids, @@ -425,3 +415,34 @@ def _get_omm_objects( stateB_positions, system_mappings, ) + + def _subsample_topology( + self, + hybrid_topology, + hybrid_positions, + output_selection: str, + output_filename: str, + atom_classes: dict, + ): + """ + Override of parent to additionally write the full hybrid topology + as ``full_hybrid_system.pdb``. + """ + selection_indices = super()._subsample_topology( + hybrid_topology=hybrid_topology, + hybrid_positions=hybrid_positions, + output_selection=output_selection, + output_filename=output_filename, + atom_classes=atom_classes, + ) + + # Write the full (unsubsampled) hybrid topology + super()._subsample_topology( + hybrid_topology=hybrid_topology, + hybrid_positions=hybrid_positions, + output_selection="all", + output_filename=f"full_{output_filename}", + atom_classes=atom_classes, + ) + + return selection_indices From 309f59d53afd8589a9724693c794dac0a8160c43 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 08:40:55 +0000 Subject: [PATCH 12/32] Various fixes --- src/pontibus/components/extended_solvent_component.py | 6 +++--- src/pontibus/protocols/solvation/asfe_protocol.py | 2 +- .../tests/protocols/relative/test_tokenization.py | 6 ------ .../tests/protocols/solvation/test_tokenization.py | 11 ++--------- src/pontibus/utils/molecule_utils.py | 2 +- src/pontibus/utils/protocol_utils.py | 2 +- src/pontibus/utils/system_creation.py | 8 ++++---- src/pontibus/utils/system_manipulation.py | 4 ++-- src/pontibus/utils/system_solvation.py | 4 ++-- 9 files changed, 16 insertions(+), 29 deletions(-) diff --git a/src/pontibus/components/extended_solvent_component.py b/src/pontibus/components/extended_solvent_component.py index 969bd9e..55ac5d2 100644 --- a/src/pontibus/components/extended_solvent_component.py +++ b/src/pontibus/components/extended_solvent_component.py @@ -33,16 +33,16 @@ def __init__( positive and negative monoatomic ions, defaults "Na+", "Cl-" neutralize : bool, optional if the net charge on the chemical state is neutralized by the ions in - this solvent component. Default `True` + this solvent component. Default `False` ion_concentration : openff.units.Quantity, optional - ionic concentration required, default 0.15 * unit.molar + ionic concentration required, default 0.0 * unit.molar this must be supplied with units, e.g. "1.5 * unit.molar" Examples -------- To create a sodium chloride solution at 0.2 molar concentration:: - >>> s = SolventComponent(position_ion='Na', negative_ion='Cl', + >>> s = SolventComponent(positive_ion='Na', negative_ion='Cl', ... ion_concentration=0.2 * unit.molar) To create a methane solvent:: diff --git a/src/pontibus/protocols/solvation/asfe_protocol.py b/src/pontibus/protocols/solvation/asfe_protocol.py index 6f50112..94c5910 100644 --- a/src/pontibus/protocols/solvation/asfe_protocol.py +++ b/src/pontibus/protocols/solvation/asfe_protocol.py @@ -135,7 +135,7 @@ def _default_settings(cls): def _validate_solvent(state: ChemicalSystem, nonbonded_method: str): """ Checks that the ChemicalSystem component has the right solvent - composition for an input nonbonded_methtod. + composition for an input nonbonded_method. Parameters ---------- diff --git a/src/pontibus/tests/protocols/relative/test_tokenization.py b/src/pontibus/tests/protocols/relative/test_tokenization.py index 346aab9..8516d05 100644 --- a/src/pontibus/tests/protocols/relative/test_tokenization.py +++ b/src/pontibus/tests/protocols/relative/test_tokenization.py @@ -80,9 +80,6 @@ class TestSolventUnit(GufeTokenizableTestsMixin): def instance(self, solvent_protocol_unit): return solvent_protocol_unit - def test_key_stable(self): - pytest.skip() - def test_repr(self, instance): """ Overwrites the base `test_repr` call. @@ -100,9 +97,6 @@ class TestVacuumUnit(GufeTokenizableTestsMixin): def instance(self, vacuum_protocol_unit): return vacuum_protocol_unit - def test_key_stable(self): - pytest.skip() - def test_repr(self, instance): """ Overwrites the base `test_repr` call. diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 88f4fb8..7172f56 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -44,6 +44,7 @@ def _get_unit(pus, pu_class): for pu in pus: if isinstance(pu, pu_class): return pu + raise ValueError(f"No unit of type {pu_class} found in protocol units") @pytest.fixture @@ -87,7 +88,7 @@ class ModifiedGufeTokenizableTestsMixin(GufeTokenizableTestsMixin): def test_repr(self, instance): """ - Overwrites the base `test_repr` call. + Overrides the base `test_repr` call. """ assert isinstance(repr(instance), str) assert self.repr in repr(instance) @@ -95,7 +96,6 @@ def test_repr(self, instance): class TestProtocol(ModifiedGufeTokenizableTestsMixin): cls = ASFEProtocol - key = None repr = "ASFEProtocol-" @pytest.fixture() @@ -106,7 +106,6 @@ def instance(self, protocol): class TestSolventSetupUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFESolventSetupUnit repr = "ASFESolventSetupUnit(ASFE Setup: benzene solvent leg" - key = None @pytest.fixture() def instance(self, solvent_protocol_setup_unit): @@ -116,7 +115,6 @@ def instance(self, solvent_protocol_setup_unit): class TestSolventSimUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFESolventSimUnit repr = "ASFESolventSimUnit(ASFE Simulation: benzene solvent leg" - key = None @pytest.fixture() def instance(self, solvent_protocol_sim_unit): @@ -126,7 +124,6 @@ def instance(self, solvent_protocol_sim_unit): class TestSolventAnalysisUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFESolventAnalysisUnit repr = "ASFESolventAnalysisUnit(ASFE Analysis: benzene solvent leg" - key = None @pytest.fixture() def instance(self, solvent_protocol_analysis_unit): @@ -136,7 +133,6 @@ def instance(self, solvent_protocol_analysis_unit): class TestVacuumSetupUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFEVacuumSetupUnit repr = "ASFEVacuumSetupUnit(ASFE Setup: benzene vacuum leg" - key = None @pytest.fixture() def instance(self, vacuum_protocol_setup_unit): @@ -146,7 +142,6 @@ def instance(self, vacuum_protocol_setup_unit): class TestVacuumSimUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFEVacuumSimUnit repr = "ASFEVacuumSimUnit(ASFE Simulation: benzene vacuum leg" - key = None @pytest.fixture() def instance(self, vacuum_protocol_sim_unit): @@ -156,7 +151,6 @@ def instance(self, vacuum_protocol_sim_unit): class TestVacuumAnalysisUnit(ModifiedGufeTokenizableTestsMixin): cls = ASFEVacuumAnalysisUnit repr = "ASFEVacuumAnalysisUnit(ASFE Analysis: benzene vacuum leg" - key = None @pytest.fixture() def instance(self, vacuum_protocol_analysis_unit): @@ -168,7 +162,6 @@ def instance(self, vacuum_protocol_analysis_unit): ) class TestProtocolResult(ModifiedGufeTokenizableTestsMixin): cls = ASFEProtocolResult - key = None repr = "ASFEProtocolResult-" @pytest.fixture() diff --git a/src/pontibus/utils/molecule_utils.py b/src/pontibus/utils/molecule_utils.py index b98f372..c6ea465 100644 --- a/src/pontibus/utils/molecule_utils.py +++ b/src/pontibus/utils/molecule_utils.py @@ -217,7 +217,7 @@ def _check_and_deduplicate_charged_mols( ------ ValueError If any molecules in the list are isomorphic with different charges. - If any molecules in the last have no charges. + If any molecules in the list have no charges. """ if any(m.partial_charges is None for m in molecules): errmsg = ( diff --git a/src/pontibus/utils/protocol_utils.py b/src/pontibus/utils/protocol_utils.py index fac1b0f..c0f256b 100644 --- a/src/pontibus/utils/protocol_utils.py +++ b/src/pontibus/utils/protocol_utils.py @@ -29,7 +29,7 @@ def _get_and_charge_solvent_offmol( smiles for the solvent molecule solvation_settings : PackmolSolvationSettings Settings defining how the system will be solvated - partial_charge_settings : OpenFFPartialChargeSettigns + partial_charge_settings : OpenFFPartialChargeSettings Settings defining how partial charges are applied Returns diff --git a/src/pontibus/utils/system_creation.py b/src/pontibus/utils/system_creation.py index 4032d24..21fb7c4 100644 --- a/src/pontibus/utils/system_creation.py +++ b/src/pontibus/utils/system_creation.py @@ -175,7 +175,7 @@ def _assign_comp_resnames_and_keys( Parameters ---------- - smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]` + smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule] Solute SmallMoleculeComponents. solvent_component : Optional[SolventComponent] Solvent component of the system, if any. @@ -253,7 +253,7 @@ def _post_process_topology( ---------- pre_topology : openff.toolkit.Topology The Topology to post-process - smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]` + smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule] Solute SmallMoleculeComponents. solvent_component : Optional[SolventComponent] Solvent component of the system, if any. @@ -409,7 +409,7 @@ def _get_comp_resids( Returns ------- comp_resids : dict[Component, npt.NDArray] - A dictionary definingg the resisdue indices matching + A dictionary defining the residue indices matching various components in the system. """ comps = [*smc_components.keys()] @@ -463,7 +463,7 @@ def interchange_system_creation( Settings defining how the force field is applied. solvation_settings : PackmolSolvationSettings | InterchangeOpenMMSolvationSettings Settings defining how the system will be solvated. - smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]` + smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule] Solute SmallMoleculeComponents. protein_component : Optional[ProteinComponent] Protein component of the system, if any. diff --git a/src/pontibus/utils/system_manipulation.py b/src/pontibus/utils/system_manipulation.py index bd2f04a..f1fbca2 100644 --- a/src/pontibus/utils/system_manipulation.py +++ b/src/pontibus/utils/system_manipulation.py @@ -82,14 +82,14 @@ def copy_interchange_with_replacement( ffsettings : InterchangeFFSettings The force field settings. charged_molecules : list[Molecule] | None - A list of Molecules which partial charges to use in the new Interchange. + A list of Molecules which partial charges to use in the new Interchange. protein_component : ProteinComponent | None The ProteinComponent, only necessary if using the ff14sb force field. Returns ------- new_interchange : Interchange - An copy of the input Interchange but with the Molecule mutation. + A copy of the input Interchange but with the Molecule mutation. Note ---- diff --git a/src/pontibus/utils/system_solvation.py b/src/pontibus/utils/system_solvation.py index a5a8fa0..0cf00dc 100644 --- a/src/pontibus/utils/system_solvation.py +++ b/src/pontibus/utils/system_solvation.py @@ -129,7 +129,7 @@ def _box_density_from_mols( Returns ------- box_vectors : openff.units.Quantity - The unit cell box vecctors. Array with shape (3, 3). + The unit cell box vectors. Array with shape (3, 3). Acknowledgements ---------------- @@ -442,7 +442,7 @@ def openmm_solvation( Raises ------ ValueError - * If neutralizing with a non-waterr solvent. + * If neutralizing with a non-water solvent. * If ``ion_concentration`` is not compatible with ``mole / liter`` * If ``neutralize`` is ``False`` and the system has a net charge. """ From 0953b0c7646ba8ea226c7312eb2ab4ca4e6b7c0f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 08:41:34 +0000 Subject: [PATCH 13/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pontibus/protocols/relative/hybridtop_units.py | 12 +++++++----- .../tests/protocols/solvation/test_tokenization.py | 5 ++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/pontibus/protocols/relative/hybridtop_units.py b/src/pontibus/protocols/relative/hybridtop_units.py index 4a0bd4b..964aa98 100644 --- a/src/pontibus/protocols/relative/hybridtop_units.py +++ b/src/pontibus/protocols/relative/hybridtop_units.py @@ -9,16 +9,17 @@ import numpy as np import numpy.typing as npt +import openmm from gufe import ( - SmallMoleculeComponent, - SolventComponent, - ProteinComponent, ChemicalSystem, LigandAtomMapping, + ProteinComponent, + SmallMoleculeComponent, + SolventComponent, ) from gufe.settings import ( - ThermoSettings, SettingsBaseModel, + ThermoSettings, ) from gufe.settings.typing import GufeArrayQuantity from openfe.protocols.openmm_rfe import _rfe_utils @@ -32,7 +33,6 @@ from openff.toolkit import Molecule as OFFMolecule from openff.units import Quantity, unit from openff.units.openmm import from_openmm, to_openmm -import openmm from openmm import CMMotionRemover, MonteCarloBarostat, System from openmm import unit as omm_unit from openmm.app import Topology @@ -145,6 +145,7 @@ def _get_interchanges( alchem_resids : dict[str, npt.NDArray] Residue indices for the alchemical ligand in each state. """ + def _filter_small_mols(smols, state): return {smc: offmol for smc, offmol in smols.items() if state.contains(smc)} @@ -247,6 +248,7 @@ def _omm_from_interchange( OpenMM System with hydrogen mass repartitioning applied, and a MonteCarloBarostat if ``solvent_component`` is not ``None``. """ + def _get_barostat( solvent_component: SolventComponent | None, thermo_settings: ThermoSettings, diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 7172f56..569c09c 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -11,12 +11,12 @@ from pontibus.protocols.solvation import ( ASFEProtocol, ASFEProtocolResult, + ASFESolventAnalysisUnit, ASFESolventSetupUnit, ASFESolventSimUnit, - ASFESolventAnalysisUnit, + ASFEVacuumAnalysisUnit, ASFEVacuumSetupUnit, ASFEVacuumSimUnit, - ASFEVacuumAnalysisUnit, ) @@ -85,7 +85,6 @@ def protocol_result(afe_solv_water_transformation_json): class ModifiedGufeTokenizableTestsMixin(GufeTokenizableTestsMixin): - def test_repr(self, instance): """ Overrides the base `test_repr` call. From 3b0921b4b76023daf3a8245b8101441a496cc1b5 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 10:34:03 +0000 Subject: [PATCH 14/32] rename setup unit for ASFE --- src/pontibus/protocols/solvation/asfe_protocol_units.py | 6 +++--- src/pontibus/protocols/solvation/base.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pontibus/protocols/solvation/asfe_protocol_units.py b/src/pontibus/protocols/solvation/asfe_protocol_units.py index 58607e8..f1e6432 100644 --- a/src/pontibus/protocols/solvation/asfe_protocol_units.py +++ b/src/pontibus/protocols/solvation/asfe_protocol_units.py @@ -12,10 +12,10 @@ BaseAbsoluteMultiStateSimulationUnit, ) -from pontibus.protocols.solvation.base import BaseASFEUnit +from pontibus.protocols.solvation.base import BaseASFESetupUnit -class ASFEVacuumSetupUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseASFEUnit): +class ASFEVacuumSetupUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseASFESetupUnit): """ Protocol Unit for setting up the vacuum phase of an absolute solvation free energy transformation. @@ -44,7 +44,7 @@ class ASFEVacuumAnalysisUnit(VacuumSettingsMixin, BaseAbsoluteMultiStateAnalysis simtype: str = "vacuum" -class ASFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseASFEUnit): +class ASFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseASFESetupUnit): """ Protocol Unit for setting up the solvent phase of an absolute solvation free energy transformation. diff --git a/src/pontibus/protocols/solvation/base.py b/src/pontibus/protocols/solvation/base.py index 1b948cf..e240657 100644 --- a/src/pontibus/protocols/solvation/base.py +++ b/src/pontibus/protocols/solvation/base.py @@ -37,7 +37,7 @@ logger = logging.getLogger(__name__) -class BaseASFEUnit(BaseAbsoluteSetupUnit): +class BaseASFESetupUnit(BaseAbsoluteSetupUnit): simtype: str @staticmethod From 8d41c5ddd45947ed4c85058091eeb87e22f55742 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 11:02:58 +0000 Subject: [PATCH 15/32] Rename tests --- src/pontibus/tests/protocols/relative/test_tokenization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pontibus/tests/protocols/relative/test_tokenization.py b/src/pontibus/tests/protocols/relative/test_tokenization.py index 8516d05..f9b3589 100644 --- a/src/pontibus/tests/protocols/relative/test_tokenization.py +++ b/src/pontibus/tests/protocols/relative/test_tokenization.py @@ -71,7 +71,7 @@ def test_repr(self, instance): assert self.repr in repr(instance) -class TestSolventUnit(GufeTokenizableTestsMixin): +class TestSolventSetupUnit(GufeTokenizableTestsMixin): cls = HybridTopProtocolSetupUnit repr = "HybridTopProtocolSetupUnit(" key = None @@ -88,7 +88,7 @@ def test_repr(self, instance): assert self.repr in repr(instance) -class TestVacuumUnit(GufeTokenizableTestsMixin): +class TestVacuumSetupUnit(GufeTokenizableTestsMixin): cls = HybridTopProtocolSetupUnit repr = "HybridTopProtocolSetupUnit(" key = None From aeacb784082031b7b53d91f63a5567226bb14355 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 19:10:38 +0000 Subject: [PATCH 16/32] Update tests --- devtools/gen_serialized_results.py | 1 + .../HybridTopProtocol_solvent_json_results.gz | Bin 25431 -> 27238 bytes .../HybridTopProtocol_vacuum_json_results.gz | Bin 25570 -> 27044 bytes .../ASFEProtocol_octanol_json_results.gz | Bin 50687 -> 70821 bytes .../ASFEProtocol_water_json_results.gz | Bin 33644 -> 58283 bytes .../tests/protocols/relative/test_protocol.py | 146 ++++++++++++++---- .../tests/protocols/relative/test_results.py | 5 +- .../protocols/relative/test_tokenization.py | 3 - .../tests/protocols/solvation/test_results.py | 6 +- .../protocols/solvation/test_tokenization.py | 3 - 10 files changed, 116 insertions(+), 48 deletions(-) diff --git a/devtools/gen_serialized_results.py b/devtools/gen_serialized_results.py index 8138c0d..7241ad1 100644 --- a/devtools/gen_serialized_results.py +++ b/devtools/gen_serialized_results.py @@ -100,6 +100,7 @@ def generate_asfe_json_water(smc): def generate_asfe_json_octanol(smc): settings = generate_ahfe_settings() settings.solvation_settings.assign_solvent_charges = True + settings.solvation_settings.target_density = 0.715 * unit.grams / unit.mL protocol = ASFEProtocol(settings=settings) solvent = Molecule.from_smiles("CCCCCCCCO") solvent.assign_partial_charges(partial_charge_method="am1bcc") diff --git a/src/pontibus/tests/data/relative_protocol/HybridTopProtocol_solvent_json_results.gz b/src/pontibus/tests/data/relative_protocol/HybridTopProtocol_solvent_json_results.gz index 99ada775b6fc34f70c907b88d3e06521fc62ebcd..0439beb872ff98d7ba5f8363e066f0dd120e62c2 100644 GIT binary patch literal 27238 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

&-MSW6=XxdMA&f0 zhlK=KpHiF|uuuiQY=WtmQAYb`hW-V>MNdQON6}ZA69)7KST7j}8wqzH8~U}0(H2i} zWzgttX+m>6@kgeTL+KDky5`ok` zuQtle&yQ!e<#KS=Tv|+iUFhsig9sN1sFdfd1!Ro`MVWm5IcLjTK74KeQ^XI4BIDcZ z0@+1#97-fi#6OHy*~6$0(_&1k+Tj2=j1}nEe~)-3KP$dE51%g_wtWgl->fW|QZMNC zv(Ns}e z5SXI^E3zPIveMKq2l6Xl1}16M*<6w>-d;{pTh;5heel0uUJdRXaAOD-hn9l1^} zsSjgdY2FBW`EHQ%$i-ccu(;>;vvFQ?zvmV@ey^9^RDh?wURl5$s1s6tuou05J=7zz zkUBuxBa>ma%Wg?g^XM z(_kKD6@NT`%~3N1%aV#UR2-FCTFAIK`5IcdC*BnoF1~~I)lH7&kCfMVbNF&t{FhyA z23Bd6+BsE|>;u4LI-pt)oUX+Vo-oIw*fAh)ICgzb3EHiVRlVkTadyB*uF$}@JvaC2 zZ6K>lSFz3#9I`!+A4+?{?4}Gy*=5d?3FUb2R5ULX0|h~lpgJvNr4Vazjg141V68>Qoo2xL?iEJ{x>!4woM>@g^mO<m4@C`;S!78Cq#y%b z4lxT!D(i6CvvftPt1tvaPlZddOYAo`ehfFgl*{-xf6ea7SO~Bj!PHMek`kWAbp7Ha zqF1kjNJL86U4+4| zC|F*|i1yuFNT7a|FmD^#C+bHQ9j*qGO0dC`Lhvj)${lDv~V z(spv=A_^P+=U@IB=eLuQ)Ji|&7(krY-sSQg&o@=I;Fn68t#v=zcnbj|L%_(ASlcHh z&h+dk3_qR+6eWwz`8KiV(8i9GAe4hmT8;AcEy5JJ823P7isId^VH7H#S%&)feq!mGf!Ybf&z+d1N)4m z#5A)^*njv7n)DIlLLc!NUAkdBcWgV*w^e%URcT0Ze_kYxUb|#4?5Tv=PWMV=Aeb;G zYNKvl^OO;EH>TU{u0kdYzm(Q7q^>#hz`w3kUYnBtisO8Jh{bAy=P>4>LR50X_)ucM zf9j{J;R7Vh-iuHIsT1XHv59#9oN$$~P|r>UDAroyAhvkxsXtwx^ZD1&86RK*mo4WP zIT6DGg{*)F{xYKf^PpHDZ2%XzRQYNO*tKV87NID%jd2^wh0i{T7tD10tVewGSv2%u zHM$3@>*eyO+AUR6EoG%Uswkl%hpcSz5ZiDcJDQ5E|K;QmmY91t?FY9_;+>|gpN0A1 z&?&!lA6PL8cK>N5G^&J*#B{3jwxMl-a81aa!lfhB1{BCLOCLHUw*IK2%4N=>Mg6is z=$hWmQIr|9s*<*Dqzg+C9J&~mO|Boq6|viaI}iOnDm6JOMG0J(J}nioPtT8=qz`xU zYm;hbadJ6HR#_&adZ99P%ONLtq5Q-6@pr2WxIc$16Q88*uapC)LN}&g32^O0Y=h7i znlz0saZ0A|=P0PLykyaaKcn~=C$|j4y#g9bYUxUurAgKXnDt>p{IPvi71iYbU}&9Z z_%M6QSgSkaR)-sb#VmQ)c9P<2U1&|3u#nRo{$CDSfN&tWEhGICe^aO_jl<=H5w#IK zWt82ZJ!hO^n!`4P3HOct)DxS1?S_J{({zhTcEglO$&c2O88&?SV%y$xQVa%dgXEt* z4^>s!b>~kAFOQA0I7ArxG=yH)Wj|GH^@@OFf~C>&UZ zX7q&WNv`4D6K7bEu+?S2NR@$Kl9Xbt!2a$t{kSI$#qEO2lkk^|nX>~o>En;vYyl>G z%|Da(dRa@H!guqcD7|KdBA-YS| zr+hcv2}6_CRhg8&UQ8z{Sjkf!z|55v})35v~CY7=>L&B{IC0 zM8A`{-kz6nWD(L0qC-ga*@I2%E zx6W^V;I6if&@!W5d)Hm}ayMZtD2 zM0EHF9cO}&p!t*eXl|8`xu4I=@Xan`$7FV0N&)L6l9?VhZn||!x?(GTfr#=zj3<$( z$7U)&f2uhf{!T_}3TkUsy!;o3kakWRBVZ-7XdlHUAe|pO_b<4~byHY1a+vn5XkT0G z#|l#}U7qSO{r#&`?Wcl3C)EGTl>g5-Fjm<0Bqq=PG40YBrTY(r2L13QlD~t4BA3Dk zsr*Gn+-A3bCJ1#3R7;jA@8m^(q|qK@JAWrp)y>j8>_*bh@>I!y#S#I&UDBo)AZ~l0 zrW>4E7O1d3I%g#kPn0_HAq@=372C{Uo%LVv9VV`-m73Vq{JgEIq+E zdlOBz2W2|2ITeill<vym>w1H_L#=)O=0m1>X(*ck2D@ELn>v(3`tiuw(OTUw?$x=(p= zpPZekvNC{B#RMebSHzPJvEhKhluJ&>7xj)ER&=`LrQo= zP6WD0wAAC6+u>%9QuLP(34*OLHxX-I_?>QiMT5Ydi)FX*&v|JP0u)X!L=*{e6Pd`# z6|4k0e;OLq4x!U|HkyVy=a667UP{B*nyBjYH1U{0g5+?en>3n-qb!dY=X6mHj31S3 zR2nLDrhlTg^;fmP+(;z?sta$#<3CMana<7VXl`)n0?1>32YNMs9FAgmArqH9soXK$ zs#(GZj7{RAP>=aipD8Vw;u&Upd;9Fq6#d|Hb@Jrmp}=Xh(a3IEO#dONN2(8TB0~Qq zO?CY>tlpKvFt@ha4N&W8V9QAB@ez8VLlBroxEs^DUe>Y6ea4H_{ zKv>t|jmz^Hd6ETNC8t5)N^Ft^1bRH3FiI!fcuDv315!}El>L^g(6wLkD*kuRC6Q{C z0i!QjC2mXg6W6ASt*Xv@;aMyR)_fWz=zUW?)q`J|i*0ri_TB?;)H&8gck5HV%2sLL zBq>a6{hWTl(df93=O^#CoPUynjVSWVfR+%G&1+%e@m_OCwPr@@D6a)3y<{F$r&~SHHn{&WdzGMYwCeJD6(BHFt{^WXLa_2KMx}$; zpp66CPnT!{APb2}4b+q;&QVpUGnx?@7^U7#M6h z862&h&f(P2wWuVr?E~rcY@8wxkLN3s61Zg4n~3@FWNVVjy{jR#L+;d@c`x$D*Cr0f z>1PvGDobABu$q<9*QusFdOsr=X$1c&Kd2Np%QLQ-ZZZ9WSQFu~)?KE7iEKVS7 zw2utdoONzcFJHgQG6zrrdmF9QQSW{<`=9q7$6R)7^rBPRdblqt7 zJGb9W?`!*L(=VO z96NMDV;GysVbEG|Z#y|5@aFcQeP}4xfkqw>$JbXLnJ_phl3Ezr7G74vjGrC!dC$mY z%p)NEXX9M{+9`Lleao}|yydeqXSTq`ce>oRczQW)v8veIyO)=Li;IDAcZY?sd!xcw J^bCOUe*hL_#2x?u diff --git a/src/pontibus/tests/data/relative_protocol/HybridTopProtocol_vacuum_json_results.gz b/src/pontibus/tests/data/relative_protocol/HybridTopProtocol_vacuum_json_results.gz index e08b42d77016b49ca5423df6b524de76c60f076a..3efa8da97c4070e036c0ffc1a6cbfa778225429b 100644 GIT binary patch literal 27044 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 literal 25570 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≤{`GGhtXm4a0RszQ1YGT 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 V`}RKo009600|0wY@Ipqr3jpsgpDq9Z literal 50687 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𝔇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

|e)M%r zHwSjyH($;FR1eW9M?%fOBwC#GM{slDH3-}%V44HWk3*3Tjsa3x?+s@i%Ft}w23d2z z;}GeSkDEnpDDNd&4#(lty)i)&>#VU_VgGs=V=Ke^R_&G^EK!f~fFT@*gm3WdCO(6W zdoUD^8Ud2wuE(p9fn+4E9)s7g;4e(BH%yi=49bTUsS6=&-EUeK*XM0uHo5@9B&OX3 z-cLN}1qa9hoQE|P5T}SI!R}S7qB;LByT9LE~yBeW@!4lN0E+w zD%3kq@OGr%->khI(5{mfW#E1KF zNP50ze3_#VCUK~=CX4AJ8Stm2oxnE3_ZcK@FR^BZs9WBD|(@k#!EH^n%7W7yc2xkzlLgnMlzgZ7DK94~Y>TkW$)+P0nK8IDruF zTc7vfz$hGE5;m}}&5gD}lmzQ;IDQh|Q^iDP!#;%|r08%lK_OjK@!q{@; z8+=1YG%6?)7HOo>_$ZxmMIB-dtNQsZQ?a6vHQ3v`=jid&FQ<7oT4m3u^HSWF0sJf7!q$Jr2#NAiX?h6tDZaP2xKDA z5(oh&P$F1l<$W@+)U^yz%0~^;fYX`{7;)cOD<}|G58)rUU?*LY zZl`>`SoboYl_n?g2Hq+c^llAZ0G@qA9d;poksMQ>rCei>-si*SSVA15k163|uL*76 zUikYi0QtUGNyfRS8>niTRSj2ZJTfv$uYv`4hAkgZ)v`aJRMpAMIHJ3N6%J;1)6`Q> zcm1|+oYwq97e~z>cuiS*kM`?ck!w@`hhY53cQBH4C}y7{_IoEY$$xEYJ2+3Q)B0ZD z=yUSX{!gAc79vGZe^ zs;GT9jOjfeBL}WYuO9{`=l++E?S26#C{KB*G^)Vk2$cNq0C9AOLH}>4TWq}*adem` zC6b_d#WrEt8Jm#n!OOqdq$8j=&JMwJ0cBQWR5uWLg`A`FJ0YIhzUx}pTE)~@jIeL& z;1m5MmJ15Ekekc<-Jp}S1_ivG-Nu5}@%N1A3RYXLCOf)-K;Itt_Kzfh&tm z*h-MoGBTP0pi-SGbgsYozzzRN2!R)Jx<0jOoI&j?PXAJK;zsvjxe1(~w0x4|f3tf* zu+Rq{2ET%N|Krvgynz4p!mr!DVr;DT_?uup#`YR`bLTcU6*ezL z{P*G*#DdU+FT*DT--nE4D_U5AIa3nPiqYNh?HI~pU>ULuj`jlhWjI`ax@A1>#o1h0 z>Q4JylJ$@oTpsix74EYF5Uht{OTFj0KN$*FB?|&IFxcG#p-_7zCb|99Gg&COYTa1p z4767j$O0^x^HRkciKI)ACaE&KQ4>He5!YZY!(yVE>vcN(Fm(T-fQ9-XO1^G5f?N$t zlgr-H2dH%J0p5?^{i3I+ki;zUYFk;!-C-o#F1G+wmnzYp3Fh2w=jbEb1$F5o^=_E1 zUj65ij{Y-|EG+Ul^i-fOjT3O_An;@jn6{O4fBza$&0sk&Zvu@|;PMpKd{uiGj$yZg z4-YWkPFItXHg{p9ep%@gQ4)6!uTf$qr_t-dkWYtp82atp+MjQNWMVTRJ|?~%=qOew zz_B%aVJvK0^ne{?Xr6BBoJMm(pJ2zJ3O&o*VBe~2=p(oW7bnmHrtA7gF={mk!L(2V z|MvH?f~`M1B)XP0-|G*f!$?OSmqtQxX9mWmcZhi5|$F0d1n)%z+n0?*53 zFJe+`B~pZxZ>DDS-%}y-%lM@u*1HJvNSQIrnS&Y-M?2GB5O~kEF|7OV!hJ-ao|9K? zdU$7rO{bghYkVhw7>z;xSw%g^Pi$ke2g_yf6ECGAS%yO2N`dSJTCk;vG*%4^j&^V= z(184o60K8fKoPMp2o91b$S`CrHTj?3UpiLea>|qJVTqbQepXX`0|n-9-EQb)q%p3T zA1P1ez9>KO<0X!_Ks5~SaI&2IY1Cf`vi+6Ev67DNcvd*KK}z8yq7ooVF@`wiXoA;9 zxur9>;RR?q%90Pn$N4x#p;Rc4IBQdg+QMo0xbO)-mV9ESV6s!h%)Cc1lNZO-} zQpOj~m#6oo+(!&#ud0C0mw1-|(kE5BUqCe!K{=46N_e|yKv zXkTG3YE)O_OB^EOOz{IX_c$c7eQ_w(wDR-f2x+0i%&i}8%nJxYU_|-ozxaATKG06R z#j_au>0n5zxDBdut#;SL{A{s-rhz?J-TP85lG`vTqAECgu69%*Wdk)w6(elq692Y* zw3scbqu(XP%_YvZ+LW}Ok(fecN@$^e5gwK+^o}v}ibvIPA3t&eC$e&m(ZA=}&c8rI z`S_Dnc0|yE%+f!}Lpu%EAn_lPy_Z>nd&_$|cJlFs7EJzMk)IqHo?q!dRerYli7T%d zW`z#~lkFOC&Pe8;PrdW=w^wf=uwk=PeWjuPt9ft}zu%UxY@y_kupHVuulAdynF#=r zs>t2)=H7XwL-A^onyYU0lIhS1GkII}Cad0MA47VB{y=sv_JYuMk%7YC+;##h)soeA zHAzxyr-$dXlV*g|U-x0P1i5n5m>Q}=G3&}A`oth!u zU_!}yZnD|&^f#+y9}~@Jrj?))xfre1j1U&RT^OlxQq}NBIfY0(qN5lnGYSl?McJ&x z4ERIO7{@!%Q?QBFa=Wt`CRN*~2icW$b znbOBk6g%)$lgKB7FA{-5Tmlgl>X5v6n7oAow>I}b|5VmShKMoGH&BEWJ@!LgU;uJK z2Rzz8CNMV~9%DyUYF5zKd}e_;_{=?9iosdxJi1X|~wTQi{OE@KW{IqOB9{jLw`Go}b3N`7_{ zL3T`-?sbpb-O3$(rD|(YZ}%p&kyE|8?)Go=&xUTZs?s+t2>Gli=IXv8vl*}dL{bpe`- ztYS0Zf)^CtH79S2B|tJwH8%txx>p8fXwM>X{-{|B12i7I$*9o4n3hskIW>v21^VRi zjt*PIbXJMr#z|rH2Uo&7l*`WRqX;PKh^GkHX4dUFc&Rv0^n9{mcn#1wEk>B?MX!nn zf6g9_c?@`$b%%O_h71u^s&4YQW36g+*@@4;O^b-*O)2gPnbQh_pd=ibI$4yy(}q=kfU~_qA5!Qot43^SKDX;P@)tP$Z+0q~4L{%9OEC?nxm6(p7+DSxI2hk5vNk z^SGc`AqJWl2q00})TFV7^37bTH#mQ24Mj%dr_>m~DD~m2LF(U!jiW*8s<+P4ipby= zJ1D-}1C(;6I5ekg2&LaHFGk_b!sBVwn&(Ig6j9o|+sQs{y`z7>`ua-m-eoXnCG4Wi zyXdPW#Svn#04|YmR}k`;#Jf2@l&Do}7(1OE=nPT{*z->=ZE&678E~&2?zU zh#TaA<(J%{Ak9p8c5!@IN64OuM%|MtipK*Ae0-s!aOt<#^m(a&jHtS}#x|8>woD2H z9*kbr;|n*!;Zp4~I=+Bn#MbvR5G~6p1M}GVh+j8FfTdqkw_KRH#<653^0tW4)R_jr znIjqwvWW%HnA2H3Q8mhJ7U5Boc%m*bx?9VnYt%dG@{p2#>fd7`IR-U8fV6KRKhgj6 zaPeUPODe>NOJRgEwEh&4yUTCeLUulSS0&tAo(OC6!(vUll$B@2?#_C|K(JB>m<_XC zHe)~Ou#=(EN=$8IuYY{OM6Sf&Nr9rQ*bx{2Kv_lWh@Sn8AKJHN>=|g+p}nE!pYM_B zi{%co@LM;`OL-ra_EJdfu$e$Xd8qEcl>9V!%pwix?%HiSJI|(}y6Dgj9jJDz5?56s zIRP`Z{YQVClzjj9%=yP!*jW3B!V*bxa68A% z!xa^Mn~Mvh>i_T;v7b99dHJJM4Q7GG4)LFVRRNA5pU}oSLlOJawe+W2>+}683DkEy zI5MSx)!LtCx!|~O)C~`Gchd`wA1AH!dM7=julgu%{~In6`XkCg!CRF(oL_b6q3mg0 zZ;91X|H}lf%}Xp))Hvz)2~TeQnZ)GO)soWyx-A;CA|AQoHew;mD|~3%f3acubE?{h zqwcfl&v95n%JR_Uq5l&Fv*TT7we&*Bj}Ma+tNA|E#2Hi*EEe(A6Z||>Z7;LIQ$j+o zRC*8q!{K3WD8+i?Cg)Hdy24)@I@z>~uYltx!+_61G)#;xu1bwMwKo$?FU_xI1&yay zU>c>cJ#TX%^Q0H*-*nvtFB3?$)wqq=2@sb)mWV%Am)_u-F@^Q59D(J60oibMj$WN! z!SG|EMSxu52#o;-ladF`0#ZWq(-laT!9~(N6_pzp4$cCHA;tBm;_2oq z`$t35%GDwy7Bi|=N5t1^&@PlCZ4zvzkJDoy1|5@+bOixg0D@t-9oA1$g*tymHFkZb zP1~ecF(Bm^Ec966ezmyxod9+zCzK~;FvAb3;#jkpMEa}C^=$~#&?}|%mDyZZ+mo8| zB-ltItrrN`egU%m6*J$tlLAFlHpD2mQ1qw5a=yRXMZ#dS^4ksxONY(B+*hI-M6=N} zugU zo$-eN6U3_13E!=>vb^Qj zJsg&`CY}ToAy6|EWvq2J|6A+z3l=jALj%C zwjZZMw%NohP@885O&#ApRAPqh$>kU1XoW1=gA|i6Egp--@o3x2>pNdi(3%1vX!9jA z*G9M)$p3|7k;mZer^I_IywZ!=xS$v)8Hf)3rDzeI6|>;pyQr*pg<{NqvZo+XCV0Z$ zf>WD{rJ0la7(PNW(}O|nvK&7g8lU1ehV+jr_8hbC=dc~k|L|A}D1rVUXzAFK>H8)M z-lPM%YPypX_X?zhd^*4YBm?o{#MT>-?T!6v5|5;`DfMIKq%;NKhIsh1Wy@1+YngSYgu0~2{WQ=2y*w$pV zlj@84yR}rkYe9y{NrJRnMm+X!O~(k<$Xa^?!h%y>uBlOy5|Li$Iw4L`OQbX>2vG2p z1q??cP=wM<4C8f`qJ;YG%<0kHaq?(yvS@ErPlJ#0ydRlBEf2pbSGqA4A|G2c~&s2VD%-AU1)g9XS;k5l?CC+ zlKQ3l4iuTy<^B0uZdNPUne{{`;lLl*doT@ZlSp`qj2o^Kp(ZkgiBrQ1PgLV?t{P0U zEoDy)<5Zsu=*M-~boXsUN&P8rE31=oep9|hD@5s=*Hw47hG}9Tx1o@hwKZuh#VE`e zg*wC?$!4O;Dqiy~*Hbc-9GAaWjx4Uc#?+br8F52P2!N{6u7wf`{$C^(*irT{uyccC zFb%W;wV>VjDd4}jboi2bLi!NbSKWIwDT3&KY+HtqRVU|<(Z*mPj(_pxJzzaL$N!te z0x_JCU4@6~r^+Kp9VyveLpKTg6#9Nd5EyoC8jW5*0>@M}V};#^x`QZYnN?!hm-ZGO zf=+Q^mEwiL#kSMbFsqMA#5*o)ra(&&KJwXi-AxcG#`qr`7JQ136O2$(K(-%iCX$hd zlA^xx-9K%h-ZA6-u$Ww1^_lbnpk598m1NHIk*)#@lNhE`xoU|@#G2?eI?RvuG#gJZMwRw8A>Z6n3r`YW z;{ja<4ikkw;!%A-EteO|;J*H~HE503+vgDq)_6CO-?oq$u}~d2r~UYTAAnv2be77e zBJ}vMIw0co_x&B!`v^40r_)p@6pWj0aaw$i-w9)J* z5mU~m0SdceW=TQ=iUV<7+xRR7q%JYIG#anoVe4`79|4moDE}K|<(?jrD*O%iUR8Jwi+OhS2td=qO*-RL+NSW>-P z;A4G!e~P(!te`|-p8S4?43QZrAOOgfn+=`(+c=8V&uN&F_K&l|!6}Jh$yV>Tvr2NT zr?i!TYUU07yPwMa#=_0xgF?2bSWqA`V zG2>aHj9K_`>AF`#C^E-uvyh@Q>9rhliagkvO;@4dA0xCwCi_H*eiUTKv#L!ZhMma` zI0+3Q!zL2OPPO)8cqO;SDVP60hKdZC4Jc~;2W0772C;AceIhj$ArK?*&A&Mk%%MEj zZFNbgF8`AZss~PRQUX;wQ^$ubEQ?pDB_B0Cj2eLhr6})BZ5=;{`X-?8SUfTy;Gg|) z=EtaFBGwTv2>Pt5gBU9!zf3v`LQx~izhuZe%4xthpDMj?gAm3d*_mF*%QbQ)jpRoN zOYkfaqDm||xSh6h={`U{VOWh?{D1f;r;dOvl#5>qe=SOlfA~94UJ8HPFY{2Y&|K(i=@O?SYAPkB+(9ocZeuv; z#5{fCtOT@+#|khY9;0fIUBFcjCW2#g-v9Q$b7eNu*}?by!Cg_RH2I;QE#+wwY~cVQ zYC5?p3Rv;J@R86QWoxGegA;|;ykD>G@r;bH0wPi4sXgf_{5cp_@gYp~ zEe~mo)jcG%T?SvN>?k783CY5@gYtcaNf=6pb0xKZMNYJn1PpyMaS3ee{p}EjR36a< zkfgXQYI?wIX9Hdfs6k6oRAWC0xuj}1**6e>T#D>#Bi%L1KV~7IK0n?Z`E`0w`<#o4JyU!TGMWSDSN2!t<&c*Ccj;9o6jpVv{h-<+nKa%Lfzq2f|;)Y05y zc(7tv#tSzdkl9{C&6)n%`IlHFg&Mn}6+fJ&zLT8ROi>Oq6~UpTgd#pK+}S2RbcjxX zieCaJ`n98!zk_m`>?*LjFi`)m9P8CY)eCy)a+G0BfpH*I-FqkOaHL>t?Yo!lk&+6A zV%{07Vm)$Q9*e-A5S^ujH%mRB4;xo=lpcMjOlzoqnEGXH@IHcsifYjM&ru`R`uBeW zOl(OhQFQ%88LXuUV^S}#aVap19ENR4hE98Fo?%^nD{i($CSBC6DJXu7W}S9%Tl(M* z*xp0GUO~;|17s2Yut$9EqlO5Psm2%jH`cip@Ad8*tB{%HIHDF(vwj^12YfM$lSbl? z)QFSHsHZfubkg~8yz@U+*3pILUwmSsf@4>g8Dhfl{u$R$5KoNEg}_9Sd0yMnpZalz z0^wLC-mdG)cV1T}EI+5?xP&iPJT|O4m|&LJXnRH6Wac6f!(kd45GHeK5NDM*cv4tz zj`OER+HDFLQA-)pM><*lMitc0pnEG%CUM>rme&)1hL$MI8+=4nxCv4{jiJ znbPG=kVHxlk_}zD^u&g#Fes#cAQ$J@*8kGL?-68b8PT$?t z5ntuyK83hI37@b+2p7LW>h4AiLdZxOUd|U}Q0t`vFH3@m=SNuSdnRrMtN;bIJO%Ms zZShC##|ZM=GFk?zv(hEd)#5Hddo`>)BR4WNo>~- zc4P>FXwAPzE#j4RZ_22k19yC!7Y38%z%(>W;bWp%Nv!|MatMz z@~cv!D+R|&$J_7>ih0@lD(#XbHd%P?m@7{FioEbrIZW47?Ywuk9L3G)fH)CF#pzzN zL(fg^ndQq!#rWN6i0CovEU3fjj>^B(jS+&E3WMpv9odu=F(Ku>0RvU<2n;bF&>RYV zGtOZ%J{)`)s!Esu>4|1~%!n!E?4$6M!JD%nG?|ZXa9+%R_SxX@GD`TjWqa;Kf&dSY zoz}ffU}4pPoCtRi5&;GTnquB4#2bm>S1o#0H3t)opw-7Up+HG>H_X_T$vzz;2uiTO^-} z8*4$L4MagF{VP;TQSHKp!i-9TJ4_gejxlZH5vw%wd5W3{n66#)I^AAI9^&=OX0=#f z83T(jzjchPye3Zlsp*TNHV{v3%~1^}73M`Ms7ais?;7JA%MY4xXg(;3r?mxPqkM$OOmbFB3ujY8NqUVdQwUja90O8U7$5}ay@D3osMl_huXD7$40EWl4qk?0 zi6G~tq~|}&;~7EMDg^23%BPdWJv9Tadn{eWgrGI>FjV0K&8eVL8!rwL%Q#>wUnae^ zA{>)$X=15{`gJ>Fxz7VHE?HxXspP2Vbtpi*)ognwvJZ@m@#`;WTs6H=TXgT=!O7O*nQ#W`yU>2Cf(t3jqPAN0vG3zH%hab>Qo^e- zF6t9oU#hkQilTmjg#jhJe0dqKw#a5jd$+H{vNog5#0q7g2`_I{$~t}KZppd`ZlXIC znPM-lS(R+wc!Hl`vb88tAU#>b<->4nN%D6Isk9puPK3NC8S8I;rJ+^9d$4#7db%B* zuB>qHcD&FyghHu;Uv;9{vCI(J6MSv=?{>n?dfy@{aZf&H^q~2RT;JfIhiCJiZ5gW~ z7z(aJx>>E`_myb9a7xcfld7rC*S9$gXFUVBoYfTV%a~jSdFm>4r$VK+)p|v$z2JYK z{g`NQ@C|pBY_ckEEjn!@##4HPO6w5Tg)ffI7fGg?u19nkY zTc`1dRr*6sV4nio)n>*;V-a!)ieD+IhAa=0!aNI|3u^L0(oSjhddWWD?2XM7q)qf( z1Gotn#9B8c>zmt~OOdljg;b0VtW^WY4CDHv*BL<{=#D_$XJH2N*%J z#x8A+bWmsd!OT5Io>!87iLV~yTxqIbfIS*Z55^?RbY&=N#He*AsT9}7`6ZXn2Ege5t+R73>r+A5u2Z4=lY8ZaV@(&7a?t0Q zBdxYx@6w%iS)0pqjyXYR0rQ1HdsP{t>0$5v_Z`X9<5$p6oV>RJa))m})Zy!BU!I)u zO}|Zbl7b1BXZOT7>FSAW$?k7|K7ebo_y?_iJA1H$1w~w4 zTo}x(iL|xIsL+2Q1wu{*Dm*^F^`jxR3o^X$83%Qw==;1@6og9a?V1I3eHzV4zKJ$aA9e69KlCLkq4@caBlj+c70Or|# zEESef@`MRGSE==1SEO$IbDayD)H9lmeWj;1+J z1p0%8dz2S1w=i`rOAMGbxvyPMta!AY!SzLB_Nr~13vU;nIGRHOr}VD1zu1qd`-G{< znfJ^7fjy>HVgv$lksP8r@sb8m)^QC)cteo!{&je`;9LPpRp>c_*hloF&zXl^yTQUL z^@%c&kSv``ayjv$6la8vFXG80DoWtU5eH>5KASek;K>L60Z?3&336vLpG zd_$EWt0mZRf;#g$olJHgIt|a`40k~MOJqT{l?77@PyeW1wu#{Upo71u2A<^39tx++ zWuoF8g?1A>_uqRz4we&)wJWk64BvI#dbCUa)3`wrR7yneaLRqucF?_CSwA`3*enOE z5boM>_6o7}Tqaqhw#~!JPiF5x*Fjq=KHk_?hIQf%an3aJ>s_btF!XN_0hCqIt?iOn)^>S&`H&yq~A`mcnG=RF6>f?JCSpKO7!D_`A~MfkgUoj*{yP zFm=%LKPmPJ{xI+|L) z>KJQa#!%~fSP65+85s+o2MYT#*Ley~jb2mnU-tqY=wE*N_w>K!cacu~30-rOugIqD zhip;UVYvXHN^Oo?Hysuz>J1W4+3Shn{+LoQC&l2UPI0TwBd(Dbkw29` zCi-u68|CByH}NKE4)`w@V@k;-P_#xu*e?Qr4W?L!X!vuvE}kcgkK~;Af-Vnq%a_?n zmeLyWKv>*ns=Y`Mz56DD`_T;Yi0!HvOB^nV?kLwh$?I?Y75x^Rav@nM(M?%9;?_R6 z-T3Wt{*U=xVu`b-ei@5wPZgd=aoi(eL5diS9PX1ns@aZBXzTFJms5)r8}IWircXbo z?Z*H@hFfJ;ZH!_>^)c-LG}jC>;$E#Bd=5B1X95^W;DciF^{a>>5z=<{DSd@a3&iS4 zOqTex{fueQ7X`$yFeO%PO}B}8vOLRlNF5vh(H2X?nSTmrNbLMgF2&aU^4kjBzNrbLNj_u=fvZ@9RWngM?iBT;=Gv=mx4MT`e8MfYNpw=*AF(ww(ft#tx-J9`F2mEN&Q9`xm)VU?td=~-jYiU6<9u!^v;=$Bv3 zOSLia!(_2;7}7&67^0m}0^+rn3_A~=U?KApVWkFdOT@LO7s0fzbM^d0B~q=bI>}eV zlaFgs+%<}Yo+5O+p1&yyMx5tFHvpc(R9e(BEH9ha^t#s2w1wHaEzdKGwS;ZtlFlrU zn2xhSfMGPXV(h=_Z$9C{zpEb6&o`j$l*#!a5XQVg3{`^K;GZtRtKUF_(SHK>BNnyh z_1vSJY}7Sd+TQ6djJ7YV#>QszPS{-utrKoNE6;xO)9DEcC7eVy41t6-Xuzn8UE8#k zAOPgln&Gi(F2^9q)a^CD?S3ddah}^!5I5&Yckm%TYm-bqKb}L%a6ZI0Y(7~kPNWig>0xzF|9b7@t1xBy`{S* zvK>wcC1A}bF29FPh6b}*@HpdpvCKU!NF?~)San)z0K2dA&xfMYL-G3S z6YH$3vw@Y0c`Ht5;slfwn$%prqRKF- z$FPp8Fla2Ry7cfPWtcebp=Ma$F2Kq@xq|NLFaA=~W!u2%0cJr~P!Acd_Z;)J19i;f`QkwDWlM8XKe zT%klb<6`bO_|YVItc{Ij{LPfW7ptK8g2y^5%6EI}i20~iPeV-Sid=1;uzast^|jL3 zh_^NL`$=0TOuHy(Sd;scDP+u#(ypdX!&D}^nX+Ec+$yn^(q0nH_(op8#_J)~n;grc zi}hXWI}uuahsi4ZuS&q_7YeN!-oL^pO)C`f#wOQTey}i1(ZOcQi;mQ;Uq#MiUEWr`<<~q&-EwFxf}q$9cUcp*~Q^9rMc)Nk-V@YsFTWHG8KPZbQfW+*elAIcZFhe^9f*1Elz>`jk63y_^@H3RY1dQD>tzn%)Sa1vC z%GCK~(7Y40?VE-qC{>$klXOu&=d3%uzDN`9re{qIp4$0xi30n`jW`)Y{UFzvhbuIT z#Dy$sU52*uVgx-3$C)+OT?lFd6;l=UVrRe?`_hWCvW(@TF6bK8dH8PsMd)c{=^`tF zM+#=$AxB(pIrC?r>gnP!D+isxd%4o7i_FKq{s-b8ZiPl@026YIzRRue^@p^a4V>{> zzQM`z<}LhI(90+|s-aCMT2F!v%+H|8*di2p{sTUhT{aNXqjv~ws5jrB5?sGRTcQ;V z3k8*24f#M9U7gbb$%4^5S0M$1wpj0kDxuS8R=R1UAc)|*qshI^O?*-!+VI?%X-L8P zlF5Yg2q@+qVuJIoy`E~mArHpc{2JsY(U`3PsW!Y#tRx*8qKeh>gCk+T-pLFV{^_JX z2{E(Z?gP%;mI%(Y;&0dc`+msD)U;;^j7;*PP07a_rW&;Er<(Cn?k1zR(mno=vA8!a zJm?c43jACrG?Yv9!=S!Fu&g-XsIL8@#~!F}7A;b|Z9$%H%9x=DS|^o@?4E72aL$)k zenA}yTX%*V2WcB*1VpX+i8wJgQ9K*N0v#=VhxoGgY7%ab5dtMt6A0&FWx35%j>{&IhHgp6NMqJ39#j!C zmcV9iQAd4Alsu%y3Bp}itC`T`UDGd&-`m$JFI=_)u2DS{E9BbmP+=hFCNV>v+h8l- zo|c~98C!kWyZjb=7^5z!#{PZkCz(RWuj9W}LeLzF1VYYu%rRP?3@W=R3sTd!vbUl$ z2F?hhPN8p;z<#5BN)zq~QUNP*&Dp>U#}tAPqNm4Nmj3^l>4zOg2}LSg}@1T*naeCLI$Ub;qCwQ8YZ%s9~- z%pTr;!v=;F4yE5B*xn~uhG8Yx8+oUb%g~HiVf~BXW)@eqyM|!=Se=QMiV(4@Yk009+JfwrfCq5}X79}F~HyBmVv`$_|N(D8|lXXJW zsQSl%aX^HF?%OAKpo6j!aZ}Dj%wx{x7(z($)%-78CBy_3yS6 zv#j$EVSHwpjb7N0-T}c8Ezdrd6&4;43Dqr6-o_GM35f)=G!Ao1Ee+*C)#PUK2)D3` zYGbWc-OA^z^C@qsE%Pnzm8DOf^A87%0mWD{!F0AkOiA<8+$LFVQ}bW=ex*owD#mfT zk(RsjkZFbc^sE|J3xy@NDYj`+e{3-V`9n%x8>Bx=9*^ECcDD4rGb4>UvQ2w8@9gz) z$ak{70|kOusl)d|e^6SFw=bshSVneP>J~+E7$2_!RT-;R)~pJ5qsmzvOyU3v?1Xp9 zM^?ox8s24n8d>EXZI54J=j&!)cv8S^@Dw{`#|GUcMjB#nz9OZY+0q|e(p{tC26vPY zML<3ww>=tLXM2O*C8C}>xo`}8MXQu9{aBe;Vf2U25H9gEy1-5f>k|698&}p42baSe zK+H7#8cmemi(7ch69Pf*D4WAK3az7SA6yJ_$*nb}NSH78aUfxOCo?(`PggYl?;Zo< z?4yfzJQW%tEQ|)YQk2oCQ|(QMOH%MJH&r3DVS&}Ebn;TO@1fte?1Fl7CiALzzE5h* zXzkfe@WO$+cT<{r9uoXfuLrYu_EtA>ueU~vmc`0YE$RA8K;U%qYPrg ztktq4BO?>j+3Q7*;GisChO6slx0Z&a?wtqbhP&`VZ~N z5H_H6vsnDVT+j)YJYTw-dItk(DrhLKhexaNF@!^YW(^mjR&ArL+3`kpJzg*>$rv&U z7w2=YN*I;wO(H7d?$05}53Q151Qky}{~B3-zm7JcL5lMJZlR3vd5PDbhq>#rPP0VK zX(PZd!^c?$gD7eC;%-Ie;d0*3{!}O!sYTt*4k>t(=DQ>7pLfuhXCDYyRD!ooPqin6 z=2+CvW9*{5aF1N!qe_V+wRZqLS;=gVeQc{Bcy)}Vt&p0QI+LcJ9N+f9cbmJI70PKx zME@Zy`}y7)+>vC-O7}*jr>NA?LNgSUjecfMa6_+&QfuOX6aM=&S)Y0k%JwG*31hj$ zr42y0Z&M6=wO&pyx8&)Fe$d1?K8ycz9ennfGW;0*pq?OT$riK=mp$fEB@|Z)+RS z(xlZtO8Tj8@^nT8=N8j*NUwv_FFPH!wtd+1Q)KOCTbQWBb@IU_rU+cVI*W1D*3TRW zOvis_a2uM~Eq4D3Y??W#Mx(kKQ^-RNOA#vH#2Hc^)o_9v9^hX3IR|fF`I> za#O46R|i`Z3k=7(1$wD)#LY$D0nJq(>wYC`7(E@q>7It`Q6;F;py`eJgRn`62D2y7 z!?iq5uf6}*ksbY4Mx>8#es`-m@l``RVY4TyAH2B- z0~mN$$a(;2x+h(^{V?M3PyuWyc`IERm!Z(dMWhY2i4#iqZeTZtrsw;OOCi4?eeu=e z@*x&@xKa@%Z>yMis1T8;n0X)=+U5s+Kbfn1njm#!waftx5Fu{=<|fk5wY_;su%lLc zr0_zNQ!YUMvQqIWELM?=+)?<}stIon_@jEa8osDL#6Rl=!;ljHpW6Z+j)6pmY5ZUD+eiM_Dp>Ajp z6Fgyllj9$TKE9sNjaLXi_I>@0==5~a`>Xx9;F!<$(4GyiH6Nw!tNOS1h>2BZL?*C~ z>Ox^mq1KKCzor@Smz{W9gg9RomvCt}bks-ghNk@yxzKNuL;A3$S$~rmE7nS8q8MJZ z9ukUWsGdXxsjHppbQh z43*5#)6OXZk9hq`HJ+B8p2b%}0JqendW{%ZQaC3Bdk>>NG9!4ou}~c1>uxYGy~D^Z zWW7Q3o$vSgzZXbtFXMv%hB(dG?_Xmol57zd0)%^tJ+dbc{*cPb;1q_)W`y|PD^NZy zg`n~e`V98dOQ?O%;-&MVY?I{#a2(Z{2-P|nGmf0s-4`fTg=#!eXWUC&G^v?$C5|N) zNReMhlcU$&0zKys*1PzChi$_=snOWoQ3{X3y7P%ge>c}L{izzS!ptMv2=mU4F>tGs zJizm0te^e5i@mK#kO6(2jRc)^;BSM)pe3&4)$0=73owxTxZM0~#!);UW#k7YO*H$7 z{M#Cxq9l&Wx+>&9+e*eieS%9jz>1d_sywW1gl}61bXNyzoA-IXhEyEGo@bn8x=!qC z`i|ZAHj!K0^R@?W5yn4MPo$0cbNbiVT|QCSZIV2PkUee84CUk=9}2g`RgyaK)O!63 z*v3onTbs1`-A@ptk8Bx|?m9N=%Wf<1K7FxGn-<`0o6&2uf;y-Z7WUJzjpitF<9*XG zl@uC@5d8m^%{}woHb!2xXL=Gpj+pJ?=2Ft8QEq8TG)ZOir|CYPG_W$aler<{ttCHQ zXj}rAHd2x66b45Ip*-ra6tGI8?!~i(Do2bW9(UhA?UtF=729sT?4In}u&net-J4W5 z`@4N}8a8P{qh28wpNxd;u(vw1Az}7~`h1JEte<%%plm1<6?w&pT0=r+EAH+IhLESC zfi!4c`vuLHGo1NRRV&rG{x7a4x6+4W|K@no?m&Ifum7a)VXRLBCqKfJn|uZBw>Zky4j6IU8Ws&+FaK$MlZ0tqD{UQsSh1-c&TS%w)!K?hVJGw%ngT_>hf!AMf(Wp zEW_q_-69;_?^PZr3czQi;qrc#Mlu`|0`0v6xrI-ahR(pY7*EK~-f-1ZjoD)0v`V6} z7oLAO66@fu2BcjKsn#8c)kzEZtIn7#|Kx(Itn18B52NKaH$>~&z`>cb;tJW2YN0%S z{(k~40MY-(2Su>>X5gI!@oy(sgrk8QHD<*0QnT3o9)iWj#{U5T0RR630J=gPJ%P#t E06_?<=l}o! diff --git a/src/pontibus/tests/protocols/relative/test_protocol.py b/src/pontibus/tests/protocols/relative/test_protocol.py index ad9bf68..332d036 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol.py +++ b/src/pontibus/tests/protocols/relative/test_protocol.py @@ -4,6 +4,9 @@ import mdtraj as mdt import numpy as np import openfe +from openfe.protocols.openmm_rfe.hybridtop_units import ( + HybridTopologyMultiStateSimulationUnit, +) import pytest from openff.units import unit from openff.units.openmm import ensure_quantity @@ -19,12 +22,20 @@ PeriodicTorsionForce, ) from openmm import unit as omm_unit +from openmmtools.multistate import MultiStateSampler from rdkit import Chem from pontibus.protocols.relative import HybridTopProtocol, HybridTopProtocolSetupUnit from pontibus.utils.settings import InterchangeOpenMMSolvationSettings, PackmolSolvationSettings +def _get_units(protocol_units, unit_type): + """ + Helper method to extract setup units + """ + return [pu for pu in protocol_units if isinstance(pu, unit_type)] + + @pytest.fixture() def vac_settings(): settings = HybridTopProtocol.default_settings() @@ -113,11 +124,25 @@ def test_dry_run_default_vacuum( stateB=toluene_vacuum_system, mapping=benzene_to_toluene_mapping, ) - dag_unit = list(dag.protocol_units)[0] + + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] + dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0] with tmpdir.as_cwd(): - result = dag_unit.run(dry=True) - htf = result["hybrid_factory"] + setup_results = dag_setup_unit.run(dry=True) + sim_results = dag_sim_unit.run( + system=setup_results["hybrid_system"], + positions=setup_results["hybrid_positions"], + selection_indices=setup_results["selection_indices"], + dry=True, + ) + + sampler = sim_results["sampler"] + assert isinstance(sampler, MultiStateSampler) + assert not sampler.is_periodic + assert sampler._thermodynamic_states[0].barostat is None + + htf = setup_results["hybrid_factory"] assert not htf.hybrid_system.usesPeriodicBoundaryConditions() barostats = [f for f in htf.hybrid_system.getForces() if isinstance(f, MonteCarloBarostat)] assert len(barostats) == 0 @@ -259,11 +284,12 @@ def test_dry_core_element_change(vac_settings, tmpdir): mapping=mapping, ) - dag_unit = list(dag.protocol_units)[0] + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] with tmpdir.as_cwd(): - result = dag_unit.run(dry=True) - system = result["hybrid_factory"].hybrid_system + setup_results = dag_setup_unit.run(dry=True) + + system = setup_results["hybrid_system"] assert system.getNumParticles() == 12 # Average mass between nitrogen and carbon assert pytest.approx(system.getParticleMass(1)._value) == 12.0008030 @@ -308,11 +334,28 @@ def test_dry_run_ligand( stateB=toluene_system, mapping=benzene_to_toluene_mapping, ) - dag_unit = list(dag.protocol_units)[0] + + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] + dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0] with tmpdir.as_cwd(): - result = dag_unit.run(dry=True) - htf = result["hybrid_factory"] + setup_results = dag_setup_unit.run(dry=True) + + sim_results = dag_sim_unit.run( + system=setup_results["hybrid_system"], + positions=setup_results["hybrid_positions"], + selection_indices=setup_results["selection_indices"], + dry=True, + ) + + # Check the barostat in both the sampler and the htf + sampler = sim_results["sampler"] + assert isinstance(sampler, MultiStateSampler) + assert sampler.is_periodic + assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) + assert sampler._thermodynamic_states[1].pressure == 1 * omm_unit.bar + + htf = setup_results["hybrid_factory"] assert htf.hybrid_system.usesPeriodicBoundaryConditions() barostats = [f for f in htf.hybrid_system.getForces() if isinstance(f, MonteCarloBarostat)] assert len(barostats) == 1 @@ -420,11 +463,12 @@ def check_propchgs(smc, charge_array): ), mapping=mapping, ) - dag_unit = list(dag.protocol_units)[0] + + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] with tmpdir.as_cwd(): - result = dag_unit.run(dry=True) - htf = result["hybrid_factory"] + setup_results = dag_setup_unit.run(dry=True) + htf = setup_results["hybrid_factory"] hybrid_system = htf.hybrid_system # get the standard nonbonded force @@ -516,10 +560,21 @@ def test_dry_run_complex( stateB=toluene_complex_system, mapping=benzene_to_toluene_mapping, ) - dag_unit = list(dag.protocol_units)[0] + + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] + dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] + setup_results = dag_setup_unit.run(dry=True) + + sim_results = dag_sim_unit.run( + system=setup_results["hybrid_system"], + positions=setup_results["hybrid_positions"], + selection_indices=setup_results["selection_indices"], + dry=True, + ) + + sampler = sim_results["sampler"] assert isinstance(sampler, MultiStateSampler) assert sampler.is_periodic assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) @@ -528,9 +583,11 @@ def test_dry_run_complex( # Check we have the right number of atoms in the PDB pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 2629 + pdb = mdt.load_pdb("full_hybrid_system.pdb") + assert pdb.n_atoms == n_atoms # Check system forces - system = sampler._hybrid_factory.hybrid_system + system = setup_results["hybrid_system"] assert len(system.getForces()) == 10 def assert_force_num(system, forcetype, number): @@ -558,10 +615,11 @@ def assert_force_num(system, forcetype, number): assert custom_nonbond[0].getSwitchingDistance() == 0.8 * omm_unit.nanometer # Check the unique, core & env atoms - assert len(sampler._hybrid_factory._unique_old_atoms) == 1 - assert len(sampler._hybrid_factory._unique_new_atoms) == 4 - assert len(sampler._hybrid_factory._core_old_to_new_map) == 11 - assert len(sampler._hybrid_factory._env_old_to_new_map) == n_atoms - (11 + 4 + 1) + htf = setup_results["hybrid_factory"] + assert len(htf._unique_old_atoms) == 1 + assert len(htf._unique_new_atoms) == 4 + assert len(htf._core_old_to_new_map) == 11 + assert len(htf._env_old_to_new_map) == n_atoms - (11 + 4 + 1) @pytest.mark.cpuvslow @@ -589,10 +647,20 @@ def test_dry_run_complex_setnwaters( stateB=toluene_complex_system, mapping=benzene_to_toluene_mapping, ) - dag_unit = list(dag.protocol_units)[0] + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] + dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] + setup_results = dag_setup_unit.run(dry=True) + + sim_results = dag_sim_unit.run( + system=setup_results["hybrid_system"], + positions=setup_results["hybrid_positions"], + selection_indices=setup_results["selection_indices"], + dry=True, + ) + + sampler = sim_results["sampler"] assert isinstance(sampler, MultiStateSampler) assert sampler.is_periodic assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) @@ -603,7 +671,7 @@ def test_dry_run_complex_setnwaters( assert pdb.n_atoms == 2629 # Check system forces - system = sampler._hybrid_factory.hybrid_system + system = setup_results["hybrid_system"] assert len(system.getForces()) == 10 def assert_force_num(system, forcetype, number): @@ -631,10 +699,11 @@ def assert_force_num(system, forcetype, number): assert custom_nonbond[0].getSwitchingDistance() == 0.8 * omm_unit.nanometer # Check the unique, core & env atoms - assert len(sampler._hybrid_factory._unique_old_atoms) == 1 - assert len(sampler._hybrid_factory._unique_new_atoms) == 4 - assert len(sampler._hybrid_factory._core_old_to_new_map) == 11 - assert len(sampler._hybrid_factory._env_old_to_new_map) == 47340 + htf = setup_results["hybrid_factory"] + assert len(htf._unique_old_atoms) == 1 + assert len(htf._unique_new_atoms) == 4 + assert len(htf._core_old_to_new_map) == 11 + assert len(htf._env_old_to_new_map) == 47340 @pytest.mark.cpuvslow @@ -668,10 +737,20 @@ def test_dry_run_complex_cofactor( stateB=eg5_complex_systemB, mapping=eg5_ligands_mapping, ) - dag_unit = list(dag.protocol_units)[0] + dag_setup_unit = _get_units(dag.protocol_units, HybridTopProtocolSetupUnit)[0] + dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0] with tmpdir.as_cwd(): - sampler = dag_unit.run(dry=True)["debug"]["sampler"] + setup_results = dag_setup_unit.run(dry=True) + + sim_results = dag_sim_unit.run( + system=setup_results["hybrid_system"], + positions=setup_results["hybrid_positions"], + selection_indices=setup_results["selection_indices"], + dry=True, + ) + + sampler = sim_results["sampler"] assert isinstance(sampler, MultiStateSampler) assert sampler.is_periodic assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) @@ -682,7 +761,7 @@ def test_dry_run_complex_cofactor( assert pdb.n_atoms == 5527 # Check system forces - system = sampler._hybrid_factory.hybrid_system + system = setup_results["hybrid_system"] assert len(system.getForces()) == 10 def assert_force_num(system, forcetype, number): @@ -710,7 +789,8 @@ def assert_force_num(system, forcetype, number): assert custom_nonbond[0].getSwitchingDistance() == 0.8 * omm_unit.nanometer # Check the unique, core & env atoms - assert len(sampler._hybrid_factory._unique_old_atoms) == 1 - assert len(sampler._hybrid_factory._unique_new_atoms) == 1 - assert len(sampler._hybrid_factory._core_old_to_new_map) == 51 - assert len(sampler._hybrid_factory._env_old_to_new_map) == n_atoms - (51 + 1 + 1) + htf = setup_results["hybrid_factory"] + assert len(htf._unique_old_atoms) == 1 + assert len(htf._unique_new_atoms) == 1 + assert len(htf._core_old_to_new_map) == 51 + assert len(htf._env_old_to_new_map) == n_atoms - (51 + 1 + 1) diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index 785955a..8e57717 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -5,9 +5,6 @@ import gufe import pytest -pytestmark = pytest.mark.skip( - reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable" -) import numpy as np import openfe import pytest @@ -50,7 +47,7 @@ def test_get_uncertainty(self, protocolresult): est = protocolresult.get_uncertainty() assert est - assert est.m == pytest.approx(0.2, abs=0.2) + assert est.m == pytest.approx(0.4, abs=0.2) assert isinstance(est, offunit.Quantity) assert est.is_compatible_with(offunit.kilojoule_per_mole) diff --git a/src/pontibus/tests/protocols/relative/test_tokenization.py b/src/pontibus/tests/protocols/relative/test_tokenization.py index f9b3589..a880632 100644 --- a/src/pontibus/tests/protocols/relative/test_tokenization.py +++ b/src/pontibus/tests/protocols/relative/test_tokenization.py @@ -105,9 +105,6 @@ def test_repr(self, instance): assert self.repr in repr(instance) -@pytest.mark.skip( - reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable" -) class TestProtocolResult(GufeTokenizableTestsMixin): cls = HybridTopProtocolResult key = None diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 9b3d4f4..703a97d 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -5,10 +5,6 @@ import pytest -pytestmark = pytest.mark.skip( - reason="Fixtures use old key format (nc/last_checkpoint); regenerate to re-enable" -) - import gufe import numpy as np import openfe @@ -176,7 +172,7 @@ def test_get_estimate(self, protocolresult): est = protocolresult.get_estimate() assert est - assert est.m == pytest.approx(-4.83, abs=0.5) + assert est.m == pytest.approx(-5.85, abs=0.5) assert isinstance(est, offunit.Quantity) assert est.is_compatible_with(offunit.kilojoule_per_mole) diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py index 569c09c..086e89d 100644 --- a/src/pontibus/tests/protocols/solvation/test_tokenization.py +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -156,9 +156,6 @@ def instance(self, vacuum_protocol_analysis_unit): return vacuum_protocol_analysis_unit -@pytest.mark.skip( - reason="Fixture uses old key format (nc/last_checkpoint); regenerate to re-enable" -) class TestProtocolResult(ModifiedGufeTokenizableTestsMixin): cls = ASFEProtocolResult repr = "ASFEProtocolResult-" From 546123f809d686ffd07243444f8618f9d37c1b0e Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 20:22:58 +0000 Subject: [PATCH 17/32] Fix up tests --- .../tests/protocols/relative/test_results.py | 2 - .../tests/protocols/solvation/test_dry_run.py | 102 ++++++++++++------ .../tests/protocols/solvation/test_results.py | 2 - 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index 8e57717..469cac8 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -3,8 +3,6 @@ import json import gufe -import pytest - import numpy as np import openfe import pytest diff --git a/src/pontibus/tests/protocols/solvation/test_dry_run.py b/src/pontibus/tests/protocols/solvation/test_dry_run.py index 38c99c8..2777880 100644 --- a/src/pontibus/tests/protocols/solvation/test_dry_run.py +++ b/src/pontibus/tests/protocols/solvation/test_dry_run.py @@ -20,9 +20,23 @@ NonbondedForce, PeriodicTorsionForce, ) +from openmmtools.multistate import MultiStateSampler from pontibus.components import ExtendedSolventComponent -from pontibus.protocols.solvation import ASFEProtocol, ASFESolventSetupUnit, ASFEVacuumSetupUnit +from pontibus.protocols.solvation import ( + ASFEProtocol, + ASFESolventSetupUnit, + ASFESolventSimUnit, + ASFEVacuumSetupUnit, + ASFEVacuumSimUnit, +) + + +def _get_units(protocol_units, unit_type): + """ + Helper method to extract setup units + """ + return [pu for pu in protocol_units if isinstance(pu, unit_type)] @pytest.fixture() @@ -66,17 +80,25 @@ def test_dry_run_vacuum_benzene(charged_benzene, dry_settings, method, tmpdir): assert len(prot_units) == 6 - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] - - assert len(vac_unit) == 1 - assert len(sol_unit) == 1 + vac_setup_unit = _get_units(dag.protocol_units, ASFEVacuumSetupUnit)[0] + vac_sim_unit = _get_units(dag.protocol_units, ASFEVacuumSimUnit)[0] with tmpdir.as_cwd(): - result = vac_unit[0].run(dry=True) - system = result["alchem_system"] - assert not system.usesPeriodicBoundaryConditions() - + setup_results = vac_setup_unit.run(dry=True) + sim_results = vac_sim_unit.run( + system=setup_results["alchem_system"], + positions=setup_results["debug_positions"], + selection_indices=setup_results["selection_indices"], + box_vectors=setup_results["box_vectors"], + alchemical_restraints=False, + dry=True, + ) + + sampler = sim_results["sampler"] + assert isinstance(sampler, MultiStateSampler) + assert not sampler.is_periodic + + system = setup_results["alchem_system"] assert len(system.getForces()) == 12 _assert_num_forces(system, NonbondedForce, 1) @@ -140,20 +162,29 @@ def test_dry_run_solv_benzene( assert len(prot_units) == 6 - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] - - assert len(vac_unit) == 1 - assert len(sol_unit) == 1 + sol_setup_unit = _get_units(dag.protocol_units, ASFESolventSetupUnit)[0] + sol_sim_unit = _get_units(dag.protocol_units, ASFESolventSimUnit)[0] with tmpdir.as_cwd(): - result = sol_unit[0].run(dry=True) - system = result["alchem_system"] - assert system.usesPeriodicBoundaryConditions() + setup_results = sol_setup_unit.run(dry=True) + sim_results = sol_sim_unit.run( + system=setup_results["alchem_system"], + positions=setup_results["debug_positions"], + selection_indices=setup_results["selection_indices"], + box_vectors=setup_results["box_vectors"], + alchemical_restraints=False, + dry=True, + ) + + sampler = sim_results["sampler"] + assert isinstance(sampler, MultiStateSampler) + assert sampler.is_periodic + assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 12 + system = setup_results["alchem_system"] assert len(system.getForces()) == 9 _assert_num_forces(system, NonbondedForce, 1) @@ -232,13 +263,11 @@ def test_dry_run_benzene_in_benzene_user_charges(charged_benzene, dry_settings, stateB=stateB, mapping=None, ) - prot_units = list(dag.protocol_units) - - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] + sol_setup_unit = _get_units(dag.protocol_units, ASFESolventSetupUnit)[0] with tmpdir.as_cwd(): - result = sol_unit[0].run(dry=True) - system = result["alchem_system"] + setup_results = sol_setup_unit.run(dry=True) + system = setup_results["alchem_system"] # Should be benzenes all the way down assert system.getNumParticles() % 12 == 0 @@ -299,14 +328,23 @@ def test_dry_run_solv_benzene_opc(charged_benzene, dry_settings, tmpdir): stateB=stateB, mapping=None, ) - prot_units = list(dag.protocol_units) - - sol_unit = [u for u in prot_units if isinstance(u, ASFESolventSetupUnit)] + sol_setup_unit = _get_units(dag.protocol_units, ASFESolventSetupUnit)[0] + sol_sim_unit = _get_units(dag.protocol_units, ASFESolventSimUnit)[0] with tmpdir.as_cwd(): - result = sol_unit[0].run(dry=True) - system = result["alchem_system"] - assert system.usesPeriodicBoundaryConditions() + setup_results = sol_setup_unit.run(dry=True) + sim_results = sol_sim_unit.run( + system=setup_results["alchem_system"], + positions=setup_results["debug_positions"], + selection_indices=setup_results["selection_indices"], + box_vectors=setup_results["box_vectors"], + alchemical_restraints=False, + dry=True, + ) + sampler = sim_results["sampler"] + assert isinstance(sampler, MultiStateSampler) + assert sampler.is_periodic + assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat) pdb = mdt.load_pdb("hybrid_system.pdb") assert pdb.n_atoms == 12 @@ -338,13 +376,11 @@ def test_confgen_fail_AFE(benzene_modifications, dry_settings, tmpdir): stateB=stateB, mapping=None, ) - prot_units = list(dag.protocol_units) - vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumSetupUnit)] + vac_setup_unit = _get_units(dag.protocol_units, ASFEVacuumSetupUnit)[0] with tmpdir.as_cwd(): with mock.patch("rdkit.Chem.AllChem.EmbedMultipleConfs", return_value=0): - result = vac_unit[0].run(dry=True) - + result = vac_setup_unit.run(dry=True) assert result diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 703a97d..0d5db59 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -3,8 +3,6 @@ import itertools import json -import pytest - import gufe import numpy as np import openfe From a1bdf3353b62400bd9a99b8809f2d74c58cf40e5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:24:00 +0000 Subject: [PATCH 18/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pontibus/tests/protocols/relative/test_protocol.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pontibus/tests/protocols/relative/test_protocol.py b/src/pontibus/tests/protocols/relative/test_protocol.py index 332d036..13100b7 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol.py +++ b/src/pontibus/tests/protocols/relative/test_protocol.py @@ -4,10 +4,10 @@ import mdtraj as mdt import numpy as np import openfe +import pytest from openfe.protocols.openmm_rfe.hybridtop_units import ( HybridTopologyMultiStateSimulationUnit, ) -import pytest from openff.units import unit from openff.units.openmm import ensure_quantity from openmm import ( From 4f2ac4f5fe62109db73ddf469b5d1f264d1ffebb Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 20:27:05 +0000 Subject: [PATCH 19/32] Add news item --- news/ofev1.9.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 news/ofev1.9.rst diff --git a/news/ofev1.9.rst b/news/ofev1.9.rst new file mode 100644 index 0000000..9927504 --- /dev/null +++ b/news/ofev1.9.rst @@ -0,0 +1,25 @@ +**Added:** + +* + +**Changed:** + +* The ASFE and HybridTop Protocols have been updated to work + with openfe v1.9. Notably this means that the Protocols have + now been split into three ProtocolUnits (PR #190). + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* + +**Security:** + +* From 9d6b77cb66be64d35981c171eb3b0e9dda352ba7 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Sun, 8 Mar 2026 20:29:26 +0000 Subject: [PATCH 20/32] update API docs --- docs/api/protocols/asfe_protocol.rst | 8 ++++++-- docs/api/protocols/rbfe_protocol.rst | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/api/protocols/asfe_protocol.rst b/docs/api/protocols/asfe_protocol.rst index 52e2375..bae7d88 100644 --- a/docs/api/protocols/asfe_protocol.rst +++ b/docs/api/protocols/asfe_protocol.rst @@ -18,8 +18,12 @@ Protocol API Specification ASFEProtocol ASFEProtocolResult ASFESettings - ASFESolventUnit - ASFEVacuumUnit + ASFESolventSetupUnit + ASFESolventSimUnit + ASFESolventAnalysisUnit + ASFEVacuumSetupUnit + ASFEVacuumSimUnit + ASFEVacuumAnalysisUnit Protocol Settings diff --git a/docs/api/protocols/rbfe_protocol.rst b/docs/api/protocols/rbfe_protocol.rst index ddc3dc1..2871910 100644 --- a/docs/api/protocols/rbfe_protocol.rst +++ b/docs/api/protocols/rbfe_protocol.rst @@ -20,7 +20,7 @@ Protocol API Specification HybridTopProtocol HybridTopProtocolResult HybridTopProtocolSettings - HybridTopProtocolUnit + HybridTopProtocolSetupUnit Protocol Settings From 6925f0961fe7ad718743c5cdda0c33e573358bde Mon Sep 17 00:00:00 2001 From: Irfan Alibay Date: Tue, 17 Mar 2026 18:44:34 +0000 Subject: [PATCH 21/32] Add documentation to test classes for clarity Added docstring to test classes explaining protocol results generation and simulation duration. --- src/pontibus/tests/protocols/relative/test_results.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index 469cac8..d7f6339 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -12,6 +12,11 @@ class TestSolventProtocolResult: + """ + Protocol results are generated via https://github.com/OpenFreeEnergy/pontibus/blob/main/devtools/gen_serialized_results.py + Please note that the simulations run are very short, too short to converge over time. + You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. + """ @pytest.fixture() def protocolresult(self, rfe_solv_transformation_json): d = json.loads( @@ -135,6 +140,11 @@ def test_filenotfound_replica_states(self, protocolresult): class TestVacuumProtocolResult(TestSolventProtocolResult): + """ + Protocol results are generated via https://github.com/OpenFreeEnergy/pontibus/blob/main/devtools/gen_serialized_results.py + Please note that the simulations run are very short, too short to converge over time. + You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. + """ @pytest.fixture() def protocolresult(self, rfe_vacuum_transformation_json): d = json.loads( From e9e9014789fce0f89fa8b8a382fdcd4a94a7ce58 Mon Sep 17 00:00:00 2001 From: Irfan Alibay Date: Tue, 17 Mar 2026 18:46:06 +0000 Subject: [PATCH 22/32] Add docstring for protocol result tests Added docstring to clarify protocol result generation and simulation expectations. --- src/pontibus/tests/protocols/solvation/test_results.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 0d5db59..8886a55 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -13,6 +13,11 @@ class TestWaterProtocolResult: + """ + Protocol results are generated via https://github.com/OpenFreeEnergy/pontibus/blob/main/devtools/gen_serialized_results.py + Please note that the simulations run are very short, too short to converge over time. + You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. + """ @pytest.fixture() def protocolresult(self, afe_solv_water_transformation_json): d = json.loads( @@ -145,6 +150,11 @@ def test_filenotfound_replica_states(self, protocolresult): class TestOctanolProtocolResult(TestWaterProtocolResult): + """ + Protocol results are generated via https://github.com/OpenFreeEnergy/pontibus/blob/main/devtools/gen_serialized_results.py + Please note that the simulations run are very short, too short to converge over time. + You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. + """ @pytest.fixture() def protocolresult(self, afe_solv_octanol_transformation_json): d = json.loads( From 20d055b037719b4b12d022494d220163bb712a7f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:47:33 +0000 Subject: [PATCH 23/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pontibus/tests/protocols/relative/test_results.py | 2 ++ src/pontibus/tests/protocols/solvation/test_results.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/pontibus/tests/protocols/relative/test_results.py b/src/pontibus/tests/protocols/relative/test_results.py index d7f6339..8c1e653 100644 --- a/src/pontibus/tests/protocols/relative/test_results.py +++ b/src/pontibus/tests/protocols/relative/test_results.py @@ -17,6 +17,7 @@ class TestSolventProtocolResult: Please note that the simulations run are very short, too short to converge over time. You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. """ + @pytest.fixture() def protocolresult(self, rfe_solv_transformation_json): d = json.loads( @@ -145,6 +146,7 @@ class TestVacuumProtocolResult(TestSolventProtocolResult): Please note that the simulations run are very short, too short to converge over time. You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. """ + @pytest.fixture() def protocolresult(self, rfe_vacuum_transformation_json): d = json.loads( diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py index 8886a55..a261a49 100644 --- a/src/pontibus/tests/protocols/solvation/test_results.py +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -18,6 +18,7 @@ class TestWaterProtocolResult: Please note that the simulations run are very short, too short to converge over time. You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. """ + @pytest.fixture() def protocolresult(self, afe_solv_water_transformation_json): d = json.loads( @@ -155,6 +156,7 @@ class TestOctanolProtocolResult(TestWaterProtocolResult): Please note that the simulations run are very short, too short to converge over time. You should therefore expect that the numbers we check against will change when and if the ProtocolResults are regenerated. """ + @pytest.fixture() def protocolresult(self, afe_solv_octanol_transformation_json): d = json.loads( From 0d813c981ab077be0ce8b1af255232c5d792c3ef Mon Sep 17 00:00:00 2001 From: Alyssa Travitz Date: Tue, 24 Mar 2026 08:21:52 -0700 Subject: [PATCH 24/32] add openff deps from main --- devtools/environment_dev.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/devtools/environment_dev.yml b/devtools/environment_dev.yml index 5b2a8dc..3f6a40c 100644 --- a/devtools/environment_dev.yml +++ b/devtools/environment_dev.yml @@ -4,6 +4,7 @@ channels: - conda-forge dependencies: - pip + # keep these openff packages even though we pip install@main so that necessary deps get pulled in. - openff-toolkit >0.16.0 - openff-interchange >=0.4.8 - openff-nagl-base >=0.3.3 @@ -37,3 +38,8 @@ dependencies: - pip: - git+https://github.com/OpenFreeEnergy/openfe@main - git+https://github.com/OpenFreeEnergy/gufe@main + - git+https://github.com/openforcefield/openff-toolkit@main + - git+https://github.com/openforcefield/openff-interchange@main + - git+https://github.com/openforcefield/openff-nagl@main + - git+https://github.com/openforcefield/openff-units@main + - git+https://github.com/openforcefield/openff-utilities@main From 0ed059dd63ca33b2ef845e34d481d6efa702a2bb Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 17:47:41 +0000 Subject: [PATCH 25/32] Add PR also to ci-dev-main --- .github/workflows/ci-dev-main.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci-dev-main.yaml b/.github/workflows/ci-dev-main.yaml index d19142e..972e695 100644 --- a/.github/workflows/ci-dev-main.yaml +++ b/.github/workflows/ci-dev-main.yaml @@ -1,5 +1,8 @@ name: "CI - main branch of deps" on: + pull_request: + branches: + - main push: branches: - main From 59bf03a5d140a5852beac561a241ba7e4e5ac638 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 17:48:55 +0000 Subject: [PATCH 26/32] bump up checkout to v6 --- .github/workflows/ci-dev-main.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-main.yaml b/.github/workflows/ci-dev-main.yaml index 972e695..7736a3a 100644 --- a/.github/workflows/ci-dev-main.yaml +++ b/.github/workflows/ci-dev-main.yaml @@ -31,7 +31,7 @@ jobs: python-version: - "3.12" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 From bffe417f62b1151cd5812cb151cf3210e23e6ec0 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 17:54:22 +0000 Subject: [PATCH 27/32] fix various typos --- benchmarks/subsampled/gen_systems.py | 2 +- docs/api/utils/system_creation_and_solvation.rst | 2 +- docs/conf.py | 2 +- src/pontibus/tests/protocols/relative/test_protocol.py | 4 ++-- src/pontibus/tests/protocols/solvation/test_validation.py | 2 +- src/pontibus/tests/utils/test_system_creation.py | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/benchmarks/subsampled/gen_systems.py b/benchmarks/subsampled/gen_systems.py index e4dd231..683013b 100644 --- a/benchmarks/subsampled/gen_systems.py +++ b/benchmarks/subsampled/gen_systems.py @@ -29,7 +29,7 @@ def add_chemical_systems( Running dictionary of solvents to draw & store prepared solvent molecules from/to. systems: list[ChemicalSystem] - Runing list of ChemicalSystems we are appending to. + Running list of ChemicalSystems we are appending to. """ for i, rdmol in enumerate(Chem.SDMolSupplier(sdffile, removeHs=False)): offmol = Molecule.from_rdkit(rdmol) diff --git a/docs/api/utils/system_creation_and_solvation.rst b/docs/api/utils/system_creation_and_solvation.rst index 91c92d4..2540880 100644 --- a/docs/api/utils/system_creation_and_solvation.rst +++ b/docs/api/utils/system_creation_and_solvation.rst @@ -27,7 +27,7 @@ System solvation .. module:: pontibus.utils.system_solvation -Methods used to solvate systems with either packmol or openmm through OpenFF Intercahnge. +Methods used to solvate systems with either packmol or openmm through OpenFF Interchange. .. autosummary:: :nosignatures: diff --git a/docs/conf.py b/docs/conf.py index 41c2c7d..d07ded7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,7 +11,7 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -# Incase the project was not installed +# In case the project was not installed import os import sys diff --git a/src/pontibus/tests/protocols/relative/test_protocol.py b/src/pontibus/tests/protocols/relative/test_protocol.py index 70a139b..1177042 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol.py +++ b/src/pontibus/tests/protocols/relative/test_protocol.py @@ -434,7 +434,7 @@ def check_propchgs(smc, charge_array): prop_chgs = np.array(prop_chgs.split(), dtype=float) np.testing.assert_allclose(prop_chgs, charge_array.m) - # Create new smc with overriden charges + # Create new smc with overridden charges benzene_offmol = benzene_modifications["benzene"].to_openff() toluene_offmol = benzene_modifications["toluene"].to_openff() benzene_rand_chg = assign_fictitious_charges(benzene_offmol) @@ -444,7 +444,7 @@ def check_propchgs(smc, charge_array): benzene_smc = openfe.SmallMoleculeComponent.from_openff(benzene_offmol) toluene_smc = openfe.SmallMoleculeComponent.from_openff(toluene_offmol) - # Check that the new smcs have the new overriden charges + # Check that the new smcs have the new overridden charges check_propchgs(benzene_smc, benzene_rand_chg) check_propchgs(toluene_smc, toluene_rand_chg) diff --git a/src/pontibus/tests/protocols/solvation/test_validation.py b/src/pontibus/tests/protocols/solvation/test_validation.py index f3249b7..2de697f 100644 --- a/src/pontibus/tests/protocols/solvation/test_validation.py +++ b/src/pontibus/tests/protocols/solvation/test_validation.py @@ -235,7 +235,7 @@ def test_validate_alchem_nonsmc(benzene_modifications): } ) - errmsg = "Only dissapearing SmallMoleculeComponents" + errmsg = "Only disappearing SmallMoleculeComponents" with pytest.raises(ValueError, match=errmsg): ASFEProtocol._validate_endstates(stateA, stateB) diff --git a/src/pontibus/tests/utils/test_system_creation.py b/src/pontibus/tests/utils/test_system_creation.py index e125044..52c6794 100644 --- a/src/pontibus/tests/utils/test_system_creation.py +++ b/src/pontibus/tests/utils/test_system_creation.py @@ -106,7 +106,7 @@ def water_off_am1bcc(): def test_convert_proteincomp(T4_protein_component): - # Get an OpenFF Toplogy by going through rdkit + # Get an OpenFF Topology by going through rdkit rdmols = Chem.GetMolFrags(T4_protein_component.to_rdkit(), asMols=True, sanitizeFrags=False) ofe_mol = Molecule.from_rdkit( rdmols[0], allow_undefined_stereo=True, hydrogens_are_explicit=True @@ -2162,7 +2162,7 @@ def test_box_setting_dodecahedron( """ -5. Unamed solvent +5. Unnamed solvent - Check we get warned about renaming 6. Named solvent with inconsistent name 7. Duplicate named smcs From 201a02ea90acbff0791727103d741c358cdd440d Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 17:58:39 +0000 Subject: [PATCH 28/32] Fix dev CI --- .github/workflows/ci-dev-main.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-main.yaml b/.github/workflows/ci-dev-main.yaml index 7736a3a..c13a9b0 100644 --- a/.github/workflows/ci-dev-main.yaml +++ b/.github/workflows/ci-dev-main.yaml @@ -38,7 +38,7 @@ jobs: - name: "Setup Micromamba" uses: mamba-org/setup-micromamba@v2 with: - environment-file: devtools/latest_environment.yml + environment-file: devtools/environment_dev.yml environment-name: pontibus-dev create-args: >- python=${{ matrix.python-version }} From ec9978be4fa5a5e4850e3cea6923d390e1b04c17 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 18:01:53 +0000 Subject: [PATCH 29/32] bump up openfe to 1.9+ in pixi.toml --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 418ae39..2611346 100644 --- a/pixi.toml +++ b/pixi.toml @@ -5,7 +5,7 @@ platforms = ["linux-64", "osx-arm64"] [feature.docs.dependencies] autodoc-pydantic = ">=2.0" -openfe = "1.8.*" +openfe = ">=1.9" packaging = "*" plugcli = "*" python = "3.11.*" From d31253ecba63c3ec850e16dabd97cc1baa936853 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 19:13:00 +0000 Subject: [PATCH 30/32] change the message for it to work with 1.9 and 1.10 --- src/pontibus/tests/protocols/solvation/test_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pontibus/tests/protocols/solvation/test_validation.py b/src/pontibus/tests/protocols/solvation/test_validation.py index 2de697f..c9e9b2b 100644 --- a/src/pontibus/tests/protocols/solvation/test_validation.py +++ b/src/pontibus/tests/protocols/solvation/test_validation.py @@ -235,7 +235,7 @@ def test_validate_alchem_nonsmc(benzene_modifications): } ) - errmsg = "Only disappearing SmallMoleculeComponents" + errmsg = "SmallMoleculeComponents are supported by this protocol" with pytest.raises(ValueError, match=errmsg): ASFEProtocol._validate_endstates(stateA, stateB) From 89a695a13e6149e52b082f70c33a152812762dc2 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 20:02:51 +0000 Subject: [PATCH 31/32] fix gpu test --- .../protocols/relative/test_protocol_slow.py | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/pontibus/tests/protocols/relative/test_protocol_slow.py b/src/pontibus/tests/protocols/relative/test_protocol_slow.py index 16954a9..4e30d10 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol_slow.py +++ b/src/pontibus/tests/protocols/relative/test_protocol_slow.py @@ -11,7 +11,7 @@ @pytest.mark.gpu -def test_vacuum(benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene_mapping, tmpdir): +def test_vacuum(benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene_mapping, tmp_path): """ Run a short MD simulation and make sure things didn't fail. """ @@ -30,23 +30,32 @@ def test_vacuum(benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene mapping=benzene_to_toluene_mapping, ) - cwd = pathlib.Path(str(tmpdir)) - r = execute_DAG(dag, shared_basedir=cwd, scratch_basedir=cwd, keep_shared=True) + r = execute_DAG(dag, shared_basedir=tmp_path, scratch_basedir=tmp_path, keep_shared=True) assert r.ok() + + for pur in r.protocol_unit_results: + if "Simulation" in pur.name: + sim_shared = tmp_path / f"shared_{pur.source_key}_attempt_0" + assert sim_shared.exists() + assert pathlib.Path(sim_shared).is_dir() + for pur in r.protocol_unit_results: - unit_shared = tmpdir / f"shared_{pur.source_key}_attempt_0" - assert unit_shared.exists() - assert pathlib.Path(unit_shared).is_dir() + if "Analysis" not in pur.name: + continue + + analysis_shared = tmp_path / f"shared_{pur.source_key}_attempt_0" + assert analysis_shared.exists() + assert pathlib.Path(analysis_shared).is_dir() # Check the checkpoint file exists - checkpoint = pur.outputs["last_checkpoint"] - assert checkpoint == "checkpoint.chk" - assert (unit_shared / checkpoint).exists() + checkpoint = pur.outputs["checkpoint"] + assert checkpoint == sim_shared / "checkpoint.chk" + assert checkpoint.exists() # Check the nc simulation file exists - nc = pur.outputs["nc"] - assert nc == unit_shared / "simulation.nc" + nc = pur.outputs["trajectory"] + assert nc == sim_shared / "simulation.nc" assert nc.exists() # Check structural analysis contents From b3b3bd6fb75a89b6da753957df701755669ea744 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 24 Mar 2026 21:34:38 +0000 Subject: [PATCH 32/32] Add fix for slow tests --- src/pontibus/tests/protocols/relative/test_protocol.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pontibus/tests/protocols/relative/test_protocol.py b/src/pontibus/tests/protocols/relative/test_protocol.py index 1177042..638fd8b 100644 --- a/src/pontibus/tests/protocols/relative/test_protocol.py +++ b/src/pontibus/tests/protocols/relative/test_protocol.py @@ -768,7 +768,7 @@ def test_dry_run_complex_cofactor( # Check we have the right number of atoms in the PDB pdb = mdt.load_pdb("hybrid_system.pdb") - assert pdb.n_atoms == 5527 + assert pdb.n_atoms == 5513 # Check system forces system = setup_results["hybrid_system"]