我想计算成绩单表达式,因此我需要获取bam文件中所有读取的映射数。我目前的程序是使用Bio :: DB :: Sam获取整体成绩单并获取映射到其上的读数。结果存储在一个散列中,其中read_name为键(10个字母),number_of_mappings为值(整数)。
以下是我正在使用的代码:
use Bio::DB:Sam;
use strict;
my %global_read_occurrences;
sub getGlobalReadOccurrences {
my ($ids, $bam_file) = @_;
$sam = Bio::DB::Sam -> new (-bam => $bam_file);
foreach my $id (@{$ids}){
my $alignments = $sam -> get_features_by_location(-seq_id => $transcript_id, -iterator => 1);
while (my $alignment = $alignments -> next_seq){
my $read_name = $alignment -> query -> name;
if (exists($global_read_occurrences{$read_name})){
$global_read_occurrences{$read_name}++;
}
else {
$global_read_occurrences{$read_name} = 1;
}
}
}
}
我的问题: 还有其他可能性,我可以直接获得每次读取的全局映射数量,并且我不必查看所有成绩单吗?我在Bio :: DB :: Sam中找不到任何潜水员,比如$ sam - > getNumberOfMappings($ read_name);
我正在使用超过5000万映射读取的bam文件,因此散列需要大量内存资源(有时大约40 GB)这实际上是否可能或者是否来自其他地方?还有其他任何可能用较少的内存存储数据吗?
非常感谢!
答案 0 :(得分:1)
BAM文件通常按染色体位置排序,而不是按读取名称排序,因此读取映射可以位于文件中的任何位置。最简单的方法是转到SAM文件并运行一个简单的shell命令:
cut -f1,1 myfile.sam | sort | uniq -c
这将生成如下文件:
2 HWI-EAS299_4_30M2BAAXX:2:99:965:826
2 HWI-EAS299_4_30M2BAAXX:2:99:966:1932
2 HWI-EAS299_4_30M2BAAXX:2:99:971:146
2 HWI-EAS299_4_30M2BAAXX:2:9:997:1263
2 HWI-EAS299_4_30M2BAAXX:2:99:972:281
2 HWI-EAS299_4_30M2BAAXX:2:99:973:1904
1 HWI-EAS299_4_30M2BAAXX:2:99:976:186
2 HWI-EAS299_4_30M2BAAXX:2:99:986:687
6 HWI-EAS299_4_30M2BAAXX:2:99:987:165
2 HWI-EAS299_4_30M2BAAXX:2:99:99:1582
2 HWI-EAS299_4_30M2BAAXX:2:99:99:160
2 HWI-EAS299_4_30M2BAAXX:2:99:998:1139
第一列是映射计数。第二个是读取名称。