{ "cells": [ { "cell_type": "markdown", "id": "satisfactory-stanley", "metadata": {}, "source": [ "# Improving performance" ] }, { "cell_type": "code", "execution_count": 1, "id": "rural-wings", "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "# dask and distributed are extra installs\n", "from dask.distributed import Client, LocalCluster\n", "import matplotlib.pyplot as plt\n", "import mdtraj as md\n", "traj = md.load(\"5550217/kras.xtc\", top=\"5550217/kras.pdb\")\n", "topology = traj.topology" ] }, { "cell_type": "markdown", "id": "boxed-fiction", "metadata": {}, "source": [ "Much of the core computational effort in Contact Map Explorer is performed by MDTraj, which uses OpenMP during the nearest-neighbors calculation. This already provides excellent performance for a bottleneck in the contact map creation process. However, Contact Map Explorer also has a few other tricks to further enhance performance." ] }, { "cell_type": "markdown", "id": "assigned-cause", "metadata": {}, "source": [ "## Dask\n", "\n", "For multi-frame contact maps and contact trajectories, Contact Map Explorer can use Dask to parallelize across frames. Note that Dask is not required to install Contact Map Explorer, so you must install Dask separately to benefit from it.\n", "\n", "When using Dask, a few things are different:\n", "\n", "1. You need to provide a `distributed.Client` to the `DaskContactFrequency` or `DaskContactTrajectory`.\n", "2. You need to provide the filename (and any other arguments needed by MDTraj, instead of the trajectory itself.\n", "\n", "Dask might not give any performance boost on a single machine, but can be very useful if parallelizing across multiple machines. Because this directly takes a `Client`, it is easy to interface this with tools like [dask-jobqueue](https://jobqueue.dask.org/en/latest/)." ] }, { "cell_type": "code", "execution_count": 2, "id": "southeast-cement", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "

Client

\n", "\n", "
\n", "

Cluster

\n", "
    \n", "
  • Workers: 4
  • \n", "
  • Cores: 12
  • \n", "
  • Memory: 15.26 GiB
  • \n", "
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from contact_map import DaskContactFrequency, DaskContactTrajectory\n", "from distributed import Client\n", "client = Client()\n", "client" ] }, { "cell_type": "code", "execution_count": 3, "id": "practical-burns", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 312 ms, sys: 30.3 ms, total: 342 ms\n", "Wall time: 3.62 s\n" ] } ], "source": [ "%%time\n", "freq = DaskContactFrequency(\n", " client=client,\n", " filename=\"5550217/kras.xtc\",\n", " top=\"5550217/kras.pdb\"\n", ")\n", "# top must be given as keyword (passed along to mdtraj.load)" ] }, { "cell_type": "code", "execution_count": 4, "id": "binding-planner", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "101" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# did it add up to give us the right number of frames?\n", "freq.n_frames" ] }, { "cell_type": "code", "execution_count": 5, "id": "daily-candy", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAD8CAYAAACCRVh7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAABH3klEQVR4nO29fbQdRZno/XvooyeaoImemMQEbhABUUaCRD7ugMSLjMGFA444wNxxkItgvGQWMsAVzGSO52ayYIwZLu/gkAmK4HsdPhQFZCkOukTNGlASCZLwIUGjHEwCQRAPeo7v2dT7R1efU7tPd+/u3V/V+9Rvrb12d+/uqtrd1fVU1fPU84hSCofD4XA4otin7gI4HA6Hw16ckHA4HA5HLE5IOBwOhyMWJyQcDofDEYsTEg6Hw+GIxQkJh8PhcMTihITD4XD0CCJyvYg8IyLbYn4XEfl/RGSHiPxURN7RKU0nJBwOh6N3uAFYnvD7ycBB+nM+cG2nBJ2QcDgcjh5BKfUD4DcJp5wKfEn53A/MFpEFSWn2FVnAbhkYGFCL998f9ulSZgWrxkWKK1QZKOV/uv2f3eYZYNv9USq5TE15rnFU+f865VUU4XzCHhuC3zqdF3VN1nKYaSa9UxXdmy1btuxVSs3Net2bRdTvU567C7YDo8ahjUqpjRmyWwg8ZewP62O74i6wQkgsXryYzT/+cd3FqIbxcehLcdvTnldEeQLM/OKOd5N+Ff8jnCdUn29aRkdhxoy6S1E85v8y60+wb/5n8xmZ50adFzzHqLo0qttL85qa7q943i+7ue73wMdSnvtpGFVKLe0mH02UtEz0zWTpW9TDpG248jbMadOIO6eoBtZsBIr8T0lp2iocAposIMINdbgzEexHNe7Bb6OjMGtWexrBPQmnbe5HPddu7mUdHZcEhOiWuySGgf2M/UXAr5MusOdOOYrDohcAKKY84TSq+o9ZGhTLGp/SGTVmPcIjiLhRQ/i3YH9kZOpv4VFG0r0dH4/OOwoLn1GFQuJOYKWI3AwcDfxWKRU71QROSFSL7dMgjqlkeVa98lyTpn/Cv4dHdlHnBPvBuS+8AAMD7b+HhUP4GmifRhodjR9lNFBYFyUkROQmYBkwICLDwCDwCgCl1Abgm8D7gB34M13ndErTrjtZ98MtW1/QsIrrKIm663kSnaZ4wlNDaacBzf2BgcmRw6xZyaMFszwzZkwdLQSjGTONBk7nFWXKopQ6q8PvCrggS5p21dS6X5xO+Vc5ErC5IWkK0+EeFl0nkxppaG+o+/ri9Q7hNMLpmDoJM9+o66PKEqTZQIEQpmKdRGZ6/A0qmLgXsYzGqNcbtyoo6h4W/XxtTStN+ubcf/j3JAsm8ztKEJhWSp0ERVS5wuk27P1xQqLXaViFrI0oy5gm3LsmlLEsoqaf4hrx8PRTEfqcvr52AWJOL1lg9loUTkg4mkcVo6MmNL5NEWRlEbUuIa4xTrpX5nVRuoyoUUbYGspMI9BpmDqKsPltJ2uoqP9XE05IdOLllyetFSx5aF1jW6PilOz5aOp9KKoehhvtpDTNXn+w3ylN8/zwdWFdhikIAp1GVGPfwHbECYlO7LNPo4eKbdhUOZPmdh3ZSNPztKmDUJYiG6JXS0eNEs3GPmziGtZBxI0kzHPDjf/evVNNadNg03PCFxA2O9Gz5041mbD9ti0Cz6IXIRLLXtZEbFy8V8R15vXQWSiEdUrmdpSeAKLfhygFt5lOkF+cW47x8XYB4RbTlYZ9d6uJmJUy3DNqKlX8h6bfozBF/J9u08ibd5QVU3A8Salsnh8WEGn0E1GjjE5liytLg+uTExLTjQZX1gl64T84uidJnxClLI6yeooaAcSlGdZDBOmbjIxM6iKSFu/l6eDUZEbrhMR0IK+1hGXWFo2lwbbytZG1UY2acupkuWaOHqL8M0UJm6QFeElTWd2S9T4U9M7avpiuo75ERPYTke+JyKMisl1ELtTHXyci94jIE/p7jnHN5To83uMi8t6uS9ckxWvScDe8ACnr9VnSme4E99EJiPTE6SHMxjquQZwxo920NfiE62kw6oiqw0lpjoz4AiH4mBZPwboJ83ieUUTW6wqsZ/uk/NRBmnzHgYuVUocCxwAXiMhbgcuA7yqlDgK+q/fRv50JvA0/jN6/iojXVenqeNGTGuJuG+miKpNr/BxVYTb2Zr0zTdWT3oXwCMG8Lvxb3LqGvj5/9BAIjbCZq1nOJAHVACTlpw46Cgml1C6l1E/09u+AR/EjGZ0K3KhPuxE4TW+fCtyslBpTSv0C39vgUQWXuzw6KerSNtKu118fZd77JN9EvUhULz9qlBH+JOkIzLURwW9hgRK3fiJsWhs2k40qcxXkfP42C4lMd1NEFgNHAD8C5gV+yJVSu0TkDfq0hcD9xmXD+lg4rfPxA3Gz//77Zy54LcQNuaOGuE43UR9l3rturW96hSST1E5WUGlMVMPmsHGEhUPdZuc56kDjdRIBIjILuA34hFLqxaRTI45NCY+nlNqolFqqlFo6d27msLD1EDeSKKqRSONOwJGepvTuuy1nkf8vbjSUNHKKM5sNiNMPhXUI5rkwOb0UtYgunF4ZU0w1jAwbP5IQkVfgC4gvK6W+pg/vEZEFehSxAHhGHx8mY3i8RmLagZuV1jTTy4pZ2bMKiiyjnLjre0U4NUU4BFSlaO0mrb4+2LnT3541a+oK5yz1Nep9SSLOnXinY1HEmepGWWpFnRtlchsVma9LbB5JdLzDIiLAF4BHlVL/bPx0J3A2cKX+vsM4/u8i8s/AG4GDgB8XWehaCFesuBWj4TCO3VhMdCpDlpclbf69ICACwe2m7LonfA9hUjCYiuyAuNFElulXM82ynlnStJg5Ykkqg9kxLNizQtPdcvwp8GHgYRHZqo99Cl843Coi5wK/Aj4EoJTaLiK3Ao/gW0ZdoJRqFV3wKcQpx6qaq4yy/uiGbgRBEvfeC8uWdVeWpmGaYtpMFaO2bvMI38Pxcbj5Zn/7lFPifSXlmSrt62uPcV3EvTH/f6cGPU44RF1XwnOzXSfR8R8rpTYR/x9OjLlmLbA2c2nGx2F4eHJ/YKD7qZu8wiHLKlHzvLz5FlkJx8eLExDBlMPixcWkl5c0o4W6F9bF1aEqypInj3C5//qvO6eZ9z91+54nERXIyLSmgqmCzRwtRL3LUfUuyhIrI40WEpXS19d9I1T0ixc1XA5XhqgKEyi9uhUWRU6VFHlPyhAOnXp4eUdVdetZ4qa+6i5XFOFG0zRHLaMBLxuz8Q936OLqXZRXWVO4xEXNM5XsXeKERNlU9dKlafjzWicVPZIoOs0iKctbZ1wv0RFP3Jx92D9Tt2R5R4uut1HK6aj9QEAEU19h3WNS2XKW1QmJKihCUCSlkWTyFx565plyymvdZF4bzPWaPcE4a41u8qyTNNZcSZ5Iq6Ku6aasxFn/7N07uT0wkK3saYV1eG1EUXrEuP+U5HV2fHzyfQlMdc004srmhESFmA8lrTlpWT2OTulG9VCiKl2aRURRaYaJivXbSVnbyYywrt5dXpKsuZpmAmvD9FOcxVJawdBplXXa/Iu6D3F1IChXMFqYNWuqMEvSZUQZxOR8fi7oUBbCN7vOudCoxjTtHHm4d95t7ytMOG5FldTdiGXBHCXFRTXrRJVC0YZ7m3edTZ7plzL+f7izEB45R7UtwcgzKYCYaeJeoGBzI4m0RPUCbXiBAtKWpZsy5zEhrALbRhJRJPX2ukkn6XeTNCPKrHlkJU96Sdfa/LyTSBpJhH83R/ph66Y07VEBz9IJiSzYXCnz9raSsPl/QznlC/f0kla3pqGonl2c7inYDufTjaI87XlpdVxFGkvE/d9O2DBtFhB33zpFjkxScpvHOs0sZKDx6yQcGrOHEa4cSS+ZLS+NjXSaosgzIgtv5yFuvj7pWFFUNa1YhEVYlXW907OdNWtyRGkqnIORpjl6iDP/DZNH59IBJyR6gSRTwK1bYdEif3vnTli6tLpymfbsMHWudXh4smzTgU4Nug3Y1OMOSOpZb9jgbx92GBx33ORvWf9HEb3wuKnEcOfATDucR9x6hzTTiFHXFeCiwymuy6ZgPyqxxFXoJUsmt2fPLr8cJkGZ4pT8VZenTsKN1s6dMH++v12kvifvNEP4uiLqb1oT7bhz4xrfvXsnBcOb35yvjEUI8LjrzEV/YWGRJEDM7UB4medGjTji8suBG0mUTRUCIs7ra/BbgGlnbR6Luq4K6vazXyXh+5tnlXjSlGHRz7GIZ5RlGqyT5ZzJwMBkRyOrxV+YvO9Bkmlz2JQ1nE94FBO3hiJuNBFO25zOcjoJB5D8IodtpsM9tbqmFmyc1jApegQYtm4yyZpPFfctqtGrs65ElSPKVUXUeWko27gjTmcQ9T6ao4xu1zzEeYLuApuFhM1TYXYtikoqSyAYxsdh927/mBmC0ey55C1DOB1TJxFuHPv6YPPm/PmWRdqGO8pnVtS9CE8TjIwUO81UFkEZ6yynWQazHLNmwV13+Z+gbgd0eie6oax3Plxfov6r6SY9qhzBAryotHPS+KBDldIEe/wwZlmDOfCkpf9xdOrFJE0pRPVq+vqKU6LneS55TYezumsOpvuKWIxZ5mjMxjoe1es+5ZToc7PW1TQUqTcyOw3hRXBRAYPC5rHhxn/WrEk3JbNntxuL9PBIwr5aWqKZWS6SymW6D4mabkrbY+40x5u2oQ73jsqa8857bVHCM+m6rHmFsaX+1cXoKLzwgr9tGgGEKWoxX5Fmy6bSOUwaH0xROg1z6q2gqVLnliMPdShd0zTE4d/MHmuZkem6eXlsVlynbRBcA18dUXW7bP9p3ejvkupO1JSsKTCSOk7hEUbYQipKWV2AI0mbRxIdBZiIXC8iz4jINuPYLSKyVX92BhHrRGSxiPzB+G1DiWUvhyLmhoMK1UuNVJTOIy9l3Z+idECOeP1P3XTqTEWN/E0T1zj9Xl+fLxySAg4F2+asQUEWTnl1EiKyXEQeF5EdInJZxO+vFZFviMhDIrJdRM7plGaaf3YDcA3wpeCAUuoMI9P1wG+N859USi1JkW7z6Ga6p1coY0Ri03RindhwH+LqdpZyVfE/uhmhJ41UktZChNOIs5AqgCJGEiLiAZ8DTgKGgQdE5E6l1CPGaRcAjyil3i8ic4HHReTLSqk/xqXb8U4rpX4gIotjCiXAXwL/Lf1faTBZhsJZrykDGxqfOmjaf7ahvHE6gSx1KKtA6eaaboWDaQUYbuDNKeI48/UogRC31qILCppuOgrYoZT6OYCI3AycCphCQgH76rZ7FvAbILHwefUlxwN7lFJPGMcOEJEHReT7InJ83IUicr6IbBaRzc8++2zOYlhGtyaNRQ/pbWh8kii6fOb8cVXTI53ysXGqJok8I4ms+RSpr4P4e21OCZk+nMz94LzwdXFpm2nmnG5KO9WkBclA0G7qz/lGUguBp4z9YX3M5BrgUODXwMPAhUqpl5PKl7cGnAXcZOzvAvZXSj0nIkcCt4vI25RSL4YvVEptBDYCLF26VOUsR72UYZFhewNfJt3ezzruWbeK1jIseorE1D8F6wNmzy5/tBC+Ps/IIe21YZckUSOEpN8KUFxn6K3vVUotjfktakASblvfC2zFn/05ELhHRH4Y1UZ3UbZQaUT6gL8AbpkojVJjSqnn9PYW4Eng4G7zyERRvbW0PT9TcRXuYXRL0YrhOOWcLT3bpPnfNOfFEfTszNCbdRHX0+xkalk1IyPti8UC5a2pyM06UotSIGf5f1nqQdwIIuq4+UzCiue4dzkp7wL0dQUproeB/Yz9RfgjBpNzgK8pnx3AL4C3JCWaR/y9B3hMKTUcHNCKkN8opVoi8ibgIODnOfJIT1E9sW7mX8MjgHDPIm2aRSuHo/LN06vLc30UZcx1m5iNhG09dYguW1HlzNoLjzNzNReiBekVbZJchCl00igi3MCH/bCFzVzjMNMpOH56QTqJB4CDROQA4GngTOCvQuf8CjgR+KGIzAMOoUMb3fFfishNwDL8ubBhYFAp9QVdgJtCp78L+N8iMg60gBVKqd90yqMnMCtMkpVEHDZOOZjYVraoBjZ8LFj8VUU5AuJ6v0UK7DQU2WkqQ9CaaYYVv3nzSRoVhPUQUdeFrzHLaY72CxLuRbncUEqNi8hK4NuAB1yvlNouIiv07xuANcANIvKwzvaTSqnEIXfHf6aUOivm+Ecijt0G3NYpzZ6gU6NetFIuyLObtHuRuHtQVINTlLlz2udq6zNNW7Y8+oOo/bzE6XzMUQNMTqmFzzPPMcuYdzQVQ1GL6ZRS3wS+GTq2wdj+NfBnWdK0tGZaSrj3E9Dt9FKnPMJ0Yy1la+NTJFFWJ+HjWalSQWvjM4qK6paEDZ2ccPrhKWDoHL40bt1EeBo53BHJqUtybjnqQCstn5s3j9e3WsWkGa5YgaLvhRcmpzZMP/NF5NGBP3ger4r7fzY2PmWQNKqoM/8mk1U/FjSgae9F4FE2eG+Cd2bz5vbod2HiBM3evZN6lRdemOrePI3DzahRQngaOY6cdaDRbjls5g+exx88j+c9j9/p7T94HmOex9i8eYzNm8csYMzzus9kxQr/YzIywnOeB/fe63+2bp18QZYv7z6vLnjVEUckn3DMMdUUpOnMns0uz2OXriu/9Dx+6Xk8kafuFIV2iRKU7yn9qY2gtx3Eig4+gSPAqPPBFwyBcNi8edKN/fg47Njhf7ZtS857717/E7a0uuuuye04l95mWaL+T9zvJZNxnUT15VOq/iUKS5cuVZt//OO6i+HoMe7yvImVRMPA+4saUfYgd2mh0wJOTbpPQYwOmKrUNqemonQCQeNtTuOMjPi9/sBceWBgqrWRmYd5XthRX3iaKMmoIY4kXUZ42iqEeN6WhDUMsRwioq5Nee6J0FUeeejBcbLD4XPKSy9NvMxHFL0GpSyGh2HRokqzXOt5E34ZBjsJ0rB1UJyiN2rKxjSzDY4FaZnTQ+Frzf2wq+40+Zv7SYsa48ptbpc0tWjzdJNdQsIIlXiF53H5NOj5XaF7cAcDH2y1GNL7g3Pnco12V7JyGtyHUjAbM5tdpptUKCCCurYPKYRDQNowvmnp1rgiSjndzVoLS/RJTkikxegl/BFgfJyr+/sBuLBHG8qwIDRf1pVVFyaBG3WDshe4uIHPYo3nsbqB5S6LIUOnkXRf7vC85OmnOKIa/6ymyUkWfuGV0mb6ZVpPlZC2CzrUJUFj2avCoWmc3cTnYLzUA8C/eR5/qX+aY9P/2bTJ94sErDv8cC4tuWwTo9WEfIJzjkybqBmdEaIX4SU1sGETVfP8sN7D3I6zPsrSoBe1JiYHbiThiOcTnwDgK//yL3zIpoarFzBe6o/bfG8Nk89CBcQll/jfn/0s0D56SBIQazxvomE4JW15otx6ZBktJOk50ugMsuSdlGZNOCHRBdd5Hue1WpMv0KZN9RaoJNb9y78A0Y3Dg/qlPqLVYq3nscrmhs5hH1o4QHoBEZxnzdRcGQ24BUIhjBMSXXCerqRr7rsPgNV1FqZEknqORxi/2SIg1nkevzf2Uys8a+Y6z+NdwM16vynlLoIs00udznOUgxMSObCmR+MACp4OqZCg0/FqGxbHJbDO87i01ZpYxHdQjvttWi8lvUdWCIhp7JeszoVyaZh+TyTMlVfCZVPihZfDpk3+9NlHP+rv79jBmh/+EPBjwB4yNhb/ktx1F5xySjXl7GFsF3JB+fIIB/DXPgTECQgrhEPANBQOJjZbN1m/4nqdrsiXtlr8SG8f3UWFXmOsRzjDuL729Rg7d/rfixcnn3f66fDVrwJwjefVvnYiaIRsmQZz+HxPP5c3A/vZPnroMbpdcX2oiLox5blHuxXXUzF7ft0Ih4DVx+tw2/fe23a89gV7nYRDgBYQYMfiulfXXYAueVY3jnNbLR7S24dbcD/DtAnh4WH/YIeFdtca+qJ3d7BeAiccbMJNN9lASDg48nFRQxuYuUa5bRQOAW0TiylXYY+SvNAxdvRwySVtllC14HQS1tJxKkxErheRZ0Rkm3Hs0yLytIhs1Z/3Gb9dLiI7RORxEXlvWQUvhJER5yXVYSWHt1rphNjpp/sfkgX3U3rtQx8RI4g8AqKomOlZ3IzHlaMIaooxbrMX2DRP5QbgGuBLoeNXKaXaapeIvBU/rOnbgDcC3xGRg5VStXfZ1kTYf9/42tdy9kMP1VUkh02EVwxbxFW67o7gv7DmFOmar38dSDYRX+95vIOS9Ee29PyLKkdN/8dmxXXHO6KU+oGILE6Z3qnAzUqpMeAXIrIDOAq4r/siFkOUhUcjXU04ysEyAXGTFgxnrV7Ni/pYlA4hybQ1EC6vJllH4agfm6eb8ojNlSLyN8Bm4GKl1PPAQuB+45xhfWwKInI+cD7A/vvvn6MYDkex3Od5HPvkk/5OWsOCgjkraNSNnu2Q5zGYZCYdolF6ozidRBUheIvQh+SYpmq8TiKGa4EDgSXALmC9Ph71XyNtbJVSG5VSS5VSS+fOndtlMfKx1vPaH+5HPsJNnsdNOtqdY3pybKvlC4eaBEQb4+MMtloTo4gh7RU5jjWe50+taj1FY4jTSVQx/ZNGH9JJCBQQvrTJOokpKKX2BNsich1wl94dBvYzTl0E/Lrr0pXMqj172h/uDTdw1g03TGy3EY6C5ehdLHZR38ls1Xko0BQ9AilZWPXcSEJEFhi7HwACy6c7gTNFpF9EDgAOAuyNS/qWt0w9Flhr6HUJ3/A8vuF53DFzZns8X1sUdo7i6evjKHxlmk3Uta6h9pja3dCw97PRIwkRuQlYBgyIyDAwCCwTkSX4U0k7gY8BKKW2i8itwCPAOHBBLZZNy5a1rYsY8jzeoLdNl9Frnn9+qlVIULluvx2YXDR2YvgFrclUzlEO4ZX3xzakRz7hvE/rKoJIh0UuEm1Wc9s8Gh90SCl1VsThLyScvxZYm6dQuQktnIvrgSUOzbWwmCIcHD3JOL67E4DnjOM2r0o2F8cN9fcz2Grhui7NxObppunTSdi71/82A6k7pjWB64ugYW2KcAgwyzjkeQx5Hq+JOnF4OFfs7AUvvdT1tY50OCFhA044VEYZUx5lECwuG/K8tgb36oT597ZzN2+G73yHoVWrgHoFy6AI/P3fw6c/PfXHHAICqM9gYxoZi9gsJKz3AutwFMkuLQA2ho43YeTQiZs8b3J9BUw4MLyL9tXWT3heblfkjql06wX2MBH1tZTnHuK8wDqaTBNCrC7Yo623581jcM4cwDdgyEOU2/SoaHBpIsTl4axQuoHvp8ND5zkBYRe2L6ZzQsJRGLYLiKs8b8LFBTChp8obGjfqf0cJgv8VbNRsQh1EvwsfA8M1f0r35BM02SzcAg+0jbZucjhqY8UK/3vDhkKSexEY1HFF1uuIgJUxPs5n9ObgsmV+lMKaiIrOd2nY0WVWPUa3DawNwqXu/HEjCYejOwoSDgFm7/7iQlNOgemD6b77GKw6/0688EL6c9P6WcrSQx8d9b+TFNVZBIoNwicDNgsJm0c5jmnEHZ7HNfoTEJh1FkYwMgF47LHi0k2B9eFCjzvO/6TB9HVkxpMIN8pJPpHCcShmzOhsyZSl0a9aQBTg4K+xK64djio4NWpef2ys2EzMkUmUS5YSsF445CU8ckjbOPfaiKAAB3+24kYSDnvJG62sanbvbttNKyCGPG+yJ99kdy9FPKvw/087Ein7viVF4AumynKwT8pPJ0RkuY4KukNELos5Z5mOKLpdRL7fKc0GvYEOR3Hc5XmcUnTPfv78ic005q5tbjXu8+Ny/a/+fj7T4bqeptuRSNmdiaT0C1jwV8RIQkQ84HPASfgeuR8QkTuVUo8Y58wG/hVYrpT6lYi8ITIxAyckHLWwxvPafWcddhjq0UcBkAoayFP23beUdDONHszzjHl965TaaWnK1JBlFKhvOArYoZT6OYCI3IwfLfQR45y/Ar6mlPoVgFLqmU6JuifqqIUpzhW3bat2XjaLNU9KsgqItnOa2LhGCYWq1hxYsLahSDLU/QER2Wzsb1RKBQ4EFgJPGb8NA0eHrj8YeIWI3AvsC1ytlPpSUoa9cYcdjhrpevSQcF4jppuqnvKJyssWYZFTJ5JBSOxNcMuRJjJoH3AkcCLwKuA+EblfKfWzuAyd4tpRGFnMVa8o0rS1C+4oIv/lywsXEI6M2GLcYEf40jSRQYeBu5VSLyml9gI/YKrnljYsuLuOXiFL41eORiA9USa3aRnTDf6zer9o4eCEiME00HMUGHToAeAgHRX0aeBMfB2EyR3ANSLSB7wSfzrqqqREO5ZNRK4XkWdEZJtxbJ2IPCYiPxWRr2uNOSKyWET+oM2rtopIsUtmHT3DygY3hP2tFv2tFotare4ERMhUtrFUYa5bhYAwwxJnuaZAihhJKKXGgZXAt4FHgVt1tNAVIrJCn/MocDfwU/zQ0p9XSm2LSxPSCbAbgOWhY/cAhyml3g78DLjc+O1JpdQS/VmBw9FDpJ1SM5XTUwSJYSobxdrQqnOrqHIdR1F5dUonmLKqcUV3USuulVLfVEodrJQ6UEcJRSm1QSm1wThnnVLqrUqpw5RS/6dTmmnCl/5ARBaHjv2HsXs/cHqK8jscjeeNHX4vQvdgepUdXFtvJOApdGoci1Qk9/UVM93UgOmqXl9x/T+Abxn7B4jIgyLyfRE5Pu4iETlfRDaLyOZnn3027jRHgxjyPB7U/paGPM9fiTp7Nvd4HveEesRrbOshp+S8Dg3/ufozeNJJxWT4nvcUk04ZRDW+tiiSG4bNvptSRabTI4m7lFKHhY6vApYCf6GUUiLSD8xSSj0nIkcCtwNvU0q9GE7TxEWm6yHGxxnq74/8aTooZAOldv80+K+FEjUCscW8NSXdRqY7QkR9L+W5c5oUmU5EzgZOAU5UWtIopcaAMb29RUSexF+8sTk2IUdvYbzQlwAzG9hYPuR5E1Hd2LYNDjss9tzrPG/CxnBQK7SLpDFrJvISJQjGx4uJcd0ACymbp5u6unMishz4JHCCUur3xvG5wG+UUi0ReRNwEPDzQkrqaAyD3/d9hq054YTcUd/q4HCzUU4QENB5+ikv00JAxFFUw94Aj7ONFhIichOwDH85+DAwiG/N1A/cIyIA92tLpncB/1tExoEWsEIp9ZuSyu6wlWOOAZw1g6NhxI1m4n4riMbHuFZKnRVx+Asx594G3Ja3UI5ms0nrJL5H/vjRVZLGc2un6ade5Al9Xw4qalQTFcEuTgleB6ZgSHJVXmD5Gi0kHI6sHKcbk5Rxzqwh1dROjQIi0E/cpxvtHwMXBmXeuRMWLy4l31eGD+TtXWe9rmoFdpp8SlgnYStOSDgKJ1WP3CZGR1MrSNuU2hVwtefxQujYsTr/Y41FYvcdeODE8aL5L+F0i26sk9JrgNK5CGx2omdz2TIxZNjnP9hQG/xewHTc93BTnkOCgAiveK5SQIAxUgBeH/7RaDzLEhAAuzyPXXU9y2kgIFyM64oYbLUmXug7gSOCQPdBLOPhYf970aLqC9fjBILhj6Hjf/LSS9UXpmBsGg09j3+vL08q08iI/z1rVmH5LigpQJNjEjfdVBGJL7QTDqURNFrBnPlTQa+zCBv3Osgw/VQGazyPlyOOTwnUFEWBwmGCEgI0OdpxQsICHtcN1yEW9QybTOCELsp12n5Nv8c1C7fVc+Yw9PzzgN/xWZtzqqdqPYojO05IWIATDsWySk8lDc2cyeCePQCsmTcvfQIjI2293ikxrxvOHZ7XHrNi9mzu+t3vADglOG5Mia7XgmAkIq1VOe+LExD244SEo6eY4r56YABIOR0SEJoW6SUBARFBjV54gVPCJwX6MuDi431fmEM//CGDe/awK4vA7cCznsdcozzrPI/f0z49+7x+pnN67Dk0gQKDDpWCExKOrhgcGwPgihhnfpk57TS4/fbJ/ZER1r72tUB7T/oqz+Oil16qfUqoEFbocCsbNjD0wx8C8BqAgQEWFNhYzw2ldWmrNTH9GnCr/v5YYbk6smDzSCKVF9iycV5g7Sc8erDJ6seRnes8r83v1LX6+e5Fj+pGRwH4xsyZvL+KZ520YK4h3mC79QK7VERtlnRiQpRqjhdYx/Ri8Le/9Tf6+lg/c2Y1me7d63/r6SzwFeZvIORYL/h9716+5Xmc7ARYR8KOCT8evmd6pNbRJjBLA26eG2wHnl67ERJmxDnLBUhHUgoJaujUN/zOOirD0CFcXFUjvHOn/20IiVWtFt8N60QCYQJOQHRLuCHWI4mngSOizgvODe59X1/bc+pIYFYb1Ksg7vfixfFCQZdp4rcoH1AmRQqOsld+75NSK/FylHF0uTgh4bCXwE9S6AX9T+BEtziyWMINoB5JnBIWuuYoANrjdYcFSHjfzCOsUzL9TgXnjY+3x5Qw60FUrIk4x3xpHQomUabrEJFs7swrxgkJh73EKKdfhkkl98qViUl8S4863AijIMINtdm4hRu6pIYvadFfXGNvCp4kr7FZylEEedMXST+SqAEnJBzRhNYx2Ma6Cy8E4NIOQsIJhxJI6s1mVTIHgibtKKBTjz5N3jbqLywWEh1LJiLXi8gzIrLNOPY6EblHRJ7Q33OM3y4XkR0i8riIvLesgjvKo+V5rHnta2HrVti61TeXvOwy/wO+uWrV7N4Nu3fzrB4ZXNpqcWkaATAwkG2u3NGZoCGP681naYTN3n/emBIzZjTXNHqffdJ9aiDNE7gBuAb4knHsMuC7SqkrReQyvf9JEXkrcCbwNuCNwHdE5GCllOvOWcrVutE1vY3+I7r3sGQJELFa/eabKymbyfqFCwH4CBnNbw2ltqMAbOyFNx3Lp5s6lkwp9QMgHIL0VOBGvX0jcJpx/Gal1JhS6hfADuCoYorqKIMLx8a4UC+MCxhstZJXQJfdW/voR9t2h/QK4d8Dr08o1zrPg2uu8T3+BoptR3nkUaIGSum813WbThEUmXfDRxJRzFNK7QJQSu0SkTfo4wuB+43zhvUxh63Y2DP8/OcBf3U1+D2ZJKFlLvQbuvBC9tH6iv8K/FwfPy9YINbU6QgbqaPuVK2UTqKovLNYN9VA0SWLWhESufpDRM4HzgfYf//9M2XyuOc5h30l8hXP40MdGuWJKZ/jjoNNmwovg9nwJ00vPed5/E+9HXY/AXC/kc5VM2dykas3dmBxo1gLFk83dfuk9ojIAj2KWAA8o48PA/sZ5y0Cfh2VgFJqI7ARfLccWTJ3AqJckgQEhBrtogTE6Cjr9ErusPO5MGa8hcjzDCsX0++TExAlkmatgGl9FCyMcyO75uskYrgTOFtvnw3cYRw/U0T6ReQA4CD8eO2OXqWguf8hw9VHkoAY8jxm6XNizwvmijdv9hXXWnmdNy5DoYyPT4TbBXxnf4HDvyaSZmRgWjClsUTqNN9fly4iirxlabJOQkRuApYBAyIyDAwCVwK3isi5wK+ADwEopbaLyK3AI/jxaC4ow7Lp3zyP3cb+4NiYG77qHv3QCSfwSn3o8vPOgw0b4q+J6/1t2JC+wVqyZDIuQhpT05AtuzmtlGTSap7XcUQQND5L2/2grQr8T9lAX1+7kEt6TtOVJq13yLvi2uKRhPMC24MECl/rp1eWLmXowQeBzqOHgInzAgsoreR2WEDZ/o0sp2svsP39avMb35guj507nRdYR36sFw4Ay5ax5sEHE4XDOi0cXk3EKKNhwkF5HhL6D9fo/7eyCc8rDUULiOkidKaZdVM1NMS//HTgFs+bsEx4I3BGhwYvrdVS23k6VGpujMBGVYdLlUMPnXJsv4jzHAbT6f22eLqpmU8h7MjLJgWWDcyeDcDzv/td6eEoOwkFkyHPm6hwSXGbAwFReGAjI/Jd5eFSt22bcmhKiFNHO9NpJOGEREk44RCN9tU/J/msyjBHBUnCYU0gHI44wrdMcjSHpNgO4dgP5naeBY5FLY5MCmpUlQtvi4WEvSVzNI5wiNPwsU7TS6uPP57Vxx9fjYAYGcmdxJqI/3uN53GN53FF6Leoc3uKqJXQpslrnCfXpEa+UwNd1BqLIpwL5h3xFGQCKyLLtXPVHdqvXtx57xSRloic3inNRo8kghfxct34hPcd1bDJdIthrsbWJAmHtrUL9947uV32VEMBbtCjpqzilNCVT285mkNBimsR8YDPASfhL2x+QETuVEo9EnHePwHfTpNuo4XE5SG7dyccNF/9qv/90Y9OhokskeP0fT8u4rfMpq0B02Eu2mE3VelEitNJHAXsUEr93E9WbsZ3uvpI6Ly/BW4D3pkm0Wa/iRYHxamV009v/66S3bvbQ1rGUJpyugKCsv9X4KQGlr92mqKQzuJmJC/phcSAiJjzsRu1iyPwnak+Zfw2DBxtXiwiC4EPAP+NaSEkAvbu9Vf7On8wtTO0cGH3o4eGcdK++9ZdhGbSBAGRhrgwrt2QXkjsTVhMl8bB6v8BPqmUaolEnT6V3nhagTsIJxxqp1PDb61gGB3lYe0/6k+MMq7xPE4H9AQef2des9t0DuOYttgT4zqNg9WlwM1aQAwA7xORcaXU7XGJ9oaQcDhy8JTncb2x/zVD+f5u4NCxMVbf74dJGTrhhInzhmbOLF3oXeF5Ttc2HShGSDwAHKSdqz6NHyX0r8wTlFIHBNsicgNwV5KAgF4SEqOjE55Ere2tTkOGPI/Bp5/2d+bPt1IXsV+rBZ436RjRKFuglOc4Xy0/2GpNzEU/2N9fetmcgJgGFGTdpJQaF5GV+FZLHnC9drq6Qv/elRfJ3hESbqrJSuKEQdhU9hbPy7R6Oy9mTIqA1A2yfqHvBI6IOSXKFDgtaz0vcdGhowcpaDGdUuqbwDdDxyKFg1LqI2nSbJSQCNZB/FHvn6K/jwy/ULt3c99CP2rqsfq3nnOm1lBO1N/HhZ7DlMhUgTFCSazes4ehefMAX5CFF7+lIUkI5BkpOQExzXBuOYoj6OkNeZ7v9C00ejBfzGNDL5oTDnYQFg4BUxwlv+UtsHWrv71okZFA9+FSr/C8iQ5GGDet46gVi4WEvSULGB319Q06iteECWXG6aWrPG8izoLDPqZMNe3d6wsHU0BArnCpl4+NTWwPvvQSfTSsl9QlV3nelKh8US5UHDURjCSaGpkuDhE5BLjFOPQm4B+A2cB5wLP6+Kf0PFl3GAqdYKQw3EUFb0SMhbr5x38EYM3gYJsbias8z5r7N2Wuf3QUzjzT3za8vAas13VliqemGTOmzbSOLc/OkYDFI4lCItNpXyBP46/uOwcYUUp9Nu31cZHpwr0dmyxiHA1BL7Cswly1SazzvMhwses9j4vdfeqKriPTzZ6tNh9/fLo87rqrsZHpTgSeVEr9Mu0qvjie0oJhq96fCDjjrJcccVymnV1eeeXU35w7+Uji4olnNhVI45oi7NI7qwvupJXNO3f634sXp0vPViweSRRVsjOBm4z9lSLyUxG5XkQiwxqIyPkisllENj/77LMTx/drtdiv1eL9QSWeMQNmzJiwTnJoxseLbQDHx1njeazxPL7V4V7bptt5fN06Hl+3LvrHWbNg1iw3ikjJ2VnvU5ybbZNwB69bF9xR1y1e3HwBYblOIneuIvJK4M+Br+hD1wIHAkuAXcD6qOuUUhuVUkuVUkvnzp0bmfarje2VRYWw7BWGh/1PQQz19/My8DJwcoeGwrY57kO2bOGQLVvqLoZjulJEZ81iIVHEdNPJwE+UUnsAgm8AEbkOuKvbhNuGxG66qZ1ue0+h6YGmO9wzg/ms/u1vnWdgRzaiprCK9O6aBsvXSRRRsrMwpppEZIHx2weAqcF9u+GwwyY23dRTOw95XvrpJ2N6YMjz2Ae/EiQJiPD0UyVR1ja0LxK92vO42vP4Sijvl4FP6Y8TEI7MxEWkqzIqnZlnp08N5MpVRF6NHwXpY8bhz4jIEnwXtTtDv2Vj586JHvPaRx9llT5s9cK4QEkXhMcssuEyejgTPpC2b/clfZoKZKxiDq5PipgWnLMP/nAxYPXQUMaCd8GKFW27F8aUs4mjH4ejDctHErmEhFLq98DrQ8c+nKtEJsZCqsbYtAfTYmX0aiPWjEC7a+tEBgbg5psj0whjTkOtNhahAfD3f58uP4ejaNJMBVUd1KjaeBKVY/eC014JTlI3QTCmnTvhs/7ylSQBEUwnWdVLDxbKnXaa/60bi6v7+2NHGY5pStPajV4eSTjs4Luex0+M/f319xmtFus8j9fo/d3kiDldNeHe2Y4d7b/r35yAmGbYKACqDV9aORbecUcqAvPXgQFOfOklToyx/opbNBXGKgEBU1+8Sy6ppxwORxU4IeEonLDju25Z6q/wH/zylyd9IEFzgtU77KCq+lK1eWoVFBR0qCzsLVlTqaNx3bkTVq70t2+/PXX+Q57H4Pbt/s5b3uJbP4Gv4La40jospKr60ov10ukkphl1VOLFiyfCa2ZhfnBtQIlBfhyOnibvqmuLhYS9JcvCYYdNb0du4+PctmoVt61axZoMcZdfhAnfWA5HLMcc43+SSPP+6dgwAGze7H+Ca0dG/E8nVzPBeeH87r03W1miKNofWhZ63C1HPYyPT67CfuGF3hyGpqWvjw9qZfMHM1yWVqldGLNn+8/K4HmtMJ8TLsuKFVNWXTtq4v77J7fTTqdGnWd2RrQubOK8YF1Rp/VFwe9BYx58L1s2eU6etqDba/Pk6aabSqKvb7In4twxdMUtnjc1IlyZfP7zUw7N2XffKceu8jxGgctNIbF8uf99990lFc6RirjGMHw87WK3vI1ykZ3DrGkVpUR3iutyGPI8luntg4EFocbuPt1DDce6nm6s8bz2FdNGZfxV1YU5/fSpx0IjC/C9zE4Jr+mEQ++Qp0G0ybqpyDK4kUTB7NzJcuDoBAHwhupK045lpqNvhYlV1mzaBHelcMprwX8Y/P73a83fUTKBbiKsDxsZyT8zYEH9zYwTEvlZ73kTcYpfA7yrw/n/rr9Xl1ekRvDBsbHJFyaI4gUwOso7Quc+rHvvLwOH1z0C68Jay9Eg4owlOhlRpGn8myYgLNdJ2FuyEGbc3YtaLY5M2YiF3VrfV7Kb6+v6+/me501acuzeXWp+HTFfmFAMihND9/BPtm/nT7Zvr19AOOxi6VJYupQ/FPnu1GlJZCPOuqlLvvMdht773q4ujXOBfew55+QpUUfOa7Vg0yaumzlzct9G9u6dsmp76G1vAwy3HMHIY9Gi5vXOHMWhDUReVWSaaRXgJuFY2b2C5SMJu9/897xnYnOw1fJXBedkzRe/yGrDyma953HxF77g73zkI7nTB2DWLII+0pDnMbh2rb8zMAAf/WgxeeQlwq3HFJ9NTY8d7JjgGs+zOw5LGnpRQARYHEjNOiHxqL5Zt0b9+NhjudMPjzAuLuPFWbKEjz/9NABDCxcytMoPl2SF47wkbLIccRRKoQKi23piXtdNGp1GEjbGmkiD5SOJXCUTkZ0i8rCIbBWRzfrY60TkHhF5Qn/PyZLmoWNjHKpNNgdbLV4DE66uy+ClsiT4/Pkwf/6E227QnlZHR1nneawL8r333vbVonVSY4hER8mcfrpv2WZYt631PNZ2U/+7rSfmdd2kkUap3SlNW+u3xToJUUp1f7HITmCpUmqvcewzwG+UUleKyGXAHKXUJ5PS2U9E/R3aTYSB9T3vlKzXL+II8Erg8mDdgq0V1uFwZEY8b4tSamnW65YuXKg2X3BBujxWreoqjzyUIZpOBW7U2zcCp6UpRNBHGGy1JkYQvcLFrRYXt1rsD/wRGOrvZ6i/H0ZHucXzuMXi+UhH7/Kg5/FgRN27xtXHagmmmywdSeTNVQH/ISJbROR8fWyeUmoXgP6OXNcmIueLyGYR2fw7YBT4a+P3i3pkFGFyTqvFwcb+0MyZnDE2xhnhGNIORwUc0WpxRMR7tnLu3BpKYzlJ5rpFmPL2sJD4U6XUO4CTgQtEpNMatwmUUhuVUkuVUkvf9Pa3c9HTT3NgYGUE/srLHuSsVotZQLCmdGJU4XBYwtCzz8b/GNcgpln30O3aCPO68HZUuaLOzUvS1HBRvpvSfGogV65KqV/r72dE5OvAUcAeEVmglNolIguAZzom9IpX+Ipe0wS1h532BRZV6z2vHOsqhyOKlBZFibrAuGvHx33FclIewbGsFkbmuWm3k/Kw0cKpF62bRGSmiOwbbAN/BmwD7gTO1qedDdyRt5C9ihMQjip5vL+fxyNGrV8J6SBuS6uTMHvpgeVR0RZG3Y4EbBMCSRSokxCR5SLyuIjs0IZD4d//u4j8VH/+U0QO75Rmnjs5D/i6iATp/LtS6m4ReQC4VUTOxXc0+qEceUw7Au+ng2Nj3KJf6DNaLd9M1vSZ73BkYefOibVHgT+zwAz70r/927ZTf5Y2zSoa4jLysFGAFDCSEBEP+BxwEjAMPCAidyqlHjFO+wVwglLqeRE5GdgIHJ2Ubtd3Syn1c2CKFFJKPQec2G2605n1Rg9uqL+fwZdemvzRCQhHHhYvZvXxx7cdigs6dbkb4VZLcYvpjgJ26LYZEbkZ39p0Qkgopf7TOP9+YKrrhRD2ToRVxbZtdZdggovDSu2ZMxmaORPGxycX3zkc3fLmN/sfh32kV1wPBFah+nO+kcpC4Cljf1gfi+Nc4Fsdi9bN/yma57ds4Suex4fq6MEEIVAtIdBT3OR5E8P+K/r7udwcVTgc3RARGdCRkSjFfF4rqmwjib0Ji+kk4ljkamkReTe+kOjok9+KkcScI4+sR0DgLxz6ov7YxFl68d3EAjztVRZwL7ujOzZt8j+OYinCPLUYxfUwsJ+xvwj4dfgkEXk78HngVK0eSC5ahr9RCW0rkIOIaiWystXinJNO4pyTTio9r6yc02pxjp6CAl+pPeR5vptvhyMrxx1nTzCnuPUOSQTR7PLmm4c4gZBHSBRn3fQAcJCIHCAirwTOxLc2NbKS/YGvAR9WSqWyUbBOSJzRavnWPACXXJI/wVDQn2s8j/X6EzB0zz0M3XMPbN2aLs2gogWBhWCyl/bVr+Yvc4jApUdA4FUWqD+okWP6EjT0WRr54H0JO/tLQxFWSTZaNkEhQkIpNQ6sBL4NPArcqpTaLiIrRGSFPu0fgNcD/2o6Zk3C0jtWIPPnt+1GuUzO7EgwqGimV8qSe2jntFoTAuHahQu5Tgu584rUVQSr3Ht4IaOjIsIL1sKCJC7GtXmuufjO3E/KM+o8GxfPmRToKlwp9U3gm6FjG4ztjwKZgtpYfOdKYvNmWLLE385bcaqOv6AF3se3bJlo0L83cybvLkqf44SDIwt9fe0jgziCRjo412y08zTg4fgS3US7s0WA2FCGGKybbiqab4UV0kuXtg9785BmqF3C9BNLlkzML+8wy5HGd04SRd0XR29x2mn+x3S7ETBjRvTxKJcZ5hTT7t2TU6UjI5P1d/PmqfP+wf74+NQpq4DR0ck0svh9C4SXKcCqxnIvsPaKr4I4+Ze/nHpweNj/7jYc6u7dfq8+TTjF0HRX0WSKod2pt9LL4SEd3XP77f53VAOaZTRt1q/gvQg7r+sUMjdu5GAKqk4j4vDoIc1opGws9t3U80IiKpZz7ljZWXrbtliTOBzdEkSzW7LEj9MeNUoYHe1sCppG5zU87OcBUxvzTtNGccfC14X3s+hHysDy8KW9LyS2bvUfsLFoLoijfWiHXvi3PI9j9PYc89yk3k74ZekUl9fhaAqzZ8fX5TRrBUzhENeTD/SF4XMCwnGyoyykguNpG/ak97OqkYUTEjViVjpNJ+EQsC/wU719wvz56cxNwxXOCQhH0YStfkrmuVNPBeD1wXtTdu86jbvxpHNtUUZnwQkJywhWnYanggJdg95+GjgjcIp2773x6e3cOSkMwjqIJlZYh91UbFzw+t/+tv1At4vJyhAuUWmV1TEr610Ogg5Zir0lK5M4PcH8+RPC4L4TT/TjbicJh4Ck6SeLH77DkQpzmihLQxkWCmmCAIUjzAXTSlHXx42kotZX5BVQZXb2nE7CYqIW/GiX3D8FPpY0LZV2+snhKJg7dJyRU196qfrpzG4jypmYjXuUbiGsSI4SIH190aa3cfnnbeDL7uw5IVEv3/A83m80+EEkrpdh0gUItFXWRAGxbBnff/ZZ3q7TmeP87zsq4rueN7m4qSoBsUJ7dNiwIfm8tIQb3LR6vKJ9JtlELwoJEdkP+BIwH7+93aiUulpEPg2cBwTR1D+ll4rXxvtjGvEz3vlOf0P3Rr44c6bv/iKGO7RQGMV30n6/Pn5yQeV0ODpxYh0dkqKEgyOaHp5uGgcuVkr9RMe63iIi9+jfrlJKle/CtUs+NDYGwHf7+/0Qero3kiQg/s3zeLvePvbpp0tfJOdwRDI+7q9+Bjj9dJ4/91xgmoxmo/QCVbvGKYNeVVwrpXYBu/T270TkUZKjINmDfiCvy3DJx4I40+AEhKM++vomV0D39XG3FhJn1Vcin06K3SIUv3mmm2wXJj06kphARBYDRwA/Av4UWCkifwNsxh9tPB9xzfnA+QD7779/+OdSGdLTRvvgFzqOL3oe5wReVvv6JuNMm6ayndi6NXKthsPRNUZDd9aHP1xjQQw6Nb5FNc7dNvZF5F+mhZPFQiJ3yURkFnAb8Aml1IvAtcCBwBL8kcb6qOuUUhuVUkuVUkvnzp2btxipWWs4/FvdYYh+ztjYpAMzs3JkGEkMHXkkLF8Oy5cXF/3uhhuKScfRfG64YXrVhyKiwOXJuwwsd/CXK1cReQW+gPiyUuprAEqpPUqpllLqZeA64Kj8xczPTZ7HTbqRHmy10sWQKKBSDLZacPfdcPfdTER+2LbN/2TgJUPArNdTDA7HFO+/Qd065pi2067wPLjySv/jsA+LhUQe6yYBvgA8qpT6Z+P4Aq2vAPgAkK01LIEhw2wwafSwxvM4RW//Bjjxne/klgceAOCMsbHcQmMi4JHhRyotM41yXzwdlJSOSNZ4HqvnzPF3HnuMtfPmAbBK14kbDz8cgLNDq6Qvd3XGXnrYuulPgQ8DD4vIVn3sU8BZIrIEUMBO4GM58shNoH9IEg5DRi/9CMM/zVf6+yeHWqaA2LQJjjuu3VHgY4/5vy1a1DY9td7zXKPuKIxwPV4V2j/b1bVmYqtCnXzWTZsAifiptDURgT4h/GJEYTb8SVNLaz1v4ia0pdvXx4firtNuPdocBZruxzdv9oMbAf0dS5qdNZ7H6nPOAeC+L36RY13D4OjALZ7XvnDUYQ89PJKonOUpz8syvfRm4KyiXx4tICA6pnZezP907Oc/X3j6abhKC+GLWi2u0dtl/NcyeVyX+5BWy49jEBV7xAb27vW/Bwa41vP4eIc6DaF6v2wZPyuzfI78OCFRDEdmaITSTi91EhDf0OdGrtoOlM9d6BiazkXG/WiacAg4xCy3rQICJoPwAM90ODWy3t97L6tzZD+m34H+hj5n67F8JGFvyXKQNL2Udhoq4P2tVqxbjzbLkuFhGB6eGlO7ZCeAa4oyq3U0glRWeSXxnKtr5dGL1k11EDTw7wJ+YBw/GDjrvPMSfcysySgcUmEuktM90ZPDaVewOnuN5/FXevsZqFxHcZ++t43WjTz2WP6wtj3O6/fsqbsI8TQ9AqTFI4lGCQmzcX93huuyjh6aRHh64cAaynDs00/XkGuxDL3tbfy53j7C5jqybFm6GCdlYEx7WUeTBUSv+m6qmy2ex116u1PD32uCwTaGFra77Gq736Ee3hVaYNtot3+n/k5y1VI7NQiIlyvPcZphuU6isULiyFaLI5NOKNoHflOpIHzqFKFgEurh2SgcwP8PQ27OPZJUkbSrCtMb9t0UDkRUF3njjTshUT03XXcdAGdNMyGxy/NYEDTE8+f7UwQZXYDkIjzs37u3u2mKGmKDuxFnNKmav7zPKhyNrhNB/bB4miYTFgsJe0vWBUOeN9Eb/Jn+TDd+BjAy4n9mz65EQGzxPLbE9cJNATEywhWeNzHlBMS+6EP9ZSxDdHTDDP0pN5MZ6QREUF9sEw55ymO5gz/L7nQ+Tul8Sk+yxfMmenv3AicEgeurGEGMjk7ohhKn/wBmzZo63RQM02sYOTjS8So3wioXp7iuDnOx3btqLEfV/AC46MknATh68eLJH7qseNd4XuICuWHP4wtdpZyeKYbDWpg83t/fvgjO4egFLJ5u6ikhYRKsowhMZYPpkLtJ5/vJat7yFoaeeKL9mCkcctJpBfWiVgsMt+tXFKHwDQm0j4XLoH93AqI7fuR5HO3unb04IVE9YSVkMMroOCXSBB57rK2RXl+QVc6EA8VDD/WnqrQy8ZqZMycER5QFkK0WS45JnICwGGcC6yiCqzyPF2N+K8oV+ZQRllYkrmy12kxbB8fG8pv8OSplnedxqfF813geq4891t/ZtGni+NWex4VOoFSPExLTnM9+1v++5JKuk7jIsOMfbLXgO98pomSTjI/7/qdgYupqnc7v9+FzbbQucSRyaajhj3OAeeHYWHmFCDoaZt3pVI9Mg4aREQiMMgJGRvzv8PE06dmCG0k4MgkHo9IH7rgjRxDveU/uYrXR1zdFr2E2LInecB2N5Dr9TM8znulQfz+vpKQpxLyuM6IEQeBGPa2QsE1AwPS1bhKR5cDVgAd8Xik1bYPr3qJfxlRBX4zKfpGhBxgcG+PRGtcOLKktZ0dZnBdRHytZUNhtb97GUUBRFDSS6NTu6rDTVwPvw58k+IhS6idJaZZyx0XEAz4HnAQMAw+IyJ1KqUfKyM92MkUEu+EGAJ4891z+r3m8r689El7F7OdGENOHblfJpyVLQ9/XN9UVh0nRcUCSBFGZQqoAIZGy3T0ZOEh/jgau1d+xlCWWjwJ2KKV+DiAiNwOnAtNSSJh8xfPiw6ICLPfj790JvEEfGo092eEoAdu8vSY1zEU32kmCICmvsM+yLBSnk0jT7p4KfEkppYD7RWS2iCxQSu2KS7QsIbEQeMrYHyYkrUTkfOB8vTsmnlehg6FEBoC9peaQ3mR1oix/V7/zufLvS3pcWaJxZYmmqrL8l24u2rJly7fF89JK5hkistnY36iU2qi3O7a7MecsBCoXEhJxTLXt+H9sI4CIbFZKLY24pnJcWaJxZYnGlSUaV5b0KKWWF5RUx3Y35TltlGV3NQzsZ+wvAn5dUl4Oh8PhSNfuZm6byxISDwAHicgBIvJK4EwmY7o4HA6Ho3jStLt3An8jPscAv03SR0BJ001KqXERWQl8G98U63ql1PaESzYm/FY1rizRuLJE48oSjStLxcS1uyKyQv++AfgmvvnrDnwT2HM6pSu+ktvhcDgcjqnYuxbc4XA4HLXjhITD4XA4YqldSIjIchF5XER2iMhlFee9n4h8T0QeFZHtInKhPv5pEXlaRLbqz/sqKs9OEXlY57lZH3udiNwjIk/o7zkVlOMQ479vFZEXReQTVd0XEbleRJ4RkW3Gsdj7ICKX6/rzuIi8t4KyrBORx0TkpyLydRGZrY8vFpE/GPensADrMeWIfR413JNbjHLsFJGt+nhp90SnH/cO11JfehKlVG0ffOXKk8CbgFcCDwFvrTD/BcA79Pa++CGi3wp8GrikhvuxExgIHfsMcJnevgz4pxqe0W78hUKV3Bf8wILvALZ1ug/6eT0E9AMH6PrklVyWPwP69PY/GWVZbJ5XwT2JfB513JPQ7+uBfyj7nuj0497hWupLL37qHklMLCNXSv0RCJaRV4JSapfSzq2UUr8DHsVffWgTpwI36u0bgdMqzv9E4Eml1C+rylAp9QPgN6HDcffhVOBmpdSYUuoX+FYbR5VZFqXUfyilgoAa9+PbmpdKzD2Jo/J7EiAiAvwlcFNR+XUoS9w7XEt96UXqFhJxS8QrR0QWA0cAP9KHVurphOurmOLRKOA/RGSL+G5LAOYpbcesv98Qe3U5nEn7C1/HfYH4+1B3HfofwLeM/QNE5EER+b6IHF9B/lHPo857cjywRyllxtet5J6E3mFb60vjqFtIZF4iXkohRGYBtwGfUEq9iO8Z8UB8D9m78IfPVfCnSql34HtqvEBE3lVRvpGIvyDnz4Gv6EN13ZckaqtDIrIKGAe+rA/tAvZXSh0B/B3w7yLymhKLEPc86nyvzqK9U1HJPYl4h2NPjTjm1gEkULeQqN19h4i8Ar9yfVkp9TUApdQepVRLKfUycB0VDUeVUr/W388AX9f57hGRBbqsC4BnqiiL5mTgJ0qpPbpctdwXTdx9qKUOicjZwCnAf1d6sltPYTynt7fgz3cfXFYZEp5HXfekD/gL4BajjKXfk6h3GMvqS5OpW0jU6r5Dz59+AXhUKfXPxvEFxmkfAEr3UCsiM0Vk32AbXzm6Df9+nK1POxu4o+yyGLT1Cuu4LwZx9+FO4EwR6ReRA/D95P+4zIKIH9jlk8CfK6V+bxyfK75Pf0TkTbosPy+xHHHPo/J7onkP8JhSatgoY6n3JO4dxqL60njq1pzjLxH/GX4PY1XFeR+HP9T8KbBVf94H/L/Aw/r4ncCCCsryJnyri4eA7cG9AF4PfBd4Qn+/rqJ782rgOeC1xrFK7gu+YNoF/H/4Pb9zk+4DsErXn8eBkysoyw78ee2gzmzQ535QP7uHgJ8A7y+5HLHPo+p7oo/fAKwInVvaPdHpx73DtdSXXvw4txwOh8PhiKXu6SaHw+FwWIwTEg6Hw+GIxQkJh8PhcMTihITD4XA4YnFCwuFwOByxOCHhcDgcjlickHA4HA5HLP8/SaSQfxssJJoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# do we get a familiar-looking residue map?\n", "fig, ax = freq.residue_contacts.plot()" ] }, { "cell_type": "markdown", "id": "minus-delivery", "metadata": {}, "source": [ "The same can be done for a `DaskContactTrajectory`. Here, we use the data from and compare to `contact_trajectory.ipynb`" ] }, { "cell_type": "code", "execution_count": 6, "id": "flying-aquatic", "metadata": {}, "outputs": [], "source": [ "traj_2 = md.load(\"data/gsk3b_example.h5\")\n", "\n", "topology_2 = traj_2.topology\n", "yyg = topology_2.select('resname YYG and element != \"H\"')\n", "protein = topology_2.select('protein and element != \"H\"')" ] }, { "cell_type": "code", "execution_count": 7, "id": "received-switzerland", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 389 ms, sys: 26.8 ms, total: 416 ms\n", "Wall time: 1.23 s\n" ] } ], "source": [ "%%time\n", "dctraj = DaskContactTrajectory(\n", " client=client,\n", " query=yyg,\n", " haystack=protein,\n", " filename=\"data/gsk3b_example.h5\",\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "id": "guilty-taylor", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# did it add up to give us the right number of frames?\n", "len(dctraj)" ] }, { "cell_type": "code", "execution_count": 9, "id": "novel-advance", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# do we get a familiar-looking residue map for rolling averages?\n", "rolling_frequencies = dctraj.rolling_frequency(window_size=30, step=14)\n", "rolling_frequencies\n", "\n", "fig, axs = plt.subplots(3, 2, figsize=(12, 10))\n", "for ax, freq in zip(axs.flatten(), rolling_frequencies):\n", " freq.residue_contacts.plot_axes(ax=ax)\n", " ax.set_xlim(*freq.query_residue_range);" ] }, { "cell_type": "markdown", "id": "banner-project", "metadata": {}, "source": [ "## \"Atom slicing\"\n", "\n", "One of the internal tricks to improve performance is that we take the MDTraj trajectory that has been provided, and shrink it down to only the atoms that are included in the `query` and `haystack`. We refer to this as \"atom slicing\" (following terminology from MDTraj, although for performance reasons we actually implement it internally).\n", "\n", "In most cases, you will want to atom slice. However, there are some cases where atom slicing can slow down your analysis -- mainly if the atoms needed for the contact map are *almost* all the atoms in the trajectory. For this, you can turn atom slicing off." ] }, { "cell_type": "code", "execution_count": 10, "id": "following-satin", "metadata": {}, "outputs": [], "source": [ "from contact_map import ContactFrequency" ] }, { "cell_type": "code", "execution_count": 11, "id": "worst-journalism", "metadata": {}, "outputs": [], "source": [ "# use all the atoms except atom 0\n", "used_atoms = list(range(1, topology.n_atoms))" ] }, { "cell_type": "code", "execution_count": 12, "id": "special-insurance", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 267 ms, sys: 15.6 ms, total: 283 ms\n", "Wall time: 118 ms\n" ] } ], "source": [ "%%time\n", "# with atom slicing\n", "frame_contacts = ContactFrequency(traj[0], query=used_atoms,\n", " haystack=used_atoms)" ] }, { "cell_type": "code", "execution_count": 13, "id": "advised-russian", "metadata": {}, "outputs": [], "source": [ "# disable atom slicing\n", "ContactFrequency._class_use_atom_slice = False" ] }, { "cell_type": "code", "execution_count": 14, "id": "robust-aviation", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 392 ms, sys: 2.21 ms, total: 394 ms\n", "Wall time: 234 ms\n" ] } ], "source": [ "%%time\n", "# without atom slicing\n", "frame_contacts = ContactFrequency(traj[0], query=used_atoms,\n", " haystack=used_atoms)" ] }, { "cell_type": "markdown", "id": "ready-wallpaper", "metadata": {}, "source": [ "Note that this example is the worst case: the overhead for atom slicing occurs only once for an entire trajectory. However, if you're generating many single-frame contact maps, this could be relevant to you." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }