Fastqc 能够识别的碱基编码格式

Fastqc 能够自动识别序列的碱基编码格式,我查看一下源代码,发现是碱基编码格式一共分为

1)sanger/illumina 1.9

2) illumina 1.3

3) illumina 1.5

其核心的代码为

 public static PhredEncoding getFastQEncodingOffset(final char lowestChar) {
        if (lowestChar < '!') {
            throw new IllegalArgumentException("No known encodings with chars < 33 (Yours was " + lowestChar + ")");
        }
        if (lowestChar < '@') {
            return new PhredEncoding("Sanger / Illumina 1.9", 33);
        }
        if (lowestChar == 'A') {
            return new PhredEncoding("Illumina 1.3", 64);
        }
        if (lowestChar <= '~') {
            return new PhredEncoding("Illumina 1.5", 64);
        }
        throw new IllegalArgumentException("No known encodings with chars > 126 (Yours was " + lowestChar + ")");
    }

通过找到对应的ASCII值最小的碱基质量值来判断对应的编码格式,

在ASCII码表中, ! 代表33,  @ 代表64,A 代表65,~ 代表 126

在维基百科关于fastq格式的描述中介绍了碱基编码的各种格式

在sange format 中采用 33到126 表示0到93, 所以sange 格式的偏移量为33

从illumina 1.3 开始,使用 64和126 来表示0到62, 所以illumina 1.3 格式的偏移量为64

从illumina 1.5 开始,0和1不在使用,最低的质量值为66,

从illumina 1.9 开始,又采用和sange 一样的编码格式

 

所以如果碱基质量的最低值如果小于64,一定是sange/illumian 1.9格式, 不可能是illumina 1.3 和illumina  1.5 的格式,因为这两种格式中最低的质量值都大于64;

为什么碱基最低的等于65就是illumina 1.3呢, 因为在illumina 的文件中,质量值P = -l0 * log10(rate)

rate 表示错误率,然而对于log10这个函数来说,rate 值不可能为0,因为没有10的指数永远不可能为0,肯定是大于0的,所以0对应的64并不会出现,

最小可能出现的也就是65了,而且illumina 1.5 的最小可能出现的值为66,所以最小值为65说明就是illumina 1.3 格式

排除了前面两种可能,这时候就只剩下illumina 1.5了,只要其质量值不出处正常范围,即<= 126 就说明是illumina  1.5

小于33或者大于126都是未知的编码格式

posted on 2016-04-06 14:31  庐州月光  阅读(1861)  评论(0编辑  收藏  举报