2013-03-04 42 views
5

Tôi mới dùng perl và muốn làm những gì tôi nghĩ là một số thao tác chuỗi cơ bản đối với chuỗi DNA được lưu trữ trong tệp rtf.regex cơ bản và thao tác chuỗi để phân tích DNA bằng cách sử dụng perl

Về cơ bản, tập tin tôi đọc (File này dưới dạng FASTA):

>LM1 
AAGTCTGACGGAGCAACGCCGCGTGTATGAAGAAGGTTTTCGGATCGTAA 
AGTACTGTCCGTTAGAGAAGAACAAGGATAAGAGTAACTGCTTGTCCCTT 
GACGGTATCTAACCAGAAAGCCACGGCTAACTACGTGCCAGCAGCCGCGG 
TAATACGTAGGTGGCAAGCGTTGTCCGGATTTATTGGGCGTAAAGCGCGC 
GCAGGCGGTCTTTTAAGTCTGATGTGAAAGCCCCCGGCTTAACCGGGGAG 
GGTCATTGGAAACTGGAAGACTGGAGTGCAGAAGAGGAGAGTGGAATTCC 
ACGTGTAGCGGTGAAATGCGTAGATATGTGGAGGAACACCAGTGGCGAAG 
GCGACTCTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCA 
AACAGGATTAGATACCCTGGTAGTCCACGCCGT 

Những gì tôi muốn làm là đọc vào tập tin của tôi và in tiêu đề (header là> LM1) sau đó kết hợp ADN sau trình tự GTGCCAGCAGCCGC và sau đó in chuỗi DNA trước.
Vì vậy, đầu ra của tôi sẽ trông như thế này:

>LM1 
AAGTCTGACGGAGCAACGCCGCGTGTATGAAGAAGGTTTTCGGATCGTAA 
AGTACTGTCCGTTAGAGAAGAACAAGGATAAGAGTAACTGCTTGTCCCTT 
GACGGTATCTAACCAGAAAGCCACGGCTAACTAC 

Tôi đã viết chương trình sau đây:

#!/usr/bin/perl 

use strict; use warnings; 

open(FASTA, "<seq_V3_V6_130227.rtf") or die "The file could not be found.\n"; 

while(<FASTA>) { 
    chomp($_); 
    if ($_ =~ m/^>/) { 
     my $header = $_; 
     print "$header\n"; 
    } 

    my $dna = <FASTA>; 
    if ($dna =~ /(.*?)GTGCCAGCAGCCGC/) { 
     print "$dna"; 
    } 

} 
close(FASTA); 

Vấn đề là chương trình của tôi đọc dòng tập tin bằng cách dòng và đầu ra tôi nhận được là như sau:

>LM1 
GACGGTATCTAACCAGAAAGCCACGGCTAACTAC 

Về cơ bản tôi không biết cách gán toàn bộ chuỗi DNA cho biến $ dna của mình và cuối cùng không biết cách để tránh đọc chuỗi chuỗi DNA. Ngoài ra tôi nhận được cảnh báo này: Sử dụng giá trị uninitialized $ dna trong mẫu khớp (m //) tại dòng stacked.pl 14, dòng 1113.

Nếu ai đó có thể giúp tôi viết mã tốt hơn hoặc chỉ cho tôi theo đúng hướng nó sẽ được đánh giá cao.

+0

Bạn có tin sinh học có thư viện hiện đã làm công cụ này không? Chúng tôi nhận được rất nhiều câu hỏi về DNA + regex và tôi nghĩ rằng sẽ có các thư viện thử nghiệm hiện có để xử lý vấn đề này. –

+0

Thử tìm kiếm StackOverflow cho "fasta perl". Có rất nhiều câu hỏi dường như từ những người đối phó với chính xác vấn đề của bạn. http://stackoverflow.com/search?q=fasta+perl –

+0

@AndyLester Đúng là các thư viện xử lý các công cụ này tồn tại nhưng rất nhiều tin sinh học cần phải được điều chỉnh cho các yêu cầu cụ thể của bạn mà làm cho việc tìm kiếm chương trình tối ưu trở nên khó khăn. Cảm ơn lời đề nghị của bạn, tôi sẽ xem xét dưới fasta perl. – cebach561

Trả lời

3

Sử dụng pos function:

use strict; 
use warnings; 

my $dna = ""; 
my $seq = "GTGCCAGCAGCCGC"; 
while (<DATA>) { 
    if (/^>/) { 
    print; 
    } else { 
    if (/^[AGCT]/) { 
     $dna .= $_; 
    } 
    } 

} 

if ($dna =~ /$seq/g) { 
    print substr($dna, 0, pos($dna) - length($seq)), "\n"; 
} 

__DATA__ 
>LM1 

AAGTCTGACGGAGCAACGCCGCGTGTATGAAGAAGGTTTTCGGATCGTAA 
AGTACTGTCCGTTAGAGAAGAACAAGGATAAGAGTAACTGCTTGTCCCTT 
GACGGTATCTAACCAGAAAGCCACGGCTAACTACGTGCCAGCAGCCGCGG 
TAATACGTAGGTGGCAAGCGTTGTCCGGATTTATTGGGCGTAAAGCGCGC 
GCAGGCGGTCTTTTAAGTCTGATGTGAAAGCCCCCGGCTTAACCGGGGAG 
GGTCATTGGAAACTGGAAGACTGGAGTGCAGAAGAGGAGAGTGGAATTCC 
ACGTGTAGCGGTGAAATGCGTAGATATGTGGAGGAACACCAGTGGCGAAG 
GCGACTCTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCA 
AACAGGATTAGATACCCTGGTAGTCCACGCCGT 

Bạn có thể xử lý một tập tin với nhiều mục như vậy:

while (<DATA>) { 
    if (/^>/) { 
    if ($dna =~ /$seq/g) { 
     print substr($dna, 0, pos($dna) - length($seq)), "\n"; 
     $dna = ""; 
    } 
    print; 
    } elsif (/^[AGCT]/) { 
    $dna .= $_; 
    } 
} 

if ($dna && $dna =~ /$seq/g) { 
    print substr($dna, 0, pos($dna) - length($seq)), "\n"; 
} 
+0

Cảm ơn bạn, thực tế. Điều này hoạt động rất tốt khi tôi có một chuỗi như> LM1 AAGT ... Mua như thế nào tôi có thể thay đổi chương trình để xử lý nhiều tiêu đề và trình tự như:> LM1 AAGT ...> LM2 AGTC ...> LM3 ACGG .. và như vậy? – cebach561

+0

đã cập nhật câu trả lời – perreal

+0

Tôi không thấy làm thế nào nó bao giờ được đến 'elsif' thứ hai. Thường là các dòng tập tin fasta bắt đầu bằng '>', (id) hoặc một chuỗi ký tự 'ATGC'. Không nên có dòng trống trong tệp fasta. –

0

đọc toàn bộ tập tin vào bộ nhớ sau đó tìm kiếm các regexp

while(<FASTA>) { 
    chomp($_); 
    if ($_ =~ m/^>/) { 
     my $header = $_; 
     print "$header\n"; 
    } else { 
    $dna .= $_; 
    } 
} 
if ($dna =~ /(.*?)GTGCCAGCAGCCGC/) { 
    print $1; 
} 
+0

Tôi đã chỉnh sửa câu trả lời vì dấu ngoặc nhọn đóng bị thiếu. Bất kể, bạn phải in kết hợp nhóm của regex, '$ 1', không phải' $ dna'. Và chuỗi bị mất định dạng không có ký tự '\ n' gốc. Tôi không biết nó có vấn đề gì để giải quyết vấn đề, nhưng có thể là một vấn đề đối với OP. – Birei

+0

cảm ơn birei, tôi đã tinh chỉnh nó để không in $ dna – Vorsprung

2

Phát biểu trong khi đọc cho đến khi kết thúc tập tin. Điều đó có nghĩa là mỗi lần lặp lại, $ _ là dòng tiếp theo trong <FASTA>. Vì vậy, $dna = <FASTA> không làm những gì bạn nghĩ. Nó đang đọc nhiều hơn bạn có thể muốn nó.

while(<FASTA>) { #Reads a line here 
    chomp($_); 
    if ($_ =~ m/^>/) { 
    my $header = $_; 
    print "$header\n"; 
    } 
    $dna = <FASTA> # reads another line here - Causes skips over every other line 
} 

Bây giờ, bạn cần đọc chuỗi đó vào $dna. Bạn có thể cập nhật vòng lặp while của mình bằng câu lệnh else. Vì vậy, nếu một dòng tiêu đề của nó, in nó, khác, chúng tôi thêm nó vào $dna.

while(<FASTA>) { 
    chomp($_); 
    if ($_ =~ m/^>/) { 
    # It is a header line, so print it 
    my $header = $_; 
    print "$header\n"; 
    } else { 
    # if it is not a header line, add to your dna sequence. 
    $dna .= $_; 
    } 
} 

Sau vòng lặp, bạn có thể thực hiện regex của mình.

Lưu ý: Giải pháp này giả định chỉ có 1 chuỗi trong tệp fasta. Nếu bạn có nhiều hơn một, biến số $dna của bạn sẽ có tất cả các chuỗi là một.

Chỉnh sửa: Thêm đơn giản một cách để xử lý nhiều chuỗi

my $dna = ""; 
while(<FASTA>) { 
    chomp($_); 
    if ($_ =~ m/^>/) { 

    # Does $dna match the regex? 
    if ($dna =~ /(.*?)GTGCCAGCAGCCGC/) { 
     print "$1\n"; 
    } 

    # Reset the sequence 
    $dna = ""; 

    # It is a header line, so print it 
    my $header = $_; 
    print "$header\n"; 

    } else { 
    # if it is not a header line, add to your dna sequence. 
    $dna .= $_; 
    } 
} 

# Check the last sequence 
if ($dna =~ /(.*?)GTGCCAGCAGCCGC/) { 
    print "$1\n"; 
} 
+0

Nate, cảm ơn bạn đã trả lời. Nếu tôi có nhiều hơn một chuỗi trong tệp fasta thì sao? Vì vậy, nó trông này:> LM1 ATGC ...> LM2 ACGG ...> LM3 ATTG ... và như vậy. – cebach561

+0

@ user2133248 - Tôi đã thêm một cách đơn giản để làm như vậy. Ý tưởng là kiểm tra nếu chuỗi '$ dna' khớp với regex mỗi lần bạn thấy'> '. Sau đó, bạn làm điều đó một lần nữa sau khi vòng lặp để kiểm tra trình tự cuối cùng. – Nate

2

tôi đã đưa ra một giải pháp sử dụng BioSeqIO (và trunc phương pháp từ BioSeq từ phân phối BioPerl Tôi cũng sử dụng index để tìm ra dãy khá. sử dụng cụm từ thông dụng

Giải pháp này không in ra id, (dòng bắt đầu bằng>), nếu không tìm thấy chuỗi hoặc nếu chuỗi bắt đầu ở vị trí đầu tiên, (và do đó không có ký tự trước đó).

#!/usr/bin/perl 
use strict; 
use warnings; 
use Bio::SeqIO; 

my $in = Bio::SeqIO->new(-file => "fasta_junk.fasta" , 
          -format => 'fasta'); 

my $out = Bio::SeqIO->new(-file => '>test.dat', 
          -format => 'fasta'); 

my $lookup = 'GTGCCAGCAGCCGC'; 

while (my $seq = $in->next_seq()) { 
    my $pos = index $seq->seq, $lookup; 

    # if $pos != -1, ($lookup not found), 
    # or $pos != 0, (found $lookup at first position, thus 
    # no preceding characters). 
    if ($pos > 0) { 
     my $trunc = $seq->trunc(1,$pos); 
     $out->write_seq($trunc); 
    } 
} 

__END__ 
*** fasta_junk.fasta 
>LM1 
AAGTCTGACGGAGCAACGCCGCGTGTATGAAGAAGGTTTTCGGATCGTAA 
AGTACTGTCCGTTAGAGAAGAACAAGGATAAGAGTAACTGCTTGTCCCTT 
GACGGTATCTAACCAGAAAGCCACGGCTAACTACGTGCCAGCAGCCGCGG 
TAATACGTAGGTGGCAAGCGTTGTCCGGATTTATTGGGCGTAAAGCGCGC 
GCAGGCGGTCTTTTAAGTCTGATGTGAAAGCCCCCGGCTTAACCGGGGAG 
GGTCATTGGAAACTGGAAGACTGGAGTGCAGAAGAGGAGAGTGGAATTCC 
ACGTGTAGCGGTGAAATGCGTAGATATGTGGAGGAACACCAGTGGCGAAG 
GCGACTCTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCA 
AACAGGATTAGATACCCTGGTAGTCCACGCCGT 

*** contents of test.dat 
>LM1 
AAGTCTGACGGAGCAACGCCGCGTGTATGAAGAAGGTTTTCGGATCGTAAAGTACTGTCC 
GTTAGAGAAGAACAAGGATAAGAGTAACTGCTTGTCCCTTGACGGTATCTAACCAGAAAG 
CCACGGCTAACTAC 
+0

Xin chào Chris cảm ơn sự giúp đỡ của bạn. Tôi không có BioPerl được cài đặt trên máy tính của tôi nhưng một khi tôi làm tôi sẽ kiểm tra chương trình này. – cebach561

Các vấn đề liên quan