Bio Perl:拆分配对结束数据的代码?

时间:2013-12-04 17:02:28

标签: perl bioinformatics bioperl fastq

我是生物信息学的初学者,我一直在研究一些Bio Perl代码,将我的配对结束MiSeq数据(目前在1个fastq文件中)分成2个文件,每个文件包含该对的一端。配对末端读数的不同末端可以在fastq标题中的空格之后用 1 2 来区分。该文件遵循典型的fastq格式,例如在命令行中使用“head”:

@M00763:6:000000000-A1U80:1:1101:12620:1732 1:N:0:1
TTATACTC
+
@A@AA@A@
@M00763:6:000000000-A1U80:1:1101:12620:1732 2:N:0:1
T
+
E

我编写了一个代码,尝试使用匹配来定位标头中的1或2。虽然我使用Bio :: SeqIO perl似乎没有识别fastq格式,但我不断收到此错误:

MSG: Could not guess format from file/fh
STACK: Error::throw
STACK: Bio::Root::Root::throw /sw/lib/perl5/5.12.3/Bio/Root/Root.pm:472
STACK: Bio::SeqIO::new /sw/lib/perl5/5.12.3/Bio/SeqIO.pm:389
STACK: SplitPairedEndReads.pl:7

有人可以帮我查找/修复错误吗? BioPerl网站提供的信息表明Bio :: SeqIO应该能够识别fastq格式。

这是我写的代码:

#!/usr/bin/perl 

use Bio::SeqIO;
use Bio::SeqIO::fastq;


$seqout1 = Bio::SeqIO->new(-file => ">peread1.fastq" -format => "fastq",);
$seqout2 = Bio::SeqIO->new(-file => ">peread2.fastq" -format => "fastq",);

$seqio_obj = Bio::SeqIO->new(-file => "AIS351_Strin1edit.fastq", -format => "fastq",
                         -alphabet => "dna" );
$seq_obj = $seqio_obj->next_seq;

while ($seq_obj = $seqio_obj->next_seq) { 
    $name = $seq_obj->desc; if($name=~ / 1:/) {$seqout1->write_seq($seq_obj);
     } else { $seqout2->write_seq($seq_obj); 

    }
}

感谢您的帮助以及您对我的初学者知识的耐心。

〜铝

问题更新:

我已修复了new行中的逗号错误,现在运行代码时出现此错误:

------------- EXCEPTION: Bio::Root::Exception -------------
MSG: No description line parsed
STACK: Error::throw
STACK: Bio::Root::Root::throw /sw/lib/perl5/5.12.3/Bio/Root/Root.pm:472
STACK: Bio::SeqIO::fastq::next_dataset /sw/lib/perl5/5.12.3/Bio/SeqIO/fastq.pm:71
STACK: Bio::SeqIO::fastq::next_seq /sw/lib/perl5/5.12.3/Bio/SeqIO/fastq.pm:29
STACK: samplesettrim.pl:10
-----------------------------------------------------------

我所做的所有阅读似乎表明BioPerl本身的FASTQ解析器存在一些问题。我本来希望这个代码能够工作,因为我是一名初学者并且正在努力提高我的编程技能(我完全是自学成才),这是一个编程对我有实际应用的问题。我同意关于这个缓慢的评论,可能不是使用大型FASTQ文件的最佳方法。

关于+描述符,我的文件是否可用于其他软件程序(例如:CLC)或者我可以通过删除FASTQ中的那一行来解决问题吗? +实际上并不包含读取的任何质量信息,对吗?

再次感谢您的投入!

3 个答案:

答案 0 :(得分:2)

您需要在调用new的所有列表项之间添加逗号。变化:

$seqout1 = Bio::SeqIO->new(-file => ">peread1.fastq" -format => "fastq",);
$seqout2 = Bio::SeqIO->new(-file => ">peread2.fastq" -format => "fastq",);

为:

$seqout1 = Bio::SeqIO->new(-file => ">peread1.fastq", -format => "fastq",);
$seqout2 = Bio::SeqIO->new(-file => ">peread2.fastq", -format => "fastq",);

答案 1 :(得分:1)

我建议你不要将BioPerl用于Fastq数据,因为它非常慢(请参阅下面的评论)。您可以使用Pairfq执行此任务,因为这是它的设计之一(完全披露:我是作者)。以下是它的工作原理:

pairfq splitpairs -i AIS351_Strin1edit.fastq -f AIS351_Strin1edit_1.fastq -r AIS351_Strin1edit_2.fastq

在我的基准测试中,这比使用BioPerl执行同等任务快约300倍。例如,我测量用Bio :: SeqIO读取100万个Fastq记录需要465秒,而上面的代码可以在大约1.5秒内完成。如果你有5亿条记录,那么64小时与11分钟不同。这就是为什么强烈建议不要将BioPerl用于NGS数据。我不是在抨击BioPerl,因为我每天都在使用它,但要注意这个问题。

关于评论中的错误,BioPerl解析器不喜欢“+”行上的内容。 '+'后必须没有任何内容,或者必须与序列标题匹配。没有看到真实数据就很难具体说明,也可能是行结束问题或其他问题。

编辑:您需要将use strict;use warnings;放在每个脚本的顶部。此外,在尝试对其执行任何操作之前测试文件是否存在是个好主意(例如尝试使用BioPerl读取它)。关于您的上一个问题,我建议您阅读FASTQ格式。您不能只删除记录中的行,否则它将无效FASTQ。一个小问题是您不需要use Bio::SeqIO::fastq;,因为Bio::SeqIO将处理加载适当的类。

您发布的内容与真实数据不同,因此要说出造成问题的原因并不容易。

答案 2 :(得分:0)

您可以使用此代码段实现您的目标:

#!/usr/bin/perl
use warnings;
use strict; 

my @array = ('@M00763:6:000000000-A1U80:1:1101:12620:1732 1:N:0:1
TTATACTC
+
@A@AA@A@',
'@M00763:6:000000000-A1U80:1:1101:12620:1732 2:N:0:1
T
+
E');

foreach (@array){
        if (/\s+1:/) {
            print "1st pair: $_\n"; # You could redirect this to first.OUTFILE
         }
        if (/\s+2:/) {
            print "2nd pair: $_\n"; # You could redirect this to second.OUTFILE
         }

}

打印哪些:

1st pair: @M00763:6:000000000-A1U80:1:1101:12620:1732 1:N:0:1
TTATACTC
+
@A@AA@A@
2nd pair: @M00763:6:000000000-A1U80:1:1101:12620:1732 2:N:0:1
T
+