我正在尝试使用以下代码从数据库中提取序列:
use strict;
use Bio::SearchIO;
use Bio::DB::Fasta;
my ($file, $id, $start, $end) = ("secondround_merged_expanded.fasta","C7136661:0-107",1,10);
my $db = Bio::DB::Fasta->new($file);
my $seq = $db->seq($id, $start, $end);
print $seq,"\n";
我试图提取的序列的标题是:C7136661:0-107
,如文件所示:
>C7047455:0-100
TATAATGCGAATATCGACATTCATTTGAACTGTTAAATCGGTAACATAAGCAGCACACCTGGGCAGATAGTAAAGGCATATGATAATAAGCTGGGGGCTA
当我将标题切换为更标准的标题(如test
)时,代码工作正常。我认为BioPerl不喜欢非标准的标题。有什么方法可以解决这个问题,所以我不必重新编码FASTA文件吗?
答案 0 :(得分:3)
默认情况下,Bio::DB::Fasta
将使用标题行上>
后面的所有非空格字符来形成序列的键。在您的情况下,这看起来像C7047455:0-100
,它与子序列的内置缩写相同。作为documented here而不是$db->seq($id, $start, $stop)
,您可以使用$db->seq("$id:$start-$stop")
,因此对$db->seq('C7136661:0-107')
的调用看起来像是要求$db->seq('C7136661', 0, 107)
,而该密钥不会存在。
我无法知道数据中的内容,但是如果只使用标题的第一部分直到冒号作为键,则可以使用-makeid
回调来修改键。然后,如果仅使用C7136661
来检索序列,它将起作用。
此代码演示。请注意,在您看到行为发生任何变化之前,您可能已经拥有一个必须删除的.index
缓存文件。
use strict;
use warnings;
use Bio::DB::Fasta;
my ($file, $id, $start, $end) = qw(
secondround_merged_expanded.fasta
C7136661
1 10
);
my $db = Bio::DB::Fasta->new($file, -makeid => \&makeid);
sub makeid {
my ($head) = @_;
$head =~ /^>([^:]+)/ or die qq(Invalid header "$head");
$1;
}
my $seq = $db->seq($id, $start, $end);
print $seq, "\n";
答案 1 :(得分:0)
我对这篇文章有相关的问题。我想知道是否有人尝试过当查询中的位置超出fasta位置限制之外时会发生什么。因此,假设,fasta包含100个碱基,并且您查询包含位置102,此方法是否捕获错误。我在一些实际数据中尝试了这个,它似乎总是返回“1”,但是,我的fasta序列包含0/1,因此很难理解这是否是错误代码/它返回错误基数的输出。
我尝试查看文档但找不到任何内容。