{ "cells": [ { "cell_type": "markdown", "id": "cac07e98", "metadata": {}, "source": [ "# 0-Application walk thourgh\n", "\n", "In this notebook, we introduce the basics of PyLipID via a walk-through application. We keep the details to minimum and invite users to refer to other specific notebooks in which you can find more details, exercise and theory. \n", "\n", "In this tutorial, we show the PyLipID workflow of checking the lipid interactions with a Class A GPCR, Adenosine A2a receptor from coarse-grained simulations with a complex membrane bilayer that contains 7 lipid species. \n", "\n", "\n", "\n", "The simulation ensemble reported in the original paper contained 10 repeats, but here we took 2 of the repeats for demonstration and saved in two directories ``run1`` and ``run2``, both of which contains a simulation trajectory ``protein_lipids.xtc`` and a corresponding topology coordinate ``protein_lipids.gro``. The two simulation trajectories have the same topology but different initial configurations. The trajectories were saved with a 20 ns timestep. The trajectories are available for download [here](https://github.com/wlsong/PyLipID/tree/master/docs/tutorials/traj_data).\n", "\n", "In this tutorial, we will first check cholesterol interactions with receptor residues and then interactions with binding sites. We will also illustrate some of the plotting funtions and ways to save the interaction data in various formats that assist different analysis. \n", "\n", "For those of you who are impatient, PyLipID documentation website has provided a **no-brainer script** that runs all PyLipID analysis in one run. The script can be downloaded [here](https://pylipid.readthedocs.io/en/master/demo.html)." ] }, { "cell_type": "code", "execution_count": 1, "id": "e65b51d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.5.10\n" ] } ], "source": [ "%matplotlib inline\n", "import pylipid\n", "from pylipid.api import LipidInteraction\n", "print(pylipid.__version__) # make sure pylipid version is later than 1.4 " ] }, { "cell_type": "markdown", "id": "9bdddccd", "metadata": {}, "source": [ "## Load data\n", "\n", "We start by initializing the main class `LipidInteraction`. " ] }, { "cell_type": "markdown", "id": "45e77532", "metadata": {}, "source": [ "Trajectories and topology coordinates of the two repeats were saved in the directory ``../../tests/data``. Thus we first create a `trajfile_list` and `topfile_list`. Then, we load the `trajfile_list` and `topfile_list` to `LipidInteraction` together with a couple of calculation settings, including what cutoffs to use, which lipid to check, which lipid atoms are used to define the interactions and what time unit the generated data use etc. You can also specify which directory the generated data should be saved at. But here we will use the default value, i.e. the current working directory. " ] }, { "cell_type": "code", "execution_count": 2, "id": "3c0b65e0", "metadata": {}, "outputs": [], "source": [ "trajfile_list = [\"./traj_data/A2a/run1/protein_lipids.xtc\", \"./traj_data/A2a/run2/protein_lipids.xtc\"]\n", "topfile_list = [\"./traj_data/A2a/run1/protein_lipids.gro\", \"./traj_data/A2a/run2/protein_lipids.gro\"]\n", "lipid = \"CHOL\"\n", "cutoffs = [0.475, 0.8] # use of dual-cutoff\n", "nprot = 1 # num. of protein copies in the system. if the simulation system has N copies of receptors, \n", " # \"nprot=N\" will report interactions averaged from the N copies, but \"nprot=1\"\n", " # will ask pylipid to report interaction data for each copy.\n", "timeunit = 'us' # micro-second\n", "save_dir = None # if None, pylipid data will be saved at current working directory. \n", "\n", "# initialize \n", "li = LipidInteraction(trajfile_list, topfile_list=topfile_list, cutoffs=cutoffs, lipid=lipid, \n", " nprot=nprot, save_dir=save_dir)" ] }, { "cell_type": "markdown", "id": "b6f99654", "metadata": {}, "source": [ "## Interaction with residues\n", "\n", "PyLipID provides functions to calculate the durations, occupancy (percentage of frames in which lipids formed contacts) and lipid count (the average number of surrounding lipids) of lipid interactions with protein residues. In addition, PyLipID can calculate interaction residence time, which is calculated from 1/*koff*. The function `collect_residue_contacts()` is required before any of the calculation of interactions with residues. This function will create a index of contacting lipids for each residue at each frame. " ] }, { "cell_type": "code", "execution_count": 3, "id": "7a37bd86", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "COLLECT INTERACTIONS FROM TRAJECTORIES: 100%|██████████| 2/2 [00:26<00:00, 13.20s/it]\n" ] } ], "source": [ "li.collect_residue_contacts()" ] }, { "cell_type": "markdown", "id": "60efd2ea", "metadata": {}, "source": [ "After this calculation, a pandas.DataFrame is created as an attribute, named `dataset`, of the main class, which is accessible through `li.dataset`. It currently contains only two columns, `Residue` and `Residue ID`, but will be updated each time after a calculation is carried out to the class object `LipidInteraction`, i.e. what `li` refers to here. " ] }, { "cell_type": "code", "execution_count": 4, "id": "4653baed", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Residue Residue ID\n", "0 1ILE 0\n", "1 2MET 1\n", "2 3GLY 2\n", "3 4SER 3\n", "4 5SER 4\n", ".. ... ...\n", "297 298ARG 297\n", "298 299LYS 298\n", "299 300ILE 299\n", "300 301ILE 300\n", "301 302ARG 301\n", "\n", "[302 rows x 2 columns]\n" ] } ], "source": [ "print(li.dataset)" ] }, { "cell_type": "markdown", "id": "173f64cf", "metadata": {}, "source": [ "### Durations, occupancy and lipid count\n", "\n", "After `collect_residue_contacts()`, we can calculate the lipid interactions in a couple of metrics, using different functions. Each function has a parameter of `residue_id` which allows for calculation of specified residues via residue ID. Calculation will run for all residues if `residue_id` is set to the default value of `None`. Let's check the interaction durations for all residues:" ] }, { "cell_type": "code", "execution_count": 5, "id": "b4846a49", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "CALCULATE DURATION PER RESIDUE: 100%|██████████| 302/302 [00:00<00:00, 306.00it/s]\n" ] } ], "source": [ "durations = li.compute_residue_duration()" ] }, { "cell_type": "markdown", "id": "6e5408d4", "metadata": {}, "source": [ "The returned `durations` is a list with a length of the number of residues. The n-th list is the durations of lipid interactions with the n-th residue from the trajectories. For example, let's check the durations of the first residue. It shows a list of two list, corresponding to durations from the two trajectories. " ] }, { "cell_type": "code", "execution_count": 6, "id": "be1cc438", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "302 2\n", "302 2\n", "[[0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.04, 0.04, 0.04, 0.06, 0.06, 0.08, 0.1, 0.12, 0.16], [0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.04, 0.04, 0.04, 0.04, 0.06, 0.1, 0.1, 0.12, 0.12]]\n" ] } ], "source": [ "print(len(li.residue_list), len(li.trajfile_list))\n", "print(len(durations), len(durations[0]))\n", "print(durations[0])" ] }, { "cell_type": "markdown", "id": "9300d73e", "metadata": {}, "source": [ "Alternatively, if we are only interested in checking the interactions with first residue, we can just do the calculation for this residue:" ] }, { "cell_type": "code", "execution_count": 7, "id": "996ebfa4", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "CALCULATE DURATION PER RESIDUE: 100%|██████████| 1/1 [00:00<00:00, 198.17it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[[0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.04, 0.04, 0.04, 0.06, 0.06, 0.08, 0.1, 0.12, 0.16], [0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.04, 0.04, 0.04, 0.04, 0.06, 0.1, 0.1, 0.12, 0.12]]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "durations_of_first_residue = li.compute_residue_duration(residue_id=0)\n", "print(durations_of_first_residue)" ] }, { "cell_type": "markdown", "id": "49037fe6", "metadata": {}, "source": [ "Similary, we can check the occupancy and lipid count as follow, the returned data has the same structure as `compute_residue_duration()`" ] }, { "cell_type": "code", "execution_count": 8, "id": "b610999a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "CALCULATE OCCUPANCY: 100%|██████████| 302/302 [00:00<00:00, 13443.71it/s]\n", "CALCULATE RESIDUE LIPIDCOUNT: 100%|██████████| 302/302 [00:00<00:00, 10329.96it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "302 2\n", "302 2\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "occupancies = li.compute_residue_occupancy()\n", "lipidcounts = li.compute_residue_lipidcount()\n", "print(len(occupancies), len(occupancies[0]))\n", "print(len(lipidcounts), len(lipidcounts[0]))" ] }, { "cell_type": "markdown", "id": "ed3d9098", "metadata": {}, "source": [ "After each of the above calculation, the pandas.DataFrame that is stored as `dataset` of the main class, is updated to include the average values for each residue. We can have a look at the `dataset` by using `head()` to see the columns have expanded to include \"Duration\", \"Occupancy\", \"Lipid Count\":" ] }, { "cell_type": "code", "execution_count": 9, "id": "a7a635e8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count std
01ILE00.0481080.0373338.3665341.1952191.0000000.000000
12MET10.0350000.0165831.7928290.9960161.0000000.000000
23GLY20.0200000.0200000.1992030.1992030.5000000.500000
34SER30.0000000.0000000.0000000.0000000.0000000.000000
45SER40.0800000.1782327.5697213.1872511.0000000.000000
56VAL50.0723400.06848612.7490040.0000001.0156250.015625
67TYR60.0992590.14966431.2749005.7768921.0215050.021505
78ILE70.1873680.2361286.3745021.9920321.0000000.000000
89THR80.0740850.10418821.3147413.7848611.0386000.006854
910VAL90.1052460.14674219.5219120.3984061.0512500.011250
\n", "
" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "0 1ILE 0 0.048108 0.037333 8.366534 1.195219 \n", "1 2MET 1 0.035000 0.016583 1.792829 0.996016 \n", "2 3GLY 2 0.020000 0.020000 0.199203 0.199203 \n", "3 4SER 3 0.000000 0.000000 0.000000 0.000000 \n", "4 5SER 4 0.080000 0.178232 7.569721 3.187251 \n", "5 6VAL 5 0.072340 0.068486 12.749004 0.000000 \n", "6 7TYR 6 0.099259 0.149664 31.274900 5.776892 \n", "7 8ILE 7 0.187368 0.236128 6.374502 1.992032 \n", "8 9THR 8 0.074085 0.104188 21.314741 3.784861 \n", "9 10VAL 9 0.105246 0.146742 19.521912 0.398406 \n", "\n", " Lipid Count Lipid Count std \n", "0 1.000000 0.000000 \n", "1 1.000000 0.000000 \n", "2 0.500000 0.500000 \n", "3 0.000000 0.000000 \n", "4 1.000000 0.000000 \n", "5 1.015625 0.015625 \n", "6 1.021505 0.021505 \n", "7 1.000000 0.000000 \n", "8 1.038600 0.006854 \n", "9 1.051250 0.011250 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "li.dataset.head(10) # show 10 lines" ] }, { "cell_type": "code", "execution_count": 10, "id": "78dca4ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.048108\n", "1 0.035000\n", "2 0.020000\n", "3 0.000000\n", "4 0.080000\n", " ... \n", "297 0.063750\n", "298 0.010000\n", "299 0.111765\n", "300 0.086809\n", "301 0.041538\n", "Name: Duration, Length: 302, dtype: float64\n" ] } ], "source": [ "print(li.dataset[\"Duration\"])" ] }, { "cell_type": "markdown", "id": "3ce38623", "metadata": {}, "source": [ "### Residence time and *koff*\n", " \n", "\n", "Residence time provides useful insights into the dynamical behavior of the bound lipids, which due to their interaction with the protein, is no longer diffusive. Indeed, we often see both prolonged interactions and quick diffusive contacts of lipids at the protein surface. PyLipID therefore uses bi-exponentials for residence time calculation to account for the long and short decays of lipid relaxation. Residence time is calculated as 1 over *koff*, which is calculated from a normalized survival function using the durations. `plot_data` parameter allows for plotting of the *koff* data, which provides a more visually straight-forward way to check lipid interactions and understand the data." ] }, { "cell_type": "code", "execution_count": 11, "id": "3d7574a2", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f6737d7a10c94cce8a22e578fa1ad8fe", "version_major": 2, "version_minor": 0 }, "text/plain": [ "CALCULATE KOFF FOR RESIDUES: 0%| | 0/302 [00:00\n", "\n", "The left panel plots the interactions durations in the sorted order and the right panel plots the normalised survival rates of these interactions (the purple doted line) and the bi-exponential curve fitted to the survival rates (red broken line). To check the sampling quality, the interaction durations are bootstrapped and the fitted curve of the bootstraped interaction durations are plotted in gray lines. Insufficient sampling of interactions would give large deviation to the bootstrapped koffs. " ] }, { "cell_type": "markdown", "id": "eaabc888", "metadata": {}, "source": [ "Again, the `dataset` is updated to include information calculated from koff calculation. Added columns include the average value of each residue of \"Residence Time\", \"Koff\", \"R Squared\", \"Residence Time Bootstrap avg\", and \"R Sqaured Bootstrap\". \"R Sqaured\" is the r_sqaured values of the curve fitting to the normarlised survival function. It indicates the quality of the curve fitting, hence indicates the reliability of the calculated koff and residence time. \"Residence Time Bootstrap avg\" and \"R Squared Bootstrap avg\" are the averaged residence time and r_squared from bootstrapping respectively. " ] }, { "cell_type": "code", "execution_count": 12, "id": "c00d2f34", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count stdKoffResidence TimeR SquaredKoff Bootstrap avgR Squared Bootstrap avg
01ILE00.0481080.0373338.3665341.1952191.0000000.00000011.8042240.0847150.99883717.1886630.998392
12MET10.0350000.0165831.7928290.9960161.0000000.00000030.3458550.0329530.99782332.2016590.996950
23GLY20.0200000.0200000.1992030.1992030.5000000.50000029.8729110.0334750.97595026.885620NaN
34SER30.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
45SER40.0800000.1782327.5697213.1872511.0000000.0000001.7901960.5585980.9603677.7939170.975108
56VAL50.0723400.06848612.7490040.0000001.0156250.01562513.0328160.0767290.99930710.9555950.998862
67TYR60.0992590.14966431.2749005.7768921.0215050.0215054.3137930.2318150.9965244.9226360.994342
78ILE70.1873680.2361286.3745021.9920321.0000000.0000002.3355810.4281590.9926782.6044140.993542
89THR80.0740850.10418821.3147413.7848611.0386000.00685411.2454710.0889250.9242586.2440230.992139
910VAL90.1052460.14674219.5219120.3984061.0512500.0112504.4543390.2245000.9974263.8987760.995095
\n", "
" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "0 1ILE 0 0.048108 0.037333 8.366534 1.195219 \n", "1 2MET 1 0.035000 0.016583 1.792829 0.996016 \n", "2 3GLY 2 0.020000 0.020000 0.199203 0.199203 \n", "3 4SER 3 0.000000 0.000000 0.000000 0.000000 \n", "4 5SER 4 0.080000 0.178232 7.569721 3.187251 \n", "5 6VAL 5 0.072340 0.068486 12.749004 0.000000 \n", "6 7TYR 6 0.099259 0.149664 31.274900 5.776892 \n", "7 8ILE 7 0.187368 0.236128 6.374502 1.992032 \n", "8 9THR 8 0.074085 0.104188 21.314741 3.784861 \n", "9 10VAL 9 0.105246 0.146742 19.521912 0.398406 \n", "\n", " Lipid Count Lipid Count std Koff Residence Time R Squared \\\n", "0 1.000000 0.000000 11.804224 0.084715 0.998837 \n", "1 1.000000 0.000000 30.345855 0.032953 0.997823 \n", "2 0.500000 0.500000 29.872911 0.033475 0.975950 \n", "3 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "4 1.000000 0.000000 1.790196 0.558598 0.960367 \n", "5 1.015625 0.015625 13.032816 0.076729 0.999307 \n", "6 1.021505 0.021505 4.313793 0.231815 0.996524 \n", "7 1.000000 0.000000 2.335581 0.428159 0.992678 \n", "8 1.038600 0.006854 11.245471 0.088925 0.924258 \n", "9 1.051250 0.011250 4.454339 0.224500 0.997426 \n", "\n", " Koff Bootstrap avg R Squared Bootstrap avg \n", "0 17.188663 0.998392 \n", "1 32.201659 0.996950 \n", "2 26.885620 NaN \n", "3 0.000000 0.000000 \n", "4 7.793917 0.975108 \n", "5 10.955595 0.998862 \n", "6 4.922636 0.994342 \n", "7 2.604414 0.993542 \n", "8 6.244023 0.992139 \n", "9 3.898776 0.995095 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "li.dataset.head(10)" ] }, { "cell_type": "markdown", "id": "43b159cb", "metadata": {}, "source": [ "## Interaction with binding sites\n", "\n", "Before calculation of interactions with binding sites, we need to calculate where the binding sites are. PyLipID calculates the lipid interaction correlations between the protein residues and finds clusters of residues that bind to the same lipid molecule at the same time. This is carried out by computing the community structures of the interaction network of the protein residues. " ] }, { "cell_type": "code", "execution_count": 13, "id": "4d386929", "metadata": {}, "outputs": [], "source": [ "node_list, modularity = li.compute_binding_nodes(threshold=4, print_data=False)\n", "\n", "# threshold=4 decides that binding sites should contain at least 4 residues. This is particularly \n", "# helpful when itneraction samplings are not sufficient, in which case false positively correlation \n", "# is likely to happen among 2 or 3 residues. \n", "# \n", "# print_data=True will print the residues for each binding site. It can be quite verbose. " ] }, { "cell_type": "markdown", "id": "09e17dc6", "metadata": {}, "source": [ "This function returned two data, first is the `node_list` which is a list of binding site lists. Each binding site list contains the IDs of residues in that binding site. Modularity is the network modularity, which is taken from the Louvain's method of calculating network community structures. Modularity is an indication of the quality of community structures, i.e. binding sites in our cases. The value of `modularity` is between 1 and -1. The closer to 1, the more distinctive the community structures, hence the more trust-worthy the calculated binding sites. Modularity is dependent on the quality of interaction network, which is ultimately dependent on such factors as the sampling of lipid interactions and choice of interaction cutoffs. " ] }, { "cell_type": "code", "execution_count": 14, "id": "9559058c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0, 1, 2, 4, 5, 8, 64], [6, 9, 10, 12, 13, 265, 268, 272, 279], [7, 11, 14, 15, 18, 53, 54, 57, 58, 61, 298], [16, 20, 282, 286, 293, 296, 297, 300], [19, 22, 23, 26, 30, 299, 301], [25, 28, 29, 40, 43, 44, 47, 48, 50, 51, 55, 80, 119, 122, 123, 126], [41, 90, 93, 94, 97, 98, 101, 112, 113, 121, 125, 128, 181, 182, 186], [59, 62, 67, 73, 77], [72, 76, 127, 130, 131, 132, 134, 135, 137, 138, 140, 173, 177], [100, 104, 105, 185, 189, 192, 193], [116, 117, 120, 124], [176, 179, 180, 183, 184, 187, 188, 239, 240, 243, 244, 251, 255, 256], [191, 194, 198, 230, 233, 236, 237], [195, 196, 199, 202, 203], [227, 231, 234, 235, 238, 242, 273, 276, 280, 283, 284, 287, 288], [241, 245, 248, 249, 252, 259, 262, 263, 266, 267, 269, 270]]\n", "\n", "0.8311593806596966\n" ] } ], "source": [ "print(node_list)\n", "print()\n", "print(modularity)" ] }, { "cell_type": "markdown", "id": "6fcb0d70", "metadata": {}, "source": [ "Afer this calculation, the `dataset` had a new column `Binding Site ID`, which gives the residues belonging to the same binding site a binding site ID, whereas labels residues that do not belong to any binding site as '-1'. This binding site ID will be an invariable and be accessed through all the binding site calculation. " ] }, { "cell_type": "code", "execution_count": 15, "id": "9e53ba27", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count stdKoffResidence TimeR SquaredKoff Bootstrap avgR Squared Bootstrap avgBinding Site ID
01ILE00.0481080.0373338.3665341.1952191.0000000.00000011.8042240.0847150.99883717.1886630.9983920
12MET10.0350000.0165831.7928290.9960161.0000000.00000030.3458550.0329530.99782332.2016590.9969500
23GLY20.0200000.0200000.1992030.1992030.5000000.50000029.8729110.0334750.97595026.885620NaN0
34SER30.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000-1
45SER40.0800000.1782327.5697213.1872511.0000000.0000001.7901960.5585980.9603677.7939170.9751080
56VAL50.0723400.06848612.7490040.0000001.0156250.01562513.0328160.0767290.99930710.9555950.9988620
67TYR60.0992590.14966431.2749005.7768921.0215050.0215054.3137930.2318150.9965244.9226360.9943421
78ILE70.1873680.2361286.3745021.9920321.0000000.0000002.3355810.4281590.9926782.6044140.9935422
89THR80.0740850.10418821.3147413.7848611.0386000.00685411.2454710.0889250.9242586.2440230.9921390
910VAL90.1052460.14674219.5219120.3984061.0512500.0112504.4543390.2245000.9974263.8987760.9950951
\n", "
" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "0 1ILE 0 0.048108 0.037333 8.366534 1.195219 \n", "1 2MET 1 0.035000 0.016583 1.792829 0.996016 \n", "2 3GLY 2 0.020000 0.020000 0.199203 0.199203 \n", "3 4SER 3 0.000000 0.000000 0.000000 0.000000 \n", "4 5SER 4 0.080000 0.178232 7.569721 3.187251 \n", "5 6VAL 5 0.072340 0.068486 12.749004 0.000000 \n", "6 7TYR 6 0.099259 0.149664 31.274900 5.776892 \n", "7 8ILE 7 0.187368 0.236128 6.374502 1.992032 \n", "8 9THR 8 0.074085 0.104188 21.314741 3.784861 \n", "9 10VAL 9 0.105246 0.146742 19.521912 0.398406 \n", "\n", " Lipid Count Lipid Count std Koff Residence Time R Squared \\\n", "0 1.000000 0.000000 11.804224 0.084715 0.998837 \n", "1 1.000000 0.000000 30.345855 0.032953 0.997823 \n", "2 0.500000 0.500000 29.872911 0.033475 0.975950 \n", "3 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "4 1.000000 0.000000 1.790196 0.558598 0.960367 \n", "5 1.015625 0.015625 13.032816 0.076729 0.999307 \n", "6 1.021505 0.021505 4.313793 0.231815 0.996524 \n", "7 1.000000 0.000000 2.335581 0.428159 0.992678 \n", "8 1.038600 0.006854 11.245471 0.088925 0.924258 \n", "9 1.051250 0.011250 4.454339 0.224500 0.997426 \n", "\n", " Koff Bootstrap avg R Squared Bootstrap avg Binding Site ID \n", "0 17.188663 0.998392 0 \n", "1 32.201659 0.996950 0 \n", "2 26.885620 NaN 0 \n", "3 0.000000 0.000000 -1 \n", "4 7.793917 0.975108 0 \n", "5 10.955595 0.998862 0 \n", "6 4.922636 0.994342 1 \n", "7 2.604414 0.993542 2 \n", "8 6.244023 0.992139 0 \n", "9 3.898776 0.995095 1 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "li.dataset.head(10)" ] }, { "cell_type": "markdown", "id": "5c81ec15", "metadata": {}, "source": [ "Therefore, to check residues of a binding site and look at their interaction properties, we can use this `Binding Site ID`:" ] }, { "cell_type": "code", "execution_count": 16, "id": "54821bb7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count stdKoffResidence TimeR SquaredKoff Bootstrap avgR Squared Bootstrap avgBinding Site ID
01ILE00.0481080.0373338.3665341.1952191.0000000.00000011.8042240.0847150.99883717.1886630.9983920
12MET10.0350000.0165831.7928290.9960161.0000000.00000030.3458550.0329530.99782332.2016590.9969500
23GLY20.0200000.0200000.1992030.1992030.5000000.50000029.8729110.0334750.97595026.885620NaN0
45SER40.0800000.1782327.5697213.1872511.0000000.0000001.7901960.5585980.9603677.7939170.9751080
56VAL50.0723400.06848612.7490040.0000001.0156250.01562513.0328160.0767290.99930710.9555950.9988620
89THR80.0740850.10418821.3147413.7848611.0386000.00685411.2454710.0889250.9242586.2440230.9921390
6465SER640.1800000.1800000.1992030.1992030.5000000.5000003.4545930.2894700.9739152.418215NaN0
\n", "
" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "0 1ILE 0 0.048108 0.037333 8.366534 1.195219 \n", "1 2MET 1 0.035000 0.016583 1.792829 0.996016 \n", "2 3GLY 2 0.020000 0.020000 0.199203 0.199203 \n", "4 5SER 4 0.080000 0.178232 7.569721 3.187251 \n", "5 6VAL 5 0.072340 0.068486 12.749004 0.000000 \n", "8 9THR 8 0.074085 0.104188 21.314741 3.784861 \n", "64 65SER 64 0.180000 0.180000 0.199203 0.199203 \n", "\n", " Lipid Count Lipid Count std Koff Residence Time R Squared \\\n", "0 1.000000 0.000000 11.804224 0.084715 0.998837 \n", "1 1.000000 0.000000 30.345855 0.032953 0.997823 \n", "2 0.500000 0.500000 29.872911 0.033475 0.975950 \n", "4 1.000000 0.000000 1.790196 0.558598 0.960367 \n", "5 1.015625 0.015625 13.032816 0.076729 0.999307 \n", "8 1.038600 0.006854 11.245471 0.088925 0.924258 \n", "64 0.500000 0.500000 3.454593 0.289470 0.973915 \n", "\n", " Koff Bootstrap avg R Squared Bootstrap avg Binding Site ID \n", "0 17.188663 0.998392 0 \n", "1 32.201659 0.996950 0 \n", "2 26.885620 NaN 0 \n", "4 7.793917 0.975108 0 \n", "5 10.955595 0.998862 0 \n", "8 6.244023 0.992139 0 \n", "64 2.418215 NaN 0 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask = (li.dataset[\"Binding Site ID\"] == 0) # check binding site NO. 0\n", "li.dataset[mask]" ] }, { "cell_type": "markdown", "id": "167138d9", "metadata": {}, "source": [ "### Durations, occupancy and lipid count\n", "\n", "Similar to interaction with residues, interactions with binding sites can also be checked in a couple of metrics. The same syntax is used." ] }, { "cell_type": "code", "execution_count": 17, "id": "f499aa2b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "CALCULATE DURATION PER BINDING SITE: 100%|██████████| 16/16 [00:00<00:00, 49.09it/s]\n", "CALCULATE OCCUPANCY PER BINDING SITE: 100%|██████████| 16/16 [00:00<00:00, 134.74it/s]\n", "CALCULATE LIPIDCOUNT PER BINDING SITE: 100%|██████████| 16/16 [00:00<00:00, 132.91it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "16 2\n", "16 2\n", "16 2\n", "16 2\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "durations = li.compute_site_duration()\n", "occupancies = li.compute_site_occupancy()\n", "lipidcounts = li.compute_site_lipidcount()\n", "print(len(node_list), len(li.trajfile_list))\n", "print(len(durations), len(durations[0]))\n", "print(len(occupancies), len(occupancies[0]))\n", "print(len(lipidcounts), len(lipidcounts[0]))" ] }, { "cell_type": "markdown", "id": "8be2f322", "metadata": {}, "source": [ "Similar to the calculation for residues, the returned list contains calculated values for each binding site from the two trajectories. " ] }, { "cell_type": "markdown", "id": "57cb9fa9", "metadata": {}, "source": [ "### Residence Time and *koff*\n", " \n", "Similar to that for residue, residence time and *koff* can be calculated for binding sites, via the function `compute_site_koff`" ] }, { "cell_type": "code", "execution_count": 18, "id": "7a847a4a", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "59ddbb34acad4e00a771ba3031179a3f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "CALCULATE KOFF FOR BINDING SITES: 0%| | 0/16 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count stdKoffResidence Time...R Squared Bootstrap avgBinding Site IDBinding Site DurationBinding Site OccupancyBinding Site Lipid CountBinding Site KoffBinding Site Koff Bootstrap avgBinding Site Residence TimeBinding Site R SquaredBinding Site R Squared Bootstrap avg
78ILE70.1873680.2361286.3745021.9920321.0000000.0000002.3355810.428159...0.99354220.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
1112LEU110.2577780.35137123.3067731.7928291.0595240.0039682.2954370.435647...0.99576820.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
1415ALA140.2233330.1823611.1952190.0000001.0000000.0000003.2464530.308028...0.98584120.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
1516VAL150.1286210.18293119.9203191.5936251.0402580.0032211.2111260.825678...0.99745720.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
1819ILE180.1721050.17214112.3505981.9920321.0384620.0384623.8093140.262514...0.99699820.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
5354GLY530.2000000.1618640.7968130.7968130.5000000.5000003.7233460.268576...0.98496920.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
5455VAL540.1844440.23513222.3107571.9920321.0261970.0065902.6496270.377412...0.99703420.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
5758ILE570.3831580.32967424.3027891.9920321.0089290.0089291.3161200.759809...0.99566820.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
5859PRO580.2964290.30199616.9322712.5896411.0379820.0175742.0936270.477640...0.99483120.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
6162ILE610.2129410.2696356.7729081.9920321.0000000.0000002.0676400.483643...0.99176320.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
298299LYS2980.0100000.0100000.1992030.1992030.5000000.5000000.0000000.000000...NaN20.16019673.9043821.260792.3586241.4921730.4239760.9983540.995259
\n", "

11 rows × 22 columns

\n", "" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "7 8ILE 7 0.187368 0.236128 6.374502 1.992032 \n", "11 12LEU 11 0.257778 0.351371 23.306773 1.792829 \n", "14 15ALA 14 0.223333 0.182361 1.195219 0.000000 \n", "15 16VAL 15 0.128621 0.182931 19.920319 1.593625 \n", "18 19ILE 18 0.172105 0.172141 12.350598 1.992032 \n", "53 54GLY 53 0.200000 0.161864 0.796813 0.796813 \n", "54 55VAL 54 0.184444 0.235132 22.310757 1.992032 \n", "57 58ILE 57 0.383158 0.329674 24.302789 1.992032 \n", "58 59PRO 58 0.296429 0.301996 16.932271 2.589641 \n", "61 62ILE 61 0.212941 0.269635 6.772908 1.992032 \n", "298 299LYS 298 0.010000 0.010000 0.199203 0.199203 \n", "\n", " Lipid Count Lipid Count std Koff Residence Time ... \\\n", "7 1.000000 0.000000 2.335581 0.428159 ... \n", "11 1.059524 0.003968 2.295437 0.435647 ... \n", "14 1.000000 0.000000 3.246453 0.308028 ... \n", "15 1.040258 0.003221 1.211126 0.825678 ... \n", "18 1.038462 0.038462 3.809314 0.262514 ... \n", "53 0.500000 0.500000 3.723346 0.268576 ... \n", "54 1.026197 0.006590 2.649627 0.377412 ... \n", "57 1.008929 0.008929 1.316120 0.759809 ... \n", "58 1.037982 0.017574 2.093627 0.477640 ... \n", "61 1.000000 0.000000 2.067640 0.483643 ... \n", "298 0.500000 0.500000 0.000000 0.000000 ... \n", "\n", " R Squared Bootstrap avg Binding Site ID Binding Site Duration \\\n", "7 0.993542 2 0.160196 \n", "11 0.995768 2 0.160196 \n", "14 0.985841 2 0.160196 \n", "15 0.997457 2 0.160196 \n", "18 0.996998 2 0.160196 \n", "53 0.984969 2 0.160196 \n", "54 0.997034 2 0.160196 \n", "57 0.995668 2 0.160196 \n", "58 0.994831 2 0.160196 \n", "61 0.991763 2 0.160196 \n", "298 NaN 2 0.160196 \n", "\n", " Binding Site Occupancy Binding Site Lipid Count Binding Site Koff \\\n", "7 73.904382 1.26079 2.358624 \n", "11 73.904382 1.26079 2.358624 \n", "14 73.904382 1.26079 2.358624 \n", "15 73.904382 1.26079 2.358624 \n", "18 73.904382 1.26079 2.358624 \n", "53 73.904382 1.26079 2.358624 \n", "54 73.904382 1.26079 2.358624 \n", "57 73.904382 1.26079 2.358624 \n", "58 73.904382 1.26079 2.358624 \n", "61 73.904382 1.26079 2.358624 \n", "298 73.904382 1.26079 2.358624 \n", "\n", " Binding Site Koff Bootstrap avg Binding Site Residence Time \\\n", "7 1.492173 0.423976 \n", "11 1.492173 0.423976 \n", "14 1.492173 0.423976 \n", "15 1.492173 0.423976 \n", "18 1.492173 0.423976 \n", "53 1.492173 0.423976 \n", "54 1.492173 0.423976 \n", "57 1.492173 0.423976 \n", "58 1.492173 0.423976 \n", "61 1.492173 0.423976 \n", "298 1.492173 0.423976 \n", "\n", " Binding Site R Squared Binding Site R Squared Bootstrap avg \n", "7 0.998354 0.995259 \n", "11 0.998354 0.995259 \n", "14 0.998354 0.995259 \n", "15 0.998354 0.995259 \n", "18 0.998354 0.995259 \n", "53 0.998354 0.995259 \n", "54 0.998354 0.995259 \n", "57 0.998354 0.995259 \n", "58 0.998354 0.995259 \n", "61 0.998354 0.995259 \n", "298 0.998354 0.995259 \n", "\n", "[11 rows x 22 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "li.dataset[li.dataset[\"Binding Site ID\"] == 2]" ] }, { "cell_type": "markdown", "id": "8954ed24", "metadata": {}, "source": [ "`LipidInteraction` also provides a assisting function `binding_site` to show binding site information and show some stats and returns the pandas.DataFrame containing residues of the specified binding site." ] }, { "cell_type": "code", "execution_count": 20, "id": "54c462ce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Binding site 3\n", " Binding Site Residence Time: 0.402 us \n", " Binding Site Koff: 2.490 R squared: 0.9984\n", " Binding Site Duration: 0.084 us \n", " Binding Site Occupancy: 36.056 %\n", " Binding Site Lipid Count: 1.087\n", " Pos. Charge: 2/8 \n", " Neg. Charge: 0/8 \n", " Polar: 0/8 \n", " Hydrophobic: 4/8 \n", " Special: 2/8 \n", " Residue Res ID Res. Time (us) Duration (us) Occupancy (%) Lipid Count Koff R Squared \n", " 297PHE 296 0.322 0.098 17.131 1.008 3.108 0.998 \n", " 301ILE 300 0.108 0.087 13.745 1.000 9.263 0.999 \n", " 21GLY 20 0.103 0.077 3.984 1.000 9.719 0.990 \n", " 298ARG 297 0.095 0.064 3.386 1.000 10.535 0.997 \n", " 17LEU 16 0.052 0.057 13.147 1.014 19.296 0.999 \n", " 287ALA 286 0.047 0.030 0.797 0.500 21.240 0.993 \n", " 294ARG 293 0.033 0.025 0.598 0.500 30.652 0.996 \n", " 283PRO 282 0.030 0.032 0.996 1.000 32.883 0.994 \n", "\n", "\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ResidueResidue IDDurationDuration stdOccupancyOccupancy stdLipid CountLipid Count stdKoffResidence Time...R Squared Bootstrap avgBinding Site IDBinding Site DurationBinding Site OccupancyBinding Site Lipid CountBinding Site KoffBinding Site Koff Bootstrap avgBinding Site Residence TimeBinding Site R SquaredBinding Site R Squared Bootstrap avg
282283PRO2820.0320000.0240000.9960160.5976101.0000000.00000032.8829280.030411...0.69358730.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
293294ARG2930.0250000.0217940.5976100.5976100.5000000.50000030.6524870.032624...0.79479530.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
286287ALA2860.0300000.0300000.7968130.7968130.5000000.50000021.2404040.047080...0.49271730.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
1617LEU160.0569230.04794013.1474100.7968131.0142860.01428619.2955430.051825...0.99926630.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
297298ARG2970.0637500.0609173.3864540.1992031.0000000.00000010.5351370.094920...0.99444030.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
2021GLY200.0771430.0903513.9840640.7968131.0000000.0000009.7191080.102890...0.99134030.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
300301ILE3000.0868090.07101413.7450202.5896411.0000000.0000009.2626590.107960...0.99814030.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
296297PHE2960.0980950.09969617.1314746.7729081.0083330.0083333.1079370.321757...0.99709230.0842736.0557771.0867642.4898366.145960.4016330.9984240.998174
\n", "

8 rows × 22 columns

\n", "
" ], "text/plain": [ " Residue Residue ID Duration Duration std Occupancy Occupancy std \\\n", "282 283PRO 282 0.032000 0.024000 0.996016 0.597610 \n", "293 294ARG 293 0.025000 0.021794 0.597610 0.597610 \n", "286 287ALA 286 0.030000 0.030000 0.796813 0.796813 \n", "16 17LEU 16 0.056923 0.047940 13.147410 0.796813 \n", "297 298ARG 297 0.063750 0.060917 3.386454 0.199203 \n", "20 21GLY 20 0.077143 0.090351 3.984064 0.796813 \n", "300 301ILE 300 0.086809 0.071014 13.745020 2.589641 \n", "296 297PHE 296 0.098095 0.099696 17.131474 6.772908 \n", "\n", " Lipid Count Lipid Count std Koff Residence Time ... \\\n", "282 1.000000 0.000000 32.882928 0.030411 ... \n", "293 0.500000 0.500000 30.652487 0.032624 ... \n", "286 0.500000 0.500000 21.240404 0.047080 ... \n", "16 1.014286 0.014286 19.295543 0.051825 ... \n", "297 1.000000 0.000000 10.535137 0.094920 ... \n", "20 1.000000 0.000000 9.719108 0.102890 ... \n", "300 1.000000 0.000000 9.262659 0.107960 ... \n", "296 1.008333 0.008333 3.107937 0.321757 ... \n", "\n", " R Squared Bootstrap avg Binding Site ID Binding Site Duration \\\n", "282 0.693587 3 0.08427 \n", "293 0.794795 3 0.08427 \n", "286 0.492717 3 0.08427 \n", "16 0.999266 3 0.08427 \n", "297 0.994440 3 0.08427 \n", "20 0.991340 3 0.08427 \n", "300 0.998140 3 0.08427 \n", "296 0.997092 3 0.08427 \n", "\n", " Binding Site Occupancy Binding Site Lipid Count Binding Site Koff \\\n", "282 36.055777 1.086764 2.489836 \n", "293 36.055777 1.086764 2.489836 \n", "286 36.055777 1.086764 2.489836 \n", "16 36.055777 1.086764 2.489836 \n", "297 36.055777 1.086764 2.489836 \n", "20 36.055777 1.086764 2.489836 \n", "300 36.055777 1.086764 2.489836 \n", "296 36.055777 1.086764 2.489836 \n", "\n", " Binding Site Koff Bootstrap avg Binding Site Residence Time \\\n", "282 6.14596 0.401633 \n", "293 6.14596 0.401633 \n", "286 6.14596 0.401633 \n", "16 6.14596 0.401633 \n", "297 6.14596 0.401633 \n", "20 6.14596 0.401633 \n", "300 6.14596 0.401633 \n", "296 6.14596 0.401633 \n", "\n", " Binding Site R Squared Binding Site R Squared Bootstrap avg \n", "282 0.998424 0.998174 \n", "293 0.998424 0.998174 \n", "286 0.998424 0.998174 \n", "16 0.998424 0.998174 \n", "297 0.998424 0.998174 \n", "20 0.998424 0.998174 \n", "300 0.998424 0.998174 \n", "296 0.998424 0.998174 \n", "\n", "[8 rows x 22 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = li.binding_site(binding_site_id=3) # check the binding site No 3\n", "df.head(10)" ] }, { "cell_type": "markdown", "id": "b22cb60a", "metadata": {}, "source": [ "## Analyze bound poses\n", "\n", "Once the binding sites are defined, we can proceed to analyze bound poses, e.g. check the most representative bound poses for binding sites and check bound pose clusters for binding sites etc. " ] }, { "cell_type": "code", "execution_count": 21, "id": "7a368d4f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6840a09276204b868b80fd4eab9ceb10", "version_major": 2, "version_minor": 0 }, "text/plain": [ "ANALYZE BOUND POSES: 0%| | 0/16 [00:00" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pose_pool, pose_rmsd = li.analyze_bound_poses(binding_site_id=None, pose_format=\"pdb\",\n", " n_top_poses=3, n_clusters='auto') # None means analysis for all residues" ] }, { "cell_type": "markdown", "id": "16a949ab", "metadata": {}, "source": [ "`analyze_bound_poses()` will rate the bound poses for each binding site based on probability density calculated from the simulation trajectories and write out a couple of top rated poses (controled by `n_poses`). It will also cluster the bound poses for each binding site, for which the number of clusters can be determined by a density based cluster `DBSCAN` or provided by users via the parameter `n_clusters`. So for each binding site, it will generate two directories (if `n_clusters` is not `0`), one for top-rated poses (in the directory of 'BSid{num}\\_rank') and one for all the clustered poses (in the directory of 'BSid{num}\\_clusters'). All these directories are then put under the \"Bound_Poses_{lipid}\" directory if the parameter `save_dir` is None, i.e. not given. An overview of the directories organisation is shown below:\n", "\n", "\n", "\n", "The written poses store the lipid pose and the recetpor conformation that this pose was bound to. By default, the pose files are saved in the Gromacs 'gro' format but can be changed to, e.g. 'pdb' format by the parameter `pose_format`. For the top-ranked poses, the pose named 'top1' is the one with highest scores, i.e. the most representative bound pose from the simulations; and 'top2' is the second, and so on. For coarse-grained simulations, these top-ranked poses can be quite similar to each other due to the smoothened potentials. These poses can be checked by such molecular visualization softwares as VMD and PyMol etc. Below shows the top rated bound cholesterol pose at binding site No 3 of A2a. This cholesterol binding site have been seen in many of the Class A GPCR x-ray structures:\n", "\n", "\n", "\n", "\n", "The lipid bound poses for each binding site will be returned. The RMSD of bound poses to the binding site average will be returned and plotted in a violin plot. \n", "\n", "" ] }, { "cell_type": "markdown", "id": "09f6564a", "metadata": {}, "source": [ "Similar to other analysis functions, `analyze_bound_poses` can also select a couple of binding sites for analysis via `binding_site_id`. \n", "\n", "The returned `pose_pool` is a `dict` object that stores bound poses for binding sites, with the binding site id as the dictionary keys and the bound pose coordinates as the corresponding values. `pose_rmsd` is a pandas.DataFrame that stores RMSD for the bound poses (in unit of nm)." ] }, { "cell_type": "code", "execution_count": 22, "id": "9e01e6b7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Binding Site 0Binding Site 1Binding Site 2Binding Site 3Binding Site 4Binding Site 5Binding Site 6Binding Site 7Binding Site 8Binding Site 9Binding Site 10Binding Site 11Binding Site 12Binding Site 13Binding Site 14Binding Site 15
00.2230080.1923020.2885500.4871450.3258980.2169800.4172430.5983730.3032240.2607760.1743480.6816890.2691660.1227400.3620860.569712
10.2141760.3749070.3177571.0287070.4922440.2349290.4654880.3134930.3120070.2453800.1890060.4543260.2673360.1933130.8363230.692334
20.2798670.6908560.5403120.3834740.3728130.2161150.4637740.1524960.7803320.5502480.1274220.3757380.2651460.1299760.5248960.978642
30.1996530.3779800.3629780.3794330.4063180.2614710.2732370.3323180.3259810.2067750.1966690.2724140.1791980.2720440.2736170.529334
40.2888500.3486320.2733720.2514460.2447600.2407920.3597390.1610570.3857670.5873890.3260570.5169210.2977460.2809910.7012440.343846
\n", "
" ], "text/plain": [ " Binding Site 0 Binding Site 1 Binding Site 2 Binding Site 3 \\\n", "0 0.223008 0.192302 0.288550 0.487145 \n", "1 0.214176 0.374907 0.317757 1.028707 \n", "2 0.279867 0.690856 0.540312 0.383474 \n", "3 0.199653 0.377980 0.362978 0.379433 \n", "4 0.288850 0.348632 0.273372 0.251446 \n", "\n", " Binding Site 4 Binding Site 5 Binding Site 6 Binding Site 7 \\\n", "0 0.325898 0.216980 0.417243 0.598373 \n", "1 0.492244 0.234929 0.465488 0.313493 \n", "2 0.372813 0.216115 0.463774 0.152496 \n", "3 0.406318 0.261471 0.273237 0.332318 \n", "4 0.244760 0.240792 0.359739 0.161057 \n", "\n", " Binding Site 8 Binding Site 9 Binding Site 10 Binding Site 11 \\\n", "0 0.303224 0.260776 0.174348 0.681689 \n", "1 0.312007 0.245380 0.189006 0.454326 \n", "2 0.780332 0.550248 0.127422 0.375738 \n", "3 0.325981 0.206775 0.196669 0.272414 \n", "4 0.385767 0.587389 0.326057 0.516921 \n", "\n", " Binding Site 12 Binding Site 13 Binding Site 14 Binding Site 15 \n", "0 0.269166 0.122740 0.362086 0.569712 \n", "1 0.267336 0.193313 0.836323 0.692334 \n", "2 0.265146 0.129976 0.524896 0.978642 \n", "3 0.179198 0.272044 0.273617 0.529334 \n", "4 0.297746 0.280991 0.701244 0.343846 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pose_rmsd.head()" ] }, { "cell_type": "markdown", "id": "cd0c8fd7", "metadata": {}, "source": [ "## Calculate surface area\n", "\n", "We can also calculate the surface area for binding site, obtaining the values as a function of time. `print_data=True` generates a timeseries plot and a violinplot." ] }, { "cell_type": "code", "execution_count": 23, "id": "46fd3766", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3ee595b6ac844c8984ae5fd22f8b89cf", "version_major": 2, "version_minor": 0 }, "text/plain": [ "CALCULATE BINDING SITE SURFACE AREA: 0%| | 0/2 [00:00" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "surface_area = li.compute_surface_area(plot_data=True)" ] }, { "cell_type": "markdown", "id": "05f489f3", "metadata": {}, "source": [ "The returned `surface_area` is pandas.DataFrame object that stores the time evolution of the surface area for each binding site. The reported values are in the unit of nm^2." ] }, { "cell_type": "code", "execution_count": 24, "id": "324e254d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Binding Site 0Binding Site 1Binding Site 2Binding Site 3Binding Site 4Binding Site 5Binding Site 6Binding Site 7Binding Site 8Binding Site 9Binding Site 10Binding Site 11Binding Site 12Binding Site 13Binding Site 14Binding Site 15Time
0005.1805494.7130276.5887685.6154806.6223567.6659397.2617103.3593099.0464714.8611763.6724778.3626373.4144016.1266678.5137448.6316283.00
15.2076314.3892076.6784605.4713726.4120168.4603237.1083853.2793378.9039834.8174503.6876018.6755163.5112775.9177659.1955488.6890103.02
25.5486104.4656645.8720285.7733626.6854377.5532396.9734393.4841729.4587074.8279713.4021239.3009993.2516165.4976079.3643257.7859253.04
35.6073984.5898856.5604255.1696326.3399528.0636077.4624933.4133929.5323474.8305263.4621738.3927973.8735885.9042378.5151907.9455443.06
45.0240734.2143766.3990186.0427266.3041939.3410507.4359353.4290479.4380104.9078843.3223248.5365243.3491485.7174469.0658027.5392583.08
\n", "
" ], "text/plain": [ " Binding Site 0 Binding Site 1 Binding Site 2 Binding Site 3 \\\n", "0 0 0 5.180549 4.713027 6.588768 5.615480 \n", " 1 5.207631 4.389207 6.678460 5.471372 \n", " 2 5.548610 4.465664 5.872028 5.773362 \n", " 3 5.607398 4.589885 6.560425 5.169632 \n", " 4 5.024073 4.214376 6.399018 6.042726 \n", "\n", " Binding Site 4 Binding Site 5 Binding Site 6 Binding Site 7 \\\n", "0 0 0 6.622356 7.665939 7.261710 3.359309 \n", " 1 6.412016 8.460323 7.108385 3.279337 \n", " 2 6.685437 7.553239 6.973439 3.484172 \n", " 3 6.339952 8.063607 7.462493 3.413392 \n", " 4 6.304193 9.341050 7.435935 3.429047 \n", "\n", " Binding Site 8 Binding Site 9 Binding Site 10 Binding Site 11 \\\n", "0 0 0 9.046471 4.861176 3.672477 8.362637 \n", " 1 8.903983 4.817450 3.687601 8.675516 \n", " 2 9.458707 4.827971 3.402123 9.300999 \n", " 3 9.532347 4.830526 3.462173 8.392797 \n", " 4 9.438010 4.907884 3.322324 8.536524 \n", "\n", " Binding Site 12 Binding Site 13 Binding Site 14 Binding Site 15 \\\n", "0 0 0 3.414401 6.126667 8.513744 8.631628 \n", " 1 3.511277 5.917765 9.195548 8.689010 \n", " 2 3.251616 5.497607 9.364325 7.785925 \n", " 3 3.873588 5.904237 8.515190 7.945544 \n", " 4 3.349148 5.717446 9.065802 7.539258 \n", "\n", " Time \n", "0 0 0 3.00 \n", " 1 3.02 \n", " 2 3.04 \n", " 3 3.06 \n", " 4 3.08 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "surface_area.head()" ] }, { "cell_type": "markdown", "id": "11932500", "metadata": {}, "source": [ "Similar to other binding site analysis functions, `compute_surface_area` allows for selection of binding site for calculation via `binding_site_id`.\n" ] }, { "cell_type": "markdown", "id": "684cffd4", "metadata": {}, "source": [ "The calculation of surface area needs definition of the radii of atoms in the system. The function uses `mdtraj`'s atom radii and defines the radii of MARTINI 2 beads. New radii definition can be provided via `radii`. " ] }, { "cell_type": "markdown", "id": "0b254ca5", "metadata": {}, "source": [ "## Plots and save data\n", "\n", "The class object `LipidInteraction` provides a couple of assisting functions to plot and save data. These figures plot various interaction metrics as a function of the protein residue index. These figures help to point out the contact hotspots. " ] }, { "cell_type": "code", "execution_count": 25, "id": "408c81f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating new director: /Users/wlsong/PyLipID/PyLipID-dev/docs/tutorials/Interaction_CHOL/Figure_CHOL\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for item in [\"Residence Time\", \"Duration\", \"Occupancy\", \"Lipid Count\"]:\n", " li.plot(item=item) # plot values as a function of time" ] }, { "cell_type": "markdown", "id": "44377075", "metadata": {}, "source": [ "PyLipID also plots interactions in logo figures generated by logomakek. This kind of figure can directly point out the amino acids that make the contacts. It could be helpful to understand the chemical nature of lipid interactions. " ] }, { "cell_type": "code", "execution_count": 26, "id": "1bbf6610", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "li.plot_logo(item=\"Residence Time\")" ] }, { "cell_type": "markdown", "id": "7e1ad2b3", "metadata": {}, "source": [ "As mentioned above, the calculated binding site information can be saved in a text file. The order of the data can be controled by the `sort_residue` parameter:" ] }, { "cell_type": "code", "execution_count": 27, "id": "d523aeba", "metadata": {}, "outputs": [], "source": [ "li.write_site_info(sort_residue=\"Residence Time\") # write binding site information in a txt file" ] }, { "cell_type": "markdown", "id": "904fe830", "metadata": {}, "source": [ "To assist understanding of the interaction from a structural perspective, PyLipID can also save the interaction information in the B factor column of the protein coordinate in the pdb format. The following example will save the 'Residence Time' of each residue in a pdb file \"Coordinate_CHOL_Residence_Time.pdf\" in the directory of \"Coordinate_{lipid}\":" ] }, { "cell_type": "code", "execution_count": 28, "id": "69f195bb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating new director: /Users/wlsong/PyLipID/PyLipID-dev/docs/tutorials/Interaction_CHOL/Coordinate_CHOL\n" ] } ], "source": [ "li.save_coordinate(item=\"Residence Time\") # write protein coordinate in pdb format with the b factor column\n", " # showing 'Residence Time' values" ] }, { "cell_type": "markdown", "id": "672d9884", "metadata": {}, "source": [ "The coordinate file can be viewed in such visualization softwares as VMD and PyMol, and the structure can be coloured based on B factors to obtain the following images:\n", "\n", "" ] }, { "cell_type": "markdown", "id": "d00b927a", "metadata": {}, "source": [ "Shown above are the A2aR structure in the coarse-grained model. To make the secondary and teriary structure clearer, only the backbone beads were shown whereas the side beads were hidden. A 'white to red' color map was used to show the residence time for each residue in VMD. The interaction hotspots and their locations can be easily analyzed through such a presentation. " ] } ], "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.9.4" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "263px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 5 }