Bioinformatics VCF 101

Lewis LovelockLewis Lovelock
7 min read

🎉 欢迎来到VCF文件101教程! 🎉

想要像生物信息学忍者一样处理基因组数据吗?那么,理解VCF文件(Variant Call Format,变异位点格式)绝对是你的必修课! 🚀 别担心,这篇教程就像是你的VCF速成班,目标是让你在看完后,能够自信地处理日常的VCF文件分析任务。 😎

教程大纲:

  1. VCF文件是啥?为啥重要? 🤔 (用大白话解释VCF的用途)

  2. VCF文件格式解剖 🦴 (像拆骨头一样,把VCF文件结构拆开讲清楚)

    • Header(头部): 元数据信息,就像文件的“说明书”

    • Data Body(数据主体): 变异位点信息,才是真正的数据内容

  3. 字段逐个击破! 🎯 (详细解释每一列的含义,结合例子,保证你一看就懂)

    • 固定字段:#CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO

    • 可变字段:FORMAT, SAMPLEs (样本列)

  4. VCF文件示例,眼见为实! 🤩 (用一个简单的VCF文件例子,让你把前面学的知识串起来)

  5. VCF文件处理工具箱 🧰 (介绍几个常用的VCF工具,并给出简单示例)

    • bcftools

    • vcftools

    • GATK (Genome Analysis Toolkit)

    • Python/R库

  6. 实战演练!常见VCF分析场景 🚀 (告诉你一些VCF文件在实际分析中怎么用)

  7. 总结与进阶 🎓 (回顾重点,指引你更深入学习的方向)

Let's dive in! 🏊‍♀️


1. VCF文件是啥?为啥重要? 🤔

想象一下,你有一本人类基因组的“蓝图” 📘。 VCF文件就像是这本蓝图上的“勘误表”或者“修订版” 📝。 它记录了在一个或多个个体中,与参考基因组(人类基因组的“标准版本”)不同的地方,也就是基因变异

为啥重要?

  • 个性化医疗 🩺: 每个人基因组都不一样,VCF文件可以帮助我们了解个体差异,从而实现更精准的疾病诊断和治疗。

  • 遗传病研究 🧬: 找到导致遗传病的基因变异,VCF文件是关键数据来源。

  • 药物研发 💊: 了解基因变异如何影响药物反应,加速新药开发。

  • 群体遗传学 🌍: 研究人群之间的基因差异,了解人类进化和迁徙历史。

  • 动植物育种 🌱/🐶: 改良农作物和家畜品种,提高产量和抗性。

总之,VCF文件是生物信息学分析中非常核心的数据格式,理解它,你就能解锁基因组数据的宝藏! 💎


2. VCF文件格式解剖 🦴

VCF文件是文本文件,你可以用任何文本编辑器打开它(比如Notepad++, Sublime Text, Vim, VS Code等等)。 它的结构主要分为两部分:

  • Header (头部): 以 ## 开头的行,提供关于VCF文件本身的元数据信息,例如:

    • VCF版本

    • 参考基因组版本

    • 变异位点信息的定义 (INFO, FORMAT字段的含义)

    • 样本信息 (如果有的话)

    • 等等...

    • Header就像是VCF文件的“说明书”,告诉程序如何解析后面的数据。

  • Data Body (数据主体): 以 # 开头的一行是表头行,定义了每一列的名称。 从第二行开始,每一行代表一个变异位点 (variant) 的信息。 每一列用制表符 \t 分隔。

简单来说,VCF文件就像一个表格,Header是表格的“表头说明”,Data Body是表格的“数据内容”。 📊


3. 字段逐个击破! 🎯

我们来详细看看Data Body的每一列,这是VCF文件的核心内容。

表头行 (以 # 开头的那行) 定义了每一列的名称:

#CHROM    POS    ID    REF    ALT    QUAL    FILTER    INFO    FORMAT    [SAMPLE1]    [SAMPLE2]    ...
  • 前8列是固定字段 (Fixed Fields),在所有VCF文件中都有,且含义固定。

  • FORMATSAMPLEs 列是可变字段 (Variable Fields),它们的存在和内容取决于VCF文件的具体情况。

让我们逐个击破! 💪

固定字段 (Fixed Fields):

  1. #CHROM (Chromosome, 染色体) 🧬

    • 含义: 变异位点所在的染色体名称。

    • 示例: 1, 2, X, Y, MT (线粒体DNA) 或者 chr1, chr2, chrX, chrY, chrM (取决于参考基因组的命名方式)。

    • 重要性: 定位变异在基因组上的位置,后续分析的基础。

  2. POS (Position, 位置) 📍

    • 含义: 变异位点在染色体上的位置 (坐标)。 注意:VCF文件中的位置通常是1-based坐标,也就是说,染色体的第一个碱基位置是1,而不是0。

    • 示例: 12345, 567890

    • 重要性:#CHROM一起确定变异在基因组上的精确位置。

  3. ID (Identifier, 标识符) 🏷️

    • 含义: 变异位点的唯一标识符。 通常来自数据库,例如dbSNP (NCBI数据库) 或 COSMIC (癌症基因组数据库)。 如果没有已知的ID,通常用 . 表示。

    • 示例: rs123456, COSM1234567, .

    • 重要性: 方便链接到已知的变异信息和注释。 rs 开头的ID通常是SNP (单核苷酸多态性) 的dbSNP标识符。

  4. REF (Reference allele, 参考等位基因) 🧬

    • 含义: 参考基因组在该位置的碱基。

    • 示例: A, T, G, C, ATGC (对于插入或缺失变异)。

    • 重要性: 作为比较的基准,说明变异是相对于参考基因组的变化。

  5. ALT (Alternate allele(s), 备选等位基因) 🧬

    • 含义: 在该位置的备选等位基因。 如果有多个备选等位基因,用逗号 , 分隔。

    • 示例: G, C, A,G, <DEL> (缺失), <INS> (插入), <DUP> (重复), <INV> (倒位) 等等。

    • 重要性: 定义了变异的具体类型和碱基变化。 REFALT 共同描述了变异。 <> 括起来的通常是结构变异的符号表示。

  6. QUAL (Quality, 质量) 📊

    • 含义: 变异位点质量得分。 Phred-scaled 质量值,表示变异位点被正确检出的可能性。 数值越高,质量越好。 通常是基于测序数据和变异检测算法计算出来的。 如果没有质量值,可以用 . 表示。

    • 计算方式: -10 * log10(错误概率) 例如,QUAL=30,表示错误概率为 10-3,即千分之一。

    • 示例: 30, 50, 99, .

    • 重要性: 用于评估变异位点检测的可靠性,通常会设置质量阈值进行过滤。

  7. FILTER (Filter, 过滤器) 🚦

    • 含义: 变异位点是否通过了预设的过滤器。 用于标记质量不佳或可疑的变异位点。

    • 可能的值:

      • PASS: 通过所有过滤器,质量良好。

      • 一个或多个过滤器名称,用分号 ; 分隔: 表示该变异位点未通过这些过滤器。 过滤器名称通常在Header的 ##FILTER 行中定义。

      • .: 没有应用任何过滤器。

    • 示例: PASS, q10;s50, .

    • 重要性: 用于筛选高质量的变异位点,减少假阳性结果。

  8. INFO (Information, 信息) ℹ️

    • 含义: 关于变异位点的额外信息,以键值对 (key=value) 的形式存储,用分号 ; 分隔。 不同的信息用不同的键 (key) 表示,键的含义在Header的 ##INFO 行中定义。

    • 示例: AC=2;AF=0.5;DP=100;MQ=55.0

      • AC=2: Allele Count (等位基因计数), 备选等位基因在所有样本中的总计数为2。

      • AF=0.5: Allele Frequency (等位基因频率), 备选等位基因在所有样本中的频率为0.5 (50%)。

      • DP=100: Depth (深度), 所有样本在该位点的总测序深度为100。

      • MQ=55.0: Mapping Quality (比对质量), 平均比对质量为55.0。

    • 重要性: 提供变异位点的各种注释和统计信息,用于更深入的分析和解读。 常见的INFO字段包括:

      • AC (Allele Count)

      • AF (Allele Frequency)

      • DP (Depth)

      • MQ (Mapping Quality)

      • QD (Quality by Depth)

      • SOR (Strand Odds Ratio)

      • FS (Fisher Strand bias)

      • MQRankSum (Mapping Quality Rank Sum Test)

      • ReadPosRankSum (Read Position Rank Sum Test)

      • ANN (Variant Annotation, 变异注释,通常包含变异对基因、转录本、蛋白等的影响信息,格式比较复杂,需要查阅具体注释工具的文档)

      • 等等... 具体有哪些INFO字段,要看VCF文件的Header部分的 ##INFO 行定义。

可变字段 (Variable Fields):

  1. FORMAT (Format, 格式) ⚙️

    • 含义: 定义了后面 SAMPLEs 列中每个样本数据的格式。 它是一个格式描述字符串,用冒号 : 分隔不同的字段,每个字段对应 SAMPLEs 列中的一个数据。 FORMAT 字段的含义在Header的 ##FORMAT 行中定义。

    • 示例: GT:AD:DP:GQ:PL

      • GT: Genotype (基因型)

      • AD: Allelic Depth (等位基因深度), 每个等位基因的测序深度。

      • DP: Depth (深度), 该样本在该位点的总测序深度。

      • GQ: Genotype Quality (基因型质量), 基因型质量得分。

      • PL: Phred-scaled genotype Likelihoods (基因型似然值)。

    • 重要性: 定义了样本数据的结构和内容,是解读样本数据的关键。 常见的FORMAT字段包括:

      • GT (Genotype)

      • AD (Allelic Depth)

      • DP (Depth)

      • GQ (Genotype Quality)

      • PL (Phred-scaled genotype Likelihoods)

      • PGT (Phasotype Genotype)

      • PID (Phase Set ID)

      • 等等... 具体有哪些FORMAT字段,要看VCF文件的Header部分的 ##FORMAT 行定义。

  2. [SAMPLE1], [SAMPLE2], ... (样本列) 👨‍👩‍👧‍👦

    • 含义: 每个样本在该变异位点的数据。 列名就是样本的ID。 每个样本的数据格式由 FORMAT 列定义,用冒号 : 分隔,顺序与 FORMAT 列中的字段顺序一致。

    • 示例 (假设 FORMAT 列为 GT:AD:DP:GQ:PL):

      • 样本 SAMPLE1 的数据可能是: 0/1:12,8:20:99:10,0,100

        • GT=0/1: 基因型,0/1 表示杂合子,携带一个参考等位基因 (0) 和一个备选等位基因 (1)。 0/0 是纯合参考基因型,1/1 是纯合备选基因型。 | 表示 phased (单倍型已知), / 表示 unphased (单倍型未知)。

        • AD=12,8: 等位基因深度,参考等位基因深度为12,备选等位基因深度为8。

        • DP=20: 总深度为20。

        • GQ=99: 基因型质量得分为99。

        • PL=10,0,100: 基因型似然值,分别对应 0/0, 0/1, 1/1 三种基因型的似然值 (Phred-scaled)。

      • 样本 SAMPLE2 的数据可能是: 0/0:25,0:25:90:0,90,1000

    • 重要性: 提供了每个样本在该变异位点的具体基因型和相关数据,是进行下游分析 (例如,家系分析、病例对照研究) 的基础。

总结一下,Data Body的每一行 (除了表头行) 代表一个变异位点,每一列提供关于这个变异位点的不同信息,固定字段是通用的基本信息,可变字段提供样本特异的信息和更详细的变异描述。 🤯


4. VCF文件示例,眼见为实! 🤩

让我们看一个简单的VCF文件示例:

##fileformat=VCFv4.2
##fileDate=20231027
##reference=GRCh38
##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##FILTER=<ID=q10,Description="Quality below 10">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=AD,Number=R,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth at this position for each sample">
#CHROM    POS    ID    REF    ALT    QUAL    FILTER    INFO    FORMAT    SAMPLE1    SAMPLE2
1    100    rs123    A    G    50    PASS    AC=2;AF=0.5;DP=20    GT:AD:DP    0/1:10,10:20    0/1:10,10:20
1    200    .    C    T,G    30    q10    AC=1,1;AF=0.25,0.25;DP=30    GT:AD:DP    0/0:20,0:20    0/1:10,5:15
2    300    rs456    G    A    99    PASS    AC=4;AF=1.0;DP=50    GT:AD:DP    1/1:0,20:20    1/1:0,30:30

解释:

  • Header部分:

    • ##fileformat=VCFv4.2: VCF文件版本是 4.2。

    • ##fileDate=20231027: 文件生成日期是 2023年10月27日。

    • ##reference=GRCh38: 参考基因组版本是 GRCh38。

    • ##INFO=...: 定义了 INFO 字段中 AC, AF, DP 的含义。

    • ##FILTER=...: 定义了过滤器 q10 的含义 (质量低于10)。

    • ##FORMAT=...: 定义了 FORMAT 字段中 GT, AD, DP 的含义。

  • Data Body部分:

    • 表头行: #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2

    • 第一行数据:

      • 1 100 rs123 A G 50 PASS AC=2;AF=0.5;DP=20 GT:AD:DP 0/1:10,10:20 0/1:10,10:20

      • 染色体: 1,位置: 100, ID: rs123, 参考碱基: A, 备选碱基: G, 质量: 50, 过滤器: PASS, INFO: AC=2;AF=0.5;DP=20, FORMAT: GT:AD:DPSAMPLE1数据: 0/1:10,10:20SAMPLE2数据: 0/1:10,10:20

      • 含义: 在染色体1的位置100,有一个SNP变异 (A -> G), dbSNP ID是 rs123, 质量为50, 通过了所有过滤器。 在两个样本 (SAMPLE1, SAMPLE2) 中都是杂合子 (0/1), 且参考等位基因和备选等位基因的测序深度都是10。

    • 第二行数据:

      • 1 200 . C T,G 30 q10 AC=1,1;AF=0.25,0.25;DP=30 GT:AD:DP 0/0:20,0:20 0/1:10,5:15

      • 染色体: 1,位置: 200, ID: . (未知ID), 参考碱基: C, 备选碱基: T,G (多个备选等位基因), 质量: 30, 过滤器: q10 (未通过q10过滤器), INFO: AC=1,1;AF=0.25,0.25;DP=30, FORMAT: GT:AD:DPSAMPLE1数据: 0/0:20,0:20SAMPLE2数据: 0/1:10,5:15

      • 含义: 在染色体1的位置200,有两个备选SNP变异 (C -> T 和 C -> G), 没有dbSNP ID, 质量为30, 未通过q10过滤器。 样本 SAMPLE1 是纯合参考基因型 (0/0), 样本 SAMPLE2 是杂合子 (0/1,这里指 C -> T 变异,因为在ALT列中 T 排在前面)。

    • 第三行数据:

      • 2 300 rs456 G A 99 PASS AC=4;AF=1.0;DP=50 GT:AD:DP 1/1:0,20:20 1/1:0,30:30

      • 染色体: 2,位置: 300, ID: rs456, 参考碱基: G, 备选碱基: A, 质量: 99, 过滤器: PASS, INFO: AC=4;AF=1.0;DP=50, FORMAT: GT:AD:DPSAMPLE1数据: 1/1:0,20:20SAMPLE2数据: 1/1:0,30:30

      • 含义: 在染色体2的位置300,有一个SNP变异 (G -> A), dbSNP ID是 rs456, 质量为99, 通过了所有过滤器。 在两个样本 (SAMPLE1, SAMPLE2) 中都是纯合备选基因型 (1/1)。

通过这个例子,你应该对VCF文件的结构和字段含义有了更直观的理解! 🤓


5. VCF文件处理工具箱 🧰

处理VCF文件,我们需要一些强大的工具。 这里介绍几个常用的命令行工具和编程库:

  • bcftools 🧰: 瑞士军刀级别的VCF/BCF (VCF的二进制格式) 工具集。 功能强大,速度快。 常用功能:

    • 查看 VCF 文件: bcftools view input.vcf.gz (支持压缩的VCF文件)

    • 过滤变异位点: bcftools filter -e 'QUAL<30 || DP<10' input.vcf.gz -o filtered.vcf.gz -O z (过滤掉质量低于30或深度低于10的变异位点,输出压缩VCF)

    • 索引 VCF 文件: bcftools index input.vcf.gz (为了快速随机访问VCF文件,需要先建立索引,通常用于大型VCF文件)

    • 合并 VCF 文件: bcftools merge input1.vcf.gz input2.vcf.gz -o merged.vcf.gz -O z (合并多个VCF文件)

    • 统计 VCF 文件信息: bcftools stats input.vcf.gz -o stats.txt (生成VCF文件的统计报告)

    • 更多功能: 变异位点格式转换, 基因型操作, 群体遗传学分析 等等...

  • vcftools 🧰: 另一个流行的VCF处理工具集。 功能也很丰富,侧重于过滤和统计。 常用功能:

    • 过滤变异位点: vcftools --vcf input.vcf --minQ 30 --minDP 10 --recode --recode-INFO-all --out filtered (过滤掉质量低于30或深度低于10的变异位点,输出新的VCF文件 filtered.recode.vcf)

    • 统计变异位点信息: vcftools --vcf input.vcf --site-quality --site-depth --out site_stats (生成位点质量和深度统计文件)

    • 转换为其他格式: vcftools --vcf input.vcf --plink --out plink_format (转换为 PLINK 格式,用于群体遗传学分析)

    • 更多功能: 计算 allele frequency, 过滤样本, 提取特定区域的变异位点 等等...

  • GATK (Genome Analysis Toolkit) 🧰: 一套强大的基因组分析工具包,由 Broad Institute 开发。 虽然主要用于变异检测流程,但也包含一些 VCF 文件操作工具,例如:

    • VariantFiltration (变异位点过滤): gatk VariantFiltration -V input.vcf.gz -filter "QD < 2.0 || MQ < 40.0 || FS > 60.0 || SOR > 3.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" -filter-name "VQSR_FAILED" -O filtered.vcf.gz (使用 GATK 推荐的硬过滤标准过滤变异位点)

    • SelectVariants (选择变异位点): gatk SelectVariants -V input.vcf.gz -select-type SNP -O snps_only.vcf.gz (选择 SNP 变异,输出 SNP VCF 文件)

    • 更多 GATK 工具: VariantManipulation 工具组中有更多 VCF 操作工具。

  • Python/R 库 🐍/📊: 如果你喜欢编程,可以使用 Python 或 R 的库来处理 VCF 文件。

    • Python:

      • PyVCF: 用于读取、写入和操作 VCF 文件的 Python 库。

      • cyvcf2: 更快速的 VCF 解析库 (C 语言实现)。

    • R:

      • vcfR: 用于读取和处理 VCF 文件的 R 包。

      • VariantAnnotation: Bioconductor 包,用于变异注释和分析。

示例: 使用 bcftools 过滤 VCF 文件

假设你有一个名为 variants.vcf.gz 的VCF文件,你想过滤掉质量值 (QUAL) 低于 30 的变异位点,并保存为新的 VCF 文件 filtered_variants.vcf.gz

命令:

bcftools filter -e 'QUAL<30' variants.vcf.gz -o filtered_variants.vcf.gz -O z

解释:

  • bcftools filter: 运行 bcftoolsfilter 子命令,用于过滤变异位点。

  • -e 'QUAL<30': -e 参数指定过滤表达式,'QUAL<30' 表示保留质量值大于等于 30 的变异位点 (表达式为真则保留,为假则过滤掉)。

  • variants.vcf.gz: 输入 VCF 文件。

  • -o filtered_variants.vcf.gz: -o 参数指定输出文件名,filtered_variants.vcf.gz 是过滤后的 VCF 文件名。

  • -O z: -O 参数指定输出文件格式,z 表示 bgzip 压缩的 VCF 文件 (.vcf.gz 后缀)。

运行这个命令后,你就会得到一个过滤后的 VCF 文件 filtered_variants.vcf.gz,其中只包含质量值大于等于 30 的变异位点。 🎉


6. 实战演练!常见VCF分析场景 🚀

了解了VCF格式和工具,我们来看看一些常见的VCF分析场景:

  • 变异位点过滤 (Variant Filtering): 这是最基本的操作。 根据质量值 (QUAL), 深度 (DP), 基因型质量 (GQ), 过滤器状态 (FILTER), INFO字段信息 (例如 allele frequency) 等条件,筛选高质量的变异位点,去除假阳性结果。 常用工具: bcftools filter, vcftools 的过滤选项, GATK VariantFiltration

  • 变异位点注释 (Variant Annotation): 将变异位点与已知的基因、功能区域、疾病关联等信息关联起来。 常用的注释工具包括 VEP (Variant Effect Predictor), ANNOVAR, SnpEff 等。 注释信息通常会添加到 VCF 文件的 INFO 列中 (或者生成新的注释文件)。

  • 变异位点格式转换 (VCF Conversion): 将 VCF 文件转换为其他格式,例如 PLINK 格式 (用于群体遗传学分析), BED 格式 (用于基因组区域操作) 等。 常用工具: vcftools, 编程库。

  • VCF 文件合并 (VCF Merging): 将多个 VCF 文件合并成一个文件,例如合并不同样本的 VCF 文件,或者合并不同变异检测流程生成的 VCF 文件。 常用工具: bcftools merge, GATK MergeVcfs.

  • VCF 文件子集提取 (VCF Subsetting): 提取 VCF 文件的子集,例如提取特定染色体或基因区域的变异位点, 提取特定类型的变异 (SNP, Indel) , 提取特定样本的变异信息。 常用工具: bcftools view, vcftools 的区域/样本选择选项, GATK SelectVariants.

  • 群体遗传学分析 (Population Genetics Analysis): 基于 VCF 文件进行群体遗传学分析,例如计算 allele frequency, FST, PCA, LD (linkage disequilibrium) 等。 常用工具: vcftools, PLINK, EIGENSOFT, ADMIXTURE, ANGSD 等。

  • 关联分析 (Association Analysis): 将 VCF 文件中的基因变异与表型数据 (例如疾病状态, 药物反应) 进行关联分析,寻找与表型相关的基因变异。 常用工具: PLINK, GCTA, R 包 (例如 qqman, gapit)。

这些只是一些常见的应用场景,VCF 文件的应用非常广泛,几乎涉及到所有基因组学相关的研究领域。 🚀


7. 总结与进阶 🎓

恭喜你! 🎉 你已经完成了VCF文件101教程的学习! 现在你应该对VCF文件的格式、字段含义、常用工具和基本应用场景有了全面的了解。 你已经迈出了成为生物信息学忍者的第一步! 🥷

回顾一下重点:

  • VCF文件是记录基因变异信息的标准文本格式。

  • VCF文件由 Header 和 Data Body 两部分组成。

  • Data Body 的每一行代表一个变异位点,包含固定字段 (CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO) 和可变字段 (FORMAT, SAMPLEs)。

  • 理解每个字段的含义是解读 VCF 文件的关键。

  • bcftools, vcftools, GATK 是常用的 VCF 文件处理工具。

  • VCF 文件广泛应用于个性化医疗、遗传病研究、药物研发、群体遗传学等领域。

进阶学习方向:

  • 深入了解 VCF 格式规范: 阅读 VCF 格式规范文档 (官方文档或维基百科)。

  • 学习更多 VCF 工具和高级用法: 深入学习 bcftools, vcftools, GATK 的各种功能和参数。

  • 掌握编程处理 VCF 文件: 学习使用 Python 或 R 库 (例如 PyVCF, vcfR) 编程处理 VCF 文件,实现更灵活的分析流程。

  • 学习变异注释和数据库: 了解常用的变异注释工具 (VEP, ANNOVAR, SnpEff) 和数据库 (dbSNP, ClinVar, COSMIC) ,以及如何利用注释信息进行生物学解读。

  • 实践!实践!再实践!: 下载一些公开的 VCF 文件 (例如 1000 Genomes Project, gnomAD),使用工具进行练习,解决实际问题。

生物信息学的世界广阔而精彩,VCF 文件只是冰山一角。 继续探索,不断学习,你会在基因组数据的海洋中发现更多宝藏! 🌊

祝你学习愉快!Happy VCF-ing! 😄

0
Subscribe to my newsletter

Read articles from Lewis Lovelock directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Lewis Lovelock
Lewis Lovelock

I am a developer working in BGI located in Shenzhen. I am familiar with genomics 🧬 and coding. I love 🏀 👩🏻‍💻 and Hiphop🎵