golang 解析fastq格式
【摘要】 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,第二行是测序的碱基序列,第三行一般无意义,主要起到占位的作用,第四行是测序的每个碱基对应的质量值。质量值的计算公式来自于
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值,如下:
解析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)