我有一个哈希表
$mainhash{$position}{$base}{$score}
存储dna序列的每个位置与发生的碱基以及它发生次数的分数。我还有另一个哈希表
$i_hash{$position}{$base}{$score}
只有在发生插入事件时才会保留相同的信息。
对于存在的每个插入位置,我想将该位置的得分与该位置的%mainhash中的得分进行比较。如果它更大,我需要将$ base和$得分从$ i_hash插入到%mainhash中,并通过该插入移动下游的每个位置。有时这些插入事件可以连续发生。
例如,对于此序列
GATCCTGAACT
如果在位置4处插入T,则在位置5处插入A,在位置6处插入C(假设序列从0开始):
插入后看起来像这样:
GATC^TAC^CTGAACT
因此,在位置4发生的原始C现在位于第7位,依此类推。
我应该通过展平%mainhash来实现这个,然后使用substr函数插入基数? Os还有另外一种方法吗?我需要保持序列位置的完整性才能正确报告。
代码:
my @consensus;
for(my $k=0; $k<$length; $k++)
{
my $pushbase;
if (exists $i_hash{$k} && exists $mainhash{$k})
{
my $iscore;
my $mscore;
my $ipushbase;
my $mpushbase;
foreach my $ibase (keys %{$i_hash{$k}})
{
$ipushbase = $ibase;
$iscore = $i_hash{$k}{$ibase};
}
foreach my $mbase (keys %{$mainhash{$k}})
{
$mpushbase = $mbase;
$mscore = $mainhash{$k}{$mbase};
}
if ($iscore > $mscore)
{
$pushbase = $i_hash{$k}{$ipushbase};
push @consensus, $pushbase;
$pushbase = $mainhash{$k}{$mpushbase}; #insert the shifted position (does not handle consecutive insertion
push @consensus, $pushbase;
}
else
{
$pushbase = $mainhash{$k}{$mpushbase};
push @consensus, $pushbase;
}
}
}
这显然不能处理连续插入。我无法弄清楚如何处理连续插入,以便我可以正确地移动下游位置。