Leyendo archivos Protein Data Bank (PDB)

El Protein Data Bank es un repositorio de descripciones experimentales de las estructuras moleculares de proteínas y ácidos nucleicos resueltos hasta el momento. Cada descripción es un archivo de texto que contiene las coordenadas atómicas de la molécula en cuestión en un formato que se llama PDB.

Aquí podéis ver un ejemplo sencillo, la estructura de una proteína reguladora de ratón en complejo con una molécula de ADN, en el archivo 1lfu.pdb. Podéis desplegar esta molécula con programas como Rasmol y, en cualquier caso, debéis abrir este archivo con vuestro editor de texto para verle las tripas.

Figura 2.1: Representación de Rasmol del archivo PDB 1LFU.
\begin{figure}
\begin{center}
\includegraphics[width=0.8\textwidth]{1lfu}
\end{center}
\end{figure}

En este ejemplo es muestro el programa extraeProtPDB.pl que lee un archivo PDB, como 1lfu.pdb y separa el esqueleto peptídico ( backbone ) de las proteínas presentes y las deposita en un nuevo archivo.

#!/usr/bin/perl -w 
# Ejemplo escrito por Bruno Contreras

# Programa extraeProtPDB.pl que lee un archivo PDB pasado como argumento, 
# separa el esqueleto peptidico de las proteinas presentes y lo deposita
# en formato PDB en un archivo llamado esqueleto.pdb
# Ojo: se puede hacer con Bioperl (mirar en indice del curso):
#http://www.bioperl.org/wiki/Bptutorial.pl#Using_3D_structure_objects_and_reading_PDB_files_.28StructureI.2C_Structure::IO.29

use strict; 

## variables importantes ###########################################################

my ($archivoPDB,$nombre_atomo,@esqueleto);

## revisa los argumentos pasados al invocar el programa ############################
if(scalar(@ARGV) < 1)
{	
	die "uso: extraeProtPDB.pl <archivoPDB>\n";	
}
else 
{	
	$archivoPDB = $ARGV[0];	# lee el nombre del argumento y asígnalo a  
}


## abre $archivoPDB en modo lectura y lo recorre 
open(PDB,$archivoPDB) || die "# no puedo abrir $archivoPDB\n";
while(<PDB>)
{
	if(/^ATOM/) # lineas de coordenadas atomicas
	{
		$nombre_atomo = substr($_,13,4); # toma el nombre del atomo
		                                 # en el formato PDB
	
	 	# toma los atomos correspondientes al esqueleto peptidico: N,CA,C,O
		if($nombre_atomo =~ /N / || $nombre_atomo =~ /CA/ || $nombre_atomo =~ /C /|| $nombre_atomo =~ /O /)
	 	{
			push(@esqueleto,$_);
		}
	}
}
close(PDB);

# crea un nuevo archivo para guardar las coordenadas del esqueleto peptidico ###
open(ESQPDB,">esqueleto.pdb") || die "lo siento, no puedo crear esqueleto.pdb\n";

print ESQPDB "HEADER esqueleto peptidico de $archivoPDB\n";
print ESQPDB @esqueleto;

close(ESQPDB);

Ahora, como ejercicio, os pido que modifiquéis este programa para que cree una cadena de caracteres con la secuencia de la proteína 1lfu.pdb en código de una letra. Por ejemplo, Ala deberá ser 'A' y Trp 'W'. El programa deberá además crear un nuevo archivo e imprimir dentro la secuencia en formato FASTA, como el que vísteis en 2.7.5.

Bruno Contreras-Moreira
http://www.eead.csic.es/compbio