第一次接触geNomad的输出文件时,我就像面对一个装满未知宝藏的保险箱——知道里面有价值连城的数据,却不知道如何正确打开。经过三个真实项目的实战摸索,终于理清了这套文件体系的奥秘。geNomad的输出主要分为两大类型:汇总统计文件和基因注释文件,它们就像考古现场的发掘报告和文物鉴定书,共同还原隐藏在测序数据中的病毒和质粒全貌。
_summary目录下的文件是整个分析流程的精华浓缩。以我最近处理的海洋宏基因组数据为例,这个目录包含了所有鉴定结果的"快照":病毒序列文件(.fna)、蛋白质文件(.faa)以及最重要的汇总表格(.tsv)。实际工作中发现,90%的基础分析需求通过这个目录就能满足,特别是当你需要快速筛选高置信度的病毒序列时。而_genes.tsv文件则像基因版的"身份证档案",记录了每个预测基因的详细特征,从基因位置到功能注释一应俱全。
新手最容易忽略的是文件命名规则。在同时处理多个样本时,输出文件会带有前缀标识(如sample1_virus_summary.tsv),这个设计让批量处理变得清晰。有次项目我就因为没注意前缀,导致数据混淆,不得不重新跑了8小时的分析流程。建议建立规范的文件夹结构,例如:
code复制project/
├── raw_data/
├── genomad_output/
│ ├── sample1/
│ │ ├── _summary/
│ │ └── _genes/
│ └── sample2/
│ ├── _summary/
│ └── _genes/
这个TSV文件是病毒鉴定结果的决策依据,包含12个关键字段。最近分析土壤样本时,virus_score字段帮我快速锁定了5个高置信度病毒序列(score>0.95),后续实验验证准确率达100%。字段中特别需要注意:
topology:拓扑学特征直接影响复制机制判断。曾遇到一个DTR(直接末端重复)型病毒,其末端20bp的重复序列正是其整合酶识别位点。四种拓扑类型中,Provirus的判断需要结合coordinates字段精确定位,这对研究病毒-宿主互作至关重要。
virus_score:这个0-1之间的置信度评分有严格阈值。根据官方文档和我的实测,>0.7可视为可靠预测,但严格筛选建议用>0.9。注意该分数与Marker_enrichment正相关,但后者还受染色体标记干扰。
n_hallmarks:标志基因数量是"一票否决"指标。在分析极端环境样本时,即使virus_score达0.8,若n_hallmarks=0,我都会谨慎对待。常见病毒标志基因包括:
表格数据最好用pandas处理,这里分享我的常用代码片段:
python复制import pandas as pd
df = pd.read_csv('virus_summary.tsv', sep='\t')
high_confidence = df[(df['virus_score']>0.9) & (df['n_hallmarks']>=2)]
proviruses = df[df['topology']=='Provirus'].sort_values('virus_score', ascending=False)
FASTA格式的序列文件看似简单,但隐藏着关键细节。有次我直接将.fna文件导入进化树工具,结果报错才发现序列名包含特殊字符"|"。这是因为原病毒命名采用<宿主序列>|provirus_<起始>_<终止>格式,需要预处理:
bash复制# 替换可能引起问题的字符
sed 's/|/_/g' virus.fna > cleaned.fna
蛋白质文件.faa的注释更丰富,每个header包含基因位置信息。用这个脚本可以提取特定得分区间的蛋白质:
python复制from Bio import SeqIO
high_score_ids = set(high_confidence['seq_name'])
with open("high_confidence.faa", "w") as out_handle:
for record in SeqIO.parse("virus_proteins.faa", "fasta"):
if record.id.split('_')[0] in high_score_ids:
SeqIO.write(record, out_handle, "fasta")
这个包含23列的表格是功能挖掘的金矿。最近在分析肠道微生物组时,通过annotation_amr字段发现了耐碳青霉烯酶基因,为临床耐药性研究提供了线索。关键字段组合策略:
Virus_hallmark==1的基因,结合evalue<1e-5和bitscore>50,可确认核心病毒基因Plasmid_hallmark==1且uscg==0的基因可能是质粒-病毒重组热点处理大型.tsv文件时,建议用awk快速过滤:
bash复制# 提取所有病毒标志基因
awk -F'\t' '$20==1 {print $1,$9,$21}' virus_genes.tsv > viral_hallmarks.txt
annotation_accessions字段看似杂乱,实则包含多数据库ID。这个Python函数可将其解析为结构化数据:
python复制def parse_annotations(acc_str):
"""解析Pfam:PF12345;TIGR:TIGR03901格式的注释"""
if pd.isna(acc_str): return {}
return dict(item.split(":") for item in acc_str.split(";") if ":" in item)
df['annot_dict'] = df['annotation_accessions'].apply(parse_annotations)
df['pfam_ids'] = df['annot_dict'].apply(lambda x: x.get('Pfam', None))
实际项目中,我曾用这个方法将分散的KEGG注释映射到代谢通路,发现了噬菌体中的辅酶合成基因簇。对于抗性基因分析,可以交叉验证amr_genes和annotation_amr字段:
python复制amr_genes = df[df['annotation_amr'].notna()][['gene', 'annotation_description']]
质粒分析虽然与病毒共享相似结构,但有其独特之处。在污水处理厂元基因组项目中,conjugation_genes字段帮我们定位到多个可移动遗传元件。关键差异点:
处理质粒数据的经验流程:
mermaid复制graph TD
A[plasmid_summary.tsv] --> B[筛选score>0.8的序列]
B --> C[检查conjugation_genes]
C --> D{是否含完整tra簇?}
D -->|是| E[标记为潜在可移动质粒]
D -->|否| F[检查mob基因]
对于临床分离株,我通常会重点关注含多种AMR基因的高得分质粒,这个R脚本可生成抗性基因谱:
R复制library(dplyr)
plasmid_amr <- plasmid_summary %>%
filter(!is.na(Amr_genes)) %>%
separate_rows(Amr_genes, sep=",") %>%
count(Amr_genes, sort=TRUE)
geNomad提供的taxonomy字段基于ICTV分类,但需要二次验证。我的标准操作:
bash复制# 提取分类不一致的序列
awk -F'\t' '$12!~/Caudoviricetes/ && $8>0.9' virus_summary.tsv > discordant.txt
通过整合_summary和_genes文件,可以计算基因组特征相关性。例如分析GC含量与基因密度的关系:
python复制import seaborn as sns
merged = pd.merge(
summary[['seq_name', 'gc_content']],
genes.groupby('seq_name')['length'].mean().reset_index(),
on='seq_name'
)
sns.lmplot(data=merged, x='gc_content', y='length')
对于整合型病毒,结合宿主基因组注释能发现插入偏好性。需要:
r复制library(GenomicRanges)
provirus_gr <- GRanges(
seqnames = provirus$host_seq,
ranges = IRanges(start=provirus$start, end=provirus$end)
)
host_genes <- import("host_genes.gff")
overlaps <- findOverlaps(provirus_gr, host_genes)
遇到这些情况需谨慎:
我的过滤管道:
bash复制awk -F'\t' '($8 > 0.85) && ($12 > 0.3) && ($10 > 1)' virus_summary.tsv > filtered.tsv
处理TB级数据时,内存管理很关键:
python复制import dask.dataframe as dd
ddf = dd.read_csv('huge_genes.tsv', sep='\t', blocksize=25e6)
result = ddf[ddf['bitscore']>50].compute()
geNomad的标记数据库会更新,建议:
验证注释一致性的方法:
bash复制md5sum genomad_db/markers/* > db_version.txt
通过整合原病毒数据和宿主代谢通路,可以预测病毒对宿主代谢的影响。曾用这个方法发现噬菌体编码的氨基酸合成基因补偿了宿主的代谢缺陷。
将virus_score与样本元数据关联,能揭示环境因子对病毒群落的影响。在海洋深度剖面研究中,我们发现200米以下水域的Provirus比例显著增加。
建立自动化流水线,从原始数据到AMR基因报告只需4小时:
python复制def generate_amr_report(sample_id):
"""生成PDF格式的抗性基因报告"""
amr_data = load_genomad_results(sample_id)
report = AMRTemplate(amr_data)
return report.render()
将geNomad输出作为VIRSorter2的输入,可以提高真核病毒检出率。我的标准工作流:
mermaid复制graph LR
A[原始数据] --> B[geNomad]
B --> C[病毒序列]
C --> D[ViromeClassifier]
D --> E[分类谱系]
除了内置标记,可以添加自定义hmm模型:
bash复制genomad annotate --custom-hmm my_genes.hmm input.fna output_dir
对于大型项目,AWS批量处理方案能节省70%成本:
terraform复制resource "aws_batch_job_definition" "genomad" {
name = "genomad_pipeline"
container_properties = jsonencode({
command = ["genomad", "execute", "Ref::input"]
memory = 32000
vcpus = 8
})
}
通过测试不同参数组合,我发现这些设置对土壤样本最优:
yaml复制score_threshold: 0.75
marker_min_score: 0.6
provirus_min_score: 0.65
利用--threads参数和GNU parallel加速:
bash复制parallel -j 4 "genomad execute {} output_{/}" ::: samples/*.fna
处理超大contig时添加:
bash复制genomad execute --chunk-size 1000000 input.fna output_dir
用DNAFeaturesViewer绘制基因和标记位置:
python复制from dna_features_viewer import GraphicFeature, GraphicRecord
features = [
GraphicFeature(start=gene['start'], end=gene['end'],
strand=gene['strand'], color='#ffcccc')
for _, gene in genes.iterrows()
]
record = GraphicRecord(sequence_length=contig_len, features=features)
record.plot(figure_width=10)
使用Plotly创建动态筛选器:
python复制import plotly.express as px
fig = px.scatter(
df, x='virus_score', y='Marker_enrichment',
color='n_hallmarks', hover_data=['seq_name']
)
fig.show()
RMarkdown模板示例:
r复制---
title: "geNomad分析报告"
output: html_document
---
```{r}
genomad_data <- read_tsv("virus_summary.tsv")
ggplot(genomad_data, aes(virus_score)) + geom_histogram()