Поиск мотива в последовательности белка? - PullRequest
3 голосов
/ 07 мая 2009

Я написал следующий скрипт для поиска мотива (подстроки) в белковых последовательностях (строках). Я новичок, и писать это было тяжело для меня. У меня есть два вопроса относительно одного и того же: 1. Ошибки: в следующем скрипте есть несколько ошибок. Я занимаюсь этим довольно давно, но не понял, что и почему? 2. Следующий скрипт был написан для поиска одного мотива (подстроки) в белковых последовательностях (строках). Моя следующая задача включает поиск нескольких мотивов в определенном порядке (например: мотив1 мотив2 мотив 3 мотив4, этот порядок не может быть изменен) в одних и тех же последовательностях белка (строки)

        use strict;
        use warnings;

        my @file_data=();
        my $motif ='';
        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)=@_;
        use strict;
        use warnings;
        my $sequence='';

        foreach my $line(@file_data){

        if ($line=~ /^\s*$/){
        next;
                }
        elsif ($line=~ /^\s*#/){
        next;
        }
        elsif ($line=~ /^>/){
        next;
        }
        else {
        $sequence.=$line;
        }
        }
        $sequence=~ s/\s//g;
        return $sequence;
        }

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

Ответы [ 2 ]

3 голосов
/ 07 мая 2009
  1. Во-первых, ключевое слово elsif, во-вторых, оно вам не нужно. Вы можете сжать код в цикле get_file_data до:

    next if $line =~ /^\s*$|^>/; 
    $sequence .= $line;
    

    Пока вы собираетесь использовать регулярные выражения - если не слишком громоздки - вы можете также искать все случаи, которые хотите игнорировать. Если вы обнаружите этот фактический второй случай, вы можете добавить его в качестве другого чередования . Допустим, вы хотите исключить строки, начинающиеся с #-. Тогда вы просто добавили бы это так: /^\s*$|^>|^#-/

  2. Другое дело, что my position=(); необходимо иметь символ @, перед позицией или иным образом, Perl думает, что вы пытаетесь сделать что-то хитрое с вызовом position().

  3. Вам необходимы следующие изменения:

     my $h= '[VLIM]';   
     my $s= '[AG]';
     my $x= '[ARNDCEQGHILKMFPSTWYV]';
    

    В противном случае вы просто присваиваете $h ссылку на массив с одним слотом, заполненным тем, что будет возвращено из sub VLIM.

  4. В-третьих, не используйте $&. Заменить pos($sequence)-length($&)+1

    push @positions, $-[0];
    

    или лучше, используйте Английский :

    use English qw<-no_match_vars>;
    ...
    push @positions, $LAST_MATCH_START[0];
    
  5. Я бы предложил следующее для чтения файла:

    use IO::File;
    ...
    # Use real file handles
    my $fh = IO::File->new( "<seq.txt" );
    get_file_data( $fh ); # They can be passed
    ...
    sub get_file_data{
        my $file_handle = shift; 
        ...
        # while loop conserves resources
        while ( my $line = <$file_handle> ) { 
            next if $line =~ /^\s*$|^>/;
            $sequence .= $line;
        } 
    
  6. Предложение идти вперед - мне очень помогает:

    A. Установить Smart :: Комментарии

    B. Поместите это в начало вашего скрипта:

     use Smart::Comments;
    

    C. Каждый раз, когда вы не уверены, что у вас есть, например, если вы хотите увидеть текущее содержимое $sequence, добавьте в код следующее:

    ### $sequence
    exit 0;
    

    просто покажи это и выйди. Если вы получили слишком много распечаток, удалите их.

0 голосов
/ 07 мая 2009
  • Используйте «elsif» вместо «elseif».
  • Должны ли @file_data и @fasta_file_data совпадать?

В match_positions:

  • Снять скобки вокруг имени.
  • Измените "моя позиция" на "моя @ позиция".
  • Изменить шаблон с / regexp / ig на /$regexp/ig.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...