Bio Perl:分割成对结束数据的代码?

Bio Perl:分割成对结束数据的代码?,perl,bioinformatics,bioperl,fastq,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:1

我是生物信息学的初学者,我一直在编写一个小的Bio Perl代码,将我的成对末端MiSeq数据(目前在1个fastq文件中)拆分为2个文件,每个文件包含一个配对末端。配对末端读取的不同末端可以通过fastq头中空格后的12来区分。该文件遵循典型的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); 

    }
}
谢谢你对我的初级知识的帮助和耐心

~Al

问题更新:

我已经修复了我的
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中的该行来解决问题?+实际上不包含任何用于读取的质量信息,对吗


再次感谢您的投入

您可以通过以下代码片段实现您的目标:

#!/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
+

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

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


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

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解析器不喜欢“+”行中的内容。“+”后面不能有任何内容,或者必须与序列头匹配。在没有看到真实数据的情况下很难说清楚,这也可能是一个行尾问题或其他问题

编辑:你需要把
使用严格
使用警告位于每个脚本的顶部。此外,在尝试对文件执行任何操作之前(比如尝试使用BioPerl读取文件),最好先测试文件是否存在。关于你的最后一个问题,我建议你仔细阅读一下格式。您不能只是从记录中删除行,否则它将无效。次要的一点是,您不需要
使用Bio::SeqIO::fastqBio::SeqIO
将处理加载适当的类


您发布的内容看起来不像真实数据,因此很难说出问题的原因

不幸的是,这不是一个好办法。这类数据通常由数百万甚至数十亿行组成。将其读入数组并循环是一个非常糟糕的主意。你正在使用OP提供的东西,所以理论上是可行的,但实际上这不是一个好方法。谢谢你。正如我在更新中补充的,我之所以写这篇文章,部分原因是为了提高我的编程技能,因为我有一个需要解决的问题。我可能会继续尝试让自己的代码正常工作,或者至少在没有错误消息的情况下运行。但我也可能会使用您的Pairfq,因为我确实需要一些基因组缺口闭合软件的可靠拆分读取。@user2852013我更新了我的帖子以解决您的问题。总之,您需要按照最佳实践改进脚本,并显示导致问题的真实数据片段。
pairfq splitpairs -i AIS351_Strin1edit.fastq -f AIS351_Strin1edit_1.fastq -r AIS351_Strin1edit_2.fastq