Protein Blocks are great tools to study protein deformability. Indeed, if the block assigned to a residue changes between two frames of a trajectory, it represents a local deformation of the protein rather than the displacement of the residue.
The API allows to visualize Protein Block variability throughout a molecular dynamics simulation trajectory.
In [1]:
    
from __future__ import print_function, division
from pprint import pprint
from IPython.display import Image, display
import matplotlib.pyplot as plt
import os
# The following line, in a jupyter notebook, allows to display
# the figure directly in the notebook. See <https://jupyter.org/>
%matplotlib inline
    
In [2]:
    
import pbxplore as pbx
    
Here we will look at a molecular dynamics simulation of the barstar. As we will analyse Protein Block sequences, we first need to assign these sequences for each frame of the trajectory.
In [3]:
    
# Assign PB sequences for all frames of a trajectory
trajectory = os.path.join(pbx.DEMO_DATA_PATH, 'barstar_md_traj.xtc')
topology = os.path.join(pbx.DEMO_DATA_PATH, 'barstar_md_traj.gro')
sequences = []
for chain_name, chain in pbx.chains_from_trajectory(trajectory, topology):
    dihedrals = chain.get_phi_psi_angles()
    pb_seq = pbx.assign(dihedrals)
    sequences.append(pb_seq)
    
In [4]:
    
count_matrix = pbx.analysis.count_matrix(sequences)
    
count_matrix is a numpy array with one row per PB and one column per position. In each cell is the number of time a position was assigned to a PB.
We can visualize count_matrix using Matplotlib as any 2D numpy array.
In [5]:
    
im = plt.imshow(count_matrix, interpolation='none', aspect='auto')
plt.colorbar(im)
plt.xlabel('Position')
plt.ylabel('Block')
    
    Out[5]:
    
    
    
PBxplore provides the :func:pbxplore.analysis.plot_map function to ease the visualization of the occurence matrix.
In [ ]:
    
pbx.analysis.plot_map('map.png', count_matrix)
!rm map.png
    
The :func:pbxplore.analysis.plot_map helper has a residue_min and a residue_max optional arguments to display only part of the matrix. These two arguments can be pass to all PBxplore functions that produce a figure.
In [ ]:
    
pbx.analysis.plot_map('map.png', count_matrix,
                      residue_min=60, residue_max=70)
!rm map.png
    
Note that matrix in the the figure produced by :func:pbxplore.analysis.plot_map is normalized so as the sum of each column is 1. The matrix can be normalized with the :func:pbxplore.analysis.compute_freq_matrix.
In [ ]:
    
freq_matrix = pbx.analysis.compute_freq_matrix(count_matrix)
    
In [ ]:
    
im = plt.imshow(freq_matrix, interpolation='none', aspect='auto')
plt.colorbar(im)
plt.xlabel('Position')
plt.ylabel('Block')
    
In [ ]:
    
neq_by_position = pbx.analysis.compute_neq(count_matrix)
    
neq_by_position is a 1D numpy array with the $N_{eq}$ for each residue.
In [ ]:
    
plt.plot(neq_by_position)
plt.xlabel('Position')
plt.ylabel('$N_{eq}$')
    
The :func:pbxplore.analysis.plot_neq helper ease the plotting of the $N_{eq}$.
In [ ]:
    
pbx.analysis.plot_neq('neq.png', neq_by_position)
!rm neq.png
    
The residue_min and residue_max arguments are available.
In [ ]:
    
pbx.analysis.plot_neq('neq.png', neq_by_position,
                      residue_min=60, residue_max=70)
!rm neq.png
    
In [ ]:
    
pbx.analysis.generate_weblogo('logo.png', count_matrix)
display(Image('logo.png'))
!rm logo.png
    
In [ ]:
    
pbx.analysis.generate_weblogo('logo.png', count_matrix,
                              residue_min=60, residue_max=70)
display(Image('logo.png'))
!rm logo.png