题目:
每个基因组(或序列集合)中可能包含多条scaffolds、contigs、染色体或其他小片段,通常使用Nxx(xx范围从01到99)统计来衡量序列或基因组的组装质量,经常用的指标有N50,N90等等。
为描述方便,假设某基因组包含多条contigs。假设基因组总长度为S,则N50代表存在一个最大的L,在此基因组中所有长度大于等于L的contigs的总长度至少达到S的50%,则此最大的L=N50。
求一个给定基因组的N80。
我们假设存在一个基因组:
my $a = 'ATAAT';my $b = 'GAATACA';my $c = 'ATGGAC';my $d = 'TACACTTAC';my @all = ($a, $b, $c, $d);
定义几个全局变量,用来存储后面需要计算的数据:
my $total_length = 0;my @lengths;
先把每个长度存起来, 同时计算总长度
for(@all){ chomp; $total_length += length $_; push @lengths, length $_;}
把长度按从大到小排序:
@lengths = reverse sort @lengths;my $n80 = $total_length * 0.8;
现在我们长度从大到小排序的
那么我们从长度大的开始依次取, 直到大于n80, 那么此时的数据就是我们需要的数据段
my $n_totle = 0;for (@lengths){ $n_totle += $_; if($n_totle >= $n80){ print "$_n"; exit; }}