gapit 0.5.1__tar.gz → 0.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gapit-0.5.1 → gapit-0.5.2}/AGENTS.md +7 -6
- {gapit-0.5.1 → gapit-0.5.2}/CHANGELOG.md +40 -0
- {gapit-0.5.1 → gapit-0.5.2}/PKG-INFO +6 -5
- {gapit-0.5.1 → gapit-0.5.2}/README.md +5 -4
- {gapit-0.5.1 → gapit-0.5.2}/docs/agents.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/docs/agents.zh.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/docs/databases.md +93 -11
- {gapit-0.5.1 → gapit-0.5.2}/docs/databases.zh.md +84 -7
- {gapit-0.5.1 → gapit-0.5.2}/docs/installation.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/installation.zh.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/mcp.md +4 -4
- {gapit-0.5.1 → gapit-0.5.2}/docs/mcp.zh.md +4 -4
- {gapit-0.5.1 → gapit-0.5.2}/docs/outputs.md +4 -4
- {gapit-0.5.1 → gapit-0.5.2}/docs/outputs.zh.md +4 -4
- {gapit-0.5.1 → gapit-0.5.2}/docs/quickstart.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/docs/quickstart.zh.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/docs/reads.md +56 -7
- {gapit-0.5.1 → gapit-0.5.2}/docs/reads.zh.md +52 -7
- {gapit-0.5.1 → gapit-0.5.2}/docs/screen.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/screen.zh.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/summary.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/summary.zh.md +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/docs/typing.md +37 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/typing.zh.md +37 -1
- {gapit-0.5.1 → gapit-0.5.2}/pixi.lock +2 -2
- {gapit-0.5.1 → gapit-0.5.2}/pixi.toml +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/pyproject.toml +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/recipe/meta.yaml +3 -3
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/__init__.py +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/bundled.py +10 -2
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cli.py +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_build.py +13 -0
- gapit-0.5.2/src/gapit/data/dbs/ecoli_dec/floors.json +1 -0
- gapit-0.5.2/src/gapit/data/dbs/lm_doumith/bundled.json +7 -0
- gapit-0.5.2/src/gapit/data/dbs/lm_doumith/sequences +58 -0
- gapit-0.5.2/src/gapit/data/dbs/lm_doumith/typing.json +72 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_build_ops.py +18 -2
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/schemas.py +2 -0
- gapit-0.5.2/src/gapit/gene_floors.py +122 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/reads.py +10 -1
- gapit-0.5.2/tests/data/typing/schemes/lm_doumith.fa +58 -0
- gapit-0.5.2/tests/data/typing/schemes/lm_doumith.json +72 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_dec_pic_astA.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_dec_pic_astA.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_doumith_4b.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_doumith_4b.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_l4b.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_l4b.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_mixed.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_mixed.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_vp_typed.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_vp_typed.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_shigella_mixed.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_shigella_mixed.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_typing_exact.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_typing_exact.md +1 -1
- gapit-0.5.2/tests/golden/lm_doumith_typing.tsv +3 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/reads_tinyamr.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/reads_tinyamr.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/screen_multi.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/screen_multi.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.json +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.md +1 -1
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_bundled.py +44 -24
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_build.py +98 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_fetch.py +2 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_schema.py +11 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_setupdb.py +8 -5
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_list_extras.py +2 -1
- gapit-0.5.2/tests/test_gene_floors.py +244 -0
- gapit-0.5.2/tests/test_gene_floors_e2e.py +144 -0
- gapit-0.5.2/tests/test_lm_doumith.py +313 -0
- {gapit-0.5.1 → gapit-0.5.2}/.gitattributes +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/ci.yml +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/docs.yml +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/release.yml +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/.gitignore +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/LICENSE +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/PLAN.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/SPEC.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/custom-db.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/custom-db.zh.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/faq.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/faq.zh.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/index.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/docs/index.zh.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/mkdocs.yml +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/scripts/cluster_calibration.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/blast.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cluster.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cluster_math.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/clusterbuild.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_install.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_outdated.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_search.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen_positionals.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen_reads_args.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_summary.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_typing.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/config.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoh/bundled.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoh/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/bundled.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ncbi/bundled.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ncbi/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/resfinder/bundled.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/resfinder/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/upec_expec_vf/bundled.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/upec_expec_vf/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_ops.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_query_ops.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dbbuild.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dbcodec.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dispatch.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/engines.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/errors.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/fasta.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/__init__.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/cluster.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/cluster_md.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/json.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/md.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/reads_json.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/reads_tsv.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/summary.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/tsv.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/typing_result.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/fragments.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/gbfeatures.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/gffparse.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/hits.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp_schemas.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp_tools.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/minimap.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/minimap2_run.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/paf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/proctools.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/__init__.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ab_k.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ab_o.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/argannot.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/bacmet2.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/card.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/cluster_common.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/common.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoh.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoli_kps.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoli_vf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kosc_k.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kosc_o.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kpsc_k.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kpsc_o.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/megares.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ncbi.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/plasmidfinder.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/resfinder.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/upec_expec_vf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/vfdb.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/victors.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/py.typed +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/readpairs.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/records.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/report.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_cluster.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_reads.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_reads_positional.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/seqconvert.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/summary.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_decide.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_engine.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_gene.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_input.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_models.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_ops.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_results.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_rules.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/bundled_differential/resfinder/README.md +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/bakta_style.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters.gff3 +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_sidecar.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/compound.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/gz_input.gbk.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/kaptive_style.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/nofasta.gff3 +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/screening.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_invalid.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen_cm.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen_v2.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_valid.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/unnamed_cds.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/full.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/gap.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/none.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/partial.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/sort.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.embl +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.embl.bz2 +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fa.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.gbk.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/db/tinyamr/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/fragdb/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split3040.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split4060.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split5050.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/card/card.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ecoh/EcOH.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/phenotypes.txt +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/victors/gen_downloads.php +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/bla_partial.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/junk.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s1_1.fq.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s1_2.fq.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s2_R1.fq.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s2_R2.fq.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/suly_partial.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_R1.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_R2.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_full.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_full.fq.gz +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_lane1.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_lane2.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe1_R1.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe1_R2.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe2_R1.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe2_R2.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2/ont_homologs.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2/sr_homologs.fq +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2_db/homologs/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads_db/tinyreads/sequences +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/empty.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/multi_sample.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_a.csv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_a.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_b.csv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_b.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/exact.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_1c.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_4b.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_nogate.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/markers.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/mutated.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/negative.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/partial.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/cholerae.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/cholerae.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/dec.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/dec.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/doumith.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/doumith.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/meningotype.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/meningotype.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/shigella.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/shigella.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/vp_ok.gbk +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/vp_ok.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/serotyping.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_markers_v1.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_markers_v2.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_serotyping_v2.json +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/vp_mixed.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/vp_typed.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/ecoli_dec_typed.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/ecoli_dec_typing.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_dutch.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.csv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/tinyamr_multi_nopath.csv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_serotyping.tsv +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/02_mutated.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/03_truncated.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/04_reverse.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/05_threshold.fa +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/make_corpus.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/run_parity.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/parity/run_summary_parity.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_blast_parse.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_blast_pipeline.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_aligner.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_bare_help.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_completion.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_build_cluster.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_query.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_fragments.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads2.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads_glob.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads_glob_jobs.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_screen.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_screen_jobs.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_short_options.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_summary.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_calibration.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_db.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_math.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_screen.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_typing.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_config.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_db.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_fetch.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_headers.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_dbbuild.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_dbcodec.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_error_envelope.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_fasta.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_fragments.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_gapit_db_e2e.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_gbfeatures.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_gene_typing.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_gene_typing2.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_gffparse.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_hits.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_json_format.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_db_tools.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_protocol.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_reads.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_md_format.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_minimap.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_mol_type.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_oversubscription.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_paf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_paf_identity.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_argannot.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_bacmet2.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_card.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ecoh.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ecoli_vf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_kaptive.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_megares.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ncbi.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_plasmidfinder.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_resfinder.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_upec_expec_vf.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_vfdb.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_victors.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_providers_common.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_readpairs.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads2_homologs.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads2_model.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_aggregate.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_integration.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_interval_union.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_streaming.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_records.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_report.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_screen_integration.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_screening_reads_unit.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_seqconvert.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_seqconvert_differential.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_streaming_chunks.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_summary.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_summary_formats.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_tsv.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_command.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_engine.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_models.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_schemes.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_schemes_cluster.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_stage2.py +0 -0
- {gapit-0.5.1 → gapit-0.5.2}/tests/test_version.py +0 -0
|
@@ -80,6 +80,7 @@ gapit/
|
|
|
80
80
|
│ ├── db_query_ops.py # db use-cases: search + outdated over installed DBs (shared CLI + MCP)
|
|
81
81
|
│ ├── db_build_ops.py # db use-case: custom FASTA+TSV → gene db, GBK/GFF → cluster db (shared CLI + MCP)
|
|
82
82
|
│ ├── gbfeatures.py # GenBank FEATURES/ORIGIN parser → LocusFeatures/GeneFeature + gapit.features/1
|
|
83
|
+
│ ├── gene_floors.py # gapit.floors/1 per-gene identity floors: model, loader, build validation, reads gate
|
|
83
84
|
│ ├── gffparse.py # GFF3 parser (embedded ##FASTA or sidecar) → the same locus/gene models
|
|
84
85
|
│ ├── typing_models.py # gapit.typing schema (rules + named schemes; /1 degrades to one default scheme)
|
|
85
86
|
│ ├── typing_rules.py # gapit.typing rule models (weighted_genes/exact_set/cluster_match/learned_linear) + reference checks
|
|
@@ -160,7 +161,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
160
161
|
- **Formats**: `--format tsv|csv|json|md` (default `tsv` for abricate compatibility).
|
|
161
162
|
- **JSON**: top-level `"schema": "gapit.report/1"`; schema introspectable via
|
|
162
163
|
`gapit schema report | reads | reads2 | summary | list | error | version` (plus
|
|
163
|
-
`cluster | features | typing | typing_result`). Keys are snake_case,
|
|
164
|
+
`cluster | features | typing | typing_result | floors`). Keys are snake_case,
|
|
164
165
|
units explicit (`identity_pct`, `coverage_pct`). Semver the schema; never rename or
|
|
165
166
|
retype a field in a minor bump.
|
|
166
167
|
- **Markdown**: YAML frontmatter (tool version, db, params, ISO-8601 UTC timestamp) + tables a
|
|
@@ -177,12 +178,12 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
177
178
|
database fetch from the provider catalog (every provider downloads from upstream at fetch
|
|
178
179
|
time — nothing catalog-side is bundled inside the wheel beyond the sanctioned exceptions,
|
|
179
180
|
a license-compliance requirement: CARD/VFDB terms are non-commercial and Kaptive is GPL,
|
|
180
|
-
so none of those may ride an MIT distribution; the sanctioned exceptions are the
|
|
181
|
+
so none of those may ride an MIT distribution; the sanctioned exceptions are the six
|
|
181
182
|
content-provenance-audited bundles under `src/gapit/data/dbs/` — the public-domain
|
|
182
|
-
`ecoli_dec`
|
|
183
|
-
domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause, `upec_expec_vf`
|
|
184
|
-
is never bundled) — materialized into the datadir on first use via
|
|
185
|
-
`db fetch <name>` still the fresh-upstream refresh path),
|
|
183
|
+
`ecoli_dec` and `lm_doumith` panels plus four permissively licensed provider snapshots
|
|
184
|
+
(`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause, `upec_expec_vf`
|
|
185
|
+
MIT; GPL/NC content is never bundled) — materialized into the datadir on first use via
|
|
186
|
+
`bundled.py`, with `db fetch <name>` still the fresh-upstream refresh path),
|
|
186
187
|
database listing,
|
|
187
188
|
records.jsonl gene search, staleness
|
|
188
189
|
report, custom FASTA→native-db build, GBK/GFF→cluster-db build (`--typing` installs a
|
|
@@ -5,6 +5,46 @@ All notable changes to gapit are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
|
|
6
6
|
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.5.2] - 2026-10-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Per-gene identity floors for reads-mode presence (`gapit.floors/1`) — the db-driven
|
|
13
|
+
fix for the 26ECO0084 `pic` SPATE false positive.** A gene database may carry an
|
|
14
|
+
optional `floors.json` sidecar declaring a minimum alignment identity (%) per gene:
|
|
15
|
+
in reads mode, alignments to a floored gene below its floor are dropped BEFORE
|
|
16
|
+
aggregation, so breadth is recomputed from the surviving rows (a ~86.6%-identity,
|
|
17
|
+
97.59%-breadth SPATE homolog collapses below the presence threshold instead of
|
|
18
|
+
over-calling `pic`, matching the blastn contig verdict). **Strictly opt-in via
|
|
19
|
+
DATABASE metadata, not a CLI change**: a database without the sidecar screens
|
|
20
|
+
byte-identically to before, existing databases need nothing, and the blastn contig
|
|
21
|
+
path never reads floors (`--minid` already gates it). Floors compose conjunctively
|
|
22
|
+
with `gapit.reads/2` `--min-identity` (a row must clear both); `gapit.reads/1`
|
|
23
|
+
output shape is untouched (presence/breadth changes only for floored genes). New
|
|
24
|
+
module `gapit.gene_floors` (model registered as `gapit schema floors`), `gapit db
|
|
25
|
+
build NAME.fa --floors FILE` (gene builds only; cluster inputs reject it) installs a
|
|
26
|
+
validated copy — every listed gene must exist in the FASTA (`FLOORS_UNKNOWN_GENE`),
|
|
27
|
+
values in [0, 100] and structure per the schema (`FLOORS_MALFORMED`); dropping the
|
|
28
|
+
file into an existing db directory works too. The bundled `ecoli_dec` now ships
|
|
29
|
+
`{"genes": {"pic": 90.0}}` (true `pic` ≥95%; `astA` deliberately unfloored — true
|
|
30
|
+
alleles at 90.4–91% leave no margin), materialized with the bundle; MCP `screen_reads`
|
|
31
|
+
inherits the gate through the shared use-case.
|
|
32
|
+
|
|
33
|
+
- **Bundled `lm_doumith`: Listeria monocytogenes serogrouping (Doumith 2004) — the sixth
|
|
34
|
+
bundled database.** Five markers extracted from public-domain INSDC records (`prs`,
|
|
35
|
+
`lmo0737`, `lmo1118`, `ORF2819`, `ORF2110`; strand-corrected, `lmo0737` verified against
|
|
36
|
+
EGD-e) behind the `gapit.typing/2` scheme `doumith_serogroup` (95/95 floors, `prs`
|
|
37
|
+
control gene, cutoff 1.0 / margin 0.0). Rules follow Doumith's multiplex-PCR table
|
|
38
|
+
(IIa = 1/2a·3a, IIc = 1/2c·3c, IIb = 1/2b·3b·7, IVb = 4b·4d·4e) extended with Huang
|
|
39
|
+
2011's 4b variant (`IVb-v`, declared before `IVb` so an lmo0737-carrying 4b profile
|
|
40
|
+
resolves to the variant); fallback `untypeable (4a/4c, atypical profile, or non-Lm
|
|
41
|
+
Listeria)`. Materializes on first screen like every bundle (zero network);
|
|
42
|
+
`tests/test_lm_doumith.py` pins the synthetic marker-subset matrix, the control gate,
|
|
43
|
+
the two-stage golden, and the bundled integration — the bundled roster grows to six
|
|
44
|
+
(discovery, red-flag scan, `db list`, and `setupdb` pins updated). Uppercase gene ids
|
|
45
|
+
(`ORF2819`/`ORF2110`) now ride a shipped database, locking that build/screen/typing
|
|
46
|
+
carry them verbatim.
|
|
47
|
+
|
|
8
48
|
## [0.5.1] - 2026-10-03
|
|
9
49
|
|
|
10
50
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gapit
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: Mass screening of contigs and reads for known genes — agent-first Python reimplementation of abricate
|
|
5
5
|
Project-URL: Homepage, https://github.com/indexofire/gapit
|
|
6
6
|
Project-URL: Documentation, https://indexofire.github.io/gapit/
|
|
@@ -91,7 +91,7 @@ gapit screen --r1 ont_reads.fastq.gz --db ncbi --read-type map-ont --format json
|
|
|
91
91
|
# Summarize report tables into a gene presence/absence matrix
|
|
92
92
|
gapit summary *.tsv
|
|
93
93
|
|
|
94
|
-
# Databases:
|
|
94
|
+
# Databases: six ship in-wheel and work instantly; the rest download from upstream on fetch
|
|
95
95
|
gapit db fetch all # default set (card, vfdb)
|
|
96
96
|
gapit db fetch ncbi
|
|
97
97
|
gapit db list
|
|
@@ -111,8 +111,9 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
|
|
|
111
111
|
A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
|
|
112
112
|
`~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
|
|
113
113
|
into the catalog; all of them download from upstream and build on `gapit db fetch` — with
|
|
114
|
-
|
|
115
|
-
the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
|
|
114
|
+
six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
|
|
115
|
+
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
|
|
116
|
+
domain / Apache-2.0 /
|
|
116
117
|
BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
|
|
117
118
|
upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
|
|
118
119
|
redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
|
|
@@ -204,6 +205,6 @@ guide, `CHANGELOG.md` the change history.
|
|
|
204
205
|
|
|
205
206
|
gapit is MIT-licensed. It is a behavioral reimplementation of abricate (GPL-2.0) and
|
|
206
207
|
copies no Perl code; abricate itself remains GPL-2.0. The only database content inside
|
|
207
|
-
the package is the
|
|
208
|
+
the package is the six audited, permissively licensed bundles under `src/gapit/data/dbs/`
|
|
208
209
|
(public domain / Apache-2.0 / BSD-3-Clause / MIT); every other provider downloads from
|
|
209
210
|
upstream at fetch time, under its own license (SPEC.md §9).
|
|
@@ -61,7 +61,7 @@ gapit screen --r1 ont_reads.fastq.gz --db ncbi --read-type map-ont --format json
|
|
|
61
61
|
# Summarize report tables into a gene presence/absence matrix
|
|
62
62
|
gapit summary *.tsv
|
|
63
63
|
|
|
64
|
-
# Databases:
|
|
64
|
+
# Databases: six ship in-wheel and work instantly; the rest download from upstream on fetch
|
|
65
65
|
gapit db fetch all # default set (card, vfdb)
|
|
66
66
|
gapit db fetch ncbi
|
|
67
67
|
gapit db list
|
|
@@ -81,8 +81,9 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
|
|
|
81
81
|
A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
|
|
82
82
|
`~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
|
|
83
83
|
into the catalog; all of them download from upstream and build on `gapit db fetch` — with
|
|
84
|
-
|
|
85
|
-
the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
|
|
84
|
+
six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
|
|
85
|
+
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
|
|
86
|
+
domain / Apache-2.0 /
|
|
86
87
|
BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
|
|
87
88
|
upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
|
|
88
89
|
redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
|
|
@@ -174,6 +175,6 @@ guide, `CHANGELOG.md` the change history.
|
|
|
174
175
|
|
|
175
176
|
gapit is MIT-licensed. It is a behavioral reimplementation of abricate (GPL-2.0) and
|
|
176
177
|
copies no Perl code; abricate itself remains GPL-2.0. The only database content inside
|
|
177
|
-
the package is the
|
|
178
|
+
the package is the six audited, permissively licensed bundles under `src/gapit/data/dbs/`
|
|
178
179
|
(public domain / Apache-2.0 / BSD-3-Clause / MIT); every other provider downloads from
|
|
179
180
|
upstream at fetch time, under its own license (SPEC.md §9).
|
|
@@ -13,7 +13,7 @@ Version, as one JSON line:
|
|
|
13
13
|
|
|
14
14
|
```console
|
|
15
15
|
$ gapit --version --json
|
|
16
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
16
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Output schemas. Ten documents are introspectable: `report`, `typing_result`, `reads`,
|
|
@@ -12,7 +12,7 @@ gapit 生来就是被程序驱动的。每个输出都以机器可读为设计
|
|
|
12
12
|
|
|
13
13
|
```console
|
|
14
14
|
$ gapit --version --json
|
|
15
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
15
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
输出 schema。十个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
|
|
@@ -44,6 +44,7 @@ vfdb USTC (VFDB) available nucl VFDB virulence factors (set A, nucleotide)
|
|
|
44
44
|
victors University of Chicago available nucl Victors virulence factors
|
|
45
45
|
ecoh Holt lab (srst2) bundled nucl E. coli O and H antigens (srst2 EcOH)
|
|
46
46
|
ecoli_dec gapit-curated (public-domain sources) bundled nucl Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation)
|
|
47
|
+
lm_doumith gapit-curated (public-domain INSDC sources) bundled nucl Listeria monocytogenes serogrouping (Doumith 2004)
|
|
47
48
|
ncbi NCBI bundled nucl NCBI AMRFinderPlus (reference finder) curated AMR
|
|
48
49
|
resfinder DTU CGE bundled nucl CGE ResFinder acquired resistance genes
|
|
49
50
|
upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomics)
|
|
@@ -51,7 +52,7 @@ upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomi
|
|
|
51
52
|
|
|
52
53
|
NAME is the database name you pass to `--db`; PROVIDER names the upstream maintainer
|
|
53
54
|
organisation. STATUS reads `installed (N)` when `<datadir>/<name>/gapit-manifest.json`
|
|
54
|
-
exists, with N the record count, otherwise `available`. The last
|
|
55
|
+
exists, with N the record count, otherwise `available`. The last six rows are the
|
|
55
56
|
wheel-shipped [bundled](#bundled-databases-install-time-ready) databases, alphabetical:
|
|
56
57
|
`bundled` before materialization, `installed (N)` after. Four of them (`ecoh`, `ncbi`,
|
|
57
58
|
`resfinder`, `upec_expec_vf`) are also registry providers — such names render exactly
|
|
@@ -121,7 +122,7 @@ surface.) See [outputs.md](./outputs.md).
|
|
|
121
122
|
|
|
122
123
|
Most databases download from upstream at `db fetch` time because their licenses forbid
|
|
123
124
|
redistribution (see [Providers](#providers)). A small set of **bundled** databases ships
|
|
124
|
-
inside the gapit wheel instead —
|
|
125
|
+
inside the gapit wheel instead — six databases whose content provenance was audited
|
|
125
126
|
record-by-record (public-domain sources, or Apache-2.0 / BSD-3-Clause / MIT panels;
|
|
126
127
|
GPL and non-commercial content never rides the wheel). Nothing to download, nothing to
|
|
127
128
|
accept: a bundled database works out of the box.
|
|
@@ -130,6 +131,7 @@ accept: a bundled database works out of the box.
|
|
|
130
131
|
|---|---|---|---|
|
|
131
132
|
| `ecoh` | E. coli O and H antigens (597 records, srst2 EcOH) | 2026-10-02 | — |
|
|
132
133
|
| `ecoli_dec` | Diarrheagenic E. coli marker panel (17 records, GB 4789.6 + risk-monitoring designation) | 2026-10-02 | `gapit.typing/2` (schemes `gb4789_6`, `risk_monitoring`) |
|
|
134
|
+
| `lm_doumith` | Listeria monocytogenes serogrouping (5 records, Doumith 2004 markers) | 2026-10-03 | `gapit.typing/2` (scheme `doumith_serogroup`) |
|
|
133
135
|
| `ncbi` | NCBI AMRFinderPlus curated AMR (8373 records) | 2026-10-02 | — |
|
|
134
136
|
| `resfinder` | CGE ResFinder acquired resistance genes (3206 records) | 2026-10-02 | — |
|
|
135
137
|
| `upec_expec_vf` | UPEC/ExPEC virulence genes (77 records, FordeGenomics) | 2026-10-02 | — |
|
|
@@ -137,13 +139,15 @@ accept: a bundled database works out of the box.
|
|
|
137
139
|
**License provenance.** Every `ecoli_dec` record was re-sourced from primary
|
|
138
140
|
public-domain submissions (NCBI RefSeq/GenBank/DDBJ accessions, same alleles as the
|
|
139
141
|
rightsholder panel); two VFDB-derived records found in the original panel were removed
|
|
140
|
-
and replaced during the 2026-10 audit. The
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
142
|
+
and replaced during the 2026-10 audit. The `lm_doumith` panel was extracted the same
|
|
143
|
+
way from public-domain INSDC records (accessions in each header; reverse-complement
|
|
144
|
+
markers strand-corrected, `lmo0737` verified 100% against EGD-e). The four provider
|
|
145
|
+
snapshots (`ecoh`, `ncbi`, `resfinder`, `upec_expec_vf`) passed the 2026-10
|
|
146
|
+
content-level audit across **all** records: NCBI AMRFinderPlus content is public
|
|
147
|
+
domain (US government work), the CGE ResFinder database is Apache-2.0, srst2's EcOH
|
|
148
|
+
is BSD-3-Clause, and FordeGenomics' UPEC-ExPEC panel is MIT — all four permits
|
|
149
|
+
redistribution inside the MIT-licensed wheel. A regression test pins that no `VF*` /
|
|
150
|
+
`VFDB` / `ARO:` tags appear in any of the six bundles' headers.
|
|
147
151
|
|
|
148
152
|
**Snapshots are point-in-time.** Each snapshot's `sequences` file is byte-for-byte what
|
|
149
153
|
`gapit db fetch <name>` produces from upstream on the snapshot date (a regression test
|
|
@@ -167,6 +171,36 @@ manifest exists. `db list` shows the database as `bundled` before that and
|
|
|
167
171
|
`installed (17)` after — on all four listing surfaces (TSV, rich table, `--json`, MCP
|
|
168
172
|
`db_list`).
|
|
169
173
|
|
|
174
|
+
### Listeria serogrouping (`lm_doumith`)
|
|
175
|
+
|
|
176
|
+
The typed bundle behind Listeria monocytogenes serogroup prediction: five markers —
|
|
177
|
+
`prs`, `lmo0737`, `lmo1118`, `ORF2819`, `ORF2110` — screened with 95/95 identity and
|
|
178
|
+
coverage floors and folded by the `doumith_serogroup` scheme into Doumith's multiplex-PCR
|
|
179
|
+
groups (Doumith et al. 2004, J Clin Microbiol 42:3819), extended with the Huang 2011
|
|
180
|
+
4b variant: `prs` gates the scheme as a genus-level control gene, `IIa` (1/2a or 3a),
|
|
181
|
+
`IIc` (1/2c or 3c), `IIb` (1/2b, 3b or 7), `IVb` (4b, 4d or 4e), and `IVb-v` (the
|
|
182
|
+
lmo0737-carrying 4b variant) — the same in-silico semantics as tools like LisSero.
|
|
183
|
+
Designation runs through the two-stage pipeline: `gapit screen -o table.tsv --db
|
|
184
|
+
lm_doumith`, then `gapit typing table.tsv`.
|
|
185
|
+
|
|
186
|
+
Known limitations, carried on the calls as notes where relevant:
|
|
187
|
+
|
|
188
|
+
- **4b/4d/4e are unresolvable at gene level** — the three serovars share every published
|
|
189
|
+
molecular marker; resolve by cgMLST or antisera.
|
|
190
|
+
- **IVb-v is an emergent concern** — lmo0737 in an otherwise-4b profile (Huang 2011
|
|
191
|
+
"unusual 4b"; ST382/ST554 clones) is declared before IVb so the variant wins.
|
|
192
|
+
- **EGD-e types as IIc** — the 1/2a reference genome carries lmo1118 and lands in IIc;
|
|
193
|
+
documented in Doumith 2004, not a tool artifact.
|
|
194
|
+
- **Horizontal gene transfer cuts both ways** — the lineage-II lmo0737 cassette moves
|
|
195
|
+
between lineages, and rare HGT of the ORF markers can produce false IIb-looking
|
|
196
|
+
profiles; treat single-marker IIb calls in epidemiologically unlikely contexts with
|
|
197
|
+
care.
|
|
198
|
+
- **`prs` is genus-level, not Lm-specific** — other Listeria species carry it; a prs+
|
|
199
|
+
isolate with no serogroup markers falls back rather than being called non-Listeria.
|
|
200
|
+
|
|
201
|
+
The fallback call — `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` — is the
|
|
202
|
+
honest answer for everything the five markers cannot resolve.
|
|
203
|
+
|
|
170
204
|
## Checking database freshness
|
|
171
205
|
|
|
172
206
|
`gapit db outdated` reports every installed database's age against the staleness
|
|
@@ -263,7 +297,7 @@ unknown `--db NAME` is a usage error (exit 2) listing what is installed.
|
|
|
263
297
|
## Providers
|
|
264
298
|
|
|
265
299
|
Nineteen providers ship with gapit. Every one of them — `card` and `vfdb` included —
|
|
266
|
-
downloads from its upstream source at fetch time: with the exception of the
|
|
300
|
+
downloads from its upstream source at fetch time: with the exception of the six
|
|
267
301
|
audited, permissively licensed bundles above, nothing is bundled inside the package,
|
|
268
302
|
because several upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's
|
|
269
303
|
GPL-3.0) forbid redistribution inside an MIT-licensed distribution. The seven kaptive
|
|
@@ -410,6 +444,8 @@ $ gapit db install card.json \
|
|
|
410
444
|
sequences generated FASTA projection (gapit/v1 tagged headers)
|
|
411
445
|
sequences.n*|p* BLAST index built from sequences
|
|
412
446
|
gapit-manifest.json provenance sidecar, written last
|
|
447
|
+
typing.json optional gapit.typing/1 or /2 scoring spec (typed dbs)
|
|
448
|
+
floors.json optional gapit.floors/1 per-gene identity floors (reads mode)
|
|
413
449
|
```
|
|
414
450
|
|
|
415
451
|
### records.jsonl
|
|
@@ -452,7 +488,7 @@ versions. A real one, from the plasmidfinder database:
|
|
|
452
488
|
"upstream_version": "",
|
|
453
489
|
"tool": {
|
|
454
490
|
"name": "gapit",
|
|
455
|
-
"version": "0.5.
|
|
491
|
+
"version": "0.5.2"
|
|
456
492
|
},
|
|
457
493
|
"makeblastdb_version": "blastn: 2.17.0+",
|
|
458
494
|
"minimap2_version": "2.31-r1302"
|
|
@@ -479,6 +515,31 @@ versions. A real one, from the plasmidfinder database:
|
|
|
479
515
|
`records.jsonl` and the manifest are file contracts. They never appear on stdout and are
|
|
480
516
|
not registered with `gapit schema`.
|
|
481
517
|
|
|
518
|
+
### floors.json — per-gene identity floors
|
|
519
|
+
|
|
520
|
+
An optional sidecar declaring a MINIMUM alignment identity (%) per gene for reads-mode
|
|
521
|
+
presence (schema `gapit.floors/1`, introspect with `gapit schema floors`; see
|
|
522
|
+
[reads.md](./reads.md#per-gene-identity-floors-gapitfloors1-database-side) for the
|
|
523
|
+
screening semantics and the `pic` worked example):
|
|
524
|
+
|
|
525
|
+
```json
|
|
526
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"pic": 90.0}}
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
| Field | Type | Meaning |
|
|
530
|
+
|---|---|---|
|
|
531
|
+
| `schema` | string | Always `gapit.floors/1` |
|
|
532
|
+
| `default` | number or null | Floor for genes not listed in `genes` (`null` = no floor) |
|
|
533
|
+
| `genes` | object | `{gene: minimum identity %}`, values in [0, 100] |
|
|
534
|
+
|
|
535
|
+
The file's presence IS the flag — no manifest field, no CLI switch. A database without
|
|
536
|
+
the sidecar screens byte-identically to before (the floors are a db-driven opt-in, not a
|
|
537
|
+
CLI contract change), and the blastn contig path never reads them. Built-in via
|
|
538
|
+
`db build --floors` (next sections), or drop the file into an existing db directory; it
|
|
539
|
+
is validated at screening time too (malformed content fails with `FLOORS_MALFORMED`,
|
|
540
|
+
exit 4). The bundled `ecoli_dec` ships `{"genes": {"pic": 90.0}}` — the SPATE-homolog
|
|
541
|
+
false-positive fix.
|
|
542
|
+
|
|
482
543
|
## Header formats and compatibility
|
|
483
544
|
|
|
484
545
|
gapit reads two header formats and detects them per record:
|
|
@@ -581,6 +642,27 @@ gene accession function
|
|
|
581
642
|
syn_betalac SYN-0001 ampicillin;cephalosporin
|
|
582
643
|
```
|
|
583
644
|
|
|
645
|
+
### Per-gene identity floors (`--floors`)
|
|
646
|
+
|
|
647
|
+
`--floors FILE` installs a `gapit.floors/1` document as the database's `floors.json`
|
|
648
|
+
sidecar — the per-gene minimum alignment identity for reads-mode presence (see
|
|
649
|
+
[reads.md](./reads.md#per-gene-identity-floors-gapitfloors1-database-side)). The
|
|
650
|
+
document is validated before any artifact is written: every gene in `genes` must exist
|
|
651
|
+
in the FASTA (`FLOORS_UNKNOWN_GENE`, exit 4 — a floor for a missing gene is silently
|
|
652
|
+
dead safety config), values must lie in [0, 100] and the structure parse
|
|
653
|
+
(`FLOORS_MALFORMED`, exit 4). The file is then copied in byte-identical; the file's
|
|
654
|
+
presence is the flag (no manifest field changes). Gene builds only — a GBK/GFF cluster
|
|
655
|
+
input rejects `--floors` as a usage error.
|
|
656
|
+
|
|
657
|
+
```console
|
|
658
|
+
$ cat my_floors.json
|
|
659
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
|
|
660
|
+
$ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --floors my_floors.json
|
|
661
|
+
{"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}
|
|
662
|
+
$ cat ./db/tinyamr/floors.json
|
|
663
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
|
|
664
|
+
```
|
|
665
|
+
|
|
584
666
|
### Rebuilding
|
|
585
667
|
|
|
586
668
|
Like `db fetch`, an existing database is never overwritten silently:
|
|
@@ -44,6 +44,7 @@ vfdb USTC (VFDB) available nucl VFDB virulence factors (set A, nucleotide)
|
|
|
44
44
|
victors University of Chicago available nucl Victors virulence factors
|
|
45
45
|
ecoh Holt lab (srst2) bundled nucl E. coli O and H antigens (srst2 EcOH)
|
|
46
46
|
ecoli_dec gapit-curated (public-domain sources) bundled nucl Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation)
|
|
47
|
+
lm_doumith gapit-curated (public-domain INSDC sources) bundled nucl Listeria monocytogenes serogrouping (Doumith 2004)
|
|
47
48
|
ncbi NCBI bundled nucl NCBI AMRFinderPlus (reference finder) curated AMR
|
|
48
49
|
resfinder DTU CGE bundled nucl CGE ResFinder acquired resistance genes
|
|
49
50
|
upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomics)
|
|
@@ -51,7 +52,7 @@ upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomi
|
|
|
51
52
|
|
|
52
53
|
NAME 是传给 `--db` 的数据库名;PROVIDER 是上游维护机构。当
|
|
53
54
|
`<datadir>/<name>/gapit-manifest.json` 存在时 STATUS 显示 `installed (N)`,N 是
|
|
54
|
-
记录数,否则显示 `available
|
|
55
|
+
记录数,否则显示 `available`。最后六行是按名称排序的 wheel 内置数据库(见下文
|
|
55
56
|
"内置数据库(即装即用)"一节):物化前为 `bundled`,物化后为 `installed (N)`。
|
|
56
57
|
其中四个(`ecoh`、`ncbi`、`resfinder`、`upec_expec_vf`)同时是注册表提供商 ——
|
|
57
58
|
这类名字只渲染一次,位于内置区(绝不会重复出现一条注册表 `available` 行),
|
|
@@ -117,7 +118,7 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
|
|
|
117
118
|
## 内置数据库(即装即用)
|
|
118
119
|
|
|
119
120
|
大多数数据库在 `db fetch` 时才从上游下载,因为许可证禁止再分发(见"提供商"一节)。
|
|
120
|
-
少数**内置**数据库随 gapit wheel 一起发布 ——
|
|
121
|
+
少数**内置**数据库随 gapit wheel 一起发布 —— 共六个,其内容经过逐条记录的来源
|
|
121
122
|
审计(公共领域来源,或 Apache-2.0 / BSD-3-Clause / MIT 宽松许可面板;GPL 与
|
|
122
123
|
非商业许可内容绝不随 wheel 分发)。无需下载、无需确认:内置数据库开箱即用。
|
|
123
124
|
|
|
@@ -125,17 +126,20 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
|
|
|
125
126
|
|---|---|---|---|
|
|
126
127
|
| `ecoh` | 大肠杆菌 O/H 抗原基因(597 条记录,srst2 EcOH) | 2026-10-02 | — |
|
|
127
128
|
| `ecoli_dec` | 致腹泻大肠杆菌标志基因面板(17 条记录,GB 4789.6 + 风险监测判定) | 2026-10-02 | `gapit.typing/2`(`gb4789_6`、`risk_monitoring` 双方案) |
|
|
129
|
+
| `lm_doumith` | 单核细胞增生李斯特菌血清群分型(5 条记录,Doumith 2004 标记) | 2026-10-03 | `gapit.typing/2`(方案 `doumith_serogroup`) |
|
|
128
130
|
| `ncbi` | NCBI AMRFinderPlus 精选 AMR(8373 条记录) | 2026-10-02 | — |
|
|
129
131
|
| `resfinder` | CGE ResFinder 获得性耐药基因(3206 条记录) | 2026-10-02 | — |
|
|
130
132
|
| `upec_expec_vf` | UPEC/ExPEC 毒力基因(77 条记录,FordeGenomics) | 2026-10-02 | — |
|
|
131
133
|
|
|
132
134
|
**许可证来源声明。** `ecoli_dec` 的每条记录都取自公共领域的一级提交(NCBI
|
|
133
135
|
RefSeq/GenBank/DDBJ 收录号,与权利方面板等位相同);2026-10 审计中发现原面板里
|
|
134
|
-
混入的两条 VFDB
|
|
135
|
-
`
|
|
136
|
+
混入的两条 VFDB 来源记录已被移除并替换。`lm_doumith` 面板以同样方式取自公共领域
|
|
137
|
+
的 INSDC 记录(收录号见每条头部;反向互补标记已做链向校正,`lmo0737` 经与 EGD-e
|
|
138
|
+
比对验证 100% 一致)。四个提供商快照(`ecoh`、`ncbi`、`resfinder`、
|
|
139
|
+
`upec_expec_vf`)通过了 2026-10 对**全部**记录的内容级审计:
|
|
136
140
|
NCBI AMRFinderPlus 内容属公共领域(美国政府作品),CGE ResFinder 数据库为
|
|
137
141
|
Apache-2.0,srst2 的 EcOH 为 BSD-3-Clause,FordeGenomics 的 UPEC-ExPEC 面板为
|
|
138
|
-
MIT —— 四者均允许随 MIT 许可的 wheel
|
|
142
|
+
MIT —— 四者均允许随 MIT 许可的 wheel 再分发。回归测试锁定了六个内置库的头部
|
|
139
143
|
不出现任何 `VF*` / `VFDB` / `ARO:` 标签。
|
|
140
144
|
|
|
141
145
|
**快照是一个时间点。** 每个快照的 `sequences` 文件与快照当日 `gapit db fetch
|
|
@@ -156,6 +160,35 @@ ecoli_dec (17 records) into <datadir>`,`--quiet` 可静默),随后走标
|
|
|
156
160
|
`bundled`、物化后显示 `installed (17)` —— 四个列表入口(TSV、rich 表格、
|
|
157
161
|
`--json`、MCP `db_list`)一致。
|
|
158
162
|
|
|
163
|
+
### 李斯特菌血清群分型(`lm_doumith`)
|
|
164
|
+
|
|
165
|
+
用于单核细胞增生李斯特菌(Listeria monocytogenes)血清群预测的分型内置库:
|
|
166
|
+
五个标记 —— `prs`、`lmo0737`、`lmo1118`、`ORF2819`、`ORF2110` —— 以 95/95
|
|
167
|
+
的序列一致性与覆盖度阈值筛检,由 `doumith_serogroup` 方案折算为 Doumith 多重
|
|
168
|
+
PCR 分群(Doumith 等 2004,J Clin Microbiol 42:3819),并扩展了 Huang 2011 的
|
|
169
|
+
4b 变体:`prs` 作为属级控制基因把关整个方案,`IIa`(1/2a 或 3a)、`IIc`
|
|
170
|
+
(1/2c 或 3c)、`IIb`(1/2b、3b 或 7)、`IVb`(4b、4d 或 4e)与 `IVb-v`(携带
|
|
171
|
+
lmo0737 的 4b 变体)—— 与 LisSero 等工具的 in-silico 语义一致。判定走两阶段
|
|
172
|
+
管线:`gapit screen -o table.tsv --db lm_doumith`,然后 `gapit typing
|
|
173
|
+
table.tsv`。
|
|
174
|
+
|
|
175
|
+
已知的局限(相关处以 notes 形式随判定输出):
|
|
176
|
+
|
|
177
|
+
- **4b/4d/4e 在基因层面无法区分** —— 三个血清型共享所有已发表的分子标记;
|
|
178
|
+
需用 cgMLST 或血清学进一步判定。
|
|
179
|
+
- **IVb-v 是新出现的关注克隆** —— 4b 谱面中检出 lmo0737(Huang 2011
|
|
180
|
+
"unusual 4b";ST382/ST554 克隆)时,该规则先于 IVb 声明,变体优先胜出。
|
|
181
|
+
- **EGD-e 判为 IIc** —— 1/2a 参考基因组携带 lmo1118 而落入 IIc;这是 Doumith
|
|
182
|
+
2004 原文记载的现象,不是工具假象。
|
|
183
|
+
- **水平基因转移是双向陷阱** —— 谱系 II 的 lmo0737 盒会在谱系间移动,罕见的
|
|
184
|
+
ORF 标记水平转移也可能造成貌似 IIb 的假谱面;在流行病学上不太可能的语境里,
|
|
185
|
+
单标记 IIb 判定需谨慎对待。
|
|
186
|
+
- **`prs` 是属级基因,并非 Lm 特异** —— 其他李斯特菌物种也携带它;prs 阳性但
|
|
187
|
+
无任何血清群标记的分离株回退为 fallback,而不是被判为"非李斯特菌"。
|
|
188
|
+
|
|
189
|
+
回退判定 —— `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` ——
|
|
190
|
+
是这五个标记无法给出答案时的诚实输出。
|
|
191
|
+
|
|
159
192
|
## 检查数据库新鲜度
|
|
160
193
|
|
|
161
194
|
`gapit db outdated` 报告每个已安装数据库相对于过期阈值的年龄。对装满的数据
|
|
@@ -251,7 +284,7 @@ $ gapit db search "tet(M)" --field gene --exact --json | head -1
|
|
|
251
284
|
## 提供商
|
|
252
285
|
|
|
253
286
|
gapit 自带十九个提供商。每一个——包括 `card` 和 `vfdb`——都在抓取时从上游下载:
|
|
254
|
-
|
|
287
|
+
除上文六个通过审计、宽松许可的内置库之外,包里不内置任何内容,因为多家上游许可
|
|
255
288
|
(CARD 的 McMaster 条款、VFDB 的 CC BY-NC、
|
|
256
289
|
Kaptive 的 GPL-3.0)禁止随 MIT 许可的发行版再分发。七个 kaptive 提供商是**基因簇**
|
|
257
290
|
数据库(抓取时经基因簇管线构建,见下文 Kaptive 提供商一节)。
|
|
@@ -390,6 +423,8 @@ $ gapit db install card.json \
|
|
|
390
423
|
sequences generated FASTA projection (gapit/v1 tagged headers)
|
|
391
424
|
sequences.n*|p* BLAST index built from sequences
|
|
392
425
|
gapit-manifest.json provenance sidecar, written last
|
|
426
|
+
typing.json 可选的 gapit.typing/1 或 /2 评分规范(带分型的数据库)
|
|
427
|
+
floors.json 可选的 gapit.floors/1 按基因一致性下限(reads 模式)
|
|
393
428
|
```
|
|
394
429
|
|
|
395
430
|
### records.jsonl
|
|
@@ -431,7 +466,7 @@ manifest,来自 plasmidfinder 数据库:
|
|
|
431
466
|
"upstream_version": "",
|
|
432
467
|
"tool": {
|
|
433
468
|
"name": "gapit",
|
|
434
|
-
"version": "0.5.
|
|
469
|
+
"version": "0.5.2"
|
|
435
470
|
},
|
|
436
471
|
"makeblastdb_version": "blastn: 2.17.0+",
|
|
437
472
|
"minimap2_version": "2.31-r1302"
|
|
@@ -458,6 +493,28 @@ manifest,来自 plasmidfinder 数据库:
|
|
|
458
493
|
`records.jsonl` 和 manifest 是文件契约。它们从不出现在 stdout,也未注册到
|
|
459
494
|
`gapit schema`。
|
|
460
495
|
|
|
496
|
+
### floors.json — 按基因设置一致性下限
|
|
497
|
+
|
|
498
|
+
一个可选边车,为 reads 模式的存在判定声明逐基因的最小比对一致性(%)(schema 为
|
|
499
|
+
`gapit.floors/1`,用 `gapit schema floors` 内省;筛查语义与 `pic` 实战示例见
|
|
500
|
+
[reads.zh.md](./reads.zh.md#按基因设置一致性下限gapitfloors1数据库侧)):
|
|
501
|
+
|
|
502
|
+
```json
|
|
503
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"pic": 90.0}}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
| 字段 | 类型 | 含义 |
|
|
507
|
+
|---|---|---|
|
|
508
|
+
| `schema` | string | 恒为 `gapit.floors/1` |
|
|
509
|
+
| `default` | number 或 null | 未在 `genes` 中列出的基因的下限(`null` = 无下限) |
|
|
510
|
+
| `genes` | object | `{基因: 最小一致性 %}`,取值在 [0, 100] 内 |
|
|
511
|
+
|
|
512
|
+
文件的存在本身就是开关——没有 manifest 字段,也没有 CLI 开关。不带边车的数据库
|
|
513
|
+
输出与之前逐字节一致(下限是数据库驱动的可选开启,不是 CLI 契约变更);blastn
|
|
514
|
+
contig 路径从不读取它们。通过 `db build --floors` 安装(见下节),或把文件直接放
|
|
515
|
+
进既有数据库目录;筛查时同样会校验(内容损坏以 `FLOORS_MALFORMED` 失败,exit 4)。
|
|
516
|
+
内置的 `ecoli_dec` 携带 `{"genes": {"pic": 90.0}}`——SPATE 同源假阳性的修复。
|
|
517
|
+
|
|
461
518
|
## 表头格式与兼容性
|
|
462
519
|
|
|
463
520
|
gapit 读取两种表头格式,逐记录检测:
|
|
@@ -552,6 +609,26 @@ gene accession function
|
|
|
552
609
|
syn_betalac SYN-0001 ampicillin;cephalosporin
|
|
553
610
|
```
|
|
554
611
|
|
|
612
|
+
### 按基因一致性下限(`--floors`)
|
|
613
|
+
|
|
614
|
+
`--floors FILE` 把一份 `gapit.floors/1` 文档安装为数据库的 `floors.json` 边车——
|
|
615
|
+
reads 模式存在判定的逐基因最小比对一致性(见
|
|
616
|
+
[reads.zh.md](./reads.zh.md#按基因设置一致性下限gapitfloors1数据库侧))。文档在
|
|
617
|
+
任何产物落盘前先校验:`genes` 里的每个基因必须存在于 FASTA
|
|
618
|
+
(`FLOORS_UNKNOWN_GENE`,exit 4——给缺失基因设下限是静默失效的安全配置),取值必
|
|
619
|
+
须在 [0, 100] 内、结构必须可解析(`FLOORS_MALFORMED`,exit 4)。随后文件原样拷入;
|
|
620
|
+
文件的存在本身就是开关(manifest 字段不变)。仅限基因数据库——GBK/GFF 簇输入对
|
|
621
|
+
`--floors` 报用法错误。
|
|
622
|
+
|
|
623
|
+
```console
|
|
624
|
+
$ cat my_floors.json
|
|
625
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
|
|
626
|
+
$ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --floors my_floors.json
|
|
627
|
+
{"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}
|
|
628
|
+
$ cat ./db/tinyamr/floors.json
|
|
629
|
+
{"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
|
|
630
|
+
```
|
|
631
|
+
|
|
555
632
|
### 重建
|
|
556
633
|
|
|
557
634
|
与 `db fetch` 一样,已有的数据库绝不被静默覆盖:
|
|
@@ -45,9 +45,9 @@ gapit --version
|
|
|
45
45
|
|
|
46
46
|
```console
|
|
47
47
|
$ gapit --version
|
|
48
|
-
gapit 0.5.
|
|
48
|
+
gapit 0.5.2
|
|
49
49
|
$ gapit --version --json
|
|
50
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
50
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
## External binaries
|
|
@@ -44,9 +44,9 @@ gapit --version
|
|
|
44
44
|
|
|
45
45
|
```console
|
|
46
46
|
$ gapit --version
|
|
47
|
-
gapit 0.5.
|
|
47
|
+
gapit 0.5.2
|
|
48
48
|
$ gapit --version --json
|
|
49
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
49
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
## 外部二进制
|
|
@@ -94,7 +94,7 @@ EOF
|
|
|
94
94
|
Response line 1, verbatim:
|
|
95
95
|
|
|
96
96
|
```text
|
|
97
|
-
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.
|
|
97
|
+
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.2"}}}
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
Response line 2 (real output, elided in the middle; each tool carries its full
|
|
@@ -117,7 +117,7 @@ the same run):
|
|
|
117
117
|
```json
|
|
118
118
|
{
|
|
119
119
|
"schema": "gapit.report/1",
|
|
120
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
120
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
121
121
|
"created_at": "2026-09-19T01:15:44Z",
|
|
122
122
|
"params": {"db": "tinyamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
|
|
123
123
|
"files": [
|
|
@@ -173,7 +173,7 @@ the same run):
|
|
|
173
173
|
```json
|
|
174
174
|
{
|
|
175
175
|
"schema": "gapit.reads/1",
|
|
176
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
176
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
177
177
|
"created_at": "2026-09-22T00:07:35Z",
|
|
178
178
|
"params": {
|
|
179
179
|
"db": "tinyreads",
|
|
@@ -248,7 +248,7 @@ hit is the gene the agent just built the database from (real output):
|
|
|
248
248
|
```json
|
|
249
249
|
{
|
|
250
250
|
"schema": "gapit.report/1",
|
|
251
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
251
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
252
252
|
"created_at": "2026-09-20T13:38:39Z",
|
|
253
253
|
"params": {"db": "myamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
|
|
254
254
|
"files": [
|
|
@@ -88,7 +88,7 @@ EOF
|
|
|
88
88
|
响应第 1 行,原样:
|
|
89
89
|
|
|
90
90
|
```text
|
|
91
|
-
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.
|
|
91
|
+
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.2"}}}
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
响应第 2 行(真实输出,中段省略;每个工具携带完整的 `inputSchema`):
|
|
@@ -109,7 +109,7 @@ EOF
|
|
|
109
109
|
```json
|
|
110
110
|
{
|
|
111
111
|
"schema": "gapit.report/1",
|
|
112
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
112
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
113
113
|
"created_at": "2026-09-19T01:15:44Z",
|
|
114
114
|
"params": {"db": "tinyamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
|
|
115
115
|
"files": [
|
|
@@ -163,7 +163,7 @@ EOF
|
|
|
163
163
|
```json
|
|
164
164
|
{
|
|
165
165
|
"schema": "gapit.reads/1",
|
|
166
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
166
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
167
167
|
"created_at": "2026-09-22T00:07:35Z",
|
|
168
168
|
"params": {
|
|
169
169
|
"db": "tinyreads",
|
|
@@ -236,7 +236,7 @@ export GAPIT_DATADIR=/tmp/gapit-mcp-demo/datadir
|
|
|
236
236
|
```json
|
|
237
237
|
{
|
|
238
238
|
"schema": "gapit.report/1",
|
|
239
|
-
"tool": {"name": "gapit", "version": "0.5.
|
|
239
|
+
"tool": {"name": "gapit", "version": "0.5.2"},
|
|
240
240
|
"created_at": "2026-09-20T13:38:39Z",
|
|
241
241
|
"params": {"db": "myamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
|
|
242
242
|
"files": [
|