Calling short variants with GATK4

计算生物学实验5: Calling short variants with GATK4

1. 实验目的

本实验目的是利用 GATK4 工具准确高效地检测出基因组中的短变异。通过该工具对样本基因组进行分析,旨在发现单核苷酸变异(SNV)和小的插入缺失(Indel)等短变异类型。同时利用FreeBayes工具进行变异的发现,对两种工具的结果进行比较,能更好的认识发现变异的数据分析的过程。

2. 实验准备

2.1 实验平台

Linux JSvr02 3.10.0-1160.80.1.el7.x86_64 #1 SMP Tue Nov 8 15:48:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

2.2 数据简述

D. melanogaster WGS paired-end Illumina data:

DataSampleSource
SRR1663608ZW155NCBI
SRR1663609ZW177NCBI
SRR1663610ZW184NCBI
SRR1663611ZW185NCBI
2.3 软件配置
软件版本
GATKv4.1.9.0
FreeBayesv1.3.5
IGVIGV_2.18.4
samtools1.7
bwa0.7.17-r1188
vcftools0.1.15

3. 实验内容

分别用GATK4和FreeBayes软件进行变异发现,并对两者产生的结果进行比较,给出结论。

3.1 Calling short variants with GATK4

用GATK4对数据进行变异发现,并用IGV可视化。

(a) Fetch input files and scripts to your local scratch directory

cd /workdir
mkdir s20223282034
cd s20223282034
mkdir tmp

cp /work/cb-data/Variants_workshop_2020/*.fastq.gz .
cp -r /work/cb-data/Variants_workshop_2020/genome .
cp -r /work/cb-data/Variants_workshop_2020/scripts .

tmp is a temporary directory where Java will be instructed to store its scratch files.

(b)prepare reference genome

nohup ./scripts/prepare_genome.sh >& prepare_genome.log &
  • nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

Bash scripts:

#!/bin/bash

# index reference genome for bwa, create fasta indexes (fai and dict)

TMP=/workdir/$USER/tmp
GATKDIR=/programs/gatk-4.1.9.0
export PATH=$GATKDIR:$PATH

cd genome

# Genome summary files needed and by GATK tools
gatk CreateSequenceDictionary -R genome.fa  -O genome.dict
samtools faidx genome.fa

# index for BWA alignment
bwa index genome.fa

# index image file needed by some Spark-based tools (if used)
gatk --java-options "-Djava.io.tmpdir=$TMP -Xmx4g -Xms4g" BwaMemIndexImageCreator \
     -I genome.fa \
     -O genome.fa.img

Approximate run time: 10 minutes.

result:

在这里插入图片描述

The files genome.fa.fai and genome.fa.dict are simple text files summarizing chromosome sizes and starting byte positions in the original FASTA file.

The other files constitute the BWA index.

©Align reads to reference

nohup ./scripts/bwa_aln.sh SRR1663608 ZW155 >& bwa_aln_SRR1663609.log &

Bash scripts:

#!/bin/bash

REFFASTA=./genome/genome.fa

# Un-comment one of the accession/sample pair below to run alignment for this sample

ACC=$1
SAM=$2

#ACC=SRR1663608
#SAM=ZW155

#ACC=SRR1663609
#SAM=ZW177

#ACC=SRR1663610
#SAM=ZW184

#ACC=SRR1663611
#SAM=ZW185

# bwa will run on 4 CPUs (-t 4)

echo Alignment started
date

bwa mem -M -t 4 \
-R "@RG\tID:${ACC}\tSM:${SAM}\tLB:${SAM}\tPL:ILLUMINA" $REFFASTA \
${ACC}_thinned_1.fastq.gz  ${ACC}_thinned_2.fastq.gz \
| samtools view -Sb - > $ACC.bam

echo Alignment finished
date

该脚本需要两个参数,即accession和sample。Approximate run time: 10 minutes .

  • -M: mark shorter split hits as secondary;
  • -t:number of threads;
  • -R: read group header line such as ‘@RG\tID:foo\tSM:bar’

Result:

在这里插入图片描述

(d)Sort and mark duplicates

nohup ./scripts/sort_dedup_index.sh SRR1663608 >& \ sort_dedup_index_SRR1663608.log &

Bash scripts:

# This is safer than putting them in default /tmp, which is usually small

echo Dedup/sorting started
date

gatk --java-options "-Xmx16g -Xms16g" MarkDuplicatesSpark \
            -I ${ACC}.bam \
            -O ${ACC}.sorted.dedup.bam \
            -M ${ACC}.sorted.dedup.txt \
            --tmp-dir $TMP \
            --conf 'spark.executor.cores=4'

# Separate indexing not needed if CREATE_INDEX true in MarkDuplicates

#echo Indexing started
#date

此处尝试设置-Xmx4g -Xms4g,运行报错,JVM内存被耗尽。

在这里插入图片描述

增大内存限制,问题得以解决。Approximate run time: 10 minutes .

Check the alignment stats summary of the obtained file :

samtools flagstat SRR1663608.sorted.dedup.bam

Can you tell how many reads have been mapped? How many have been marked as duplicate?

在这里插入图片描述

观察结果,共比对上9606227个reads,其中740970个reads被标记为duplicates。

(e)Visualize the alignments using IGV

Use FileZilla to transfer genome.faSRR1663608.sorted.dedup.bamSRR1663608.sorted.dedup.bam.bai to your laptop.Visualize the alignments using IGV.

在这里插入图片描述

选择一个片段,可以看到read是的mapping情况。

(f)Run GATK HaplotypeCaller on individual samples

nohup ./scripts/hc.sh SRR1663608 >& hc_SRR1663608.log &

Bash scripts:

#!/bin/bash

REFFASTA=./genome/genome.fa
GATKDIR=/programs/gatk-4.1.9.0
#TMP=/workdir/$USER/tmp
#上述TMP位置不存在,故需修改
TMP=./tmp
export PATH=$GATKDIR:$PATH

export JAVA_HOME=/usr/local/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH

# We will run the genotyping on one chromosome only.
# Other chromosomes clould be handlen in separate runs,
# possibly in parallel..

REGION=chr2R

ACC=$1

# multi-threading does not work well here - they recommend using Queue to
# parallelize over regions, or just manually run a few in parallel...

echo Genotyping for $ACC started
date

gatk --java-options "-Xmx4g"  HaplotypeCaller \
      --tmp-dir $TMP \
     -R $REFFASTA \
     -I $ACC.sorted.dedup.bam  \
     -L $REGION \
     -ERC GVCF \
     --native-pair-hmm-threads 4 \
     --minimum-mapping-quality 30 \
     -O $ACC.g.vcf

echo Run ended
date

To save time, we will concentrate on one chromosome, chr2R (seethe -L option in hc.sh script).

The expected result will be the file SRR1663608.g.vcf . containing the intermediate genotyping data for thissample in GVCF format.
The estimated run time of this step is 1 hour.

Result:

在这里插入图片描述

To save time ,fetch all the ready-made *.g.vcf files.

cp /work/cb-data/Variants_workshop_2020/premade_gvcf/*.g.vcf* .

(g) Joint variant calling with GenotypeGVCFs

nohup ./scripts/combineGVCFs.sh >& combineGVCFs.log &

bash scripts:

#!/bin/bash

REFFASTA=./genome/genome.fa
GATKDIR=/programs/gatk-4.1.9.0
#TMP=/workdir/$USER/tmp
TMP=./tmp

export PATH=$GATKDIR:$PATH

export JAVA_HOME=/usr/local/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH

# the gVCFG files obyained before need to be combined to be used with GenotypeGVCFs tool

REGION=chr2R


echo Combining GVCFs started
date

gatk --java-options "-Xmx4g -Xms4g" CombineGVCFs \
     --tmp-dir $TMP \
     -R $REFFASTA \
     -L $REGION \
     --variant SRR1663608.g.vcf \
     --variant SRR1663609.g.vcf \
     --variant SRR1663610.g.vcf \
     --variant SRR1663611.g.vcf \
     -O all.g.vcf

echo Run ended
date

Estimated run time:5~6minutes.

Result:

在这里插入图片描述

To save time ,copy the pre-made *.bam and the corresponding *.bai files to your directory.

(h) Filter variants

grep "#" all.vcf > all.qual60.vcf
grep -v "#" all.vcf | awk '{if($6>60) print}' >> all.qual60.vcf

The first command extracts the VCF header lines (containing “#”) into a new VCF file, while thesecond command processes the non-header lines, appending them to the new file only if thesixth column (that’s where QUAL is) is above 60.

  • >>表示追加,即不清空原文件的内容,在源文件内容后面追加新的内容。

Result:

在这里插入图片描述

GATK offers a tool called VariantFiltration, which allows more complex filtering patterns.

nohup ./scripts/filter_vcf.sh all >& filter_vcf.log &

bash scripts:

#!/bin/bash

REFFASTA=./genome/genome.fa
GATKDIR=/programs/gatk-4.1.9.0
TMP=./tmp

export PATH=$GATKDIR:$PATH

export JAVA_HOME=/usr/local/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH

VCF=$1     # this should be the name *without* .vcf extension!

echo Run started
date

# Separate snps
gatk --java-options "-Xmx4g -Xms4g" SelectVariants \
    --tmp-dir $TMP \
    -R $REFFASTA \
    -V $VCF.vcf \
    --select-type-to-include SNP \
    -O $VCF.snps.vcf

# Filter SNPs
gatk --java-options "-Xmx4g -Xms4g" VariantFiltration \
    --tmp-dir $TMP \
    -R $REFFASTA \
    -V $VCF.snps.vcf \
    --filter-expression "QD < 2.0 || FS > 60.0 || MQ < 40.0 || ReadPosRankSum < -8.0" \
    --filter-name "my_snp_filter" \
    -O $VCF.snps.filtered.vcf

# Separate indels
gatk --java-options "-Xmx4g -Xms4g" SelectVariants \
    --tmp-dir $TMP \
    -R $REFFASTA \
    -V $VCF.vcf \
    --select-type-to-include INDEL \
    -O $VCF.indels.vcf

# Filter indels
gatk --java-options "-Xmx4g -Xms4g" VariantFiltration \
    --tmp-dir $TMP \
    -R $REFFASTA \
    -V $VCF.indels.vcf \
    --filter-expression "QD < 2.0 || FS > 200.0" \
    --filter-name "my_indel_filter" \
    -O $VCF.indels.filtered.vcf

# Merge filtered files
gatk --java-options "-Djava.io.tmpdir=$TMP -Xmx4g -Xms4g" MergeVcfs \
   -R $REFFASTA \
   -I $VCF.snps.filtered.vcf \
   -I $VCF.indels.filtered.vcf \
   -O $VCF.filtered.vcf \

echo Run ended
date

Result:

在这里插入图片描述

Note that no variant has been removed from the file. The ones that failed filtering are just marked as such. Estimated run time: 3 minutes.

3.2 Joint variant calling using FreeBayes

用FreeBayes对数据进行变异发现

conda activate FreeBayes
nohup ./scripts/fb.sh >& fb.log &

bash scripts:

#!/bin/bash

#FB=/programs/freebayes/bin/freebayes
FB=freebayes

REFFASTA=./genome/genome.fa

echo Started at
date

$FB -f $REFFASTA \
SRR1663608.sorted.dedup.bam \
SRR1663609.sorted.dedup.bam \
SRR1663610.sorted.dedup.bam \
SRR1663611.sorted.dedup.bam \
--min-mapping-quality 30 \
-r chr2R > fb.vcf

echo Completed at
date

error:

在这里插入图片描述

经查询错误信息,认为是samtools出现问题,尝试解决,建立软链接:

ln -s /work/miniconda3/lib/libcrypto.so.1.1 /work/miniconda3/lib/libcrypto.so.1.0.0

在这里插入图片描述

权限不足,请求被拒绝。

3.3 Basic stats and comparison of variant sets

对发现的变异进行统计,并对两种不同软件发现的变异进行比较。

(a) Using Linux commands

grep -v "#" all.vcf | wc -l
#result:423493
grep -v "#" all.vcf | awk '{if($1=="chr2R" && $2 >=10000 && $2 <=20000) print}' >extracted_records
awk '{if($7=="PASS") print}' all.filtered.vcf | wc -l
#result:417825

(b) Using GATK4’s Concordance and GenotypeConcordance tools

./scripts/var_compar.sh fb all ZW155 >& var_compar.log &

bash scripts:

#!/bin/bash

REFFASTA=./genome/genome.fa
GATKDIR=/programs/gatk-4.1.9.0
TMP=/workdir/$USER/tmp

export PATH=$GATKDIR:$PATH

export JAVA_HOME=/usr/local/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH

# Supply only core file names (i.e., without .vcf suffix) of the VCF files
VCF1=$1
VCF2=$2
SAMPLE=$3

# variants in VCF2 will be called "truth", and those from VCF1
# will be "evaluated" against them.

# Check site concordance between two variant sets
gatk --java-options "-Xmx2g -Djava.io.tmpdir=$TMP" Concordance \
   -R $REFFASTA \
   --evaluation $VCF1.vcf  \
   --truth $VCF2.vcf \
   --summary $VCF1.$VCF2.comp.site_summary


# Check genotype concordance for sample SAMPLE
gatk --java-options "-Xmx2g -Djava.io.tmpdir=$TMP" GenotypeConcordance \
   --CALL_VCF $VCF1.vcf  \
   --TRUTH_VCF $VCF2.vcf \
   --CALL_SAMPLE $SAMPLE \
   --TRUTH_SAMPLE $SAMPLE \
   --O $VCF1.$VCF2.comp

由于FreeBayes发现变异的步骤失败,故无结果。

© Using vcftools

  1. Obtain basic VCF statistics (number of samples and variant sites):

    vcftools --vcf all.vcf --freq -c > all.freqs
    

    result:423493 (same to using linux commands)
    在这里插入图片描述

  2. Extract subset of variants (chromosome chr2R, between positions 1M and 2M) and write them toa new VCF file

    vcftools --vcf all.vcf --chr chr2R --from-bp 1000000 --to-bp 2000000 --recode --
    recode-INFO-all -c > subset.vcf
    

    Result:

    在这里插入图片描述

  3. Get allele(等位基因) frequencies for all variants and write them to a file

    vcftools --vcf all.vcf --freq -c > all.freqs
    

    Result:
    在这里插入图片描述

  4. Compare two VCF files

    vcftools --vcf fb.vcf --diff all.vcf --out fb.all.compare
    

    由于没有fb.vcf,无结果。

4. 实验总结

4.1 实验结论

GATK4 能够有效地识别样本基因组中的单核苷酸变异和小的插入缺失等短变异类型。该工具具有较高的准确性和可靠性,为后续的疾病研究和遗传分析提供了坚实的数据基础。同时,实验过程也表明,正确的参数设置和数据预处理对于获得高质量的结果至关重要。

4.2 实验收获

学会了GATK4工具和FreeBayes工具的使用,并复习了许多Linux的命令操作,对变异发现的过程有了较好的理解。

4.3 其它心得

实践过程中,可以多查阅分析软件的官方文档,这样既能提高英语阅读能力,也能更正确的认识这些软件。
d write them to a file

vcftools --vcf all.vcf --freq -c > all.freqs

Result:

[外链图片转存中…(img-APRbfE5A-1729756791664)]

  1. Compare two VCF files

    vcftools --vcf fb.vcf --diff all.vcf --out fb.all.compare
    

    由于没有fb.vcf,无结果。

4. 实验总结

4.1 实验结论

GATK4 能够有效地识别样本基因组中的单核苷酸变异和小的插入缺失等短变异类型。该工具具有较高的准确性和可靠性,为后续的疾病研究和遗传分析提供了坚实的数据基础。同时,实验过程也表明,正确的参数设置和数据预处理对于获得高质量的结果至关重要。

4.2 实验收获

学会了GATK4工具和FreeBayes工具的使用,并复习了许多Linux的命令操作,对变异发现的过程有了较好的理解。

4.3 其它心得

实践过程中,可以多查阅分析软件的官方文档,这样既能提高英语阅读能力,也能更正确的认识这些软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906752.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

《机器学习by周志华》学习笔记-神经网络-04全局最小误差与局部极小误差

1、神经网络中误差的概念及公式 根据上文《逆误差传播算法》我们可以知道误差公式的演化: ① 第k个训练样例的误差函数: ②该训练集的累积误差函数: ③正则化误差目标函数: 其中: :表示第k个训练样例的误差;:表示连接权重和阈值任意参数;根据上文我们可知需要确定的参…

每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date

premiere n.首映,首次公演 v.首次公演(戏剧、音乐、电影) a.首要的,最早的 Today we’re premiering Meta Movie Gen: the most advanced media foundation models to-date. 迄今,到现在为止 …

大模型面试题全面总结:每一道都是硬核挑战

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

c++文件操作中的seekp函数使用方法

seekp函数能设置输出流的位置 比如我先向文件输入了123456&#xff0c;现在我想在第四个字符后面再加上ABC&#xff0c;这个时候我们就可以用seekp函数来设置输出的位置 #include <iostream> #include <fstream> #include <string>using namespace std;int …

Python小白学习教程从入门到入坑------第二十三课 封装(语法进阶)

面向对象的三大特征&#xff1a;封装、继承、多态 一、封装 1.1 何为封装 封装&#xff1a;在Python中指的是隐藏对象中一些不希望被外部所访问到的属性或者方法。将复杂的信息、流程给包起来&#xff0c;内部处理&#xff0c;让使用者只需要通过简单的操作步骤&#xff0c;…

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述&#xff1a; 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类&#xff0c;它实现了 DaSiam RPN&#xff08;Deformable Siamese Region Proposal Net…

高效视频制作大提速,视频剪辑软件的高级自定义命令功能批量调整视频的色调、饱和度和亮度,轻松驾驭视频编辑技巧

在浩瀚的数字海洋中&#xff0c;视频如同璀璨的星辰&#xff0c;而每一颗星辰都渴望被精心雕琢&#xff0c;闪耀出最独特的光芒。想象一下&#xff0c;你手握一把神奇的钥匙&#xff0c;能够轻松解锁批量视频剪辑的奥秘&#xff0c;让每一帧画面都跃动着你的创意与激情。这把钥…

Vue3入门--[vue/compiler-sfc] Unexpected token, expected “,“ (18:0)

新手小白学习Vue–入门就踩坑系列 问题描述 创建了一个Person.vue&#xff0c;保存后直接报错&#xff1a; [plugin:vite:vue] [vue/compiler-sfc] Unexpected token, expected "," (18:0) 在网上搜了半天也没找到原因&#xff0c;最后还得靠自己&#xff0c;现将解…

【制造业&盒子】箱子检测系统源码&数据集全套:改进yolo11-swintransformer

改进yolo11-MLCA等200全套创新点大全&#xff1a;箱子检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可能为…

Spring Security 框架篇-深入了解 Spring Security 的认证功能流程和自定义实现登录接口(实现自定义认证过滤器、登出功能)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Spring Security 框架概述 2.0 Spring Security 核心功能-认证功能 2.1 过滤器链 2.2 登录认证流程 2.3 思路分析 3.0 登录认证具体操作 3.1 环境搭建 3.2 实现 U…

HBuilderx修改主题色-改变编辑器背景颜色等

效果图&#xff1a; 第一步我们打开HBuilderX 选择工具 – 主题 – 选择&#xff08;雅蓝&#xff09; 然后再设置&#xff0c;源码视图里面打开Setting.json文件 3.将一下代码赋值到右侧用户设置即可 {"workbench.colorCustomizations": {// "[Defau…

食堂采购系统源码:实现供应链管理平台功能模块的技术实践

在当前数字化转型浪潮中&#xff0c;餐饮和食堂管理的需求越来越高&#xff0c;食堂采购系统逐渐成为企业和组织优化管理、降低成本的关键工具。 一、食堂采购系统的核心功能概述 一个完善的食堂采购系统不仅需要具备传统的订单管理、库存管理、供应商管理功能&#xff0c;还…

Python 工具库每日推荐 【Sphinx】

文章目录 引言文档工具的重要性今日推荐:Sphinx 文档生成工具主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:为 Python 项目生成 API 文档案例分析高级特性自定义主题国际化支持扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript …

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

Transformer+KAN系列时间序列预测代码

前段时间&#xff0c;来自 MIT 等机构的研究者提出了一种非常有潜力的替代方法 ——KAN。该方法在准确性和可解释性方面表现优于 MLP。而且&#xff0c;它能以非常少的参数量胜过以更大参数量运行的 MLP。 KAN的发布&#xff0c;引起了AI社区大量的关注与讨论&#xff0c;同时…

【OD-支持在线评测】文本统计分析(200分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1076 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

C++(友元、异常机制、静态成员、单例模式)

友元 友元可以访问与其好友关系的类中的私有成员&#xff0c;使用friend关键字进行修饰。&#xff08;友元破坏了类的封装性&#xff09;。 特点 &#xff08;1&#xff09;友元是单向的 &#xff08;2&#xff09;友元不能传递 &#xff08;3&#xff09;友元…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…