Perl程序将完整的.fasta文件序列打印到文件中,但试图实现基因的特定核苷酸计数

时间:2012-03-17 21:40:52

标签: perl tabs bioinformatics fasta

到目前为止,我已经设法对Perl有了更多的了解,这是一种解脱,我要你们感谢。我目前还在研究另一个方面,我需要读取.fasta文件并查找所有G和C核苷酸,然后创建制表符分隔文件。

这些是我过去几天的帖子,按时间顺序排列:

  1. How do I average column values from a tab-separated data... (已解决)
  2. Why do I see no computed results in my output file? (已解决)
  3. Using a .fasta file to compute relative content of sequences
  4. Reading .fasta sequences to extract nucleotide data, and then... (在此之前发布)
  5. 最后一个查询仍在进行中,但我取得了一些进展。

    有些背景,.fasta文件的内容如下:

    >label
    sequence
    >label
    sequence
    >label
    sequence
    

    我不确定如何打开.fasta文件,因此我不确定哪些标签适用于哪个,但我知道基因应该标记为gagpolenv。我是否需要打开.fasta文件以了解我正在做什么,或者我可以通过使用上述格式“盲目地”执行此操作吗?

    无论如何,我现有的代码如下:

    #!/usr/bin/perl -w
    # This script reads several sequences and computes the relative content of G+C of each sequence.
    
    use strict; 
    
    my $infile = "Lab1_seq.fasta";                               # This is the file path
    open INFILE, $infile or die "Can't open $infile: $!";        # This opens file, but if file isn't there it mentions this will not open
    my $outfile = "Lab1_SeqOutput.txt";             # This is the file's output
    open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # This opens the output file, otherwise it mentions this will not open
    
    my $sequence = ();  # This sequence variable stores the sequences from the .fasta file
    my $GC = 0;         # This variable checks for G + C content
    
    my $line;                             # This reads the input file one-line-at-a-time
    
    while ($line = <INFILE>) {
        chomp $line;                      # This removes "\n" at the end of each line (this is invisible)
    
        if($line =~ /^\s*$/) {         # This finds lines with whitespaces from the beginning to the ending of the sequence. Removes blank line.
            next;
    
        } elsif($line =~ qr(^\s*\#/)) {        # This finds lines with spaces before the hash character. Removes .fasta comment
            next; 
        } elsif($line =~ /^>/) {           # This finds lines with the '>' symbol at beginning of label. Removes .fasta label
            next;
        } else {
            $sequence = $line;
        }
    
        $sequence =~ s/\s//g;               # Whitespace characters are removed
        print OUTFILE $sequence;
    }
    

    现在代码将整个序列打印到文本文件,没有空格。唯一的问题是,我不知道序列的起点或终点,所以我不确定每个基因适用的序列。虽然停止/起始密码子应该给我一个指示。考虑到这一点,我将如何修改/添加代码以计算序列中G + C的数量,然后将它们打印到制表符分隔的文件中,其中包含与其各自G / C含量相关的基因名称?

    我期待听到某人能够提供一些指导,与上面发布的代码类似,关于如何找到G / C然后将各自的计数制成表格。

2 个答案:

答案 0 :(得分:2)

以下链接可能会有所帮助。已经编写了很多代码,Bio::SeqIOBio::Seq似乎经常被讨论。 BioPerl有一个网站,但我不熟悉它。那里有代码示例和其他信息。 FAQ也很有帮助。

以下是Bio :: SeqIO文档中的示例。

use Bio::SeqIO;

$in  = Bio::SeqIO->new(-file => "inputfilename" ,
                       -format => 'Fasta');
$out = Bio::SeqIO->new(-file => ">outputfilename" ,
                       -format => 'EMBL');

while ( my $seq = $in->next_seq() ) {
        $out->write_seq($seq);
}

答案 1 :(得分:1)

我实际上自己使用FASTA个文件。所以,我感到痛苦。

回答有关标签对每个序列的适用性的重复问题:如果文件格式正确,则序列信息前面的每个标签应该是后面的序列。因此,您应该从头到尾解析文件,如下所示:

>label1
sequence1
>label2
sequence2
>label3
sequence3
...

...其中每个标签表示要遵循新的序列信息。您还需要忽略以分号(;)开头的行,因为这些行也表示旧的注释字段。

否则,您在回流文件时似乎正在正确删除空格。我建议使用换行符保持标签字段不变,因此输出文件看起来像上面提到的格式,并删除了注释和空格。

一旦你有了这个,就可以轻松地走回翻新的文件,抓住你需要的序列片,并在遇到新标签时重新启动计数器。