{ "cells": [ { "cell_type": "markdown", "id": "78e6090a", "metadata": {}, "source": [ "# Creating Pseudo-Reactions\n", "\n", "> ### In this tutorial we will cover:\n", "> - how we can use the `Reaction` class to define linkages without identifying the participating atoms directly" ] }, { "cell_type": "markdown", "id": "1950974d", "metadata": {}, "source": [ "BuildAMol lives on the idea of connecting two molecules by establishing a bond between two atoms and removing (at least) to others in exchange. This allows us to create aribtrary structures irrespective of chemical constraints. \n", "\n", "Creating a `Linkage` is usually not difficult but requires some manual intervention, e.g. looking at the topology and identifying the right atom ids and residues. Functionalities such as functional groups, constrained atom searching, or automated downstream atom deletion provide some support to at least partially automate the process of identifying the right atoms to use when defining a linkage. However, they usually are either relatively constrained in their applicability (e.g. functional groups) or still require some additional boilerplate code to ultimately assemble finished molecules. \n", "\n", "The `Reaction` class provides a highlevel hub for exactly such boilerplate code to define linkages and connect molecules together. The input for the class are similar to that of a `Linkage` except that instead of providing individual atoms we can provide `function` that will be applied to dynamically obtain the right atoms from molecules when applying the reaction. Therefore Reactions are more powerful versions of the classic `Linkage`.\n", "\n", "> The `Reaction` class is part of the core BuildAMol library as of version `1.2.11`. We can therefore directly use it as `bam.Reaction` after importing.\n", "\n", "Let's check out how we can use it!" ] }, { "cell_type": "markdown", "id": "89b27619", "metadata": {}, "source": [ "## Example 1 - Benzene + EtOH \n", "\n", "To start simple let's have ethanol perform an addition on a benzene ring. \n", "Our reaction mechanism should have the Oxygen perform attack an aromatic Carbon (with standard hydrogen-deletion). Remember, this is still BuildAMol so chemical reasoning is still not relevant when defining a \"Reaction\"! " ] }, { "cell_type": "code", "execution_count": 1, "id": "c1d88b5f", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/lib/python3.12/site-packages/jupyter_client/session.py:203: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).\n", " return datetime.utcnow().replace(tzinfo=utc)\n" ] } ], "source": [ "from warnings import filterwarnings\n", "filterwarnings(\"ignore\", category=DeprecationWarning)\n", "\n", "import buildamol as bam\n", "bam.load_small_molecules()\n", "\n", "# start with getting the compounds\n", "bnz = bam.get_compound(\"benzene\")\n", "etoh = bam.get_compound(\"ethanol\")[0]" ] }, { "cell_type": "markdown", "id": "1753a78b", "metadata": {}, "source": [ "Now we can define the Reaction we want to perform. To do so we need to define (at least) two functions:\n", "1. A function to obtain `atom1` (i.e. the _target_ atom) that takes a `Molecule` as _only_ argument\n", "2. A function to obtain `atom2` (i.e. the _source_ atom) that takes a `Molecule` as _only_ argument\n", "3. (optional) A function to obtain the atoms to `delete_in_target` that takes at least a `Atom` as argument (will receive `atom1`) and can optionally receive the `Molecule` as second argument.\n", "3. (optional) A function to obtain the atoms to `delete_in_source` that follows the same rules...\n", "\n", "Once we have at least 1 and 2, we can set up our reaction. For our purposes the reaction could look like this:" ] }, { "cell_type": "code", "execution_count": 2, "id": "4a1288df", "metadata": {}, "outputs": [], "source": [ "reaction = bam.Reaction(\n", " atom1 = lambda mol: mol.get_atoms(\"C\", by=\"element\").pop(), # get any carbon (since all are aromatic in benzene)\n", " atom2 = lambda mol: mol.get_atoms(\"O\", by=\"element\").pop(), # get any oxygen (since ethanol only has one)\n", ")" ] }, { "cell_type": "markdown", "id": "f57880e3", "metadata": {}, "source": [ "We don't need to define deletion atoms since Hydrogen-deletion is fine for now. To apply the reaction we can either _call_ the reaction with molecules or use the `apply` method." ] }, { "cell_type": "code", "execution_count": 3, "id": "83bf8476", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/lib/python3.12/site-packages/buildamol/utils/visual.py:164: DeprecationWarning: The `highlight_color` argument is deprecated and will be removed in future versions. Please specify a color when calling `highlight_atoms` or `highlight_bonds` instead.\n", " aux.deprecation_warning(\n", "/opt/anaconda3/lib/python3.12/site-packages/buildamol/utils/visual.py:168: DeprecationWarning: The `linewidth` argument is deprecated and will be removed in future versions. Please specify a linewidth when calling the `draw` method instead.\n", " aux.deprecation_warning(\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAMDklEQVR4nO3de9BUdR3H8ffyAHGVe9zsMSg0RXMai7yQ2AQZwjNgSWVDmOOliynmHz3lNEVqzoOWadPNUbOxIGMcb+RlBBHxmlI2TmiDgaioJGiChOmAv/74/rY9rOfs7rN7Lrt7Pq8Zxp3dw+6X9fz2/G7f7wERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERkRiNBw7OOgiRZjEKmAdcAbwEvAPsBb6VZVAiWRkHdAE9wHpgF7AKWAKcAhwAfAN4C5ieTYgi6ZkALACuBjYAr2MNohtrAP0i/t4sYBtwVPIhiqRnMrAIaxDPAi8DK4DF2MnepxfvNR/rdh0Wb4gi6egApgJnY43gFeyEXuGfmxrDZywEnscankhT64tdBRZjjeA1YBN2tVgEHJTQ554ObEnw/UXqMggbJ3QDK7EGsQFrEAuA0TF/3gn+M8OcB2zEBvkimRgCzMRmlFYBu7GZpquwBjEi4c+/DrgL6B/x+g+AJ4GRCcchLaaQ0PseBnwROyGnA4cDfwceBFYDDwFvJvTZYTqAZcB7sAa5N+SYHuCTWEN+I73QJG96gH3YVOqFwNHYGCNr/bDu3O8In/EqAL/AGu/gFOOSnHkF+HHWQUQYCKwBfkP41bMAXAvcg11tRGI1ENgDdGYdSAWDgHXY+CdMB3AjcAvNceWTDMU9BukCzgc+FfP7xm0YcC/wJ2zioFw/4GZsdf40bB9Xy3K2zaYLmIbNEO7EZu5WFmw6XVLya+CCrIOo0Rhsark74vVq3bGW4OBUBzscOP/njcDjvQ5+7qK35UjMtgCHhDzfjW03bzYTgX9imxjDVOuONTUHn3fwjoNdDs51tsMZB/0dzHXwtG8oy7OONQ+OJPxyfQC2s3ZIuuHUrBPb23VmxOvDsDWbJWkFFAcHQx286mCfgxkRx4xysMU3kjlpx5g3FwJXhjx/CnBnuqH02hRgK7Z2E2Y0lbtjTcfBWf7EX1HluK/44+5IK7a8egjbSl7ueuCclGOpxxHYDuG5Ea9X6441FQfL/Im/qMpxIwLdsI604subkdiMT/naQR/s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", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "out = reaction(bnz, etoh)\n", "\n", "# or\n", "# out = reaction.apply(bnz, etoh)\n", "\n", "out.draw2d().draw(height=200, width=200)" ] }, { "cell_type": "markdown", "id": "fde68a78", "metadata": {}, "source": [ "We can now actually reuse the same reaction to connect other molecules as well, as long as the atom functions are applicable to them." ] }, { "cell_type": "code", "execution_count": 4, "id": "31a25ca6", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAANXElEQVR4nO3deZAU5RnH8e+ywiIg7opiZcWIt+IFS0VjxWgS0XitRyIaja6iVg6N2dIkBTFWCi1zGKtS4pGURxKzJlaJR1KilSiJKQOFWoIa8BYBhXCIckTFC3jzx9Nd3Tv0nNvTPT39+1RZM870zjzTzDvv9bxvg4iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJSyE3AdcEragYg0isHASUAfsAVY793emGJMIqkaBBwFzADWAPOBXmCs9/zXgLeB6SnEJpKag7Av/RLgRe/+3kWO/QxWcH6H1TIiTckvFK8CS4FfAgdU+LfDgYeA2cCO9QhOJA2fxZpMc4HlWFPqqBpfqxW4GVjkva5IJu0MfAsrFO9gne5JQEtMr98LrAAmxvR6Dc/Bjg72cqo9M6sD6AFmERSKbmrvM+wDHFni+TOwznvTDgM7GOXgVw7edOBC/y1zcL2zoXBpYNsDk7FCsdG77QGGxfDaX8EKwOQSxxwB/Be4LIb3aygO9vUKgnPwuoObHEzzbpd4jy91sG/asUp/bVjN0AdswDrNPcAOdXivQ4BllB7i3RN4GevbDKpDDIlzMMTB814huMHBdgXPD3Zws/f8804je6lrxTrWtwHrsL5FL7BLAu/dCSwA7qT4F6ED+BfwAPHUXqly8E3vy/+EK9JvczDIwVPececkHaP0n8Bbjc1VTMXmJJI2Amu+PQaMLHLMEOBu4ClgdEJx1YWDv3pf/LPLHHeed9yDScUmcCjWpHmDYAJvnxTj8bUCtwALKT7E20IQe6XzKw3HwXLvi79HmeP28o57M6nY8uwe4BOstrgWGJduOEX1YvMpXSWOuRD7HMckEVDcHHzkffHbyhw31DtuU1Kx5dUELCnw/LQDqZCfn3VyiWOOxXK7zkskohiFCsiQMse1ecd9mFRseXUVsDbtIKr0eWAlcGmJYw7CUlqmJxFQXBys8r74nWWOG+Mdtzyp2LIojqHNViwRMEuewgYRLqf4EO+L2GTjycAfaNDhUAc7ObjEwZXeQwu92/Fl/tTPJPhPXQJrEnEUkAnAszG8TtKWAF8ADgNmYhOXhVYDX8Jmnf9Gg6RqOBjhDefOwj7H8dh8DsAj3m1PmZe5oOB4qZNlRM/IXk6DfKHKaAP+BDxJ8SHeVuAm4AXKjA7Vi9dn6HbQ52CDg9kOelzBJKuXd7XKwVZXJJPAwble82qFs2FwqZMOLE2ksCYaAnwADE08otr4Q7yLgf1LHJdooqODVgdHOZjhYI2DuQ56XZm5GgeTHGxysMXBHx2c7uAI7/Zu7/EPnNWOUX+flQGXhncs8O+IxyeSzbbtFKxZdXSJY07HRsG66xWEg4leoVjl4EUHU8t1uiNe43MO5hUkKvr/zXFFhrodTHGw0Wu+yQD9kOg135cAdyUaSXwmYUO855Y45nAs0fHyGN+361S42sFbDhY6uMpZrtiAOBjr4DQHF3m3RZuIDr7sYHWo+TV9oO+fd38m6OyF3Yo1R7LqYCpLdHyJgSU6HgBcg62SXDwUrnE2vJw4B+OcZf6Ga5rlDr6fRjzN4iUsvaTQPEo3U7KgkrXsHcDjWD5TpYmOuxOsklxBsEoyrgVhVXOwq4P5EU2xtd6AwMVpxZZlw4D32fbLMwj4H9kYwSqnkrXsQ7D0/aeBXYscM4ptV0l2U5CKnhavA7+gSH9lqYN1xUbEpLgjgWciHj8QeD3hWOqpkrXs4UTHA73H2glWSW7E5lq6KZMCkhYHwxz82hvdCheQjxy84/VNTkw7ziy5FLg94vFzsS9Ds6lkiPcCrIP/GLYg7D7g62RnuBsHkx28WlBIVni3b7naN83InTuA70Y8fgPw44RjSUola9nvBX5DfVZJJsLBzt78ySehQvKWC5bwTkg7xhoMJeG1PvOxpL9C/wROSDKQhPmJjpcUeb7Yeckcb2jYX9u+zsGH3v1FDvZKO74KDCOo8YeS4IK9wVgHfXjEc2sp3lltFntj+U+F/POS+aW7Pgd7OHjYWerKUr9G2QzP9DTm/mJtwFmh/z8mjSAOw7JdC+2BTaDlVbHzkmkOWhxc6Szd5W0H7hGbJ5pHeqOVLQRNpu2wZRe+qLm5RF2IJfgVOgN4ONlQGsoUos9LU3DQ5eCFRbBiMDh7iEdIdhDi8ND9X4Tu/7Qeb1brDPAE4Lkij2cx9T0uxc5LU2ixf9uJJ8KDn8J73sMnYT8KrXV863CT6fTQ/fcJarBr6/j+VZuDbc5WaBZWi+TVHODLaQeRkOOxhFS/JrmLgWcDhJtrPwrd/xlBAbyYYHlFB2XW3qehBRvjj9q6cgXBtTnyptR5aVbDsHUym4CtwG9reI1wqtLPQ/enERSY4wh+eNqB/Wp4n8Tsi63VLjQau6pTajlFKduP6POSB2cCrwCbsV/7ck4N3b+OoHa4iKB22J9gVWQrNuGaCWdjuxAW+io2B5JXxc5LXnQC92O7pPwk4vnw0oBw7TCJoLneTv+mVfh+KmrppJfqoDdtB7UCef/8K7Ga5DIsw2JawfPvEzSN7ifobD9OkPm9AUvs9N1QhzirogISn7x/ft/vsZp0Gv1Tjh4AvuPdDy9t3oo1y/0kznA/JJNWE7388zUad0fFJBQ7L3l0CzaytR77wl+NJXCGJ5GvIJjoG0uGc9fCxmDZqoVGYlVoQ6xvSEGx85JX9xIM/y4J3X8UyzYAWzg2Po3gqlFtE6vYROBh2HqJzQOOKJvyPkFaKJw1G95vbCbBZhHLgeeTCqhW1f7iq/8RLe+fv5BfQDYTzAutxQrIe5F/0aBqqUFUQLaV988f1kZQQNYTdL6fJWOFA6ovIF1EfxGKPZ4XXaiJ5RuLpYCA9Ut9C5IPJVn+LoqFM+VtWKpBZpaVxmwU0eclr84i6JQv9m63YukimVNNDdKFdapcweMHY5s0fBRTTFkzgejzklfhVXt+B/0NbEIwc6otIGpebUsjWP35q0kdljoC1rzakko0A1RNAVEHPVreP3+hcAfdX3o8P6VYBqzaAhL1S5n3X1AVkP78AuKPWH1MDq5BsgN2OYOoLTgfojl2UazFcIqfl7x6kv4d9KjNBTOj0onCc7BJn08jnjs14rG88DdpiDoveeXXIP78R6aHdyttYh0NrKtnIBml5lV/HcAu3v127/bpdEJJ1gnYKETUVqN5didBCrfYfs0OmxdywLsEBaXpHU+wXb8mxcwC4Ii0g2ggU7CC8aZ3OzvdcAaumlGsx7A2dxeWzpzXmXPfEOwCOIvSDqSB+P2PT7zbTPc/oPpcrHexNcRbsPXnO8ceUXaMwzZp2JR2IA3ELyCDsRrkiRRjiUUtS24/xi5xMBsb0ou6BHQeqIO+Lb+AjMR+PP6RYiyxqHVnRYddMOZ67Cq3ebxmhArItkZjNWo7Nnms4W+s874G+EbagSRsLvnZRbFSz2ErBR0wNeVYGsqh2MjF9JTjSIp/HcaOcgfmSCu2KcNirJN+SLrhNJ5OrFq9nexv3rAr8D2slojKFNgf24xAAmOw/ukSmqjpWWsfJMpKbMZ9N+wSCCNjfO0ktBNcdPM17LNcD/w94ti8J2hGGY8NfY8gw9m7heIsIGBLLE/DRjDmYL8qjWx77Mqzfdgv32Tswpud2Mq4WQRj+mF5XwMTZXesBukgJ+klA9WLddjGpxxHoVZsLqcPW7MwF7uGeTU13js074VKazUdWIWd0zzPj1XlTOyqsGlfX3sQNhQ9A9sBcS5WgGu5luL52ERpFq/0Wk+3kuGltWk6EuufpJHUNxErFCuxtPTpwJ41vM447ApGq7Em1z0xxddM7sMKSOobTmfR3sCr2Jc17n5PoYOwgvA6QaGo5YIru2O1zFysqTgDu2KqEjWjPYHNh3WnHUhWjcJm3WfSfzvKOIzFJqZewuZjZlDb7P4orD8yF+tn9GH/4PW8/l6zWIrNg2h15QC0Yc2TeQQLa2o1huAXfi1wG1Yoqv2FbycY3t2IFeBu9A9djaFY7fFg2oE0gxaCJlC1TZ+dsC/zbCyz2P+Fr3Zi0h/enYkVilne6w6v8nXEHIzV3FeVO1AqdzHW6f1iBcdOxibs1mOXHD6FYM1zpdoI5jw2YIWsh+xNaDaic4Bl2KCIxOg4Kkt0/DY2cVdt3yU8vLuGYHh3dKk/kqpdgY1gSR0cQvyJjv7w7ipsJGsquvpTPd2O5j/qqhNbnnkHtXeO/eHdxQTDu3ldzJW0J7GaWepoBJbk+CiV9wvGYrXDywTDu2oHJ+8VastKkCq1YikLC7GJuijhCTx/l5VahnclPpnfnCFrerGJurO8/9+NeIZ3pT7+knYAeXQjlhS43rvtA05CE3iNphP4QdpB5NUpwHUEF4IUERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERyaT/A/chdK3HboTqAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get another alcohol\n", "isopropanol = bam.molecule(\"isopropanol\")\n", "out2 = reaction(bnz, isopropanol)\n", "\n", "out2.draw2d().draw(height=200, width=200)" ] }, { "cell_type": "markdown", "id": "8fcc0fe1", "metadata": {}, "source": [ "## Example 2 - Extended Leaving Group\n", "\n", "To make things a little more complex let's try making two functions now, one for adding and one for removing a tosylate group. " ] }, { "cell_type": "code", "execution_count": 5, "id": "2396ddd6", "metadata": {}, "outputs": [], "source": [ "tso = bam.molecule(\"Tosylate\").add_hydrogens() # to make the SO3 group have an OH instead of O-\n", "tso.rename_residue(1, \"TSO\")\n", "\n", "phenol = bam.hydroxylate(bnz, 1) # first make phenol from benzene" ] }, { "cell_type": "code", "execution_count": 6, "id": "329c80a7", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from buildamol.structural import constraints_v2 as constraints\n", "\n", "add_tosylate = bam.Reaction(\n", " # in the target molecule we want to connect to some hydroxyl oxygen\n", " atom1 = lambda mol: mol.get_atoms(\"O\", by=\"element\", filter=constraints.has_neighbor_hist({\"H\": 1, \"C\": 1})).pop(),\n", " # in the tosylate (source) we want to connect to the Sulfur\n", " atom2 = lambda mol: mol.get_atoms(\"S\", by=\"element\").pop(),\n", " # we then want to get rid of the OH from the TsO \n", " delete_in_source = lambda atom: atom.get_neighbors(filter=lambda a: a.element == \"O\" and len(a.get_hydrogens()) > 0).pop(),\n", ")\n", "\n", "# now we can use this to add tosylate groups\n", "out3 = add_tosylate(phenol, tso)\n", "out3.draw2d().highlight_residues(1, color=\"yellow\").draw(height=200, width=200)" ] }, { "cell_type": "markdown", "id": "adc5371b", "metadata": {}, "source": [ "And now that we have a tosylated phenole we can define a function to remove the tosylate again when having another reactant perform a nucleophilic attack on the **C**-O-TsO. This will involve a little more code for the functions we need to define but bear with and hopefully it will be clear how the setup works!" ] }, { "cell_type": "code", "execution_count": 7, "id": "ef342b74", "metadata": {}, "outputs": [], "source": [ "# in the target molecule we want to connect to some carbon \n", "# with an oxygen neighbor that neighbors a tosylate group\n", "def get_attackable_carbons(mol):\n", " tso_sulfurs = mol.get_atoms(\"S\", by=\"element\", filter=lambda a: a.parent.name == \"TSO\")\n", " carbons_at_distance_2 = set()\n", " for sulfur in tso_sulfurs:\n", " neighbors = sulfur.get_neighbors(n=2, mode=\"at\", filter=lambda a: a.element == \"C\" and a.parent.name != \"TSO\")\n", " carbons_at_distance_2.update(neighbors)\n", " return list(carbons_at_distance_2)\n", "\n", "# for each attacked carbon we want to remove the tosylate group\n", "# with automatic downstream deletion it is enough to identify the right oxygen\n", "def get_tosylate_atoms(carbon):\n", " oxygen = carbon.get_neighbors(\n", " filter=lambda a: a.element == \"O\" and any(n.parent.name == \"TSO\" for n in a.get_neighbors())\n", " )\n", " if len(oxygen) == 0:\n", " raise ValueError(\"No tosylate oxygen found\")\n", " return oxygen.pop()\n", "\n", "# now we still need some mechanism for the attacking molecule\n", "# to keep things simple on this side let's simply use an amine that performs a nucleophilic attack\n", "def get_amine_nitrogen(mol):\n", " return mol.get_atoms(\"N\", by=\"element\", filter=constraints.has_neighbor_hist({\"C\": 1, \"H\": 2})).pop()\n", "\n", "\n", "# with all of this we can now define the reaction\n", "remove_tosylate = bam.Reaction(\n", " atom1 = get_attackable_carbons,\n", " atom2 = get_amine_nitrogen,\n", " delete_in_target = get_tosylate_atoms,\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "id": "f0bd7a0d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's get some primary amine from pubchem\n", "amine = bam.molecule(\"BW-755C\")\n", "\n", "amine.draw2d().draw(height=200, width=200)" ] }, { "cell_type": "code", "execution_count": 9, "id": "2f1b7e07", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# and let it replace the tosylate group\n", "out4 = remove_tosylate(out3, amine)\n", "out4.draw2d().highlight_residues(1, color=\"yellow\").draw(height=200, width=200)" ] }, { "cell_type": "markdown", "id": "f5af27d0", "metadata": {}, "source": [ "This may look like a lot more effort than simply going and defining `Linkages` directly and if we are only going to modify molecules on a case-to-case basis then defining entire reactions is probably not worth the time. However, if your workflow involves repeadetly performing the same operations you will likely appreciate the power of the Reaction class." ] }, { "cell_type": "markdown", "id": "07f895bb", "metadata": {}, "source": [ "Just to prove the concept that our function also works on other molecules let's also play with a second set of molecules:" ] }, { "cell_type": "code", "execution_count": 10, "id": "12184de2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/lib/python3.12/site-packages/buildamol/utils/visual.py:164: DeprecationWarning: The `highlight_color` argument is deprecated and will be removed in future versions. Please specify a color when calling `highlight_atoms` or `highlight_bonds` instead.\n", " aux.deprecation_warning(\n", "/opt/anaconda3/lib/python3.12/site-packages/buildamol/utils/visual.py:168: DeprecationWarning: The `linewidth` argument is deprecated and will be removed in future versions. Please specify a linewidth when calling the `draw` method instead.\n", " aux.deprecation_warning(\n", "/opt/anaconda3/lib/python3.12/site-packages/jupyter_client/session.py:203: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).\n", " return datetime.utcnow().replace(tzinfo=utc)\n" ] }, { "data": { "text/plain": [ "(-0.5, 199.5, 199.5, -0.5)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = bam.molecule(\"aniline\")\n", "B = bam.molecule(\"cyclohexanol\")\n", "\n", "outA = reaction(A, etoh)\n", "outB = reaction(phenol, B)\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 4))\n", "ax1.imshow(outA.draw2d().draw(ax=ax1, height=200, width=200))\n", "ax2.imshow(outB.draw2d().draw(ax=ax2, height=200, width=200))\n", "ax1.set_title(\"Aniline + EtOH\")\n", "ax2.set_title(\"Phenol + Cyclohexanol\")\n", "ax1.axis(\"off\")\n", "ax2.axis(\"off\")" ] }, { "cell_type": "markdown", "id": "0d695f51", "metadata": {}, "source": [ "Let us also tosylate the cyclohexanol and _outB_." ] }, { "cell_type": "code", "execution_count": 11, "id": "6329ca33", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 299.5, 299.5, -0.5)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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DTcovV6vjh8/XiZv/v7+qnXr1mrx4sXq+++/V08++aTSarXqxRdfdO135MgR5evrq4YOHaqUUsrhcKhevXqpsLAwlZKS4trv888/V88//7z66quv1I8//qiWLVumevTooUJDQ1VGRoZrv9K70djYWPXwww+r7777Ti1cuFAFBgaqnj17ljmXBx54QAFq0qRJau3atWr+/PkqNDRUNWjQoMwxa1uJfenSpQpQDz/8sPr+++/V+vXr1fz589Ujjzzi2qdZs2YqPDz8L487bNgwBajU1NSryl9tcamS29tvv60A9f7775fZ73I+Iy+//LLSaDRq7NixatWqVerLL79UXbp0USaTSR04cMC135gxY5TRaFTx8fHq3//+t1q/fr16/vnnlUajUS+99JJrv4p816q7xL5kyRIFqHnz5l3W/o8//rgymUwqNze3zPannnpKeXp6qszMTKWUUklJSSoyMlKFhISoN954Q61fv14tX75cjR07Vh06dEgpdfES+6ZNm5TBYFAdOnRQy5cvVytWrFA33nij0mg0atmyZa79quL9fO211xTgqjXdv3+/8vb2VqNGjSr3GsybN0+tXbtWbdiwQb355psqJCRE3XvvvWX269GjhwoODlZNmzZV8+fPV+vWrVMPPvhgudqRs2fPqqioKBUaGqrmz5+v1q5dqyZNmqQANXHixDLHpJaV2Pv166dCQ0PV+++/rzZt2qRWrFihnn/+edd7tXXrVgWoKVOmXPK4BQUFSqvVqn79+lUoP7UisKelpSlADR8+/LKf06NHD9WuXbsy2yZOnKj8/PxUQUGBUkqpzZs3K0BNnTr1b491YWCfP3++AtRnn31WZr+ZM2cqQH3//feubYAKDw9X+fn5Zc5Hq9WqV1991bWtX79+qn79+iovL6/MMSdNmqQ8PT1Vdna2a9vy5csVoN566y31/PPPK61WWybNi7Hb7aqwsFCZTKYyNy2lH9oHH3ywzP6zZs0qE8QOHTp00f22b9+uAPXss8+6tl1uYHc4HMpms5X5AdQHH3xQZpvdbv/bY13oz4F90qRJKiAg4C+f4+npqTp37vyX+0yZMkUBavv27RXKT21V+t7/8ssvymazqYKCArVq1SoVGhqqfH19VVpaWpn9/u4zcvr0aaXX69XDDz9cZr+CggIVERGhhg0b5to2ZsyYi36HBgwYoJo3b+76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YSErVqwos33x4sWuxyvC29ubnj17smfPHtq0aUPHjh3L/Vx49zphwgROnz7Nl19+yQcffMDKlSt58803XY9rNBqUUuVKugsXLnT1mq+oXr16AZS7CO3YsYNDhw5V+Jxrislkon///kydOhWr1cqBAwcAePzxx/Hy8uLhhx+mqKio3PMmT55MTk4Ozz33XHVnuc7o168fer2e48ePX/QzfCUXxsr+rlWmiIgIxo0bx3fffefKz58dP36cffv2ldn2yCOPsHr1ap555hnCw8O54447yjzev39/Nm7cWK7q/K+YTCauvfZavvzyyzIlWqfTySeffEL9+vVp1qxZBc6uYu9namoqo0aNokePHmzdupXBgwdz3333lSltlgamC69LSikWLFhQoXxdqHfv3hw8eJDdu3eX2b548WI0Gg09e/a84mNXp4YNGzJp0iT69u3rOhej0chTTz3FoUOHyoyYKHX27FnXZ2jcuHEVSq9WlNgBunTpwrx583jwwQfp0KEDEydOpGXLlthsNvbs2cP7779Pq1atyrTZBQQEMHr0aObNm0d0dHS59rxu3bpx9913M2PGDNLT0xk4cCAeHh7s2bMHb29vHn744YvmZfTo0cyZM4cxY8Zw6tQpWrduzZYtW3jllVcYMGCAq82uIt5++22uv/56unXrxsSJE4mJiaGgoIBjx47xzTffuNqKFi5cyCeffMKiRYto2bIlLVu2ZNKkSUyZMoWuXbvSqVMn/Pz86N69O7NnzyYkJISYmBh+/PFHPvjgAwICAiqcNzhXynnggQd455130Gq19O/fn1OnTjFt2jQaNGjA448/fkXHrQ73338/Xl5edO3alcjISNLS0nj11Vfx9/d3VTM2btyYjz/+mLvuuouEhASeeOIJ1wQ1//3vf1mzZg2TJ0/mzjvvrOGzqb1iYmKYPn06U6dO5cSJE9x0000EBgaSnp7Or7/+islk4qWXXqrQMaviu1aZ3njjDU6cOME999zDd999x5AhQwgPDyczM5N169axaNEili1b5mq/Bhg1ahTPPPMMmzdv5rnnnsNoNJY55vTp01mzZg3du3fn2WefpXXr1uTm5rJ27VqeeOIJ4uLiLpqXV199lb59+9KzZ08mT56M0Whk7ty57N+/n6VLl1a4HfZy30+Hw8GIESPQaDQsWbIEnU7Hhx9+SLt27bjzzjvZsmULRqORvn37YjQaGTFiBP/3f/+H2Wxm3rx55OTkVPyFP+/xxx9n8eLF3HzzzUyfPp3o6GhWr17N3LlzmThxYoVvZqpLXl4ePXv2ZOTIkcTFxeHr68uOHTtYu3YtQ4cOde03ZcoU9u7d6/p95513lpmgpqCggFWrVuHv71+xDFSoq101+O2339SYMWNUw4YNldFoVCaTSbVv3149//zz6uzZs+X237Rp0yUH+Ct1rmfmm2++qVq1aqWMRqPy9/dXXbp0Ud98841rn4tNUJOVlaUmTJigIiMjlV6vV9HR0eqZZ54pN3kOl5ig5mI9eE+ePKnGjh2roqKilMFgUKGhoeq6665TM2bMUEoptW/fPuXl5VXueWazWXXo0EHFxMS4JipISkpSt912mwoMDFS+vr7qpptuUvv37y+X7qWGPJUOAdq4cWOZ12rmzJmqWbNmymAwqJCQEDVq1Ch15syZMs+tbcPdPvroI9WzZ08VHh6ujEajqlevnho2bJjat29fueceOHBAjRkzRtWvX18ZDAYVFBSkbrrpJrV69eqrylNtdLkTlVTkM6KUUitWrFA9e/ZUfn5+ysPDQ0VHR6vbb79drV+/3rXPmDFjlMlkKpfWCy+8UG5o0eV+12pighqlzvWi/uijj1SvXr1UUFCQ0uv1KjQ0VPXv318tWbLkor2n77nnHqXX61VSUtJFj3nmzBk1duxYFRERoQwGg+szm56erpS69AQ1P/30k+rVq5cymUzKy8tLde7cucy1TKnKfz+nTp2qtFqt+uGHH8o8b+vWrUqv16tHH33Ute2bb75Rbdu2VZ6enioqKko99dRTas2aNeXSvdQkUxe7tiQmJqqRI0eq4OBgZTAYVPPmzdXs2bPLve7UouFuZrNZTZgwQbVp00b5+fkpLy8v1bx5c/XCCy+ooqKiMs91Op3q008/VTfccIMKCAhQRqNRNWrUSE2cOFElJiZeUX40Sp3vvllHPfnkk8ybN48zZ85ctDOGEEJUJ6vVSkxMDNdffz2fffZZTWdH/APVmqr4ivrll184cuQIc+fOZfz48RLUhRA1KiMjg8OHD7No0SLS09PLdGwVojrV2cDepUsXvL29GThwIDNmzKjp7Agh/uFWr17NvffeS2RkJHPnzi0zxE2I6lTnq+KFEEII8f/VmuFuQgghhLh6EtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiFEEIINyKBXQghhHAjEtiF27JYLNjt9prOhhBCVCsJ7MLtWK1WNm3aRP/+/Rk3bhzr1q0jMzOzprMlhBDVQqOUUjWdCSEqi9Vq5d///jeffvopf/zxB0opQkNDueGGGxg4cCC33347Xl5eNZ1NIYSoMhLYhVtwOp388ccfzJ49mxUrVpCXl8eFH22tVou3tzedOnXinnvuoW/fvoSFhaHVSqWVEMK9SGAXdZ7ZbGbt2rX8/PPPxMXFcfbsWX755Rf279/PmTNnsNlsZfb39vYmISGB0aNH06tXL2JiYmom40IIUQUksIs6LTU1lblz53L69GmmTZtG48aNUUqRlZVFWloaO3bsYOPGjfzyyy+kpKRgtVpxOBwA+Pr6EhcXx8iRI7ntttuIiIhAr9fX8BkJd2Wz2bBYLDidTrRaLUajEaPRWNPZEm5IAruok0pKSti+fTszZswgODiY119/nfr165fbTymFUoqcnBy2bdvGzz//zLZt2zhx4gRpaWnY7XZ0Oh2NGjVixIgRDBkyhLi4ODw9PWvgrIQ7UkqReeAAQR99hPrxR5TVCjod2k6dSLv7biI7d5YmIVGp/vGB3el08uabb3L06FFuvvlm+vfvL6W2Wq6oqIi3336bjz76iPbt2/Paa69ddnW6w+EgJSWFEydOsHPnTjZt2sSePXtIS0tDp9PRpEkT+vfvz1133UXbtm3lgiuuWn5KCqY770Sj1VI8fjynIyKwZGfT5sMP0Zw+TcannxLeunVNZ/MfozTkOZ1OcnJyOHLkCGfPniUrK4usrCx69uxJx44d0Wg0NZzTK/ePDuyZmZn897//5ffff6dfv3789ttvZGVl0a1bN7p06UL9+vXx9fWt6WyK8+x2Ozt37mTmzJls2rSJAQMG8PbbbxMSEnJFx3M4HJjNZnJycti8eTObNm1i+/btZGRkYDAYuP7663n44YeJi4sjICCgck9G/CMopUh+9lnqr1tH8gcfUK9NG1fAOHvyJJ7jxuEdEQGLFqGXavmr5nQ6KSoqori4GJvNhtlsxmKxkJ2dzdGjRzl27BgpKSlkZWWRnp5OamoqBQUF2O12nE4nDoeDzp07s3TpUurVq1fTp3PF/rGBPSUlhTfffJP69etz//334+3tjVKKpKQkfvzxRw4dOgRAq1at6NmzJxERETWc43+2wsJCPv30U9544w3OnDnDPffcw7Rp04iMjKy0NJRSnDlzhn379vHrr7+ydetWsrKyaNOmDUOGDOHGG2/E29u70tIT7q84JwfvQYNIbd2a8DlzytUA/fHaa8QtW8bZ5csJa968hnJZ9+3evZvs7Gxyc3NJS0sjNTWV3Nxc0tPTycjIIDMz0xXsHQ4Hdrv9on8D6PV6XnzxRZ599tk6W2r/x9U5O51O9u3bx3vvvcctt9xCjx49XOOaNRoNDRo0YNSoUeTl5ZGUlMTWrVt55plniI2NZejQoTRo0AAfHx+poq0mTqeTw4cP8/rrr/Pll19itVq57777mD59OoGBgZWalkajoWHDhjRs2JB+/fqRnZ1NRkYG27Zt47vvvmPNmjUMGDCArl27EhAQIE024m8VZmTgXVREQePGRF7kmuHbrBmUlFB49qwE9iuUmZnJggULePzxx2nevDlarRalFE6ns8zvP28rLaEXFxdjNpspLi4mOzub4uJiPDw8SElJISoqqqZP74r8o65MNpuN1atXs379esaNG0eHDh2Ac8GjsLAQk8mETqcDwN/fH39/f1q2bMnIkSP55ZdfWLhwIQaDgbi4ODp27EhcXJz0aq1CBQUFrF27lhdffJE//vgDf39/Jk+ezOOPP46/v3+Vpm0wGAgPDyc8PJxWrVqhlOLUqVO88cYbvPDCC4wdO5ZevXrRokULuckTl6ScTgA0568rf6bR6UAp136iYpxOJ9999x2tW7emcePGrut3ZTGbzXWyI+0/JrAXFxfzySefcPjwYSZPnuzqbKWUYsuWLWzZsoWJEydetBRoMpno3bs3119/PSdPnmT37t0sXrwYu93OwIED6dy5M97e3nKBryRKKTIzM3nttddYtmwZqampmEwmHnvsMR555JEqD+oXo9FoaNSoEYMHD2bRokVMnTqVJk2aMHz4cMaNG0dwcHC150nUfl4BAeDhgSUl5aKPlyQng6cn3kFB1ZsxN5GXl8euXbu47777Kj2oZ2dnk5+fXyfnufhHtLGnpqayYMECTCYT48aNcwWGwsJCVq5cybZt23jyySeJjo6+rDYVpRRWq5UTJ06wfPlykpKSSEhI4JprrqFp06bS0eoqmM1mfvjhB2bMmMHOnTtxOBxERkbyxBNPMHHixBpv4y4qKqJ9+/YcPXoUjUZDfHw8n332GS1btqzRfInaSSlF8YQJeBw4QNGSJfg3bOh6rCgnB49778XsdGJYtgwP6b9RYZ999hlJSUk89thjlV6wUkpht9vJysoiNDS00m8cqpLbl9gPHjzIBx98QEJCArfeequrWqWoqIh33nkHi8XCc889R3h4+GUfU6PR4OHhQXx8PC+88AJpaWls2bKFb7/9lvz8fFq0aEG/fv0uOq5aXFpOTg7vvvsuCxcuJCkpCaUUwcHBPP/884waNarGgzqAp6cn8fHxHD16FKUUhYWFWCyWms6WOM9ut1NSUkJJSUmZtlOz2UxRUVG5/9PT04mNjWX06NFV0lFKo9HgeOAB9Hfeid+MGeROnoxvo0YUpaaSNncuzXbvxvLee/jUgs92XZORkcHatWt5+eWXq6S2VKPR4HQ6SU9PJygoSAK7UorU1FTq1atXY20UNpuNX3/9lUWLFjFq1Ci6deuGTqdDKcWJEyeYO3curVu35o477sBkMl1xOhqNhsjISO644w6Ki4tJT09nw4YNTJ06laZNm9KnTx+aNGmCv78/BoOhEs/QfdhsNrZv387MmTPZsGEDxcXFro6MpUHdw8OjprMJnJtz/pprruGbb745VxorLsZqtdZ0tv5RDh48yMsvv4zJZEKv17uCdUlJCUopvLy88Pb2xsvLCy8vL0wmEx4eHvj4+Lh+m0wmgoOD8fHxYdmyZbRv3542bdpUSX592ren4D//QTNrFgHDhoFOh5/Tic7Li7xXXsGvT58qSdedOZ1OvvrqK7p3716pI2P+rLQAd+jQIZo0aXJVsaI6VVlVvMPhQKfTsX//flq0aEFycjINGjSoiqTKKSkp4bPPPmPv3r089NBDNG7c2PXY9u3bWbx4sWsymqoazmCxWPjpp5/YvHkzWVlZhIWFMXbs2Gp7DeqK3Nxcli5dysyZMzl9+rRr8ojY2FhmzZrFoEGDal0Hxc2bN3PLLbeQm5uLt7c3K1eupHfv3jWdrX8Em83GtGnT8PDwYPDgwQQHB7sCuJeX1xXdPO/YsYOlS5fy3HPPEVSFbd3W/HwcK1eS7OuLh6cnASYTvtdfX2XpubPExETeeustnnrqqSofb56dnU1qaipxcXFoNJo60ZeqynJYWm3RtGlTCgsLKSoqIisri99//x2LxUJxcTEAlX1fUVRUxH/+8x8SExOZPHmyK6hbrVa+/vprPvnkEx544AH69etXpWMUPTw86NOnD8899xyTJk0iMzOTr7/+utLPt647deoUb7/9tiuoazQaYmNjef3117nllltqXVAHCAsLc11MzGYzKSkp8r5Wk2PHjuFwOJg0aRLXXHMNMTExhIeH4+fnV+GgXnrBbteuHVFRUaxZswZnFfZON/j4wJYtNB48GFPHjpi+/rpK03NnGzdupEWLFhVqQr1SQUFBxMfHs379eo4cOVLl6VWGKr/18PDwwM/Pj7i4OGw2G0FBQWRkZLB9+3bMZjMHDhwAzpXcrtahQ4d48cUXCQkJ4ZlnnnFdfHNzc5k7dy7btm1j2rRptG3bttraS4xGI/Hx8fTs2ZP09HQJAH8SHh7uaqrRaDS0adOG999/n8GDB9faceIhISE0bdoUjUbjatqR97XqOZ1Ovv32W6677jqCgoLYunUriYmJV3y8ffv2MXfuXCwWC3fccQdbt27l1KlTlZfhP9NoMGdkYLdYzn1eCguxSzNOhZX2abrllluq7TpeXFxMq1atiImJITk5uVrSvBrVWqcQERFBVFQU/v7+NG/enKSkJPLy8sjNzeX333/HarVy9OjRKzr2rl27eOedd+jWrRtjxoxx3b2np6fz+uuvo9VqeeqppwgLC6vMU/pLZrPZ9XeTJk1ckySI/y88PJzo6GjgXO3OW2+9Ra9evWp1dVdQUBDt27dHr9ejlCI7O1ve12pw6tQpjhw5Qq9evcjNzeWLL76gpKTkio+XkJCATqdj69atNGjQgEGDBrFgwYIq7TOh8fLCYbGcqy3U63H8aUlh8deUUixdupS+fftW67W8tF/G+vXrycnJqbZ0r1SNXD19fX2pV68evr6+JCQk8Ouvv9KiRQt27twJwJEjRzhw4ABFRUXk5+ejlHJN9/dnZrOZFStWsHDhQh599FEGDhyIXq/H6XSyf/9+pk+fzjXXXMOECROqdayxzWbjqaeeoqCgAICoqChSUlKk6u1PtFotDRs2pHPnzvz3v/+lR48etX4aR61WS4sWLVy99Cujtkn8NavVygcffMCIESPw9/fn+++/Jzo6mqZNm17xMU0mEyNGjOCzzz4jMzOTPn364OPjwzfffFNl31N7XAA2Swl6vZ6ShCDsdgnsFXHgwAFOnz7NTTfdVO1p+/j40L17dxo2bMiRI0coLCys9jxcrhotFoWHh2M0GmnTpg1+fn6UlJQQGhpKeno6JpOJkydPcuzYMXJzc/njjz9wOp1kZWW5nl9YWMh7773Hrl27ePbZZ13TCdpsNr799lvmzZvH3Xffza233lrtbbUajQZPT09SU1OBc6U8m83mCvTi/+vTpw9z5syha9eutT6ol4qPj8fX1xeNRkNeXp6U2KvYrl27sNlsdO7cmYyMDNatW8edd9551VWxzZs3p3///ixYsACHw8Hw4cP56aefqqy6NeM2DRatGYUiu2cxNiVV8ZfLbrezceNGunTpgp+fX7WnX1pg3LFjB4WFhbVmpM7F1Ir6zoiICPR6PZ3Pr0tst9sJCgoiOTmZ+vXrc+jQIYxGIydOnOD06dMAJCUlMWPGDLRaLZMnT3b1NrdYLCxdupQNGzbwyCOP0Llz5xoJFhqNhoiICFdgL5257MSJE9Wel0spKSkhJzubzIwMcrKzXcOFqttNN91UZUONqkrz5s1p0qQJgAT2KlY6aVGfPn0wGAx88cUXdO/evdIWZurXrx/5+fn8/PPPxMTEkJCQwPLlyy9ZS3g1tFpP7HYzGo0W0Ltdib0oJ4fclSs5M3kyiQ8+SMqMGRTt2oWtEpo30tLSOHjwIDfccEONFQC8vb3p2LEjTZo0Yd26dSQlJdVIPv5OrQjscC7wmUwm/Pz8XAuzGAwGgoKCOH78OE2aNGH79u20aNGCH3/8kalTp9KxY0cmTJjgmkkuJSWFN954g+TkZF588UWa1+CiClqtlnr16pW582/evDmHDx+usTyVcjqdnN22DY9Jk/Dv2ZOg3r3x79kTj/HjSdy8udrzU7qEYl1iMBho164dQJ1oc6vL/vjjD7Kzs+nSpQuJiYn88ccf9O/fv9KO7+Pjw/Dhw1m5ciV5eXnccccdpKSksHHjxkpLA85d43Q6L6zWEjQaDRqNDrv9ygOeUorCrCxykpMpyc+vxJxemczERDxHjSJg2jR88/M5azLhv2cPpmHDYOZM7FfRn8DhcPDBBx8waNCgam1b/zOj0Yher2fTpk20aNGi1k5CViu7HWu1WrRaLddddx25ubm0a9eO5ORkIiIiyMrKYvbs2Tz00EPceOONrqq45ORkXnvtNdq1a8eIESNqfJYyjUZDaGgoBw8eLDOMa/369TWaL4C8o0cJnTgRZ3Q0ha+9RnpQELbMTOIWLCDq0UdJ/fhjIlu3rrb81KtXr06WeDt06OCqinc4HDIBURVwOBx8/PHHDB06FB8fH/73v//RsmVLQkJCKjWdVq1a0bRpUz7//HPGjx/PuHHjWLBgAS1btqzUCVCCg28CQtHr9Xh43IaHx5WdR9rRo+S8/z5x+/ahsVrBx4fUzp0JmDABrxpYt0Aphfcbb6BJTeX0W28R1b07CTodxXl5OOfNwzB/PhnXXUfoFc73sH//frKysujZs2cl57ziPDw86N27d62erKbWlNgvxtPTk+DgYFq1auWao9tkMmEwGOjcubMrqB8+fJhXX32V4cOHc88999R4UC8VFBTkmr4SzvWMP3nyZJVU8V0upRT22bPRBAaS8cYb+PfvT7Nrr6XlzTeT9+67mH19CX3zTWzVOE1qdnY2P/30E7Y61kP4+uuvJzw8nNzcXLKzs2s6O25pw4YNeHt7c91115Gens7PP//MoEGDKn2Yk16vZ+zYsRw4cIBt27bRrFkzWrduzeeff15p31er1YrFcpyUlLvZv/8a0tLuJzl5Ivn5pyt0nMRduwi66y4a791L2siRZD/zDBk33EDkV19hHD2agvPNf9Up8/BhvH/4gT9GjqTBDTe43h9vf3+KH3iA/EaNyFm82PVaOux27OcXxinIyXHN4li6PvqFr3lJSQkrV67k1ltvdS2xXZP0en2tDupQywM7cL7KSkPz5s0JCgrC39+fmJgYzp4969rHy8uLJ554gq5du9aq+Xz9/f2xWCyuucRLp7asyV7U5pwcQrdvJ7FLF8IaNSrzWFD9+mT17o3+wAGyTlfsYnM1goKC6Nq1a60e4nYxPj4+xMbGYrFYam1bW12Wn5/Ppk2bGDRoEBqNhk8++YQbb7yx0trW/8zLy4vhw4fz9ddfU1hYyODBgzl69CgHDx6slOMnJf1ERsbzeHi0xGh8heLiKSjVCqPx8qfcdjqdhPznPxiNRgrnzydyzBiCbryRkCeeoOCdd9AdPEjhkiXVXnjIPXkSzGYC2rUr1/7tExREUrNmNDtzhpLz1z6n3Y5j+/ZzI562bMFqtbJv3z7y8/M5efIkZ8+eJTc3l7Nnz2Kz2Wjbti3t27ev1nP6K8XFxeTXguaPS6lbV9LzmjZtWma8e8OGDYmNja3BHF2cv78/ZrPZNdZWp9MREhJSo+3JRenpYLdT2LDhRQOpd7NmkJdHUTW2G1ssFlauXElGRka1pVkZvL29ad26NUqpMjeaonLs27cPnU5Hq1atOHDgAMnJyVU+zKlDhw4EBwezZs0aQkJCGDduHPPmzauUfhQnT25Eq/UhJORp2rYdwrXX3kGzZv+Hp+el24ydTieFBQVkZWSQl5uLJScHzx9+oGTIEAIuWE5Uo9FguvZacrp0IXLzZgqqud+HrbgYnE4Ml+itbggMBKsV2/lrod7DwzWGv+h8YczDwwOtVktwcDC+vr74+PgQGBiIn58fN910Ew6Hg/3791fPCf0FpRR6vb7W1AxfTJ0M7M2aNasTU/v5+/tjt9td0+eWBvaaDAKlbdmX7FVaGuyrsc3bw8ODAQMG4OHhUafa2kuriL29vWUseyWzWq189tlnDB48GIPBwLp16+jevTu+vr5Vmq6Hhwdjxoxh48aNHD16lNatW9O6dWu++OIL7Hb7VR3baPTF4cjj7NmfsVrPNc9dbHbFgoIsjh7axu6vPsP69tuYxo8n6JZbOPnGG5ScOoVOp+NodHS5G3OtVouubVtISqKomkuTBpMJdDqsl/ge2LKzwcMD4/lgqNFoyGnRAo1GQ2DXrhiNRtq3b4+/vz9BQUH4+Pig1+sxGAzY7XYOHTrE9u3bq2UK2b9jsVg4c+ZMrZ0ZE+poYI+NjeX48eM1nY2/Vdqrv3TIm06nIygoqEYDu3doKA6dDvP59q0/s548CX5+mAIDqy1PNpuNbdu2lVkEpq5o0KABAQEB5OXl1XRW3MqmTZsICAigXbt2pKamcuzYsWqb5yAsLIzhw4fz3//+l+LiYgYOHMhvv/3m6h9jt9ux2+3YbLbz7ebnmttKa+eKi4spLi6mqKiQkpKz5OcnkpeXRnz8UHS6EMzmpzlx4i6OH/+S/PxzJevi4gIOHPiA3bsfIzn5Lkh6gLi3Hsdz9mw0q1ah2bGDmOxsfGw20GjQXSqoGAzgdFb79ygwNhY8PMjds6dc2gVZWUQdOcKxmBi8AgJc26NatQLOtcP/1fuq0WgIDw+nZ8+eFBQUsGvXrhqb6EsphVarrdIV5SpD7b3l+Av169cn+/y469rQmeKvNG7cmOPHj3P99dej0WgICwvjxIkTOJ3OGmlTNoWGkpSQQNvNm8lNTCTg/HSuAAXp6dRbs4acVq0Iatiw2vJkMBhISEggNzcXi8VS69/TCzVu3JiIiAgpsVeC0hUhs7KyWLlyJU888QQajYYPP/yQgQMHVuswp+uuu469e/fy+++/06VLF26++WZmzpxJhw4dXAHdarVis9mwWCzo9XbuuANMpgKcTgtK2Th2zI5W64leb8LXtzudOg3Dy+s7TpxYid3+LVbrZMzmesTEfILJFEOzZndRUHCK3NwTFAckc+rODNTJHAIzM6mXm0uAvz8EB4PViiEz8+Kv4enTEBiIRzV/h4KbNqWkb1/ili8nsVMn6nfrhl6vpzg/H++FC9GdPo3tpZeu6Jqn0+mIiIjgjz/+IDExkW7duuFwOGrk+pmWlua6ntdmdTKw63Q6QkNDSUtLo9GfOoDVNtHR0axdu9b1f2BgIAUFBVit1hpZpx4gaOJEdCNH4jt9OjmPP46pYUMKExPJe/ddfJKScMycibEa8+Z0Ojl+/DgFBQU1MqPU1YiKiqJly5Yyo2AFlTZP2e12CgsL8fPz48SJE7Rq1Yrvv/+e+vXrU79+ffbv309GRka1D3Py9PRk1KhRruDhcDgIDQ2lUaNGeHh44OHhgdFoxGg0uv729/c6X33siV5voGnT8jOTmUyhtG59HyUlwzl+fDVO51SOHFlK+/bPYDB4EhQUR1BQHMQCCeee43Q6KcjKwlpcjF9EBPZ69Wi2axclI0fidUE7b0lBAR4//4y69lr8qrHGDc6VqosffxyPI0eIeewxcrt25UhAAC2PH0e7ezf2++4jsGvXq0qjYcOGNG3alN27d6PT6bjmmmsqKfeXx2KxEBAQwLXXXlut6V6JOhnYNRoNUVFRJCcn1/rA/ufZ5oKDg8nPz8dms9VIYHc6nRjatqVg3jy0r79O4KhRAAQBmrAw8ubPJ6iaP7harZbY2FiKioquuh2zumm1Wtq0aVNpPafrOpvNhk6nw2KxYDAYyMvLw8vLi7S0NPz8/EhLS8PLywun04nZbCYwMJAzZ87QvHlz0tPTiY2N5bPPPmPEiBEYjUbsdjsTJkyoke9KaGgoAJmZmfzwww889NBDrtkGr5aXl4kGDXqSnt6Q7Oy/blbUarX4ns8LQMGjj+I1dSol7dtTMHAgBqMRW14eAfPnYywuJmX4cOrVQK1XQFQUBe+9Bzt2ULRxI5Fnz1IQH0/eU08R0qYNxqtsk/b29iY5ORkPDw9iY2OrvcY2NzeXHTt20KtXr1o/Z0WdDez16tUj5RLtxLVJaGgoZrOZgoICfH19CQ4OdpXYa0LmgQP4pafj27cvlq5dSTlwAEt+Ph7+/gTGxeHl41PteSrtVZ6YmEhAQACB1VzauFqdOnVi27ZtWCyWWj1/dHUoKirC29ub9PR0goKCyM7OJiAgAKfTicViwWQy4XQ68fT0xGq1YjQaMRgMaDQajEYjGo2Gfv36ceTIESwWCx06dKjR81FKsXXrVqKiomh4lc1TOTmbSEszExbWAp1Oz+nTa4BjBAcPrdBxPIYMITUnh8g5c+DDDyEoCFJSwNMT80svEXmVJeMrVfLrr+RlZtJwyBD8hwypkjSioqKIjIxk8+bNhIeHExcXVy39LhITEzEYDAwcOLDK06oMdTawR0ZGcujQIdesbrWVRqOhYcOGnD59mpYtW+Ln53duCEthYbWuNgfnSutea9Zga9sWT8DD25vQRo0oUQq/C0oE1a30/QwJCcFgMLjaWuuK+Ph4PD09yc3NrRW9dmtSwPnOUQ0bNnRNE63RaAgMDHStX1/6nQ0LC0Ov1+Pr64vRaKRDhw54e3szYsQI/vWvf7Fz50661lCQKmU2m1m3bh3jxo27qoWk7HY7BQU7cTg+5uxZT0CDVpuLVtuDyMjhFTqWyccH/fjxJN90E6GnTqHy8igMC8MaE0NIZCSWwkI8fHyq9bpoKS5Gv2gRPk88UeVpabVamjVrhr+/PzabrcoX+FJKERgYyN69e13XqtquTgZ2ODepSWFhIRaLpcbaqi9X48aNOXHiBC1btkSr1RIdHc2JEydc65BXl6zUVEKzsjjbujW+nGs3VAsXkpqQgN8VTvVYWbKzs9m9ezd6vZ527drViS9PKaPRiI+PD1lZWf/4wF6qtG269AbtYh2dSocLlVan+pyvLfL392fChAnMmjXL1TmxpqxcuZLo6Gjatm17VcfR6/U0aPAkeXm34XBspaAgGG/vQPT6cAIDK36D7+HhQVSzZtCs2bn/z2/PTEsj6O23yR0/nsALxrlXJaUUGatWERgXR1BcXLWkGRERwe+//47D4ajStnalFImJiRQVFdGlS5daPcTtQnVyuBuAn58fNpvNNV1rbRYdHe1alQ7Kt7tXF82xYzj9/Qk8P8+2NT8f7eHDNKjmTigXExYWRr9+/ejXr1+dCo5KKdatW8dPP/1U5xayqc2aNGnC9ddfz7Jly2psquG0tDQ2bNjAiBEjKuV4Go2GoiINDkcuERE9SE8vwW7/sVJniQsMDeVUXBxeX39dbUPC8rKzqb9zJ/n9+lVLenDutWzSpAmtWrWq0o6rSim8vb0pKioiLS2tytKpbHU2sPv7+2O1Wl2zutVmMTExnDlzxvVFq4kJdpRS+GzcyJnrr8dwvuoq69tvSe/SBe9a0KadlZXFN998w/Lly/nll1/qxLzxNpuNTz75hEmTJpGUlOTq6S0qx80330xqaip79uyp9rSdTidr166lY8eOlVp7dG4cfCZ2uw2lFE5nfqWOOdfpdETdcQfqxAlytm6ttOP+FcPPP5MXEkLI+dqD6lDazJOcnMypU6eqLJ2ffvqJzMxMmjdvTr169aosncpWZwO7n59fnQnspVWMhYWFwLlAn5iYWK2TLJjT0ylMTCTsfGekkqIijJs3E1SJy19ejfDwcIYOHcqIESNo27Ztre43AedulJYsWcKUKVNITEw8N+tXHeoXUBcEBwczZMgQPvnkk2q/aSptGrrhhhsqdby0Tqc7Nz+6w4Feb8TptFb6ZDIe3t7kjB9P4PLl5FZxKbOoqIj0X37BduutNdJTvFGjRsTExJCcnFypr6NSCrvdTufOncnPzycrK6vWX5MuVGcDu4eHB/7+/nVijm4vLy+MRqNrdjIfHx+8vLzIvMQkE1Uhbes6HP164XV+VaKzv/1GUEQE+hpsv7xQdnY2K1eu5NNPP2XdunW1uvRbUlLCggULeOaZZ1yzCtb2RSHqqoSEBJo1a8Ynn3xSrQubrF27lubNm1f6GhR6rQFTojfK4cRbY8LnoLFKZokLb96cknbtsH39dZW9bkopVqxYwdaYGIKbNq2SNC6HXq/H/29mr6soq9XKhg0b2LZtG61atSImJkYCe3WJiYmpkbbqivLy8iqzqtuFPeWrQ0FBDpprtuJ1043AuR66DX7bRWanTrVmPGZwcDC33HILI0eOpGfPnrU2sJvNZt5++22efvppV5tb6ftZ14bp1QU6nY67776bgwcP8ttvv1VLmsnJyWzYsIHhw4dXei2MVmnw/74Yu9WG1qrBtDWnSgK7TqfDeuutLD52jEOHDlX68QGSkpLYunUrfQYPrtGg5+XlhY+Pj2vpZKUUZrMZp9OJzWbD6XSe6yhcgdfZw8ODG2+8kaioKA4ePFjnprquG138LqFhw4Zs2bKlprPxtzw9PWnatGmZHpX169cnOTmZjh07Vnn6p08fIDAwCg+vAAAKC/KxtTuDih5U5WlfrqKiIrZt20ZOTg4+Pj413hv6YgoLC3nvvfeYNWsWOTk5rrHXXbp0YdasWVfdc1pcXOnqXl9//TUtW7as0lEwTqeTr776it69e1fJcFStTodGo8HpcKA3GlE2W5UFjcDgYLrdcQfvv/8+r7zyiqtJsDIopfjpp59o2bKlayKfmlY67M1ms3HgwAFiY2M5c+YMERERZGVl4e/vT0lJCUajEZ1Oh8PhcHWMCwgIoKCggKCgIIqKiggODkaj0dC0BmsirkadLrHXlcVgdDodt99+O3EXDAWJjo7myJEjVV69aLfbCQjYidPZ3jV5itnyO9khPoTXq97hdn/FZDLRs2dPbrnlFq699lo8PT1rVf+J7OxsXn75Zf71r3+Rm5vrKqU///zzfPbZZ3Tq1OkfPzlNVdFoNPTu3RsPDw+++eabKi09HT9+nFOnTtGnT58qOb5OrwedDqfDgdHLC00Vj8FOSEigadOmLFu2rFJndczKymLLli3079+/1vQtKb1x0Wg0FBcXuxbmKSoqwmazkZ9/rqNiYWEhSimKi4tdeff09HQ1kZYG9bqsTpfYw8PDycvLw2w21/qx7Bd2wCkpKeHnn39m9+7dWCwWBg8eTIsWLapkjKTVWoTdfhST6XbXtuLiVXh731EjiyhcisPhYPfu3WRmZuLh4YGvr2+tqdrOzs5m9uzZvPvuuxQVFbnmqZ42bRr9+vWrNc0Z7sxgMDBu3Dief/552rdvX2lTu15IKcWmTZuqtBTq7etLbv/+mCwWNGYzmr59q/Tzo9FoGDJkCLNnz+bUqVNX/LoppbBYLBQVFVFSUsJXX31F69atiammsfIVodPp8PX1RafTERkZiaenJ4GBgSil8PLycpXUnU4nOp3ONalSaYm/rgd1qOOBXa/XU69ePU6fPk2zahxqcTVOnjzJ/PnziYmJYeHChRw/fpwPP/yQvLw8BgwYQIcOHQgPD6+0OZCzs38hLa0BnTpFAXD27BHM5nyio2t2qs4/0+l0tGzZEofDcW6GvPMdDmtaSkoKL7/8MosXL6a4uJiAgADuvfdeHn74YaKjo93iIlBXhIeHM3jwYD799FOeeuopvM8vgFJSUoLVasXhcJT5KW1b/fNPcXGxa4lVDw8PEhISMJlMpKamsm3bNmbPnl0lN702m42S777D8M47mDIyQKtF2e3k9+iB4+GHCWrSpEo+T1FRUfTr148FCxZw6623UlJSgtlsdr0OpaXbC/8v3aeoqMg1+qh0IiZPT08yMjJ49NFHa+XnX6vV0qpVK7RarSt/F8tnbalpqAp1OrDDuer4kydP1onAvnPnTj7++GN69uzJoEGD0Ol0hIeH07lzZ06cOMH333/P3Llz8fHxoX379lx33XVX1c7ncDjIyfmGxo0fck3nmZm5nqCgG2vlh7r0Qr1582Z27NhBly5daN++fY0t45qSksLUqVNZunQpdrudDh06MHHiREaNGiWl9BrSvXt3fvnlF7Zt20bv3r1xOBysXr3aNb303/1oNBq8vLzw9PTEy8uLyMhI1xrrH374IUOHDq2StnWlFIWrVxP4xBMcHzgQ3ZQpeAYGknP0KI3nzME4cSIFH3+MbxXMuFjaVrxkyRI2btzoOn9vb288PDyIiIhw/V/6unh6epbZx/uCVeQADh48yLvvvkt8fHytnFCqrswQV1U0qq519/uTlStXkpqayvjx42s6K5dks9lYt24dK1euZPz48bRp0+aigdXpdJKdnc2JEyfYvHkzv/32G507d2bgwIFERETg4eFRoTvkc4F8D0FBbdHpdOTmZlFYOBud7gEiIyt3GE9lSE1NxdfXF7PZzL59+/jpp59ITEzkxhtvpEePHgQHB1dbKf7UqVO89NJLLF++HK1WS//+/Xn55ZeJjY39x180atqRI0d47bXXmDVrFsHBwaSkpFBcXIxer0ev16PT6Vx/X7jNYDC4SuKlgd7pdOJ0OtmzZw9Llixh+vTp+Pv7V3qes1NTCbrvPlICAvB77z18fH1djx3dvJmmY8eS98QT+D/4YKWnbbfbefvtt2nUqBFDh1ZswZk/U0phtVrR6/V88MEHAIwdO1a+E7VMnQ/s+/fvZ8mSJbz88suuoLd+/Xp8fX1p2bJlpfYEvRL5+fksXbqUY8eO8cgjj9CgQYPLep5Sivz8fFavXo1ef4DOnT0oKWmJj09bIiNj/7aqsLAwj7S0E9hsZry8/AgLa0h+fi56/U/4+AzB07NmSsEX43A4SEpKIjIyEr1eX+bim56ezooVK9i9ezcxMTG0a9eO1q1bX/breCWOHj3KI488wg8//ECzZs147LHHGD58eI1/lsT/9/nnn7Njxw7Gjx+PyWTCbrdjsViw2WxYrVasVis2m63Mtgt/X/iTnZ3Nxo0beeCBBxg2bFiVVC8f2rKF+OHDyXv/ffwHDCjzWHFBAd4TJ5Jy9iz1vv++0tM+ePAgixYtYsqUKRgMBgoLC6lXr94VnWdaWhoff/wx48aNw2q1MmPGDB544AFat25d6fkWV67O32YFBARgtVopLi7GdH7yFTgX3BcvXkznzp3p168foaGh1d4elJmZyZw5c/D39+fpp5+uUBWfRqPB39+fkSNHUlJSTErK7wQH/0Zx8Xz++MMTH5/+1Kt37UXvlFNTj5Gf/wJ2+16cTgfFxd5kZHQnLOxljMZh6HS142232+3k5eXh4+Pj6pR24Q2LRqMhIiKCCRMmkJuby969e9mzZw+rV6+mYcOGDBw4kLi4uEptVjh8+DBTpkxhy5Yt9OnTh+eee45OnTpJiaSW6dWrF59//jkPP/wwcXFx6PV6DAaD6/eFf/95m9FoxGQyYTAYMBqNaLVarrvuOjp06FBl14iSggLIzcXjIhPeePn4cCg8nIY7d1b6apVKKX744Qfat29PYGAgK1aswG63M2zYsCs6XukSvBs2bHDNFLlw4UJeffXVctX1oubU+auVXq8nOTmZ5ORkVzt7nz596NatGxkZGXz33Xc8/fTTNG7cmOuvv57mzZsTHh5epUHe6XRy9OhR5syZw3XXXcett956Vb32vby8adz4WhyOjnh6FuPpeYDTp1dQVPQJAQFdsVjaExYWg7e3ieLiQoqKXqGk5BCRkfPx8IjD4UjGYsnCYDDWmqCem5uLt7c3f/zxBzExMcTHx//lexIQEECPHj3o2rUrhYWFbNu2jXfffRdvb2969OhBy5YtadCgwVVV1e/du5dHHnmExMREXnrpJUaPHk3I+QVzRO0SHBzMokWLsNls6M6PDS/9Ke00daltNeHvKkabAE4qv0f2yZMn2bt3L2+88QY5OTls3bqV+++//4rT8fT0ZMSIEUyfPp2EhAQ6d+7Mjh07WL58OaNHj66VfXf+iep8VXxOTg73338/UVFRPPHEExddCrWgoMA1vCw/P5+wsDB69uxJu3btKv2L5HA4+OGHH1i5ciXDhg2jW7duVXYxOXv2BNnZm/DxOQxoKSzsQFhYWzIyxmI2d6Zt29lVku7VsJaUoNXpOHLsGGfPnqVLly4AVzQG3Ol0utriU1NTMRqNJCQk0KtXrwp3uNuzZw9PPvkker2ehx9+mJtvvrlWDQcUdduhLVuIv/NO8j74AP+bbirzWHFh4bmq+PT0Sq2Kt9lszJgxg27dutGnTx+++OILTp48yeOPP37VAfj777/nxx9/ZOrUqeTk5DB79mwefPDBOtGJ+Z+gzgd2pRQnTpxg+fLlJCYmEhAQwK233kpcXBx+fn5lPsBWq5X09HR+//131q1bh9lsZuDAgSQkJBAQEHDVHbMsFgtffvkl27dvZ/z48cTFxVV5CUEpRUFBHjk5p9Bq92My9SQrayIlJan4+c0jJKQ5JpNPjQ9LKe10o7VYYNMmnH37cvT4cZo3b37VPcxLOx0eO3aMLVu2sHfvXrp06UL//v0JDw//yypCpRS//vorL730EvHx8UyePJnw8HAJ6qJSZSYlEXLPPVhjYtDOmYP+ghvZ47t20fjuu8l94AECHnus0tLcsWMHX3zxBc899xxms5knn3ySmTNnVsqMjhaLhZkzZ9KuXTtuvvlmVq9eze7du5k6daqMGKkF6nxgv5DFYuG3335j9erVlJSUEBMTQ0JCAq1bty5XglNKsX//ftasWUN6ejr16tWjbdu2dOzY0TVhQUVkZGTw4YcfUlxczGOPPVYlPWsvV2rqGnJzX8RqPY3JdB0azVCCg/sQEFD9w1KUUjgdDqxWK55bt1LUoQPOM2dw6nQEtGxZJWmmp6ezbt06du7cSVBQEM2aNaNr167Ur1+/zA2O0+nkp59+4qOPPuLmm29m0KBBtWLsvHA/SikKli3Db+pU1KhRpA4ahNbPj5zTp2n0xht4FhVRuGwZPpW0NKjVamX27Nlcc8013Hjjjbz//vuYTCZGjx5dKceHc6MT3n33XZ555hnCwsKYPn067dq149Zbb63xgsQ/nVsF9lJ2u53ExET279/Pjh07yMjI4MYbb6RXr17lSvFKKVJSUjhw4AB79uzhyJEjdOzY0TWe9XI6TaWkpDBr1ixatWrFnXfeie8FQ1lqglKK1NQjmEw7SUv7BrP5R3x9BxEZ+Xa1jgkvHU6k3boVa3w85txc7MeP49OjB8rpxLOKO9vk5eVx+PBh9u3bx+7duwkICGDYsGG0bNkSjUbD5s2b2bZtG0OHDq2W2hXxz2Yxm3EsWYJx/nz0Fgt4eqLy8rB16ED+5MkEtW1baTVFhw8f5j//+Q+vvPIK+fn5vPXWWzz66KM0bNiwUo4P526MP/30U9LS0pg8eTKnT5/m3//+N0888QSNGjWqtHRExbllYL+QzWYjLS3NNWQqLi6O66+/niZNmpSbWMFut5OTk8PGjRv59ttvqV+/Ptdffz1t2rQhIiKi3JfO6XTy888/8/HHHzN8+PBKX7v5apVWfycmfkBR0bM0bLiF4OBWwLnXRaPRVGlv75zff8fTxwenvz9q0yZU796Yk5IIbNoUfTWWjJ1OJ0VFRezcuZOvvvoKnU5H9+7d0Wq19OnTp8xoCiGqktPpxGY2Y09OxlFYiDEyEm1QUKXWFFmtVp599lmGDh1Kly5dWLRoEQ6Hg/vuu6/Sr092u53nnnuO3r1706tXL7766iuOHTvGk08+KVXyNcjtA/uFMjMz2bFjB3v27CE9PZ2mTZvSv39/YmNjy5XWCgoK2LVrF7t27cLf359hw4bh5+fnetzhcPD111/z008/MXLkSDp27FhrS3wpKd9x9uzdREauIDz8OgByclLR6TwALRZLCSEhEdjtNgyGyrvAWEpKsK9bR3GHDmgsFrzS0vDu0qVGXyebzcbhw4fRarW0aNGixvIhRFX56aef+Oabb3jllVfIyclhypQpvPzyy0RWwax2AL/99huLFy/mmWeewWg08q9//YvbbrvN1TFWVL9/VGAvZTabycnJ4ddff2XVqlX4+voycOBA4uPjCQkJKXOnabPZMJvNmEwm191ubm4uH330Eenp6Tz++OOEhITUmqCenX2W/PwvMBrjsNka4uVVQFHRdAoL9xMb+zMm07nFLUpXlcvPP4zV6oWXl4P8/ELCfBtRnJ6OT2wsdpsND09P12IJf2az2bCazaDR4OHpedHSf05aGsbdu9F064bOaJQV0ISoQoWFhcycOZOBAwfSsWNH/vOf/xAVFXXF49Yvh91u57///S9KKe6//35OnTrFq6++yr/+9a9at/TyP8U/MrBfyG63s3v3bjZs2EBOTg6hoaF06NCBzp07X7Q9OiUlhfnz5xMSEsI999xTphRf0871Dk+nqOg/FBdvQKkSQIPRGINON4Ho6H6XrIpLS9tAYOB1FK7/AVNCAoWJiZhMJqw+PpicTvQXrOLkcDhI+vFHotetg6Skc4tZxMaSevPN1LvI+vIpx44RHBGBh8zcJkSV2rp1K2vXrmXKlCmcPn2aefPmMWPGjCq/TuXm5vLMM88wfvx42rZty8cff0xOTg4TJ06UDqk14B8f2EvZ7XbS09M5ePAg27dv58SJE/Tp04c+ffrg7++PXq/nwIEDvP/++/Tp04ebbrqpVi0V63Q6SUx8nbCwseh03mRmplJSUoBOZyAgIISAgJC/bF8rLi7CaDBSvHo1pptvxrZqFapvX87u2IFv06YE1a8PnHudLB9/jOn117E2b47q3h1ls6FdswZjXh4l06fj2b9/ranBEOKfwuFw8H//93/cfvvtJCQkMG/ePEJDQ7nzzjur5fu4a9cuPvnkE6ZNm4bD4eCVV15hzJgxtGvXrsrTFmVJYL8Ip9NJWloaq1atYvv27fj5+REWFsbPP//M888/T0JCQq0LXGfOHMBmW0j9+jMxGo2YzSUUFBzDz69Zhaq/lVLkpadjSEnBHh2N3549mLt0wet8B7OU3bupN3w4lrvuQvfss+jOV79bi4vRPPAAxuPHyfn8cwKrcC53IUR5a9asYfv27bzwwgskJiYye/ZsXnzxxSpbW/7PbDYbc+fOJTAwkFGjRvHrr7/y1ltvMX/+/CsaQiyuXO3pwl2LaLVa6tWrxwMPPMDMmTPp3r07RqORF198kU6dOtW6oK6UwmzeiY/PNa7+AQUFp7BYluFw2Ct0LI1Gg1dgIPoWLTCYzWQaja6grpQiZPt2lNVK/t13ozcYXNN0ephMJE+cCEeP4v3HH5V+jkKIS8vOzub77793lc6XLVtG7969qy2oAxgMBoYOHUrjxo0BaNOmDampqZw5c6ba8iDOqR0Th9diISEhDBkyBIfDUWvnQS4sLMDL6wjFxSNdNx1FRRvIy2tH/foVH8pVWsJ3RkZiCAtzbXc6nTj37oXmzTFc5A7cGBUF9eph378fj759r+xkhBAVtnnzZmw2G9HR0SQnJ1NSUsLAgQOrPR8NGjRwTQT1ww8/0KNHDxl9UgOkxH6ZamtQBygoSMJotLrWWC8pKcJs3k5s7A1XdVytVltuLKoqKQFPz4u212t1OvD0hJKSq0pXCFExWq0Wh8OBUop69eoxZcqUGuu0ptFoyM7O5scff2T48OG1+trpriSwu4GiwrXk5V2Ph8e5XvxnzvyIVtsSX9/KrYbTaDRogoIgJwe7vXwVv9NqhdxcNLIimhDVqlevXgQFBbF582Y0Gk2NL6G6Y8cOgoODXdXyonpJYK/jinOz8Np3gPr1ewNgNpeg12/E1/fmSk9Lo9Gg69QJjhyhODm53OPBBw9Cbi5FbdtWetpCiEvz8fHhoYce4n//+x+nTp2q0bwUFxezcuVKBg0aJPNW1BAJ7HVc0oYf8cvogJfXuTHiaaknMeoN+PhU3pzQpTQaDfmdOuFo1IiQf/+bgsxMHA4HDoeDrFOn0LzxBo4ePTA0aVLpaQsh/lq9evUYPHgwS5YsoaQGm8PWr19PVFQU8fHxNZaHfzoJ7HVYcWEhsdu3Q48bgHO91iN/3YfHsRb4+FTNQjRBsbGcmjkTEhPx7NcP6733Yr3rLvwGDcLh70/69OkEBAdXSdpCiL/Wq1cvSkpK+Pnnn2sk/bS0NL799lvuvfdeaVuvQdIrvg47e+YM0Xo9nF/q0Wazodn+K9axY6tsSJ5Go6FJ9+6cXbQI85YtNEhOBp2O07feSkDPntQLr/6lYYUQ5/j6+nLHHXcwd+5cEhISqnX5aKUUGzdupHXr1oRdMJpGVD8J7HWUUoqAnTvZ36QJrc5/eQv/+ANvpYiIi6vy9MMaN4bGjXE6nQBE16JV7YT4J2vVqhVdu3Zl4cKFPPLII9W2ylp2dja//vorEyZMkNJ6DZOrcR1lt9nw3rKFet27o9FoUErh+OILim691TUbXHXQarW1aqlaIf7ptFott912G2lpaWzbtq3a0v3uu+9o1KgRzZo1q7Y0xcXJFbmOKjx4kKzgYAIbNQIgNymJgLNn8erQoYZzJoSoad7e3txyyy2sWrWKwsLCKk8vPT2d9evXM2LEiFo3M+c/kQT2Osq3RQsCnnoKrVaLUorsrVvRtG+PZw2PXxVC1A7XXXcdDRs2ZOnSpa4ms6pgt9v5/PPP6du3b7VOYSsuTQJ7HVOSm0vyunUk/u9/ZG7bRnFKCkopYmNiKOjdW6rFhRDAuSr5u+66i927d7N///4qSyc1NZUTJ07QrVu3KktDVIx0nqsjbDYbjhUr0M+cSRScm7rVaoXiYnLuvx+v++8n4CLrxwsh/rkCAwO56667WLp0KdHR0X/bS97hcGC3213zU9jtdpxOp2tb6f9hYWGu2e2+/fZbWrduTVRUVHWckrgMEtjriPTt26n/9NNYhgwhd9IkfKOiKDp7loKlS4l6/XUyg4LwGDWqprMphKhlOnTowObNm9mwYQNDhgwB4OTJk/z4449YLBZKSkqwWCxYLBb+ahVvpZSro+7IkSNp1qwZycnJ/Prrr8ycOVPa1msRCex1hM8HH0CjRhQ9/jhB5++M/aKiME6aRPru3YQvXUp2374ERUTUcE6FELWJl5cXo0eP5oUXXiAhIYH69euj1Wrx9fUlJCQEb29vPDw88PLyQqfTodPp0Ov1rr8v/L/0t4+PD3a7ncWLF3PzzTcTIutD1CoS2OsAh82G/5YtpA4bRnhkZJnHPD09sQwaBFOnkp2SIoFdCFFO/fr1ufPOO/nPf/7D1KlTiY6OJjo6utx+drsdq9Va5ufCUn3p/1arlT179rBjxw4mTpxYA2ck/ooE9jrAXliIh9XKqcBAIi/SOU5frx4UFGCR5VKFEJfQpUsXvvzySx5++GHatm2LzWajsLCQkpISioqKKC4uBsBgMLh+jEZjub+NRiNarZaMjAwmTJiAr2/VTF8trpwE9jpAazCARoOv1XrRx53FxWA0VuvENEKIusXX15cpU6awevVqYmNj8fPzw8fHBy8vL0wmE97e3hgMhnPLM//pByi3TSmFXq+XtvVaSCJBHaA3mSiMiKBVYiLmkhI8/9T73fL77/iGhWGqxnmhhRB1T6NGjZg0aVJNZ0NUMRn0XAdoNBrUHXfApk049+519VxVSpF3+jR+//sfJV26EHaRNjMhhBD/LBr1V+MbRK1RnJaG9/jxkJLC2bFjSY+KQpORQctly9CYzWS/9x5BLVrUdDaFEELUMAnsdYRSisLTp/H49FPs330HhYXg7Y3u2ms5O3o0Ddq0qeksCiGEqAUksNcxTqcTh8PhmixCq9XKEolCCCFcJLALIYQQbkQ6zwkhhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBuRAK7EEII4UYksAshhBBu5P8B+BCIccICwRYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tso_B = add_tosylate(B, tso)\n", "tso_outB = add_tosylate(outB, tso)\n", "\n", "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 9))\n", "\n", "v_B = tso_B.draw2d().draw(height=300, width=300)\n", "v_outB = tso_outB.draw2d().draw(height=300, width=300)\n", "ax1.imshow(v_B)\n", "ax2.imshow(v_outB)\n", "\n", "ax1.set_title(\"Cyclohexanol + TsO\")\n", "ax2.set_title(\"Phenol + Cyclohexanol + TsO\")\n", "ax1.axis(\"off\")\n", "ax2.axis(\"off\")" ] }, { "cell_type": "markdown", "id": "ca5d0c65", "metadata": {}, "source": [ "And finally use _outA_ to remove the tosylate group again." ] }, { "cell_type": "code", "execution_count": 12, "id": "f0f7509a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 299.5, 299.5, -0.5)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "final_B = remove_tosylate(tso_B, outA)\n", "final_outB = remove_tosylate(tso_outB, outA)\n", "\n", "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 9))\n", "\n", "v_B = final_B.draw2d().draw(height=300, width=300)\n", "v_outB = final_outB.draw2d().draw(height=300, width=300)\n", "\n", "ax1.imshow(v_B)\n", "ax2.imshow(v_outB)\n", "ax1.set_title(\"Cyclohexanol + OutA\")\n", "ax2.set_title(\"Phenol + Cyclohexanol + OutA\")\n", "ax1.axis(\"off\")\n", "ax2.axis(\"off\")" ] }, { "cell_type": "markdown", "id": "7cbab8f0", "metadata": {}, "source": [ "## Multiple target sites\n", "\n", "So far we have had reactions perform a single operation each time. However, we can also have a reaction perform multiple additions at multiple target sites simultaneously. To do so, we simply have to let the `atom1` function return an iterable of multiple `Atom` objects (e.g. a tuple, list, or set). " ] }, { "cell_type": "code", "execution_count": 15, "id": "eb925e72", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# actually, our add tosylate function already checks for all possible hydroxyl groups\n", "# but then simply pops the first one it finds\n", "# to change this we can either redefine the Reaction using the `set` method or we create a copy\n", "# of it with a modified atom1 function using the `with_reactivity` method. \n", "\n", "# let's get a new reaction that checks all hydroxyl groups\n", "multiple_site_add_tosylate = add_tosylate.with_reactivity(\n", " # this time we don't pop at the end so we get all possible hydroxyl oxygens\n", " atom1 = lambda mol: mol.get_atoms(\"O\", by=\"element\", filter=constraints.has_neighbor_hist({\"H\": 1, \"C\": 1})),\n", ")\n", "\n", "C = bam.read_smiles(\"OCCCO\")\n", "\n", "# and add tosylate groups\n", "outC = multiple_site_add_tosylate(C, tso)\n", "\n", "outC.draw2d().highlight_residues(1, color=\"yellow\").draw(height=200, width=500)" ] }, { "cell_type": "markdown", "id": "e269f20e", "metadata": {}, "source": [ "And there we have it, two tosylate groups added together! " ] }, { "cell_type": "markdown", "id": "f14671ce", "metadata": {}, "source": [ "And with that we have reached the end of this tutorial on the `Reaction` class! As we have seen we can define reusable and flexible reaction mechanisms by simply defining functions that find the right atoms to participate in defining a linkage. \n", "\n", "Thanks and good luck with your research project using BuildAMol!" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }