2017-06-28 2 views
4

こんにちは、DNA配列内のすべての繰り返し4量体検索 - 私は、複数のDNA配列を含むFASTA形式のファイルを読み込んでプログラムを書いてみるPerlの

を、すべての繰り返し4量体(すなわち、すべてを識別4マーを複数回出現させる)を繰り返し、4マーとそれが見出された配列のヘッダーをプリントアウトする。 k-merは、単にkヌクレオチドの配列である(例えば、「aaca」、「gacg」および「tttt」は4量体である)。私は2つの要求を持っている

use strict; 
use warnings; 

my $count = -1; 
my $file = "sequences.fa"; 
my $seq = ''; 
my @header =(); 
my @sequences =(); 
my $line = ''; 
open (READ, $file) || die "Cannot open $file: $!.\n"; 

while ($line = <READ>){ 
    chomp $line; 
    if ($line =~ /^>/){ 
     push @header, $line; 
     $count++; 
     unless ($seq eq ''){ 
      push @sequences, $seq; 
      $seq = ''; 
     } 
    } else { 
     $seq .= $line; 
    } 
} push @sequences, $line; 

for (my $i = 0; $i <= $#sequences+1; $i++){ 
    if ($sequences[$i] =~ /(....)(.)*\g{1}+/g){ 
     print $header[$i], "\n", $&, "\n"; 
    } 
} 

:まず、私は所望の出力を得るために、私の正規表現パターンを設計する方法がわからない

は、ここに私のコードです。 もう少し重要ではないが、私のコードは非常に非効率であると確信しているので、短縮する方法があれば教えてください。

ありがとうございます!ここで

はFASTAファイルの例です:

> NC_001422.1腸内細菌ファージphiX174 sensuのラト、完全な(オリジナルのFASTAファイル内のケースではない配列の間の余分なラインは、ありますことに注意してください)ゲノム GAGTTTTATCGCTTCCATGACGCAGAAGTTAACACTTTttttttCGGATATTTCTGATGAGTCGAAAAAT CCCTTACTTGAGGATAtatataAATTATGTCTAATATTCAAACTGGCGCCGAGCGTATGCCGCATGACCT

> NC_001501.1腸内細菌ファージphiX184 sensuのラト、完全なゲノム AACGGCTGGTCAGTATTTAAGGTTAGTGCTGAGGTTGACTACATCTGTTTTTAGAGACCC AGACCTTTTA TCTCACTTCTGTTACTCCAGCTTCTTCGGCACCTGTTTTACAGACACCTAAAGCTACATCGTCAACGTTA TATTTTGATAGTTTGACGGTTAATGCTGGTAATGGTgagagagaGGTTTTCTTCATTGCATTCAGATGGA TCAACGCCGCTAATCAGGTTGTTTCTGTTGGTGCTGATATTGCTTTTGATGCCGACCCTAAATTTTTTGC CTGTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTACCCTCCCGACTGCCTATGATGTTTATCCTTTG

> NC_001622.5腸内細菌ファージphiX199 sensuのラト、完全なゲノム TTCGCTGAATCAGGTTATTAAAGAGTTGCCGAGATATTTATGTTGGTTTCATGCGGATTGGTCGTTTAAA TTGGACTTGGTGGCAAGTCTGCCGCTGATAAAGGAAAGGATAATGACCAAATCAAAGAACTCGTGATTAT CTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGG TTGACGCCGGATTTGAGAATCAAAAATGTGAGAGAGCTTACTAA私はおそらくより、このようにではなく、あなたの問題に取り組むだろう

+1

実際、4-merが実際に何であるか説明するために行われました!ちょうど1つの質問 - 重なり合うことができますかそして、サンプルデータと必要な出力がありますか? – Sobrique

+0

はい、重複する可能性があります。私はfastaファイルを添付しようとしましたが、不可能なようです。私は質問に例をコピーします。 残念ながら、私は希望の出力のサンプルがありません – ic23oluk

+0

あなたはどのPerlのバージョンを使用していますか? 'perl -v' – Zaid

答えて

5

AATGCAACTGGACAATCAGAAAGAGA GATGCAAAATGAGACTCAAAAAGAGATTGCTGGCATTCAGTCGGCGACTTCACGCCAGAATACGAAAGAC CAGGTATATGCACAAAATGAGATGCTTGCTTATCAACAGAAGGAGTCTACTGCTCGCGTTGCGTCTATTA TGGAAAACACCAATCTTTCCAAGCAACAGCAGGTTTCCGAGATTATGCGCCAAATGCTTACTCAAGCTCA AACGGCTGGTCAGTATTTTACCAATGACCAAATCAAAGAAATGACTCGCAAGGTTAGTGCTGAGGTTGAC TTAGATGAGTGTTCATCAGCAAACGCAGAATCAGCGGTATGGCTCTTCTCATATTGGCGCTACTGCAAAG:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dumper; 

#set paragraph mode. Iterate on blank lines. 
local $/ = ''; 

#read from STDIN or a file specified on command line, 
#e.g. cat filename_here | myscript.pl 
#or myscript.pl filename_here 
while (<>) { 
    #capture the header line, and then remove it from our data block 
    my ($header) = m/\>(.*)/; 
    s/>.*$//; 

    #remove linefeeds and whitespace. 
    s/\s*\n\s*//g; 
    #use lookahead pattern, so the data isn't 'consumed' by the regex. 
    my @sequences = m/(?=([atcg]{4}))/gi; 

    #increment a count for each sequence found. 
    my %count_of; 
    $count_of{$_}++ for @sequences; 

    #print output. (Modify according to specific needs. 
    print $header,"\n"; 

    print "Found sequences:\n"; 
    print Dumper \@sequences; 
    print "Count:\n"; 
    print Dumper \%count_of; 

    #note - ordered, but includes duplicates. 
    #you could just use keys %count_of, but that would be unordered. 
    foreach my $sequence (grep { $count_of{$_} > 1 } @sequences) { 
     print $sequence, " => ", $count_of{$sequence},"\n"; 
    } 
    print "\n"; 
} 

我々は再反復しますコードを記録し、 'ヘッダ'行をキャプチャして削除し、残りの部分をつなぎ合わせます。次に、それぞれの(重複している)4のシーケンスをキャプチャし、それらを数えます。

これ、あなたのサンプルデータのための(簡潔にするために最初のスタンザ):

NC_001422.1 Enterobacteria phage phiX174 sensu lato, complete genome 
Found sequences: 
    GAGT => 2 
    AGTT => 2 
    TTAT => 2 
    CATG => 2 
    ATGA => 3 
    TGAC => 2 
    CGCA => 2 
    AGTT => 2 
    ACTT => 2 
    tttt => 3 
    tttt => 3 
    tttt => 3 
    GGAT => 2 
    GATA => 2 
    ATAT => 2 
    TATT => 2 
    ATGA => 3 
    TGAG => 2 
    GAGT => 2 
    AAAA => 2 
    AAAA => 2 
    ACTT => 2 
    TGAG => 2 
    GGAT => 2 
    GATA => 2 
    tata => 2 
    tata => 2 
    TTAT => 2 
    TATG => 2 
    ATAT => 2 
    TATT => 2 
    GCCG => 2 
    TATG => 2 
    GCCG => 2 
    CGCA => 2 
    CATG => 2 
    ATGA => 3 
    TGAC => 2 

注 - それは、元の配列に基づいているため、それはデータ内の注文に基づいている、とあなたが二回あっTGACが表示されますなぜなら、それは二度そこにあるからです。

しかし、あなたが代わりに可能性:周波数によって以下の2試合でいずれかを破棄し、注文します

foreach my $sequence (sort { $count_of{$b} <=> $count_of{$a} } 
          grep { $count_of{$_} > 1 } 
           keys %count_of) { 
     print $sequence, " => ", $count_of{$sequence},"\n"; 
    } 
    print "\n"; 

+0

あなたのコードは完璧にうまく動作し、期待通りの出力が得られますが、正直なところ、これまでに学んでいないことがたくさんあります。また、モジュール(つまり、ダンパー)を使用したくありません。 あなたの努力のためにとにかく感謝:) – ic23oluk

+1

モジュールを避けてはいけません。それは誤りです。 'Data :: Dumper'はコアです。それはperlと一緒に出荷されます。しかし、この場合は、とにかく利便性があり、主にダイアグ出力を印刷するためのものです。あなたが学ばなければならないハッシュは、物事を数えるための正確なツールです。 – Sobrique

+1

先読みキャプチャでうまいトリックです。代わりのアプローチは、ハッシュに直接行きます: '%count_of;/* ..?([atgc] {4})(?{$ count_of {$ 1} ++})(* FAIL)/; ' – Zaid

関連する問題