DNA 5. 基因组变异文件VCF格式详解

图片

点击关注,桓峰基因

桓峰基因

生物信息分析,SCI文章撰写及生物信息基础知识学习:R语言学习,perl基础编程,linux系统命令,Python遇见更好的你

106篇原创内容

公众号

这期介绍一下基因组变异结果常见的文件格式 VCF。因为好多老师搞不清这个文件该怎么看以及怎么操作,其实这个问题要从base calling 说起,无论哪个软件检测的结果,都会生成这种公认的文件格式,学会处理VCF后续的分析就顺风顺水了!

前 言

VCF(variant call format)是一种文本文件格式(很可能以压缩的方式存储)。包含元信息行(##为前缀),标题行(#为前缀)和数据行,每个数据行都包含基因组中某个位置的信息和每个位置上样本的基因型信息(由制表符分隔的文本字段)。不允许零长度字段,可以使用 “.” 代替。为了确保跨平台的互操作性,符合VCF的实现必须同时支持LF (“\n”)和CR+LF (“\r\n”)换行约定。

参考文档下载:

链接:https://pan.baidu.com/s/1VPOJIAb7FkjurqflNqFvFQ?pwd=hfjy 
提取码:hfjy

===

SNP/INDEL文件详解

举例说明SNP/INDEL文件,从下面20行开始:

20行:质量不错的SNP;

21行:当SNP的质量是低于10,可能被过滤掉;

22行:这个位点的两个备用等位基因,其中一个T是祖先(可能是一个参考测序错 误),一个位点叫做单体型(即没有备用等位基因),一个缺失2个碱基(TC),

23行:插入1个碱基(T)。

24行:假设获得三个样本的基因型数据,其中两个是phased,第三个是unphased,每个样本的基因型质量,深度和单倍型质量(后者仅适用于分阶段样本)以及基因型,微卫星检测是unphased。

phased注释:测到的是一对同源染色体上的两个碱基,比如,一个SNP标记在一个个体当中的的结果是AA,在另一个个体当中的结果是TT, 若两个SNP标记在同一条染色体上后,如果这个两个位点都是杂合的,一个是AT,另一个是AG,这个时候就有两种可能,要么AA是在同一个同源染色单体上(AA是一种单倍型,haplotype),要么AG(单倍型)是在同一个同源染色单体上,如果我们知道这个信息,那么这个基因型就是phased genotype, 如果我们不确定谁和谁在同一条同源染色单体上,那么这时测得的基因型就是unphased genotype.
##fileformat=VCFv4.3
##fileDate=20090805
##source=myImputationProgramV3.1
##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
##phasing=partial
##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
##FILTER=<ID=q10,Description="Quality below 10">
##FILTER=<ID=s50,Description="Less than 50% of samples have data">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3

每列数据的说明:

第一列 CHROM:染色体。
第二列 POS:基因组位置。
第三列 ID:变异位点的rsID号,如果没有的话用".“表示。
第四列 REF:与参考基因组一样的位点。
第五列 ALT:与参考基因组不一样的位点。
第六列 QUAL:call出这个位点的质量。这个值等于-10log10§,p值是call错alt allele错误的概率。也就是QUAL越大出错概率越小。
第七列 FILTER:对变异位点进行过滤,如果通过则为PASS,如果没有进行过滤就是”."。
第八列 INFO:这一列是额外信息。可能是平台的信息,也可以是DP等的信息:

图片

第九列 FORMAT:最后是比较让人注意的Genotype也就是基因型等的信息,比较重要的是GT,DP和AD:

GT,即genotype,表示为0/1, 1/1, 0/0或者是0|1, 1|0, 0|0, 1|2等。其实

  1. 0代表REF allele;

  2. 1代表第一个ALT allele;

  3. 2代表第二个ALT allele。

比如第22行REF是A,ALT是C,T(有两个ALT)。某个人是A/C,那么基因型就是0/1,A/T的话就是0/2,C/C就是1/1,以此类推。此外还可能见到0|1或者1|1中间是竖线不是斜线的情况,这种是已经phased的genotype,也就是已经知道REF/ALT allele是来自于父亲还是母亲了。比如有的数据库的phased的数据是|前的是父亲的allele,|后的是母亲的allele。比如REF是A,ALT是C,T;基因型为1|0,则父亲是第一个ALT也就是C,母亲是REF也就是A。不过对于有的phased数据而言第一个并不一定是父亲。

DP:这个位点的深度。

AD: REF和ALT allele的深度。

图片

图片

  • 碱基替换

因为碱基替换只有两个等位基因,所以有以下两个分离的单倍型,就是碱基替换,如下:

#CHROM POS ID REF ALT QUAL FILTER INFO
20 3 . C T . PASS DP=100

图片

  • 碱基插入

这是碱基插入,因为参考基因组上的C被C加上三个插入基TAG所取代。同样,只有两个等位基因所以有下面两个分离的单倍型。

#CHROM POS ID REF ALT QUAL FILTER INFO
20 3 . C CTAG . PASS DP=100

图片

  • 碱基删除

这是两个参考碱基的缺失,因为参考等位基因TCG被T(参考碱基)取代了。同样,只有两个等位基因所以我有下面两个分离的单倍型。

#CHROM POS ID REF ALT QUAL FILTER INFO
20 2 . TCG T . PASS DP=100

图片

**注意:**在VCF文件中,上面每个基序列中明确列出的分子等效性,因此等效G的实际位置不被保留。为了完整性,所以一个VCF记录是SNP、Indel、Mixed还是Reference位点取决于记录中等位基因的属性。

  • 微卫星

这是个混合类型记录,包含2碱基插入和2碱基删除。有三个分离的等位基因所以我有三个以下的单倍型

#CHROM POS ID REF ALT QUAL FILTER INFO
20 4 . GCG G,GCGCG . PASS DP=100

图片

请注意,在所有这些例子中都添加了破折号,以使单倍型更清晰,但当然,VCF没有提供碱基之间的等价性。从技术上讲,以下是一种等效对准

图片

结构变异详解

结构变异的替代等位基因中,ID字段表示结构变异的类型,可以是类型和子类型的冒号分隔列表。ID值是区分大小写的字符串,不能包含空格、逗号或尖括号。

图片

第一个级别类型必须是以下类型之一:

图片

  • 结构变体(SV)

下面包含了结构变体的示例,按顺序显示:

28行:一个已知断点的精确缺失,一个碱基的微同源性,以及缺失的纯合样本;

29行:缺失约205 bp;

30行:一个ALU元素相对于基因组的不精确的删除;

31行:L1元素相对于参考基因组的不精确插入;

32行:大约21Kb的不精确的重复。样本的基因型是3号拷贝(重复序列的一个额外拷贝);

33行:76bp的不精确串联重复。样本基因型为拷贝数5(但两个单倍型尚不清楚)。

#fileformat=VCFv4.3
##fileDate=20100501
##reference=1000GenomesPilot-NCBI36
##assembly=ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/release/sv/breakpoint_assemblies.fasta
##INFO=<ID=BKPTID,Number=.,Type=String,Description="ID of the assembled alternate allele in the assembly file">
##INFO=<ID=CIEND,Number=2,Type=Integer,Description="Confidence interval around END for imprecise variants">
##INFO=<ID=CIPOS,Number=2,Type=Integer,Description="Confidence interval around POS for imprecise variants">
##INFO=<ID=END,Number=1,Type=Integer,Description="End position of the variant described in this record">
##INFO=<ID=HOMLEN,Number=.,Type=Integer,Description="Length of base pair identical micro-homology at event breakpoints">
##INFO=<ID=HOMSEQ,Number=.,Type=String,Description="Sequence of base pair identical micro-homology at event breakpoints">
##INFO=<ID=SVLEN,Number=.,Type=Integer,Description="Difference in length between REF and ALT alleles">
##INFO=<ID=SVTYPE,Number=1,Type=String,Description="Type of structural variant">
##ALT=<ID=DEL,Description="Deletion">
##ALT=<ID=DEL:ME:ALU,Description="Deletion of ALU element">
##ALT=<ID=DEL:ME:L1,Description="Deletion of L1 element">
##ALT=<ID=DUP,Description="Duplication">
##ALT=<ID=DUP:TANDEM,Description="Tandem Duplication">
##ALT=<ID=INS,Description="Insertion of novel sequence">
##ALT=<ID=INS:ME:ALU,Description="Insertion of ALU element">
##ALT=<ID=INS:ME:L1,Description="Insertion of L1 element">
##ALT=<ID=INV,Description="Inversion">
##ALT=<ID=CNV,Description="Copy number variable region">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype quality">
##FORMAT=<ID=CN,Number=1,Type=Integer,Description="Copy number genotype for imprecise events">
##FORMAT=<ID=CNQ,Number=1,Type=Float,Description="Copy number genotype quality for imprecise events">
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001
1 2827694 rs2376870 CGTGGATGCGGGGAC C . PASS SVTYPE=DEL;END=2827708;HOMLEN=1;HOMSEQ=G;SVLEN=-14 GT:GQ 1/1:14
2 321682 . T <DEL> 6 PASS SVTYPE=DEL;END=321887;SVLEN=-205;CIPOS=-56,20;CIEND=-10,62 GT:GQ 0/1:12
2 14477084 . C <DEL:ME:ALU> 12 PASS SVTYPE=DEL;END=14477381;SVLEN=-297;CIPOS=-22,18;CIEND=-12,32 GT:GQ 0/1:12
3 9425916 . C <INS:ME:L1> 23 PASS SVTYPE=INS;END=9425916;SVLEN=6027;CIPOS=-16,22 GT:GQ 1/1:15
3 12665100 . A <DUP> 14 PASS SVTYPE=DUP;END=12686200;SVLEN=21100;CIPOS=-500,500;CIEND=-500,500 GT:GQ:CN:CNQ ./.:0:3:16.2
4 18665128 . T <DUP:TANDEM> 11 PASS SVTYPE=DUP;END=18665204;SVLEN=76;CIPOS=-10,10;CIEND=-10,10 GT:GQ:CN:CNQ ./.:0:5:8.
  • 指定具有断点的复杂重排

N个任意重排事件可以概括为一组新的邻接。每个邻接连接在一起的两个断点。在新邻接的任意一端的两个断头称为邻边。有一行VCF(即一条记录)为每两个断点在一个新的邻接。在INFO字段中用标记SVTYPE=BND标识中断记录。breakend记录的REF字段表示从位置POS开始的碱基或碱基序列s,就像所有VCF记录一样。断点记录的ALT字段表示对s的替换。这种替换包括三个部分:

  1. 替换s的字符串t。如果在形成新的邻接关系时插入了一些新的碱基,则字符串t可能是s的扩展版本。

  2. 副断头的位置p,用形式为chr:pos的字符串表示。这是第一个映射的基地的位置,在这片被连接在这个新的邻接。

  3. 连接序列从p开始继续前进的方向。这由围绕p的方括号的方向表示。

这3个元素以4种可能的方式组合起来创建ALT,在这4种情况下,断言s被替换为t,然后一些从位置p开始的部分被连接到t

图片

下图中的示例显示了一个包含6个断点的3-break操作。例证了邻接中所有可能的断点方向。注意ALT字段如何表示断点的方向。

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321681 bnd W G G]17:198982] 6 PASS SVTYPE=BND
2 321682 bnd V T ]13:123456]T 6 PASS SVTYPE=BND
13 123456 bnd U C C[2:321682[ 6 PASS SVTYPE=BND
13 123457 bnd X A [17:198983[A 6 PASS SVTYPE=BND
17 198982 bnd Y A A]2:321681] 6 PASS SVTYPE=BND
17 198983 bnd Z C [13:123457[C 6 PASS SVTYPE=BND

图片

  • 短序列的插入

有时在两个断点之间插入一些碱基,这些信息也包含在ALT列中,如下:

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321682 bnd V T ]13 : 123456]AGTNNNNNCAT 6 PASS SVTYPE=BND;MATEID=bnd U
13 123456 bnd U C CAGTNNNNNCA[2 : 321682[ 6 PASS SVTYPE=BND;MATEID=bnd V

图片

  • 超大序列的插入

如果插入太长而不能方便地存储在ALT列中,如图3中所示的329个基本插入,则可以用程序集文件中的一个contig表示,如下:

#CHROM POS ID REF ALT QUAL FILTER INFO
13 123456 bnd U C C[<ctg1>: 1[ 6 PASS SVTYPE=BND
13 123457 bnd V A ] <ctg1 >: 329]A 6 PASS SVTYPE=BND

图片

注意:在两个碱基对之间完全插入序列的特殊情况下,建议使用上述速记符号:

#CHROM POS ID REF ALT QUAL FILTER INFO
13 321682 INS0 T C<ctg1 > 6 PASS SVTYPE=INS

如果只插入的一部分,比如从位置7到位置214,则VCF为:

#CHROM POS ID REF ALT QUAL FILTER INFO
13 123456 bnd U C C[<ctg1>: 7[ 6 PASS SVTYPE=BND
13 123457 bnd V A ] <ctg1 >: 214]A 6 PASS SVTYPE=BND

如果是圆的,并且插入一个从229到45的线段,即从329继续到1,这是通过添加一个圆形邻接来表示的吗

#CHROM POS ID REF ALT QUAL FILTER INFO
13 123456 bnd U C C[<ctg1 >: 229[ 6 PASS SVTYPE=BND
13 123457 bnd V A ] <ctg1 >: 45]A 6 PASS SVTYPE=BND
<ctg1 > 1 bnd X A ] <ctg1 >: 329]A 6 PASS SVTYPE=BND
<ctg1 > 329 bnd Y T T[<ctg1 >: 1[ 6 PASS SVTYPE=BND
  • 多配对变异

如果一个断裂端有多个配对,如图4(由于断裂端重复使用或测量的不确定性),这些交替的邻接被视为交替等位基因:

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321682 bnd V T ]13 : 123456]T 6 PASS SVTYPE=BND;MATEID=bnd U
13 123456 bnd U C C[2 : 321682[,C[17 : 198983[ 6 PASS SVTYPE=BND;MATEID=bnd V,bnd Z
17 198983 bnd Z A ]13 : 123456]A 6 PASS SVTYPE=BND;MATEID=bnd U

图片

  • 确定的配对

在参考基因组中连接但在变异中断开的两个断裂称为配对。每个断端只有一个配对,通常是一个碱基对左右。然而,在重新排列过程中观察到一些基本修理的损失并不罕见。breakend的配对可以显示命名,如图5所示

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321681 bnd W G G[13 : 123460[ 6 PASS PARID=bnd V;MATEID=bnd X
2 321682 bnd V T ]13 : 123456]T 6 PASS PARID=bnd W;MATEID=bnd U
13 123456 bnd U C C[2 : 321682[ 6 PASS PARID=bnd X;MATEID=bnd V
13 123460 bnd X A ]2 : 321681]A 6 PASS PARID=bnd U;MATEID=bnd W

图片

  • 染色体终端

对于涉及到参考染色体端粒末端的重排,定义了一个虚拟端粒断裂末端,作为端粒上的断裂末端的断裂配对。这样每一次分开都有一个匹配。如果染色体从位置1延伸到N,则虚拟端粒断裂位于位置0和N+1。例如,描述整个1号染色体到13号染色体的易位,如图6所示:

#CHROM POS ID REF ALT QUAL FILTER INFO
1 0 bnd X N .[13 : 123457[ 6 PASS SVTYPE=BND;MATEID=bnd V
1 1 bnd Y T ]13 : 123456]T 6 PASS SVTYPE=BND;MATEID=bnd U
13 123456 bnd U C C[1 : 1[ 6 PASS SVTYPE=BND;MATEID=bnd Y
13 123457 bnd V A ]1 : 0]A 6 PASS SVTYPE=BND;MATEID=bnd X

图片

  • 单个重排

如前所述,单个重排事件可以描述为一组新的邻接。例如,一个相互的重排,如图7所示:

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321681 bnd W G G[13 : 123457[ 6 PASS SVTYPE=BND;MATEID=bnd X;EVENT=RR0
2 321682 bnd V T ]13 : 123456]T 6 PASS SVTYPE=BND;MATEID=bnd U;EVENT=RR0
13 123456 bnd U C C[2 : 321682[ 6 PASS SVTYPE=BND;MATEID=bnd V;EVENT=RR0
13 123457 bnd X A ]2 : 321681]A 6 PASS SVTYPE=BND;MATEID=bnd W;EVENT=RR0

图片

  • 染色体倒位

类似地,可以用两种方法等价地描述如图8所示的倒置。任何一种都可以使用前面描述的简写表示法(推荐用于简单情况):

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321682 INV0 T <INV> 6 PASS SVTYPE=INV;END=421681
#or one describes the breakends:
#CHROM POS ID REF ALT QUAL FILTER INFO
2 321681 bnd W G G]2 : 421681] 6 PASS SVTYPE=BND;MATEID=bnd U;EVENT=INV0
2 321682 bnd V T [2 : 421682[T 6 PASS SVTYPE=BND;MATEID=bnd X;EVENT=INV0
2 421681 bnd U A A]2 : 321681] 6 PASS SVTYPE=BND;MATEID=bnd W;EVENT=INV0
2 421682 bnd X C [2 : 321682[C 6 PASS SVTYPE=BND;MATEID=bnd V;EVENT=INV0

图片

  • 断裂位置的不确定性

有时很难确定换行符的确切位置,通常是因为正在修改的序列之间存在同源性,如图9所示。然后将断点任意放置在最左边的位置,不确定性用CIPOS标记表示。然后构造ALT字符串,假设这个任意的断点选择。上图表示具有微同源性的非互易易位。即使我们知道断端U和断端V被重新排列,实际上放置这些断端可能是极其困难的。红色和绿色虚线代表了序列证据允许的最极端的可能重组事件。因此,我们将U和V任意地置于可能性区间内

#CHROM POS ID REF ALT QUAL FILTER INFO
2 321681 bnd V T T]13 : 123462] 6 PASS SVTYPE=BND;MATEID=bnd U;CIPOS=0,6
13 123456 bnd U A A]2 : 321687] 6 PASS SVTYPE=BND;MATEID=bnd V;CIPOS=0,6

请注意,断点U的ALT字符串的坐标不对应于断点V的指定位置,但如果U的位置是固定的,V将采取的位置(反之亦然)。CIPOS标签描述了U和V位置的不确定性。由于MATEID标签,中断的U和V是同伴的事实得以保留。如果这是一个互易位,那么会有额外的断点X和Y,比如X是V在Chr 2上的伙伴,Y是U在Chr 13上的伙伴,并且会有两行VCF用于XY的新邻接。根据断点X和Y选择的位置,仅从它们的位置来看,X是V的伙伴,Y是U的伙伴这一点可能并不明显。对于断点V,可以在VCF行中使用标签PARID=bnd X,对于断点U,可以在VCF行中使用标签PARID=bnd Y,反之亦然。

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于vcf文件比对到参考基因组鉴定单核苷酸变异的代码可以使用Python编写,主要包含以下步骤: 1. 解析vcf文件:使用vcfpy等Python库解析vcf文件,获取每个位点的信息,包括染色体位置、参考碱基、变异碱基等。 ```python import vcfpy # 读取vcf文件 vcf_reader = vcfpy.Reader.from_path("sample.vcf") # 遍历每个位点 for record in vcf_reader: chrom = record.CHROM # 染色体位置 pos = record.POS # 基因组位置 ref = record.REF # 参考碱基 alt = record.ALT[0] # 变异碱基 ``` 2. 比对到参考基因组:使用Bowtie2等比对软件将样本序列比对到参考基因组,得到比对结果。可以使用Python库pysam处理比对结果。 ```python import pysam # 打开bam文件 bam_file = pysam.AlignmentFile("sample.bam", "rb") # 按照染色体位置和基因组位置获取比对结果 for pileup_column in bam_file.pileup(chrom, pos-1, pos): # 遍历每个碱基 for pileup_read in pileup_column.pileups: # 判断碱基是否为参考碱基 if pileup_read.query_position is None: continue if pileup_read.alignment.query_sequence[pileup_read.query_position] != ref: # 错误碱基 else: # 参考碱基 ``` 3. 筛选单核苷酸变异:根据参考碱基和变异碱基的长度是否相同来判断是否为单核苷酸变异。 ```python if len(ref) == 1 and len(alt) == 1: # 单核苷酸变异 else: # 非单核苷酸变异 ``` 4. 鉴定变异类型:根据参考碱基和变异碱基的不同,鉴定变异类型,包括突变、同义突变、错义突变等。 ```python if ref == 'A' and alt == 'G': # A->G 突变 elif ref == 'C' and alt == 'T': # C->T 突变 elif ref == 'G' and alt == 'A': # G->A 突变 elif ref == 'T' and alt == 'C': # T->C 突变 elif ref == alt: # 同义突变 else: # 错义突变 ``` 5. 输出结果:根据变异类型输出结果,可以将结果保存到文件中。 ```python if ref == 'A' and alt == 'G': print("A->G 突变") elif ref == 'C' and alt == 'T': print("C->T 突变") elif ref == 'G' and alt == 'A': print("G->A 突变") elif ref == 'T' and alt == 'C': print("T->C 突变") elif ref == alt: print("同义突变") else: print("错义突变") ``` 以上是基于vcf文件比对到参考基因组鉴定单核苷酸变异的简单代码示例,具体根据需要进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值