三代变异检测操作说明-DeepVariant

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三代变异检测操作说明-DeepVariant相关的知识,希望对你有一定的参考价值。

参考技术A

众所周知,三代测序的单碱基测序错误率远远高于二代测序,PB的单碱基错误率有10-15%,而ONT也有5-20%[1],那么如此高的错误率是不是就一定不能做SNP和INDEL的变异检测了呢?答案是当然有办法做检测。PacBio公司2019年推出CCS模式的测序能够产出单碱基的正确性足以媲美二代测序的HiFi数据,从而实现SNP和INDEL的检测。下面我们就一起来看看检测方法吧。

SNP:单核苷酸多态性(single nucleotide polymorphism,SNP),是一种DNA序列变异,是基因组中单个核苷酸腺嘌呤(A)、胸腺嘧啶(T)、胞嘧啶(C)或鸟嘌呤(G)在物种成员之间或个体配对染色体之间的差异,最常见也最简单的一种基因组变异形式。

INDEL:一种短多态性,很短的Insertion 和 Deletion,即在DNA序列中添加或删除少量碱基,主要指在基因组某个位置上发生较短长度的线性片段插入或者删除的现象。强调线性的原因是,这里的插入和删除是有前后顺序的与结构性变异不同,INDEL长度通常在50bp以下,更多时候甚至是不超过10bp。据估计,在现代人类中,约有1-2百万个频率高低不等的INDEL,绝大多数发生在短串联重复区域。

SNP和INDEL变异检测有助于我们更深入地了解基因组,认识基因变异和疾病的之间的联系,从测序数据中进行准确的检测变异是医学研究的基础。

目前SNP和INDEL变异检测的软件有很多,下表是一篇文献测评了比较流行的检测软件,我们可以看出DeepVariant软件表现是很优秀的。接下来我们详细介绍下DeepVarient。

左边:筛选候选的变异位点集合;中间:SNN训练样本;右边:用训练好的模型判断Genotype。

DeepVarient官方提供了3种安装方式:

注意事项:
1.只能在类似于unix的系统上运行,无法在window系统运行
2.依赖环境Python 2.7

参数说明如下:

DeepVarient更多参数参考如下:

DeepVarient软件输出结果为vcf格式文件,相信做生物信息的小伙伴都很熟悉了,这里不再赘述。

DeepVarient运行结束后,SNP和INDEL还在一个vcf文件里,为了后续单独分析,我们可以用GATK分离他们,命令如下:

-select-type参数分别给定SNP和INDEL,将会分别得到对应变异类型的结果,输出仍然是vcf格式的文件。有了这个结果后,就可以进行后续的分析了。

特别说明:
作者在文中使用了GIAB数据作为验证并与GATK进行对比,DeepVariant胜出。
据文献测评[1],DeepVarient应用CCS模型,减少了约30%的indel假阴性和假阳性,达到了97.835%的准确率和97.141%召回率。

参考文献

获取查询/变异操作名称

【中文标题】获取查询/变异操作名称【英文标题】:Get query/mutation operation name 【发布时间】:2019-11-24 17:22:54 【问题描述】:

如何在上下文中获取操作名称?在解析器中,我可以使用 info 参数得到它。

import  ApolloServer  from 'apollo-server'

const server = new ApolloServer(
  context: ( req ) => 
    // Get query/mutation operation name like getAllUsers
  
)

server.listen()

【问题讨论】:

您可以传入一个虚拟(但格式正确)的请求 - 或一个真实的请求,就此而言,检查 req 对象并相当容易地找出用于隔离信息的键你在追求吗? @Jaxx 抱歉,req 太大。乍一看,我没有找到任何有用的东西。 您可能可以定位req.body,因为我很确定您的操作名称会出现在此处,这会减少输出。此外,您可以将服务器进程输出重定向到文件,例如 npm run start > output.txt,运行您的请求,停止 (ctrl+c) 服务器,然后在文件中搜索您的操作名称。 【参考方案1】:

使用我评论中建议的技术,我能够检索到操作名称。

假设您有以下查询:

query foo 
  baz 
    id
    name
  

req.body 有两个相关的键:

    req.body.query 以字符串格式保存整个查询,保留空格和回车。虽然您可以从该字符串中检索操作名称,但它需要一些字符串操作;即,将字符串转换为对象,然后获取根级键(如果您在单个查询中触发多个操作,则可以是多个)。在上面的示例中,此键将包含以下字符串:'query foo \n baz \n id\n name\n \n'

    req.body.operationName 保存您提供查询的名称IF您命名它。在上面的示例中,此键将保存 'foo'not 'baz' 这是 实际 操作的名称)。但是,您可以通过根据查询包含的操作仔细命名查询来决定利用此功能(但是,如果您在一个查询中触发多个操作,这将不起作用)。如果您没有为查询命名,则此字段包含 null

编辑:请参阅How to parse GraphQL request string into an object 这里的 SO,了解将方法 1 中检索到的字符串转换为 JS 对象并检索您的实际操作名称的方法。

进一步考虑

例如,方法 2 确实适用于调试目的。假设您要记录特定查询的变量,您可以为其命名并执行以下操作:

const server = new ApolloServer(
  context: ( req ) => 
    if (req.body.operationName === 'debugMe') 
      console.log(req.body.variables)
    
  
)

但是,由于方法 2 依赖于客户端命名查询,它不能可靠地用于业务逻辑目的。无论在客户端如何形成查询,只有方法 1 会正确检索操作名称。

【讨论】:

【参考方案2】:

传递给 context 的 req 包含 req.body.query,但是在使用 PostMan 发送 GraphQL 查询进行测试时,我发现我的 Apollo GraphQL 服务器的 req 参数不包含查询的名称(即使我将其命名为上面正确指出的 Thomas Heennes 的初始查询声明)。

不过,我的 req 对象确实包含 req.body.variables。

为了获取查询名称,我从正文中提取了前 40 个字符。您可以将其解析为第一个 ( 或回车,但我只想能够查看查询/突变是什么,所以这对我有用:

context: async (req, connection) => 
      ...
      ...
      let query = null;
      // mutation or query, not a subscription:
      const bodyQuery = req.body && req.body.query;
      if (bodyQuery) 
        query = req.body.query.substring(0,40);
       else 
        query='No query passed in req body';
      
      let variables = null;
      if (req.body.variables) 
        variables = req.body.variables;
      

【讨论】:

以上是关于三代变异检测操作说明-DeepVariant的主要内容,如果未能解决你的问题,请参考以下文章

变异测试(mutation testing):一种评估测试用例集错误检测能力的方法

DNA拷贝数变异CNV检测——基础概念篇

测序技术检测拷贝数变异在染色体疾病综合检测中的应用--转载

肿瘤TMB的计算原理和数学模型

vue-数组更新检测

变异测试变异算子构思路