Página 1 de 1

ADN y partes codificantes

NotaPublicado: 2009-07-28 08:25 @392
por leire_12
¡Hola!

Tengo una cadena de ADN y los CDS que me indican cuáles son las partes codificantes. Los CDS vienen de tres formas diferentes:

Intervalo único
Ejemplo:
CDS 50878..51332

Intervalos combinados que dan lugar a una única secuencia codificante
Ejemplo 1:
CDS join(53022..53183,53484..53624,53703..54494)
Ejemplo 2:
CDS join(23519..24451,24542..24655,24752..24962,25041..25435,
25524..25743,25825..25997,26081..26203,26292..26452,
26543..26776,26862..27012,27099..27281,27372..27533,
27618..27713,27803..28431,28708..28805,28890..29080,
29160..30065,30147..30311,30410..30816,30902..31079)


En este caso, la secuencia codificante, será la unión de todos los intervalos que aparecen entre paréntesis.

Entradas únicas o combinadas indicando que la secuencia codificante se
encuentra en la cadena complementaria

Ejemplo 1:
CDS complement(57392..58978)
Ejemplo 2:
CDS complement(join(61963..62124,63431..63811))

Tengo los CDS aislados pero no se me ocurre cómo podría hacer para quedarme solo con la parte codificante de la cadena de ADN utilizando la información de estos CDS. ¿Me podríais ayudar? ¡Muchas gracias!

Re: ADN y partes codificantes

NotaPublicado: 2009-07-28 09:30 @437
por explorer
El asunto no es trivial, debido a la naturaleza del significado de complement y join. Por ejemplo, ¿qué significa complement? Si la secuencia real es la complementaria de la indicada, ¿cómo se realiza esa operación?

De momento, mira hilos en los que ya se ha discutido este tema:
* Fichero GenBank
* Extraer datos de una cadena de caracteres (GenBank)

Re: ADN y partes codificantes

NotaPublicado: 2009-07-28 09:56 @455
por leire_12
Ya he mirado esos dos archivos pero no me han aclarado mucho. join significa que hay que ir juntando todos los trozos de la cadena que corresponden a esas posiciones. Por ejemplo, en el caso de join(12..34, 78..99) habría que coger las posiciones de la 12 a la 34 y de la 78 a la 99 y unirlas. complement significa que una vez extraída la cadena correspondiente a los números que se indica, habrá que hacer la complementaria.

Re: ADN y partes codificantes

NotaPublicado: 2009-07-28 13:47 @616
por explorer
Bien. Y yo te he preguntado qué significa sacar la complementaria.

Re: ADN y partes codificantes

NotaPublicado: 2009-07-28 13:58 @623
por leire_12
Sacar la complementaria significa que si la cadena t ha quedado AGTC, hay que cambiar A por T y viceversa y G por C y viceversa por lo que quedaría TCAG. Pero mi problema es cómo obtener la cadena codificante con la información de los CDS.

Re: ADN y partes codificantes

NotaPublicado: 2009-07-28 20:38 @901
por explorer
Bueno, he realizado un programa que creo que hace esa tarea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
#
# Extracción de la secuencia de las partes codificantes (CDS)
# Joaquín Ferrero. Julio 2009
#
use strict;
use warnings;
use diagnostics;

my $seq = join '', qw(
    aagaggaggaaggaagatgcgagaaggcagaggaggagggagggagggaaggagcgcgga
    gcccggcccggaagctaggagccattccgtagtgccatcccgagcaacgcactgctgcag
    cttccctgagcctttccagcaagtttgttcaagattggctgtcaagaatcatggactgtt
    attatatgccttgttttctgtcaagacaccatgattcctggtaaccgaatgctgatggtc
    gttttattatgccaagtcctgctaggaggcgcgagccatgctagtttgatacctgagacg
    gggaagaaaaaagtcgccgagattcagggccacgcgggaggacgccgctcagggcagagc
    catgagctcctgcgggacttcgaggcgacacttctgcagatgtttgggctgcgccgccgc
    ccgcagcctagcaagagtgccgtcattccggactacatgcgggatctttaccggcttcag
    tctggggaggaggaggaagagcagatccacagcactggtcttgagtatcctgagcgcccg
    gccagccgggccaacaccgtgaggagcttccaccacgaagaacatctggagaacatccca
    gggaccagtgaaaactctgcttttcgtttcctctttaacctcagcagcatccctgagaac
    gaggtgatctcctctgcagagcttcggctcttccgggagcaggtggaccagggccctgat
    tgggaaaggggcttccaccgtataaacatttatgaggttatgaagcccccagcagaagtg
    gtgcctgggcacctcatcacacgactactggacacgagactggtccaccacaatgtgaca
    cggtgggaaacttttgatgtgagccctgcggtccttcgctggacccgggagaagcagcca
    aactatgggctagccattgaggtgactcacctccatcagactcggacccaccagggccag
    catgtcaggattagccgatcgttacctcaagggagtgggaattgggcccagctccggccc
    ctcctggtcacctttggccatgatggccggggccatgccttgacccgacgccggagggcc
    aagcgtagccctaagcatcactcacagcgggccaggaagaagaataagaactgccggcgc
    cactcgctctatgtggacttcagcgatgtgggctggaatgactggattgtggccccacca
    ggctaccaggccttctactgccatggggactgcccctttccactggctgaccacctcaac
    tcaaccaaccatgccattgtgcagaccctggtcaattctgtcaattccagtatccccaaa
    gcctgttgtgtgcccactgaactgagtgccatctccatgctgtacctggatgagtatgat
    aaggtggtactgaaaaattatcaggagatggtagtagagggatgtgggtgccgctgagat
    caggcagtccttgaggatagacagatatacacaccacacacacacaccacatacaccaca
    cacacacgttcccatccactcacccacacactacacagactgcttccttatagctggact
    tttatttaaaaaaaaaaaaaaaaaaggaaaaaatccctaaacattcaccttgaccttatt
    tatgactttacgtgcaaatgttttgaccatattgatcatatattttgacaaaatatattt
    ataactacgtattaaaagaaaaaaataaaatgagtcattattttaaaggtaaaaaaaaaa
    aaaaaaaa
);

my $cds = 'join(345..389,400..567,500..523)join(85..460,490..506)complement(join(675..679,789..797))';

print length $seq;

my $extracto = $cds;            # Inicializamos el extracto al valor inicial del CDS
my $extracto_anterior = '';     # Esta nos servirá para ver los cambios entre cada ciclo
print $extracto;

my $BASES   = qr/[catg]+/;      # Expresión regular que define cómo son las bases
my $INDICES = qr/\d+/;          # Expresión regular que define cómo son los índices

while ($extracto_anterior ne $extracto) {          # Mientras existan cambios ...
    $extracto_anterior =  $extracto;                   # Guardamos el estado actual

    ## Empezamos a modificar el $extracto
    # Rangos de índices, sustituidos por la cadena de la secuencia
    $extracto =~ s/($INDICES)\.\.($INDICES)/substr($seq,$1-1,$2-$1+1)/ge;

    # Cadenas de bases contiguas, quitamos las comas
    $extracto =~ s/($BASES),($BASES)/$1$2/g;

    # Eliminación de join(). Nos quedamos solo con las bases
    $extracto =~ s/join\(($BASES)\)/$1/g;

    # Eliminación de complement(). Lo sustituimos por la complementaria
    $extracto =~ s/complement\(($BASES)\)/complement($1)/ge;
}

print $extracto;

sub complement {        # Cálculo de la complementaria
    my $subseq = shift;
    $subseq =~ tr/CATGcatg/GTACgtac/;    # Cambio letra a letra
    return $subseq;
}

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Lo que hace es un bucle en el que repetimos el proceso de transformar la secuencia CDS en la secuencia que queremos extraer. Para ello, aplicamos expresiones regulares de forma reiterada, hasta que salimos del bucle porque no detectamos ningún cambio más.

Las cuatro expresiones regulares son: a) sustitución de los rangos de índices por la cadena de las bases dentro de la secuencia. b) eliminación de las comas entre dos cadenas de bases. c) eliminación del operador join() cuando ya no es necesario (solo hay una secuencia de bases dentro de él). Y d) ejecución de la complementaria de una secuencia.

Re: ADN y partes codificantes

NotaPublicado: 2009-07-30 13:40 @611
por leire_12
El programa me funciona pero no me quedan claro los conceptos de extracto y extracto anterior y la condición del bucle. ¿Me lo podrías explicar?

En las expresiones qr/[catg]+/ y qr/\d+/ ¿qué significan qr y +?
Y en las expresiones regulares del final ¿por qué algunas llevan una e?

¡Muchas gracias!

Re: ADN y partes codificantes

NotaPublicado: 2009-07-30 18:07 @797
por explorer
El objeto del programa es traducir el $cds a la secuencia extraída desde $seq.

La secuencia extraída la guardaré en $extracto. Al principio, su valor es igual al de $cds. En cada vuelta, haré un cambio en $extracto. Y para saber que he terminado, necesito saber si no ha habido cambios de la vuelta anterior a la situación actual de $extracto. Por esa razón necesito guardar el estado de $extracto en $extracto_anterior, para saber si ha habido cambios.

Si no hubo cambios (toda la secuencia de CDS ha sido traducida a extractos de la $seq) entonces no hay diferencias entre las dos variables $extracto. Y ahí terminamos.

qr() sirve para definir expresiones regulares, o patrones de búsqueda, que usaremos después para buscar patrones.

+ quiere decir 'uno o más'. Tienes un resumen muy bueno en el artículo de Expresiones regulares de Wikipedia. Y en la documentación Perl, en perlre.

Finalmente, la opción /e indica que la segunda parte del operador sustitución no es un literal, sino que Perl debe ejecutarla como una sentencia más del programa. El resultado de esa sentencia será lo que sustituya al patrón encontrado.

Más información en perlop, sección Regexp-Quote-Like-Operators, subapartado del operador s///.

Re: ADN y partes codificantes

NotaPublicado: 2009-07-31 08:45 @406
por leire_12
¡Muchas gracias! ¡Ya está solucionado!