Dynamical Domain Decomposition

Let’s start with essential import statements:

In [1]: from prody import *

In [2]: import numpy as np

We’ll start by parsing the pseudo-atoms from a PDB file generated in the previous step.

In [3]: emd = parsePDB('EMD-1961.pdb')

The order of pseudo-atoms generated by TRN is random and does not follow a sequence like residues in an atomic model do. Nor do they have no chain identifiers.

As an alternative to reordering the pseudo-atoms and assigning residue and chain identifers to the pseudo-atoms based on the PDB structure in the previous section, we demonstrate here the use of dynamical domain decomposition using GNM modes with the function calcGNMDomains(). The number of dynamical domains obtained is approximately equal to the number of modes use so we use 8 modes to get about 8 domains as in our recent paper ([YZ20]).

In [4]: gnm, _ = calcGNM(emd, selstr='all')

In [5]: domains = calcGNMDomains(gnm[:8])

In [6]: print(np.unique(domains))
[0 1 2 3 4 5 6 7 8]

We actually get 9 in this case as you will see in the figure at the end.

We can assign this data to the AtomGroup as follows:

In [7]: emd.setData('domain', domains)

This allows the domains to be used for selection:

In [8]: domain1 = emd.select('domain 1')

In [9]: print(domain1.numAtoms())
199

Finally, we save a domain-labelled pseudo-atom model to a PDB file for visualization and other downstream analyses, using the B-factor field for writing the domains:

In [10]: writePDB('EMD-1961_domains.pdb', emd, beta=domains)
Out[10]: 'EMD-1961_domains.pdb'

Visualisation of the resultant structure will look something like the following figure.

../../_images/EMD-1961_9domains.png

We see 9 domains, including 7 pairs of domains and 2 individual domains.

Another round of decomposition with each of the resulting domains can be used to divide them further. For example, we can decompose the first domain (index 0) into 4 dynamical domains using the first 3 modes, which can be combined to create subunits or used as they are for comparison with dynamical domains for atomic models.

In [11]: gnm0, domain0 = calcGNM(emd, selstr='domain 0')

In [12]: domains0 = calcGNMDomains(gnm0[:3])

In [13]: writePDB('EMD-1961_domain0_subdomains4.pdb', domain0, beta=domains0)
Out[13]: 'EMD-1961_domain0_subdomains4.pdb'