Mostrando entradas con la etiqueta Ramachandran. Mostrar todas las entradas
Mostrando entradas con la etiqueta Ramachandran. Mostrar todas las entradas

7 de febrero de 2019

Introducción a AlphaFold

Hola,
vengo de escuchar a Andrew W Senior en el auditorio Kendrew del EMBL-EBI hablar de cómo funciona AlphaFold para predecir la estructura de proteínas. Como titulaba en Diciembre, todavía no sabemos plegar proteínas, pero cada vez tenemos más información en el Protein Data Bank (del orden de 150K estructuras) para poder predecir distancias entre residuos y ángulos diedros.

Fuente: https://deepmind.com/blog/alphafold

Trataré de resumir lo que nos ha contado antes de que salga el artículo, pero ojo, ha advertido que el código no piensan publicarlo por ahora. Su sistema comprende varios módulos que se ejecutan secuencialmente:

1) Extración de correlaciones evolutivas entre residuos de una secuencia de aminoácidos en forma de modelo de Potts (CCMpred) a partir de perfiles de secuencias homólogas obtenidas con PSIBLAST o HHblits, como hace HHpred.

2) Red neuronal profunda, con al menos dos variantes:
2.1) predicción de distancias reales entre C-betas, no contactos, a partir de histogramas precalculados en el rango de 2 a 22 Ansgtrom. En esto se parecen a RaptorX.
2.2) predicción de ángulos diedros phi y psi

NOTA1: Las predicciones de distancias les permiten asignar estructura secundaria con una precisión Q3  del 84% usando las estructuras de CASP11.

NOTA2: Parten la matriz de contactos en submatrices (crops) que comprenden siempre un trozo de la diagonal principal y esa manera, y con la estructura secundaria, propagan localmente las restricciones de distancias entre residuos cercanos.

3) Diferenciación del potencial de distancias/ángulos por métodos de minimización de gradientes. Lo hacen partiendo la secuencia en dominios o con la secuencia entre y observan que la segunda manera funciona mejor.

4) Relajan el esqueleto obtenido y le añaden cadenas laterales completas con Rosetta. En sus manos esto no mejora el modelo de manera significativa.

Hasta luego,
Bruno




28 de febrero de 2012

Leyendo el diagrama de Ramachandran

Hola,
la semana pasada les planteé a mis alumnos de la Licenciatura en Ciencias Genómicas el problema de asignar estructura secundaria a los residuos de una proteína, una vez medidos los ángulos dihedros del esqueleto peptídico psi y phi. Para esta tarea lo lógico es usar el diagrama de Ramachandran, como éste tomado de la wikipedia:


La solución naive consiste en delimitar las regiones del diagrama por medio de condiciones tales como 'si phi > X  AND psi < Y' entonces un residuo está en estado Z. Sin embargo, para tener mucha precisión sería necesario tener muchas condiciones como ésta, dada las formas irregulares del diagrama.


Una solución interesante, propuesta por F.Peñaloza, consiste en realmente leer el mapa, como lo hacemos nosotros. Lo que él hizo fue obtener un mapa de Ramachadran cuadrado con unos cuantos colores conocidos,

Diamagra de Ramachandran RGB de F.Peñaloza.


Diagrama anterior con los colores RGB empleados

para luego convertirlo a texto ASCII (con algo como text-image). Con este mapa en memoria, es sencillo obtener la estructura secundaria para unas coordenadas phi,psi dadas. 

Aprovechando el módulo GD de perl podemos leer la imagen directamente, como muestra el siguiente código:
 use strict;  
 use GD;  
   
 my $RAMAPLOT = 'ramachandran.png';  
 my $plot = GD::Image->newFromPng($RAMAPLOT);  
 my ($maxpsi,$maxphi) = checkPlot($plot);  
   
 my $inputPSI = 160;   
 my $inputPHI = -45;   
 printf("El estado de estructura secundaria para %s,%s es: %s\n",  
    $inputPSI,$inputPHI, getSimpleSS($maxpsi,$maxphi, $inputPSI,$inputPHI));  
   
 sub getSimpleSS  
 {  
   my ($maxpsi,$maxphi,$psi,$phi) = @_;  
   my %colorSS = (  
     '236,30,36','E',  
     '164,74,164','E',  
     '156,218,236','H',  
     '4,162,236','H',  
     #'180,230,28','L'   
     );  
   
   if($psi > 180 || $psi < -180 || $phi > 180 || $phi < -180)  
   {  
     die "# valid psi/phi are [-180,+180]\n";  
   }  
   $psi = (0.5 - (0.5 * $psi/180)) * $maxpsi;  
   $phi = (0.5 + (0.5 * $phi/180)) * $maxphi;  
     
   my @RGB = $plot->rgb( $plot->getPixel($phi,$psi) );  
   return $colorSS{"$RGB[0],$RGB[1],$RGB[2]"} || 'C';  
 }  
   
 sub checkPlot  
 {  
   my ($plot,$print_pixels) = @_;  
   my ($maxphi,$maxpsi) = $plot->getBounds();  
   if(!$print_pixels){ return ($maxphi,$maxpsi) }  
     
   foreach my $phi ( 0 .. $maxphi )   
   {  
     foreach my $psi ( 0 .. $maxpsi )   
    {  
       my @RGB = $plot->rgb( $plot->getPixel($phi,$psi));  
       print "$RGB[0] $RGB[1] $RGB[2]\n";  
    }  
   }  
   return ($maxphi,$maxpsi);  
 }  

Un saludo, Bruno