durante la reciente visita de mi colega Pablo Vinuesa al laboratorio pasamos ratos escribiendo código en Perl con el fin de diseñar de manera automática, para grandes conjuntos de secuencias de DNA previamente alineadas, parejas de primers (cebadores de PCR) adecuadas para estudios de microbiología ambiental, siguiendo principios bien conocidos ya. En cuanto probamos el código con unos cuantos ejemplos observamos que a menudo los primers para algunas regiones de los alineamientos múltiples eran degenerados. Como se muestra en la figura, eso significa que algunas posiciones de los cebadores no podían ser nucleótidos únicos si no que tenían que ser combinaciones de 2 o más para poder hibridarse con las secuencias utlizadas para su diseño.
Pareja de primers degenerados que definen un amplicón a partir de secuencias de DNA alineadas. De acuerdo con la nomenclatura IUPAC, el de la izquierda (fwd) puede escribirse como GAYTST y el de la derecha (rev) como GHGKAG. Figura tomada de http://acgt.cs.tau.ac.il/hyden. |
#!/usr/bin/perl
use strict;
my $degenerate_sequence = $ARGV[0] || die "# usage: $0 <degenerate DNA sequence>\n";
my $regenerated_seqs = regenerate($degenerate_sequence);
foreach my $seq (@$regenerated_seqs)
{
print "$seq\n";
}
# returns a ref to list of all DNA sequences implied in a degenerate oligo
# adapted from Amplicon (Simon Neil Jarman, http://sourceforge.net/projects/amplicon)
sub regenerate
{
my ($primerseq) = @_;
my %IUPACdegen = (
'A'=>['A'],'C'=>['C'], 'G'=>['G'], 'T'=>['T'],
'R'=>['A','G'], 'Y'=>['C','T'], 'S'=>['C','G'], 'W'=>['A','T'], 'K'=>['G','T'], 'M'=>['A','C'],
'B'=>['C','G','T'], 'D'=>['A','G','T'], 'V'=>['A','C','G'], 'H'=>['A','C','T'],
'N'=>['A','C','G','T']
);
my @oligo = split(//,uc($primerseq));
my @grow = ('');
my @newgrow = ('');
my ($res,$degen,$x,$n,$seq);
foreach $res (0 .. $#oligo){
$degen = $IUPACdegen{$oligo[$res]};
if($#{$degen}>0){
$x = 0;
@newgrow = @grow;
while($x<$#{$degen}){
push(@newgrow,@grow);
$x++;
}
@grow = @newgrow;
}
$n=$x=0;
foreach $seq (0 .. $#grow){
$grow[$seq] .= $degen->[$x];
$n++;
if($n == (scalar(@grow)/scalar(@$degen))){
$n=0;
$x++;
}
}
}
return \@grow;
}
Podemos probarlo con las secuencias de la figura:
$ perl degenprimer.pl GAYTST
GACTCT
GATTCT
GACTGT
GATTGT
y
$ perl degenprimer.pl GHGKAG
GAGGAG
GCGGAG
GTGGAG
GAGTAG
GCGTAG
GTGTAG
Hasta otra,
Bruno