返回列表 发新帖

【Python练习题(三)】操纵FastQ文件

[复制链接]

5

主题

20

帖子

318

积分

版主

Rank: 7Rank: 7Rank: 7

积分
318
发表于 2019-12-11 15:09:40 | 显示全部楼层 | 阅读模式
FastQ文件是广泛使用在二代测序中用于存储测序序列信息及碱基质量值的文件,形式如下:


FastQ文件有两种不同的碱基质量值表示方法,一种是我们目前流程中及NCBI使用的fastq文件,碱基质量值是4N(N=1,2,3...)行的每个字符的ASCII码减去33得到的值,还有一种是需要减去64得到的值作为碱基质量值。
现在有如下需求:
(1)计算每条reads的平均碱基质量值
(2)计算得到不同碱基质量值的碱基数
(3)总结如下统计内容:
  • fastq文件的N含量
  • 碱基质量值低于5的比例
  • 计算GC含量
  • 计算Q20的比例
  • 计算Q30的比例
形成如下的统计信息


fastq文件请见:/NJPROJ1/DISEASE/ProjRawData/aliyun_rawdata/WES.H101SC19102041.shanmubeijingkejiyouxiangong.20191106_J001/B1/191103_A00164_0458_AHMCMFDSXX-new/BDHE19H100332-1a-7UDI1845-5UDI1845
请把统计完成的结果截图放在楼下。
完成部分内容也OK哦!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

5

主题

20

帖子

318

积分

版主

Rank: 7Rank: 7Rank: 7

积分
318
发表于 2019-12-22 22:20:25 | 显示全部楼层
biopython 项目中关于fastq文件解析的脚本,大家有空可以查看,学习一下他们的写法https://github.com/biopython/bio ... /SeqIO/QualityIO.py
回复

使用道具 举报

5

主题

20

帖子

318

积分

版主

Rank: 7Rank: 7Rank: 7

积分
318
发表于 2020-1-5 22:50:51 | 显示全部楼层
本帖最后由 chenming 于 2020-1-5 22:58 编辑

https://github.com/KingCM/bioinf ... er/fastq_handler.py 这是我写的一个实现脚本,使用非常简单,只需要输入fastq文件即可,统计结果展示如下:由于原始的fastq文件很大,这里只截取了前100行作为示范。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

4

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2020-1-15 12:45:10 | 显示全部楼层
本帖最后由 liyujie 于 2020-1-15 13:49 编辑
  1. #!usr/bin/env python
  2. #-*- coding:utf-8 -*-

  3. # learning wen https://github.com/biopython/biopython/blob/master/Bio/SeqIO/QualityIO.py
  4. #(1)计算每条reads的平均碱基质量值
  5. #(2)计算得到不同碱基质量值的碱基数
  6. #(3)总结如下统计内容:
  7. #fastq文件的N含量
  8. #碱基质量值低于5的比例
  9. #计算GC含量
  10. #计算Q20的比例
  11. #计算Q30的比例


  12. def fileopen(fq):
  13.     if fq.endswith(".gz"):
  14.         return gzip.open(fq,"rU")
  15.     else:
  16.         return open(fq,"rU")

  17. def trimfq(fq,start,end):
  18.     with fileopen(fq) as Infq, open("trim_"+str(start)+"_"+str(end)+"_"+os.path.basename(fq)):
  19.         for record in SeqIO.parse(Infq, "fastq"):
  20.             subfq = record[start:end]
  21.             outfq.write(subfq.format("fastq"))

  22. def randomfq(fq):
  23.     pass

  24. def qualstat(qualDict,qual,L,up):
  25.     quals=0
  26.     for k,v in qualDict.items():
  27.         if up == "T":
  28.             if int(k) > int(qual):
  29.                 quals+=int(v)
  30.         elif up == "F":
  31.             if int(k) < int(qual):
  32.                 quals+=int(v)
  33.         else:
  34.             print "wrong1"
  35.     return  round(float(quals)/L,4) * 100

  36. def statfq(fq):
  37.     with fileopen(fq) as Infq:
  38.         A,G,C,T,N,L,n = 0,0,0,0,0,0,0
  39.         qual_dict = {}
  40.         for record in SeqIO.parse(Infq, "fastq"):
  41.             n+=1
  42.             seqfq=record.seq
  43.             qualfqL=record.letter_annotations["phred_quality"]
  44.             A += seqfq.count("A")
  45.             C += seqfq.count("C")
  46.             T += seqfq.count("T")
  47.             G += seqfq.count("G")
  48.             N += seqfq.count("N")
  49.             for qual in qualfqL:
  50.                 qual_dict[qual] = qual_dict.get(qual,0) + 1
  51.             L += len(seqfq)
  52.         GCstat = round(float(G+C)/L,4) * 100
  53.         Nstat = round(float(N)/L,4) * 100
  54.         Q20 = qualstat(qual_dict,20,L,"T")
  55.         Q30 = qualstat(qual_dict,30,L,"T")
  56.         Q5low = qualstat(qual_dict,15,L,"F")
  57.         total = n

  58.         return GCstat,Nstat,Q20,Q30,Q5low,qual_dict,total



  59. if __name__ == '__main__' :
  60.     from Bio import SeqIO
  61.     import gzip
  62.     import sys,os

  63.     fq1 = sys.argv[1]
  64.     fq2 = sys.argv[2]
  65.     fq1GC,fq1N,fq1Q20,fq1Q30,fq1Q5,fq1qual,fq1total = statfq(fq1)
  66.     fq2GC,fq2N,fq2Q20,fq2Q30,fq2Q5,fq2qual,fq2total = statfq(fq2)
  67.    
  68.     print  "total reads of read1 / read2: ",fq1total,"\t",fq2total
  69.     print  "GC of read1 / read2: ",fq1GC,"\t",fq2GC
  70.     print  "N of read1 / read2: ",fq1N,"\t",fq2N
  71.     print  "Q20 of read1 / read2: ",fq1Q20,"\t",fq2Q20
  72.     print  "Q30 of read1 / read2: ",fq1Q30,"\t",fq2Q30
  73.     print  "below Q5 of read1 / read2: ",fq1Q5,"\t",fq2Q5
  74.     for k1,v1 in fq1qual.items():
  75.         print "Qual of read1: ",k1,"\t",v1

  76.     for k2,v2 in fq2qual.items():
  77.         print "Qual of read2: ",k2,"\t",v2
复制代码


回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则