ChemicalSystems, Components and Thermodynamic Cycles#

Chemical Systems#

In order to define the input systems to a Protocol, which correspond as the end states of an alchemical transformation, we need an object model to represent their chemical composition. In openfe a ChemicalSystem is used to capture this information, and represents the chemical models that are present in each end state.

A ChemicalSystem does include information, where present, on:

  • exact atomic information (including protonation state) of protein, ligands, co-factors, and any crystallographic waters

  • atomic positions of all explicitly defined components such as ligands or proteins

  • the abstract definition of the solvation environment, if present

It does not include any information on:

  • forcefield applied to any component, including details on water model or virtual particles

  • thermodynamic conditions, i.e. temperature and pressure

Components#

A ChemicalSystem is composed of many Component objects, each representing a single ‘’piece’’ of the overall system. Examples of components include:

Splitting the total system into components serves three purposes:

  • alchemical transformations can be easily understood by comparing the differences in Components

  • components can be reused to compose different systems

  • Protocol s can treat different components differently, for example applying different force fields

Thermodynamic Cycles#

With a language to express chemical systems piecewise, we can now also construct thermodynamic cycles based on these. The exact end states to construct are detailed in the pages for each specific Protocol. For example to construct the classic relative binding free energy cycle, we will need four components, two ligands, a protein, and a solvent. These four ingredients can then be combined into the four points on the thermodynamic cycle that we wish to sample:

import openfe

# two small molecules defined in a molfile format
ligand_A = openfe.SmallMoleculeComponent.from_sdf_file('./ligand_A.sdf')
ligand_B = openfe.SmallMoleculeComponent.from_sdf_file('./ligand_B.sdf')
# a complete biological assembly
protein = openfe.ProteinComponent.from_pdb_file('./protein.pdb')
# defines an aqueous solvent environment, with a concentration of ions
solvent = openfe.SolventComponent(smiles='O')

# ligand_A + protein + solvent
ligand_A_complex = openfe.ChemicalSystem(components={'ligand': ligand_A, 'protein': protein, 'solvent': solvent})
# ligand_B + protein + solvent
ligand_B_complex = openfe.ChemicalSystem(components={'ligand': ligand_B, 'protein': protein, 'solvent': solvent})
# ligand_A + solvent
ligand_A_solvent = openfe.ChemicalSystem(components={'ligand': ligand_A, 'solvent': solvent})
# ligand_A + solvent
ligand_B_solvent = openfe.ChemicalSystem(components={'ligand': ligand_B, 'solvent': solvent})
RBFE thermodynamic cycle

Illustration of the relative binding free energy thermodynamic cycles and the chemical systems at each end state.#

See Also#