Skip to content

Instantly share code, notes, and snippets.

@dwhswenson
Last active August 5, 2019 10:16
Show Gist options
  • Save dwhswenson/41104499495adaf443882e229cba75ef to your computer and use it in GitHub Desktop.
Save dwhswenson/41104499495adaf443882e229cba75ef to your computer and use it in GitHub Desktop.
Contact Maps (unmaintained: use http://github.com/dwhswenson/contact_map)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Contact Maps\n",
"\n",
"The file `contact_map.py` includes some tricks to study contact maps in protein dynamics, based on tools in MDTraj. This notebook shows examples as serves as documentation."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import mdtraj as md\n",
"traj = md.load(\"no-h20.xtc\", top=\"no-h20.pdb\")\n",
"topology = traj.topology"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from contact_map import ContactMap, ContactFrequency, ContactDifference"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Look at a single frame: `ContactMap`\n",
"\n",
"First we make the contact map for the 0th frame. For default parameters (and how to change them) see section \"Changing the defaults\" below."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 78.6 ms, sys: 4.21 ms, total: 82.8 ms\n",
"Wall time: 82 ms\n"
]
}
],
"source": [
"%%time\n",
"frame_contacts = ContactMap(traj[0])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.07 s, sys: 34.6 ms, total: 1.1 s\n",
"Wall time: 1.1 s\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ec35410>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%time\n",
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(frame_contacts.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you wanted to, you could also plot all the atom-atom contacts. But that takes a lot longer, so it is commented out."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#%time frame_contacts.atom_contacts\n",
"#%time df = frame_contacts.atom_contacts.df"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#%%time\n",
"#plt.axis([0, topology.n_atoms]*2)\n",
"#plt.pcolor(df, cmap='RdBu', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Look at a trajectory: `ContactFrequency`\n",
"\n",
"`ContactFrequency` finds the fraction of frames where each contact exists."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.45 s, sys: 27.2 ms, total: 4.47 s\n",
"Wall time: 4.49 s\n"
]
}
],
"source": [
"%%time\n",
"trajectory_contacts = ContactFrequency(traj[::100])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# if you want to save this for later analysis\n",
"trajectory_contacts.save_to_file(\"traj_contacts.p\")\n",
"# then load with ContactFrequency.from_file(\"traj_contacts.p\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.12 s, sys: 26.8 ms, total: 1.15 s\n",
"Wall time: 1.15 s\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10fffb390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%time\n",
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(trajectory_contacts.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compare two: `ContactDifference`\n",
"\n",
"If you want to compare two frequencies, you can use the `ContactDifference` class (or the shortcut for it, which is to subtract a contact frequency/map from another.)\n",
"\n",
"The example below will compare the trajectory to its first frame."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.32 ms, sys: 647 µs, total: 1.97 ms\n",
"Wall time: 1.55 ms\n"
]
}
],
"source": [
"%%time\n",
"diff = trajectory_contacts - frame_contacts"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A contact that appears in trajectory, but not in the frame, will be at +1 and will be shown in red below. A contact that appears in the frame, but not the trajectory, will be at -1 and will be shown in blue below. The values are the difference in the frequencies (of course, for a single frame, the frequency is always 0 or 1)."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.35 s, sys: 44 ms, total: 1.39 s\n",
"Wall time: 1.4 s\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11072e710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%time\n",
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(diff.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### List the residue contacts that show the most difference\n",
"\n",
"First we look at the frames that are much more important in the trajectory than the frame. Then we look at the frames that are more important in the frame than the trajectory.\n",
"\n",
"The `.most_common()` method gives a list of the contact pairs and the frequency, sorted by frequency. See also `collections.Counter.most_common()` in the standard Python `collections` module.\n",
"\n",
"Here we do this with the `ContactDifference` we created, although it works the same for `ContactFrequency` and `ContactMap` (with the single-frame contact map, the ordering is a bit nonsensical, since every entry is either 0 or 1)."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.38 ms, sys: 559 µs, total: 4.94 ms\n",
"Wall time: 4.87 ms\n"
]
},
{
"data": {
"text/plain": [
"[([SER17, THR20], 0.9900990099009901),\n",
" ([VAL81, ASN116], 0.9801980198019802),\n",
" ([LEU19, VAL152], 0.9801980198019802),\n",
" ([ALA18, GTP201], 0.9702970297029703),\n",
" ([THR20, LYS16], 0.9603960396039604),\n",
" ([ASP57, MG202], 0.9504950495049505),\n",
" ([ILE163, GLU76], 0.9504950495049505),\n",
" ([GLU162, HIS166], 0.9504950495049505),\n",
" ([THR20, VAL8], 0.9405940594059405),\n",
" ([ASP57, THR20], 0.9405940594059405)]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"# residue contact more important in trajectory than in frame (near +1)\n",
"diff.residue_contacts.most_common()[:10]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[([CL6864, ASP47], -0.9900990099009901),\n",
" ([VAL29, ILE21], -0.9900990099009901),\n",
" ([GLU162, NA6838], -0.9900990099009901),\n",
" ([LYS165, NA6838], -0.9900990099009901),\n",
" ([NA6816, SER106], -0.9900990099009901),\n",
" ([ARG161, CL6864], -0.9900990099009901),\n",
" ([CL6848, NA6845], -0.9900990099009901),\n",
" ([GLU107, NA6821], -0.9900990099009901),\n",
" ([CL6854, NA6830], -0.9900990099009901),\n",
" ([ASP153, GLN22], -0.9801980198019802)]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# residue contact more important in frame than in trajectory (near -1)\n",
"list(reversed(diff.residue_contacts.most_common()))[:10]\n",
"# alternate: diff.residue_contacts.most_common()[:-10:-1] # (thanks Sander!)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### List the atoms contacts most common within a given residue contact"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"VAL81 ASN116\n"
]
}
],
"source": [
"val81 = topology.residue(80)\n",
"asn116 = topology.residue(115)\n",
"print val81, asn116\n",
"gtp201 = topology.residue(166)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We extended the standard `.most_common()` to take an optional argument. When the argument is given, it will filter the output to only include the ones where that argument is part of the contact. For example, the following gives the residues most commonly in contact with GTP."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"([VAL14, GTP201], 1.0)\n",
"([GLY13, GTP201], 1.0)\n",
"([ALA146, GTP201], 1.0)\n",
"([SER145, GTP201], 1.0)\n",
"([GTP201, LEU120], 1.0)\n",
"([GTP201, GLY15], 1.0)\n",
"([GLY12, GTP201], 1.0)\n",
"([ALA11, GTP201], 1.0)\n",
"([GTP201, LYS16], 1.0)\n",
"([ASN116, GTP201], 1.0)\n",
"([LYS147, GTP201], 1.0)\n",
"([SER17, GTP201], 1.0)\n",
"([LYS117, GTP201], 1.0)\n",
"([GTP201, ASP119], 1.0)\n",
"([ALA18, GTP201], 0.9702970297029703)\n",
"([GTP201, GLU63], 0.5247524752475248)\n",
"([ASP57, GTP201], 0.42574257425742573)\n",
"([ASP33, GTP201], 0.22772277227722773)\n",
"([GTP201, THR144], 0.13861386138613863)\n"
]
}
],
"source": [
"for contact in trajectory_contacts.residue_contacts.most_common(gtp201):\n",
" if contact[1] > 0.1:\n",
" print contact"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also find all the atoms, for all residue contacts, that are in contact with a given residue, and return that sorted by frequency."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[([ALA18-CB, GTP201-N7], 0.9702970297029703),\n",
" ([GTP201-O2B, VAL14-CG1], 0.9702970297029703),\n",
" ([GTP201-C8, ALA18-CB], 0.9702970297029703),\n",
" ([SER17-N, GTP201-O2A], 0.9405940594059405),\n",
" ([SER17-C, GTP201-O2A], 0.9405940594059405),\n",
" ([GTP201-O2A, ALA18-CA], 0.9405940594059405),\n",
" ([SER17-CA, GTP201-O2A], 0.9405940594059405),\n",
" ([ALA18-N, GTP201-O2A], 0.9405940594059405),\n",
" ([ALA18-CB, GTP201-O2A], 0.9405940594059405),\n",
" ([SER17-N, GTP201-PB], 0.9306930693069307),\n",
" ([GLY15-C, GTP201-O2A], 0.9306930693069307),\n",
" ([GLY15-O, GTP201-O2A], 0.9108910891089109),\n",
" ([LYS16-N, GTP201-O2A], 0.8811881188118812),\n",
" ([GTP201-C2, LYS147-CB], 0.8514851485148515),\n",
" ([GLY15-C, GTP201-PA], 0.8316831683168316)]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff.most_common_atoms_for_residue(gtp201)[:15]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we can look at which atoms are most commonly in contact within a given residue contact pair."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[([ASN116-CB, VAL81-CG1], 0.9801980198019802),\n",
" ([ASN116-CG, VAL81-CG1], 0.3465346534653465),\n",
" ([VAL81-CG1, ASN116-ND2], 0.2079207920792079),\n",
" ([VAL81-CG1, ASN116-N], 0.13861386138613863),\n",
" ([VAL81-CG1, ASN116-CA], 0.019801980198019802)]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trajectory_contacts.most_common_atoms_for_contact([val81, asn116])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Changing the defaults\n",
"\n",
"This sections covers several options that you can modify to make the contact maps faster, and to focus on what you're most interested in.\n",
"\n",
"The first three options change which atoms are included as possible contacts. The query atoms are the atoms which appear on the y-axis of the plot. The haystack atoms are those along the x-axis of the plot. In general, you should choose a query that is smaller than the haystack.\n",
"\n",
"Both of these options take a list of atom index numbers. These are most easily created using MDTraj's atom selection language."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1408\n"
]
}
],
"source": [
"# the default selection is\n",
"default_selection = topology.select(\"not water and not symbol == 'H'\")\n",
"print len(default_selection)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using a different query"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"switch1 = topology.select(\"resSeq 32 to 38 and not symbol == 'H'\")\n",
"switch2 = topology.select(\"resSeq 59 to 67 and not symbol == 'H'\")\n",
"gtp = topology.select(\"resname GTP and not symbol == 'H'\")\n",
"mg = topology.select(\"element Mg\")\n",
"cations = topology.select(\"resname NA or resname MG\")\n",
"sodium = topology.select(\"resname NA\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.82 s, sys: 11.8 ms, total: 1.83 s\n",
"Wall time: 1.82 s\n"
]
}
],
"source": [
"%%time\n",
"sw1_contacts = ContactFrequency(trajectory=traj[::100], query=switch1)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x110831610>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(sw1_contacts.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using a different haystack\n",
"\n",
"Currently, changing the haystack has essentially no effect on the performance. However, I expect to change that in the future (requires making some modifications to MDTraj)."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.83 s, sys: 16.2 ms, total: 1.84 s\n",
"Wall time: 1.87 s\n"
]
}
],
"source": [
"%%time\n",
"cations_switch1 = ContactFrequency(trajectory=traj[::100], query=cations, haystack=switch1)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x110940650>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(cations_switch1.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Changing how many neighboring residues are ignored\n",
"\n",
"By default, we ignore atoms from 2 residues on either side of the given residue (and in the same `chain`). This is easily changed. However, even when you say to ignore no neighbors, you still ignore the residue's interactions with itself.\n",
"\n",
"Note: for non-protein contact, the `chain` is often poorly defined. In this example, the GTP and the Mg are listed sequentially in residue order, and therefore they are considered \"neighbors\" and their contacts are ignored."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 6 s, sys: 34.4 ms, total: 6.04 s\n",
"Wall time: 6.04 s\n"
]
}
],
"source": [
"%%time\n",
"ignore_none = ContactFrequency(trajectory=traj[::100], n_neighbors_ignored=0)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x110903050>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(ignore_none.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using a different cutoff\n",
"\n",
"The size of the cutoff has a large effect on the performance. The default is (currently) 0.45nm."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2min 19s, sys: 1.78 s, total: 2min 21s\n",
"Wall time: 2min 21s\n"
]
}
],
"source": [
"%%time\n",
"large_cutoff = ContactFrequency(trajectory=traj[::100], cutoff=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD7CAYAAAB68m/qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvW2cZdVV5/+73Eq6EhpppEh3pCNtaLSRxoaBDMQh0hEY\nEwcGlMQkGkbQMGEURAb4S4bgpWz6ExxgCAZHMoAQjSYoUWL4TIiQCZie2D1pDEw60mMaLZJqU5iO\nFFKt1UkV9//i7nXO96y79n2ovtVVkFpv7rnnYZ+999l77bV+62HXms2mlmiJlmiJluilTwctdAWW\naImWaImWaDC0xNCXaImWaIleJrTE0JdoiZZoiV4mtMTQl2iJlmiJXia0xNCXaImWaIleJrTE0Jdo\niZZoiV4mNLRQL67Vakv+kku0REu0RHOgZrNZi84vGEOXpOazz7YOZmakoVSV5cvLG4aHpamp9gen\np9ufGx6uXp+ZaR0PDZVlTk2Vzw4Pl89MTZXl2HM8HnLdxHt5ze6fmCjLHhmpXuf9bIfdb+eGhsq2\nDw9Ly5fr+ptu0vVXXFFtM+vCvmLdJybK82yz1Oob9o+dHxkp752cLO8ZGpJWrGh/z/BwWffly6tt\nY5/ZsV2fni7L3rOnLHtoqPXfyPpxbKwsc/nyah2tvNWrJanVXxddVN7LvrLnJibitk1Pl8e83949\nPV1tA5/jt4z62epq77QyV6wo25y+eeWde/ZU+5HfgRR9N47rycl4vK9Yoes/8AFdf9ll5Tnfb1Z3\n9tXUVFnvFSuq35Pzzfpi1aqyf/y4l6Rdu6Q1a1rHIyOtb27vtHHAenOcLF9e3mPn2We+D+14xYqy\nDpOTZR0nJ8t27tlTnk/vun7zZl3/cz/X3na+f9WqeNzs2SOtXdvefozhiGr1evbagjJ07dzZ+iXz\n8Iw5GpDRYCRz47EnzwCsPGN6ZBLRO3l+aKhab/soq1ZVmQSZjR1PTZUDjwzBiMzZGINNHE4IvoeL\nB5/lxLN77LkVK6qDmu20OqxeXWVeuYWD347HUqt/OTE4gG3gczJwURwaqi74bKf1pzGAmZmy7Bdf\nrLbXvjHbyHeOjFS/Odvs20MGNTJS1mNmprqA2nn2IevAezk+2GZetz6cnKwu+GSM0ZzhO31b7PzQ\nkHTQQa13WNmsA59jv0nVBY3Mi+PTjslw7V4y0ZNPLt8/OVne74Uh1tEY4NhYezv37Km+m33Fuck2\n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\nGmqooYYPCf4/KCWIoRXNPz0AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ee60610>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.axis([0, topology.n_residues]*2)\n",
"plt.pcolor(large_cutoff.residue_contacts.df, cmap='seismic', vmin=-1, vmax=1);"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
"""
Contact map analysis.
"""
# Maintainer: David W.H. Swenson (dwhs@hyperblazer.net)
# Licensed under LGPL, version 2.1 or greater
import collections
import itertools
import scipy
import pandas as pd
import mdtraj as md
import pickle
# TODO:
# * switch to something where you can define the haystack -- the trick is to
# replace the current mdtraj._compute_neighbors with something that
# build a voxel list for the haystack, and then checks the voxel for each
# query atom. Doesn't look like anything is doing that now: neighbors
# doesn't use voxels, neighborlist doesn't limit the haystack
# * (dream) parallelization: map-reduce like himach should work great for
# this
def residue_neighborhood(residue, n=1):
"""Find n nearest neighbor residues
Parameters
----------
residue : mdtraj.Residue
this residue
n : positive int
number of neighbors to find
Returns
-------
list of int
neighbor residue numbers
"""
neighborhood = set([residue.index+i for i in range(-n, n+1)])
chain = set([res.index for res in residue.chain.residues])
# we could probably choose an faster approach here, but this is pretty
# good, and it only gets run once per residue
return [idx for idx in neighborhood if idx in chain]
class ContactCount(object):
def __init__(self, counter, object_f, n_x, n_y):
self._counter = counter
self._object_f = object_f
self.n_x = n_x
self.n_y = n_y
@property
def counter(self):
return self._counter
@property
def sparse_matrix(self):
mtx = scipy.sparse.dok_matrix((self.n_x, self.n_y))
for (k, v) in self._counter.items():
key = list(k)
mtx[key[0], key[1]] = v
mtx[key[1], key[0]] = v
return mtx
@property
def df(self):
return pd.SparseDataFrame(self.sparse_matrix.todense())
def most_common(self, obj=None):
if obj is None:
result = [
([self._object_f(idx) for idx in common[0]], common[1])
for common in self.most_common_idx()
]
else:
obj_idx = obj.index
result = [
([self._object_f(idx) for idx in common[0]], common[1])
for common in self.most_common_idx()
if obj_idx in common[0]
]
return result
def most_common_idx(self):
return self._counter.most_common()
class ContactObject(object):
"""
Generic object for contact map related analysis. Effectively abstract.
Much of what we need to do the contact map analysis is the same for all
analyses. It's in here.
"""
def __init__(self, topology, query, haystack, cutoff, n_neighbors_ignored):
# all inits required: no defaults for abstract class!
self._topology = topology
if query is None:
query = topology.select("not water and not symbol == 'H'")
if haystack is None:
haystack = topology.select("not water and not symbol == 'H'")
# make things private and accessible through read-only properties so
# they don't get accidentally changed after analysis
self._cutoff = cutoff
self._query = set(query)
self._haystack = set(haystack)
self._n_neighbors_ignored = n_neighbors_ignored
self._atom_idx_to_residue_idx = {atom.index: atom.residue.index
for atom in self.topology.atoms}
def save_to_file(self, filename, mode="w"):
"""Save this object to the given file.
Parameters
----------
filename : string
the file to write to
mode : 'w' or 'a'
file writing mode. Use 'w' to overwrite, 'a' to append.
"""
f = open(filename, mode)
pickle.dump(self, f)
f.close()
@classmethod
def from_file(cls, filename):
f = open(filename, "r")
return pickle.load(f)
def __sub__(self, other):
return ContactDifference(positive=self, negative=other)
@property
def cutoff(self):
return self._cutoff
@property
def n_neighbors_ignored(self):
return self._n_neighbors_ignored
@property
def query(self):
return list(self._query)
@property
def haystack(self):
return list(self._haystack)
@property
def topology(self):
return self._topology
@property
def residue_query_atom_idxs(self):
result = {}
for atom_idx in self._query:
residue_idx = self.topology.atom(atom_idx).residue.index
try:
result[residue_idx] += [atom_idx]
except KeyError:
result[residue_idx] = [atom_idx]
return result
@property
def residue_ignore_atom_idxs(self):
result = {}
for residue_idx in self.residue_query_atom_idxs.keys():
residue = self.topology.residue(residue_idx)
# Several steps to go residue indices -> atom indices
ignore_residue_idxs = residue_neighborhood(residue,
self._n_neighbors_ignored)
ignore_residues = [self.topology.residue(idx)
for idx in ignore_residue_idxs]
ignore_atoms = sum([list(res.atoms)
for res in ignore_residues], [])
ignore_atom_idxs = set([atom.index for atom in ignore_atoms])
result[residue_idx] = ignore_atom_idxs
return result
def most_common_atoms_for_residue(self, residue):
try:
residue_idx = residue.index
except AttributeError:
residue_idx = residue
residue = self.topology.residue(residue_idx)
residue_atoms = set(atom.index for atom in residue.atoms)
results = []
for contact in self.atom_contacts.most_common_idx():
atoms = contact[0]
number = contact[1]
for atom in atoms:
if atom in residue_atoms:
results.append(([self.topology.atom(a) for a in atoms],
number))
return results
def most_common_atoms_for_contact(self, contact_pair):
contact_pair = frozenset(contact_pair)
res_A = list(contact_pair)[0]
res_B = list(contact_pair)[1]
try:
res_A_idx = res_A.index
except AttributeError:
res_A_idx = res_A
res_A = self.topology.residue(res_A_idx)
try:
res_B_idx = res_B.index
except AttributeError:
resB_idx = res_B
res_B = self.topology.residue(res_B_idx)
atom_idxs_A = set(atom.index for atom in res_A.atoms)
atom_idxs_B = set(atom.index for atom in res_B.atoms)
all_atom_pairs = [
frozenset(pair)
for pair in itertools.product(atom_idxs_A, atom_idxs_B)
]
result = [([self.topology.atom(idx) for idx in contact[0]], contact[1])
for contact in self.atom_contacts.most_common_idx()
if frozenset(contact[0]) in all_atom_pairs]
return result
def contact_map(self, trajectory, frame_number, residue_query_atom_idxs,
residue_ignore_atom_idxs):
"""
Returns atom and residue contact maps for the given frame.
Parameters
----------
frame : mdtraj.Trajectory
the desired frame (uses the first frame in this trajectory)
residue_query_atom_idxs : dict
residue_ignore_atom_idxs : dict
Returns
-------
atom_contacts : collections.Counter
residue_contact : collections.Counter
"""
neighborlist = md.compute_neighborlist(trajectory, self.cutoff,
frame_number)
contact_pairs = set([])
residue_pairs = set([])
for residue_idx in residue_query_atom_idxs:
ignore_atom_idxs = set(residue_ignore_atom_idxs[residue_idx])
query_idxs = residue_query_atom_idxs[residue_idx]
for atom_idx in query_idxs:
# sets should make this fast, esp since neighbor_idxs
# should be small and s-t is avg cost len(s)
neighbor_idxs = set(neighborlist[atom_idx])
contact_neighbors = neighbor_idxs - ignore_atom_idxs
contact_neighbors = contact_neighbors & self._haystack
# frozenset is unique key independent of order
# local_pairs = set(frozenset((atom_idx, neighb))
# for neighb in contact_neighbors)
local_pairs = set(map(
frozenset,
itertools.product([atom_idx], contact_neighbors)
))
contact_pairs |= local_pairs
# contact_pairs |= set(frozenset((atom_idx, neighb))
# for neighb in contact_neighbors)
local_residue_partners = set(self._atom_idx_to_residue_idx[a]
for a in contact_neighbors)
local_res_pairs = set(map(
frozenset,
itertools.product([residue_idx], local_residue_partners)
))
residue_pairs |= local_res_pairs
atom_contacts = collections.Counter(contact_pairs)
# residue_pairs = set(
# frozenset(self._atom_idx_to_residue_idx[aa] for aa in pair)
# for pair in contact_pairs
# )
residue_contacts = collections.Counter(residue_pairs)
return (atom_contacts, residue_contacts)
@property
def atom_contacts(self):
n_atoms = self.topology.n_atoms
return ContactCount(self._atom_contacts, self.topology.atom,
n_atoms, n_atoms)
@property
def residue_contacts(self):
n_res = self.topology.n_residues
return ContactCount(self._residue_contacts, self.topology.residue,
n_res, n_res)
class ContactMap(ContactObject):
"""
Contact map (atomic and residue) for a single frame.
"""
def __init__(self, frame, query=None, haystack=None, cutoff=0.45,
n_neighbors_ignored=2):
self._frame = frame
super(ContactMap, self).__init__(frame.topology, query, haystack,
cutoff, n_neighbors_ignored)
contact_maps = self.contact_map(frame, 0,
self.residue_query_atom_idxs,
self.residue_ignore_atom_idxs)
(self._atom_contacts, self._residue_contacts) = contact_maps
class ContactTrajectory(ContactObject):
"""
Contact map (atomic and residue) for each individual trajectory frame.
NOT YET IMPLEMENTED. I'm not sure whether this gives appreciable speed
improvements over running contact map over and over.
"""
pass
class ContactFrequency(ContactObject):
"""
Contact frequency (atomic and residue) for a trajectory.
The contact frequency is defined as fraction of the trajectory that a
certain contact is made. This object calculates this quantity for all
contacts with atoms in the `query` residue, with "contact" defined as
being within a certain cutoff distance.
Parameters
----------
trajectory : mdtraj.Trajectory
Trajectory (segment) to analyze
query_residues : list of int
Indices of the residues to be included as query. Default `None`
means all atoms.
cutoff : float
Cutoff distance for contacts, in nanometers. Default 0.45.
n_neighbors_ignored : int
Number of neighboring residues (in the same chain) to ignore.
Default 2.
"""
def __init__(self, trajectory, query=None, haystack=None, cutoff=0.45,
n_neighbors_ignored=2):
self._trajectory = trajectory
self._n_frames = len(trajectory)
super(ContactFrequency, self).__init__(trajectory.topology,
query, haystack, cutoff,
n_neighbors_ignored)
self._build_contact_map()
def _build_contact_map(self):
# We actually build the contact map on a per-residue basis, although
# we save it on a per-atom basis. This allows us ignore
# n_nearest_neighbor residues.
# TODO: this whole thing should be cleaned up and should replace
# MDTraj's really slow old computer_contacts by using MDTraj's new
# neighborlists (unless the MDTraj people do that first).
topology = self.topology
trajectory = self.trajectory
cutoff = self.cutoff
self._atom_contacts_count = collections.Counter([])
self._residue_contacts_count = collections.Counter([])
# cache things that can be calculated once based on the topology
# (namely, which atom indices matter for each residue)
residue_ignore_atom_idxs = self.residue_ignore_atom_idxs
residue_query_atom_idxs = self.residue_query_atom_idxs
for frame_num in range(len(trajectory)):
frame_contacts = self.contact_map(trajectory, frame_num,
residue_query_atom_idxs,
residue_ignore_atom_idxs)
frame_atom_contacts = frame_contacts[0]
frame_residue_contacts = frame_contacts[1]
# self._atom_contacts_count += frame_atom_contacts
self._atom_contacts_count.update(frame_atom_contacts)
self._residue_contacts_count += frame_residue_contacts
@property
def trajectory(self):
return self._trajectory
@property
def n_frames(self):
return self._n_frames
@property
def atom_contacts(self):
"""Atoms pairs mapped to fraction of trajectory with that contact"""
n_x = len(self.haystack)
n_y = len(self.query)
return ContactCount(collections.Counter({
item[0]: float(item[1])/self.n_frames
for item in self._atom_contacts_count.items()
}), self.topology.atom, n_x, n_y)
@property
def residue_contacts(self):
"""Residue pairs mapped to fraction of trajectory with that contact"""
n_x = self.topology.n_residues
n_y = self.topology.n_residues
return ContactCount(collections.Counter({
item[0]: float(item[1])/self.n_frames
for item in self._residue_contacts_count.items()
}), self.topology.residue, n_x, n_y)
class ContactDifference(ContactObject):
"""
Contact map comparison (atomic and residue).
This can compare single frames or entire trajectories (or even mix the
two!)
"""
def __init__(self, positive, negative):
self.positive = positive
self.negative = negative
# TODO: verify that the combination is compatible: same topol, etc
super(ContactDifference, self).__init__(positive.topology,
positive.query,
positive.haystack,
positive.cutoff,
positive.n_neighbors_ignored)
def __sub__(self, other):
raise NotImplementedError
def contact_map(self, *args, **kwargs):
raise NotImplementedError
@property
def atom_contacts(self):
n_x = self.topology.n_atoms
n_y = self.topology.n_atoms
diff = collections.Counter(self.positive.atom_contacts.counter)
diff.subtract(self.negative.atom_contacts.counter)
return ContactCount(diff, self.topology.atom, n_x, n_y)
@property
def residue_contacts(self):
n_x = self.topology.n_residues
n_y = self.topology.n_residues
diff = collections.Counter(self.positive.residue_contacts.counter)
diff.subtract(self.negative.residue_contacts.counter)
return ContactCount(diff, self.topology.residue, n_x, n_y)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment