线粒体基因组分析¶
一句话概述¶
利用NOVOPlasty从测序数据中组装线粒体基因组,通过MITOS进行自动注释,最终基于线粒体基因构建系统发育树,是物种鉴定、进化生物学和群体遗传学研究的核心流程。
核心知识点表格¶
| 知识点 | 关键内容 | 常用工具 |
|---|---|---|
| 线粒体DNA特征 | 环状、母系遗传、高拷贝数、快速进化 | - |
| 基因组组装 | Seed-extend策略从WGS中提取mt reads | NOVOPlasty, GetOrganelle |
| 基因组注释 | tRNA/rRNA/蛋白编码基因识别 | MITOS, MitoAnnotator |
| 序列比对 | 多基因联合比对 | MAFFT, MUSCLE |
| 系统发育建树 | 最大似然法/贝叶斯法 | IQ-TREE, RAxML, MrBayes |
| 基因排列分析 | 基因顺序比较、重排事件 | CREx, MLGO |
| 选择压力分析 | dN/dS比值计算 | PAML, HyPhy |
| 可视化 | 环状基因组图谱 | CGView, OGDRAW |
各步骤详解¶
第一步:理解线粒体基因组特征¶
白话解释: 线粒体是细胞的"发电站",有自己独立的一套DNA。哺乳动物的线粒体DNA(mtDNA)通常只有16-17kb,是一个环状分子,包含37个基因(13个蛋白编码基因、22个tRNA、2个rRNA)。因为线粒体数量多(每个细胞几百到几千个),所以在全基因组测序数据中,线粒体reads的覆盖度通常远高于核基因组。
技术细节: - 动物线粒体基因组:典型大小15-20kb,紧凑排列,基因间隔极短 - 植物线粒体基因组:极大变异(200kb-11Mb),含大量重复序列和叶绿体转移片段 - 真菌线粒体基因组:大小变异大(20-200kb),含内含子 - 密码子使用:线粒体使用非标准遗传密码(如UGA编码色氨酸而非终止)
代码示例:
# 查看参考线粒体基因组信息
# 从NCBI下载参考序列
wget "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=NC_012920&rettype=fasta" -O human_mt_ref.fasta
# 查看序列长度
grep -v "^>" human_mt_ref.fasta | tr -d '\n' | wc -c
# 输出: 16569
第二步:线粒体基因组组装(NOVOPlasty)¶
白话解释: NOVOPlasty的工作原理类似"拼拼图":你给它一小段已知的线粒体序列(seed),它从全基因组测序数据中找到与seed匹配的reads,然后向两端不断延伸,最终拼出完整的环状线粒体基因组。优势在于不需要先把所有reads组装,直接从原始数据中"钓"出线粒体序列。
技术细节: - Seed-and-extend算法:从seed序列出发,利用k-mer overlap向两端迭代延伸 - 自动检测环化:当延伸序列首尾重叠时,判定组装完成 - 内存需求低:通常4-8GB RAM即可完成 - 支持杂合体检测:可输出多个构象
代码示例:
# 安装NOVOPlasty
git clone https://github.com/ndierckx/NOVOPlasty.git
cd NOVOPlasty
# 准备配置文件 config.txt
cat > config.txt << 'EOF'
Project:
-----------------------
Project name = MyMito
Type = mito
Genome Range = 12000-22000
K-mer = 33
Max memory = 8
Extended log = 0
Save assembled reads = no
Seed Input = seed.fasta
Extend seed directly = no
Reference sequence =
Variance detection = no
Heteroplasmy =
HP excluded file =
Chloroplast sequence =
Dataset 1:
-----------------------
Read Length = 150
Insert size = 300
Platform = illumina
Single/Paired = PE
Combined reads =
Forward reads = sample_R1.fastq.gz
Reverse reads = sample_R2.fastq.gz
Store Hash = yes
Optional:
-----------------------
Insert size auto = yes
Use Quality Scores = no
Output path = ./output/
EOF
# 准备seed序列(通常用COX1或cytb基因片段)
# 可以从近缘物种的线粒体基因组中提取
echo ">COX1_seed" > seed.fasta
echo "ATGTTCGGGTGGTTTGGAAACTGACTCATC..." >> seed.fasta
# 运行NOVOPlasty
perl NOVOPlasty4.3.3.pl -c config.txt
# 查看输出
ls output/
# Circularized_assembly_1_MyMito.fasta # 环化成功的组装结果
# log_MyMito.txt # 运行日志
GetOrganelle替代方案:
# 安装GetOrganelle
pip install getorganelle
get_organelle_config.py --add animal_mt
# 运行组装
get_organelle_from_reads.py \
-1 sample_R1.fastq.gz \
-2 sample_R2.fastq.gz \
-o getorganelle_output \
-t 8 \
-R 20 \
-k 21,45,65,85,105 \
-F animal_mt
# GetOrganelle优势:使用多种k-mer自动选择最优组装
第三步:组装质量评估¶
白话解释: 组装完成后,需要检查结果是否正确。主要看三点:1)长度是否在预期范围内;2)是否成功环化;3)coverage是否均匀。
技术细节: - 覆盖深度验证:将reads回比到组装序列,检查覆盖均匀性 - 参考比较:与近缘物种线粒体比较,确认基因排列合理 - 长度验证:与同属物种比较基因组大小
代码示例:
# 将reads比对回组装结果
bwa index output/Circularized_assembly_1_MyMito.fasta
bwa mem -t 8 output/Circularized_assembly_1_MyMito.fasta \
sample_R1.fastq.gz sample_R2.fastq.gz | \
samtools sort -o mt_mapped.bam
samtools index mt_mapped.bam
# 计算覆盖深度
samtools depth mt_mapped.bam > coverage.txt
# 绘制覆盖曲线(R脚本)
Rscript -e '
cov <- read.table("coverage.txt", col.names=c("chr","pos","depth"))
pdf("mt_coverage.pdf", width=10, height=4)
plot(cov$pos, cov$depth, type="l", xlab="Position", ylab="Depth",
main="Mitochondrial Genome Coverage")
abline(h=mean(cov$depth), col="red", lty=2)
dev.off()
cat("Mean coverage:", mean(cov$depth), "\n")
cat("Min coverage:", min(cov$depth), "\n")
'
# 检查基因组大小
grep -v "^>" output/Circularized_assembly_1_MyMito.fasta | tr -d '\n' | wc -c
第四步:线粒体基因组注释(MITOS)¶
白话解释: 注释就是告诉你组装出的这条序列上哪些位置是什么基因。MITOS是专门为线粒体设计的注释工具,能自动识别tRNA、rRNA和蛋白编码基因,并根据不同物种使用正确的遗传密码表。
技术细节: - MITOS2使用BLAST搜索同源蛋白和RNA结构预测 - 支持多种遗传密码表(脊椎动物用Code 2,无脊椎动物用Code 5等) - 自动识别基因边界和读框方向 - 输出标准GenBank格式注释文件
代码示例:
# 方法1:使用MITOS2 web服务器
# 访问 http://mitos2.bioinf.uni-leipzig.de/
# 上传序列,选择遗传密码表,提交
# 方法2:命令行安装MITOS2
conda create -n mitos -c bioconda mitos
conda activate mitos
# 运行MITOS2注释
runmitos.py \
-i output/Circularized_assembly_1_MyMito.fasta \
-o mitos_output \
-r /path/to/mitos2_refdata \
-c 2 \ # 遗传密码表: 2=脊椎动物线粒体
--best \ # 只保留最佳注释结果
--rrna 1 \
--trna 1 \
--intron 0
# 查看注释结果
cat mitos_output/result.bed # BED格式基因坐标
cat mitos_output/result.gff # GFF格式注释
cat mitos_output/result.fas # 各基因序列
cat mitos_output/result.seq # 蛋白序列
# 方法3:使用MitoAnnotator(适合鱼类)
# 访问 http://mitofish.aori.u-tokyo.ac.jp/annotation/input/
使用tRNAscan-SE补充tRNA注释:
# 安装
conda install -c bioconda trnascan-se
# 运行tRNA预测
tRNAscan-SE -O \
-o trna_output.txt \
output/Circularized_assembly_1_MyMito.fasta
# -O: 搜索线粒体tRNA(organellar mode)
第五步:基因提取与多序列比对¶
白话解释: 从注释好的线粒体基因组中提取特定基因序列(如COX1、CYTB),与其他物种的同源基因放在一起做比对,为后面建树做准备。多基因联合分析比单基因更可靠。
技术细节: - 蛋白编码基因通常选择保守基因(COX1, COX2, CYTB等) - 可用密码子比对(codon-aware alignment)提高准确性 - 多基因联合需要partition模型 - 比对后需要修剪(trimming)去除比对质量差的区域
代码示例:
# 从注释结果提取各基因序列
# 假设已有多个物种的COX1和CYTB序列
# 使用MAFFT进行多序列比对
mafft --auto --adjustdirection COX1_all_species.fasta > COX1_aligned.fasta
mafft --auto CYTB_all_species.fasta > CYTB_aligned.fasta
# 蛋白编码基因推荐使用密码子比对
# 先翻译为蛋白→比对→反推核酸比对
macse -prog alignSequences \
-seq COX1_all_species.fasta \
-gc_def 2 \
-out_NT COX1_NT_aligned.fasta \
-out_AA COX1_AA_aligned.fasta
# 使用trimAl修剪比对结果
trimal -in COX1_aligned.fasta -out COX1_trimmed.fasta -automated1
# 连接多基因比对(concatenation)
# 使用FASconCAT或AMAS
python3 AMAS.py concat \
-i COX1_trimmed.fasta CYTB_trimmed.fasta ND1_trimmed.fasta \
-f fasta \
-d dna \
-p partition.txt \
--out-format fasta \
--part-format raxml
# 查看partition文件
cat partition.txt
# DNA, COX1 = 1-1536
# DNA, CYTB = 1537-2691
# DNA, ND1 = 2692-3648
第六步:系统发育建树¶
白话解释: 系统发育树就是物种的"族谱图"。根据DNA序列的相似程度来推断它们之间的亲缘关系。主流方法有最大似然法(Maximum Likelihood)和贝叶斯法(Bayesian Inference)。
技术细节: - ML方法:搜索使数据出现概率最大的树形拓扑 - BI方法:通过MCMC采样计算后验概率 - 模型选择:使用ModelFinder自动选择最优替换模型 - 分区模型:不同基因/密码子位点使用不同进化模型 - 支持度评估:Bootstrap(ML)或后验概率(BI)
代码示例:
# 方法1:IQ-TREE(最大似然法,推荐)
# 自动模型选择 + 分区分析 + ultrafast bootstrap
iqtree2 -s concatenated.fasta \
-p partition.txt \
-m MFP \
--merge rclusterf \
-B 1000 \
--alrt 1000 \
-T AUTO \
--prefix mt_phylo
# 输出文件:
# mt_phylo.treefile - 最优树
# mt_phylo.iqtree - 详细结果报告
# mt_phylo.contree - 一致性树(含支持值)
# 方法2:RAxML-NG
raxml-ng --all \
--msa concatenated.fasta \
--model partition.txt \
--bs-trees 200 \
--threads auto \
--prefix raxml_mt
# 方法3:MrBayes(贝叶斯法)
cat > mrbayes_cmd.nex << 'EOF'
begin mrbayes;
set autoclose=yes nowarn=yes;
execute concatenated.nex;
charset COX1 = 1-1536;
charset CYTB = 1537-2691;
partition genes = 2: COX1, CYTB;
set partition = genes;
lset nst=6 rates=invgamma;
unlink statefreq=(all) revmat=(all) shape=(all) pinvar=(all);
prset applyto=(all) ratepr=variable;
mcmc ngen=5000000 samplefreq=1000 printfreq=1000
nchains=4 nruns=2 savebrlens=yes;
sump burnin=1250;
sumt burnin=1250 contype=halfcompat;
end;
EOF
mb mrbayes_cmd.nex
第七步:树的可视化与基因组图谱¶
白话解释: 最后需要把结果画成好看的图。系统发育树用iTOL或ggtree美化;环状线粒体基因组图用OGDRAW或CGView展示基因排列。
技术细节: - iTOL: 在线工具,支持大量注释类型 - ggtree: R包,高度可定制 - OGDRAW: 专门绘制细胞器基因组环形图 - CGView: Java程序,支持GC含量、GC skew等
代码示例:
# R脚本:使用ggtree绘制系统发育树
library(ggtree)
library(treeio)
library(ggplot2)
# 读取IQ-TREE结果
tree <- read.iqtree("mt_phylo.contree")
# 基本树形图
p <- ggtree(tree, layout="rectangular") +
geom_tiplab(size=3) +
geom_nodelab(aes(label=UFboot), size=2, hjust=-0.2) +
geom_treescale() +
theme_tree2()
ggsave("phylo_tree.pdf", p, width=10, height=12)
# 带Bootstrap支持度的彩色树
p2 <- ggtree(tree) +
geom_tiplab(size=3) +
geom_nodepoint(aes(color=UFboot), size=2) +
scale_color_continuous(low="red", high="green",
name="Bootstrap") +
theme_tree2()
ggsave("phylo_tree_bootstrap.pdf", p2, width=10, height=12)
# 使用OGDRAW绘制线粒体基因组环形图
# 在线工具: https://chlorobox.mpimp-golm.mpg.de/OGDraw.html
# 输入GenBank格式文件即可
# 或使用CGView
java -jar cgview.jar \
-i mt_genome.xml \
-o mt_genome_map.png \
-f png
实战命令¶
# === 完整流程一键脚本 ===
#!/bin/bash
# 线粒体基因组分析流程
set -e
SAMPLE="species_A"
THREADS=8
R1="raw_data/${SAMPLE}_R1.fastq.gz"
R2="raw_data/${SAMPLE}_R2.fastq.gz"
SEED="reference/COX1_seed.fasta"
CODE=2 # 脊椎动物线粒体遗传密码
# 1. 质控
fastp -i $R1 -o clean_R1.fq.gz \
-I $R2 -O clean_R2.fq.gz \
-w $THREADS -h fastp_report.html
# 2. 组装(GetOrganelle)
get_organelle_from_reads.py \
-1 clean_R1.fq.gz -2 clean_R2.fq.gz \
-o assembly_output -t $THREADS \
-R 20 -k 21,45,65,85,105 -F animal_mt
# 3. 注释
runmitos.py \
-i assembly_output/*.fasta \
-o annotation_output \
-r /db/mitos2_refdata -c $CODE --best
# 4. 提取蛋白编码基因
python3 extract_genes.py annotation_output/result.gff \
assembly_output/*.fasta genes/
# 5. 多序列比对(每个基因单独比对)
for gene in genes/*.fasta; do
mafft --auto $gene > aligned/$(basename $gene)
done
# 6. 修剪
for aln in aligned/*.fasta; do
trimal -in $aln -out trimmed/$(basename $aln) -automated1
done
# 7. 连接比对
python3 AMAS.py concat -i trimmed/*.fasta \
-f fasta -d dna --out-format fasta \
-p partition.txt
# 8. 建树
iqtree2 -s concatenated.fasta -p partition.txt \
-m MFP -B 1000 --alrt 1000 -T $THREADS
echo "Pipeline completed!"
面试常问点¶
Q1: 为什么线粒体基因组常用于系统发育研究? A: 1)母系单性遗传,不发生重组,进化历史清晰;2)进化速率适中(比核基因快5-10倍),适合近缘物种分辨;3)高拷贝数,易于获取;4)基因排列保守,orthologue容易确定;5)基因组小,全基因组信息容易获得。
Q2: NOVOPlasty和GetOrganelle有什么区别? A: NOVOPlasty使用seed-extend策略,一次扩展;GetOrganelle使用多k-mer de Bruijn图策略,先用目标序列过滤reads再组装,对复杂基因组更robust。GetOrganelle对植物叶绿体/线粒体组装表现更好。
Q3: 为什么需要分区模型(partition model)? A: 不同基因、不同密码子位点的进化速率和替换模式不同。第三密码子位点进化最快,第二密码子位点最保守。分区模型允许不同分区使用不同的进化模型参数,更准确地反映真实进化过程。
Q4: 如何判断系统发育树是否可靠? A: 1)Bootstrap支持值 >70%(ML)或后验概率 >0.95(BI)认为可靠;2)不同方法(ML/BI)得到一致拓扑;3)不同基因建树结果一致;4)增加taxon sampling不改变主要关系;5)检查长枝吸引(LBA)问题。
Q5: 线粒体假基因(NUMTs)如何影响分析? A: NUMTs是转移到核基因组的线粒体片段,已失去功能。如果误将NUMTs当作真正的线粒体序列会导致错误结论。解决方法:1)利用高覆盖度区分(真线粒体覆盖度远高于核基因组);2)翻译检查是否有终止密码子;3)比较进化速率是否异常。
易错点¶
遗传密码表选错:动物线粒体使用非标准遗传密码,如果用标准密码表翻译会出现大量错误终止密码子。脊椎动物用Code 2,果蝇用Code 5。
植物线粒体组装难度被低估:植物线粒体含大量重复序列、频繁重组、含叶绿体转移序列,组装远比动物困难,通常需要长reads辅助。
未检测NUMTs污染:PCR扩增时可能同时扩出核基因组中的NUMTs假基因,导致异源序列进入分析。
比对质量未检查:自动比对可能在高变区产生错误比对,影响建树结果。需要目视检查和适当修剪。
外群选择不当:外群太远会引入长枝吸引,太近则无法确定树根位置。
忽略异质性(heteroplasmy):个体内可能存在多种线粒体单倍型,混合组装会产生错误共识序列。
起点位置不一致:环状基因组的线性化起点位置可能不同,影响基因坐标比较。
补充知识¶
线粒体基因组在不同研究中的应用¶
| 应用领域 | 具体用途 | 典型基因 |
|---|---|---|
| DNA条形码 | 物种鉴定 | COX1 (动物) |
| 群体遗传学 | 种群结构、基因流 | 全基因组/D-loop |
| 系统发育 | 物种进化关系 | 多基因联合 |
| 法医学 | 个体识别、亲缘鉴定 | D-loop/HVR |
| 古DNA | 灭绝物种鉴定 | 全基因组 |
| 疾病研究 | 线粒体疾病 | 全基因组变异 |
常用遗传密码表¶
| Code | 适用范围 | 关键差异 |
|---|---|---|
| 1 | 标准/核基因组 | - |
| 2 | 脊椎动物线粒体 | AGA/AGG=终止, UGA=Trp |
| 3 | 酵母线粒体 | CUN=Thr |
| 4 | 霉菌/原生生物线粒体 | UGA=Trp |
| 5 | 无脊椎动物线粒体 | AGA/AGG=Ser, UGA=Trp |
| 9 | 棘皮动物线粒体 | AAA=Asn, AGA=Ser |
进化模型选择指南¶
GTR+I+G: 最通用,参数最多
HKY+G: 较简单,转换/颠换区分
K2P: 最简单,等碱基频率假设
对于线粒体蛋白编码基因:
- 建议按密码子位点分区
- 第3位点通常需要GTR+G
- 第1、2位点用较简单模型即可
使用ModelFinder自动选择: -m MFP
有用的数据库¶
- NCBI RefSeq: 参考线粒体基因组数据库
- MitoFish: 鱼类线粒体基因组数据库
- BOLD Systems: DNA条形码数据库
- Mamit-tRNA: 哺乳动物线粒体tRNA数据库
- OGRe: 动物细胞器基因组数据库