查看原文
其他

Molecular Cell 文章 ribosome pausing 结果复现 (二) (PCR 去重)

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


人是一团欲望,满足不了便会难受

1引言

上一篇在去除通用接头的代码中,设置的 -m 参数指定最短保留的 reads 长度为 25nt, 但是文章里写的不是 15nt 吗?这里就需要注意我们去除通用接头的时候,实际上 reads 长度包括了(6+4)nt 的随机序列,所以 15+10 即为保留的最短长度。

前面我们去除了 umi 序列并加到了每条 read 的名称里,比对到基因组上后得到了 sam 文件, 今天对 sam 文件进行 PCR 去重

2PCR 去重

先看看 sam 文件:

@SQ     SN:JH584295.1   LN:1976
@PG     ID:hisat2       PN:hisat2       VN:2.2.1        CL:"/home/zhoulab/anaconda3/bin/hisat2-align-s --wrapper basic-0 -p 20 -x 0.index-data/grcm38/genome>
SRR12594201.4|TAGGTNCGA 4       *       0       0       *       *       0       0       GACGAAGCCGAGCGCACGGGGTCGGCGGCGAT        EEEEEEEEEEEEEEEEEEEEEEEEEEEE>
SRR12594201.1|TAGAGNTNC 4       *       0       0       *       *       0       0       TCGACGAAGCCGAGCGCACGNGNTCGGCGGCGAT      /AEEEEEA6EA<EEAAE/E6#/#EEAEE>
SRR12594201.3|TAGCGNATC 4       *       0       0       *       *       0       0       TCGACGAAGCCGAGCGCACGGGGTCGGCGGC EEEEEAEE6EA<<AE/E//EE6EEE/EE/EE YT:Z

定义函数:julia语言编写

using XAM

# define function
function removePCRDup(inputFile,outputFile;outputType="txt")
    readInfoDict = Dict{String,String}()

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

    # get sam header
    head = SAM.header(reader)
    # output to sam file
    samw = SAM.Writer(open(outputFile, "w"), head)

    record = SAM.Record()
    while !eof(reader)
        empty!(record)
        read!(reader, record)
        # do something
        if SAM.ismapped(record)
            # tags
            samName,randmer = split(SAM.tempname(record),"|")
            flag = SAM.flag(record)
            refNmae = SAM.refname(record)
            alignPos = SAM.position(record)
            readLength = SAM.seqlength(record)

            # not include duplicates
            key = join([randmer,refNmae,alignPos],"|")
            if !haskey(readInfoDict,key)
                readInfoDict[key] = ""

                # output data
                if outputType == "txt"
                    write(output,join([flag,refNmae,alignPos,readLength],"\t")*"\n")
                elseif outputType == "sam"
                    write(samw,record)
                else
                    println("Please give coorect type!")
                end
            else
                continue
            end
        end
    end

    # close file
    close(samw)
end

参数说明:

这里给了 outputType 可以是 txt 或者 sam 文件,如果输出 sam 文件可能文件会大一些,txt 格式只保留了几列重要的信息,文件会比较小,但是对于后面的分析足够了。

批量去重:

# sample
sample = ["SRR12594201","SRR12594202","SRR12594203","SRR12594204","SRR12594205","SRR12594206",
        "SRR12594207","SRR12594208","SRR12594209","SRR12594210","SRR12594211","SRR12594212",
        "SRR12594213","SRR12594214","SRR12594215","SRR12594216","SRR12594217","SRR12594218"]

for i in 1:length(sample)
    removePCRDup(join(["3.map-data/",sample[i],".sam"],""),
                 join(["3.map-data/",sample[i],".uniq.txt"],""),"txt")
end

txt 结果:

几列为 flag值,染色体,比对的位置,read长度:

16 4 114969279 29
16 16 61056439 29
0 5 146261023 31

我看了一个样本,大概去重后 reads 数量会减少一半左右,可以看到由于 pcr 扩增产生的重复还是挺多的。

3结尾

如果想输出 sam,输出格式修改一下即可,可以拿去重后的 sam 转 bam 去做其它分析或者可视化等。




  老俊俊生信交流群 ,QQ,


老俊俊微信:


知识星球:



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

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

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



  





Molecular Cell 文章 ribosome pausing 结果复现 (一)

SAM 文件 flag 研究 (续)

将 UMI 添加到 read 名称里并去除 UMI 序列

FASTX 处理 fasta 和 fastq 文件

如何计算 read 的 covergae

RiboChat 一键分析 Ribo-seq 数据

Julia 处理 bigWig 文件

Julia 笔记之元组

GFF3 处理 GFF 注释文件

Sam 文件 flag 研究

◀...

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

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