{ "cells": [ { "cell_type": "markdown", "id": "035c0099-6892-4ed2-b0d6-80b1c247c1e7", "metadata": {}, "source": [ "# Planning a Ligand Network" ] }, { "cell_type": "markdown", "id": "5da95fa6-c9a7-48a2-9d8e-e35b3b6818f6", "metadata": {}, "source": [ "For an introduction to ``LigandNetwork``s, see [User Guide: Defining the Ligand Network](https://docs.openfree.energy/en/latest/guide/setup/creating_ligand_networks.html). " ] }, { "cell_type": "markdown", "id": "d486ab37-e2fe-4925-b43d-787bf719cf37", "metadata": {}, "source": [ "## Load the Ligands" ] }, { "cell_type": "markdown", "id": "7f1a272a-ffe7-4397-a8a6-c590d3a210bc", "metadata": {}, "source": [ "This cookbook assumes you have already loaded a collection of `SmallMoleculeComponent` objects into an iterable called `ligands`.\n", "\n", "For more information, see the [Loading Small Molecules Cookbook](https://docs.openfree.energy/en/stable/cookbook/loading_molecules.html#loading-small-molecules)." ] }, { "cell_type": "code", "execution_count": 6, "id": "80072b52-ded4-4b38-a5c2-72b87d483f53", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[SmallMoleculeComponent(name=benzene),\n", " SmallMoleculeComponent(name=toluene),\n", " SmallMoleculeComponent(name=phenol),\n", " SmallMoleculeComponent(name=benzonitrile),\n", " SmallMoleculeComponent(name=anisole),\n", " SmallMoleculeComponent(name=benzaldehyde),\n", " SmallMoleculeComponent(name=styrene)]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "from rdkit import Chem\n", "import openfe\n", "\n", "supplier = Chem.SDMolSupplier(\"assets/somebenzenes.sdf\", removeHs=False)\n", "ligands = [openfe.SmallMoleculeComponent(mol) for mol in supplier]\n", "\n", "ligands" ] }, { "cell_type": "markdown", "id": "7096ed4e-1f5a-4df1-8566-e73fe8b81c00", "metadata": {}, "source": [ "## Choose an atom mapper" ] }, { "cell_type": "markdown", "id": "020cf05c-7bcc-4b10-9ba5-f4ded80d2d66", "metadata": {}, "source": [ "The `AtomMapper` will generate the `AtomMappings` that relate two small molecules and serve as the edges of our LigandNetwork.\n", "Atom mapper classes inherit from [LigandAtomMapper].\n", "\n", "Each atom mapper suggests one or more mappings, which can be scored seperately.\n", "As a result, multiple atom mappers can be used to generate additional mappings for network planning.\n", "\n", "[LigandAtomMapper]: https://docs.openfree.energy/en/stable/reference/api/generated/openfe.setup.atom_mapping.LigandAtomMapper.html" ] }, { "cell_type": "code", "execution_count": 2, "id": "5019c471-a173-4097-b6c8-b42bfb701e03", "metadata": {}, "outputs": [], "source": [ "from openmm import unit\n", "\n", "lomap_mapper = openfe.setup.LomapAtomMapper(\n", " time=20, # Time out if MCS algorithm takes 20 seconds\n", " threed=True, # Use atom positions to prune symmetric mappings\n", " max3d=1.0, # Forbid mapping between atoms more than 1.0 Å apart\n", " element_change=True, # Allow mappings that change an atoms element\n", " seed='', # Empty SMARTS string causes MCS search to start from scratch\n", " shift=False, # Keep pre-aligned atom positions for 3D position checks\n", ")\n", "kartograf_mapper = openfe.setup.KartografAtomMapper()\n", "\n", "# to demonstrate passing multiple atom mappers to the planner\n", "mappers = [lomap_mapper, kartograf_mapper]" ] }, { "cell_type": "markdown", "id": "409a3866-a5ac-4295-b91f-3101dd646dc9", "metadata": {}, "source": [ "## Choose a scoring function" ] }, { "cell_type": "markdown", "id": "5998c002-4d39-42c0-b37f-bd0357f27fe6", "metadata": {}, "source": [ "Many ligand network planners require a Mapping Scorer to assign scores (i.e. edge weights) to each of the transformations (i.e. network edges) to be used as an estimation of the quality of the mapping.\n", "\n", "A Mapping Scorer is a function that takes an atom mapping and returns a score between 0.0, very hard to compute, and 1.0 for easy to compute.\n", "\n", "In other words, transformations that are expected to converge quickly without introducing artifacts are scored highly, while more drastic or risky transformations are scored lower.\n", "\n", "Keep in mind that edge scorers are fallible and a score is only the *anticipated* difficulty of a transformation to be used for network creation." ] }, { "cell_type": "code", "execution_count": 3, "id": "3bbf3f5b-9e29-467f-aff8-07e8dad7fd4c", "metadata": {}, "outputs": [], "source": [ "# use LOMAP scorer with defaults\n", "scorer = openfe.lomap_scorers.default_lomap_score " ] }, { "cell_type": "markdown", "id": "c8c40d49-9657-4691-b6b3-d3c133e215d2", "metadata": {}, "source": [ "## Plan the network" ] }, { "cell_type": "markdown", "id": "10232f7b-7aac-4773-8c39-15f672a654b5", "metadata": {}, "source": [ "Finally, pass the ligands, mapper and scorer to a planner to generate the network. A planner takes these three arguments (and perhaps some more) and returns a `LigandNetwork`. Each planner implements a particular strategy for structuring a network. Different strategies may balance the precision-performance trade-off differently, provide edge redundancy for troubleshooting, or be more or less appropriate for a given set of ligands:" ] }, { "cell_type": "code", "execution_count": 7, "id": "9492e2e7-33df-449e-9bd1-847ff52d2029", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "/Users/atravitz/micromamba/envs/openfe-notebooks/lib/python3.13/site-packages/lomap/utils.py:20: DeprecationWarning: generate_lomap_network argument 'molecules' is deprecated, please use 'ligands' instead.\n", " warnings.warn(deprecation_msg, DeprecationWarning)\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\tTrying to remove edge 4-5 with similarity 0.670320\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 4-5\n", "INFO:\tTrying to remove edge 3-4 with similarity 0.670320\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 3-4\n", "INFO:\tTrying to remove edge 3-5 with similarity 0.704688\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 3-5\n", "INFO:\tTrying to remove edge 3-6 with similarity 0.704688\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 3-6\n", "INFO:\tTrying to remove edge 4-6 with similarity 0.704688\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 4-6\n", "INFO:\tTrying to remove edge 2-3 with similarity 0.740818\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 2-3\n", "INFO:\tTrying to remove edge 2-5 with similarity 0.740818\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 2-5\n", "INFO:\tTrying to remove edge 2-6 with similarity 0.740818\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 2-6\n", "INFO:\tTrying to remove edge 1-3 with similarity 0.778801\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 1-5 with similarity 0.778801\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 1-5\n", "INFO:\tTrying to remove edge 1-6 with similarity 0.778801\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 1-6\n", "INFO:\tTrying to remove edge 0-3 with similarity 0.818731\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 0-4 with similarity 0.818731\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 0-4\n", "INFO:\tTrying to remove edge 0-5 with similarity 0.818731\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 0-6 with similarity 0.818731\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 1-4 with similarity 0.860708\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 0-1 with similarity 0.904837\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 0-1\n", "INFO:\tTrying to remove edge 0-2 with similarity 0.904837\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 2-4 with similarity 0.904837\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\tTrying to remove edge 1-2 with similarity 0.951229\n", "INFO:\tChecking edge deletion on distance-to-actives 0 vs 0\n", "INFO:\tRemoved edge 1-2\n", "INFO:\tTrying to remove edge 5-6 with similarity 0.951229\n", "INFO:\tRejecting edge deletion on cycle covering\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n", "INFO:\t#################################\n", "INFO:\tMap Heavy Atoms \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\t#################################\n", "INFO:\tMap Hydrogen Atoms: \n", "INFO:\t#################################\n", "INFO:\tMasking Atoms\n", "INFO:\tBuild Distance Matrix\n", "INFO:\tCalculate Mapping\n", "INFO:\tFind Maximal overlapping connected sets of mapped atoms\n", "INFO:\tFiltering bond breaks\n" ] } ], "source": [ "# Choose the network that minimises the sum of scores\n", "mst_network = openfe.ligand_network_planning.generate_minimal_spanning_network(\n", " ligands=ligands,\n", " mappers=mappers,\n", " scorer=scorer,\n", ");\n", "\n", "# Choose the lomap network that adds some closed ligand cycles\n", "lomap_network = openfe.ligand_network_planning.generate_lomap_network(\n", " molecules=ligands,\n", " mappers=mappers,\n", " scorer=scorer,\n", ");\n", "\n", "# # Connect each ligand to a central ligand\n", "radial_network = openfe.ligand_network_planning.generate_radial_network(\n", " ligands=ligands[1:],\n", " central_ligand=ligands[0],\n", " mappers=mappers,\n", " scorer=scorer,\n", ");" ] }, { "cell_type": "markdown", "id": "6c2f585e-d609-440a-9498-2affc2badc5c", "metadata": {}, "source": [ "## Visualize the Network" ] }, { "cell_type": "markdown", "id": "59727251-0644-4768-9d68-50edc37f501d", "metadata": {}, "source": [ "For more ways to visualize a `LigandNetwork`, see [Visualizing Ligand Networks].\n", "\n", "[Visualizing Ligand Networks]: https://docs.openfree.energy/en/stable/cookbook/ligandnetwork_vis.html" ] }, { "cell_type": "code", "execution_count": 5, "id": "92e0b934-8494-41f4-a0ad-0d0b01b3a8f9", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAGUCAYAAAClYpMzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWEVJREFUeJzt3QmYzWX/x/GvNfu+RLYkoiJEyRZJJFnK0/oQkbJGe097Pf3rqewqUZGUyp6UrUKISNpDKfsu++78r8/965jBDDNjZn7nnN/7dV3nmjP77TfmzOfc9/f+3hlCoVDIAAAAEBgZ/R4AAAAA0hcBEAAAIGAIgAAAAAFDAAQAAAgYAiAAAEDAEAABAAAChgAIAAAQMARAAACAgMmclA86evSorVu3znLnzm0ZMmRI+1EBAAAgWXS2x65du6x48eKWMWPGMw+ACn8lS5ZM3igAAEAgKCMUKlTIgmTLli22evVqi0QaV4kSJc48AGrmL/wF8+TJkzqjAwAAUU8rg7ly5QrcCmEoFLLdu3e7l5Fi586dLoyHc9sZB8DwD1XhjwAIAACCLkOGDEkKWn5IShhnEwgAAEDAEAABAAAChgAIAAAQMARAAACAgCEAAgCAiDZ8uFm+fKn39cqUMevXzwKNAAgAACLaTTeZLVvm9yhiS5LawAAAAPgle3bvhtTDDCAAAEhTn31mVqeOt4xbsKDZddeZ/f67974//1TfOrNx48waNDDLkcOsShWz+fMTXwJeutT7WLXh0/kU1aubLVoU9/6xY80uvNDsrLO85d5XXjn1+HbsMLvrLrMiRbyv17Ch9z1iGQEQAACkqT17zHr3NvvmG7OZM810TG2rVmZHj8Z9zH/+Y3b//WbffWdWvrzZLbeYHT6c8Ne77TYznXSmr7d4sdnDD5tlyeK9T6//619mN99s9sMPZk89Zfb4416ITEgoZNasmdmGDWZTpnifX62a2VVXmW3bZjGLJWAAAJCmbrjh+NfffNObbfv5Z7Ncuby3KfwpiMnTT3szeCtWmF1wwclfb9UqswceiHvf+efHva9PHy+8KfSJwqS+z0svmd1xx8lf64svvKC4aZM3Yygvv2w2YYLZmDHezGAsYgYQAACkKS333nqrWdmy3hLruefGBbmwypXj7hcr5r1UKEuIZhM7djRr1MjshRfilpPll1/Matc+/uP1+vLlZkeOnPy1Fi82273bW5pWGA3fVq48/uvGGmYAAQBAmmre3KxkSbOhQ82KF/eWfi+6yOzgwbiPCS/hSvgo2/hLxPFpWVeB8pNPzD791OzJJ81Gj/aWlbWke+JRuHpbYo4e9QLnl1+e/L7UbD0TaQiAAAAgzWzd6s3KDRliVreu97avvjrzr6ulXd169fLqBd9+2wuAlSqd/PXnzfM+NlOmk79OtWpe/V/mzN6GkaAgAAJACumPxb33ejc/qbhdY/j7b3/Hgeh25MgR27NnT7JvBQsWtCc1BZeI/Pm95dU33vBm2rTsq00bKbVvn1f/d+ON3lLymjXeZpBwneF995nVqGH27LNe/0DtJh40yOzVVxP+eo0amdWqZdaypdmLL5pVqGC2bp23IURvu/RSi0kEQAAAokAoFLKDBw+eMozt3bs3RSFOtwMHDqRoXFWrVj1lANSOXy3P9ujhLfsqYA0YYHbllSm7DprF06xi27ZmGzeaFSpk1rq1t3EkPKP34YdmTzzhhUCFzmeeSXgDiGi5WGFPu5A7dDDbvNns7LPN6tUzK1rUYlaGkP5HncbOnTstb968tmPHDsuj6k0AADOAOIn+pO7bty/FIex0N83SpbUMGTJYzpw5k3wrW7as3XnnnfxviADJyWvMAAJAIjRDoRkLefddb+bhnnu8WYVwkfnevd6swUcfeUtdjz12fNuItWu9HYvTpnkzIWqG279/XK2RZiW0dKu3q1mtiuLVv0znlIaL4rdvN+vZ0+zjj800SVO/vjeDEr/1BdJ+qfN0N82+6ZaEeZUzliVLllOGshw5ciQrxMW/ZcuWzYVAxDYCIACcwogRZprcWLDAO2lA4a50abNOnbz3K7QpED76qNczTAFRS0fqT6ZwqNMKVPg+e7ZXZP7cc2ZNmph9/71Z1qxxfci0TKWX6numuqVLLon7HgqJamExaZLXQuOhh8yuvdbrbRZ/52SQljrPZNkzpUudyaUgldIQdrqbAiBwJgiAAHAKal3Rt68346faJTWM1evhcKYg1qWLd1/BTO9TOwkFQNU9adZv2LC4GUPtVFRrCX1M48be2zRzqCJ1zTDq89QMV6cl6HuEg9/cuWZXXOF9/KhR3rjUqLZNG/9CWjh4nUndWTQtdSblFp5508tMCW05BSIEARAATuHyy4/vKabdgpr1C+eT+M1r9XEqHg83r1WDWc3o6bzS+PbvP77BrE48iJ8VNBuooClqn6GZw8sui3u/dlQqjOp9ybV06VLbtGlTqix3pofTLXWeydInS50IMgIgAJyBE1fiFALDzWv1UofUa8buRIULJ+1rJFZOllCz26Ro3769LVmyxFJT9uzZz6jmjKVOIP0RAAHgFL7++uTXtfkiKat7akfxwQfemacpbaCgpraHD3s1iOElYLXAWLbMrGLF5H+9EiVK2OHDh1N1yTOj1rkBRBUCIACcwurV3i7ezp3Nvv3WbOBAbwk4KW67zTuAvkULrw9ZiRJeE9xx47xGtnr9dBQ29fmqB9RJClpOVhPdc87x3p5ck1RQCCDweNoGAKegZrM6eaBmTbOuXc26dz++zcup5Mjh7f4tVcprVKsZO7WM0ddLzoygNo5oKfm667waRC3/qnEtG0EBpBSNoAHgFH0A1Y5FPfkApNyzzz5r48ePtxtvvNEeVc8k+N4ImhlAAACQpmrWrOk2Hw0YMCBdWvzg9AiAAAAgTTVo0MDy5ctnGzdutLlqagnfEQABIBFq1szyL3DmsmbNai3+2bU0RkfmwHcEQAAAkOZU/ydjx461o+FGl/ANARAAAKS5q6++2nLnzm3r1q2zBWpsCV8RAAEAQJo766yz7Prrr3f3WQb2HwEQAACkixtuuOFYAAwlds4h0gUBEECg7d+/390ApL0mTZq4IwRXrVplixYt4pL7iAAIINDeffddK1++vDVr1sydkQsg7WTPnt39roU3g8A/BEAAgaUlqH79+tnq1autYcOGljkzx6MD6bUbmGVgfxEAAQTW9OnT7aeffrJcuXJZx44d/R4OEAhNmza1bNmy2e+//25Lly71eziBRQAEEFh9+vRxLzt06ODOzwSQ9vSESyFQ2A3sHwIggED6+eefberUqZYhQwbr0aOH38MBAoVlYP8RAAEEkmr/pGXLlnbeeef5PRwgUK677jp3PNxvv/3mnowh/REAAQTOli1bbOTIke5+r169/B4OEDh58uSxxo0bu/ssA/uDAAggcF5//XXX+6969epWp04dv4cDWNCXgZH+CIAAAuXAgQM2ePDgY7N/qgEEkP50LJxaL/34449uKRjpiwAIIFBGjx5tGzZssOLFi1ubNm38Hg4QWPnz57dGjRq5+zSFTn8EQACBavzct29fd7979+6uCB1AZJwNjPRFAAQQGF9++aVr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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", "\n", "plot_atommapping_network(lomap_network)" ] } ], "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.13.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }