查看原文
其他

如何计算 read 的 covergae

JunJunLab 老俊俊的生信笔记 2022-08-17


流逝

1引言

我们在得到比对的 sam 或者 bam 文件后,可以直接加载到 IGV 里面进行可视化,查看比对情况。

或者使用 deeptools 转为 bigwig 文件进行可视化,在文章里比较常见的如下面这些 track 图:

基本上纵坐标是 read 的 coverage,也就是覆盖度。我们可以自己拿 sam/bam 文件自己计算。


read counts 和 coverage 的区别 (手绘):

2测试

思路:

  • 主要思路为对 sam 文件比对上的 reads 每个碱基的位置进行计数,保存为字典,然后遇到相同的位置就叠加。
  • 代码里还提供了 reads counts 计数的方法,可以选择。

定义函数:(julia语言编写)

# load package
using XAM

# define function
function CalculateRNACoverage(inputFile,outputFile;type="counts")
    # save in dict
    coverage_dict = Dict{String,Float64}()

    # open sam file
    reader = open(SAM.Reader,inputFile)
    record = SAM.Record()

    # loop
    while !eof(reader)
        empty!(record)
        read!(reader, record)
        # do something
        if SAM.ismapped(record)
            # tags
            refname = SAM.refname(record)
            align_pos = SAM.position(record)

            if type == "coverage" # get read coverage
                read_length = SAM.seqlength(record)
                # read right position
                End5 = align_pos + read_length - 1
                # ribo density
                for elem in range(align_pos,End5)
                    key = join([refname,elem],"|")
                    if !haskey(coverage_dict,key)
                        coverage_dict[key] = 1
                    else
                        coverage_dict[key] += 1
                    end
                end
            elseif type == "counts" # get read counts
                key = join([refname,align_pos],"|")
                if !haskey(coverage_dict,key)
                    coverage_dict[key] = 1
                else
                    coverage_dict[key] += 1
                end
            else
                println("error!")
                break
            end
        end
    end

    # output file
    outfile = open(outputFile,"w")

    # total densitys
    total_density = sum(values(coverage_dict))

    # sort keys
    for key in sort(collect(keys(coverage_dict)))
        id,align_pos = split(key,"|")
        raw_denisty = coverage_dict[key]

        # RPM normalization
        rpm = (raw_denisty/total_density)*1000000
        write(outfile,"$id\t$align_pos\t$raw_denisty\t$rpm\n")
    end
    close(outfile)
end

运行:

# calculate coverage
CalculateRNACoverage("test.sam","test.counts.txt",type="coverage")

# calculate read counts
CalculateRNACoverage("test.sam","test.counts.txt",type="counts")

输出结果为染色体,比对的位置,coverage,RPM:

10 100014676 1.0 0.007010635358178688
10 100014677 3.0 0.021031906074536068
10 100014678 4.0 0.028042541432714754
10 100014679 6.0 0.042063812149072136
10 100014680 8.0 0.05608508286542951
10 100014681 8.0 0.05608508286542951

3结尾

可以那这个结果去做一下 gene 的可视化。




  老俊俊生信交流群 ,QQ,


老俊俊微信:


知识星球:



今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!



  





RiboChat 一键分析 Ribo-seq 数据

Julia 处理 bigWig 文件

Julia 笔记之元组

GFF3 处理 GFF 注释文件

Sam 文件 flag 研究

Ribo-seq 质控之 reads 分布特征

Julia 笔记之字典

Cell 文章代码重改复现测试

Julia 笔记之数组

Julia 笔记之函数

◀...

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存