2009-05-06 8 views
6

Le script suivant sert à trouver un motif dans une séquence protéique.Comment puis-je trouver plusieurs motifs (sous-chaîne) dans une séquence de protéines (chaîne)?

use strict; 
use warnings; 

my @file_data=(); 
my $protein_seq=''; 
my $h= '[VLIM]'; 
my $s= '[AG]'; 
my $x= '[ARNDCEQGHILKMFPSTWYV]'; 
my $regexp = "($h){4}D($x){4}D"; #motif to be searched is hhhhDxxxxD 
my @locations=(); 

@file_data= get_file_data("seq.txt"); 

$protein_seq= extract_sequence(@file_data); 

#searching for a motif hhhhDxxxxD in each protein sequence in the give file 

foreach my $line(@file_data){ 
    if ($motif=~ /$regexp/){ 
     print "found motif \n\n"; 
     } else { 
     print "not found \n\n"; 
    } 
} 
#recording the location/position of motif to be outputed 

@locations= match_position($regexp,$seq); 
if (@locations){ 
    print "Searching for motifs $regexp \n"; 
    print "Catalytic site is at location:\n"; 
    } else { 
    print "motif not found \n\n"; 
} 
exit; 

sub get_file_data{ 
    my ($filename)[email protected]_; 
    use strict; 
    use warnings; 
    my $sequence=''; 

    foreach my $line(@fasta_file_data){ 
     if ($line=~ /^\s*(#.*)?|^>/{ 
      next; 
      } 
     else { 
      $sequence.=$line; 
     } 
    } 
    $sequence=~ s/\s//g; 
    return $sequence; 
} 

sub(match_positions) { 
    my ($regexp, $sequence)[email protected]_; 
    use strict; 
    my @position=(); 
    while ($sequence=~ /$regexp/ig){ 
     push (@position, $-[0]); 
    } 
    return @position; 
} 

Je ne sais pas comment étendre ce pour trouver des motifs multiples (dans un ordre fixe i.e. motif1, motif2, motif3) dans un fichier donné contenant une séquence protéique.

+0

Votre code semble avoir quelques problèmes. En ligne 19, vous déclarez $ line, mais il n'est jamais utilisé. Dans la ligne 20, $ motif est toujours '', puisque cela n'a jamais changé depuis sa déclaration. Dans la ligne 43, vous enchaînez des elsifs, mais ce que vous semblez vraiment vouloir, c'est 'if ($ line = ~/^ \ s * $/ou $ line = ~/^ \ s * #/ou $ line = ~/^ > /) {next; } else {$ sequence. = $ line; }; ', ou mieux:' if ($ line = ~/^\s*(#.*)?|*>/) {next; } else {$ sequence. = $ line; }; '. Je ne sais pas ce que les parenthèses sont censées faire dans 'sub (match_positions) ...'. – Svante

Répondre

2

Vous pouvez simplement utiliser des alternatives (délimitées par |) des séquences. De cette façon, chaque séquence que le moteur regex peut égaler le fera.

/($h{4}D$x{4}D|$x{1,4}A{1,2}$s{2})/ 

Ensuite, vous pouvez tester ce match en regardant $1.

0

Si vous voulez trouver ces motifs dans un ordre particulier mais peut-être séparés un peu, vous pouvez utiliser quelque chose comme:.

/$h{4}D$x{4}D .* $s{4}D$q{4}/x 

(/ x permet d'espaces dans l'expression régulière, * correspond à zéro ou plusieurs caractères

0

êtes-vous à la recherche de sous-chaînes? Si c'est le cas, quelques regex vont probablement vous amener là où vous devez aller. mais ces types de problèmes ont tendance à s'intensifier rapidement, très probablement dans l'ensemble des problèmes de la semaine prochaine. Si c'est le cas, et que vous aurez besoin de faire des comparaisons, vous devrez probablement commencer à chercher des algorithmes d'alignement dynamique, une distance d'édition minimale, un alignement de Viterbi, des hmms et autres.

aussi, si vous faites affaire avec de gros fichiers d'entrée, vous pouvez regarder dans votre pré-compilation regexes pour un bon coup de pouce de vitesse,

perl pre-compiled regexes

+0

Non, il ne cherche pas seulement des sous-chaînes. Jetez un oeil à ses classes regex. – Axeman

Questions connexes