# Core Calculations¶

In order to infer signature dynamics features we create mode ensembles from the
PDB ensembles by calculating normal modes for each member of the
`PDBEnsemble`

as in the previous page or [SZ18].

First, make necessary imports from ProDy and Matplotlib packages if you haven’t already.

```
In [1]: from prody import *
In [2]: from pylab import *
In [3]: ion()
```

## Mode Ensemble¶

For this analysis we’ll use the `PDBEnsemble`

object,
which we just created, to build a `ModeEnsemble`

.
There are options to select the model (`GNM`

by default) and the way of
considering non-aligned residues (default is `reduceModel()`

, which treats
them as environment).

If necessary, we first load the ensemble:

```
In [4]: ens = loadEnsemble('LeuT.ens.npz')
```

Then we calculated first 20 GNM modes for each member of the ensemble:

```
In [5]: gnms = calcEnsembleENMs(ens, model=GNM, trim='reduce', n_modes=20, match=True)
In [6]: gnms
Out[6]: <ModeEnsemble: 103 modesets (20 modes, 510 atoms)>
```

In this way, we will obtain one `ModeSet`

for each member and 85 in total.
Finding a consistent order of modes across different mode sets is critical to the
accuracy of SignDy calculations. Therefore, in the above code, *match* is set
to *True* so that all other ```
ModeSet`s are sorted to match the order of
the reference :class:
```

.ModeSet`, which is the first `ModeSet`

in the
`ModeEnsemble`

by default.

## Signature Dynamics¶

Signature dynamics are calculated as the mean and standard deviation of various properties such as mode shapes and mean square fluctations.

For example, we can show the average and standard deviation of the shape of the first mode (second index 0). The first index of the mode ensemble is over conformations.

In the plot, the curve shows the mean values, the darker shade shows the standard deviations, and the lighter shade shows the range (minimum and maximum values). We can also show such things for properties involving multiple modes such as the mean square fluctuations from the first 5 modes,

or the cross-correlations from the first 20.

We can also look at distributions over values across different members of the ensemble such as inverse eigenvalue. We can show a bar above this with individual members labelled like [JK15].

In [10]: highlights = {'2A65A': 'LeuT:OF', '3TT3A': 'LeuT:IF'} In [11]: from matplotlib.gridspec import GridSpec In [12]: gs = GridSpec(ncols=1, nrows=2, height_ratios=[1, 10], hspace=0.15) In [13]: subplot(gs[0]); In [14]: showVarianceBar(gnms[:, :5], fraction=True, highlights=highlights); In [15]: xlabel(''); In [16]: subplot(gs[1]); In [17]: showSignatureVariances(gnms[:, :5], fraction=True, bins=80, alpha=0.7); In [18]: xlabel('Mode weight');

## Saving the ModeEnsemble¶

Finally we save the mode ensemble for later processing:

```
In [19]: saveModeEnsemble(gnms, 'LeuT')
Out[19]: 'LeuT.modeens.npz'
```