2011-11-22 2 views
1

나는 상보적인 가닥을 생성 할 수있는 DNA 서열을 읽을 수있는 프로그램을 만들었으며, 이는 mRNA로 번역됩니다. 그러나 그 DNA에 대한 가능한 가장 긴 독서 프레임을 찾아야합니다. 코딩을했는데 문장을 출력 할 때 대답이 없습니다. 도움?Perl을 사용하여 가장 큰 오픈 리딩 프레임 찾기

이것은 내가 가지고있는 것입니다.

# Search for the longest open reading frame for this DNA. 
print "\nHere is the largest ORF, from 5' to 3':\n" ; 
local $_ = $RNA_seq ; 
while (/ AUG /g) { 
    my $start = pos() - 2 ; 
    if (/ UGA|UAA|UAG /g) { 
     my $stop = pos ; 
     $gene = substr ($_ , $start - 1 , $stop - $start + 1), $/ ; 
     print "$gene" ; 
    } 
} 

# The next set of commands translates the ORF found above for an amino acid seq. 
print "\nThe largest reading Frame is:\t\t\t" . $protein { "gene" } . "\n" ; 
sub translate { 
    my ($gene , $reading_frame) = @_ ; 
    my %protein =(); 
    for ($i = $reading_frame ; $i < length ($gene); $i += 3) { 
     $codon = substr ($gene , $i , 3); 
     $amino_acid = translate_codon($codon); 
     $protein { $amino_acid }++; 
     $protein { "gene" } .= $amino_acid ; 
    } 
    return %protein ; 
} 

sub translate_codon { 
if ($_ [ 0 ] =~/GC[AGCU] /i)    { return A;} # Alanine; 
if ($_ [ 0 ] =~/UGC|UGU /i)    { return C;} # Cysteine 
if ($_ [ 0 ] =~/GAC|GAU /i)    { return D;} # Aspartic Acid; 
if ($_ [ 0 ] =~/GAA|GAG /i)    { return Q;} # Glutamine; 
if ($_ [ 0 ] =~/UUC|UUU /i)    { return F;} # Phenylalanine; 
if ($_ [ 0 ] =~/GG[AGCU] /i)    { return G;} # Glycine; 
if ($_ [ 0 ] =~/CAC|CAU /i)    { return His;} # Histine (start codon); 
if ($_ [ 0 ] =~/AU[AUC] /i)    { return I;} # Isoleucine; 
if ($_ [ 0 ] =~/AAA|AAG /i)    { return K;} # Lysine; 
if ($_ [ 0 ] =~/UUA|UUG|CU[AGCU] /i)  { return Leu;} # Leucine; 
if ($_ [ 0 ] =~/AUG /i)     { return M;} # Methionine; 
if ($_ [ 0 ] =~/AAC|AAU /i)    { return N;} # Asparagine; 
if ($_ [ 0 ] =~/CC[AGCU] /i)    { return P;} # Proline; 
if ($_ [ 0 ] =~/CAA|CAG /i)    { return G;} # Glutamine; 
if ($_ [ 0 ] =~/AGA|AGG|CG[AGCU] /i)  { return R;} # Arginine; 
if ($_ [ 0 ] =~/AGC|AGU|UC[AGCU] /i)  { return S;} # Serine; 
if ($_ [ 0 ] =~/AC[AGCU] /i)    { return T;} # Threonine; 
if ($_ [ 0 ] =~/GU[AGCU] /i)    { return V;} # Valine; 
if ($_ [ 0 ] =~/UGG /i)     { return W;} # Tryptophan; 
if ($_ [ 0 ] =~/UAC|UAU /i)    { return Y;} # Tyrosine; 
if ($_ [ 0 ] =~/UAA|UGA|UAG /i)   { return "***" ;} # Stop Codons; 
} 

내가 누락 된 것이 있습니까?

+0

을 당신은 너무 빨리 당신의 정지 코돈을 찾는 : 단순히 고려 여담으로 \s 를 사용하기보다는 $_ [0]를 사용 예술 코돈. –

답변

5

는 코드의 시작 부분에

use strict; 
use warnings; 

을 넣어 :이 문제

return A; 

와 일반적으로

당신이하지문자열하지만 파일 핸들을 반환하는 감지하는 데 도움이 될 것입니다 , 문자열을 반환하려는 경우

return 'A'; 
2

BioPerl을 확인한 적이 있습니까? 확인하지는 않았지만 필요한 기능이 이미 포함되어있을 수도 있습니다. 또는 현재 자신이 직접 프로그램을 작성해야하는 과제를 수행하고 있습니까?

편집

난 당신이 게시 한 코드의 첫 번째 부분에 대해 매우 확실하지 않다. 예를 들어, 정규식 내에 공백이 있습니다. 실제로 일치시키려는 문자열에 해당 공백이 포함되어 있습니까? 아니면 모두 함께 쓰여진 코돈입니까? AUGCCGGAUGA? 후자의 경우에는 비록 당신이 찾고있는 코돈이 존재하더라도 (나는 아마도 당신이 알고있는 것을 말하고있을 것이다.) 나는 단지 이것을 지적하고 싶다. :)).

또한 pos 코드의 기능은 무엇입니까?

한가지 더 : 당신은 $_을 설정하지 않아도 당신은 단순히 너무 같은 패턴에 대해 $RNA_seq을 일치시킬 수 있습니다 : 나는 조금 생각했습니다 2

if ($RNA_seq =~ m/UGA/) { # ... 

편집 첫 번째 섹션에 대한 자세한 내용을 보려면 index 함수를 사용하는 것이 좋습니다. 즉, 시퀀스 내에서 즉시 위치를 제공하기 때문입니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
use List::Util qw(min); 

my $string = 'UGAAUGGGCCAUAUUUGACUGAGUUUCAGAUGCCAUUGGCGAUUAG'; 
# the genes:  *-------------*   *---------------* 

my $prev = -1; 
my @genes; 

while (1) { 
    my $start = index($string, 'AUG', $prev+1); 
    my $stop = min grep $_ > -1, (index($string, 'UGA', $start+1), index($string, 'UAA', $start+1), 
            index($string, 'UAG', $start+1)); 

    # exit the loop if index is -1, i.e. if there was no more match 
    last if ($start < 0 or $stop < 0); 

    # using +1 so that 'AUGA' will not count as a gene 
    if ($stop > $start+1) { 
     push @genes, substr($string, $start, $stop); 
    } 

    $prev = $stop; # I'm assuming that no second AUG will come between AUG and a stop codon 
} 

print "@genes\n"; 

이 나는 ​​그것이 약간의 정제를해야 할 수도 말할 것이다 당신에게

AUGGGCCAUAUUUGA AUGCCAUUGGCGAUUAG 

을 제공하지만, 나는 그것이 모두 같은 도움이 될 바랍니다.

3

, 당신은 같은 정규 표현식 x 수정을 사용해야합니다 : 당신이 공백을 표현해야하는 경우 다음

if ($_ [ 0 ] =~/GC[AGCU] /xi) 

(이 여기 안) 일이 아닌 다른 독서 프레임에 될 일 경우

sub translate_codon { 
    my $codon = shift; 
    return q(A) if $codon =~ m/ GC[AGCU] /xi; 
    return q(F) if $codon =~ m/ UU[CU] /xi; 
}