使用具有非标准标题的BioPerl从FASTA文件中提取DNA序列

时间:2012-12-04 16:24:19

标签: perl bioinformatics bioperl

我正在尝试使用以下代码从数据库中提取序列:

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文件吗?

2 个答案:

答案 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,因此很难理解这是否是错误代码/它返回错误基数的输出。

我尝试查看文档但找不到任何内容。