跳转至

数据库

gapit 数据库是一个参考基因目录,你用 contigs 和 reads 去筛查它。本页介绍数据库存放 在哪里、如何获取、gapit 在磁盘上写了什么,以及如何带上自己的数据库。筛查如何使用 它们见 screen.md。

数据库存放在哪里

每个数据库位于一个数据目录(datadir)下,一个数据库一个子目录。gapit 按以下顺 序解析数据目录:

  1. 单次调用上的 --datadir
  2. $GAPIT_DATADIR
  3. ~/.local/share/gapit/db

解析出的路径必须存在,否则命令以类型化错误失败并退出码 4:

$ gapit db list --datadir /no/such/dir
{"schema":"gapit.error/1","code":"DATADIR_NOT_FOUND","message":"datadir does not exist: /no/such/dir","context":{"datadir":"/no/such/dir"}}

查看已安装的数据库

gapit db list 列出所有已知数据库及其安装状态:

$ gapit db list
NAME    DESCRIPTION STATUS  DBTYPE  PROVIDER
ab_k    A. baumannii K locus (Kaptive)  available   nucl    Kaptive (Kenyon lab)
ab_o    A. baumannii OC locus — official keyword ab_o (Kaptive) available   nucl    Kaptive (Kenyon lab)
argannot    ARG-ANNOT acquired resistance genes available   nucl    IHU Méditerranée-Infection
bacmet2 BacMet2 experimentally confirmed biocide/resistance genes (protein) available   prot    University of Gothenburg
card    CARD protein homolog resistance models  available   nucl    McMaster University
ecoli_kps   E. coli group 2+3 capsular polysaccharide loci (Kaptive)    available   nucl    Kaptive (Gladstone lab)
ecoli_vf    E. coli virulence factors (phac-nml)    available   nucl    PHAC-NML
kosc_k  K. oxytoca species complex K locus (Kaptive)    available   nucl    Kaptive (klebgenomics)
kosc_o  K. oxytoca species complex O locus (Kaptive)    available   nucl    Kaptive (klebgenomics)
kpsc_k  K. pneumoniae species complex K locus (Kaptive) available   nucl    Kaptive (klebgenomics)
kpsc_o  K. pneumoniae species complex O locus (Kaptive) available   nucl    Kaptive (klebgenomics)
megares MEGARes antimicrobial resistance genes  available   nucl    MEG Lab
plasmidfinder   CGE PlasmidFinder replicons available   nucl    DTU CGE
vfdb    VFDB virulence factors (set A, nucleotide)  available   nucl    USTC (VFDB)
victors Victors virulence factors   available   nucl    University of Chicago
ecoh    E. coli O and H antigens (srst2 EcOH)   bundled nucl    Holt lab (srst2)
ecoli_dec   Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation)    bundled nucl    gapit-curated (public-domain sources)
lm_doumith  Listeria monocytogenes serogrouping (Doumith 2004)  bundled nucl    gapit-curated (public-domain INSDC sources)
ncbi    NCBI AMRFinderPlus (reference finder) curated AMR   bundled nucl    NCBI
resfinder   CGE ResFinder acquired resistance genes bundled nucl    DTU CGE
vp_ok   V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero)  bundled nucl    gapit-curated (vpasero)

NAME 是传给 --db 的数据库名;PROVIDER 是上游维护机构。当 <datadir>/<name>/gapit-manifest.json 存在时 STATUS 显示 installed (N),N 是 记录数,否则显示 available。最后六行是按名称排序的 wheel 内置数据库(见下文 "内置数据库(即装即用)"一节):物化前为 bundled,物化后为 installed (N)。 其中三个(ecoh、ncbi、resfinder)同时是注册表 提供商 —— 这类名字只渲染一次,位于内置区(绝不会重复出现一条注册表 available 行),gapit db fetch <name> 仍是它们的上游刷新路径;vp_ok 仅有内置库 (无提供商、无 fetch)。目录之外装进数据目录的数据库 同样会列出:排在内置区之后、按名称排序 —— db build 产物(基因与 cluster 两类都是)以及无 manifest 的目录(abricate 风格或 db install 落盘的字节)以 PROVIDER local 渲染,记录数取自 manifest(无 manifest 时从 FASTA 计数), DBTYPE 依次取自 manifest、BLAST 索引后缀、abricate 的字母启发式。 在交互式终端上,同样的行会渲染为 带样式的 rich 表格;通过管道或重定向输出时始终保持上面的纯 TSV。面向 agent, --json 输出 gapit.dblist/1 文档(前三个条目,输出有删节):

$ gapit db list --json
{
  "schema": "gapit.dblist/1",
  "providers": [
    {
      "name": "argannot",
      "vendor": "IHU Méditerranée-Infection",
      "description": "ARG-ANNOT acquired resistance genes",
      "dbtype": "nucl",
      "installed": true,
      "kind": "gene",
      "records": 2224
    },
    {
      "name": "bacmet2",
      "vendor": "University of Gothenburg",
      "description": "BacMet2 experimentally confirmed biocide/resistance genes (protein)",
      "dbtype": "prot",
      "installed": true,
      "kind": "gene",
      "records": 746
    },
    {
      "name": "card",
      "vendor": "McMaster University",
      "description": "CARD protein homolog resistance models",
      "dbtype": "nucl",
      "installed": true,
      "kind": "gene",
      "records": 6059
    }
  ]
}
字段 类型 含义
schema string 恒为 gapit.dblist/1
providers array 每个已知数据库一项
providers[].name string 数据库名,即传给 --db / gapit db fetch 的名字
providers[].vendor string 上游维护机构(NCBI、DTU CGE、Kaptive (klebgenomics) 等)
providers[].description string 内容简述
providers[].dbtype string nucl(用 blastn 筛查)或 prot(用 blastx 筛查)
providers[].kind string gene(逐基因 BLAST 筛查)或 cluster(minimap2 位点筛查,见 screen.md)
providers[].installed boolean 数据目录里存在 manifest 时为 true
providers[].records integer 记录数,数据库未安装时省略
providers[].license string 上游内容许可证,仅提供商声明时出现(card、vfdb、ecoli_vf、kaptive)
providers[].source string 目录之外装进数据目录的数据库(db build / db install)为 local,wheel 内置数据库为 bundled(见下);注册表条目省略该字段

gapit db list 是唯一的列表入口:即上面的数据库目录,--json 返回 gapit.dblist/1 文档。(早期独立的列表命令及其 schema 已移除;这个入口刻意放弃了 abricate --list 的逐字节一致性。)见 outputs.md。

内置数据库(即装即用)

大多数数据库在 db fetch 时才从上游下载,因为许可证禁止再分发(见"提供商"一节)。 少数内置数据库随 gapit wheel 一起发布 —— 共六个,其内容经过逐条记录的来源 审计(公共领域来源,或 Apache-2.0 / BSD-3-Clause / MIT 宽松许可面板;GPL 与 非商业许可内容绝不随 wheel 分发)。无需下载、无需确认:内置数据库开箱即用。

名称 内容 快照日期 分型
ecoh 大肠杆菌 O/H 抗原基因(597 条记录,srst2 EcOH) 2026-10-02 —
ecoli_dec 致腹泻大肠杆菌标志基因面板(16 条记录,GB 4789.6 + 风险监测判定) 2026-10-02 gapit.typing/2(gb4789_6、risk_monitoring 双方案)
lm_doumith 单核细胞增生李斯特菌血清群分型(5 条记录,Doumith 2004 标记) 2026-10-03 gapit.typing/2(方案 doumith_serogroup)
ncbi NCBI AMRFinderPlus 精选 AMR(8373 条记录) 2026-10-02 —
resfinder CGE ResFinder 获得性耐药基因(3206 条记录) 2026-10-02 —
vp_ok 副溶血性弧菌 O/K 抗原位点(195 个位点,vpautils OAgc+CPSgc;cluster 类) 2026-10-12 gapit.typing/2(o_group、k_group、serotype 三方案)

许可证来源声明。 ecoli_dec 的每条记录都取自公共领域的一级提交(NCBI RefSeq/GenBank/DDBJ 收录号,与权利方面板等位相同);2026-10 审计中发现原面板里 混入的两条 VFDB 来源记录已被移除并替换;2026-10 重建时,构建管线的精确去重又丢弃了 与 estA3(M18346.1)逐字节相同的 estA4(J03311.1)副本 —— 同一个 sth 基因、 同一序列 —— 面板因此为 16 条记录。lm_doumith 面板以同样方式取自公共领域 的 INSDC 记录(收录号见每条头部;反向互补标记已做链向校正,lmo0737 经与 EGD-e 比对验证 100% 一致)。三个提供商快照(ecoh、ncbi、resfinder) 通过了 2026-10 对全部记录的内容级审计: NCBI AMRFinderPlus 内容属公共领域(美国政府作品),CGE ResFinder 数据库为 Apache-2.0,srst2 的 EcOH 为 BSD-3-Clause —— 三者均允许随 MIT 许可的 wheel 再分发。vp_ok 基因簇快照是 MIT 许可的 vpautils 内容(实验室逐位点精选、Bakta 注释,经 indexofire/vpautils);以一次完整 gapit.typing/2 构建产出的已解析 sequences + features.json 形式入轮。回归测试 锁定了六个内置库的头部不出现任何 VF* / VFDB / ARO: 标签。

快照是一个时间点。 每个快照的 sequences 文件与快照当日上游内容产出的结果 逐字节一致(resfinder 由回归测试对着一份固定的上游 归档副本逐字节验证;vp_ok 在本地存在真实 vpautils GenBank 文件时,对着 gapit db build 重建的结果逐字节验证 —— 含 features.json、含基因 id 解析)。随着上游持续更新,wheel 副本会逐渐滞后: 提供商背景的内置名(ecoh、ncbi、resfinder)用 gapit db fetch <name>(单独使用,或加 --force 覆盖已物化副本)重新下载最新上游内容 并重建数据目录里的库 —— 这是刷新路径;vp_ok 没有提供商,刷新意味着新的 已解析快照随 wheel 版本发布。bundled.json 记录快照日期备查。 (v1 的 db outdated 仍以 manifest 为准:报告的是已装内容的物化/抓取时间, 不做内置-vs-上游比较 —— 将 wheel 快照与最新上游对比属未来工作。)

物化机制。 第一次 gapit screen ... --db <内置库名> 发现数据目录里没有该库 时,会自动构建它 —— stderr 一行提示(gapit: materializing bundled database ecoli_dec (16 records) into <datadir>,--quiet 可静默),随后走标准基因库 构建管线:records.jsonl、gapit/v1 头部的 sequences、BLAST 索引、(库自带时) typing.json 副本,以及盖上 source: "bundled" 的 manifest。该管线与 gapit db build 共享,会在构建时丢弃精确重复的(基因, 序列)记录(保留首条; stderr 提示与回执中的 duplicates_dropped 计数)。基因簇内置库(vp_ok)改走 基因簇管线:物化时用与 gapit db build 相同的基因簇构建入口,从入轮产物重建位点 FASTA 与 features.json —— 基因 id 保持快照时的已解析状态,typing 规格对其重新校验、 不做重解析。全程确定性、零 网络。仅这条路径会在数据目录缺失时自动创建它;gapit setupdb 在建索引的同时 物化全部内置库;manifest 一旦存在,两者重跑都是无操作。db list 在物化前显示 bundled、物化后显示 installed (16) —— 四个列表入口(TSV、rich 表格、 --json、MCP db_list)一致。

李斯特菌血清群分型(lm_doumith)

用于单核细胞增生李斯特菌(Listeria monocytogenes)血清群预测的分型内置库: 五个标记 —— prs、lmo0737、lmo1118、ORF2819、ORF2110 —— 以 95/95 的序列一致性与覆盖度阈值筛检,由 doumith_serogroup 方案折算为 Doumith 多重 PCR 分群(Doumith 等 2004,J Clin Microbiol 42:3819),并扩展了 Huang 2011 的 4b 变体:prs 作为属级控制基因把关整个方案,IIa(1/2a 或 3a)、IIc (1/2c 或 3c)、IIb(1/2b、3b 或 7)、IVb(4b、4d 或 4e)与 IVb-v(携带 lmo0737 的 4b 变体)—— 与 LisSero 等工具的 in-silico 语义一致。判定走两阶段 管线:gapit screen -o table.tsv --db lm_doumith,然后 gapit typing table.tsv。

已知的局限(相关处以 notes 形式随判定输出):

  • 4b/4d/4e 在基因层面无法区分 —— 三个血清型共享所有已发表的分子标记; 需用 cgMLST 或血清学进一步判定。
  • IVb-v 是新出现的关注克隆 —— 4b 谱面中检出 lmo0737(Huang 2011 "unusual 4b";ST382/ST554 克隆)时,该规则先于 IVb 声明,变体优先胜出。
  • EGD-e 判为 IIc —— 1/2a 参考基因组携带 lmo1118 而落入 IIc;这是 Doumith 2004 原文记载的现象,不是工具假象。
  • 水平基因转移是双向陷阱 —— 谱系 II 的 lmo0737 盒会在谱系间移动,罕见的 ORF 标记水平转移也可能造成貌似 IIb 的假谱面;在流行病学上不太可能的语境里, 单标记 IIb 判定需谨慎对待。
  • prs 是属级基因,并非 Lm 特异 —— 其他李斯特菌物种也携带它;prs 阳性但 无任何血清群标记的分离株回退为 fallback,而不是被判为"非李斯特菌"。

回退判定 —— untypeable (4a/4c, atypical profile, or non-Lm Listeria) —— 是这五个标记无法给出答案时的诚实输出。

vp_ok(副溶血性弧菌 O:K,MIT,安装即带 typing)

vp_ok 把 indexofire/vpautils 的两份副溶血 性弧菌血清型参考——OAgc.gbk(32 个 O 抗原基因簇位点)和 CPSgc.gbk(163 个荚膜多 糖位点)——合并为一个 kind: cluster 数据库。它是 ecoli_dec/lm_doumith 模式的 纯内置数据库:没有提供商、没有 source URL、没有 gapit db fetch vp_ok。自带的 三 scheme typing 资产(src/gapit/data/typing/vp_ok.json,由 scripts/generate_vp_typing.py 可复现生成)随之一并安装,筛查随之渲染 gapit.cluster/2,按文件给出 o_group、k_group 与组合出的 serotype "{o_group}:{k_group}"(回退 OUT/KUT)——一次扫描即得 O:K 血清型:

$ gapit screen RIMD.fna --db vp_ok --format json
{"schema": "gapit.cluster/2", ..., "phenotypes": {"o_group": {"phenotype": "O3"},
 "k_group": {"phenotype": "K6"}, "serotype": {"phenotype": "O3:K6"}}}

数据库内容为 MIT(经 vpautils,Bakta 注释),与 kaptive 提供商不同,许可上可再 分发——已解析快照作为第六个内置库随 wheel 发布(入轮产物 8.3 MiB,在 30 MiB 预算 内),首次使用即零网络物化。入轮 typing 规格按位点重新计算序列唯一关键基因 (变异体折叠:OL4V1 → O4、KL20V1 → K20;未定型的 OLU/KLU 位点不设规则,回退 OUT/KUT),并且该资产在构建与物化时对位点做校验——上游 GBK 漂移会以 TYPING_UNKNOWN_GENE 失败,而不是静默安装。已用真实基因组校准,RIMD 2210633 锁定 O3:K6(逐位点调参见规则 notes)。

检查数据库新鲜度

gapit db outdated 报告每个已安装数据库相对于过期阈值的年龄。对装满的数据 目录(输出裁剪到二十二行中的三行):

$ gapit db outdated --days 30
NAME    FETCHED_AT  AGE_DAYS    STATUS
argannot    2026-09-17T23:22:06Z    2.58    ok
bacmet2 2026-09-17T23:13:51Z    2.58    ok
card    2026-09-17T23:14:25Z    2.58    ok
...

安装已久的数据库只会报告 stale:

$ gapit db outdated --datadir /tmp/opencode/gapit-outdated-demo
NAME    FETCHED_AT  AGE_DAYS    STATUS
card    2020-01-01T00:00:00Z    2454.55 stale
状态 含义
ok 在阈值之内
stale age_days 超过 --days(默认 90;--days 0 把一切都标为 stale)

过期只是一份报告,绝不是错误状态:无论多旧命令都退出 0。退出码 4 (DATADIR_NOT_FOUND、DATADIR_EMPTY)对应缺失的数据目录或没有任何已安装数据库的 目录;无法解析的 fetched_at 是 MANIFEST_MALFORMED(退出码 5)。内置数据库的 报告与其他库一样以 manifest 为准:已物化的内置库从物化时刻起算年龄,v1 不做 内置-vs-上游比较(见"内置数据库(即装即用)"一节 —— 属未来工作)。面向 agent, --json 输出 gapit.dboutdated/1 文档(形如 gapit.dblist/1 的 CLI 列表,未注册 到 gapit schema):

$ gapit db outdated --days 3 --json
{
  "schema": "gapit.dboutdated/1",
  "databases": [
    {
      "db": "argannot",
      "fetched_at": "2026-09-17T23:22:06Z",
      "age_days": 2.58,
      "status": "ok",
      "upstream_version": ""
    },
    {
      "db": "card",
      "fetched_at": "2026-09-17T23:14:25Z",
      "age_days": 2.58,
      "status": "ok",
      "upstream_version": ""
    }
  ]
}

跨数据库检索记录

gapit db search TERM 在每个已安装数据库的 records.jsonl 事实存储中查找基因: 不做 BLAST,只是快速扫描。默认按大小写不敏感的子串匹配;--exact 切换到全字段相 等:

$ gapit db search ctx-m --limit 3
argannot    (Bla)blaCTX-M-1 X92506:63-938       (Bla)blaCTX-M-1 876
argannot    (Bla)blaCTX-M-10    AF255298:1-873      (Bla)blaCTX-M-10    873
argannot    (Bla)blaCTX-M-100   FR682582:1-876      (Bla)blaCTX-M-100   876
$ gapit db search "blaCTX-M-1" --field gene --exact
ncbi    blaCTX-M-1  NG_048897.1 CEPHALOSPORIN   extended-spectrum class A beta-lactamase CTX-M-1    876
$ gapit db search virulence --db vfdb --field function --limit 2
vfdb    AAA92657    AAA92657    virulence   (AAA92657) unknown protein [TraJ (VF0241) - Invasion (VFC0083)] [Escherichia coli]  606
vfdb    AAC38364    AAC38364    virulence   (AAC38364) Orf1 [Ler (VF0189) - Regulation (VFC0301)] [Escherichia coli O127:H6 str. E2348/69]  390

行格式为 DB\tGENE\tACCESSION\tFUNCTION\tPRODUCT\tLENGTH,按数据库再按文件的顺序流 式输出;FUNCTION 把记录的功能类别用 ; 串接。--field 选择 gene|accession|function|product|any(默认 any 搜索全部,功能类别逐个匹配)。 --limit N 截断输出(默认 100;0 = 不限),截断时在 stderr 提示(--quiet 静默 );零命中退出 0 且 stdout 为空。--json 每个命中打印一行 JSON 对象,字段同名转 snake_case(function 为数组):

$ gapit db search "tet(M)" --field gene --exact --json | head -1
{"db":"card","gene":"tet(M)","accession":"AB039845.1:25-1945","function":["tetracycline"],"product":"Tet(M) is a ribosomal protection protein that confers tetracycline resistance. It is found on transposable DNA elements and its horizontal transfer between bacterial species has been documented.","length":1920}

全库扫描时,records.jsonl 缺失的已安装数据库会被跳过并在 stderr 警告;但显式指 定它(--db NAME)会以退出码 4 DB_INCOMPLETE 失败;未知的 --db NAME 是用法错 误(退出码 2),并列出已安装的数据库。

提供商

gapit 自带十九个提供商。每一个——包括 card 和 vfdb——都在抓取时从上游下载: 除上文六个通过审计、宽松许可的内置库之外,包里不内置任何内容,因为多家上游许可 (CARD 的 McMaster 条款、VFDB 的 CC BY-NC、 Kaptive 的 GPL-3.0)禁止随 MIT 许可的发行版再分发。七个 kaptive 提供商是 基因簇数据库(抓取时经基因簇管线构建,见下文 Kaptive 提供商一节);第八个 基因簇数据库——带 typing 的 vp_ok——仅有内置库(见上文 vp_ok 一节)。

名称 维护方 内容 dbtype
ncbi NCBI NCBI AMRFinderPlus(reference finder)精选 AMR nucl
card McMaster University CARD protein homolog resistance models nucl
resfinder DTU CGE CGE ResFinder acquired resistance genes nucl
argannot IHU Méditerranée-Infection ARG-ANNOT acquired resistance genes nucl
plasmidfinder DTU CGE CGE PlasmidFinder replicons nucl
megares MEG Lab MEGARes antimicrobial resistance genes nucl
ecoh Holt lab (srst2) E. coli O and H antigens (srst2 EcOH) nucl
vfdb USTC (VFDB) VFDB virulence factors (set A, nucleotide) nucl
ecoli_vf PHAC-NML E. coli virulence factors (phac-nml) nucl
bacmet2 University of Gothenburg BacMet2 experimentally confirmed biocide/resistance genes (protein) prot
victors University of Chicago Victors virulence factors nucl
upec_expec_vf FordeGenomics UPEC/ExPEC virulence genes (FordeGenomics) nucl
kpsc_k Kaptive (klebgenomics) K. pneumoniae species complex K locus(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
kpsc_o Kaptive (klebgenomics) K. pneumoniae species complex O locus(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
kosc_k Kaptive (klebgenomics) K. oxytoca species complex K locus(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
kosc_o Kaptive (klebgenomics) K. oxytoca species complex O locus(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
ab_k Kaptive (Kenyon lab) A. baumannii K locus(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
ab_o Kaptive (Kenyon lab) A. baumannii OC locus — 官方关键字 ab_o(Kaptive;cluster,GPL-3.0,抓取时下载) nucl
ecoli_kps Kaptive (Gladstone lab) E. coli group 2+3 capsular polysaccharide loci(Kaptive;cluster,GPL-3.0,抓取时下载) nucl

蛋白质数据库(bacmet2)经 blastx 筛查;核苷酸数据库经 blastn。基因簇数据库 经 minimap2 基因簇引擎筛查(screen.md)。

Kaptive 提供商(GPL,抓取时下载)

七个 kaptive 提供商封装了 Kaptive 的参考 数据库(Wyres et al., J Clin Microbiol 2020:使用这些数据库的结果请引用 Kaptive)。数据库名(NAME)就是 Kaptive v3 数据库文档中的官方安装关键字 (Available databases), 每个提供商直接从持续维护的按物种上游仓库的 main 头部抓取原始 GenBank 文件 —— klebgenomics/KpSC_surface_antigen_loci(kpsc_k、kpsc_o)、 klebgenomics/KoSC-surface-antigen-loci(kosc_k、kosc_o)、 johannajkenyon/Abaumannii_surface_polysaccharide_loci(ab_k、ab_o)和 rgladstone/EC-K-typing(ecoli_kps)—— 因此抓到的数据库跟随上游的最新维护, 而不是冻结的发布版。这些仓库还带有包含上游一致性阈值的 .toml 元数据;gapit 在 v1 不抓取它(未来 typing.json 的来源)。

数据库内容是 GPL-3.0,而 gapit 是 MIT,所以任何 kaptive 内容都不内置: gapit db fetch kpsc_k(以及其余六个关键字)在抓取时下载 GenBank 文件,并 经基因簇流水线构建 kind: cluster 数据库。manifest 记录上游 URL、 GPL-3.0 (database content) 许可证和引用说明。它们不带 typing 模型(表型判定保持 null);你得到 kaptive 风格的最佳位点判定,之后可以用 gapit db build --typing 重建来安装自己的 typing.json 语义。

抓取数据库

默认集合

gapit db fetch all 安装默认集合:先 card 后 vfdb。与其他所有提供商一 样,它从上游下载、变换记录、并在本地构建 sequences 和 BLAST 索引——因此索引永远 与你机器上实际安装的 BLAST 版本匹配。需要网络。不带参数的 gapit db fetch 只打印命令帮助:多库下载必须显式指定(all 或单个 NAME),绝不因省略参数而隐式 触发。

抓取指定数据库

gapit db fetch <name> 对单个数据库跑完整流水线。下面是安装 card (stderr 进度行,随后 stdout 一行 JSON 回执):

$ gapit db fetch --datadir /tmp/opencode/gapit-dbs-demo card
gapit: downloaded 1 source file(s)
gapit: read 6059 records from card
gapit: generated /tmp/opencode/gapit-dbs-demo/card/sequences
gapit: self-check passed for card
gapit: BLAST index built (nucl)
{"db":"card","records":6059,"dbtype":"nucl","destination":"/tmp/opencode/gapit-dbs-demo/card"}
回执字段 类型 含义
db string 数据库名(NAME)
records integer 写入 records.jsonl 的记录数
dbtype string nucl 或 prot
destination string 安装后的数据库目录

每个数据库在抓取时从其上游来源下载,因此需要网络。未知名字在解析数据目录之 前就会被拒绝:

$ gapit db fetch nosuchdb
{"schema":"gapit.error/1","code":"USAGE_ERROR","message":"unknown database: nosuchdb (available: argannot, bacmet2, card, ecoh, ecoli_vf, megares, ncbi, plasmidfinder, resfinder, upec_expec_vf, vfdb, victors)","context":{"db":"nosuchdb"}}

重新抓取

已有的数据库目录永远不会被静默覆盖。不带参数重新抓取会以退出码 4 失败:

$ gapit db fetch --datadir /tmp/opencode/gapit-dbs-demo card
{"schema":"gapit.error/1","code":"DB_ALREADY_EXISTS","message":"won't overwrite existing database card (use --force)","context":{"db":"card"}}

--force 删除后原地重建:

$ gapit db fetch --datadir /tmp/opencode/gapit-dbs-demo --force card
{"db":"card","records":6059,"dbtype":"nucl","destination":"/tmp/opencode/gapit-dbs-demo/card"}

安装本地文件

gapit db install SOURCE --sha256 HASH --output TARGET 是带校验的本地文件安装。它 对提供商目录、档案、序列内容一无所知:把 SOURCE 流式过 SHA256,与 --sha256 比对摘 要,通过后才原子替换 TARGET。校验失败时已有的 TARGET 不受影响。

$ sha256sum card.json
65838c8d4f160923fbf8c296c0f986bd5b55f7f5b5a15a7bbeb35412b945e025  card.json
$ gapit db install card.json \
    --sha256 65838c8d4f160923fbf8c296c0f986bd5b55f7f5b5a15a7bbeb35412b945e025 \
    --output /tmp/opencode/card-copy.json
{"destination":"/tmp/opencode/card-copy.json","sha256":"65838c8d4f160923fbf8c296c0f986bd5b55f7f5b5a15a7bbeb35412b945e025"}

摘要错误以退出码 5 中止:

$ gapit db install card.json \
    --sha256 0000000000000000000000000000000000000000000000000000000000000000 \
    --output /tmp/opencode/card-bad.json
{"schema":"gapit.error/1","code":"CHECKSUM_MISMATCH","message":"SHA256 mismatch for card.json","context":{"source":"card.json","expected":"0000000000000000000000000000000000000000000000000000000000000000","actual":"65838c8d4f160923fbf8c296c0f986bd5b55f7f5b5a15a7bbeb35412b945e025"}}

gapit 构建的数据库里有什么

<datadir>/<name>/
  records.jsonl         truth source: one Record JSON object per line
  sequences             generated FASTA projection (gapit/v1 tagged headers)
  sequences.n*|p*       BLAST index built from sequences
  gapit-manifest.json   provenance sidecar, written last
  typing.json           可选的 gapit.typing/1 或 /2 评分规范(带分型的数据库)
  floors.json           可选的 gapit.floors/1 按基因一致性下限(reads 模式)

records.jsonl

这是可编辑的事实来源。每个筛查产物都由它生成,所以编辑记录后用 --force 重新抓 取会再生一切下游产物。每行一个 JSON 对象;card 的第一条记录,原样如下:

{"db":"card","gene":"23S_rRNA_(adenine(2058)-N(6))-methyltransferase_Erm(A)","sequence":"ATGAAACAGAAAAACCCGAAAAATACGCAAAATTTCATTACATCTAAAAAGCATGTAAAGGAAATATTAAAATATACGAATATCAATAAACAAGATAAAATAATAGAAATTGGGTCAGGAAAAGGACATTTTACCAAGGAACTTGTGGAAATGAGTCAACGGGTGAATGCTATAGAGATTGATGAAGGTTTATGTCATGCCACGAAAAAAGCAGTTGAACCTTTTCAGAATATAAAAGTTATTCATGAGGATATTTTGAAGTTTAGCTTTCCTAAAAATACAGACTATAAAATATTTGGTAATATTCCCTACAATATTAGTACTGATATTGTAAAAAAGATTGCTTTTGATAGTCAAGCGAAATATAGCTACCTTATTGTAGAGAGGGGATTTGCTAAAAGGTTGCAAAATACCCAACGAGCTTTAGGTTTGCTGTTAATGGTGGAAATGGATATAAAAATTCTTAAAAAAGTGCCACGAGCATATTTTCACCCTAAGCCTAATGTAGATTCTGTATTGATTGTACTTGAAAGGCATAAACCATTTATTTTAAAGAAGGACTACAAAAAGTATAGATTTTTCGTTTATAAATGGGTAAACAGGGAATATCATGTTCTTTTTACTAAAAATCAATTAAGACAGGTGCTGAAGCATGCGAATGTTACTGATCTTGATAAATTATCCAATGAACAATTTTTGTCTGTTTTCAATAGTTACAAATTATTTCAATAA","accession":"AF002716.1:210-942","function":["lincosamide","macrolide","streptogramin"],"product":"Variant of ErmA (ARO:3000347) found in Streptococcus pyogenes. Confers the MLSb phenotype.","source_id":"3005099"}
字段 类型 含义
db string 来源数据库名
gene string 基因名,gapit 报告所依赖的标识
sequence string 归一化序列(大写;歧义碱基记 N/X)
accession string 登录号或坐标跨度,未发表时为空
function array of string 功能类别,已排序(见下方词汇表)
product string 产物描述,缺失时为 n/a
source_id string 提供商原生的记录标识

gapit-manifest.json

manifest 为构建背书:抓了什么、何时、从哪里、用哪些工具版本。下面是一份真实的 manifest,来自 plasmidfinder 数据库:

{
  "schema": "gapit.manifest/1",
  "name": "plasmidfinder",
  "source_urls": [
    "https://bitbucket.org/genomicepidemiology/plasmidfinder_db/get/HEAD.zip"
  ],
  "fetched_at": "2026-09-17T23:11:36Z",
  "sha256": "a18dc9dab762fe1e23a90c11314ee179c37c59dad833a5f465a78dc245970c2a",
  "n_records": 488,
  "dbtype": "nucl",
  "header_format": "gapit/v1",
  "upstream_version": "",
  "tool": {
    "name": "gapit",
    "version": "0.5.6"
  },
  "makeblastdb_version": "blastn: 2.17.0+",
  "minimap2_version": "2.31-r1302"
}
字段 类型 含义
schema string 恒为 gapit.manifest/1
name string 数据库名
source_urls array of string 内容的上游来源 URL
fetched_at string ISO-8601 UTC 时间戳,秒精度
sha256 string 构建出的 sequences 文件摘要,64 个小写十六进制字符
n_records integer 记录数,与 records.jsonl 一致
dbtype string nucl 或 prot,构建时显式选择
header_format string gapit 构建的数据库恒为 gapit/v1
upstream_version string 源有版本标签时的上游版本名
license string 数据库内容许可证,仅提供商声明时出现(kaptive:GPL-3.0 (database content);card:McMaster 非商业条款;vfdb:CC BY-NC 4.0)
note string 自由文本来源说明(kaptive:源文件 + 引用),设置时才出现
tool object 构建数据库的 gapit 的 {name, version}
makeblastdb_version string 构建索引的 BLAST+ 版本
minimap2_version string 构建环境中的 minimap2 版本(reads 模式在内存中建索引,不生成 .mmi)

records.jsonl 和 manifest 是文件契约。它们从不出现在 stdout,也未注册到 gapit schema。

floors.json — 按基因设置一致性下限

一个可选边车,为 reads 模式的存在判定声明逐基因的最小比对一致性(%)(schema 为 gapit.floors/1,用 gapit schema floors 内省;筛查语义与 pic 实战示例见 reads.zh.md):

{"schema": "gapit.floors/1", "default": null, "genes": {"pic": 90.0}}
字段 类型 含义
schema string 恒为 gapit.floors/1
default number 或 null 未在 genes 中列出的基因的下限(null = 无下限)
genes object {基因: 最小一致性 %},取值在 [0, 100] 内

文件的存在本身就是开关——没有 manifest 字段,也没有 CLI 开关。不带边车的数据库 输出与之前逐字节一致(下限是数据库驱动的可选开启,不是 CLI 契约变更);blastn contig 路径从不读取它们。通过 db build --floors 安装(见下节),或把文件直接放 进既有数据库目录;筛查时同样会校验(内容损坏以 FLOORS_MALFORMED 失败,exit 4)。 内置的 ecoli_dec 携带 {"genes": {"pic": 90.0}}——SPATE 同源假阳性的修复。

表头格式与兼容性

gapit 读取两种表头格式,逐记录检测:

  • abricate 遗留格式:>DB~~~GENE~~~ACCESSION~~~RESISTANCE PRODUCT。字段可以缺 失;缺失的尾部字段解码为空字符串。
  • gapit 原生 gapit/v1:>gapit|db=<v>|gene=<v>|acc=<v>|func=<v> PRODUCT,值 经百分号编码,基因名和产物因此可以逐字节穿越 BLAST 和 minimap2,空格和竖线也在 内。

两者解码成相同的四个身份字段,TSV/JSON 输出形状也完全一致。原生数据库的 RESISTANCE 列承载 func 值。

警告: abricate 读不了 gapit 构建的数据库。gapit/v1 表头格式不是 ~~~ 约 定。gapit 读 abricate 数据目录是刻意设计的单向通道;下游还有工具要跑 abricate 时,请保留一份 legacy 副本。

func 词汇表

每个原生提供商从固定词汇表中填 function,这些值一路流向 TSV 的 RESISTANCE 列 和 JSON 的 resistance 字段:

提供商 func 值
ncbi、resfinder、argannot、card 源的抗生素类别
megares MEGARes 的 class 字段
ecoh H-antigen、O-antigen,或由等位基因派生的抗原回退值
vfdb、ecoli_vf、victors、upec_expec_vf virulence
plasmidfinder replicon
bacmet2 biocide

带上自己的数据库

gapit db build NAME FASTA 把任意参考基因 FASTA 一条命令变成完整构建的 gapit 原生 数据库:records.jsonl、带 gapit/v1 表头的 sequences 投影、BLAST 索引和 manifest。下面是一个两基因的合成 FASTA 加一个元数据 TSV(字段见下),在临时数据目 录上运行:

$ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv
gapit: generated /tmp/opencode/gapit-build-demo/db/tinyamr/sequences
gapit: self-check passed for tinyamr
gapit: BLAST index built (nucl)
{"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}

stderr 承载逐步进度,stdout 是一行 JSON 回执(字段与 db fetch 相同,见上面的 表)。数据库立即可筛查:

$ gapit screen --datadir ./db --db tinyamr contig.fa
Processing: contig.fa
Found 1 genes in contig.fa
#FILE   SEQUENCE    START   END STRAND  GENE    COVERAGE    COVERAGE_MAP    GAPS    %COVERAGE   %IDENTITY   DATABASE    ACCESSION   PRODUCT RESISTANCE
contig.fa   contig1 1   240 +   syn_betalac 1-240/240   =============== 0/0 100.00  100.00  tinyamr SYN-0001    synthetic class A beta-lactamase    ampicillin;cephalosporin

ACCESSION 和 RESISTANCE 来自 TSV 合并;PRODUCT 来自 FASTA 描述。 --dbtype nucl|prot 强制分子类型;默认由 abricate 的分子类型启发式从序列本身判 断。输入可以是 plain、.gz 或 .bz2。

表头检测

表头类型逐记录检测,混合文件也能工作:

FASTA 表头 Gene Accession Function Product
>syn_betalac synthetic class A beta-lactamase syn_betalac — — synthetic class A beta-lactamase
>olddb~~~sul1~~~U12338.4:1-940~~~SULFONAMIDE sulfonamide resistance sul1 U12338.4:1-940 SULFONAMIDE sulfonamide resistance
>gapit\|db=old\|gene=sul2\|acc=X\|func=streptomycin aminoglycoside sul2 X streptomycin aminoglycoside

没有任何描述文本的普通表头回退到 --description TEXT,再回退到基因名。每条记录的 db 字段始终是 NAME(正在构建的数据库),source_id 原样保留原始 id 标记。畸形的 gapit| 表头使构建失败并报 HEADER_MALFORMED(退出码 4);结构非法的 FASTA 报 INVALID_FASTA(退出码 5)。

从 TSV 合并元数据

--tsv FILE 为每个基因增补或覆盖 accession 和功能类别。规则:

  • 表头行必须存在且必须含 gene 列;accession 和 function 按文件可选(缺列就 是不合并),多余的列被忽略。缺 gene 列以退出码 5 METADATA_MALFORMED 失败。
  • 行按基因取键:重复时第一行胜出,stderr 警告(--quiet 静默)。
  • function 列多类别时用 ; 分隔,例如 ampicillin;cephalosporin。
  • 只出现在 TSV 里的基因产生 stderr 警告并被跳过:FASTA 是存在与否的唯一事实。

上面示例用到的 TSV,全文:

$ cat my_meta.tsv
gene    accession   function
syn_betalac SYN-0001    ampicillin;cephalosporin

按基因一致性下限(--floors)

--floors FILE 把一份 gapit.floors/1 文档安装为数据库的 floors.json 边车—— reads 模式存在判定的逐基因最小比对一致性(见 reads.zh.md)。文档在 任何产物落盘前先校验:genes 里的每个基因必须存在于 FASTA (FLOORS_UNKNOWN_GENE,exit 4——给缺失基因设下限是静默失效的安全配置),取值必 须在 [0, 100] 内、结构必须可解析(FLOORS_MALFORMED,exit 4)。随后文件原样拷入; 文件的存在本身就是开关(manifest 字段不变)。仅限基因数据库——GBK/GFF 簇输入对 --floors 报用法错误。

$ cat my_floors.json
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
$ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --floors my_floors.json
{"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}
$ cat ./db/tinyamr/floors.json
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}

重建

与 db fetch 一样,已有的数据库绝不被静默覆盖:

$ gapit db build tinyamr my_genes.fa --datadir ./db
{"schema":"gapit.error/1","code":"DB_ALREADY_EXISTS","message":"won't overwrite existing database tinyamr (use --force)","context":{"db":"tinyamr"}}
$ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --force
gapit: generated /tmp/opencode/gapit-build-demo/db/tinyamr/sequences
gapit: self-check passed for tinyamr
gapit: BLAST index built (nucl)
{"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}

records.jsonl 是可编辑的事实来源:编辑它(或 FASTA)后用 --force 重建,每个下 游产物都会再生。

手动(abricate 风格)路径

推荐走 db build,但任何 abricate 格式的数据目录也能原样使用:把 --datadir 指向 含 <name>/sequences(带 ~~~ 表头的核苷酸 FASTA)的目录,跑一次 gapit setupdb 建 BLAST 索引。分子类型启发式沿用 abricate,决定 nucl 还是 prot。

用一个复制进临时数据目录的三基因微型数据库端到端演示:

$ ls /tmp/opencode/gapit-own-db/db/tinyamr
sequences
$ gapit screen --datadir /tmp/opencode/gapit-own-db/db --db tinyamr /tmp/opencode/gapit-own-db/gap.fa
Processing: /tmp/opencode/gapit-own-db/gap.fa
{"schema":"gapit.error/1","code":"DATABASE_NOT_INDEXED","message":"Database /tmp/opencode/gapit-own-db/db/tinyamr/sequences is not indexed, please try: gapit setupdb","context":{"db":"/tmp/opencode/gapit-own-db/db/tinyamr/sequences"}}
$ gapit setupdb --datadir /tmp/opencode/gapit-own-db/db
Indexed tinyamr (3 sequences, nucl)
$ gapit screen --datadir /tmp/opencode/gapit-own-db/db --db tinyamr /tmp/opencode/gapit-own-db/gap.fa
#FILE   SEQUENCE    START   END STRAND  GENE    COVERAGE    COVERAGE_MAP    GAPS    %COVERAGE   %IDENTITY   DATABASE    ACCESSION   PRODUCT RESISTANCE
/tmp/opencode/gapit-own-db/gap.fa   contig1 1   97  +   sul1    1-94/94 ========/====== 1/3 100.00  96.91   tinyamr U12338.4:1-940  sulfonamide-resistant dihydropteroate synthase Sul1 SULFONAMIDE

gapit setupdb 为每个含有可读 sequences 文件的子目录建索引,当它们全部具备 sequences.nin 或 sequences.pin 时退出 0。

reads 模式与遗留数据目录

reads 筛查(见 reads.md)中,minimap2 总是在内存中为 sequences FASTA 建索引;不生成 .mmi,旧版 gapit 留在数据目录里的 .mmi 也绝不会被使用。 持久化索引尝试过并被否决:默认构建的 .mmi 会覆盖 -x sr 预设的索引参数 (minimap2 警告 "-k, -w or -H overridden by prebuilt index"),在决定性的基准里错 分了近缘同源基因(CTX-M/SHV 等位基因分歧),且在当前数据库规模下比内存索引更慢。 遗留的 abricate 数据目录走同一条内存路径。

从表头格式、蛋白质数据库、元数据 TSV 到故障排查表的完整 db build 实战演练见 自定义数据库。

基因簇数据库(GBK/GFF)

gapit db build NAME input.gbk(或 .gbff、.gb、.gff、.gff3,均支持 plain 或 .gz/.bz2)构建另一种数据库:一条记录 = 一个基因位点。输入类型按后缀 检测(--kind gene|cluster 必须一致,否则构建报用法错误);上一节的 FASTA 基因流 水线不受影响。

$ gapit db build mycps cps_loci.gbk --datadir ./db
gapit: generated ./db/mycps/sequences
gapit: self-check passed for mycps
gapit: BLAST index built (nucl)
{"db":"mycps","records":2,"dbtype":"nucl","destination":"./db/mycps"}

解析(不用 Biopython):GenBank 记录变成位点(LOCUS 名 = 位点 id),其 CDS 特 征成为基因;source 特征的 note 承载标签和类型(kaptive 的 K locus:/K type: 风格,回退到 Bakta 风格再回退到位点 id)。GFF3 输入的序列来自内嵌的 ##FASTA 块 或 <stem>.fa/.fna/.fasta 边车文件。复合 join() CDS 定位以类型化错误拒绝:请拆 分记录或使用简单 CDS 注释。

产物与基因数据库不同:sequences 每个位点一条裸位点 id 记录(普通表头,abricate 读不了);features.json 是 gapit.features/1 特征表(用 gapit schema features 自省);manifest 声明 kind: cluster;没有 records.jsonl。筛查分发到 minimap2 基因簇引擎(screen.md)。

typing.json:声明式表型评分

--typing FILE 把一份经过校验的 gapit.typing/1 或 gapit.typing/2 文档安装进数据库成为 typing.json;筛查随后为每个最佳判定注释表型和可解释的分数分解(TSV 的 PHENOTYPE 列和 gapit.cluster/1 的 phenotype_detail,见 outputs.md)。一个最小的 weighted_genes 示例:

{
  "schema": "gapit.typing/1",
  "rules": [
    {
      "model": "weighted_genes",
      "phenotype": "K1",
      "weights": {"wzx": 1.0, "wzy": 3.0},
      "negative": {"rfaD": -1.0},
      "identity_floor": 95.0,
      "require_any": ["wzx", "wzy"]
    }
  ],
  "cutoff": 0.9,
  "ambiguity_margin": 0.05,
  "fallback": "unknown"
}

三种规则类型:weighted_genes(基因存在性,带一致性下限、负标记和 any-of 门)、 cluster_match(位点覆盖度/一致性/关键基因的加权分量,各分量带下限)、 learned_linear(在命名特征 gene:<id>:<cov|ident|present> / cluster:<locus>:<coverage|identity> 上训练的 sigmoid),外加决策层应用的文档级 cutoff、ambiguity_margin 和 fallback。完整 schema 用 gapit schema typing 打印。构建时校验是严格的:畸形文档以 TYPING_MALFORMED 失败;规则引用了输入没有 的基因或位点时,在任何产物写出之前以 TYPING_UNKNOWN_GENE 失败(同一检查在筛查时 重跑,所以手改过的数据库藏不住死引用)。

gapit.typing/2 把同样的规则包进命名 scheme(schemes: [{"name": "pathotype", "rules": [...], "cutoff": ..., "ambiguity_margin": ..., "fallback": ...}],名称限 [a-z0-9_] 且唯一);/1 文档等价于一个匿名的 default scheme,因此既有的 typed 数据库输出不变。--typing 也可用于基因(FASTA) 构建 —— v1 仅支持 weighted_genes 规则,基因引用对照 FASTA 记录校验。typed 基因 数据库的筛查输出与 untyped 完全相同(纯基因检测);其判定来自两阶段流水线 —— gapit screen -o result.tsv 写出结果表,gapit typing result.tsv 按 scheme 渲染 判定,输出 gapit.typing_result/1 (见分型方案)。

typing/2 第二阶段新增六个规则/scheme 原语(全部可选、纯附加;完整定义见 gapit schema typing):exact_set 规则(Doumith/志贺氏菌式标记表 —— 所有 requires 基因存在且所有 excludes 基因缺席时得 1.0,两个下限默认 90/90;满足的 exact_set 参与的 1.0 平局按声明顺序裁决而非歧义边际)、weighted_genes/exact_set 上的可选 coverage_floor、scheme 级 control_gene(prs/ipaH 式门控:缺席时整个 scheme 输出 fallback 并附 "control gene absent" 注记)、unique_group + mixed_phenotype(同组多于一个基因存在时调用混合表型并把成对基因列入 ambiguous)、compose scheme("{o_group}:{k_group}" 由兄弟 scheme 的判定渲染 —— fallback 字符串原样流入,歧义成分使组合结果为 null 并携带该成分的变体),以及逐规则 notes(获胜时原样浮现到判定上)。

六个经调研的鉴定方案——完整的 Doumith 李斯特菌表、ShigaTyper 语义的志贺菌/EIEC、带 等位基因探针的 meningotype 血清群 panel、副溶血弧菌 O/K 的 Kaptive 模式、霍乱弧菌 O1/O139 与 Ogawa/Inaba、以及带文档的 DEC 占位——已编码为经过校验的示例文档(合成 标记夹具,由测试套件自检),详见分型方案。

对照带标签的 assembly 调校 typing 文档正是 scripts/cluster_calibration.py 的用途 (开发者工具):它筛查每个带标签的样本,打印逐期望表型的分数分布、判定×期望的一致 矩阵和分歧清单,即未来 learned_linear 训练流程要消费的那个循环:

$ python scripts/cluster_calibration.py mycps --datadir ./db labels.tsv