Manejo de trayectorias con pytraj

Como primer paso vamos a cargar los datos de la trayectoria de la DM, considerando cada una de las fases realizadas.
Para ello, comenzamos importando el módulo pytraj.

A continuación, cargamos la estructura inicial de la porteína, que corresponde a la conformación lineal a partir de la cual realizamos la minimización y la dinámica molecular.
Observa que la función pyt.load() recibe los parámetros filename y top correspondientes al archivo de coordenadas y de topología, respectivamente.

Ahora, si llamamos a la variable cristal_strc, veremos que ésta corresponde a un objeto pytraj.Trajectory con los siguientes atributos:

## pytraj.Trajectory, 1 frames: 
## Size: 0.000007 (GB)
## <Topology: 304 atoms, 20 residues, 1 mols, non-PBC>
## 

Visualización de la esturctura

Recordemos que podemos utilizar la librería nglview para visualizar la estructura de la proteína:

Carga de la trayectoria

Ahora, vamos a proceder a cargar en memoria los archivos de trayectoria dcd de todas las fases de la dinámica. Para ello, es necesario primero definir el archivo de topología que utilizaremos.

## <Topology: 18869 atoms, 6209 residues, 6190 mols, non-PBC>

Este archivo de topoligía incluye a todas las molécuals del sistema, sin embargo, por ahora sólo nos interesa analizar la trayectoria de la proteína, por lo que redefiniremos el archivo de topología para que sólo incluya los átomos de la misma (los primeros 20 residuos del sistema).

## <Topology: 304 atoms, 20 residues, 1 mols, non-PBC>

Ahora procederemos a cargar los archivos dcd. Sin embargo, para este análisis cargaremos archivos dcd a los cuales se les ha removido el solvente, con el objetivo de reducir el tamaño de los archivos y poder distribuirlos en línea.
A continuación mostramos el ejemplo de cómo se generaron estos archivos “reducidos” a partir de los dcd originales.

## pytraj.Trajectory, 1 frames: 
## Size: 0.000422 (GB)
## <Topology: 18869 atoms, 6209 residues, 6190 mols, non-PBC>
## 
## Archivo guardado:
## pytraj.Trajectory, 1 frames: 
## Size: 0.000007 (GB)
## <Topology: 304 atoms, 20 residues, 1 mols, non-PBC>
## 

Archivos .dcd

Ahora ubicamos el directorio y nombre de cada uno de los archivos dcd. Esto incluye también al archivo .pdb con la estructura inicial.

Ahora cargamos cada uno de los archivos utilizando el objeto de topología top_psf. Como ejemplo puedes ver que también es posible usar el parámetro mask para determinar qué átomos deberán ser considerados al cargarse en memoria. Sin embargo, podemos omitirlo en las fases de minimización en adelante, ya que esta selección de los átomso de laproteína ya la hicimos al cargar el archivo de topología.

## Estructura inicial: 1 frames
## Minimización: 1 frames
## Calentamiento: 96 frames
## Equilibrado: 250 frames
## Producción: 5000 frames

Además de cargar los archivos, hemos usado el atributo n_frames que nos dice cuántos frames posee cada tryectoria. En python es posible utilizar las funciones type() y dir() para conocer qué métodos y atributos posee un objeto según la clase a que pertenece.

## <class 'pytraj.trajectory.trajectory.Trajectory'>
## ['__add__', '__call__', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_allocate', '_append_unitcells', '_boxes', '_estimated_GB', '_frame_holder', '_handle_setting_box_force_velocity', '_iterframe_indices', '_life_holder', '_top', '_xyz', 'align_principal_axis', 'append', 'append_xyz', 'autoimage', 'center', 'copy', 'forces', 'from_iterable', 'iterframe', 'load', 'n_atoms', 'n_frames', 'rmsfit', 'rotate', 'save', 'scale', 'shape', 'strip', 'superpose', 'time', 'top', 'topology', 'transform', 'translate', 'unitcells', 'velocities', 'view', 'visualize', 'xyz']

Concatenación de las trayectorias

Ahora, con el objetivo de ver la evolución conformacional de la proteína a lo largo de todas las fases, vamos a unir todas las trayectorias en una sola. Esto también nos permitirá guardar una única trayectoria para posteriores análisis.
Primero generamos una lista con los objetos de trayectoria:

El siguiente paso es usar la lista traj_list para iterar sobre sus elementos.
Para ello vamos utilizar una expresión conosida como list comprehension. Por ahora las usaremos para uardar en una nueva lista el número de frames de cada fase.

## [1, 96, 250, 5000]
## Número total de frames: 5347

Ahora crearemos un nuevo objeto Trajectory inicializándolo como una copia del objeto init_struct, al que iremos añadiendo las coordenadas de los objetos de la lista trajs_list usando el método append_xyz:

## pytraj.Trajectory, 5348 frames: 
## Size: 0.036339 (GB)
## <Topology: 304 atoms, 20 residues, 1 mols, non-PBC>
## 

Superposición de las estructuras

Primero vamos a superponer todas las conformaciones de la proteína. Para ello, el método superpose realiza moviemientos translacionales y rotacionales de forma iterativa minimizando el RMSD entre todas las confromaciones. Observa que el alineamiento lo realizaremos considerando los carbonos alfa únicamente de los residuos 4 a 17, es decir, hemos omitido los primeros y los últimos tres reiduos de la proteína. Si lo deseas puedes reducir o extender esta selección.

## pytraj.Trajectory, 5348 frames: 
## Size: 0.036339 (GB)
## <Topology: 304 atoms, 20 residues, 1 mols, non-PBC>
## 

Guardando el archivo de tryectoria

Como vimos en el ejemplo de la tayectoria de la minimización, podemos usar la función write_traj(). Observa qué parámetros se requieren para guardar el nuevo archivo.

Visualización de la trayectoria

Podemos usar nglview para visualizar la tryectoria con los frames superpuestos.