1.2 Meta-information lines
可以把这些 ## 开头的行理解成 VCF 的“说明书 / 数据库 schema”:它们不描述具体变异,而是定义后面正文里会用到的版本、字段、类型、参考序列、样本和关系。解析器必须先读它们,才能正确解释数据行。
Meta-information lines 就是 VCF 的“元数据 / schema 区”:
##fileformat 定版本,##INFO 定 INFO 列,##FILTER 定过滤码,##FORMAT 定样本格式,##ALT 定符号等位基因,##contig 定染色体,##SAMPLE 和 ##PEDIGREE 定样本与基因组关系。先定义,后使用,解析器才能正确读懂后面的数据行。
总原则:
- 元信息行以
##开头,必须是key=value形式。 ##fileformat必须存在,且必须是文件第一行。- 强烈建议把正文中用到的
INFO、FILTER、FORMAT字段都在头部声明。 - 这些行虽然是可选的,但只要写了,就必须格式完全正确。
#CHROM ...是表头行,不是元信息行;它只有一个#。
1.2.1 File format:文件版本
##fileformat=VCFv4.2
- 必须有,且只能是第一行。
- 说明这是 VCF 4.2 格式。
- 如果解析器看到别的版本,可能按不同规则处理。
1.2.2 Information field format:INFO 字段定义
INFO 列里可以写很多键值,例如:
NS=3;DP=14;AF=0.5;DB;H2
这些键必须在头部有定义,格式为:
##INFO=<ID=ID,Number=number,Type=type,Description="description",Source="source",Version="version">
其中:
ID:INFO 键名,例如DP、AF。Number:这个字段有几个值。Type:值类型。Description:描述,必须用双引号。Source、Version:推荐字段,用于说明注释来源和版本。
前四个键 ID、Number、Type、Description 是必需的。
Type 可选类型
INFO 的 Type 可以是:
IntegerFloatFlagCharacterString
Number 的常见值
Number 是整数,也可以是特殊字符:
| Number | 含义 |
|---|---|
1 | 一个值 |
2 | 两个值 |
A | 每个 ALT 等位基因一个值,顺序与 ALT 一致 |
R | 每个可能等位基因一个值,包括 REF |
G | 每个可能基因型一个值,常用于 FORMAT |
. | 数量可变、未知或无界 |
0 | 用于 Flag,表示没有值 |
例如:
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership">
DP=14:一个整数。AF=0.5,0.2:如果 ALT 有两个等位基因,就按顺序给两个频率。DB:Flag 类型,正文里只写键名,不写=1。
Flag 类型不包含值,所以 Number 必须为 0。
转义
Description 必须用双引号包围。如果描述里有双引号,要写成 \";反斜杠写成 \\。
Source 和 Version 也推荐用双引号,例如:
##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele",Source="dbsnp",Version="138">
额外字段可以加在默认字段后面。即使额外字段是数字,也建议按字符串存储。
1.2.3 Filter field format:FILTER 定义
FILTER 列表示这个位点是否通过过滤。自定义过滤码要这样定义:
##FILTER=<ID=q10,Description="Quality below 10">
##FILTER=<ID=s50,Description="Less than 50% of samples have data">
含义:
ID是过滤码,会出现在正文 FILTER 列,例如q10。Description解释这个过滤码代表什么。PASS是保留词,表示通过所有过滤,通常不需要自定义。0是保留的,不应作为过滤码。
例如数据行:
20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017
这里 q10 就来自上面的 ##FILTER 定义。
1.2.4 Individual format field format:FORMAT 定义
如果文件包含样本基因型,就会有 FORMAT 列和样本列。FORMAT 定义样本列中冒号分隔的子字段:
##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=ID,Number=number,Type=type,Description="description">
FORMAT 的 Type 可以是:
IntegerFloatCharacterString
注意:FORMAT 字段一般不用 Flag。它的 Number 规则和 INFO 类似,也支持 A、R、G、. 等特殊值。
例如数据行:
FORMAT NA00001 NA00002 NA00003
GT:GQ:DP 0/0:48:1 0/1:9:8 1/1:43:5
解析器靠 ##FORMAT 知道:
GT是字符串,表示基因型;GQ是整数,表示基因型质量;DP是整数,表示深度。
1.2.5 Alternative allele field format:ALT 定义
对于不精确的结构变异,ALT 可以用符号表示,例如 <DEL>、<DUP>。这些符号要在头部定义:
##ALT=<ID=DEL,Description="Deletion relative to the reference">
##ALT=<ID=DUP,Description="Region of elevated copy number relative to the reference">
格式:
##ALT=<ID=type,Description="description">
ID 表示结构变异类型,可以写一级类型,也可以用冒号分隔子类型。ID 大小写敏感,不能包含空白或尖括号。
一级类型必须是以下之一:
DEL:缺失INS:插入新序列DUP:拷贝数升高区域INV:倒位CNV:拷贝数可变区域,可能同时包含缺失和重复
如果有更具体的类型,就不应该用 CNV。保留子类型包括:
DUP:TANDEM:串联重复DEL:ME:移动元件缺失INS:ME:移动元件插入
此外,规范强烈建议在头部包含描述参考序列和 contig 的标签。这些标签类似 SAM 里的 SQ 字段,但都是可选的。
对于 ##INFO、##FORMAT、##FILTER、##ALT,都可以在默认字段后加额外字段。例如:
##INFO=<ID=ID,Number=number,Type=type,Description="description",Source="description",Version="128">
这里 Source 和 Version 就是额外字段。
1.2.6 Assembly field format:断点组装文件
结构变异的断点组装可以引用外部 FASTA 文件:
##assembly=url
例如:
##assembly=ftp://somewhere.org/assembly.fa
VCF 记录里的结构变异可以通过 BKPTID INFO 键引用这个文件中的组装序列。
1.2.7 Contig field format:contig 定义
VCF 里的 CHROM 列最好都有对应的 contig 定义。格式类似参考序列,但多一个 URL 标签:
##contig=<ID=ctg1,URL=ftp://somewhere.org/assembly.fa,...>
也可以像例子中那样写:
##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
这些标签高度推荐,但不是 VCF 文本格式的硬性要求。它们允许不同 contig 来自不同文件。
不过要注意:转成 BCF2 时,所有 contig 定义必须完整,记录不能引用头部没有的 contig。
1.2.8 Sample field format:样本到基因组映射
可以定义样本和基因组之间的映射:
##SAMPLE=<ID=S_ID,Genomes=G1_ID;G2_ID;...GK_ID,Mixture=N1;N2;...;NK,Description=S1;S2;...;SK>
含义:
ID:样本 ID。Genomes:这个样本包含哪些基因组,用分号分隔。Mixture:各基因组的混合比例。Description:描述。
例如癌症样本中,一个肿瘤样本可能混合了正常基因组和肿瘤基因组。
1.2.9 Pedigree field format:基因组关系
可以记录基因组之间的家系或衍生关系:
##PEDIGREE=<Name_0=G0-ID,Name_1=G1-ID,...Name_N=GN-ID>
或者链接到数据库:
##pedigreeDB=URL
一般形式表示 Name_0 衍生自 Name_1 到 Name_N。在癌症 VCF 中,也常用 Derived 和 Original 表示克隆衍生关系,例如:
##PEDIGREE=<Derived=PRIMARY-TUMOR-GENOME-ID,Original=GERMLINE-GENOME-ID>
一个综合例子
##fileformat=VCFv4.2
##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=DB,Number=0,Type=Flag,Description="dbSNP membership">
##FILTER=<ID=q10,Description="Quality below 10">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
##contig=<ID=20,length=62435964>
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001
20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB GT:GQ 0|0:48
解析器读完后就知道:
- 这是 VCF 4.2;
NS、DP是整数,AF是每个 ALT 一个浮点数,DB是 Flag;q10是一个过滤码;GT、GQ是样本格式字段;20是合法 contig;- 数据行里的
NS=3、DP=14、AF=0.5、DB、GT:GQ都有明确含义。
常见错误
##fileformat不在第一行。Description没加双引号。Flag类型写了值,例如DB=1,正确写法是只写DB。Number或Type和正文数据不一致。- 自定义 INFO / FORMAT 字段没有在头部声明。
- 转 BCF2 时 contig 没有完整定义,或 INFO / FORMAT 没有完全类型化。
FILTER里用了自定义过滤码但头部没有##FILTER定义。
一句话总结
1.2 Meta-information lines 就是 VCF 的“元数据 / schema 区”:
##fileformat 定版本,##INFO 定 INFO 列,##FILTER 定过滤码,##FORMAT 定样本格式,##ALT 定符号等位基因,##contig 定染色体,##SAMPLE 和 ##PEDIGREE 定样本与基因组关系。先定义,后使用,解析器才能正确读懂后面的数据行。