golang 解析fastq格式

举报
benymorre 发表于 2019/06/08 13:59:09 2019/06/08
【摘要】 FASTQ格式是NGS测序的主流格式,有时候也有压缩后的fastq.gz格式之前的一篇博客讲到了如何安装GO和biogo这个包,主要用于处理SAM/BAM格式的数据,这一篇讲一下如何处理fastq。Fastq的每一条测序reads主要由四行构成,第一行是这条reads的ID,每一个reads都有一个唯一的ID,第二行是测序的碱基序列,第三行一般无意义,主要起到占位的作用,第四行是测序的每个碱...

FASTQ格式是NGS测序的主流格式,有时候也有压缩后的fastq.gz格式

之前的一篇博客讲到了如何安装GO和biogo这个包,主要用于处理SAM/BAM格式的数据,这一篇讲一下如何处理fastq。


Fastq的每一条测序reads主要由四行构成,第一行是这条reads的ID,每一个reads都有一个唯一的ID,第二行是测序的碱基序列,第三行一般无意义,主要起到占位的作用,第四行是测序的每个碱基对应的质量值。质量值的计算公式来自于


Screenshot 2019-06-08 at 1.47.35 PM.png

p代表这个碱基被检测的时候,发生错误的概率,概率为0.001的时候,代表Q = 30, 目前的二代测序基本上95%的reads的Q都能达到25.


Illumina 1.8+ 以上的版本的Q值计算方法与Sanger方法基本一致,Sanger的Q范围为0-40. Illumina 1.8的Q范围为0-41


Q在Fastq文件中储存时会以ASCII码表示,ASCII码的对应的数值减33 就等于真实的Q值,如下:


illumina_fastq_coding.png


解析fastq的时候只需要根据行数是否能被4整除就可以知道这是ID,或者是Sequence了。


如下:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("sample_01.fastq")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    line_num := 0

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line_num += 1
        line := scanner.Text()

        seqlen := len(line)
        if line_num %4 == 2 {
            //fmt.Println(scanner.Text())
            subseq := line[seqlen-10:seqlen]
            fmt.Println(subseq)
        } else {
            continue
        }

    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

这个go程序能够打印出每个Reads的末尾10个碱基组成的序列(Illumina的测序都是5'端到3‘端,所以也是3’端的10个bases)。


除此之外,还有其它一些分析fastq的工具,参考:

https://www.plob.org/article/1622.html

https://www.plob.org/article/14515.html

https://blog.csdn.net/Cassiel60/article/details/89400551




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。