1.1. Interactive exploration#

In this part, we can interactively explore the structures found on the pca landscape. For this, klick the –> Live Code button above and the cells below will run automatically. Click on the PCA plot to see the corresponding 3d structures.

import matplotlib
%matplotlib widget
import numpy as np
import nglview as nv
import pandas as pd
import mdtraj as md
import sklearn as sk
import matplotlib.pyplot as plt

def pickle_load(path):
    """Load object from pickle file, given by path"""
    import pickle
    with open(path, "rb") as f:
        object = pickle.load(f)
    return object


def link_ngl_wdgt_to_ax_pos(ax, pos, ngl_widget):
    """source: https://github.com/gph82/nglview_notebooks"""
    from matplotlib.widgets import AxesWidget
    from scipy.spatial import cKDTree
    r"""
    Initial idea for this function comes from @arose, the rest is @gph82 and @clonker
    """

    kdtree = cKDTree(pos)
    assert ngl_widget.trajectory_0.n_frames == pos.shape[0]
    x, y = pos.T

    lineh = ax.axhline(ax.get_ybound()[0], c="black", ls='--')
    linev = ax.axvline(ax.get_xbound()[0], c="black", ls='--')
    dot, = ax.plot(pos[0,0],pos[0,1], 'o', c='red', ms=7)

    ngl_widget.isClick = False

    def onclick(event):
        linev.set_xdata((event.xdata, event.xdata))
        lineh.set_ydata((event.ydata, event.ydata))
        data = [event.xdata, event.ydata]
        _, index = kdtree.query(x=data, k=1)
        dot.set_xdata((x[index]))
        dot.set_ydata((y[index]))
        ngl_widget.isClick = True
        ngl_widget.frame = index

    def my_observer(change):
        r"""Here comes the code that you want to execute
        """
        ngl_widget.isClick = False
        _idx = change["new"]
        try:
            dot.set_xdata((x[_idx]))
            dot.set_ydata((y[_idx]))
        except IndexError as e:
            dot.set_xdata((x[0]))
            dot.set_ydata((y[0]))
            print("caught index error with index %s (new=%s, old=%s)" % (_idx, change["new"], change["old"]))

    # Connect axes to widget
    axes_widget = AxesWidget(ax)
    axes_widget.connect_event('button_release_event', onclick)

    # Connect widget to axes
    ngl_widget.observe(my_observer, "frame", "change")
    

folder = "test_report/assets/22/"
topology = f"{folder}mc_gas.prmtop"
trajectory = f"{folder}ed6dd3148ef9b069_short-traj.netcdf"
dihedral_file = f"{folder}ed6dd3148ef9b069_dihedrals_short.dat"
dpca_file = f"{folder}ed6dd3148ef9b069_dPCA.dat"
weight_file = f"{folder}ed6dd3148ef9b069_dPCA_weights_MC_short.dat"
traj = md.load(trajectory, top=topology)
# Plot dihedral PCA
dihedrals = pickle_load(dihedral_file)
dpca = pickle_load(dpca_file)
weights = pickle_load(weight_file)
pca_dihedrals = dpca.transform(dihedrals)
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Input In [2], in <cell line: 1>()
----> 1 traj = md.load(trajectory, top=topology)
      2 # Plot dihedral PCA
      3 dihedrals = pickle_load(dihedral_file)

File /opt/hostedtoolcache/Python/3.8.13/x64/lib/python3.8/site-packages/mdtraj/core/trajectory.py:396, in load(filename_or_filenames, discard_overlapping_frames, **kwargs)
    394 topkwargs.pop("stride", None)
    395 topkwargs.pop("start", None)
--> 396 kwargs["top"] = _parse_topology(kwargs.get("top", filename_or_filenames[0]), **topkwargs)
    398 #get the right loader
    399 try:
    400     #loader = _LoaderRegistry[extension][0]

File /opt/hostedtoolcache/Python/3.8.13/x64/lib/python3.8/site-packages/mdtraj/core/trajectory.py:177, in _parse_topology(top, **kwargs)
    175     topology = _traj.topology
    176 elif isinstance(top, (string_types, os.PathLike)) and (ext in ['.prmtop', '.parm7', '.prm7']):
--> 177     topology = load_prmtop(top, **kwargs)
    178 elif isinstance(top, (string_types, os.PathLike)) and (ext in ['.psf']):
    179     topology = load_psf(top, **kwargs)

File /opt/hostedtoolcache/Python/3.8.13/x64/lib/python3.8/site-packages/mdtraj/formats/prmtop.py:123, in load_prmtop(filename, **kwargs)
    120 raw_data   = {}
    121 ignoring = False
--> 123 with open(filename, 'r') as f:
    124     for line in f:
    125         if line[0] == '%':

FileNotFoundError: [Errno 2] No such file or directory: 'test_report/assets/22/mc_gas.prmtop'
v = nv.show_mdtraj(traj)
v.clear_representations()
v.add_representation('licorice')
fig, ax = plt.subplots()
link_ngl_wdgt_to_ax_pos(ax, pca_dihedrals, v)
ax = plt.scatter(pca_dihedrals[:,0], pca_dihedrals[:,1])
v