diff --git a/.gitignore b/.gitignore index b527366..8e4d4e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ dask-worker-space # netcdf outputs *nc +.pytest_cache contact_map/version.py cover diff --git a/contact_map/concurrence.py b/contact_map/concurrence.py index c456bdb..d6bba3e 100644 --- a/contact_map/concurrence.py +++ b/contact_map/concurrence.py @@ -223,9 +223,12 @@ def x_values(self): def x_values(self, x_values): self._x_values = x_values - def plot(self, concurrence=None): + def plot(self, concurrence=None, **kwargs): """Contact concurrence plot based on matplotlib + Additional kwargs given here will be passed to the matplotlib + ``Axes.plot()`` method. + Parameters ---------- concurrence : :class:`.Concurrence` @@ -249,23 +252,30 @@ def plot(self, concurrence=None): fig = plt.figure(1) ax = fig.add_subplot(111) + plot_kwargs = {'markersize': 1} + plot_kwargs.update(kwargs) + y_val = -1.0 for label, val_set in zip(labels, concurrence.values): x_vals = [x for (x, y) in zip(x_values, val_set) if y] - ax.plot(x_vals, [y_val] * len(x_vals), '.', markersize=1, - label=label) + ax.plot(x_vals, [y_val] * len(x_vals), '.', label=label, + **plot_kwargs) y_val -= 1.0 ax.set_ylim(top=0.0) ax.set_xlim(left=min(x_values), right=max(x_values)) + ax.set_yticks([]) lgd = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) return (fig, ax, lgd) -def plot_concurrence(concurrence, labels=None, x_values=None): # -no-cov- +def plot_concurrence(concurrence, labels=None, x_values=None, **kwargs): # -no-cov- """ Convenience function for concurrence plots. + Additional kwargs given here will be passed to the matplotlib + ``Axes.plot()`` method. + Parameters ---------- concurrence : :class:`.Concurrence` @@ -279,4 +289,4 @@ def plot_concurrence(concurrence, labels=None, x_values=None): # -no-cov- -------- :class:`.ConcurrencePlotter` """ - return ConcurrencePlotter(concurrence, labels, x_values).plot() + return ConcurrencePlotter(concurrence, labels, x_values).plot(**kwargs) diff --git a/docs/examples/index.rst b/docs/examples/index.rst index a89ccb4..4c7b5d8 100644 --- a/docs/examples/index.rst +++ b/docs/examples/index.rst @@ -1,8 +1,10 @@ Examples ======== -So far, we only have one major example. We will add others here as they -are written. +We have several examples to illustrate various features of the code. These +notebooks have been rendered here for the web, but the originals are +found in the ``examples/`` directory of the package, and you can run them +yourself! .. toctree:: :maxdepth: 1 diff --git a/docs/installing.rst b/docs/installing.rst index 632beb2..07aaab9 100644 --- a/docs/installing.rst +++ b/docs/installing.rst @@ -97,6 +97,19 @@ This is a three-step process: interpreted uses) and the ``.`` tells it to find ``setup.py`` in the current directory. +Additional functionality +======================== + +Installing some additional packages will immediately enable additional +features in ``contact_map``. To get all the functionality, install the +packages in ``optional_installs.txt``, either with ``pip install -r +optional_installs.txt`` or ``conda install -y --file +optional_installs.txt``. + +Specific extra functionality that can be enabled: + +* plotting tools (install ``matplotlib``) +* parallelization (install ``dask``, ``distributed``) Testing your installation ========================= diff --git a/examples/concurrences.ipynb b/examples/concurrences.ipynb new file mode 100644 index 0000000..71c1e2f --- /dev/null +++ b/examples/concurrences.ipynb @@ -0,0 +1,232 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Concurrences\n", + "\n", + "One of the tools in `contact_map` is the ability to look at simultaneous contacts. The idea is that you might have a set of contacts that is likely to happen concurrently, and that this set of contacts might help you define a stable state. This is managed in `contact_map` by what we call contact concurrences.\n", + "\n", + "To start, we'll look at a trajectory of a specific inhibitor during its binding process to GSK3B." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from contact_map import ContactFrequency, ResidueContactConcurrence, plot_concurrence\n", + "import mdtraj as md\n", + "traj = md.load(\"data/gsk3b_example.h5\")\n", + "print(traj) # to see number of frames; size of system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we'll use MDTraj's [atom selection language](http://mdtraj.org/latest/atom_selection.html) to split out the protein and the ligand, which has residue name YYG in the input files. We're only interested in contacts between the protein and the ligand (not contacts within the protein). We'll also only look at heavy atom contacts." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "topology = traj.topology\n", + "yyg = topology.select('resname YYG and element != \"H\"')\n", + "protein = topology.select('protein and element != \"H\"')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we'll make a list of all the residue contacts that are made, keeping only those that occur more than 20% of the time. We'll put that into a `ResidueContactConcurrence` object, and plot it!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.11 s, sys: 54.1 ms, total: 4.16 s\n", + "Wall time: 4.02 s\n" + ] + } + ], + "source": [ + "%%time\n", + "contacts = ContactFrequency(traj, query=yyg, haystack=protein)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "contact_list = [(contact_pair, freq)\n", + " for contact_pair, freq in contacts.residue_contacts.most_common()\n", + " if freq >= 0.2]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 352 ms, sys: 4.91 ms, total: 357 ms\n", + "Wall time: 359 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "concurrence = ResidueContactConcurrence(traj, contact_list, select=\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# optionally, create x-values... since we know that we have 1 ns/frame\n", + "times = [1.0*(i+1) for i in range(len(traj))]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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OOEeHBxce+TIEZeW2p44cWL548ePU9LT01Pr6uooX3/9dUcAgLVr1z4h04SuXr06PyIioobBYOj8/fX69esLz58/73L37l07AIDZs2f7fvLJJwW7d+/O01besWNH1fz585lFRUXWaWlpqVKpVHLz5k2pUqmkAgDY2dkR169fT09PT5ekpqZKLl++7HT58uWmqVjXrVuXT8bXu3dvBQCAp6dnY1xcXO6MGTOeS2Pq4OBASKVSiaenp7Llo20kbROw63qZkjRFIZE8l5CCXNb1Xl89c7Shr56++PW1Ycg25tovSx5fc8RrifPBHMe3tW0Yc94g1By8gqQpapVKXHv3bqpaZf6kKUVFRfdcXFyUcrk8kVzv5eVVr/q7r5SUlOROnTopzp49K/3Xv/5VRW6nL5kK+Vq1alXunDlzipqXDxkypGzz5s0tHocff/zxYffu3auPHj2a0bNnz2p95dXV1XednZ0by8vL77bUbnV19V2BQFB7+fLlNIIgxCNHjizdv3//I131FyxYULhixYq85uU+Pj71hYWF9035HF5Z0hQ7geC5hBTksq73+uqZow199fTFr68NQ7Yx135Z8viaI15LnA/mOL6tbcOY8wah14HiwQN6wYcLAhQPHpg9jamXl5eqc+fOtSdPnnQGADh48KDb0KFDK6jUZ0PKwYMH3UaOHFk+cOBAWVZWll1BQYFBt5Lr6+spR48ebUpjSvp7nnPnSZMmVbTUxrhx46pcXFxUM2bM8N+9e3eOvnKJRGLr7e3d4OrqqnP61MbGRuDz+UIGg9G5b9++1f3792+aZnb16tVMLpcrfP/995vman8V8GE3hBBqh+idOyuYX3/1iN65s0WSeYwdO7b86NGjrgAAp06dcps8eXLTbfWffvrJLSYmppxGo8GgQYMq4uPjXQ1pc8qUKeyePXvKBg4cKNMs//HHH53Dw8Nl+m6ra4qNjX0aGhpa27lz53pDyklxcXHuf+ceD83MzLQGALCysgKpVCrJzc1Nunv3boc7d+7YAQBs3bq14PHjxykPHjxIq6iooK1YscLLkNgsAQdyhBBqhyhUKth37aqgUC3zv/mJEydW/vXXX07Xr1+3r6uro0ZGRsoBAG7dukXPycmxHThwIJfJZIb8/PPPbidOnHBrqb1FixZ5l5aWWu3duzev+bpjx465jR07tlzbdtpQqVSgatnv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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "(fig, ax, lgd) = plot_concurrence(concurrence, x_values=times)\n", + "plt.xlabel(\"Time (ns)\")\n", + "plt.savefig(\"concurrences.pdf\", bbox_extra_artists=(lgd,), bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This plot shows when each contact occurred. The x-axis is time. Each dot represents that a specific contact pair is present at that time. The contact pairs are separated along the vertical axis, listed in the order from `contact_list` (here, decreasing order of frequency of the contact). The contacts are also listed in that order in the legend, to the right.\n", + "\n", + "This trajectory shows two groups of stable contacts between the protein and the ligand; i.e. there is a change in the stable state. This allows us to visually identify the contacts involved in each state. Both states involve the ligand being in contact with Phe33, but the earlier state includes contacts with Ile28, Gly29, etc., while the later state includes contacts with Ser32 and Gly168.\n", + "\n", + "This change occurs around 60ns (which is also frame 60), and is evident when viewing the MD trajectory. If you have [NGLView](https://github.com/arose/nglview/) installed, visualize the trajectory with the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# for visualization, we need to clean up the trajectory:\n", + "traj.topology.create_standard_bonds() # required for image_molecules\n", + "traj = traj.image_molecules().superpose(traj)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3782c8b836f343daa9d661c363aa4a9a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "NGLWidget(count=100, frame=60)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import nglview as nv\n", + "view = nv.show_mdtraj(traj)\n", + "view.remove_cartoon()\n", + "view.add_cartoon('protein', color='#0000BB', opacity=0.3)\n", + "view.add_ball_and_stick(\"YYG\")\n", + "\n", + "# update to my recommeded camera orientation\n", + "camera_orientation = [-100, 45, -30, 0,\n", + " 50, 90, -45, 0,\n", + " 0, -45,-100, 0,\n", + " -50, -45, -45, 1]\n", + "view._set_camera_orientation(camera_orientation)\n", + "\n", + "# start trajectory at frame 60: you can scrub forward or backward\n", + "view.frame = 60\n", + "view" + ] + } + ], + "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.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data/gsk3b_example.h5 b/examples/data/gsk3b_example.h5 new file mode 100644 index 0000000..00742de Binary files /dev/null and b/examples/data/gsk3b_example.h5 differ