diff --git a/easy_campaign/rhfe-python-tutorial.ipynb b/easy_campaign/rhfe-python-tutorial.ipynb new file mode 100644 index 0000000..3c29ac5 --- /dev/null +++ b/easy_campaign/rhfe-python-tutorial.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "35354229", + "metadata": {}, + "source": [ + "# Setting up a relative hydration free energy network\n", + "\n", + "This tutorial gives a step-by-step process to set up a relative hydration free energy (RHFE) simulation campaign using OpenFE. This tutorial is designed as an accompaniment to the CLI tutorial found in the same directory as this notebook.\n", + "\n", + "With the CLI, all the steps here were performed by the `openfe plan-rhfe-network` command. However, that command offers little room for customization. Using the Python interface gives us the ability to customize all aspects of how our simulation runs." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fc97de03", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import openfe" + ] + }, + { + "cell_type": "markdown", + "id": "2fea29c3", + "metadata": {}, + "source": [ + "## Loading the molecules\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(\"./molecules/rhfe/benzenes_RHFE.sdf\", removeHs=False)\n", + "ligands = [openfe.SmallMoleculeComponent.from_rdkit(mol) for mol in supp]\n", + "\n", + "name_to_ligand = {ligand.name: ligand for ligand in ligands}" + ] + }, + { + "cell_type": "markdown", + "id": "6963be83", + "metadata": {}, + "source": [ + "## Creating the `LigandNetwork`\n", + "\n", + "The first step is to create a `LigandNetwork`, which is a network with small molecules as nodes, and atom mappings, the description of how to alchemically mutate between the molecules, as its edges.\n", + "\n", + "The pipeline for creating a `LigandNetwork` can involve three components:\n", + "\n", + "* **Atom Mapper**: Proposes potential atom mappings (descriptions of the alchemical change) for pairs of ligands. We will use the `LomapAtomMapper`.\n", + "* **Scorer**: Given an atom mapping, provides an estimate of the quality of that mapping (lower scores are better). We will use `default_lomap_scorer`.\n", + "* **Network Planner**: Creates the actual `LigandNetwork`; different network planners provide different strategies. We will create a minimal spanning network with the `generate_minimal_spanning_network` method.\n", + "\n", + "Each of these components could be replaced by other options." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5a3cf244", + "metadata": {}, + "outputs": [], + "source": [ + "mapper = openfe.LomapAtomMapper(element_change=False)\n", + "scorer = openfe.lomap_scorers.default_lomap_score\n", + "network_planner = openfe.ligand_network_planning.generate_minimal_spanning_network" + ] + }, + { + "cell_type": "markdown", + "id": "acc13581", + "metadata": {}, + "source": [ + "The exact call signature depends on the network planner: a minimal spanning network requires a score, whereas that is optional for a radial network (but a radial network needs the central ligand to be provided)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f6e7bce5", + "metadata": {}, + "outputs": [], + "source": [ + "ligand_network = network_planner(\n", + " ligands=ligands,\n", + " mappers=[mapper],\n", + " scorer=scorer\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "b7492637", + "metadata": {}, + "source": [ + "Now we can look at the overall structure of the `LigandNetwork`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e6ca6131", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zOXavt3luusul6t6dZcrM9PyXwMAgGLlNRaBSBoxYoRSU1MVERGhtLQ03XrrrZo8ebJmz56tKlWq6IsvvlCrVq302muvyXWBB6dERETo1ltv1SeffKItW7Zo5MiRio6O1rZt23TfffepTp06euCBB7R9+3Yv/3YoibAws93L8eNmc+oRI8xiDsncn+iOZ5+VbrvNzGYmJEjffy+tWmUWgwAAYKeAfBRcSa1evVq9e/dWTk6OWrVqpaVLl+rs2bO64447tGLFCklSUlKS/vvf/7p1j9+xY8f0zjvv6NVXX9WuXbsK3u/atatGjx6tHj16KDw8sLvwb71l7g0sSseO0tKl3q2nNNLTTTt3926pYUO7qwEA4LeKk9cIgL/zxRdfqHv37jpy5IgaNWqkFStWqF69enrppZf06KOP6vTp04qNjdVbb72lnj17ujVmXl6eVq5cqZdfflmLFi0qmEWsV6+e7r33Xo0YMULVq1f35K9lm6wss6VLUXz9ucxpaWZhSqNGJvSNGWNm79autbsyAAD+iABYSjt37lRiYqIyMjJUu3ZtLV++XFdffbW2bdsmh8OhrVu3SpLuuecePf/88ypXrpzbY+/bt0+vv/663nzzTR09elSSaR//5S9/0d///neP/D4omalTzermH34wz/Ht2tVsWF21qnm826RJRX/P32Y2AQCBgQBogQMHDqhbt2765ptvVLlyZS1evFht27bV6dOnNX78eD333HOSpEaNGsnpdCohIaFY4//666+aNWuWXnnlFa1fv/6i25V06iS1bGkeUxYXJ40daw7YJzPzwhs6+/rMJgAgMBUnr7EI5ALq1KmjTz75RNdff71++eUXde3aVR988IHKli2rZ599Vh9++KHq1KmjXbt2qV27dvr73/+u3Nxct8ePjIzU0KFDtW7dOq1fv97tdvKGDdLIkSX9rf5o4kSzB1909KX33Tt61OwFGBIiHTtmXQ3+qEoV6Yorij4IfwAAX0cAvIgqVapo5cqVuvnmm3Xy5En17NlTM2bMkCR16dJFX331lQYOHKjc3Fz99a9/1Y033qi9+c8AK4aEhARNmDDBrc/Gxrq/wbI7zpyRUlKk++679Gfvuktq3ty6awMAAHsQAC+hXLlyWrBggW677Tbl5ubK4XDolVdekSRVrlxZM2fO1HvvvaeYmBh9+umnatmypd59990LbhdTWnFxphWcb/t2szI1MtI8dWLlSjNDN2+ee+NNmCA9+KB0zTUX/9xrr5lZvz//uWR1AwAA30EAdENERIScTqdGjx4tl8ul+++/X0899ZRcLpdCQkI0ZMgQffnll+rYsaNycnI0fPhwDRw4sGCRh6fk5Ul9+pgZwXXrpClTzLNnrfbNN9Lf/mYWRYTy/xgAAPwe/zp3U2hoqF566SU99dRTkqQJEyboT3/6k/Ly8iRJcXFxWr16tSZNmqTw8HDNnj1bzZs3L9g/0BOWL5f27DHBrEULMxM4caK11zh9Who0yGxqXL9+8b//z3/+09qCAABAqREAiyEkJERPPvmkXn75ZYWEhOiVV16Rw+HQmTNnJElhYWF6/PHH9fnnn+uqq67SwYMH1a1bNz344IP69ddfLa9nxw6pXj2pZs3C99q0sfYajz8uNWkiDRlSsu/PmTNHP//8s7VFAQCAUiEAlsDo0aPldDoVHh6umTNnqlevXjpx4kTB+datW2vTpk0aNWqUJGny5MlKSEgo2D/QKi6Xud/Pk1atklJTpfBwc9x0k3m/WjXpyScv/f1z584pLS3Ns0UCAIBiIQCW0KBBg7Rw4UJFR0dr2bJl6tq1qzLP2xguOjpar7zyihYtWqTq1atr27ZtSkhI0AsvvFDQNi6txo2ljAzp8OHC9zZssGToAnPmSF9+KW3ZYo433zTvf/KJNHq0e2PMmjXL2qIAAECpEABL4ZZbbtHKlStVuXJlff755+rYsaMOHDjwm88kJyfrq6++Us+ePXXmzBk9/PDDSkxM1P79+0t9/cRE80zaYcOkrVvNs2rzF4G4OzOYkWGCXUaGdO5cYdA7ftycb9hQatas8GjQwLzfpInk7tPrVq1apSMXeh4cAADwOgJgKbVt21affPKJateurW+++Ubt2rXTzp07f/OZ6tWra/78+XrjjTcUHR2tVatWqXnz5kpNTS3VtcPCzHYvx49LCQnSiBHS+PHmXGSke2M88YQUH2/aucePm9fx8dLGjaUqrUCTJk2Ul5enuXPnWjMgAAAoNR4FZ5F9+/apW7du2rVrl2JjY7V06VK1bt36D5/buXOnhgwZog3/69UOHTpUL730kmX/u6anm9XAu3eb2Tu7vfvuuxo+fLi6dOmiDz/80O5yAAAIWDwKzgZxcXFau3atWrVqpSNHjqhz585avXr1Hz535ZVXKj09XePHj1doaKimTp2qFi1aaPPmzSW6blqatGKFtG+f2QR65EipfXvfCH+S1LVrV0nSmjVrdPj8mxUBAIBtCIAWql69ulavXq3OnTsrJydHt9xyS5GtzzJlyujpp5/Wxx9/rAYNGmjfvn26++67S3TNnBxp1CizIGT4cNMKnj/fnJs0SSpfvuije/dS/KLFUKdOHSUkJNAGBgDAh9AC9oDTp09r3LhxWrVqlUJDQzV+/Hj16dOnyM8eP35czz33nHbu3Knp06dbWkdWlpSdXfS5MmV+u3+gJz377LN65JFH1KlTpyJnRQEAQOkVJ68RAOFx+/btU4MGDRQSEqKDBw+qpreSJwAAQYR7AOFT4uLi1KZNG7lcLtrAAAD4AAIgvGLgwIGS2BQaAABfQACEVwwYMECS9PHHH+vHH3+0uRoAAIIbARBecdlll+n666+Xy+XSnDlz7C4HAICgRgDEJZ09e1bz589XcnKyWrVqpVatWql79+6aPXu2zp496/Y4tIEBAPANBMBS6tRJGjvWvI6LkyZPtq8WTylTpox69+6ttLQ03XPPPTpy5Ig++OADpaSkqFGjRnrrrbfcCoL5beC1a9f+4ZnJAADAewiAFtqwwTyJwyoTJ0rt2knR0VKlSkV/ZswYqXVrqWxZqWVL665dlIiICN1zzz3atWuXXnrpJdWqVUvff/+9RowYoSZNmmjq1Kk6d+7cBb9fr149tWvXjjYwAAA2IwBaKDbWhDWrnDkjpaRI99134c+4XNKdd0q33mrddS8lMjJS999/v/bs2aPnn39esbGx2rNnj4YNG6arr75aM2fOVF5eXpHfpQ0MAID9CIAW+n0LePt2qUMHKTJSatrUPKs3JESaN8+98SZMkB58ULrmmgt/5sUXpdGjpcsvL0XhJRQVFaWHHnpIe/fu1T//+U9VqVJFO3bs0KBBg9S8eXPNmTPnD0Ewvw2cnp6u/fv3e79oAABAAPSUvDypTx8zI7hunTRlijRunN1VeUb58uX16KOP6rvvvtPTTz+tSpUq6euvv9aAAQPUunVrLViwQPkPnKlTp446dOggSZo9e7adZQMAELQIgB6yfLm0Z480darUooWZCZw40e6qPCsmJkbjx4/Xd999pyeeeEIVKlTQli1b1Lt3b7Vp00ZLly6Vy+WiDQwAgM0IgB6yY4dUr550/mNv27Sxrx5vqlSpkiZMmKDvvvtOjz/+uMqVK6eNGzcqKSlJ7du3V2xsrCTps88+U0ZGhs3VAgAQfAiAHuJymfv9glnVqlU1adIk7d27Vw8//LAiIyP12WefadCgQapYsaIk2sAAANiBAOghjRtLGRnS4cOF723YYF89dqpevbqee+457d27Vw888IAiIiKUlZUlSZowYYI+++wzmysEACC4EAA9JDFRathQGjZM2rpVSk8vXATi7sxgRoa0ZYv5ee6ceb1li3T8eOFndu827x06JJ06VfiZM2es/G2sUatWLf373/8u2DJGkrKzs9WuXTslJSVpQ7AmZAAAvIwA6CFhYWa7l+PHpYQEacQIafx4cy4y0r0xnnhCio+XnnzSjBMfb46NGws/M2KEee+NN6SdOws/c/Cg5b+SZerWrat33nlH1113nSQpNDRUS5cuVZs2bdS7d29t2bLF3gIBAAhwIa78/TkuIjs7WxUrVlRWVpZiYmK8UVdASk83q4F37zazg3Y7e/asypQpY9v1X331VY0ePVrNmzdXfHy83nvvvYJ9A/v376+nnnpKzZo1s60+AAD8SXHyGjOAHpSWJq1YIe3bZzaBHjlSat/eN8KfJN15553auXOnbdfv16+fQkNDtXXrVj311FP65ptvNGjQIIWEhGjOnDlq3ry5Hn/8cdvqAwAgUBEAPSgnRxo1yiwIGT7ctILnzzfnJk2Sypcv+uje3Tv1nTt3TnfccYfmzJkjNyaCLVezZk2lpKRIklJTU3XVVVdp+vTp2rp1qwYMGCCXy6Vly5Z5vS4AAAIdLWCbZGaaoyhRUVKdOt6txy65ubm6/PLLVaNGjT8sAtmyZYumTp2qF154wabqAADwH8XJa+Feqgm/U6WKOYJdeHi4OnbsqG+//Vb79+9X3bp1C861bNlSLVu2vOj3775buuoq6c9/lpKTpcGDJYfDw0UDAODnmAEELmDiRGnxYrOtTkSEdOzYb88fPWrC5tat5nX16lLv3qa9zz8mAABvYxEIYIEzZ6SUFOm++4o+HxpqAt+CBWYLnnfeMYt97r3Xq2UCAFBsBEAEjXXrzCbc8+a59/kJE6QHH5Suuabo85Urm3B47bXSZZdJN91kFv188ollJQMA4BEEQASNV17x7PgHD0pz50o33ujZ6wAAUFoEQA/q06ePWrVqpY8//tjj17r7bum558zr5GTJ6fT4Jf3O6NGeGXfQICk62qzcjomR3nzTM9cBAMAqBEAP+eGHHzR//nxt3br1kitZrbBrl7R/v3n9zjtS374ev6Tfufpqz4z7r39JmzaZ1vKePdJDD3nmOgAAWIUA6CGrVq2SJF177bVeXzkdG2tmpDyhUydp7FjzOi5OmjzZM9fxJzVrms2+e/c2z2R+7TXpxx/trgoAgAsjAHpIfgDs0qWL16/9+2C2fbt5BnFkpNS0qVmpWpzFEBeyYYN5vJ1VJk6U2rUz4bVSpaI/k5Eh9ewplSsnVasmPfCAWa3rjm++sazUC8rfVOn0ac9fCwCAkmIjaA9wuVy2BsDz5eVJffpI9eubVbA5OdLDD1szdmysNePky992pW1b6a23/nj+3Dlzf2NsrLR2rdl7b9gwE7peeunS4+cvAgkJca+ejAzztJaMDHPtLVvM+1dcYR7Zt2SJdPiwecRf+fImYD7yiHnec1yce9cAAMAOzAB6wO7du7V//35FRESoXbt2ttayfLm5L23qVKlFCzMTOHGiNWNbPdN4qW1Xli83IWvaNCk+XuraVXr+eek//5Gysy89/l13mZ+Rke7V88QT5jpPPikdP25ex8dLGzea81FR5todOkhNmpjWeI8e0qJF7o0PAIBdmAH0gPzZv3bt2inaUzfjuWnHDqlePXOfWr42bay/jidnGvN99pnUrJlUu3bhezffbNqtX3whde588e/n34p5xRXuXe+dd8xxIZ07S59+6t5YAAD4EgKgB/hK+1cy7VF3W56lkT/TuGZNYdicOFFKTLTuGocOSTVq/Pa9ypXNY9oOHbr09//+d9OebdjQupoAAPBHtIAtlpeXp9WrV0vyjQDYuLG5h+3w4cL3Nmyw/jremmksKsy6G3KvvlqaP9+8njTJ3LdX1NG9u7U1AwDga5gBtNi2bdt05MgRlStXTgkJCXaXo8REM+M1bJj0zDOmNTtunDln5cygN2Yaa9Y07eXz/fKLdPbsH2cGizJhQuHre++VBg4s+nNRUSWvEQAAf0AAtFh++7djx46KiIiwuRopLMwswhgxwqxWvfxy6dlnzVYq7i6GcMf5M435Yczqmca2bU1b+ccfpVq1zHvLl0tly0qtWxdvrCpVzAEAQDAiAFrMrvv/1qwpfL1v32/PNW5stk3Jl55ufrq7GMIdVsw0XmrblW7dzOri2283ITYzU/rzn81j8Ly81zYAAH6NAGih3NxcffTRR5J84/6/fGlpJkA1aiTt3i2NGWP9YggrZhqfeEJ6993CP8fHm5+rV5snkISFSYsXS6NGmfqjoqTBgwufgQwAANwT4nLlP7vgwrKzs1WxYkVlZWV5/bFm/mT9+vW67rrrVLlyZR05ckRhYWF2lyTJ7AH49NPSDz+Yp2fk759XtapZDDFpUuFnW7QonCEsrfR0s0fe7t2svAUAwNOKk9eYAbRQfvu3U6dOPhP+JGnoUHMU5feLIcqWLfl1vDHTCAAASo8AaCFf2v/PXVYuhsjJMY9C+/1Mo/THmcbzdewoLV1qTQ0AAODSaAFb5PTp06pcubJOnTqlr7/+Wk2bNrW7JJ+SmWmOokRFSXXqeLceAAACDS1gG3z++ec6deqUatSooSZNmthdjs9h2xUAAHwHTwKxyPnt3xBvPHsNAACghAiAFvHH+/8AAEBwIgBa4NSpUzp9+rTi4+PVnQfJAgAAH8c9gBaIiorS+vXr7S4DAADALcwAwuedPHlSbdu2VatWrbR9+3a7ywEAwO8RAOHzoqOjVadOHW3evFnvnv+sOAAAUCIEQPiFgf97XMmsWbPkxtaVAADgIgiA8AvJycmKiorS3r17tWnTJrvLAQDArxEAL6JTJ2nsWPM6Lk6aPNm+WoJduXLl1KNHD0lmFhAAAJQcAdBNGzZII0daN15cnBQS8tvjscesGz8Q0QYGAMAabAPjpthY68f829+ku+8u/HP58tZfI5AkJSUpOjpa+/bt08aNG5WQkGB3SQAA+CVmAN30+xbw9u1Shw5SZKTUtKm0cqWZxZs3z/0xK1SQatYsPAiAFxcdHa2ePXtKog0MAEBpEABLIC9P6tNHio6W1q2TpkyRxo0r/jj/7/9JVatKLVtKEydKZ85YXWngoQ0MAEDp0QIugeXLpT17pDVrzMydZAJcYqL7Y4wZI7VqJVWuLK1fLz3+uPTdd9Kbb3qk5IDRvXt3lStXThkZGVq/fr2uu+46u0sCAMDvMANYAjt2SPXqFYY/SWrTpnhjPPigdOONUvPm0ogR0uuvS2+9JR09am2tgSYqKkq9evWSRBsYAICSIgCWgMtl7vez0vXXm5+7d1s7biBKSUmRJKWmpiovL8/magAA8D8EwBJo3FjKyJAOHy58b8OG0o25ebP5WatW6cYJBrfccovKly+vH374QevWrbO7HAAA/A4BsAQSE6WGDaVhw6StW6X09MJFIO7MDH72mfSvf0lbtpj7/mbNku65R+rVS6pf36OlB4Tz28Cpqak2VwMAgP8hAJZAWJjZ7uX4cSkhwdzDN368ORcZeenvly0rvf++edJI06bSE0+Y/QBnzPBk1YElfzUwbWAAAIovxOXGXhrZ2dmqWLGisrKyFBMT4426/E56utkXcPduMzsIz/r1119VvXp15eTkKD09Xe3atbO7JAAAbFWcvMYMYAmlpUkrVkj79plNoEeOlNq3J/x5S2RkpHr37i2J1cAAABQXAbCEcnKkUaPMgpDhw00reP58c27SJPNUj6KO7t1tLTug0AYGAKBkaAF7QGamOYoSFSXVqePdegLV6dOnVb16dWVnZ+uTTz5Rhw4d7C4JAADb0AK2WZUq0hVXFH0Q/qxTtmxZ9enTRxJtYAAAioMACL+W3waePXu2zp07Z3M1AAD4BwIg/FpiYqIqVqyoH3/8Uenp6XaXAwCAXyAAwq9FRESob9++kmgDAwDgLgIg/B5tYAAAiocACL930003qXLlyjp8+LA++eQTu8sBAMDnEQDh92gDAwBQPARABISUlBRJ0pw5c5Sbm2tzNQAA+DYCIAJCfhv4p59+0scff2x3OQAA+DQCIAJCmTJl1K9fP0nm0XAAAODCCIAIGPmrgWkDAwBwcQRABIzOnTuratWqOnLkiD766CO7ywEAwGcRABEwzm8DsxoYAIALIwAioNAGBgDg0giACCidOnVStWrVdPToUa1evdrucgAA8EkEQASU8PBw9e/fXxJtYAAALoQAiICT3waeO3euzp49a3M1AAD4HgIgAs4NN9yg6tWrKzMzU6tWrbK7HAAAfA4BEAGHNjAAABdHAERAym8Dp6Wl6cyZMzZXAwCAbyEAIiB17NhRNWrU0C+//KIPP/zQ7nIAAPApBEAEpLCwMA0YMEASbWAAAH6PAIiAlZKSIok2MAAAv0cARMDq0KGDatasqaysLK1YscLucgAA8BkEQASs89vAqampNlcDAIDvIAAioOWvBp43b55Onz5tczUAAPgGAiACWvv27VWrVi3awAAAnIcAiIAWGhpasBiE1cAAABgEQAS8/Dbw/Pnz9euvv9pcDQAA9iMAIuC1bdtWderUUXZ2tpYvX253OQAA2I4AiIBHGxgAgN8iACIonN8GPnXqlM3VAABgLwIggsJ1112nevXq6fjx41q2bJnd5QAAYCsCIIICbWAAAAoRABE08tvACxYsoA0MAAhqBEAEjTZt2qh+/fo6ceKEli5danc5AADYhgCIoBESElIwC0gbGAAQzAiACCr59wEuXLhQJ0+etLkaAADsQQBEUElISNBll12mkydPasmSJXaXAwCALQiACCrnt4FTU1NtrgYAAHsQABF08gPgokWLdOLECZurAQDA+wiACDqtW7dWgwYNaAMDAIIWARBBh9XAAIBgRwBEUMoPgIsXL9bx48dtrgYAAO8iACIoxcfHq2HDhjp16pQWL15sdzkAAHgVARBBiTYwACCYEQARtPID4JIlS5STk2NzNQAAeA8BEEGrRYsWatSokX799VctWrTI7nIAAPAaAiCCFm1gAECwIgAiqOUHwKVLlyo7O9vmagAA8A4CIILaNddco6uuukqnT5/WwoUL7S4HAACvIAAiqNEGBgAEIwIggl5KSook6YMPPlBWVpbN1QAA4HkEQAS9Zs2aqXHjxjpz5owWLFhgdzkAAHgcARBB7/w2cGpqqs3VAADgeQRAQIWrgZctW6Zjx47ZWwwAAB5GAAQkXX311WratCltYABAUCAAAv/DamAAQLAgAAL/k78aePny5frll19srgYAAM8hAAL/07RpUzVr1kxnz57V/Pnz7S4HAACPIQAC56ENDAAIBgRA4Dz5beAVK1YoMzPT5moAAPAMAiBwnsaNG6t58+bKzc3VvHnz7C4HAACPIAACv0MbGAAQ6AiAwO/kt4FXrlypo0eP2lwNAADWIwACv3PllVeqZcuWOnfunNLS0uwuBwAAyxEAgSLQBgYABDICIFCE/DbwqlWrdOTIEZurAQDAWgRAoAhXXHGF4uPjaQMDAAISARC4gPw2cGpqqs2VAABgLQIgcAG0gQEAgYoACFxAw4YN1bp1a+Xl5Wnu3Ll2lwMAgGUIgMBFsBoYABCICIDAReS3gdesWaPDhw/bXA0AANYgAAIX0aBBAyUkJNAGBgAEFAIgcAm0gQEAgYYACFxCfhv4o48+0qFDh2yuBgCA0iMAApdw2WWX6brrrpPL5dKcOXPsLgcAgFIjAAJuoA0MAAgkBEDADQMGDJAkffLJJzp48KDN1QAAUDoEQMAN9evXV9u2bWkDAwACAgEQcBNtYABAoCAAAm7KbwOvXbtWBw4csLkaAABKjgAIuKlu3bpq166dJGn27Nk2VwMAQMkRAIFiyG8Dp6am2lwJAAAlRwAEiiG/DZyenq79+/fbXA0AACVDAASKoU6dOurQoYMk2sAAAP9FAASKidXAAAB/RwAEiql///4KCQnRZ599poyMDLvLAQCg2AiAQDHVrl1bHTt2lEQbGADgnwiAQAnQBgYA+DMCIFAC+W3gdevWad++fXaXAwBAsRAAgRKoWbOmbrzxRkm0gQEA/ocACJQQbWAAgL8iAAIl1K9fP4WGhmrDhg367rvv7C4HAAC3EQCBEqpRo4Y6deokiUfDAQD8CwEQKAXawAAAf0QABEqhb9++Cg0N1RdffKE9e/bYXQ4AAG4hAAKlUL16dXXu3FkSbWAAgP8gAAKllN8GJgACAPwFARAopb59+yosLEybNm3S7t277S4HAIBLIgACpRQbG6suXbpIYhYQAOAfCICABVgNDADwJwRAwAL5beAtW7Zo586ddpcDAMBFEQABC1StWlVdu3aVRBsYAOD7CICARWgDAwD8BQEQsEifPn0UHh6urVu3avv27XaXAwDABREAAYtUqVJFiYmJkmgDAwB8GwEQsBBtYACAPyAAAhbq3bu3ypQpo23btumbb76xuxwAAIpEAAQsVLlyZXXr1k0SbWAAgO8iAAIWow0MAPB1BEDAYr169VKZMmX0zTff6Ouvv7a7HAAA/oAACFisUqVKuvnmmyUxCwgA8E0EQMAD8tvAqampcrlcNlcDAMBvEQABD+jVq5ciIiL07bff0gYGAPgcAiDgARUrVtQtt9wiiTYwAMD3EAABDzl/NTBtYACALyEAAh7Ss2dPlS1bVjt27NBXX31ldzkAABQgAAIeEhMTo+7du0uiDQwA8C0EQMCDaAMDAHwRARDwoB49eigyMlK7du3Sl19+aXc5AABIIgACHlWhQgUlJSVJog0MAPAdBEDAw2gDAwB8DQEQ8LDk5GRFRUVpz5492rx5s93lAABAAAQ8rXz58kpOTpZEGxgA4BsIgIAX0AYGAPgSAiDgBUlJSYqKitJ3332nL774wu5yAABBjgAIeEG5cuXUo0cPSbSBAQD2IwACXpLfBk5NTaUNDACwFQEQ8JKkpCRFR0dr37592rhxo93lAACCGAEQ8JLo6Gj17NlTEm1gAIC9CICAF7EaGADgCwiAgBd1795d5cqVU0ZGhtavX293OQCAIEUABLwoKipKvXr1kkQbGABgHwIg4GXnrwbOy8uzuRoAQDAiAAJedsstt6h8+fL64YcftG7dOrvLAQAEIQIg4GWRkZHq3bu3JNrAAAB7EAABG9AGBgDYiQAI2KBbt26KiYnRgQMH9Nlnn9ldDgAgyBAAARvQBgYA2IkACNiENjAAwC4EQMAm3bp1U8eOHVWzZk1t2bLF7nIAAEEk3O4CgGAVERGhjz/+2O4yAABBiBlAAACAIEMABAAACDIEQAAAgCBDAAQAAAgyBEAAAIAgQwAEvKxTJ2nsWPM6Lk6aPNm+WgAAwYkACNhowwZp5EjrxuvVS6pfX4qMlGrVkm6/XTp40LrxAQCBgQAI2Cg2VoqOtm68zp2lWbOkHTukOXOkPXukAQOsGx8AEBgIgICNft8C3r5d6tDBzOA1bSqtXCmFhEjz5rk33oMPStdfL112mdSunfTYY9Lnn0tnz3qgeACA3+JJIICPyMuT+vQxLdx166ScHOnhh0s+Xmam5HSaIFimjGVlAgACADOAgI9Yvty0bKdOlVq0MDOBEycWf5xHH5XKlZOqVpUyMqT5862vFQDg3wiAgI/YsUOqV0+qWbPwvTZtij/OX/4ibd5sAmVYmDR0qORyWVcnAMD/0QIGfITLZe73K61q1cxx5ZVSkyYmVH7+udS2benHBgAEBmYAAR/RuLFp2R4+XPjehg2lGzN/5u/06dKNAwAILMwAAj4iMVFq2FAaNkx65hmzCGTcOHPOnZnB9evN0aGDVLmytHev9MQTZkxm/wAA52MGEPARYWFmu5fjx6WEBGnECGn8eHMuMvLS34+KkubOlW66SbrqKunOO6VmzaSPPpLKlvVo6QAAPxPicl369vDs7GxVrFhRWVlZiomJ8UZdACSlp5sZvd27zUweAAAXUpy8RgsY8CFpaVL58lKjRib0jRkjtW9P+AMAWIsWMOBDcnKkUaPMgpDhw00rOH8fv0mTTDgs6uje3dayAQB+hhYw4CcyM81RlKgoqU4d79YDAPAttICBAFSlijkAACgtWsAAAABBhgAIAAAQZAiAAAAAQYYACAAAEGQIgIAPe+utt9SqVSu1atVKn332md3lAAACBAEQ8GEJCQnavHmzNm/erClTpthdDgAgQBAAAR92zTXXqFq1apKkOXPm6OzZszZXBAAIBARAwIeFhISoV69ekqScnBytXr3a5ooAAIGAAAj4uB49ehS8Tk1NtbESAECgIAACPu6mm25SWFiYJGn27Nm0gQEApUYABHxcTEyMOnbsKEk6duwYbWAAQKkRAAE/kJycXPCaNjAAoLTC7S4AwKX17dtX06dPlyTt2rVLZ8+eVZkyZWyuCgDgrwiAgB9o2LChNm3aZHcZAIAAQQsYAAAgyBAAAQAAggwBEAAAIMgQAAEAAIIMARDwUZ06SWPHmtdxcdLkyfbVAgAILARAwA9s2CCNHGnNWPv2SXfdJTVoIEVFSQ0bSk8+KZ05Y834AADfxzYwgB+IjbVurO3bpbw86Y03pCuukLZtk+6+WzpxQnruOeuuAwDwXcwAAn7g9y3g7dulDh2kyEipaVNp5UopJESaN+/SY91yi/T221K3btLll0u9ekl//rM0d66HigcA+BxmAAE/k5cn9ekj1a8vrVsn5eRIDz9cujGzsqQqVSwpDwDgBwiAgJ9Zvlzas0das0aqWdO8N3GilJhYsvH27JFeekl6/nnLSgQA+DhawICf2bFDqlevMPxJUps2JRvr4EHTEk5JkUaMsKY+AIDvIwACfsblMvf7ldbBg1LnzlLbttKUKaUfDwDgPwiAgJ9p3FjKyJAOHy58b8OG4o1x4IDZZ7BVK7MgJJS/CQAgqPDXPuBnEhPN3n3Dhklbt0rp6dK4ceacOzODBw+a8Fevntn25cgR6dAhcwAAggOLQAA/ExZmtnsZMUJKSDBbuTz7rNSzp9kW5lKWL5d27zZH3bq/PedyeaRkAICPCXG5Lv1XfnZ2tipWrKisrCzFxMR4oy4AxZCebvYF3L3bzA4CAIJPcfIaM4CAH0pLk8qXlxo1MqFvzBipfXvCHwDAPdwDCPihnBxp1CizIGT4cNMKnj/fnJs0yYTDoo7u3W0tGwDgI2gBAwEmM9McRYmKkurU8W49AADvoAUMBLEqVXisGwDg4mgBAwAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgEEDWr1+vVq1aqXPnzjp79qzd5QAAfBQBEAggrVq10v79+7VmzRqtXr3a7nIAAD6KAAgEkPDwcPXv31+SNGvWLJurAQD4KgIgEGBSUlIkSWlpabSBAQBFIgACAeaGG25QbGysMjMzaQMDAIpEAAQCDG1gAHBfp07S2LHmdVycNHmyfbV4EwEQCEC0gQGg+DZskEaOtG68iROldu2k6GipUqULf+6dd6TmzaXISKlmTen++62r4UIIgEAAog0MAMUXG2vCmlXOnJFSUqT77rvwZ154QRo3TnrsMenrr6UPP5Ruvtm6Gi6EAAgEINrAAFB8v28Bb98udehgZuaaNpVWrpRCQqR589wbb8IE6cEHpWuuKfr8L79I48dLU6dKgwdLDRtKV18t9exZyl/EDQRAIEDRBgaAksvLk/r0MTOC69ZJU6aYmTorrVhhrnPggNSkiVS3rjRwoPTDD9ZepygEQCBA0QYGgJJbvlzas8fMzrVoYWYCJ0609hp795oAOGmSmXmcPVvKzJQSE0372JMIgECAog0MACW3Y4dUr55ZlJGvTRtrr5GXJ509K734ornv7/rrpRkzpF27JE//dzsBEAhgtIEBoGRcLnO/nyfVqmV+Nm1a+F5srFStmpSR4dlrEwCBAEYbGABKpnFjE8IOHy58b8MGa6/Rvr35uWNH4XuZmdLPP0uXXWbttX6PAAgEMNrAAFAyiYlmVe6wYdLWrVJ6euEiEHdnBjMypC1bzM9z58zrLVuk48fN+SuvlHr3lsaMkT79VNq2zVyvcWOpc2cP/FLnIQACAY42MAAUX1iY2e7l+HEpIUEaMcJs2SKZbWHc8cQTUny89OSTZpz4eHNs3Fj4malTpeuuk5KTpRtvlMqUkT74wPz0pBCXy+W61Ieys7NVsWJFZWVlKSYmxrMVAbBUbm6u6tSpo59++kkffPCBbvbGDqMAEIDS081q4N27zeygrylOXmMGEAhw4eHh6tevnyQpNTXV5moAwH+kpZm9+vbtM5tAjxxp7tvzxfBXXARAIAjQBgYQjH788Uc5nc4Sfz8nRxo1ytyTN3y4aQXPn2/OTZoklS9f9NG9uzX1exItYCAI0AYGECyys7M1d+5cOZ1OrVq1Si1atNCmTZssv05mpjmKEhUl1alj+SUvqTh5LdxLNQGwUX4b+PXXX1dqaioBEEBAOXPmjJYuXSqn06mFCxfq119/LTjXokULj1yzShVz+CtmAIEgsWrVKt10002qUqWKDh06pDKeXmIGAB6Ul5en9PR0OZ1OpaamKvO86bjGjRtryJAhGjx4sBo0aGBjld7FDCCAP7jhhhtUvXp1/fTTT1q1ahWzgAD80rZt2+R0OjV9+nRlnPe4jFq1amnQoEFyOByKj49XiKcf4+HnCIBAkKANDMBf7d+/XzNmzNC0adO0devWgvcrVKigAQMGyOFwqFOnTgoLC7OxSv9CCxgIIrSBAfiLY8eOafbs2XI6nfroo4+UH1fKlCmjpKQkORwO9ejRQ1FRUTZX6jtoAQMoEm1gAL7s119/1ZIlSzRt2jQtXrxYZ86cKTh3ww03yOFwaMCAAariz6svfAQBEAgitIEB+Jq8vDx99NFHcjqdmj17trKysgrONWvWTA6HQ4MGDdJll11mY5WBhxYwEGRoAwOwm8vl0pdffimn06kZM2bowIEDBefq1q2rwYMHy+FwqHnz5jZW6X9oAQO4INrAAOzy/fffa/r06XI6nfr6668L3q9UqZJSUlLkcDjUsWNHhYbyoDJPIwACQYY2MABvOnr0qFJTU+V0OrV27dqC98uWLasePXrI4XAoKSlJZcuWtbHK4EMLGAhCtIEBeNKpU6e0cOFCTZs2TR988EHBM8hDQkLUuXNnORwO9evXT5UqVbK30ABDCxjARdEGBmC1c+fOadWqVXI6nZo7d65ycnIKzrVs2bJgMUcdOx6Siz8gAAJBiDYwACu4XC5t2rRJ06ZN08yZM3Xo0KGCc3FxcQWLOZo2bWpjlSgKLWAgSNEGBlBSe/bsKVjMsWPHjoL3q1SpooEDB2rIkCFq164dj2PzMlrAAC6JNjCA4jhy5Ijef/99OZ1Off755wXvR0ZGqnfv3nI4HLr55psVERFhY5VwFwEQCFK0gQFcyokTJzR//nw5nU4tW7ZM586dkySFhoaqa9eucjgc6tu3rypUqGBzpSguWsBAEFu9erW6dOlCGxhAgdzcXK1YsUJOp1Pz5s3TiRMnCs5de+21cjgcuu2221SzZk0bq0RRaAEDcAttYACSWcyxfv16TZs2Te+//76OHDlScK5hw4ZyOBwaPHiwrrrqKhurhJUIgEAQCwsLow0MBLGdO3fK6XTK6XRqz549Be/Hxsbq1ltv1ZAhQ9SmTRsWcwQgWsBAkKMNDASXQ4cOaebMmXI6ndq4cWPB+9HR0erbt68cDoe6du3K3wV+iBYwALfRBgYCX05OjtLS0uR0OrVy5Url5eVJMl2Abt26aciQIerdu7fKlStnc6XwFgIgEORoAwOB6cyZM1q2bJmcTqcWLFigU6dOFZy7/vrr5XA4NHDgQFWvXt3GKmEXWsAAaAMDAcLlcunTTz+V0+nUrFmzdPTo0YJzV111VcFijoYNG9pYJTyFFjCAYqENDPi3b775Rk6nU9OnT9e+ffsK3q9Zs6Zuu+02ORwOtW7dmsUcKEAABEAbGPBDBw4c0IwZM+R0OrVly5aC9ytUqKB+/frJ4XCoS5cuCgsLs69I+CxawAAk0QYG/EFWVpbmzJkjp9Op1atXK/9f4eHh4erevbuGDBminj17KioqyuZKYQdawACKjTYw4JtOnz6tJUuWyOl0atGiRTp9+nTBuQ4dOsjhcCglJUVVq1a1sUr4GwIgAEm0gQFfkpeXp08++UROp1Opqak6duxYwbmmTZtqyJAhGjRokOLi4myrEf6NFjCAArSBAXtt3bpVTqdTM2bM0A8//FDwfp06dTRo0CA5HA61aNGCxRwoEi1gACVCGxjwvoyMDM2YMUPTpk3Ttm3bCt6vWLGiBgwYIIfDoRtuuIHFHLAUARBAAdrAgHdkZmZq9uzZcjqd+vjjjwvej4iIUHJyshwOh5KTkxUZGWljlQhktIAB/AZtYMAzTp06pUWLFsnpdGrJkiU6e/asJCkkJEQ33nijHA6H+vfvr8qVK9tcKfwVLWAAJUYbGLDOuXPntGbNGjmdTs2ZM0fZ2dkF55o3b64hQ4botttuU7169WysEsGIAAjgN2gDA6Xjcrm0efNmOZ1OzZw5UwcPHiw4V79+fQ0ePFgOh0PNmjWzsUoEO1rAAP6ANjBQfN99952mT5+uadOmafv27QXvV65cWQMHDpTD4VD79u0VGhpqY5UIZLSAAZQKbWDAPT///LNmzZolp9OpTz/9tOD9yMhI9ezZUw6HQ927d1dERISNVQJ/RAAE8AdhYWHq37+/XnvtNc2aNYsACJzn5MmTmj9/vpxOp5YtW6bc3FxJUmhoqLp06SKHw6F+/frRMYNPowUMoEi0gYFCubm5+vDDD+V0OpWWlqbjx48XnGvVqpUcDoduu+021a5d28YqEexoAQMoNdrACHYul0sbNmyQ0+nU+++/r8OHDxeca9CggRwOhxwOhxo3bmxjlUDJEAABFIk2MILV7t275XQ65XQ6tWvXroL3q1WrpltvvVUOh0PXX389j2ODX6MFDOCCaAMj2AwdOlTvvfdewZ+joqLUp08fORwOdevWjX8G4NNoAQOwBG1gBJtt27YpLCxMiYmJcjgc6tOnj8qXL293WYDl2IwIwAXlt4EladasWTZXA3jeX/7yFx04cEBLly7VkCFDCH8IWARAABeVkpIiSZo3b17Bs0uBQDVo0CDVqFHD7jIAjyMAArio/DZwZmamVq1aZXc5CBCdOkljx5rXcXHS5Mn21QIEIwIggIuiDQxP27BBGjnS+nFPn5ZatpRCQqQtW6wfH/BnBEAAl0QbGJ4UGytFR1s/7iOPSOzLDBSNAAjgkmgDw5N+3wLevl3q0EGKjJSaNpVWrjSzePPmuT/m0qXS8uXSc89ZXCwQIAiAAC6JNjC8JS9P6tPHzAiuWydNmSKNG1e8MQ4flu6+W3rvPc/MLAKBgAAIwC20geENy5dLe/ZIU6dKLVqYmcCJE93/vsslDR8u3XuvdO21HisT8HsEQABuoQ0Mb9ixQ6pXT6pZs/C9Nm3c//5LL0nZ2dLjj1tfGxBICIAA3EIbGN7gcpn7/Upq1Srp88+lsmWl8HDpiivM+9deKw0bZk2NQCAgAAJwG21geFrjxlJGhrmPL9+GDe5//8UXpS+/NNu+bNkiLVli3n///eK1koFAx7OAAbiNZwPD0xITpYYNzWzdM89IOTmFi0DcmRmsX/+3f85/klvDhlLdutbWCvgzZgABuI02MDwtLMxs93L8uJSQII0YIY0fb85FRtpaGhBQQlwul+tSH8rOzlbFihWVlZWlmJgYb9QFwEetXr1aXbp0UZUqVXTo0CGVKVPG7pIQ4NLTzWrg3bvNTB6AohUnrzEDCKBYWA0MT0tLk1askPbtM5tAjxwptW9P+AOsRAAEUCy0geFpOTnSqFFmQcjw4aYVPH++OTdpkrmvr6ije3dbywb8Ci1gAMWW3wauXLmyDh8+TBsYXpOZaY6iREVJdep4tx7AlxQnr7EKGECxnb8a+MMPP9Qtt9xid0kIElWqmANA6dACBlBs57eBU1NTba4GAFBcBEAAJZK/KXRaWhqbQgOAnyEAAiiR/DbwL7/8og8//NDucgAAxUAABFAitIEBwH8RAAGUGG1guOu1115Tq1at1KZNG33++ed2lwMEPQIggBKjDQx3vP322xo1apQ2b96se+65R9dff73dJQFBjwAIoMRoA+NSVq5cqZEjR0qSxo0bp7vuusvmigBIBEAApUQbGBfy1VdfqX///srNzdXgwYP19NNP210SgP8hAAIoFdrAKMrBgweVnJys7Oxs3Xjjjfrvf/+rkJAQu8sC8D8EQAClQhsYv5eTk6Pk5GT98MMPaty4sdLS0lS2bFm7ywJwHgIggFKjDYx8ubm5uu2227RlyxZVr15dS5YsUeXKle0uC8DvEAABlBptYEiSy+XSn/70Jy1ZskRRUVFauHChGjRoYHdZAIpAAARQarSBIUnPPfecXn/9dYWEhGj69Olq06aN3SUBuAACIABL0AYObqmpqXrkkUckSf/617/Up08fewsCcFEEQACWoA0cvNLT03X77bdLkh544AGNGTPG5ooAXAoBEIAlaAMHp127dql37946ffq0evfurRdeeMHukgC4gQAIwDK0gYPLzz//rKSkJB09elQJCQlyOp0KCwuzuywAbiAAArAMbeDgcerUKfXu3Vu7d+9WXFycFi5cqHLlytldFgA3EQABWIY2cHDIy8vTsGHD9Omnn6pSpUpasmSJatSoYXdZAIqBAAjAUgMHDpREGziQPfbYY0pNTVWZMmU0b948NWnSxO6SABQTARCApTp27KgaNWrQBg5Qr732mp599llJ0ttvv60bb7zR5ooAlAQBEIClwsLC1K9fP0m0gQPNkiVLdP/990uSnn76aTkcDpsrAlBSBEAAlqMNHHg2bdqkgQMHKi8vT3feeafGjRtnd0kASoEACMBytIEDS0ZGhnr06KETJ06oa9euBY97A+C/CIAALEcbOHBkZWUpOTlZP/74o5o1a6bZs2erTJkydpcFoJQIgAA8gjaw/zt79qwGDBigbdu2qVatWlqyZIkqVqxod1kALEAABOARtIH9m8vl0j333KOVK1eqXLlyWrx4serVq2d3WQAsQgAE4BG0gf3b3//+d7399tsKDQ3VrFmzFB8fb3dJACxEAATgMbSB/dO0adP0xBNPSJJeeeUVJSUl2VwRAKsRAAF4DG1g/7NmzRrdeeedkqRHHnlE9957r80VAfAEAiAAj6EN7F++/fZb9e3bV2fPntXAgQP1j3/8w+6SAHgIARCAR9EG9g+HDh1S9+7ddezYMbVr107vvvuuQkP5VwQQqPinG4BH0Qb2fSdOnFDPnj31/fff64orrtD8+fMVGRlpd1kAPIgACMCjaAP7tnPnzmnw4MHauHGjqlatqqVLl6patWp2lwXAwwiAADyONrDveuihh7RgwQKVLVtW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", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from openfe.utils.atommapping_network_plotting import plot_atommapping_network\n", + "plot_atommapping_network(ligand_network)" + ] + }, + { + "cell_type": "markdown", + "id": "5f99678c", + "metadata": {}, + "source": [ + "We can also inspect the individual atom mappings:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c55cbcac", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get the first edge; it automatically displays in a Jupyter notebook\n", + "mapping = next(iter(ligand_network.edges))\n", + "mapping" + ] + }, + { + "cell_type": "markdown", + "id": "056924a3", + "metadata": {}, + "source": [ + "## Creating a single `Transformation`\n", + "\n", + "The `LigandNetwork` only knows about the small molecules and the alchemical connections between them. It doesn't know anything about environment (e.g., solvent) or about the `Protocol` that will be used during the simulation.\n", + "\n", + "That information in included in a `Transformation`. Each of these transformations corresponds to a single leg of the simulation campaign, so for each edge in the `LigandNetwork`, we will create two `Transformation`s: one for vacuum and one for solvent.\n", + "\n", + "In practice, this will be done for each edge of the `LigandNetwork` in a loop, but for illustrative purposes we'll dive into the details of creating a single transformation. In particular, we'll create the solvent leg for the pair of molecules we selecting for the mapping above." + ] + }, + { + "cell_type": "markdown", + "id": "d0cb1329", + "metadata": {}, + "source": [ + "### 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, and binding free energy calculations involve a `ProteinComponent`.\n", + "\n", + "The `Component`s are joined in a `ChemicalSystem`, which describes all the particles in the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9d2fbc22", + "metadata": {}, + "outputs": [], + "source": [ + "# defaults are water with NaCl at 0.15 M\n", + "solvent = openfe.SolventComponent()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "710285ca", + "metadata": {}, + "outputs": [], + "source": [ + "systemA = openfe.ChemicalSystem({\n", + " 'ligand': mapping.componentA,\n", + " 'solvent': solvent\n", + "})\n", + "systemB = openfe.ChemicalSystem({\n", + " 'ligand': mapping.componentB,\n", + " 'solvent': solvent\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "340d1a6e", + "metadata": {}, + "source": [ + "### Creating a `Protocol`\n", + "\n", + "The actual simulation is performed by a `Protocol`. We'll use an OpenMM-based hybrid topology relative free energy `Protocol`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3f394a0d", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol\n" + ] + }, + { + "cell_type": "markdown", + "id": "3bddfa3c", + "metadata": {}, + "source": [ + "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": 10, + "id": "fb839094", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "298.15 kelvin" + ], + "text/latex": [ + "$298.15\\ \\mathrm{kelvin}$" + ], + "text/plain": [ + "298.15 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "settings = RelativeHybridTopologyProtocol.default_settings()\n", + "settings.thermo_settings.temperature # display default value" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e83630f0", + "metadata": {}, + "outputs": [], + "source": [ + "from openff.units import unit\n", + "\n", + "# change the value\n", + "settings.thermo_settings.temperature = 310.0 * unit.kelvin" + ] + }, + { + "cell_type": "markdown", + "id": "56658a3a", + "metadata": {}, + "source": [ + "We'll use the default settings for the protocol we'll use later, to match the behavior of the CLI." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7adf42d6", + "metadata": {}, + "outputs": [], + "source": [ + "default_settings = RelativeHybridTopologyProtocol.default_settings()\n", + "protocol = RelativeHybridTopologyProtocol(default_settings)" + ] + }, + { + "cell_type": "markdown", + "id": "318ff872", + "metadata": {}, + "source": [ + "### Creating the `Transformation`\n", + "\n", + "Once we have the mapping, the two `ChemicalSystem`s, and the `Protocol`, creating the `Transformation` is easy:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "44ba94ca", + "metadata": {}, + "outputs": [], + "source": [ + "transformation = openfe.Transformation(\n", + " systemA,\n", + " systemB,\n", + " protocol,\n", + " mapping={'ligand': mapping},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4283dfe4", + "metadata": {}, + "source": [ + "To summarize, this `Transformation` contains:\n", + "- chemical models of both sides of the alchemical transformation in `systemA` and `systemB`\n", + "- the correspondence of items in these two sides in `mapping` \n", + "- a description of the exact computational algorithm to use to perform the estimate in `protocol`" + ] + }, + { + "cell_type": "markdown", + "id": "1e29d1c8", + "metadata": {}, + "source": [ + "## Creating the `AlchemicalNetwork`\n", + "\n", + "The `AlchemicalNetwork` contains all the information needed to run the entire campaign. It consists of a `Transformation` for each leg of the campaign. We'll loop over all the mappings, and then loop over the legs. In that inner loop, we'll make each transformation." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "66666a80", + "metadata": {}, + "outputs": [], + "source": [ + "transformations = []\n", + "for mapping in ligand_network.edges:\n", + " for leg in ['solvent', 'vacuum']:\n", + " sysA_dict = {'ligand': mapping.componentA}\n", + " sysB_dict = {'ligand': mapping.componentB}\n", + " if leg == 'solvent':\n", + " # use the solvent created above\n", + " sysA_dict['solvent'] = solvent\n", + " sysB_dict['solvent'] = solvent\n", + " \n", + " # we don't have to name objects, but it can make things (like filenames) more convenient\n", + " sysA = openfe.ChemicalSystem(sysA_dict, name=f\"{mapping.componentA.name}_{leg}\")\n", + " sysB = openfe.ChemicalSystem(sysB_dict, name=f\"{mapping.componentB.name}_{leg}\")\n", + " \n", + " transformation = openfe.Transformation(\n", + " stateA=sysA,\n", + " stateB=sysB,\n", + " mapping={'ligand': mapping},\n", + " protocol=protocol, # use protocol created above\n", + " name=f\"{sysA.name}_{sysB.name}\"\n", + " )\n", + " transformations.append(transformation)\n", + "\n", + "network = openfe.AlchemicalNetwork(transformations)" + ] + }, + { + "cell_type": "markdown", + "id": "6c61fe36", + "metadata": {}, + "source": [ + "## Writing the `AlchemicalNetwork` to disk\n", + "\n", + "We'll write out each transformation to disk, so that they can be run independently using the `openfe quickrun` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d6cebd9a", + "metadata": {}, + "outputs": [], + "source": [ + "import pathlib\n", + "# first we create the directory\n", + "transformation_dir = pathlib.Path(\"transformations\")\n", + "transformation_dir.mkdir(exist_ok=True)\n", + "\n", + "# then we write out each transformation\n", + "for transformation in network.edges:\n", + " transformation.dump(transformation_dir / f\"{transformation.name}.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b96b57a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "lig_10_solvent_lig_15_solvent.json lig_3_vacuum_lig_7_vacuum.json\r\n", + "lig_10_vacuum_lig_15_vacuum.json lig_3_vacuum_lig_9_vacuum.json\r\n", + "lig_11_solvent_lig_14_solvent.json lig_4_solvent_lig_16_solvent.json\r\n", + "lig_11_solvent_lig_16_solvent.json lig_4_solvent_lig_7_solvent.json\r\n", + "lig_11_vacuum_lig_14_vacuum.json lig_4_vacuum_lig_16_vacuum.json\r\n", + "lig_11_vacuum_lig_16_vacuum.json lig_4_vacuum_lig_7_vacuum.json\r\n", + "lig_12_solvent_lig_15_solvent.json lig_5_solvent_lig_10_solvent.json\r\n", + "lig_12_vacuum_lig_15_vacuum.json lig_5_solvent_lig_11_solvent.json\r\n", + "lig_13_solvent_lig_14_solvent.json lig_5_vacuum_lig_10_vacuum.json\r\n", + "lig_13_vacuum_lig_14_vacuum.json lig_5_vacuum_lig_11_vacuum.json\r\n", + "lig_14_solvent_lig_15_solvent.json lig_6_solvent_lig_14_solvent.json\r\n", + "lig_14_vacuum_lig_15_vacuum.json lig_6_solvent_lig_9_solvent.json\r\n", + "lig_15_solvent_lig_16_solvent.json lig_6_vacuum_lig_14_vacuum.json\r\n", + "lig_15_vacuum_lig_16_vacuum.json lig_6_vacuum_lig_9_vacuum.json\r\n", + "lig_1_solvent_lig_14_solvent.json lig_7_solvent_lig_13_solvent.json\r\n", + "lig_1_solvent_lig_9_solvent.json lig_7_vacuum_lig_13_vacuum.json\r\n", + "lig_1_vacuum_lig_14_vacuum.json lig_8_solvent_lig_14_solvent.json\r\n", + "lig_1_vacuum_lig_9_vacuum.json\t lig_8_solvent_lig_9_solvent.json\r\n", + "lig_2_solvent_lig_3_solvent.json lig_8_vacuum_lig_14_vacuum.json\r\n", + "lig_2_vacuum_lig_3_vacuum.json\t lig_8_vacuum_lig_9_vacuum.json\r\n", + "lig_3_solvent_lig_13_solvent.json lig_9_solvent_lig_10_solvent.json\r\n", + "lig_3_solvent_lig_7_solvent.json lig_9_solvent_lig_14_solvent.json\r\n", + "lig_3_solvent_lig_9_solvent.json lig_9_vacuum_lig_10_vacuum.json\r\n", + "lig_3_vacuum_lig_13_vacuum.json lig_9_vacuum_lig_14_vacuum.json\r\n" + ] + } + ], + "source": [ + "!ls transformations/" + ] + }, + { + "cell_type": "markdown", + "id": "c30e8ae2", + "metadata": {}, + "source": [ + "Each of these individual `.json` files contains a `Transformation`, which contains all the information to run the calculation. These could be farmed out as individual jobs on a HPC cluster." + ] + } + ], + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}