From 0c03dbffb17049c7fab6a05c96dfbf1bdc459fbf Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Thu, 22 Feb 2024 15:26:02 +0100 Subject: [PATCH 01/11] adding ahfe tutorial --- ahfe_tutorial/python_tutorial.ipynb | 731 ++++++++++++++++++++++++++++ 1 file changed, 731 insertions(+) create mode 100644 ahfe_tutorial/python_tutorial.ipynb diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb new file mode 100644 index 0000000..75aab69 --- /dev/null +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -0,0 +1,731 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "35354229", + "metadata": {}, + "source": [ + "# Setting up and running absolute hydration free energy calculations\n", + "\n", + "This tutorial gives a step-by-step process to set up absolute hydration free energy (AHFE) simulation campaign using OpenFE. In this tutorial we are performing an absolute hydration free energy calculation of benzene." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fc97de03", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import openfe" + ] + }, + { + "cell_type": "markdown", + "id": "2fea29c3", + "metadata": {}, + "source": [ + "## 1. Loading the ligand\n", + "\n", + "First we must load the chemical models between which we wish to calculate free energies.\n", + "In this example these are initially stored in a molfile (`.sdf`) containing multiple molecules.\n", + "This can be loaded using the `SDMolSupplier` class from rdkit and passed to openfe." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "41cf8be7", + "metadata": {}, + "outputs": [], + "source": [ + "from rdkit import Chem\n", + "supp = Chem.SDMolSupplier(\"../cookbook/assets/benzene.sdf\", removeHs=False)\n", + "ligands = [openfe.SmallMoleculeComponent.from_rdkit(mol) for mol in supp]" + ] + }, + { + "cell_type": "markdown", + "id": "d0cb1329", + "metadata": {}, + "source": [ + "## 2. Creating `ChemicalSystem`s\n", + "\n", + "OpenFE describes complex molecular systems as being composed of `Component`s. For example, we have `SmallMoleculeComponent` for each small molecule in the `LigandNetwork`. We'll create a `SolventComponent` to describe the solvent.\n", + "\n", + "The `Component`s are joined in a `ChemicalSystem`, which describes all the particles in the simulation.\n", + "\n", + "Note that for AHFE simulations, we are not separately defining the vacuum state, but the protocol creates that based on the solvent states." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9d2fbc22", + "metadata": {}, + "outputs": [], + "source": [ + "# defaults are water with NaCl at 0.15 M\n", + "solvent = openfe.SolventComponent()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "710285ca", + "metadata": {}, + "outputs": [], + "source": [ + "# In state A the ligand is fully interacting in the solvent\n", + "systemA = openfe.ChemicalSystem({\n", + " 'ligand': ligands[0],\n", + " 'solvent': solvent,\n", + "})\n", + "# In state B the ligand is fully decoupled in the solvent, therefore we are only defining the solvent here\n", + "systemB = openfe.ChemicalSystem({'solvent': solvent})" + ] + }, + { + "cell_type": "markdown", + "id": "33aa384c-54f4-4b42-8b6d-38b07b4e3c47", + "metadata": {}, + "source": [ + "## 3. Defining the AHFE simulation settings and creating a `Protocol`" + ] + }, + { + "cell_type": "markdown", + "id": "a0993eec-50f4-49d2-83ba-e3c166b9377e", + "metadata": {}, + "source": [ + "There are various different parameters which can be set to determine how the AHFE simulation will take place. \n", + "\n", + "The easiest way to customize protocol settings is to start with the default settings, and modify them. Many settings carry units with them." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c31c712b-4844-477b-8aa4-ded6f0c8ca5f", + "metadata": {}, + "outputs": [], + "source": [ + "from openfe.protocols.openmm_afe import AbsoluteSolvationProtocol" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fb839094", + "metadata": {}, + "outputs": [], + "source": [ + "settings = AbsoluteSolvationProtocol.default_settings()" + ] + }, + { + "cell_type": "markdown", + "id": "f2d77ba4-f6d7-465f-8933-1cf35748d71f", + "metadata": {}, + "source": [ + "Displaying the default values:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "82c3e1ea-2bf6-47ec-bf1d-fe06adb6ea10", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "298.15 kelvin" + ], + "text/latex": [ + "$298.15\\ \\mathrm{kelvin}$" + ], + "text/plain": [ + "298.15 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "settings.thermo_settings.temperature # display default value" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "05d407e9-8ddb-4c53-be73-88ec65f4a93e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "settings.lambda_settings.lambda_elec # display default value" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cbaa744c-9b3e-45ca-b6e1-227e80446623", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "1.0 nanosecond" + ], + "text/latex": [ + "$1.0\\ \\mathrm{nanosecond}$" + ], + "text/plain": [ + "1.0 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "settings.solvent_simulation_settings.equilibration_length" + ] + }, + { + "cell_type": "markdown", + "id": "9f81f879-9eea-4af0-b772-e28832912487", + "metadata": {}, + "source": [ + "Changing default values:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e83630f0", + "metadata": {}, + "outputs": [], + "source": [ + "from openff.units import unit\n", + "\n", + "# change the values\n", + "settings.thermo_settings.temperature = 300.0 * unit.kelvin\n", + "settings.lambda_settings.lambda_elec = [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "settings.solvent_simulation_settings.equilibration_length = 500 * unit.picosecond" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "55067780-d228-4661-8c1e-5cb0217fd2dc", + "metadata": {}, + "outputs": [], + "source": [ + "settings.solvent_simulation_settings.equilibration_length = 1 * unit.picosecond\n", + "settings.solvent_simulation_settings.production_length = 1 * unit.picosecond\n", + "settings.vacuum_simulation_settings.equilibration_length = 1 * unit.picosecond\n", + "settings.vacuum_simulation_settings.production_length = 1 * unit.picosecond\n", + "settings.solvent_engine_settings.compute_platform = 'cpu'" + ] + }, + { + "cell_type": "markdown", + "id": "af14d630-e933-4054-9444-e96af7dfcc80", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Here a view of all the settings that the user can modify as shown in the examples above:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "137d3f96-00fc-4400-bf5d-b8ed355dbbec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'alchemical_settings': {},\n", + " 'integrator_settings': {'barostat_frequency': ,\n", + " 'constraint_tolerance': 1e-06,\n", + " 'langevin_collision_rate': ,\n", + " 'n_restart_attempts': 20,\n", + " 'reassign_velocities': False,\n", + " 'remove_com': False,\n", + " 'timestep': },\n", + " 'lambda_settings': {'lambda_elec': [0.0,\n", + " 0.26,\n", + " 0.5,\n", + " 0.75,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0],\n", + " 'lambda_restraints': [0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0],\n", + " 'lambda_vdw': [0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.12,\n", + " 0.24,\n", + " 0.36,\n", + " 0.48,\n", + " 0.6,\n", + " 0.7,\n", + " 0.77,\n", + " 0.85,\n", + " 1.0]},\n", + " 'partial_charge_settings': {'nagl_model': None,\n", + " 'number_of_conformers': None,\n", + " 'off_toolkit_backend': 'ambertools',\n", + " 'partial_charge_method': 'am1bcc'},\n", + " 'protocol_repeats': 3,\n", + " 'solvation_settings': {'solvent_model': 'tip3p',\n", + " 'solvent_padding': },\n", + " 'solvent_engine_settings': {'compute_platform': 'cpu'},\n", + " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'checkpoint.chk',\n", + " 'equil_npt_structure': 'equil_npt_structure.pdb',\n", + " 'equil_nvt_structure': 'equil_nvt_structure.pdb',\n", + " 'forcefield_cache': 'db.json',\n", + " 'log_output': 'equil_simulation.log',\n", + " 'minimized_structure': 'minimized.pdb',\n", + " 'output_indices': 'not water',\n", + " 'preminimized_structure': 'system.pdb',\n", + " 'production_trajectory_filename': 'production_equil.xtc',\n", + " 'trajectory_write_interval': },\n", + " 'solvent_equil_simulation_settings': {'equilibration_length': ,\n", + " 'equilibration_length_nvt': ,\n", + " 'minimization_steps': 5000,\n", + " 'production_length': },\n", + " 'solvent_forcefield_settings': {'constraints': 'hbonds',\n", + " 'forcefields': ['amber/ff14SB.xml',\n", + " 'amber/tip3p_standard.xml',\n", + " 'amber/tip3p_HFE_multivalent.xml',\n", + " 'amber/phosaa10.xml'],\n", + " 'hydrogen_mass': 3.0,\n", + " 'nonbonded_cutoff': ,\n", + " 'nonbonded_method': 'PME',\n", + " 'rigid_water': True,\n", + " 'small_molecule_forcefield': 'openff-2.0.0'},\n", + " 'solvent_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'solvent_checkpoint.nc',\n", + " 'forcefield_cache': 'db.json',\n", + " 'output_filename': 'solvent.nc',\n", + " 'output_indices': 'not water',\n", + " 'output_structure': 'hybrid_system.pdb'},\n", + " 'solvent_simulation_settings': {'early_termination_target_error': ,\n", + " 'equilibration_length': ,\n", + " 'minimization_steps': 5000,\n", + " 'n_replicas': 14,\n", + " 'production_length': ,\n", + " 'real_time_analysis_interval': ,\n", + " 'real_time_analysis_minimum_time': ,\n", + " 'sampler_method': 'repex',\n", + " 'sams_flatness_criteria': 'logZ-flatness',\n", + " 'sams_gamma0': 1.0,\n", + " 'time_per_iteration': },\n", + " 'thermo_settings': {'ph': None,\n", + " 'pressure': ,\n", + " 'redox_potential': None,\n", + " 'temperature': },\n", + " 'vacuum_engine_settings': {'compute_platform': None},\n", + " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'checkpoint.chk',\n", + " 'equil_npt_structure': 'equil_structure.pdb',\n", + " 'equil_nvt_structure': None,\n", + " 'forcefield_cache': 'db.json',\n", + " 'log_output': 'equil_simulation.log',\n", + " 'minimized_structure': 'minimized.pdb',\n", + " 'output_indices': 'not water',\n", + " 'preminimized_structure': 'system.pdb',\n", + " 'production_trajectory_filename': 'production_equil.xtc',\n", + " 'trajectory_write_interval': },\n", + " 'vacuum_equil_simulation_settings': {'equilibration_length': ,\n", + " 'equilibration_length_nvt': None,\n", + " 'minimization_steps': 5000,\n", + " 'production_length': },\n", + " 'vacuum_forcefield_settings': {'constraints': 'hbonds',\n", + " 'forcefields': ['amber/ff14SB.xml',\n", + " 'amber/tip3p_standard.xml',\n", + " 'amber/tip3p_HFE_multivalent.xml',\n", + " 'amber/phosaa10.xml'],\n", + " 'hydrogen_mass': 3.0,\n", + " 'nonbonded_cutoff': ,\n", + " 'nonbonded_method': 'nocutoff',\n", + " 'rigid_water': True,\n", + " 'small_molecule_forcefield': 'openff-2.0.0'},\n", + " 'vacuum_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'vacuum_checkpoint.nc',\n", + " 'forcefield_cache': 'db.json',\n", + " 'output_filename': 'vacuum.nc',\n", + " 'output_indices': 'not water',\n", + " 'output_structure': 'hybrid_system.pdb'},\n", + " 'vacuum_simulation_settings': {'early_termination_target_error': ,\n", + " 'equilibration_length': ,\n", + " 'minimization_steps': 5000,\n", + " 'n_replicas': 14,\n", + " 'production_length': ,\n", + " 'real_time_analysis_interval': ,\n", + " 'real_time_analysis_minimum_time': ,\n", + " 'sampler_method': 'repex',\n", + " 'sams_flatness_criteria': 'logZ-flatness',\n", + " 'sams_gamma0': 1.0,\n", + " 'time_per_iteration': }}\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "pprint(settings.dict())" + ] + }, + { + "cell_type": "markdown", + "id": "8c32f1b9-b09e-41ac-b66d-3fbc8ee433ec", + "metadata": {}, + "source": [ + "### Creating the `Protocol`\n", + "With the Settings inspected and adjusted, we can provide these to the `Protocol`. This `Protocol` defines the procedure to estimate a free energy difference between two chemical systems, with the details of the two end states yet to be defined." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "23f6322b-0336-4aa9-b9d0-ebe533dc5753", + "metadata": {}, + "outputs": [], + "source": [ + "protocol = AbsoluteSolvationProtocol(settings=settings)" + ] + }, + { + "cell_type": "markdown", + "id": "318ff872", + "metadata": {}, + "source": [ + "## 4. Creating the `ProtocolDAG`\n", + "\n", + "Once we have the two `ChemicalSystem`s, and the `Protocol`, we can create the `ProtocolDAG`.\n", + "\n", + "This creates a directed-acyclic-graph (DAG) of computational tasks necessary for creating an estimate of the free energy difference between the two chemical systems." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "44ba94ca", + "metadata": {}, + "outputs": [], + "source": [ + "dag = protocol.create(stateA=systemA, stateB=systemB, mapping=None)" + ] + }, + { + "cell_type": "markdown", + "id": "4283dfe4", + "metadata": {}, + "source": [ + "To summarize, this `ProtocolDAG` contains:\n", + "- chemical models of both sides of the alchemical transformation in `systemA` and `systemB`\n", + "- a description of the exact computational algorithm to use to perform the estimate in `protocol`\n", + "- the `mapping` is set to `None` since no atoms are mapped in the AHFE protocol" + ] + }, + { + "cell_type": "markdown", + "id": "1e29d1c8", + "metadata": {}, + "source": [ + "## 5. Executing the simulation\n", + "\n", + "The DAG contains many invdividual jobs. We can execute them sequentially in this notebook using the `gufe.protocols.execute` function.\n", + "\n", + "In a more realistic (expansive) situation we would farm off the individual jobs to a HPC cluster or cloud compute service so they could be executed in parallel.\n", + "\n", + "Note: we use the `shared_basedir` and `scratch_basedir` argument of `execute_DAG` in order to set the directory where the simulation files are written to" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6dbedb47-46b9-4c22-ad74-a580174a359c", + "metadata": {}, + "outputs": [], + "source": [ + "from gufe.protocols import execute_DAG\n", + "import pathlib" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "be690ef1-3243-4114-b56f-5babbb660af6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + " warnings.warn(wmsg)\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", + " mu /= float(N)\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", + " sigma2 /= float(N)\n", + "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + " warnings.warn(wmsg)\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", + " mu /= float(N)\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", + " sigma2 /= float(N)\n", + "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + " warnings.warn(wmsg)\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", + " mu /= float(N)\n", + "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", + " sigma2 /= float(N)\n", + "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + " warnings.warn(wmsg)\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/56/3yvgkyg96rvchgjgzfbf16gc0000gn/T/ipykernel_21531/2335985105.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpathlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'./ahfe'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# Execute the DAG\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mdag_results\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexecute_DAG\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdag\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscratch_basedir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshared_basedir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_retries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/gufe/protocols/protocoldag.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(protocoldag, shared_basedir, scratch_basedir, keep_shared, keep_scratch, raise_error, n_retries)\u001b[0m\n\u001b[1;32m 408\u001b[0m context = Context(shared=shared,\n\u001b[1;32m 409\u001b[0m scratch=scratch)\n\u001b[1;32m 410\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 411\u001b[0m \u001b[0;31m# execute\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 412\u001b[0;31m result = unit.execute(\n\u001b[0m\u001b[1;32m 413\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 414\u001b[0m \u001b[0mraise_error\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mraise_error\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 415\u001b[0m **inputs)\n", + "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/gufe/protocols/protocolunit.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, context, raise_error, **inputs)\u001b[0m\n\u001b[1;32m 324\u001b[0m )\n\u001b[1;32m 325\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 327\u001b[0m \u001b[0;31m# if we \"fail\" due to a KeyboardInterrupt, we always want to raise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 328\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 329\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 330\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mraise_error\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/equil_solvation_afe_method.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, ctx, **kwargs)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mgufe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mContext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m ) -> dict[str, Any]:\n\u001b[1;32m 905\u001b[0m \u001b[0mlog_system_probe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlogging\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mINFO\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpaths\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscratch\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 906\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 907\u001b[0;31m outputs = self.run(scratch_basepath=ctx.scratch,\n\u001b[0m\u001b[1;32m 908\u001b[0m shared_basepath=ctx.shared)\n\u001b[1;32m 909\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 910\u001b[0m return {\n", + "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, dry, verbose, scratch_basepath, shared_basepath)\u001b[0m\n\u001b[1;32m 993\u001b[0m \u001b[0msystem_modeller\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem_generator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msmc_comps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 994\u001b[0m )\n\u001b[1;32m 995\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 996\u001b[0m \u001b[0;31m# 6. Pre-equilbrate System (Test + Avoid NaNs + get stable system)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 997\u001b[0;31m positions = self._pre_equilibrate(\n\u001b[0m\u001b[1;32m 998\u001b[0m \u001b[0momm_system\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0momm_topology\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 999\u001b[0m )\n\u001b[1;32m 1000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, system, topology, positions, settings, dry)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;31m# Use the _run_MD method from the PlainMDProtocolUnit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;31m# Should in-place modify the simulation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m PlainMDProtocolUnit._run_MD(\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0msimulation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msimulation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpositions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m \u001b[0msimulation_settings\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'equil_simulation_settings'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/openfe/openfe/protocols/openmm_md/plain_md_methods.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(simulation, positions, simulation_settings, output_settings, temperature, barostat_frequency, timestep, equil_steps_nvt, equil_steps_npt, prod_steps, verbose, shared_basepath)\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0mdensity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0mspeed\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 435\u001b[0m ))\n\u001b[1;32m 436\u001b[0m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 437\u001b[0;31m \u001b[0msimulation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprod_steps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 438\u001b[0m \u001b[0mt1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Completed simulation in {t1 - t0} seconds\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/app/simulation.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;34m\"\"\"Advance the simulation by integrating a specified number of time steps.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_simulate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mendStep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrentStep\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/app/simulation.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, endStep, endTime)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0mnextSteps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnextReport\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0manyReport\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnextSteps\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintegrator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Only take 10 steps at a time, to give Python more chances to respond to a control-c.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 207\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 208\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mendTime\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mendTime\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/openmm.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 11754\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11755\u001b[0m \u001b[0msteps\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11756\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0mof\u001b[0m \u001b[0mtime\u001b[0m \u001b[0msteps\u001b[0m \u001b[0mto\u001b[0m \u001b[0mtake\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11757\u001b[0m \"\"\"\n\u001b[0;32m> 11758\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_openmm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mLangevinMiddleIntegrator_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# Finally we can run the simulations\n", + "path = pathlib.Path('./ahfe')\n", + "path.mkdir()\n", + "\n", + "# Execute the DAG\n", + "dag_results = execute_DAG(dag, scratch_basedir=path, shared_basedir=path, n_retries=3)" + ] + }, + { + "cell_type": "markdown", + "id": "d91f78b8-58dc-4780-880f-5a643cbb18c9", + "metadata": {}, + "source": [ + "## 6. Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "27f1f7d0-a294-41a7-8b97-70878747a22d", + "metadata": {}, + "source": [ + "Finally now that we've run our simulations, let's go ahead and gather the free\n", + "energies for both phases.\n", + "\n", + "This can be achieved by passing the results of executing the DAGs calling the `gather()` method.\n", + "This takes a **list** of completed DAG results, catering for when simulations have been extended." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d0f6b8fb-dde2-442a-b641-3160a70e2f84", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'dag_results' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[30], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Get the complex and solvent results\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m protocol_results \u001b[38;5;241m=\u001b[39m protocol\u001b[38;5;241m.\u001b[39mgather([\u001b[43mdag_results\u001b[49m])\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAHFE dG: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprotocol_results\u001b[38;5;241m.\u001b[39mget_estimate()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, err \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprotocol_results\u001b[38;5;241m.\u001b[39mget_uncertainty()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'dag_results' is not defined" + ] + } + ], + "source": [ + "# Get the complex and solvent results\n", + "protocol_results = protocol.gather([dag_results])\n", + "\n", + "print(f\"AHFE dG: {protocol_results.get_estimate()}, err {protocol_results.get_uncertainty()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "847b5663-2e6c-4cb2-aa9d-39d132fcff3d", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + " outdict = {\n", + " \"estimate\": protres.get_estimate(),\n", + " \"uncertainty\": protres.get_uncertainty(),\n", + " \"protocol_result\": protres.to_dict(),\n", + " \"unit_results\": {\n", + " unit.key: unit.to_keyed_dict()\n", + " for unit in dagres.protocol_unit_results\n", + " }\n", + " }\n", + "\n", + " with gzip.open(f\"{simname}_json_results.gz\", 'wt') as zipfile:\n", + " json.dump(outdict, zipfile, cls=JSON_HANDLER.encoder)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2f1d541a93b7eef2f7fba8a400c848ee5efcfdeb Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Thu, 22 Feb 2024 16:28:10 +0100 Subject: [PATCH 02/11] add results --- ahfe_tutorial/python_tutorial.ipynb | 246 +++++++++++++++++----------- 1 file changed, 151 insertions(+), 95 deletions(-) diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb index 75aab69..a0dfdc7 100644 --- a/ahfe_tutorial/python_tutorial.ipynb +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -15,7 +15,21 @@ "execution_count": 1, "id": "fc97de03", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "LICENSE: Could not open license file \"oe_license.txt\" in local directory\n", + "LICENSE: N.B. OE_LICENSE environment variable is not set\n", + "LICENSE: N.B. OE_DIR environment variable is not set\n", + "LICENSE: No product keys!\n", + "LICENSE: No product keys!\n", + "LICENSE: No product keys!\n", + "LICENSE: No product keys!\n" + ] + } + ], "source": [ "%matplotlib inline\n", "import openfe" @@ -217,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "e83630f0", "metadata": {}, "outputs": [], @@ -232,16 +246,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "id": "55067780-d228-4661-8c1e-5cb0217fd2dc", "metadata": {}, "outputs": [], "source": [ - "settings.solvent_simulation_settings.equilibration_length = 1 * unit.picosecond\n", - "settings.solvent_simulation_settings.production_length = 1 * unit.picosecond\n", - "settings.vacuum_simulation_settings.equilibration_length = 1 * unit.picosecond\n", - "settings.vacuum_simulation_settings.production_length = 1 * unit.picosecond\n", - "settings.solvent_engine_settings.compute_platform = 'cpu'" + "settings.solvent_simulation_settings.equilibration_length = 10 * unit.picosecond\n", + "settings.solvent_simulation_settings.production_length = 500 * unit.picosecond\n", + "settings.vacuum_simulation_settings.equilibration_length = 10 * unit.picosecond\n", + "settings.vacuum_simulation_settings.production_length = 500 * unit.picosecond\n", + "settings.solvent_engine_settings.compute_platform = 'CUDA'" ] }, { @@ -260,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "id": "137d3f96-00fc-4400-bf5d-b8ed355dbbec", "metadata": {}, "outputs": [ @@ -325,7 +339,7 @@ " 'protocol_repeats': 3,\n", " 'solvation_settings': {'solvent_model': 'tip3p',\n", " 'solvent_padding': },\n", - " 'solvent_engine_settings': {'compute_platform': 'cpu'},\n", + " 'solvent_engine_settings': {'compute_platform': 'CUDA'},\n", " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", " 'equil_npt_structure': 'equil_npt_structure.pdb',\n", @@ -358,10 +372,10 @@ " 'output_indices': 'not water',\n", " 'output_structure': 'hybrid_system.pdb'},\n", " 'solvent_simulation_settings': {'early_termination_target_error': ,\n", - " 'equilibration_length': ,\n", + " 'equilibration_length': ,\n", " 'minimization_steps': 5000,\n", " 'n_replicas': 14,\n", - " 'production_length': ,\n", + " 'production_length': ,\n", " 'real_time_analysis_interval': ,\n", " 'real_time_analysis_minimum_time': ,\n", " 'sampler_method': 'repex',\n", @@ -405,10 +419,10 @@ " 'output_indices': 'not water',\n", " 'output_structure': 'hybrid_system.pdb'},\n", " 'vacuum_simulation_settings': {'early_termination_target_error': ,\n", - " 'equilibration_length': ,\n", + " 'equilibration_length': ,\n", " 'minimization_steps': 5000,\n", " 'n_replicas': 14,\n", - " 'production_length': ,\n", + " 'production_length': ,\n", " 'real_time_analysis_interval': ,\n", " 'real_time_analysis_minimum_time': ,\n", " 'sampler_method': 'repex',\n", @@ -434,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "id": "23f6322b-0336-4aa9-b9d0-ebe533dc5753", "metadata": {}, "outputs": [], @@ -456,7 +470,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 15, "id": "44ba94ca", "metadata": {}, "outputs": [], @@ -491,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "id": "6dbedb47-46b9-4c22-ad74-a580174a359c", "metadata": {}, "outputs": [], @@ -502,20 +516,18 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, "id": "be690ef1-3243-4114-b56f-5babbb660af6", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - " warnings.warn(wmsg)\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] }, { @@ -536,17 +548,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", - " mu /= float(N)\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", - " sigma2 /= float(N)\n", - "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - " warnings.warn(wmsg)\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] }, { @@ -567,17 +573,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", - " mu /= float(N)\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", - " sigma2 /= float(N)\n", - "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - " warnings.warn(wmsg)\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] }, { @@ -598,34 +598,84 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING:openmmtools.multistate.multistateanalyzer:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:282: RuntimeWarning: invalid value encountered in double_scalars\n", - " mu /= float(N)\n", - "/Users/hannahbaumann/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/pymbar/timeseries.py:294: RuntimeWarning: invalid value encountered in double_scalars\n", - " sigma2 /= float(N)\n", - "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", - " warnings.warn(wmsg)\n", - "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n" + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/56/3yvgkyg96rvchgjgzfbf16gc0000gn/T/ipykernel_21531/2335985105.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpathlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'./ahfe'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# Execute the DAG\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mdag_results\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexecute_DAG\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdag\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscratch_basedir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshared_basedir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_retries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/gufe/protocols/protocoldag.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(protocoldag, shared_basedir, scratch_basedir, keep_shared, keep_scratch, raise_error, n_retries)\u001b[0m\n\u001b[1;32m 408\u001b[0m context = Context(shared=shared,\n\u001b[1;32m 409\u001b[0m scratch=scratch)\n\u001b[1;32m 410\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 411\u001b[0m \u001b[0;31m# execute\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 412\u001b[0;31m result = unit.execute(\n\u001b[0m\u001b[1;32m 413\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 414\u001b[0m \u001b[0mraise_error\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mraise_error\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 415\u001b[0m **inputs)\n", - "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/gufe/protocols/protocolunit.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, context, raise_error, **inputs)\u001b[0m\n\u001b[1;32m 324\u001b[0m )\n\u001b[1;32m 325\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 327\u001b[0m \u001b[0;31m# if we \"fail\" due to a KeyboardInterrupt, we always want to raise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 328\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 329\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 330\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mraise_error\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/equil_solvation_afe_method.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, ctx, **kwargs)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mgufe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mContext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m ) -> dict[str, Any]:\n\u001b[1;32m 905\u001b[0m \u001b[0mlog_system_probe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlogging\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mINFO\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpaths\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscratch\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 906\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 907\u001b[0;31m outputs = self.run(scratch_basepath=ctx.scratch,\n\u001b[0m\u001b[1;32m 908\u001b[0m shared_basepath=ctx.shared)\n\u001b[1;32m 909\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 910\u001b[0m return {\n", - "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, dry, verbose, scratch_basepath, shared_basepath)\u001b[0m\n\u001b[1;32m 993\u001b[0m \u001b[0msystem_modeller\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem_generator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msmc_comps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 994\u001b[0m )\n\u001b[1;32m 995\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 996\u001b[0m \u001b[0;31m# 6. Pre-equilbrate System (Test + Avoid NaNs + get stable system)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 997\u001b[0;31m positions = self._pre_equilibrate(\n\u001b[0m\u001b[1;32m 998\u001b[0m \u001b[0momm_system\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0momm_topology\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 999\u001b[0m )\n\u001b[1;32m 1000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/openfe/openfe/protocols/openmm_afe/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, system, topology, positions, settings, dry)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;31m# Use the _run_MD method from the PlainMDProtocolUnit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;31m# Should in-place modify the simulation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m PlainMDProtocolUnit._run_MD(\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0msimulation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msimulation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0mpositions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpositions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m \u001b[0msimulation_settings\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'equil_simulation_settings'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/openfe/openfe/protocols/openmm_md/plain_md_methods.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(simulation, positions, simulation_settings, output_settings, temperature, barostat_frequency, timestep, equil_steps_nvt, equil_steps_npt, prod_steps, verbose, shared_basepath)\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0mdensity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0mspeed\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 435\u001b[0m ))\n\u001b[1;32m 436\u001b[0m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 437\u001b[0;31m \u001b[0msimulation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprod_steps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 438\u001b[0m \u001b[0mt1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Completed simulation in {t1 - t0} seconds\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/app/simulation.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;34m\"\"\"Advance the simulation by integrating a specified number of time steps.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_simulate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mendStep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrentStep\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/app/simulation.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, endStep, endTime)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0mnextSteps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnextReport\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0manyReport\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnextSteps\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintegrator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Only take 10 steps at a time, to give Python more chances to respond to a control-c.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 207\u001b[0m \u001b[0mstepsToGo\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 208\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mendTime\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mendTime\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/mambaforge/envs/openfe_dev/lib/python3.10/site-packages/openmm/openmm.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 11754\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11755\u001b[0m \u001b[0msteps\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11756\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0mof\u001b[0m \u001b[0mtime\u001b[0m \u001b[0msteps\u001b[0m \u001b[0mto\u001b[0m \u001b[0mtake\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11757\u001b[0m \"\"\"\n\u001b[0;32m> 11758\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_openmm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mLangevinMiddleIntegrator_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Please cite the following:\n", + "\n", + " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", + " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", + " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", + " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", + " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] } ], @@ -660,19 +710,15 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 18, "id": "d0f6b8fb-dde2-442a-b641-3160a70e2f84", "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'dag_results' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[30], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Get the complex and solvent results\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m protocol_results \u001b[38;5;241m=\u001b[39m protocol\u001b[38;5;241m.\u001b[39mgather([\u001b[43mdag_results\u001b[49m])\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAHFE dG: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprotocol_results\u001b[38;5;241m.\u001b[39mget_estimate()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, err \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprotocol_results\u001b[38;5;241m.\u001b[39mget_uncertainty()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mNameError\u001b[0m: name 'dag_results' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "AHFE dG: -0.8757588273304342 kilocalorie_per_mole, err 0.15236223232996626 kilocalorie_per_mole\n" ] } ], @@ -685,26 +731,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "847b5663-2e6c-4cb2-aa9d-39d132fcff3d", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", - " outdict = {\n", - " \"estimate\": protres.get_estimate(),\n", - " \"uncertainty\": protres.get_uncertainty(),\n", - " \"protocol_result\": protres.to_dict(),\n", - " \"unit_results\": {\n", - " unit.key: unit.to_keyed_dict()\n", - " for unit in dagres.protocol_unit_results\n", - " }\n", + "# Save the results in a json file\n", + "import gzip\n", + "import json\n", + "import gufe\n", + "outdict = {\n", + " \"estimate\": protocol_results.get_estimate(),\n", + " \"uncertainty\": protocol_results.get_uncertainty(),\n", + " \"protocol_result\": protocol_results.to_dict(),\n", + " \"unit_results\": {\n", + " unit.key: unit.to_keyed_dict()\n", + " for unit in dag_results.protocol_unit_results\n", " }\n", + "}\n", "\n", - " with gzip.open(f\"{simname}_json_results.gz\", 'wt') as zipfile:\n", - " json.dump(outdict, zipfile, cls=JSON_HANDLER.encoder)" + "with gzip.open(\"ahfe_benzene_json_results.gz\", 'wt') as zipfile:\n", + " json.dump(outdict, zipfile, cls=gufe.tokenization.JSON_HANDLER.encoder)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f62f69a1-09c0-4a4a-9b37-9663b51a75ac", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -723,7 +779,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.7" } }, "nbformat": 4, From aef103641357082b797cc4ef4ac939b0901253d0 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Fri, 1 Mar 2024 15:18:11 -0800 Subject: [PATCH 03/11] add quickrun example --- ahfe_tutorial/python_tutorial.ipynb | 101 +++++++++++++++++++++------- 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb index a0dfdc7..1ac6a48 100644 --- a/ahfe_tutorial/python_tutorial.ipynb +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -15,21 +15,7 @@ "execution_count": 1, "id": "fc97de03", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "LICENSE: Could not open license file \"oe_license.txt\" in local directory\n", - "LICENSE: N.B. OE_LICENSE environment variable is not set\n", - "LICENSE: N.B. OE_DIR environment variable is not set\n", - "LICENSE: No product keys!\n", - "LICENSE: No product keys!\n", - "LICENSE: No product keys!\n", - "LICENSE: No product keys!\n" - ] - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "import openfe" @@ -95,7 +81,7 @@ "systemA = openfe.ChemicalSystem({\n", " 'ligand': ligands[0],\n", " 'solvent': solvent,\n", - "})\n", + "}, name=ligands[0].name)\n", "# In state B the ligand is fully decoupled in the solvent, therefore we are only defining the solvent here\n", "systemB = openfe.ChemicalSystem({'solvent': solvent})" ] @@ -231,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "e83630f0", "metadata": {}, "outputs": [], @@ -246,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "55067780-d228-4661-8c1e-5cb0217fd2dc", "metadata": {}, "outputs": [], @@ -274,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "137d3f96-00fc-4400-bf5d-b8ed355dbbec", "metadata": {}, "outputs": [ @@ -448,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "23f6322b-0336-4aa9-b9d0-ebe533dc5753", "metadata": {}, "outputs": [], @@ -456,12 +442,81 @@ "protocol = AbsoluteSolvationProtocol(settings=settings)" ] }, + { + "cell_type": "markdown", + "id": "7f1dfcff-bb06-4508-9f16-4e3de18a5f93", + "metadata": {}, + "source": [ + "## 4. Running the AHFE simulation using the CLI command `openfe quickrun`" + ] + }, + { + "cell_type": "markdown", + "id": "38129396-ba19-46e9-9eb0-36b0e3a7ad3c", + "metadata": {}, + "source": [ + "Once we have the ChemicalSystems, and the Protocol, we can create the Transformation. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1231fad8-b37d-4008-a851-5ad546386286", + "metadata": {}, + "outputs": [], + "source": [ + "transformation = openfe.Transformation(\n", + " stateA=systemA,\n", + " stateB=systemB,\n", + " mapping=None,\n", + " protocol=protocol, # use protocol created above\n", + " name=f\"{systemA.name}\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "451e3345-0b30-4dbf-93b5-28847fad1c9a", + "metadata": {}, + "source": [ + "We'll write out the transformation to disk, so that it can be run using the openfe quickrun command:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b69efbcd-b888-4afc-a33e-01860889f408", + "metadata": {}, + "outputs": [], + "source": [ + "import pathlib\n", + "# first we create the directory\n", + "transformation_dir = pathlib.Path(\"ahfe_json\")\n", + "transformation_dir.mkdir(exist_ok=True)\n", + "\n", + "# then we write out the transformation\n", + "transformation.dump(transformation_dir / f\"{transformation.name}.json\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b4f7397-d79e-4bea-a473-1750b27d7b44", + "metadata": {}, + "source": [ + "You can run the AHFE simulation from the CLI by using the `openfe quickrun` command. It takes a transformation JSON as input, and the flags -o to give the final output JSON file and -d for the directory where simulation results should be stored. For example,\n", + "\n", + "`openfe quickrun path/to/transformation.json -o results.json -d working-directory`\n", + "\n", + "where path/to/transformation.json is the path to one of the files created above." + ] + }, { "cell_type": "markdown", "id": "318ff872", "metadata": {}, "source": [ - "## 4. Creating the `ProtocolDAG`\n", + "## 5. Running the AHFE simulation using the Python API\n", + "**Creating the `ProtocolDAG`**\n", "\n", "Once we have the two `ChemicalSystem`s, and the `Protocol`, we can create the `ProtocolDAG`.\n", "\n", @@ -494,7 +549,7 @@ "id": "1e29d1c8", "metadata": {}, "source": [ - "## 5. Executing the simulation\n", + "**Executing the simulation**\n", "\n", "The DAG contains many invdividual jobs. We can execute them sequentially in this notebook using the `gufe.protocols.execute` function.\n", "\n", @@ -779,7 +834,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.10.13" } }, "nbformat": 4, From 0163d5a6b6b67258494c56b3fddb76862999826e Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 4 Mar 2024 15:26:10 -0800 Subject: [PATCH 04/11] changes addressing some of the review comments --- ahfe_tutorial/python_tutorial.ipynb | 186 ++++++++++++++++++++++++++-- 1 file changed, 177 insertions(+), 9 deletions(-) diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb index 1ac6a48..aa3ed55 100644 --- a/ahfe_tutorial/python_tutorial.ipynb +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -56,6 +56,8 @@ "\n", "The `Component`s are joined in a `ChemicalSystem`, which describes all the particles in the simulation.\n", "\n", + "In state A of the hydration free energy protocol, the ligand is fully interacting in the solvent and the `ChemicalSystem` contains both the ligand and the solvent. In the other endstate, state B, the ligand is fully decoupled in the solvent. Therefore, the `ChemicalSystem` only contains the solvent in state B.\n", + "\n", "Note that for AHFE simulations, we are not separately defining the vacuum state, but the protocol creates that based on the solvent states." ] }, @@ -116,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "fb839094", "metadata": {}, "outputs": [], @@ -124,6 +126,170 @@ "settings = AbsoluteSolvationProtocol.default_settings()" ] }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8b99f77f-c70c-436d-b4eb-fb462a4b043e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'alchemical_settings': {},\n", + " 'integrator_settings': {'barostat_frequency': ,\n", + " 'constraint_tolerance': 1e-06,\n", + " 'langevin_collision_rate': ,\n", + " 'n_restart_attempts': 20,\n", + " 'reassign_velocities': False,\n", + " 'remove_com': False,\n", + " 'timestep': },\n", + " 'lambda_settings': {'lambda_elec': [0.0,\n", + " 0.25,\n", + " 0.5,\n", + " 0.75,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0,\n", + " 1.0],\n", + " 'lambda_restraints': [0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0],\n", + " 'lambda_vdw': [0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.12,\n", + " 0.24,\n", + " 0.36,\n", + " 0.48,\n", + " 0.6,\n", + " 0.7,\n", + " 0.77,\n", + " 0.85,\n", + " 1.0]},\n", + " 'partial_charge_settings': {'nagl_model': None,\n", + " 'number_of_conformers': None,\n", + " 'off_toolkit_backend': 'ambertools',\n", + " 'partial_charge_method': 'am1bcc'},\n", + " 'protocol_repeats': 3,\n", + " 'solvation_settings': {'solvent_model': 'tip3p',\n", + " 'solvent_padding': },\n", + " 'solvent_engine_settings': {'compute_platform': None},\n", + " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'checkpoint.chk',\n", + " 'equil_npt_structure': 'equil_npt_structure.pdb',\n", + " 'equil_nvt_structure': 'equil_nvt_structure.pdb',\n", + " 'forcefield_cache': 'db.json',\n", + " 'log_output': 'equil_simulation.log',\n", + " 'minimized_structure': 'minimized.pdb',\n", + " 'output_indices': 'not water',\n", + " 'preminimized_structure': 'system.pdb',\n", + " 'production_trajectory_filename': 'production_equil.xtc',\n", + " 'trajectory_write_interval': },\n", + " 'solvent_equil_simulation_settings': {'equilibration_length': ,\n", + " 'equilibration_length_nvt': ,\n", + " 'minimization_steps': 5000,\n", + " 'production_length': },\n", + " 'solvent_forcefield_settings': {'constraints': 'hbonds',\n", + " 'forcefields': ['amber/ff14SB.xml',\n", + " 'amber/tip3p_standard.xml',\n", + " 'amber/tip3p_HFE_multivalent.xml',\n", + " 'amber/phosaa10.xml'],\n", + " 'hydrogen_mass': 3.0,\n", + " 'nonbonded_cutoff': ,\n", + " 'nonbonded_method': 'PME',\n", + " 'rigid_water': True,\n", + " 'small_molecule_forcefield': 'openff-2.0.0'},\n", + " 'solvent_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'solvent_checkpoint.nc',\n", + " 'forcefield_cache': 'db.json',\n", + " 'output_filename': 'solvent.nc',\n", + " 'output_indices': 'not water',\n", + " 'output_structure': 'hybrid_system.pdb'},\n", + " 'solvent_simulation_settings': {'early_termination_target_error': ,\n", + " 'equilibration_length': ,\n", + " 'minimization_steps': 5000,\n", + " 'n_replicas': 14,\n", + " 'production_length': ,\n", + " 'real_time_analysis_interval': ,\n", + " 'real_time_analysis_minimum_time': ,\n", + " 'sampler_method': 'repex',\n", + " 'sams_flatness_criteria': 'logZ-flatness',\n", + " 'sams_gamma0': 1.0,\n", + " 'time_per_iteration': },\n", + " 'thermo_settings': {'ph': None,\n", + " 'pressure': ,\n", + " 'redox_potential': None,\n", + " 'temperature': },\n", + " 'vacuum_engine_settings': {'compute_platform': None},\n", + " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'checkpoint.chk',\n", + " 'equil_npt_structure': 'equil_structure.pdb',\n", + " 'equil_nvt_structure': None,\n", + " 'forcefield_cache': 'db.json',\n", + " 'log_output': 'equil_simulation.log',\n", + " 'minimized_structure': 'minimized.pdb',\n", + " 'output_indices': 'not water',\n", + " 'preminimized_structure': 'system.pdb',\n", + " 'production_trajectory_filename': 'production_equil.xtc',\n", + " 'trajectory_write_interval': },\n", + " 'vacuum_equil_simulation_settings': {'equilibration_length': ,\n", + " 'equilibration_length_nvt': None,\n", + " 'minimization_steps': 5000,\n", + " 'production_length': },\n", + " 'vacuum_forcefield_settings': {'constraints': 'hbonds',\n", + " 'forcefields': ['amber/ff14SB.xml',\n", + " 'amber/tip3p_standard.xml',\n", + " 'amber/tip3p_HFE_multivalent.xml',\n", + " 'amber/phosaa10.xml'],\n", + " 'hydrogen_mass': 3.0,\n", + " 'nonbonded_cutoff': ,\n", + " 'nonbonded_method': 'nocutoff',\n", + " 'rigid_water': True,\n", + " 'small_molecule_forcefield': 'openff-2.0.0'},\n", + " 'vacuum_output_settings': {'checkpoint_interval': ,\n", + " 'checkpoint_storage_filename': 'vacuum_checkpoint.nc',\n", + " 'forcefield_cache': 'db.json',\n", + " 'output_filename': 'vacuum.nc',\n", + " 'output_indices': 'not water',\n", + " 'output_structure': 'hybrid_system.pdb'},\n", + " 'vacuum_simulation_settings': {'early_termination_target_error': ,\n", + " 'equilibration_length': ,\n", + " 'minimization_steps': 5000,\n", + " 'n_replicas': 14,\n", + " 'production_length': ,\n", + " 'real_time_analysis_interval': ,\n", + " 'real_time_analysis_minimum_time': ,\n", + " 'sampler_method': 'repex',\n", + " 'sams_flatness_criteria': 'logZ-flatness',\n", + " 'sams_gamma0': 1.0,\n", + " 'time_per_iteration': }}\n" + ] + } + ], + "source": [ + "settings" + ] + }, { "cell_type": "markdown", "id": "f2d77ba4-f6d7-465f-8933-1cf35748d71f", @@ -156,7 +322,7 @@ } ], "source": [ - "settings.thermo_settings.temperature # display default value" + "settings.thermo_settings.temperature # Simulation temperature" ] }, { @@ -177,7 +343,7 @@ } ], "source": [ - "settings.lambda_settings.lambda_elec # display default value" + "settings.lambda_settings.lambda_elec # List of floats of lambda values for the electrostatics" ] }, { @@ -204,7 +370,7 @@ } ], "source": [ - "settings.solvent_simulation_settings.equilibration_length" + "settings.solvent_simulation_settings.equilibration_length # Length of the NPT equilibration in the solvent, prior to running the AHFE calculation" ] }, { @@ -212,6 +378,10 @@ "id": "9f81f879-9eea-4af0-b772-e28832912487", "metadata": {}, "source": [ + "By default we run 3 repeats with solvent and vacuum simulation lengths of 10 ns and 2 ns over 14 lambda windows. \n", + "To speed things up here we instead run 1 repeats with both solvent and vacuum simulation lengths of 0.5 ns over 14 lambda windows.\n", + "\n", + "Maybe also worth bringing down the number of repeats to 1 to speed up the notebook?\n", "Changing default values:" ] }, @@ -225,9 +395,8 @@ "from openff.units import unit\n", "\n", "# change the values\n", - "settings.thermo_settings.temperature = 300.0 * unit.kelvin\n", - "settings.lambda_settings.lambda_elec = [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", - "settings.solvent_simulation_settings.equilibration_length = 500 * unit.picosecond" + "settings.protocol_repeats = 1\n", + "settings.lambda_settings.lambda_elec = [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]" ] }, { @@ -419,8 +588,7 @@ } ], "source": [ - "from pprint import pprint\n", - "pprint(settings.dict())" + "settings" ] }, { From 15cd4bf60ee0ea89b9691a73b755c07c99d81050 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Tue, 5 Mar 2024 14:33:07 -0800 Subject: [PATCH 05/11] add json, add thermodynamic cycle --- ahfe_tutorial/ahfe_cycle.png | Bin 0 -> 43184 bytes ahfe_tutorial/ahfe_json/benzene.json | 1 + ahfe_tutorial/python_tutorial.ipynb | 17 +++++++++++++---- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 ahfe_tutorial/ahfe_cycle.png create mode 100644 ahfe_tutorial/ahfe_json/benzene.json diff --git a/ahfe_tutorial/ahfe_cycle.png b/ahfe_tutorial/ahfe_cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..8d77aca44561030059e8cae43eff99df9f4928e8 GIT binary patch literal 43184 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 V4>Lm9jtk&F4K-cW66L3_{|mX)9" ] }, { @@ -56,7 +66,7 @@ "\n", "The `Component`s are joined in a `ChemicalSystem`, which describes all the particles in the simulation.\n", "\n", - "In state A of the hydration free energy protocol, the ligand is fully interacting in the solvent and the `ChemicalSystem` contains both the ligand and the solvent. In the other endstate, state B, the ligand is fully decoupled in the solvent. Therefore, the `ChemicalSystem` only contains the solvent in state B.\n", + "In state A of the hydration free energy protocol, the ligand is fully interacting in the solvent and the `ChemicalSystem` contains both the ligand and the solvent. In the other endstate, state B, the ligand is fully decoupled in the solvent. Therefore, the `ChemicalSystem` in state B only contains the solvent.\n", "\n", "Note that for AHFE simulations, we are not separately defining the vacuum state, but the protocol creates that based on the solvent states." ] @@ -379,9 +389,8 @@ "metadata": {}, "source": [ "By default we run 3 repeats with solvent and vacuum simulation lengths of 10 ns and 2 ns over 14 lambda windows. \n", - "To speed things up here we instead run 1 repeats with both solvent and vacuum simulation lengths of 0.5 ns over 14 lambda windows.\n", + "To speed things up here we instead run 1 repeat with both solvent and vacuum simulation lengths of 0.5 ns over 14 lambda windows.\n", "\n", - "Maybe also worth bringing down the number of repeats to 1 to speed up the notebook?\n", "Changing default values:" ] }, From aaf647d8c02e71a918b0e62a0a3cd50552f89a61 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Tue, 5 Mar 2024 15:01:15 -0800 Subject: [PATCH 06/11] small fix --- ahfe_tutorial/ahfe_json/benzene.json | 2 +- ahfe_tutorial/python_tutorial.ipynb | 184 ++++----------------------- 2 files changed, 28 insertions(+), 158 deletions(-) diff --git a/ahfe_tutorial/ahfe_json/benzene.json b/ahfe_tutorial/ahfe_json/benzene.json index 7e86121..6b879c0 100644 --- a/ahfe_tutorial/ahfe_json/benzene.json +++ b/ahfe_tutorial/ahfe_json/benzene.json @@ -1 +1 @@ -{":version:": 1, "__module__": "gufe.transformations.transformation", "__qualname__": "Transformation", "mapping": null, "name": "benzene", "protocol": {":version:": 1, "__module__": "openfe.protocols.openmm_afe.equil_solvation_afe_method", "__qualname__": "AbsoluteSolvationProtocol", "settings": {":is_custom:": true, "__class__": "AbsoluteSolvationSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", "alchemical_settings": {":is_custom:": true, "__class__": "AlchemicalSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings"}, "integrator_settings": {":is_custom:": true, "__class__": "IntegratorSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "barostat_frequency": {":is_custom:": true, "magnitude": 25, "pint_unit_registry": "openff_units", "unit": "timestep"}, "constraint_tolerance": 1e-06, "langevin_collision_rate": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "1 / picosecond"}, "n_restart_attempts": 20, "reassign_velocities": false, "remove_com": false, "timestep": {":is_custom:": true, "magnitude": 4, "pint_unit_registry": "openff_units", "unit": "femtosecond"}}, "lambda_settings": {":is_custom:": true, "__class__": "LambdaSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", "lambda_elec": [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "lambda_restraints": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "lambda_vdw": [0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0]}, "partial_charge_settings": {":is_custom:": true, "__class__": "OpenFFPartialChargeSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "nagl_model": null, "number_of_conformers": null, "off_toolkit_backend": "ambertools", "partial_charge_method": "am1bcc"}, "protocol_repeats": 3, "solvation_settings": {":is_custom:": true, "__class__": "OpenMMSolvationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "solvent_model": "tip3p", "solvent_padding": {":is_custom:": true, "magnitude": 1.2, "pint_unit_registry": "openff_units", "unit": "nanometer"}}, "solvent_engine_settings": {":is_custom:": true, "__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "compute_platform": "CUDA"}, "solvent_equil_output_settings": {":is_custom:": true, "__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "checkpoint.chk", "equil_npt_structure": "equil_npt_structure.pdb", "equil_nvt_structure": "equil_nvt_structure.pdb", "forcefield_cache": "db.json", "log_output": "equil_simulation.log", "minimized_structure": "minimized.pdb", "output_indices": "not water", "preminimized_structure": "system.pdb", "production_trajectory_filename": "production_equil.xtc", "trajectory_write_interval": {":is_custom:": true, "magnitude": 20, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "solvent_equil_simulation_settings": {":is_custom:": true, "__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "equilibration_length": {":is_custom:": true, "magnitude": 0.2, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "equilibration_length_nvt": {":is_custom:": true, "magnitude": 0.1, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "production_length": {":is_custom:": true, "magnitude": 0.5, "pint_unit_registry": "openff_units", "unit": "nanosecond"}}, "solvent_forcefield_settings": {":is_custom:": true, "__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", "constraints": "hbonds", "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "hydrogen_mass": 3.0, "nonbonded_cutoff": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "nanometer"}, "nonbonded_method": "PME", "rigid_water": true, "small_molecule_forcefield": "openff-2.0.0"}, "solvent_output_settings": {":is_custom:": true, "__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "solvent_checkpoint.nc", "forcefield_cache": "db.json", "output_filename": "solvent.nc", "output_indices": "not water", "output_structure": "hybrid_system.pdb"}, "solvent_simulation_settings": {":is_custom:": true, "__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "early_termination_target_error": {":is_custom:": true, "magnitude": 0.0, "pint_unit_registry": "openff_units", "unit": "kilocalorie_per_mole"}, "equilibration_length": {":is_custom:": true, "magnitude": 0.009999999999999998, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "n_replicas": 14, "production_length": {":is_custom:": true, "magnitude": 0.4999999999999999, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "real_time_analysis_interval": {":is_custom:": true, "magnitude": 250, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "real_time_analysis_minimum_time": {":is_custom:": true, "magnitude": 500, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "time_per_iteration": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "thermo_settings": {":is_custom:": true, "__class__": "ThermoSettings", "__module__": "gufe.settings.models", "ph": null, "pressure": {":is_custom:": true, "magnitude": 0.9869232667160129, "pint_unit_registry": "openff_units", "unit": "standard_atmosphere"}, "redox_potential": null, "temperature": {":is_custom:": true, "magnitude": 300.0, "pint_unit_registry": "openff_units", "unit": "kelvin"}}, "vacuum_engine_settings": {":is_custom:": true, "__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "compute_platform": null}, "vacuum_equil_output_settings": {":is_custom:": true, "__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "checkpoint.chk", "equil_npt_structure": "equil_structure.pdb", "equil_nvt_structure": null, "forcefield_cache": "db.json", "log_output": "equil_simulation.log", "minimized_structure": "minimized.pdb", "output_indices": "not water", "preminimized_structure": "system.pdb", "production_trajectory_filename": "production_equil.xtc", "trajectory_write_interval": {":is_custom:": true, "magnitude": 20, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "vacuum_equil_simulation_settings": {":is_custom:": true, "__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "equilibration_length": {":is_custom:": true, "magnitude": 0.2, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "equilibration_length_nvt": null, "minimization_steps": 5000, "production_length": {":is_custom:": true, "magnitude": 0.5, "pint_unit_registry": "openff_units", "unit": "nanosecond"}}, "vacuum_forcefield_settings": {":is_custom:": true, "__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", "constraints": "hbonds", "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "hydrogen_mass": 3.0, "nonbonded_cutoff": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "nanometer"}, "nonbonded_method": "nocutoff", "rigid_water": true, "small_molecule_forcefield": "openff-2.0.0"}, "vacuum_output_settings": {":is_custom:": true, "__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "vacuum_checkpoint.nc", "forcefield_cache": "db.json", "output_filename": "vacuum.nc", "output_indices": "not water", "output_structure": "hybrid_system.pdb"}, "vacuum_simulation_settings": {":is_custom:": true, "__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "early_termination_target_error": {":is_custom:": true, "magnitude": 0.0, "pint_unit_registry": "openff_units", "unit": "kilocalorie_per_mole"}, "equilibration_length": {":is_custom:": true, "magnitude": 0.009999999999999998, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "n_replicas": 14, "production_length": {":is_custom:": true, "magnitude": 0.4999999999999999, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "real_time_analysis_interval": {":is_custom:": true, "magnitude": 250, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "real_time_analysis_minimum_time": {":is_custom:": true, "magnitude": 500, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "time_per_iteration": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}}}}, "stateA": {":version:": 1, "__module__": "gufe.chemicalsystem", "__qualname__": "ChemicalSystem", "components": {"ligand": {":version:": 1, "__module__": "gufe.components.smallmoleculecomponent", "__qualname__": "SmallMoleculeComponent", "atoms": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], "bonds": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], "conformer": ["\u0093NUMPY\u0001\u0000v\u0000{'descr': '" + "\"Drawing\"" ] }, { @@ -128,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "id": "fb839094", "metadata": {}, "outputs": [], @@ -138,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "id": "8b99f77f-c70c-436d-b4eb-fb462a4b043e", "metadata": {}, "outputs": [ @@ -310,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "82c3e1ea-2bf6-47ec-bf1d-fe06adb6ea10", "metadata": {}, "outputs": [ @@ -326,7 +326,7 @@ "298.15 " ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -337,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "05d407e9-8ddb-4c53-be73-88ec65f4a93e", "metadata": {}, "outputs": [ @@ -347,7 +347,7 @@ "[0.0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -358,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "cbaa744c-9b3e-45ca-b6e1-227e80446623", "metadata": {}, "outputs": [ @@ -374,7 +374,7 @@ "1.0 " ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -396,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "e83630f0", "metadata": {}, "outputs": [], @@ -410,7 +410,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "55067780-d228-4661-8c1e-5cb0217fd2dc", "metadata": {}, "outputs": [], @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "137d3f96-00fc-4400-bf5d-b8ed355dbbec", "metadata": {}, "outputs": [ @@ -500,7 +500,7 @@ " 'number_of_conformers': None,\n", " 'off_toolkit_backend': 'ambertools',\n", " 'partial_charge_method': 'am1bcc'},\n", - " 'protocol_repeats': 3,\n", + " 'protocol_repeats': 1,\n", " 'solvation_settings': {'solvent_model': 'tip3p',\n", " 'solvent_padding': },\n", " 'solvent_engine_settings': {'compute_platform': 'CUDA'},\n", @@ -549,7 +549,7 @@ " 'thermo_settings': {'ph': None,\n", " 'pressure': ,\n", " 'redox_potential': None,\n", - " 'temperature': },\n", + " 'temperature': },\n", " 'vacuum_engine_settings': {'compute_platform': None},\n", " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", @@ -611,7 +611,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "23f6322b-0336-4aa9-b9d0-ebe533dc5753", "metadata": {}, "outputs": [], @@ -637,7 +637,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "1231fad8-b37d-4008-a851-5ad546386286", "metadata": {}, "outputs": [], @@ -661,7 +661,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "b69efbcd-b888-4afc-a33e-01860889f408", "metadata": {}, "outputs": [], @@ -702,7 +702,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "id": "44ba94ca", "metadata": {}, "outputs": [], @@ -737,7 +737,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "id": "6dbedb47-46b9-4c22-ad74-a580174a359c", "metadata": {}, "outputs": [], @@ -748,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "be690ef1-3243-4114-b56f-5babbb660af6", "metadata": { "scrolled": true @@ -758,33 +758,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please cite the following:\n", - "\n", - " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", - " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", - " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", - " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", - " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" + "/Users/hannahbaumann/openfe/openfe/protocols/openmm_rfe/_rfe_utils/compute.py:56: UserWarning: Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + " warnings.warn(wmsg)\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatereporter:Warning: The openmmtools.multistate API is experimental and may change in future releases\n", + "WARNING:root:Non-GPU platform selected: CPU, this may significantly impact simulation performance\n", + "WARNING:openmmtools.multistate.multistatesampler:Warning: The openmmtools.multistate API is experimental and may change in future releases\n" ] }, { @@ -800,120 +779,11 @@ " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", " \n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please cite the following:\n", - "\n", - " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", - " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", - " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", - " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", - " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please cite the following:\n", - "\n", - " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", - " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", - " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", - " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", - " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please cite the following:\n", - "\n", - " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", - " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", - " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", - " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", - " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please cite the following:\n", - "\n", - " Friedrichs MS, Eastman P, Vaidyanathan V, Houston M, LeGrand S, Beberg AL, Ensign DL, Bruns CM, and Pande VS. Accelerating molecular dynamic simulations on graphics processing unit. J. Comput. Chem. 30:864, 2009. DOI: 10.1002/jcc.21209\n", - " Eastman P and Pande VS. OpenMM: A hardware-independent framework for molecular simulations. Comput. Sci. Eng. 12:34, 2010. DOI: 10.1109/MCSE.2010.27\n", - " Eastman P and Pande VS. Efficient nonbonded interactions for molecular dynamics on a graphics processing unit. J. Comput. Chem. 31:1268, 2010. DOI: 10.1002/jcc.21413\n", - " Eastman P and Pande VS. Constant constraint matrix approximation: A robust, parallelizable constraint method for molecular simulations. J. Chem. Theor. Comput. 6:434, 2010. DOI: 10.1021/ct900463w\n", - " Chodera JD and Shirts MR. Replica exchange and expanded ensemble simulations as Gibbs multistate: Simple improvements for enhanced mixing. J. Chem. Phys., 135:194110, 2011. DOI:10.1063/1.3660669\n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n", - "Warning: The openmmtools.multistate API is experimental and may change in future releases\n" - ] } ], "source": [ "# Finally we can run the simulations\n", - "path = pathlib.Path('./ahfe')\n", + "path = pathlib.Path('./ahfe_results')\n", "path.mkdir()\n", "\n", "# Execute the DAG\n", From f829ebb507abdb536183cacbb7216e9fb1ec48f2 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Wed, 6 Mar 2024 17:40:10 +0000 Subject: [PATCH 07/11] Add results json --- ahfe_tutorial/ahfe_json/benzene_results.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 ahfe_tutorial/ahfe_json/benzene_results.json diff --git a/ahfe_tutorial/ahfe_json/benzene_results.json b/ahfe_tutorial/ahfe_json/benzene_results.json new file mode 100644 index 0000000..b5d5c95 --- /dev/null +++ b/ahfe_tutorial/ahfe_json/benzene_results.json @@ -0,0 +1 @@ +{"estimate": {"magnitude": -0.7536190151704971, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "uncertainty": {"magnitude": 0.0, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "protocol_result": {"data": {"solvent": {"23375512213741230270651942912798595258": [{"name": "Absolute Solvation, benzene solvent leg: repeat 0 generation 0", "_key": "ProtocolUnitResult-7571b445816d4ea383e1be915c41b24f", "source_key": "AbsoluteSolvationSolventUnit-1d05404cbfd246fb9fd8e8256d6280c5", "inputs": {"protocol": {"settings": {"__class__": "AbsoluteSolvationSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true, "protocol_repeats": 1, "solvent_forcefield_settings": {"__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "constraints": "hbonds", "rigid_water": true, "hydrogen_mass": 3.0, "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "small_molecule_forcefield": "openff-2.0.0", "nonbonded_cutoff": {"magnitude": 1.0, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "nonbonded_method": "PME"}, "vacuum_forcefield_settings": {"__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "constraints": "hbonds", "rigid_water": true, "hydrogen_mass": 3.0, "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "small_molecule_forcefield": "openff-2.0.0", "nonbonded_cutoff": {"magnitude": 1.0, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "nonbonded_method": "nocutoff"}, "thermo_settings": {"__class__": "ThermoSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "temperature": {"magnitude": 298.15, "unit": "kelvin", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "pressure": {"magnitude": 0.9869232667160129, "unit": "standard_atmosphere", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "ph": null, "redox_potential": null}, "solvation_settings": {"__class__": "OpenMMSolvationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "solvent_model": "tip3p", "solvent_padding": {"magnitude": 1.2, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "alchemical_settings": {"__class__": "AlchemicalSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true}, "lambda_settings": {"__class__": "LambdaSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true, "lambda_elec": [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "lambda_vdw": [0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0], "lambda_restraints": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "vacuum_engine_settings": {"__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "compute_platform": null}, "solvent_engine_settings": {"__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "compute_platform": "CUDA"}, "integrator_settings": {"__class__": "IntegratorSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "timestep": {"magnitude": 4.0, "unit": "femtosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "langevin_collision_rate": {"magnitude": 1.0, "unit": "1 / picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "barostat_frequency": {"magnitude": 25.0, "unit": "timestep", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "remove_com": false, "reassign_velocities": false, "n_restart_attempts": 20, "constraint_tolerance": 1e-06}, "vacuum_equil_simulation_settings": {"__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.2, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.5, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "equilibration_length_nvt": null}, "vacuum_simulation_settings": {"__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.009999999999999998, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.4999999999999999, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "time_per_iteration": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_interval": {"magnitude": 250.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "early_termination_target_error": {"magnitude": 0.0, "unit": "kilocalorie / mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_minimum_time": {"magnitude": 500.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "n_replicas": 14}, "solvent_equil_simulation_settings": {"__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.2, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.5, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "equilibration_length_nvt": {"magnitude": 0.1, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "solvent_simulation_settings": {"__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.009999999999999998, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.4999999999999999, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "time_per_iteration": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_interval": {"magnitude": 250.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "early_termination_target_error": {"magnitude": 0.0, "unit": "kilocalorie / mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_minimum_time": {"magnitude": 500.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "n_replicas": 14}, "vacuum_equil_output_settings": {"__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "checkpoint.chk", "trajectory_write_interval": {"magnitude": 20.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "equil_nvt_structure": null, "equil_npt_structure": "equil_structure.pdb", "production_trajectory_filename": "production_equil.xtc", "preminimized_structure": "system.pdb", "minimized_structure": "minimized.pdb", "log_output": "equil_simulation.log"}, "vacuum_output_settings": {"__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "vacuum_checkpoint.nc", "output_filename": "vacuum.nc", "output_structure": "hybrid_system.pdb"}, "solvent_equil_output_settings": {"__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "checkpoint.chk", "trajectory_write_interval": {"magnitude": 20.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "equil_nvt_structure": "equil_nvt_structure.pdb", "equil_npt_structure": "equil_npt_structure.pdb", "production_trajectory_filename": "production_equil.xtc", "preminimized_structure": "system.pdb", "minimized_structure": "minimized.pdb", "log_output": "equil_simulation.log"}, "solvent_output_settings": {"__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "solvent_checkpoint.nc", "output_filename": "solvent.nc", "output_structure": "hybrid_system.pdb"}, "partial_charge_settings": {"__class__": "OpenFFPartialChargeSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "partial_charge_method": "am1bcc", "off_toolkit_backend": "ambertools", "number_of_conformers": null, "nagl_model": null}}, "__qualname__": "AbsoluteSolvationProtocol", "__module__": "openfe.protocols.openmm_afe.equil_solvation_afe_method", ":version:": 1}, "stateA": {"components": {"ligand": {"atoms": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], "bonds": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], "conformer": ["\u0093NUMPY\u0001\u0000v\u0000{'descr': '\u00ae \u00b5\u0092\u00d1?\u008bl\u0012/_X\u00bd?\u009e\u00d6\u00b4\u00d9x5\u00a4?\u00afs\u0092\u0018\u00ffT\u008a?{$b\u00d2\u00dd\u00e2\u0087?\u00cd\u008b\u00d8\u00f3mK\u0080?\u009d|(8\u0011il?\u00bb\u00d0\u00c5\u00fc5aK?\u00c9\u0018\u001b\u00a6H\u00a5\u0018?\u009c\u00b4_\u00bdRQ\u00d9>\u00b72\\R\u00fe\u00bf\u0097>t\u00ca+\u0089!0F>N\u00f4\u00ccc\u00a0\u00fe\u00e1=\u00e1>\u00ae \u00b5\u0092\u00d1?\u00b9z\u001b\u009d\u00eb\u00c3\u00d1?\u000f\u0098x\u00eb6C\u00c9?\u00d1\u00e5\u00a8V/\u00f6\u00bb?^\u0080\u00be\u00f1e\u00cd\u00ab?\u009c\u008eO9\u0019\u000f\u00a7?\u00b7X\u00c8\u00d4\u0017\u008c\u009c?d\u00d6\u0086\u00b5\u00ff\u00ea\u0086?\u00cc\u000e\u008b\u0086\u0019\u00dbd?\u00e9\u00f1\u00a9r()2?\u00ec\u0016\u00da\u00a3\u008ej\u00f2>\u00f8)\u00a9\u0002\u00ae9\u00b1>\u0019Qd\u0090\u00bf\u001d`>\u0092.\u00ab\u00e6\u0094|\u00fa=\u008bl\u0012/_X\u00bd?\u000f\u0098x\u00eb6C\u00c9?%\u00a9\u00ec\u00e9\u00f1O\u00cb?\u00e1\u001e={5T\u00c6?\u0005\u00d1Y4\u00bf\u008e\u00bf?\u00d6^}\u00f3f\u008c\u00b8?&\u00147+\u00e5A\u00ac?lo\u00b9\u0004\u00b7K\u0095?\u0004\u00c6l\u00b6\u00ba\u0085r?\u00a1\u00b7\u00de\u00f6\u00d2j??o\u0090\u00e8\u0007\u00a1\u008d\u00ff>\u009d-\u00d7\u00fa\u0090x\u00bd>l:G\u00a3\u0004\u00a5k>\u00bf\r:\u00da/\u0005\u0007>\u009e\u00d6\u00b4\u00d9x5\u00a4?\u00d1\u00e5\u00a8V/\u00f6\u00bb?\u00e1\u001e={5T\u00c6?\u000fcX\u0095\u00c9Y\u00ca?\u00cd\u00f9nF\u00e1\u00e6\u00c9?\u00ccj8g\u00f77\u00c3?\u009e\u0015\r\u001e\u0007\u00fe\u00b4?\u0096\u0084\u00ae\n\u009eF\u009e?S'\u0094\u0089j\u0086y?{\u001f\u00fc\u0087^@E?\u009f\u00c5y\u00f4H0\u0005?\u00ffPJ`\u00f0\u00c1\u00c3>\u00aa\u0099T\u00be\u00f2\u008br>\u00efL]\u0015\u009f\u0014\u000f>\u00afs\u0092\u0018\u00ffT\u008a?^\u0080\u00be\u00f1e\u00cd\u00ab?\u0005\u00d1Y4\u00bf\u008e\u00bf?\u00cd\u00f9nF\u00e1\u00e6\u00c9?\u00fd\u0000\u0084\t\u00c6\u001d\u00d1?\u00fb\u00a5\u000fJ]\u00b2\u00c8?\"DY.\u009b7\u00ba?f~\u00f4\u0097\u00b2{\u00a2?\u0099Y\u00aa\u00a3`\u00af~?\u00cf\u00e4\u00fb)h\u00f9\u0007\u009f\u00e9u>4\u0091\u009aP\u0099[\u0012>{$b\u00d2\u00dd\u00e2\u0087?\u009c\u008eO9\u0019\u000f\u00a7?\u00d6^}\u00f3f\u008c\u00b8?\u00ccj8g\u00f77\u00c3?\u00fb\u00a5\u000fJ]\u00b2\u00c8?\u00a3\u00ef~\u0086\u00d5\u001d\u00cb?i\u00b2\u0094\u00b7\u0019n\u00c6?\u0012\u00ed\u00f0MS\u00f8\u00b6?\u00d5\u00e3\u00dc\u008b\u0083\u00ea\u0098?)\u00f7\u00e4\u00ec\u00e4Kh?\u00b7N\u008b\u00bc\u00e1\u000f*?\u00ff\u0097\nR\u0018\u00f2\u00e8>Z}\bp<\u00a6\u0097>\u00ae\u00e2\u0019\u0015\u00feW3>\u00cd\u008b\u00d8\u00f3mK\u0080?\u00b7X\u00c8\u00d4\u0017\u008c\u009c?&\u00147+\u00e5A\u00ac?\u009e\u0015\r\u001e\u0007\u00fe\u00b4?\"DY.\u009b7\u00ba?i\u00b2\u0094\u00b7\u0019n\u00c6?\u00b1\u0017)#Ap\u00cf?\u00a8)\u00f1\u0016\u00e6p\u00ca?Qy\u00d5\u00d3\u009c5\u00b5?XcTJc\f\u008b?\u00af\t\u001f\u0082k\u00b9P?\u00b4\u0016KwI\u0011\u0011?\u00a9U\u0094\u00d7\u00f7\u00eb\u00c0>\u0017\u00a6`nO_\\>\u009d|(8\u0011il?d\u00d6\u0086\u00b5\u00ff\u00ea\u0086?lo\u00b9\u0004\u00b7K\u0095?\u0096\u0084\u00ae\n\u009eF\u009e?f~\u00f4\u0097\u00b2{\u00a2?\u0012\u00ed\u00f0MS\u00f8\u00b6?\u00a8)\u00f1\u0016\u00e6p\u00ca?RxMh\u00f3\u00e9\u00d3?s\u00a3\u0001\u00c0c\u00cb\u00cc?q:\u00da\u00a4\u00c8\u008c\u00ae?\u00b7\u0084\u0010\u009a\u00b3\u00ddy?\u00d3\u00ba/^\u00d0\u00dc>?4\u00a7\n\u00b7H@\u00f1>8J\u00fb4\u00ab\u008d\u008f>\u00bb\u00d0\u00c5\u00fc5aK?\u00cc\u000e\u008b\u0086\u0019\u00dbd?\u0004\u00c6l\u00b6\u00ba\u0085r?S'\u0094\u0089j\u0086y?\u0099Y\u00aa\u00a3`\u00af~?\u00d5\u00e3\u00dc\u008b\u0083\u00ea\u0098?Qy\u00d5\u00d3\u009c5\u00b5?s\u00a3\u0001\u00c0c\u00cb\u00cc?)w\u00ff\u00f6\u00af\u00cf\u00d7?\u00db\u00fc\u00e3ap\u00f8\u00cc?$\u00e6\"#K\u0016\u00a6?\u0087\u0093\u00bf3\u00f6kr?\u0083\u008f`ce\u00b7+?\u00bd\u00b1\u0004\u0093\u00e0z\u00d1>\u00c9\u0018\u001b\u00a6H\u00a5\u0018?\u00e9\u00f1\u00a9r()2?\u00a1\u00b7\u00de\u00f6\u00d2j??{\u001f\u00fc\u0087^@E?\u00cf\u00e4\u00fb\u00ec\u0016\u00da\u00a3\u008ej\u00f2>o\u0090\u00e8\u0007\u00a1\u008d\u00ff>\u009f\u00c5y\u00f4H0\u0005??\u00ca\u00feC\n\u001c\t?\u00b7N\u008b\u00bc\u00e1\u000f*?\u00af\t\u001f\u0082k\u00b9P?\u00b7\u0084\u0010\u009a\u00b3\u00ddy?$\u00e6\"#K\u0016\u00a6?\u00c7\"\u0082AC\u001f\u00cd?[\u00e8W\u00d2\u00a7\u0001\u00da?\u00f2\u00d7j\u00cfm|\u00cd?\u00e1\u009bW\u00e9\u008d\u00a2\u00b1?!\u00d4\u00a2\u00ba\u00cft\u0090?\u00b72\\R\u00fe\u00bf\u0097>\u00f8)\u00a9\u0002\u00ae9\u00b1>\u009d-\u00d7\u00fa\u0090x\u00bd>\u00ffPJ`\u00f0\u00c1\u00c3>\u007f^\u009d\u0001\u0093^\u00c7>\u00ff\u0097\nR\u0018\u00f2\u00e8>\u00b4\u0016KwI\u0011\u0011?\u00d3\u00ba/^\u00d0\u00dc>?\u0087\u0093\u00bf3\u00f6kr?x\u00a4\u00ee4B\u00fd\u00a7?\u00f2\u00d7j\u00cfm|\u00cd?w\u0006\u00c5\u00c7ih\u00d5?\u00895\n\u00dd\u0092g\u00cf?\u0098\\\u00c5\u00b9A\u00a6\u00c1?t\u00ca+\u0089!0F>\u0019Qd\u0090\u00bf\u001d`>l:G\u00a3\u0004\u00a5k>\u00aa\u0099T\u00be\u00f2\u008br>)h\u00f9\u0007\u009f\u00e9u>Z}\bp<\u00a6\u0097>\u00a9U\u0094\u00d7\u00f7\u00eb\u00c0>4\u00a7\n\u00b7H@\u00f1>\u0083\u008f`ce\u00b7+?\u00bc=q\u008b\u008e\u008dq?\u00e1\u009bW\u00e9\u008d\u00a2\u00b1?\u00895\n\u00dd\u0092g\u00cf?{7\u0085}\u0000\u001e\u00d6?\u00d6&\u00cf|\u0095{\u00d5?N\u00f4\u00ccc\u00a0\u00fe\u00e1=\u0092.\u00ab\u00e6\u0094|\u00fa=\u00bf\r:\u00da/\u0005\u0007>\u00efL]\u0015\u009f\u0014\u000f>4\u0091\u009aP\u0099[\u0012>\u00ae\u00e2\u0019\u0015\u00feW3>\u0017\u00a6`nO_\\>8J\u00fb4\u00ab\u008d\u008f>\u00bd\u00b1\u0004\u0093\u00e0z\u00d1>\u00ea\u00c5y\u00f9\u00041*?!\u00d4\u00a2\u00ba\u00cft\u0090?\u0098\\\u00c5\u00b9A\u00a6\u00c1?\u00d6&\u00cf|\u0095{\u00d5?v\u008a\u000e\u00f7QS\u00e0?"}}}, "forward_and_reverse_energies": {"fractions": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0088\u008e\u00e1\u00c5y\u00e8\u00b8?\u009a\u0099\u0099\u0099\u0099\u0099\u00c9?o0E>\u00eb\u0006\u00d3?\u009a\u0099\u0099\u0099\u0099\u0099\u00d9?<\u00fd\u0011\u000b\u00b8\u00d3\u00df?333333\u00e3?\u0004e\u00efkBP\u00e6?\u009a\u0099\u0099\u0099\u0099\u0099\u00e9?k\u00cbU\u00d2\u00a8\u00b6\u00ec?\u0000\u0000\u0000\u0000\u0000\u0000\u00f0?"}}, "forward_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00a1\u0015\"\u009c\u00be\u00ea\u0011@\u0012\u007f\u008co\u00197\t@\u00f7s\u00d1\u00da\u00e4\u00e3\f@\u0092\u00f6\u00a3\u00e6G=\u00e2?\n\u00f5h\u00a1\u00c6\u00db\u00c0\u00bf\u00a2\u00b9\u0005\u00bf\u00ac\u00fe\u00e3?^E\u0014\u008cN,\u00f2\u00bf\u0002\u0004\u00ef4j\u00a4\u00ec\u00bf\u00bf`\u00b3\u008b\u000b\u00f3\u00fb\u00bf\u00d7\u0093\u00e8V49\u00fa\u00bf"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forward_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00aaT\u00df\u008d\u00fd\u0014\u00d9?\u00d8\u0001\u00fc\u0089\u0017\u0006\u00d3?\u00c5L\u00e2\u00f9I@\u00ce?\u0018'\u0006Y3y\u00cd?\u00ac\u00ab\\\u00bf\u00e0\u0017\u00cb?\u00f3D\u00a1\u00b8\u00b3\u0007\u00c8?\u00d3\u00f1\u008c\u00d1\r\u00a9\u00c7?\u00e8\u00ccI\u00a8y\u00fd\u00c5?\u00af1\u00bd\u0003\u008fy\u00c5?\u0007\u00b4\u00e6m\u009aL\u00c4?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "9\u009e\u00c7\u00b5b\u00c5\u0002\u00c0l\u00ff\u0091\u0090b\u00fc\u0015\u00c0o\u00b7\u00a6\u0012\u008aG\u00fd\u00bf\u001e\u009f\u00bb/\u00f6\u00c8\u0018\u00c0\u001c\u008dR\u001b\u00fe3\r\u00c0\u00c4&\u0004Aq\u0002\u000b\u00c0>\u00b7\u00ba\u00cep\u00d0\u0014\u00c0/\u0093\u008b\u008e\u00c7~\t\u00c0y\fc\u00ae\u00ba\u0002\u0006\u00c0\u00d7\u0093\u00e8V49\u00fa\u00bf"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0085'$\u0012[\u00f9\u00e0?\u00f3\u00d4\u00d7\u00ce\u00f2\r\u00da?3\u00cc\u00b2\u00c8\u00da\u001b\u00d3?\u00ae\u0091,\u00d4\u0095\u00d0\u00d2?uVe\u00f8\u00b5\b\u00cf?u\t\u0012a\u00c6\u00dd\u00cb?O\u00c5\u00db\u00e2\u00d2F\u00cb?\u00a8p\u0010Z\u008e\u00c2\u00c7?\u001fO\u00e3v\u00b8A\u00c6?\u0007\u00b4\u00e6m\u009aL\u00c4?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "production_iterations": 185.4853057861328, "equilibration_iterations": 6.0, "replica_exchange_statistics": {"eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00e9\u00ff\u00ff\u00ff\u00ff\u00ff\u00ef?0\u00be\r\u0085K\f\u00ef?\u0012\u00bb~f\u0084\u00ea\u00ea??h\u00cc\u00bfS\u00c5\u00e6?L!\u00ca\u00c2H\u00c9\u00e3?\u00a3PdB:P\u00df?\u00e5#\u00bd\u00e9\u00f9\u008e\u00d6?\u00bf\u00a6\u00e5~\u00cf\u00f0\u00d4?\u009dA\u0014\b\u00f0\u00ce\u00d0?\b%\u00e7U\u008e\u0000\u00c5?A\tp0\u00d7\u00dc\u00c2?ug\u00d6\u00e5\f\u00a7\u00b7?\u00be.\u001dD\u0081\u00e1\u009c?Y<\u00d2Dc0\u0087?"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00aeUg\u00fdx\u0093\u00e4?\u008a\u00f3w]\u00fcB\u00cb?|\u001aa\u00b9\u00a7\u0011\u00b6?F=r4\u00a7\u00f6\u0099?\u00e8%\u00b3c@\u0014\u008d?\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u00e8%\u00b3c@\u0014}?`\u0083\u00af\u00a6\u00db\u009d`?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u008a\u00f3w]\u00fcB\u00cb?\u0003\u0087l\u000bR\u00aa\u00d8?\u009d\u00f5\u00e3M\u00d2\u00b7\u00c6?+\u00c1\u00a8,\u0012\u00e1?\u00d3\u00d2\u00d2\u00d2\u00d2\u00d2\u00c2?|5\u00dd\u00ee\u0084\u0000\u009b?`\u0083\u00af\u00a6\u00db\u009d`?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?\u0010E\u0007z\u00c9\u00ecx?\u00e8%\u00b3c@\u0014\u008d?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00d3\u00d2\u00d2\u00d2\u00d2\u00d2\u00c2?\u00fb\f\u00a3\u001e9\u009a\u00e3?\u00da1 \u008a\u000e\u00f4\u00c2?8d[\u0090R\u00c5\u0094?8d[\u0090R\u00c5t?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?`\u0083\u00af\u00a6\u00db\u009d`?\u0010E\u0007z\u00c9\u00ecx?|5\u00dd\u00ee\u0084\u0000\u009b?\u00da1 \u008a\u000e\u00f4\u00c2?I\u00c4\u00de?\u00f9\u00a0\u00e2?\u00b2\u0012\u00ccs\u0085\u001b\u00c7?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009d`?8d[\u0090R\u00c5\u0094?\u00b2\u0012\u00ccs\u0085\u001b\u00c7?[u\u00d6\u008f7I\u00df?\u00c0\u00eb\u00e2\u0017\u00daL\u00cc?\u0089\u00d8\u00fb'\u001fT\u00b6?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00008d[\u0090R\u00c5t?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00c0\u00eb\u00e2\u0017\u00daL\u00cc?\u00c6J0\u00cf\u0015n\u00dc?4\u00a7\u00f6\u0019F=\u00d2?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u0089\u00d8\u00fb'\u001fT\u00b6?4\u00a7\u00f6\u0019F=\u00d2?\u0085\u001b\u0097\u00b1\u0012\u00cc\u00e3?"}}}}, "start_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:15:35.964193"}, "end_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:24:08.581624"}, "__qualname__": "ProtocolUnitResult", "__module__": "gufe.protocols.protocolunit", ":version:": 1}]}, "vacuum": {"279370490201278614325565891219309171778": [{"name": "Absolute Solvation, benzene vacuum leg: repeat 0 generation 0", "_key": "ProtocolUnitResult-4e48b3dcdbf44c828added08e40a0781", "source_key": "AbsoluteSolvationVacuumUnit-718f88d975dc4a4aacc6e60f688d3bbb", "inputs": {"protocol": {"settings": {"__class__": "AbsoluteSolvationSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true, "protocol_repeats": 1, "solvent_forcefield_settings": {"__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "constraints": "hbonds", "rigid_water": true, "hydrogen_mass": 3.0, "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "small_molecule_forcefield": "openff-2.0.0", "nonbonded_cutoff": {"magnitude": 1.0, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "nonbonded_method": "PME"}, "vacuum_forcefield_settings": {"__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "constraints": "hbonds", "rigid_water": true, "hydrogen_mass": 3.0, "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "small_molecule_forcefield": "openff-2.0.0", "nonbonded_cutoff": {"magnitude": 1.0, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "nonbonded_method": "nocutoff"}, "thermo_settings": {"__class__": "ThermoSettings", "__module__": "gufe.settings.models", ":is_custom:": true, "temperature": {"magnitude": 298.15, "unit": "kelvin", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "pressure": {"magnitude": 0.9869232667160129, "unit": "standard_atmosphere", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "ph": null, "redox_potential": null}, "solvation_settings": {"__class__": "OpenMMSolvationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "solvent_model": "tip3p", "solvent_padding": {"magnitude": 1.2, "unit": "nanometer", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "alchemical_settings": {"__class__": "AlchemicalSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true}, "lambda_settings": {"__class__": "LambdaSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", ":is_custom:": true, "lambda_elec": [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "lambda_vdw": [0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0], "lambda_restraints": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "vacuum_engine_settings": {"__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "compute_platform": null}, "solvent_engine_settings": {"__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "compute_platform": "CUDA"}, "integrator_settings": {"__class__": "IntegratorSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "timestep": {"magnitude": 4.0, "unit": "femtosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "langevin_collision_rate": {"magnitude": 1.0, "unit": "1 / picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "barostat_frequency": {"magnitude": 25.0, "unit": "timestep", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "remove_com": false, "reassign_velocities": false, "n_restart_attempts": 20, "constraint_tolerance": 1e-06}, "vacuum_equil_simulation_settings": {"__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.2, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.5, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "equilibration_length_nvt": null}, "vacuum_simulation_settings": {"__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.009999999999999998, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.4999999999999999, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "time_per_iteration": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_interval": {"magnitude": 250.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "early_termination_target_error": {"magnitude": 0.0, "unit": "kilocalorie / mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_minimum_time": {"magnitude": 500.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "n_replicas": 14}, "solvent_equil_simulation_settings": {"__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.2, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.5, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "equilibration_length_nvt": {"magnitude": 0.1, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "solvent_simulation_settings": {"__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "equilibration_length": {"magnitude": 0.009999999999999998, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "production_length": {"magnitude": 0.4999999999999999, "unit": "nanosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "minimization_steps": 5000, "time_per_iteration": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_interval": {"magnitude": 250.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "early_termination_target_error": {"magnitude": 0.0, "unit": "kilocalorie / mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "real_time_analysis_minimum_time": {"magnitude": 500.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "n_replicas": 14}, "vacuum_equil_output_settings": {"__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "checkpoint.chk", "trajectory_write_interval": {"magnitude": 20.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "equil_nvt_structure": null, "equil_npt_structure": "equil_structure.pdb", "production_trajectory_filename": "production_equil.xtc", "preminimized_structure": "system.pdb", "minimized_structure": "minimized.pdb", "log_output": "equil_simulation.log"}, "vacuum_output_settings": {"__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "vacuum_checkpoint.nc", "output_filename": "vacuum.nc", "output_structure": "hybrid_system.pdb"}, "solvent_equil_output_settings": {"__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "checkpoint.chk", "trajectory_write_interval": {"magnitude": 20.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "equil_nvt_structure": "equil_nvt_structure.pdb", "equil_npt_structure": "equil_npt_structure.pdb", "production_trajectory_filename": "production_equil.xtc", "preminimized_structure": "system.pdb", "minimized_structure": "minimized.pdb", "log_output": "equil_simulation.log"}, "solvent_output_settings": {"__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "checkpoint_interval": {"magnitude": 1.0, "unit": "picosecond", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forcefield_cache": "db.json", "output_indices": "not water", "checkpoint_storage_filename": "solvent_checkpoint.nc", "output_filename": "solvent.nc", "output_structure": "hybrid_system.pdb"}, "partial_charge_settings": {"__class__": "OpenFFPartialChargeSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", ":is_custom:": true, "partial_charge_method": "am1bcc", "off_toolkit_backend": "ambertools", "number_of_conformers": null, "nagl_model": null}}, "__qualname__": "AbsoluteSolvationProtocol", "__module__": "openfe.protocols.openmm_afe.equil_solvation_afe_method", ":version:": 1}, "stateA": {"components": {"ligand": {"atoms": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], "bonds": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], "conformer": ["\u0093NUMPY\u0001\u0000v\u0000{'descr': '\u00e2Z5\u00c23LH=\u009d\u00a2I \u0000\u0005\u00e9<-\u009e\u00a3\u00d5\u0098x\u0099;p\u00a4\u0086\u0010`@\u00cf8h\u007f\u00b0\u00a2h\u00a5\u00fa1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Yo\u00e4QiC\r\u00af\u0014\"8\u0094\u00112\u00d3\u00b1`s\u0013\u00a0T\u00c0-\u00b5\u00f2\u0012\u000e\u00c4\u00b3\u000e\u008b\u00b5\u0000\u0000\u0000\u0000\u0000\u00d13\u00b6"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "t\u008d\u00ae\u00c0\u00f5K\u00b2?J\u00a8\u00e3\u00f3\u0012K\u00b2?\b\u001f\u00a9\u00c1@J\u00b2?#\u00fc\u0096\u00ebdI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?J\u00a8\u00e3\u00f3\u0012K\u00b2?\u0004\u00e3\u001e\u0081wJ\u00b2?<\u00d6\u0015k\u00e7I\u00b2?y^\u00a9\u00b4PI\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\b\u001f\u00a9\u00c1@J\u00b2?<\u00d6\u0015k\u00e7I\u00b2?\u0018>\u0013\u0099\u0094I\u00b2?\f\u00a7\u00c6\u00f4=I\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?#\u00fc\u0096\u00ebdI\u00b2?y^\u00a9\u00b4PI\u00b2?\f\u00a7\u00c6\u00f4=I\u00b2?\u00f5\u00fa\u00d7T*I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?"}}}, "forward_and_reverse_energies": {"fractions": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00ec\f\u00b0\u001e\u00e2\b\u00b9?\u008d\u00ba\r\u009b@p\u00c9?R\u00b7a\u0013\b.\u00d3?\u008d\u00ba\r\u009b@p\u00d9?\u0098\u0094\u00e8`(\u00e6\u00df?R\u00b7a\u0013\b.\u00e3?\u00ef\u00b87W$O\u00e6?\u00f5%%:\u0018\u008a\u00e9?\u00fa\u0092\u0012\u001d\f\u00c5\u00ec?\u0000\u0000\u0000\u0000\u0000\u0000\u00f0?"}}, "forward_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0098[A\u00d4\u00ef&\u0003\u00c0W\u00ee#Az$\u0003\u00c0/*;\u000b\u00d9#\u0003\u00c0(\u000ebf\u00ba%\u0003\u00c0\u00afM\u00d0\u0085\u0083%\u0003\u00c0\u0094\u008b\u0005\u00bd*%\u0003\u00c0\u001fQ=j\u0090$\u0003\u00c0\u0017\u0085G\u00d4i$\u0003\u00c0\u00c0\u00b5\u00ff\u00bd_$\u0003\u00c0e\u00b2r\u0093\u0003$\u0003\u00c0"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forward_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "[Q)\u00a6\u00ee\u0093K?_E0Ot\u00f1B?\u00c9\u00023\u0012\u00cc\u0086>?\u0006bo'Y\u00cf;?\u00a5\u009e\u00ed\u00c8\u0094\u00a58?Cq~m\u00baI6?t5\u00e5\u00dc\u009e\u00a34?H\u00eb\u00e1\u0093\u0018F3?a\u00a6\u0001\tHJ2?\u00f7J\u0084\u00a2|f1?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00b9\u00d8\u0093\u0011\u00c5 \u0003\u00c05\u001d\u00eea\u0094\"\u0003\u00c0\u00a3pu\u0013\u00be\"\u0003\u00c0\u00ad\u00f2\u00e4\u0013X\"\u0003\u00c0\t\u00af\u00ca\u0091\u0085\"\u0003\u00c0\u00a6\u00e3/\u0095\u00e8\"\u0003\u00c0\u00cbe\u00be\u00eb\u0002$\u0003\u00c0'\u0085\u00f5\u0095\u00da#\u0003\u00c0\u000f\u00f0.\u00cb\u00b2#\u0003\u00c0e\u00b2r\u0093\u0003$\u0003\u00c0"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": ">p\u000f\u00f6\u00d7\u00baL?\u0093\u00f5lUmVD?\u00ea({\u008f\u00f46@?\u008796C{\u00e9;?\u0013\u001bh\u0011\u00f0\u00988?gh\u009d\u00bb\u00f2\\6?\u0083t\u00ce\u00a8k&5?\u00e3\u00b5\u00a6U\u0084\u00953?l\u00f2?\u00fd\u00b5^2?\u00f7J\u0084\u00a2|f1?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "production_iterations": 317.3360900878906, "equilibration_iterations": 11.0, "replica_exchange_statistics": {"eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00fb\u00ff\u00ff\u00ff\u00ff\u00ff\u00ef?\u00e0\u0098\u00b1\u0086\u00e6>\u00b0?ST\u00b8\bDn\u00ab?\u00b3]\u001daw\u00ed\u00a0?\u00e1\u0081\u00d5K\u00e8\r\u009a?W\u00a7b\u00f39a\u0085?(\u00db\u001d\u0084\u00d7\u00e2M\u00bfM\u00af\u00e2\u00f1\u00f0\u00d8y\u00bf\u00ab\u00fc\u008b\u00be\u00cb\u0003\u0094\u00bf\u00ea\r%\u0087\u0001\u00c8\u0096\u00bf\u00f9\u00bb+\u008e.g\u009f\u00bf\u00c0\n\u00ec\u0012\u00aaY\u00a1\u00bf\u00b9\u00b9\u009f\u0006\u00a9-\u00aa\u00bf\u0015\u0001\u00ee\u00feX\u00bb\u00ac\u00bf"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0011\u00ac\u00a3\u00cd\u00fb\u0014\u00b7?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u0082u\u00b4y\u009f\u00e2\u00b2?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?&C\u00b0\u008e6\u00ef\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00a8\u00b8d\b\u00d6\u00d1\u00b6?\u00ce\u00fb\u0014\u0097\f\u00c1\u00aa?v\u00b4y\u009f\u00e2\u0092\u00b1?G\u009b\u00f7).\u0019\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?\u00b4y\u009f\u00e2\u0092!\u00b8?\r\u00c1:\u00da\u00bcO\u00b1?\u00e7}\u008aK\u0086`\u00ad?;\u00da\u00bcOq\u00c9\u00b0?\u008f6\u00efS\\2\u00b4?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00f8).\u0019\u0082u\u00b4?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?C\u00b0\u008e6\u00efS\u00ac?\u00de\u00a7\u00b8d\b\u00d6\u00b1?.\u0019\u0082u\u00b4y\u00af?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?T\\2\u0004\u00ebh\u00b3?\u00d6\u00d1\u00e6}\u008aK\u00b6?.\u0019\u0082u\u00b4y\u00af?&C\u00b0\u008e6\u00ef\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?;\u00da\u00bcOq\u00c9\u00b0?G\u009b\u00f7).\u0019\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?m\u00de\u00a7\u00b8d\b\u00b6?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?&C\u00b0\u008e6\u00ef\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?*.\u0019\u0082u\u00b4\u00a9?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?.\u0019\u0082u\u00b4y\u00af?G\u009b\u00f7).\u0019\u00b2?\u009b\u00f7).\u0019\u0082\u00b5?.\u0019\u0082u\u00b4y\u00af?\u009b\u00f7).\u0019\u0082\u00b5?\u00f8).\u0019\u0082u\u00b4?\u0086`\u001dm\u00de\u00a7\u00b8?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\\2\u0004\u00ebh\u00f3\u00ae?v\u00b4y\u009f\u00e2\u0092\u00b1?\u008aK\u0086`\u001dm\u00ae?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?.\u0019\u0082u\u00b4y\u00af?;\u00da\u00bcOq\u00c9\u00b0?T\\2\u0004\u00ebh\u00b3?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b0\u008e6\u00efS\\\u00b2?\u00b0\u008e6\u00efS\\\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b4y\u009f\u00e2\u0092!\u00b8?\r\u00c1:\u00da\u00bcO\u00b1?m\u00de\u00a7\u00b8d\b\u00b6?\u009b\u00f7).\u0019\u0082\u00b5?T\\2\u0004\u00ebh\u00b3?\u00e7}\u008aK\u0086`\u00ad?i\u00f3>\u00c5%C\u00b0?\u0019\u0082u\u00b4y\u009f\u00b2?\u00e7}\u008aK\u0086`\u00ad?\\2\u0004\u00ebh\u00f3\u00ae?m\u00de\u00a7\u00b8d\b\u00b6?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?&C\u00b0\u008e6\u00ef\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00f8).\u0019\u0082u\u00b4?\u0004\u00ebh\u00f3>\u00c5\u00b5?i\u00f3>\u00c5%C\u00b0?i\u00f3>\u00c5%C\u00b0?\u009f\u00e2\u0092!XG\u00ab?\u00bdOq\u00c9\u0010\u00ac\u00b3?T\\2\u0004\u00ebh\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00c9\u0010\u00ac\u00a3\u00cd\u00fb\u00b4?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00e7}\u008aK\u0086`\u00ad?v\u00b4y\u009f\u00e2\u0092\u00b1?&C\u00b0\u008e6\u00ef\u00b3?\u0086`\u001dm\u00de\u00a7\u00b8?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u0019\u0082u\u00b4y\u009f\u00b2?\u009f\u00e2\u0092!XG\u00ab??\u00c5%C\u00b0\u008e\u00b6?\u009f\u00e2\u0092!XG\u00ab?G\u009b\u00f7).\u0019\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0082u\u00b4y\u009f\u00e2\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?;\u00da\u00bcOq\u00c9\u00b0?T\\2\u0004\u00ebh\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00e7}\u008aK\u0086`\u00ad?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u009f\u00e2\u0092!XG\u00ab?\u00f8).\u0019\u0082u\u00b4?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a8\u00b8d\b\u00d6\u00d1\u00b6?\u008f6\u00efS\\2\u00b4?\u00d6\u00d1\u00e6}\u008aK\u00b6?*.\u0019\u0082u\u00b4\u00a9?\\2\u0004\u00ebh\u00f3\u00ae?\u00b0\u008e6\u00efS\\\u00b2?\\2\u0004\u00ebh\u00f3\u00ae?T\\2\u0004\u00ebh\u00b3?G\u009b\u00f7).\u0019\u00b2?\u0082u\u00b4y\u009f\u00e2\u00b2?C\u00b0\u008e6\u00efS\u00ac?\u00b0\u008e6\u00efS\\\u00b2?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00ce\u00fb\u0014\u0097\f\u00c1\u00aa?a\u001dm\u00de\u00a7\u00b8\u00b4?.\u0019\u0082u\u00b4y\u00af?\u0082u\u00b4y\u009f\u00e2\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00b0\u008e6\u00efS\\\u00b2?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b0\u008e6\u00efS\\\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?\u0019\u0082u\u00b4y\u009f\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00f8).\u0019\u0082u\u00b4?&C\u00b0\u008e6\u00ef\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u008aK\u0086`\u001dm\u00ae?\r\u00c1:\u00da\u00bcO\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\r\u00c1:\u00da\u00bcO\u00b1?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u0019\u0082u\u00b4y\u009f\u00b2?;\u00da\u00bcOq\u00c9\u00b0?2\u0004\u00ebh\u00f3>\u00b5?G\u009b\u00f7).\u0019\u00b2?\u00d2\u00e6}\u008aK\u0086\u00b0?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?\u00c9\u0010\u00ac\u00a3\u00cd\u00fb\u00b4?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00b0\u008e6\u00efS\\\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00de\u00a7\u00b8d\b\u00d6\u00b1?2\u0004\u00ebh\u00f3>\u00b5?C\u00b0\u008e6\u00efS\u00ac?"}}}}, "start_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:14:16.112945"}, "end_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:15:35.963930"}, "__qualname__": "ProtocolUnitResult", "__module__": "gufe.protocols.protocolunit", ":version:": 1}]}}, "__qualname__": "AbsoluteSolvationProtocolResult", "__module__": "openfe.protocols.openmm_afe.equil_solvation_afe_method", ":version:": 1}, "unit_results": {"ProtocolUnitResult-7571b445816d4ea383e1be915c41b24f": {"name": "Absolute Solvation, benzene solvent leg: repeat 0 generation 0", "_key": "ProtocolUnitResult-7571b445816d4ea383e1be915c41b24f", "source_key": "AbsoluteSolvationSolventUnit-1d05404cbfd246fb9fd8e8256d6280c5", "inputs": {"protocol": {":gufe-key:": "AbsoluteSolvationProtocol-d127cf265cfd04054dfd96001983268b"}, "stateA": {":gufe-key:": "ChemicalSystem-bccec9dd1e516db5ac7ff2763fdd4f7c"}, "stateB": {":gufe-key:": "ChemicalSystem-fed9973d1274c4ca7a68fc66a0a753da"}, "alchemical_components": {"stateA": [{":gufe-key:": "SmallMoleculeComponent-b01ddf596bc809274f3809d9878c60ba"}], "stateB": []}, "repeat_id": 23375512213741230270651942912798595258, "generation": 0}, "outputs": {"repeat_id": 23375512213741230270651942912798595258, "generation": 0, "simtype": "solvent", "nc": {"__class__": "PosixPath", "__module__": "pathlib", ":is_custom:": true, "path": "results/benzene/shared_AbsoluteSolvationSolventUnit-1d05404cbfd246fb9fd8e8256d6280c5_attempt_0/solvent.nc"}, "last_checkpoint": "solvent_checkpoint.nc", "unit_estimate": {"magnitude": -1.6389659304488668, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "unit_estimate_error": {"magnitude": 0.15858774534481787, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "unit_mbar_overlap": {"scalar": 0.04105662489713835, "eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "4\u0000\u0000\u0000\u0000\u0000\u00f0?{\u000bY\u0004\u00aa\u00af\u00ee?:_\u00c5w\u00ae \u00b5\u0092\u00d1?\u008bl\u0012/_X\u00bd?\u009e\u00d6\u00b4\u00d9x5\u00a4?\u00afs\u0092\u0018\u00ffT\u008a?{$b\u00d2\u00dd\u00e2\u0087?\u00cd\u008b\u00d8\u00f3mK\u0080?\u009d|(8\u0011il?\u00bb\u00d0\u00c5\u00fc5aK?\u00c9\u0018\u001b\u00a6H\u00a5\u0018?\u009c\u00b4_\u00bdRQ\u00d9>\u00b72\\R\u00fe\u00bf\u0097>t\u00ca+\u0089!0F>N\u00f4\u00ccc\u00a0\u00fe\u00e1=\u00e1>\u00ae \u00b5\u0092\u00d1?\u00b9z\u001b\u009d\u00eb\u00c3\u00d1?\u000f\u0098x\u00eb6C\u00c9?\u00d1\u00e5\u00a8V/\u00f6\u00bb?^\u0080\u00be\u00f1e\u00cd\u00ab?\u009c\u008eO9\u0019\u000f\u00a7?\u00b7X\u00c8\u00d4\u0017\u008c\u009c?d\u00d6\u0086\u00b5\u00ff\u00ea\u0086?\u00cc\u000e\u008b\u0086\u0019\u00dbd?\u00e9\u00f1\u00a9r()2?\u00ec\u0016\u00da\u00a3\u008ej\u00f2>\u00f8)\u00a9\u0002\u00ae9\u00b1>\u0019Qd\u0090\u00bf\u001d`>\u0092.\u00ab\u00e6\u0094|\u00fa=\u008bl\u0012/_X\u00bd?\u000f\u0098x\u00eb6C\u00c9?%\u00a9\u00ec\u00e9\u00f1O\u00cb?\u00e1\u001e={5T\u00c6?\u0005\u00d1Y4\u00bf\u008e\u00bf?\u00d6^}\u00f3f\u008c\u00b8?&\u00147+\u00e5A\u00ac?lo\u00b9\u0004\u00b7K\u0095?\u0004\u00c6l\u00b6\u00ba\u0085r?\u00a1\u00b7\u00de\u00f6\u00d2j??o\u0090\u00e8\u0007\u00a1\u008d\u00ff>\u009d-\u00d7\u00fa\u0090x\u00bd>l:G\u00a3\u0004\u00a5k>\u00bf\r:\u00da/\u0005\u0007>\u009e\u00d6\u00b4\u00d9x5\u00a4?\u00d1\u00e5\u00a8V/\u00f6\u00bb?\u00e1\u001e={5T\u00c6?\u000fcX\u0095\u00c9Y\u00ca?\u00cd\u00f9nF\u00e1\u00e6\u00c9?\u00ccj8g\u00f77\u00c3?\u009e\u0015\r\u001e\u0007\u00fe\u00b4?\u0096\u0084\u00ae\n\u009eF\u009e?S'\u0094\u0089j\u0086y?{\u001f\u00fc\u0087^@E?\u009f\u00c5y\u00f4H0\u0005?\u00ffPJ`\u00f0\u00c1\u00c3>\u00aa\u0099T\u00be\u00f2\u008br>\u00efL]\u0015\u009f\u0014\u000f>\u00afs\u0092\u0018\u00ffT\u008a?^\u0080\u00be\u00f1e\u00cd\u00ab?\u0005\u00d1Y4\u00bf\u008e\u00bf?\u00cd\u00f9nF\u00e1\u00e6\u00c9?\u00fd\u0000\u0084\t\u00c6\u001d\u00d1?\u00fb\u00a5\u000fJ]\u00b2\u00c8?\"DY.\u009b7\u00ba?f~\u00f4\u0097\u00b2{\u00a2?\u0099Y\u00aa\u00a3`\u00af~?\u00cf\u00e4\u00fb)h\u00f9\u0007\u009f\u00e9u>4\u0091\u009aP\u0099[\u0012>{$b\u00d2\u00dd\u00e2\u0087?\u009c\u008eO9\u0019\u000f\u00a7?\u00d6^}\u00f3f\u008c\u00b8?\u00ccj8g\u00f77\u00c3?\u00fb\u00a5\u000fJ]\u00b2\u00c8?\u00a3\u00ef~\u0086\u00d5\u001d\u00cb?i\u00b2\u0094\u00b7\u0019n\u00c6?\u0012\u00ed\u00f0MS\u00f8\u00b6?\u00d5\u00e3\u00dc\u008b\u0083\u00ea\u0098?)\u00f7\u00e4\u00ec\u00e4Kh?\u00b7N\u008b\u00bc\u00e1\u000f*?\u00ff\u0097\nR\u0018\u00f2\u00e8>Z}\bp<\u00a6\u0097>\u00ae\u00e2\u0019\u0015\u00feW3>\u00cd\u008b\u00d8\u00f3mK\u0080?\u00b7X\u00c8\u00d4\u0017\u008c\u009c?&\u00147+\u00e5A\u00ac?\u009e\u0015\r\u001e\u0007\u00fe\u00b4?\"DY.\u009b7\u00ba?i\u00b2\u0094\u00b7\u0019n\u00c6?\u00b1\u0017)#Ap\u00cf?\u00a8)\u00f1\u0016\u00e6p\u00ca?Qy\u00d5\u00d3\u009c5\u00b5?XcTJc\f\u008b?\u00af\t\u001f\u0082k\u00b9P?\u00b4\u0016KwI\u0011\u0011?\u00a9U\u0094\u00d7\u00f7\u00eb\u00c0>\u0017\u00a6`nO_\\>\u009d|(8\u0011il?d\u00d6\u0086\u00b5\u00ff\u00ea\u0086?lo\u00b9\u0004\u00b7K\u0095?\u0096\u0084\u00ae\n\u009eF\u009e?f~\u00f4\u0097\u00b2{\u00a2?\u0012\u00ed\u00f0MS\u00f8\u00b6?\u00a8)\u00f1\u0016\u00e6p\u00ca?RxMh\u00f3\u00e9\u00d3?s\u00a3\u0001\u00c0c\u00cb\u00cc?q:\u00da\u00a4\u00c8\u008c\u00ae?\u00b7\u0084\u0010\u009a\u00b3\u00ddy?\u00d3\u00ba/^\u00d0\u00dc>?4\u00a7\n\u00b7H@\u00f1>8J\u00fb4\u00ab\u008d\u008f>\u00bb\u00d0\u00c5\u00fc5aK?\u00cc\u000e\u008b\u0086\u0019\u00dbd?\u0004\u00c6l\u00b6\u00ba\u0085r?S'\u0094\u0089j\u0086y?\u0099Y\u00aa\u00a3`\u00af~?\u00d5\u00e3\u00dc\u008b\u0083\u00ea\u0098?Qy\u00d5\u00d3\u009c5\u00b5?s\u00a3\u0001\u00c0c\u00cb\u00cc?)w\u00ff\u00f6\u00af\u00cf\u00d7?\u00db\u00fc\u00e3ap\u00f8\u00cc?$\u00e6\"#K\u0016\u00a6?\u0087\u0093\u00bf3\u00f6kr?\u0083\u008f`ce\u00b7+?\u00bd\u00b1\u0004\u0093\u00e0z\u00d1>\u00c9\u0018\u001b\u00a6H\u00a5\u0018?\u00e9\u00f1\u00a9r()2?\u00a1\u00b7\u00de\u00f6\u00d2j??{\u001f\u00fc\u0087^@E?\u00cf\u00e4\u00fb\u00ec\u0016\u00da\u00a3\u008ej\u00f2>o\u0090\u00e8\u0007\u00a1\u008d\u00ff>\u009f\u00c5y\u00f4H0\u0005??\u00ca\u00feC\n\u001c\t?\u00b7N\u008b\u00bc\u00e1\u000f*?\u00af\t\u001f\u0082k\u00b9P?\u00b7\u0084\u0010\u009a\u00b3\u00ddy?$\u00e6\"#K\u0016\u00a6?\u00c7\"\u0082AC\u001f\u00cd?[\u00e8W\u00d2\u00a7\u0001\u00da?\u00f2\u00d7j\u00cfm|\u00cd?\u00e1\u009bW\u00e9\u008d\u00a2\u00b1?!\u00d4\u00a2\u00ba\u00cft\u0090?\u00b72\\R\u00fe\u00bf\u0097>\u00f8)\u00a9\u0002\u00ae9\u00b1>\u009d-\u00d7\u00fa\u0090x\u00bd>\u00ffPJ`\u00f0\u00c1\u00c3>\u007f^\u009d\u0001\u0093^\u00c7>\u00ff\u0097\nR\u0018\u00f2\u00e8>\u00b4\u0016KwI\u0011\u0011?\u00d3\u00ba/^\u00d0\u00dc>?\u0087\u0093\u00bf3\u00f6kr?x\u00a4\u00ee4B\u00fd\u00a7?\u00f2\u00d7j\u00cfm|\u00cd?w\u0006\u00c5\u00c7ih\u00d5?\u00895\n\u00dd\u0092g\u00cf?\u0098\\\u00c5\u00b9A\u00a6\u00c1?t\u00ca+\u0089!0F>\u0019Qd\u0090\u00bf\u001d`>l:G\u00a3\u0004\u00a5k>\u00aa\u0099T\u00be\u00f2\u008br>)h\u00f9\u0007\u009f\u00e9u>Z}\bp<\u00a6\u0097>\u00a9U\u0094\u00d7\u00f7\u00eb\u00c0>4\u00a7\n\u00b7H@\u00f1>\u0083\u008f`ce\u00b7+?\u00bc=q\u008b\u008e\u008dq?\u00e1\u009bW\u00e9\u008d\u00a2\u00b1?\u00895\n\u00dd\u0092g\u00cf?{7\u0085}\u0000\u001e\u00d6?\u00d6&\u00cf|\u0095{\u00d5?N\u00f4\u00ccc\u00a0\u00fe\u00e1=\u0092.\u00ab\u00e6\u0094|\u00fa=\u00bf\r:\u00da/\u0005\u0007>\u00efL]\u0015\u009f\u0014\u000f>4\u0091\u009aP\u0099[\u0012>\u00ae\u00e2\u0019\u0015\u00feW3>\u0017\u00a6`nO_\\>8J\u00fb4\u00ab\u008d\u008f>\u00bd\u00b1\u0004\u0093\u00e0z\u00d1>\u00ea\u00c5y\u00f9\u00041*?!\u00d4\u00a2\u00ba\u00cft\u0090?\u0098\\\u00c5\u00b9A\u00a6\u00c1?\u00d6&\u00cf|\u0095{\u00d5?v\u008a\u000e\u00f7QS\u00e0?"}}}, "forward_and_reverse_energies": {"fractions": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0088\u008e\u00e1\u00c5y\u00e8\u00b8?\u009a\u0099\u0099\u0099\u0099\u0099\u00c9?o0E>\u00eb\u0006\u00d3?\u009a\u0099\u0099\u0099\u0099\u0099\u00d9?<\u00fd\u0011\u000b\u00b8\u00d3\u00df?333333\u00e3?\u0004e\u00efkBP\u00e6?\u009a\u0099\u0099\u0099\u0099\u0099\u00e9?k\u00cbU\u00d2\u00a8\u00b6\u00ec?\u0000\u0000\u0000\u0000\u0000\u0000\u00f0?"}}, "forward_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00a1\u0015\"\u009c\u00be\u00ea\u0011@\u0012\u007f\u008co\u00197\t@\u00f7s\u00d1\u00da\u00e4\u00e3\f@\u0092\u00f6\u00a3\u00e6G=\u00e2?\n\u00f5h\u00a1\u00c6\u00db\u00c0\u00bf\u00a2\u00b9\u0005\u00bf\u00ac\u00fe\u00e3?^E\u0014\u008cN,\u00f2\u00bf\u0002\u0004\u00ef4j\u00a4\u00ec\u00bf\u00bf`\u00b3\u008b\u000b\u00f3\u00fb\u00bf\u00d7\u0093\u00e8V49\u00fa\u00bf"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forward_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00aaT\u00df\u008d\u00fd\u0014\u00d9?\u00d8\u0001\u00fc\u0089\u0017\u0006\u00d3?\u00c5L\u00e2\u00f9I@\u00ce?\u0018'\u0006Y3y\u00cd?\u00ac\u00ab\\\u00bf\u00e0\u0017\u00cb?\u00f3D\u00a1\u00b8\u00b3\u0007\u00c8?\u00d3\u00f1\u008c\u00d1\r\u00a9\u00c7?\u00e8\u00ccI\u00a8y\u00fd\u00c5?\u00af1\u00bd\u0003\u008fy\u00c5?\u0007\u00b4\u00e6m\u009aL\u00c4?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "9\u009e\u00c7\u00b5b\u00c5\u0002\u00c0l\u00ff\u0091\u0090b\u00fc\u0015\u00c0o\u00b7\u00a6\u0012\u008aG\u00fd\u00bf\u001e\u009f\u00bb/\u00f6\u00c8\u0018\u00c0\u001c\u008dR\u001b\u00fe3\r\u00c0\u00c4&\u0004Aq\u0002\u000b\u00c0>\u00b7\u00ba\u00cep\u00d0\u0014\u00c0/\u0093\u008b\u008e\u00c7~\t\u00c0y\fc\u00ae\u00ba\u0002\u0006\u00c0\u00d7\u0093\u00e8V49\u00fa\u00bf"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0085'$\u0012[\u00f9\u00e0?\u00f3\u00d4\u00d7\u00ce\u00f2\r\u00da?3\u00cc\u00b2\u00c8\u00da\u001b\u00d3?\u00ae\u0091,\u00d4\u0095\u00d0\u00d2?uVe\u00f8\u00b5\b\u00cf?u\t\u0012a\u00c6\u00dd\u00cb?O\u00c5\u00db\u00e2\u00d2F\u00cb?\u00a8p\u0010Z\u008e\u00c2\u00c7?\u001fO\u00e3v\u00b8A\u00c6?\u0007\u00b4\u00e6m\u009aL\u00c4?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "production_iterations": 185.4853057861328, "equilibration_iterations": 6.0, "replica_exchange_statistics": {"eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00e9\u00ff\u00ff\u00ff\u00ff\u00ff\u00ef?0\u00be\r\u0085K\f\u00ef?\u0012\u00bb~f\u0084\u00ea\u00ea??h\u00cc\u00bfS\u00c5\u00e6?L!\u00ca\u00c2H\u00c9\u00e3?\u00a3PdB:P\u00df?\u00e5#\u00bd\u00e9\u00f9\u008e\u00d6?\u00bf\u00a6\u00e5~\u00cf\u00f0\u00d4?\u009dA\u0014\b\u00f0\u00ce\u00d0?\b%\u00e7U\u008e\u0000\u00c5?A\tp0\u00d7\u00dc\u00c2?ug\u00d6\u00e5\f\u00a7\u00b7?\u00be.\u001dD\u0081\u00e1\u009c?Y<\u00d2Dc0\u0087?"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00aeUg\u00fdx\u0093\u00e4?\u008a\u00f3w]\u00fcB\u00cb?|\u001aa\u00b9\u00a7\u0011\u00b6?F=r4\u00a7\u00f6\u0099?\u00e8%\u00b3c@\u0014\u008d?\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u00e8%\u00b3c@\u0014}?`\u0083\u00af\u00a6\u00db\u009d`?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u008a\u00f3w]\u00fcB\u00cb?\u0003\u0087l\u000bR\u00aa\u00d8?\u009d\u00f5\u00e3M\u00d2\u00b7\u00c6?+\u00c1\u00a8,\u0012\u00e1?\u00d3\u00d2\u00d2\u00d2\u00d2\u00d2\u00c2?|5\u00dd\u00ee\u0084\u0000\u009b?`\u0083\u00af\u00a6\u00db\u009d`?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?\u0010E\u0007z\u00c9\u00ecx?\u00e8%\u00b3c@\u0014\u008d?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00d3\u00d2\u00d2\u00d2\u00d2\u00d2\u00c2?\u00fb\f\u00a3\u001e9\u009a\u00e3?\u00da1 \u008a\u000e\u00f4\u00c2?8d[\u0090R\u00c5\u0094?8d[\u0090R\u00c5t?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009dP?`\u0083\u00af\u00a6\u00db\u009d`?\u0010E\u0007z\u00c9\u00ecx?|5\u00dd\u00ee\u0084\u0000\u009b?\u00da1 \u008a\u000e\u00f4\u00c2?I\u00c4\u00de?\u00f9\u00a0\u00e2?\u00b2\u0012\u00ccs\u0085\u001b\u00c7?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0083\u00af\u00a6\u00db\u009d`?8d[\u0090R\u00c5\u0094?\u00b2\u0012\u00ccs\u0085\u001b\u00c7?[u\u00d6\u008f7I\u00df?\u00c0\u00eb\u00e2\u0017\u00daL\u00cc?\u0089\u00d8\u00fb'\u001fT\u00b6?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00008d[\u0090R\u00c5t?\u00a4T1\u0005\u000e\u00d9\u00a6?\u00c0\u00eb\u00e2\u0017\u00daL\u00cc?\u00c6J0\u00cf\u0015n\u00dc?4\u00a7\u00f6\u0019F=\u00d2?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ccs\u0085\u001b\u0097\u00b1\u0082?\u0089\u00d8\u00fb'\u001fT\u00b6?4\u00a7\u00f6\u0019F=\u00d2?\u0085\u001b\u0097\u00b1\u0012\u00cc\u00e3?"}}}}, "start_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:15:35.964193"}, "end_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:24:08.581624"}, "__qualname__": "ProtocolUnitResult", "__module__": "gufe.protocols.protocolunit", ":version:": 1}, "ProtocolUnitResult-4e48b3dcdbf44c828added08e40a0781": {"name": "Absolute Solvation, benzene vacuum leg: repeat 0 generation 0", "_key": "ProtocolUnitResult-4e48b3dcdbf44c828added08e40a0781", "source_key": "AbsoluteSolvationVacuumUnit-718f88d975dc4a4aacc6e60f688d3bbb", "inputs": {"protocol": {":gufe-key:": "AbsoluteSolvationProtocol-d127cf265cfd04054dfd96001983268b"}, "stateA": {":gufe-key:": "ChemicalSystem-bccec9dd1e516db5ac7ff2763fdd4f7c"}, "stateB": {":gufe-key:": "ChemicalSystem-fed9973d1274c4ca7a68fc66a0a753da"}, "alchemical_components": {"stateA": [{":gufe-key:": "SmallMoleculeComponent-b01ddf596bc809274f3809d9878c60ba"}], "stateB": []}, "repeat_id": 279370490201278614325565891219309171778, "generation": 0}, "outputs": {"repeat_id": 279370490201278614325565891219309171778, "generation": 0, "simtype": "vacuum", "nc": {"__class__": "PosixPath", "__module__": "pathlib", ":is_custom:": true, "path": "results/benzene/shared_AbsoluteSolvationVacuumUnit-718f88d975dc4a4aacc6e60f688d3bbb_attempt_0/vacuum.nc"}, "last_checkpoint": "vacuum_checkpoint.nc", "unit_estimate": {"magnitude": -2.392584945619364, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "unit_estimate_error": {"magnitude": 0.00026550810663754316, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "unit_mbar_overlap": {"scalar": 0.9999095748969496, "eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0000\u0000\u0000\u0000\u0000\u0000\u00f0?L\u0090\u00fcpS\u00b4\u0017?\u009a\u007f\u0007\u000e\u00d0\u00c30>\u00e2Z5\u00c23LH=\u009d\u00a2I \u0000\u0005\u00e9<-\u009e\u00a3\u00d5\u0098x\u0099;p\u00a4\u0086\u0010`@\u00cf8h\u007f\u00b0\u00a2h\u00a5\u00fa1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Yo\u00e4QiC\r\u00af\u0014\"8\u0094\u00112\u00d3\u00b1`s\u0013\u00a0T\u00c0-\u00b5\u00f2\u0012\u000e\u00c4\u00b3\u000e\u008b\u00b5\u0000\u0000\u0000\u0000\u0000\u00d13\u00b6"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "t\u008d\u00ae\u00c0\u00f5K\u00b2?J\u00a8\u00e3\u00f3\u0012K\u00b2?\b\u001f\u00a9\u00c1@J\u00b2?#\u00fc\u0096\u00ebdI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00ea\u00f7j)\u0088H\u00b2?J\u00a8\u00e3\u00f3\u0012K\u00b2?\u0004\u00e3\u001e\u0081wJ\u00b2?<\u00d6\u0015k\u00e7I\u00b2?y^\u00a9\u00b4PI\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\u00a09\u0086W\u00b9H\u00b2?\b\u001f\u00a9\u00c1@J\u00b2?<\u00d6\u0015k\u00e7I\u00b2?\u0018>\u0013\u0099\u0094I\u00b2?\f\u00a7\u00c6\u00f4=I\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?#\u00fc\u0096\u00ebdI\u00b2?y^\u00a9\u00b4PI\u00b2?\f\u00a7\u00c6\u00f4=I\u00b2?\u00f5\u00fa\u00d7T*I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u00ea\u00f7j)\u0088H\u00b2?\u00a09\u0086W\u00b9H\u00b2?j\u001dW\u00ed\u00e6H\u00b2?\u00ec\u0019\u00d0\u009b\u0016I\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?\u001c\u008f\u00fd~FI\u00b2?"}}}, "forward_and_reverse_energies": {"fractions": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00ec\f\u00b0\u001e\u00e2\b\u00b9?\u008d\u00ba\r\u009b@p\u00c9?R\u00b7a\u0013\b.\u00d3?\u008d\u00ba\r\u009b@p\u00d9?\u0098\u0094\u00e8`(\u00e6\u00df?R\u00b7a\u0013\b.\u00e3?\u00ef\u00b87W$O\u00e6?\u00f5%%:\u0018\u008a\u00e9?\u00fa\u0092\u0012\u001d\f\u00c5\u00ec?\u0000\u0000\u0000\u0000\u0000\u0000\u00f0?"}}, "forward_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0098[A\u00d4\u00ef&\u0003\u00c0W\u00ee#Az$\u0003\u00c0/*;\u000b\u00d9#\u0003\u00c0(\u000ebf\u00ba%\u0003\u00c0\u00afM\u00d0\u0085\u0083%\u0003\u00c0\u0094\u008b\u0005\u00bd*%\u0003\u00c0\u001fQ=j\u0090$\u0003\u00c0\u0017\u0085G\u00d4i$\u0003\u00c0\u00c0\u00b5\u00ff\u00bd_$\u0003\u00c0e\u00b2r\u0093\u0003$\u0003\u00c0"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "forward_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "[Q)\u00a6\u00ee\u0093K?_E0Ot\u00f1B?\u00c9\u00023\u0012\u00cc\u0086>?\u0006bo'Y\u00cf;?\u00a5\u009e\u00ed\u00c8\u0094\u00a58?Cq~m\u00baI6?t5\u00e5\u00dc\u009e\u00a34?H\u00eb\u00e1\u0093\u0018F3?a\u00a6\u0001\tHJ2?\u00f7J\u0084\u00a2|f1?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_DGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00b9\u00d8\u0093\u0011\u00c5 \u0003\u00c05\u001d\u00eea\u0094\"\u0003\u00c0\u00a3pu\u0013\u00be\"\u0003\u00c0\u00ad\u00f2\u00e4\u0013X\"\u0003\u00c0\t\u00af\u00ca\u0091\u0085\"\u0003\u00c0\u00a6\u00e3/\u0095\u00e8\"\u0003\u00c0\u00cbe\u00be\u00eb\u0002$\u0003\u00c0'\u0085\u00f5\u0095\u00da#\u0003\u00c0\u000f\u00f0.\u00cb\u00b2#\u0003\u00c0e\u00b2r\u0093\u0003$\u0003\u00c0"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}, "reverse_dDGs": {"magnitude": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [10], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": ">p\u000f\u00f6\u00d7\u00baL?\u0093\u00f5lUmVD?\u00ea({\u008f\u00f46@?\u008796C{\u00e9;?\u0013\u001bh\u0011\u00f0\u00988?gh\u009d\u00bb\u00f2\\6?\u0083t\u00ce\u00a8k&5?\u00e3\u00b5\u00a6U\u0084\u00953?l\u00f2?\u00fd\u00b5^2?\u00f7J\u0084\u00a2|f1?"}}, "unit": "kilocalorie_per_mole", ":is_custom:": true, "pint_unit_registry": "openff_units"}}, "production_iterations": 317.3360900878906, "equilibration_iterations": 11.0, "replica_exchange_statistics": {"eigenvalues": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u00fb\u00ff\u00ff\u00ff\u00ff\u00ff\u00ef?\u00e0\u0098\u00b1\u0086\u00e6>\u00b0?ST\u00b8\bDn\u00ab?\u00b3]\u001daw\u00ed\u00a0?\u00e1\u0081\u00d5K\u00e8\r\u009a?W\u00a7b\u00f39a\u0085?(\u00db\u001d\u0084\u00d7\u00e2M\u00bfM\u00af\u00e2\u00f1\u00f0\u00d8y\u00bf\u00ab\u00fc\u008b\u00be\u00cb\u0003\u0094\u00bf\u00ea\r%\u0087\u0001\u00c8\u0096\u00bf\u00f9\u00bb+\u008e.g\u009f\u00bf\u00c0\n\u00ec\u0012\u00aaY\u00a1\u00bf\u00b9\u00b9\u009f\u0006\u00a9-\u00aa\u00bf\u0015\u0001\u00ee\u00feX\u00bb\u00ac\u00bf"}}, "matrix": {"__class__": "ndarray", "__module__": "numpy", ":is_custom:": true, "dtype": "float64", "shape": [14, 14], "bytes": {"__class__": "bytes", "__module__": "builtins", ":is_custom:": true, "latin-1": "\u0011\u00ac\u00a3\u00cd\u00fb\u0014\u00b7?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u0082u\u00b4y\u009f\u00e2\u00b2?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?&C\u00b0\u008e6\u00ef\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00a8\u00b8d\b\u00d6\u00d1\u00b6?\u00ce\u00fb\u0014\u0097\f\u00c1\u00aa?v\u00b4y\u009f\u00e2\u0092\u00b1?G\u009b\u00f7).\u0019\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?\u00b4y\u009f\u00e2\u0092!\u00b8?\r\u00c1:\u00da\u00bcO\u00b1?\u00e7}\u008aK\u0086`\u00ad?;\u00da\u00bcOq\u00c9\u00b0?\u008f6\u00efS\\2\u00b4?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00f8).\u0019\u0082u\u00b4?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?C\u00b0\u008e6\u00efS\u00ac?\u00de\u00a7\u00b8d\b\u00d6\u00b1?.\u0019\u0082u\u00b4y\u00af?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?T\\2\u0004\u00ebh\u00b3?\u00d6\u00d1\u00e6}\u008aK\u00b6?.\u0019\u0082u\u00b4y\u00af?&C\u00b0\u008e6\u00ef\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?;\u00da\u00bcOq\u00c9\u00b0?G\u009b\u00f7).\u0019\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?m\u00de\u00a7\u00b8d\b\u00b6?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?&C\u00b0\u008e6\u00ef\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?*.\u0019\u0082u\u00b4\u00a9?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?a\u001dm\u00de\u00a7\u00b8\u00b4?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?.\u0019\u0082u\u00b4y\u00af?G\u009b\u00f7).\u0019\u00b2?\u009b\u00f7).\u0019\u0082\u00b5?.\u0019\u0082u\u00b4y\u00af?\u009b\u00f7).\u0019\u0082\u00b5?\u00f8).\u0019\u0082u\u00b4?\u0086`\u001dm\u00de\u00a7\u00b8?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\\2\u0004\u00ebh\u00f3\u00ae?v\u00b4y\u009f\u00e2\u0092\u00b1?\u008aK\u0086`\u001dm\u00ae?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00b9d\b\u00d6\u00d1\u00e6\u00ad?\r\u00c1:\u00da\u00bcO\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?.\u0019\u0082u\u00b4y\u00af?;\u00da\u00bcOq\u00c9\u00b0?T\\2\u0004\u00ebh\u00b3?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b0\u008e6\u00efS\\\u00b2?\u00b0\u008e6\u00efS\\\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b4y\u009f\u00e2\u0092!\u00b8?\r\u00c1:\u00da\u00bcO\u00b1?m\u00de\u00a7\u00b8d\b\u00b6?\u009b\u00f7).\u0019\u0082\u00b5?T\\2\u0004\u00ebh\u00b3?\u00e7}\u008aK\u0086`\u00ad?i\u00f3>\u00c5%C\u00b0?\u0019\u0082u\u00b4y\u009f\u00b2?\u00e7}\u008aK\u0086`\u00ad?\\2\u0004\u00ebh\u00f3\u00ae?m\u00de\u00a7\u00b8d\b\u00b6?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?&C\u00b0\u008e6\u00ef\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00f8).\u0019\u0082u\u00b4?\u0004\u00ebh\u00f3>\u00c5\u00b5?i\u00f3>\u00c5%C\u00b0?i\u00f3>\u00c5%C\u00b0?\u009f\u00e2\u0092!XG\u00ab?\u00bdOq\u00c9\u0010\u00ac\u00b3?T\\2\u0004\u00ebh\u00b3?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00c9\u0010\u00ac\u00a3\u00cd\u00fb\u00b4?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00e7}\u008aK\u0086`\u00ad?v\u00b4y\u009f\u00e2\u0092\u00b1?&C\u00b0\u008e6\u00ef\u00b3?\u0086`\u001dm\u00de\u00a7\u00b8?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u0019\u0082u\u00b4y\u009f\u00b2?\u009f\u00e2\u0092!XG\u00ab??\u00c5%C\u00b0\u008e\u00b6?\u009f\u00e2\u0092!XG\u00ab?G\u009b\u00f7).\u0019\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00d2\u00e6}\u008aK\u0086\u00b0?\u0082u\u00b4y\u009f\u00e2\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?;\u00da\u00bcOq\u00c9\u00b0?T\\2\u0004\u00ebh\u00b3?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00e7}\u008aK\u0086`\u00ad?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u009f\u00e2\u0092!XG\u00ab?\u00f8).\u0019\u0082u\u00b4?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00bdOq\u00c9\u0010\u00ac\u00b3?\r\u00c1:\u00da\u00bcO\u00b1?\u00b0\u008e6\u00efS\\\u00b2?\u00a8\u00b8d\b\u00d6\u00d1\u00b6?\u008f6\u00efS\\2\u00b4?\u00d6\u00d1\u00e6}\u008aK\u00b6?*.\u0019\u0082u\u00b4\u00a9?\\2\u0004\u00ebh\u00f3\u00ae?\u00b0\u008e6\u00efS\\\u00b2?\\2\u0004\u00ebh\u00f3\u00ae?T\\2\u0004\u00ebh\u00b3?G\u009b\u00f7).\u0019\u00b2?\u0082u\u00b4y\u009f\u00e2\u00b2?C\u00b0\u008e6\u00efS\u00ac?\u00b0\u008e6\u00efS\\\u00b2?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00ce\u00fb\u0014\u0097\f\u00c1\u00aa?a\u001dm\u00de\u00a7\u00b8\u00b4?.\u0019\u0082u\u00b4y\u00af?\u0082u\u00b4y\u009f\u00e2\u00b2?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00b0\u008e6\u00efS\\\u00b2?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u00b0\u008e6\u00efS\\\u00b2?\r\u00c1:\u00da\u00bcO\u00b1?\u0019\u0082u\u00b4y\u009f\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?v\u00b4y\u009f\u00e2\u0092\u00b1?\u00f8).\u0019\u0082u\u00b4?&C\u00b0\u008e6\u00ef\u00b3?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u008aK\u0086`\u001dm\u00ae?\r\u00c1:\u00da\u00bcO\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00a4\u00cd\u00fb\u0014\u0097\f\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\r\u00c1:\u00da\u00bcO\u00b1?\u0004\u00ebh\u00f3>\u00c5\u00b5?\u0019\u0082u\u00b4y\u009f\u00b2?;\u00da\u00bcOq\u00c9\u00b0?2\u0004\u00ebh\u00f3>\u00b5?G\u009b\u00f7).\u0019\u00b2?\u00d2\u00e6}\u008aK\u0086\u00b0?m\u00de\u00a7\u00b8d\b\u00b6?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00d2\u00e6}\u008aK\u0086\u00b0?\u00bdOq\u00c9\u0010\u00ac\u00b3?\u0000\u0000\u0000\u0000\u0000\u0000\u00b0?\u00c9\u0010\u00ac\u00a3\u00cd\u00fb\u00b4?\u0082u\u00b4y\u009f\u00e2\u00b2?\u00b0\u008e6\u00efS\\\u00b2?\u00de\u00a7\u00b8d\b\u00d6\u00b1?\u00de\u00a7\u00b8d\b\u00d6\u00b1?2\u0004\u00ebh\u00f3>\u00b5?C\u00b0\u008e6\u00efS\u00ac?"}}}}, "start_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:14:16.112945"}, "end_time": {"__class__": "datetime", "__module__": "datetime", ":is_custom:": true, "isotime": "2024-03-06T17:15:35.963930"}, "__qualname__": "ProtocolUnitResult", "__module__": "gufe.protocols.protocolunit", ":version:": 1}}} \ No newline at end of file From 4d5681c4b6ec40078c776dfdbd41d0439ca34519 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 25 Mar 2024 14:26:22 +0100 Subject: [PATCH 08/11] Load results from json --- ahfe_tutorial/python_tutorial.ipynb | 56 +++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb index 20574eb..c7105c7 100644 --- a/ahfe_tutorial/python_tutorial.ipynb +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -812,18 +812,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "d0f6b8fb-dde2-442a-b641-3160a70e2f84", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AHFE dG: -0.8757588273304342 kilocalorie_per_mole, err 0.15236223232996626 kilocalorie_per_mole\n" - ] - } - ], + "outputs": [], "source": [ "# Get the complex and solvent results\n", "protocol_results = protocol.gather([dag_results])\n", @@ -833,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "847b5663-2e6c-4cb2-aa9d-39d132fcff3d", "metadata": {}, "outputs": [], @@ -852,17 +844,51 @@ " }\n", "}\n", "\n", - "with gzip.open(\"ahfe_benzene_json_results.gz\", 'wt') as zipfile:\n", - " json.dump(outdict, zipfile, cls=gufe.tokenization.JSON_HANDLER.encoder)" + "with open(\"ahfe_json/benzene_results.json\") as stream:\n", + " json.dump(outdict, stream, cls=gufe.tokenization.JSON_HANDLER.encoder)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "f62f69a1-09c0-4a4a-9b37-9663b51a75ac", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "import gzip\n", + "import json\n", + "import gufe\n", + "\n", + "outfile = \"ahfe_json/benzene_results.json\"\n", + "with open(outfile) as stream:\n", + " results = json.load(stream)\n", + " estimate = results['estimate']\n", + " uncertainty = results['uncertainty']" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "3b459b28-a4dc-4fa9-a961-b106c45d79ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'magnitude': -0.7536190151704971,\n", + " 'unit': 'kilocalorie_per_mole',\n", + " ':is_custom:': True,\n", + " 'pint_unit_registry': 'openff_units'}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "estimate" + ] } ], "metadata": { From 486364dd340d2be944faad2ae5dd25c3b1f5e0da Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 25 Mar 2024 14:33:47 +0100 Subject: [PATCH 09/11] small changes --- ahfe_tutorial/python_tutorial.ipynb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/ahfe_tutorial/python_tutorial.ipynb b/ahfe_tutorial/python_tutorial.ipynb index c7105c7..3e1d239 100644 --- a/ahfe_tutorial/python_tutorial.ipynb +++ b/ahfe_tutorial/python_tutorial.ipynb @@ -624,7 +624,15 @@ "id": "7f1dfcff-bb06-4508-9f16-4e3de18a5f93", "metadata": {}, "source": [ - "## 4. Running the AHFE simulation using the CLI command `openfe quickrun`" + "## 4. Running the AHFE simulation" + ] + }, + { + "cell_type": "markdown", + "id": "fe618563-c445-4fb3-bc0c-6c08148ddede", + "metadata": {}, + "source": [ + "### (a) Using the CLI" ] }, { @@ -689,10 +697,17 @@ }, { "cell_type": "markdown", - "id": "318ff872", + "id": "bc919dc3-1281-49d2-ad92-4a3355d8bbe5", + "metadata": {}, + "source": [ + "### (b) Using the Python API" + ] + }, + { + "cell_type": "markdown", + "id": "21b64394-fdc7-47e9-aadd-488a55c1d0bb", "metadata": {}, "source": [ - "## 5. Running the AHFE simulation using the Python API\n", "**Creating the `ProtocolDAG`**\n", "\n", "Once we have the two `ChemicalSystem`s, and the `Protocol`, we can create the `ProtocolDAG`.\n", From 8094bcdf2a4f0dd5c5daf6fd544a0a9e0628de46 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Tue, 26 Mar 2024 14:34:09 +0100 Subject: [PATCH 10/11] Addressing comments --- ahfe_tutorial/ahfe_cycle.png | Bin 43184 -> 16352 bytes ahfe_tutorial/python_tutorial.ipynb | 51 ++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/ahfe_tutorial/ahfe_cycle.png b/ahfe_tutorial/ahfe_cycle.png index 8d77aca44561030059e8cae43eff99df9f4928e8..fd82dd7089800ded1625e8ff4115030ccf2b9489 100644 GIT binary patch literal 16352 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 Wz59+?nCSfzZ&^tti3%~Jum1-gq)HzE literal 43184 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 V4>Lm9jtk&F4K-cW66L3_{|mX)9" + "## \"Drawing\"" ] }, { @@ -819,10 +821,23 @@ "metadata": {}, "source": [ "Finally now that we've run our simulations, let's go ahead and gather the free\n", - "energies for both phases.\n", - "\n", - "This can be achieved by passing the results of executing the DAGs calling the `gather()` method.\n", - "This takes a **list** of completed DAG results, catering for when simulations have been extended." + "energies for both phases." + ] + }, + { + "cell_type": "markdown", + "id": "8dfef043-35de-4943-a728-571a83c13161", + "metadata": {}, + "source": [ + "### Python API" + ] + }, + { + "cell_type": "markdown", + "id": "cea729d2-231f-4759-8a11-d6d09c1428fb", + "metadata": {}, + "source": [ + "If you executed the simulations using the Python API, you will have generated a `dag_results` object. You can analyze these results by calling the Protocols' `gather()` method. This takes a **list** of completed DAG results and returns a `AbsoluteSolvationProtocolResult` which can return a free energy estimate and uncertainty by calling the `get_estimate()` and `get_uncertainty()` methods." ] }, { @@ -838,6 +853,14 @@ "print(f\"AHFE dG: {protocol_results.get_estimate()}, err {protocol_results.get_uncertainty()}\")" ] }, + { + "cell_type": "markdown", + "id": "b23748c3-3fa6-45f2-8fcb-e471bd28dd3d", + "metadata": {}, + "source": [ + "You can save the `AbsoluteSolvationProtocolResult` to a JSON output file in the following manner:" + ] + }, { "cell_type": "code", "execution_count": null, @@ -863,6 +886,22 @@ " json.dump(outdict, stream, cls=gufe.tokenization.JSON_HANDLER.encoder)" ] }, + { + "cell_type": "markdown", + "id": "43f3626a-74c1-4835-be7b-fd6bf0c81562", + "metadata": {}, + "source": [ + "### CLI / Quickrun" + ] + }, + { + "cell_type": "markdown", + "id": "aa3978a2-ed90-4706-b3be-554237d40751", + "metadata": {}, + "source": [ + "If you ran the simulation using the CLI (i.e. by calling `openfe quickrun` ) you will end up with the same JSON output file as the one created in the previous cell. To get your simulation results you can load them back into Python in the following manner:" + ] + }, { "cell_type": "code", "execution_count": 14, From 1fc666601149c57e17c536e2f0b11990f4c907bd Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 26 Mar 2024 13:54:27 +0000 Subject: [PATCH 11/11] udpate ahfe tutorial metadata --- ahfe_tutorial/ahfe_json/benzene.json | 2 +- ahfe_tutorial/python_tutorial.ipynb | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/ahfe_tutorial/ahfe_json/benzene.json b/ahfe_tutorial/ahfe_json/benzene.json index 6b879c0..3d2684d 100644 --- a/ahfe_tutorial/ahfe_json/benzene.json +++ b/ahfe_tutorial/ahfe_json/benzene.json @@ -1 +1 @@ -{":version:": 1, "__module__": "gufe.transformations.transformation", "__qualname__": "Transformation", "mapping": null, "name": "benzene", "protocol": {":version:": 1, "__module__": "openfe.protocols.openmm_afe.equil_solvation_afe_method", "__qualname__": "AbsoluteSolvationProtocol", "settings": {":is_custom:": true, "__class__": "AbsoluteSolvationSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", "alchemical_settings": {":is_custom:": true, "__class__": "AlchemicalSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings"}, "integrator_settings": {":is_custom:": true, "__class__": "IntegratorSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "barostat_frequency": {":is_custom:": true, "magnitude": 25, "pint_unit_registry": "openff_units", "unit": "timestep"}, "constraint_tolerance": 1e-06, "langevin_collision_rate": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "1 / picosecond"}, "n_restart_attempts": 20, "reassign_velocities": false, "remove_com": false, "timestep": {":is_custom:": true, "magnitude": 4, "pint_unit_registry": "openff_units", "unit": "femtosecond"}}, "lambda_settings": {":is_custom:": true, "__class__": "LambdaSettings", "__module__": "openfe.protocols.openmm_afe.equil_afe_settings", "lambda_elec": [0.0, 0.26, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "lambda_restraints": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "lambda_vdw": [0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0]}, "partial_charge_settings": {":is_custom:": true, "__class__": "OpenFFPartialChargeSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "nagl_model": null, "number_of_conformers": null, "off_toolkit_backend": "ambertools", "partial_charge_method": "am1bcc"}, "protocol_repeats": 1, "solvation_settings": {":is_custom:": true, "__class__": "OpenMMSolvationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "solvent_model": "tip3p", "solvent_padding": {":is_custom:": true, "magnitude": 1.2, "pint_unit_registry": "openff_units", "unit": "nanometer"}}, "solvent_engine_settings": {":is_custom:": true, "__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "compute_platform": "CUDA"}, "solvent_equil_output_settings": {":is_custom:": true, "__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "checkpoint.chk", "equil_npt_structure": "equil_npt_structure.pdb", "equil_nvt_structure": "equil_nvt_structure.pdb", "forcefield_cache": "db.json", "log_output": "equil_simulation.log", "minimized_structure": "minimized.pdb", "output_indices": "not water", "preminimized_structure": "system.pdb", "production_trajectory_filename": "production_equil.xtc", "trajectory_write_interval": {":is_custom:": true, "magnitude": 20, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "solvent_equil_simulation_settings": {":is_custom:": true, "__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "equilibration_length": {":is_custom:": true, "magnitude": 0.2, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "equilibration_length_nvt": {":is_custom:": true, "magnitude": 0.1, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "production_length": {":is_custom:": true, "magnitude": 0.5, "pint_unit_registry": "openff_units", "unit": "nanosecond"}}, "solvent_forcefield_settings": {":is_custom:": true, "__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", "constraints": "hbonds", "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "hydrogen_mass": 3.0, "nonbonded_cutoff": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "nanometer"}, "nonbonded_method": "PME", "rigid_water": true, "small_molecule_forcefield": "openff-2.0.0"}, "solvent_output_settings": {":is_custom:": true, "__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "solvent_checkpoint.nc", "forcefield_cache": "db.json", "output_filename": "solvent.nc", "output_indices": "not water", "output_structure": "hybrid_system.pdb"}, "solvent_simulation_settings": {":is_custom:": true, "__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "early_termination_target_error": {":is_custom:": true, "magnitude": 0.0, "pint_unit_registry": "openff_units", "unit": "kilocalorie_per_mole"}, "equilibration_length": {":is_custom:": true, "magnitude": 0.009999999999999998, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "n_replicas": 14, "production_length": {":is_custom:": true, "magnitude": 0.4999999999999999, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "real_time_analysis_interval": {":is_custom:": true, "magnitude": 250, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "real_time_analysis_minimum_time": {":is_custom:": true, "magnitude": 500, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "time_per_iteration": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "thermo_settings": {":is_custom:": true, "__class__": "ThermoSettings", "__module__": "gufe.settings.models", "ph": null, "pressure": {":is_custom:": true, "magnitude": 0.9869232667160129, "pint_unit_registry": "openff_units", "unit": "standard_atmosphere"}, "redox_potential": null, "temperature": {":is_custom:": true, "magnitude": 298.15, "pint_unit_registry": "openff_units", "unit": "kelvin"}}, "vacuum_engine_settings": {":is_custom:": true, "__class__": "OpenMMEngineSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "compute_platform": null}, "vacuum_equil_output_settings": {":is_custom:": true, "__class__": "MDOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "checkpoint.chk", "equil_npt_structure": "equil_structure.pdb", "equil_nvt_structure": null, "forcefield_cache": "db.json", "log_output": "equil_simulation.log", "minimized_structure": "minimized.pdb", "output_indices": "not water", "preminimized_structure": "system.pdb", "production_trajectory_filename": "production_equil.xtc", "trajectory_write_interval": {":is_custom:": true, "magnitude": 20, "pint_unit_registry": "openff_units", "unit": "picosecond"}}, "vacuum_equil_simulation_settings": {":is_custom:": true, "__class__": "MDSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "equilibration_length": {":is_custom:": true, "magnitude": 0.2, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "equilibration_length_nvt": null, "minimization_steps": 5000, "production_length": {":is_custom:": true, "magnitude": 0.5, "pint_unit_registry": "openff_units", "unit": "nanosecond"}}, "vacuum_forcefield_settings": {":is_custom:": true, "__class__": "OpenMMSystemGeneratorFFSettings", "__module__": "gufe.settings.models", "constraints": "hbonds", "forcefields": ["amber/ff14SB.xml", "amber/tip3p_standard.xml", "amber/tip3p_HFE_multivalent.xml", "amber/phosaa10.xml"], "hydrogen_mass": 3.0, "nonbonded_cutoff": {":is_custom:": true, "magnitude": 1.0, "pint_unit_registry": "openff_units", "unit": "nanometer"}, "nonbonded_method": "nocutoff", "rigid_water": true, "small_molecule_forcefield": "openff-2.0.0"}, "vacuum_output_settings": {":is_custom:": true, "__class__": "MultiStateOutputSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "checkpoint_interval": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "checkpoint_storage_filename": "vacuum_checkpoint.nc", "forcefield_cache": "db.json", "output_filename": "vacuum.nc", "output_indices": "not water", "output_structure": "hybrid_system.pdb"}, "vacuum_simulation_settings": {":is_custom:": true, "__class__": "MultiStateSimulationSettings", "__module__": "openfe.protocols.openmm_utils.omm_settings", "early_termination_target_error": {":is_custom:": true, "magnitude": 0.0, "pint_unit_registry": "openff_units", "unit": "kilocalorie_per_mole"}, "equilibration_length": {":is_custom:": true, "magnitude": 0.009999999999999998, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "minimization_steps": 5000, "n_replicas": 14, "production_length": {":is_custom:": true, "magnitude": 0.4999999999999999, "pint_unit_registry": "openff_units", "unit": "nanosecond"}, "real_time_analysis_interval": {":is_custom:": true, "magnitude": 250, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "real_time_analysis_minimum_time": {":is_custom:": true, "magnitude": 500, "pint_unit_registry": "openff_units", "unit": "picosecond"}, "sampler_method": "repex", "sams_flatness_criteria": "logZ-flatness", "sams_gamma0": 1.0, "time_per_iteration": {":is_custom:": true, "magnitude": 1, "pint_unit_registry": "openff_units", "unit": "picosecond"}}}}, "stateA": {":version:": 1, "__module__": "gufe.chemicalsystem", "__qualname__": "ChemicalSystem", "components": {"ligand": {":version:": 1, "__module__": "gufe.components.smallmoleculecomponent", "__qualname__": "SmallMoleculeComponent", "atoms": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], "bonds": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], "conformer": ["\u0093NUMPY\u0001\u0000v\u0000{'descr': '},\n", " 'solvent_engine_settings': {'compute_platform': None},\n", - " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", + " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", " 'equil_npt_structure': 'equil_npt_structure.pdb',\n", " 'equil_nvt_structure': 'equil_nvt_structure.pdb',\n", @@ -231,7 +231,7 @@ " 'nonbonded_method': 'PME',\n", " 'rigid_water': True,\n", " 'small_molecule_forcefield': 'openff-2.0.0'},\n", - " 'solvent_output_settings': {'checkpoint_interval': ,\n", + " 'solvent_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'solvent_checkpoint.nc',\n", " 'forcefield_cache': 'db.json',\n", " 'output_filename': 'solvent.nc',\n", @@ -253,7 +253,7 @@ " 'redox_potential': None,\n", " 'temperature': },\n", " 'vacuum_engine_settings': {'compute_platform': None},\n", - " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", + " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", " 'equil_npt_structure': 'equil_structure.pdb',\n", " 'equil_nvt_structure': None,\n", @@ -278,7 +278,7 @@ " 'nonbonded_method': 'nocutoff',\n", " 'rigid_water': True,\n", " 'small_molecule_forcefield': 'openff-2.0.0'},\n", - " 'vacuum_output_settings': {'checkpoint_interval': ,\n", + " 'vacuum_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'vacuum_checkpoint.nc',\n", " 'forcefield_cache': 'db.json',\n", " 'output_filename': 'vacuum.nc',\n", @@ -428,7 +428,6 @@ "cell_type": "markdown", "id": "af14d630-e933-4054-9444-e96af7dfcc80", "metadata": { - "editable": true, "slideshow": { "slide_type": "" }, @@ -506,7 +505,7 @@ " 'solvation_settings': {'solvent_model': 'tip3p',\n", " 'solvent_padding': },\n", " 'solvent_engine_settings': {'compute_platform': 'CUDA'},\n", - " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", + " 'solvent_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", " 'equil_npt_structure': 'equil_npt_structure.pdb',\n", " 'equil_nvt_structure': 'equil_nvt_structure.pdb',\n", @@ -531,7 +530,7 @@ " 'nonbonded_method': 'PME',\n", " 'rigid_water': True,\n", " 'small_molecule_forcefield': 'openff-2.0.0'},\n", - " 'solvent_output_settings': {'checkpoint_interval': ,\n", + " 'solvent_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'solvent_checkpoint.nc',\n", " 'forcefield_cache': 'db.json',\n", " 'output_filename': 'solvent.nc',\n", @@ -553,7 +552,7 @@ " 'redox_potential': None,\n", " 'temperature': },\n", " 'vacuum_engine_settings': {'compute_platform': None},\n", - " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", + " 'vacuum_equil_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'checkpoint.chk',\n", " 'equil_npt_structure': 'equil_structure.pdb',\n", " 'equil_nvt_structure': None,\n", @@ -578,7 +577,7 @@ " 'nonbonded_method': 'nocutoff',\n", " 'rigid_water': True,\n", " 'small_molecule_forcefield': 'openff-2.0.0'},\n", - " 'vacuum_output_settings': {'checkpoint_interval': ,\n", + " 'vacuum_output_settings': {'checkpoint_interval': ,\n", " 'checkpoint_storage_filename': 'vacuum_checkpoint.nc',\n", " 'forcefield_cache': 'db.json',\n", " 'output_filename': 'vacuum.nc',\n", @@ -904,7 +903,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 19, "id": "f62f69a1-09c0-4a4a-9b37-9663b51a75ac", "metadata": {}, "outputs": [], @@ -922,7 +921,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 20, "id": "3b459b28-a4dc-4fa9-a961-b106c45d79ce", "metadata": {}, "outputs": [ @@ -935,7 +934,7 @@ " 'pint_unit_registry': 'openff_units'}" ] }, - "execution_count": 15, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -961,7 +960,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.6" } }, "nbformat": 4,