JEXL格式是Java的表达式引擎,对于我这本科生物背景的学渣,Java脚本都没见过长啥样。这里通过GATK的相关文档学习一下。
-
简而言之,就是一串字符串,而这串字符串可以告诉GATK该去看哪一个注释信息并且根据规则进行过滤。主要包括三个成分:键、值以及连接二者的操作符。
完整的语句必须用双引号引起来,键是字符串,对应的值可以是字符串、数字或布尔值(TRUE或FALSE)。如果对应的值里面是字符串,还需要加单引号将值引起来。比如
-
使用多个注释
可以通过两个注释指标建立新的表达式,比如下面这个,通过QUAL和DP作比小于10的位点去除
可以通过逻辑连接符(&&或者AND)使用多个过滤条件
"QUAL > 30.0 && DP == 10"
如果想满足其中之一的过滤条件,使用反斜线连接。尽量不要用OR代替反斜线,如果数据集中缺少表达式中的某一注释,会将整个表达式否定。
"QD < 2.0"
"ReadPosRankSum < -20.0"
"FS > 200.0"
-
筛选样本/基因型水平的特征
在VCF文件格式中,有FORMAT栏,以冒号:分隔的条目,分别针对着后面每个样本的相关特征值。
针对过滤的样本,Variant Filtration会将样本水平的FT标签加入到FORMAT栏中(不知道具体长什么样子,先暂时记录下来)。就作者所言,目前这个功能还没方便可用到他们满意的程度。
针对其他的常见的特征值,如GQ,可以直接 "GQ < 5.0"进行过滤。
针对genotype的filtering,GATK提供了更加方便的提取方法。使用三个表达式分别对应三种不同的基因型。也就是上一篇推送中提到的过滤。
isHet == 1 heterozygous calls 1/0,0/1杂合型
isHomRef == 1 homozygous-reference calls 0/0纯和参考基因组基因型
isHomVar == 1 homozygous-variant calls 1/1纯和变异基因型
-
重要提醒
关于JEXL表达式的书写,其对大小写是敏感的,对数据类型也是非常敏感的,比如字符串、(非)整数型、浮点数型或布尔型等。
针对过滤,尤其是多种条件组合的过滤,尽量还是分布过滤以方便知道每一次过滤发生了什么,毕竟很多条件在一起运行,如果报错了,第一时间很难知道到底是哪一个条件出了问题。
以及官方的一点建议:The GATK does not recommend use of compound filtering expressions, e.g. the logical || "OR". For such expressions, if a record is null for or missing a particular annotation in the expression, the tool negates the entire compound expression and so automatically passes the variant record even if it fails on one of the expressions.
后面还有一些高级的使用方法,这里就不作搬运了。
不要指望通过这就懂了Java的JEXL格式,目前我对自己的要求就是:够用就行,不够再学!!
原文参考:
https://gatk.broadinstitute.org/hc/en-us/articles/360035891011
https://gatk.broadinstitute.org/hc/en-us/articles/360035531112#2
感兴趣也可以通过阅读原文继续学习(可能对国内网络不太友好, 如果打不开建议复制上面链接到浏览器多试几次)
↓↓↓
发表评论