#!/usr/bin/env python3 from __future__ import annotations import argparse from pathlib import Path from .api import BtSingleFnaPipeline def main() -> int: ap = argparse.ArgumentParser(description="Bttoxin single-FNA pipeline (Digger → Shotter → Plot → Bundle)") ap.add_argument("--fna", type=Path, required=True, help="Path to a single .fna file") ap.add_argument("--toxicity_csv", type=Path, default=Path("Data/toxicity-data.csv")) ap.add_argument("--base_workdir", type=Path, default=None, help="Base working dir (default: runs/bttoxin under repo root)") ap.add_argument("--image", type=str, default="quay.io/biocontainers/bttoxin_digger:1.0.10--hdfd78af_0") ap.add_argument("--platform", type=str, default="linux/amd64") ap.add_argument("--min_identity", type=float, default=0.0) ap.add_argument("--min_coverage", type=float, default=0.0) ap.add_argument("--disallow_unknown_families", action="store_true", default=False) ap.add_argument("--require_index_hit", action="store_true", default=False) ap.add_argument("--lang", type=str, choices=["zh", "en"], default="zh") ap.add_argument("--threads", type=int, default=4) args = ap.parse_args() pipe = BtSingleFnaPipeline(image=args.image, platform=args.platform, base_workdir=args.base_workdir) res = pipe.run( fna=args.fna, toxicity_csv=args.toxicity_csv, min_identity=args.min_identity, min_coverage=args.min_coverage, allow_unknown_families=not args.disallow_unknown_families, require_index_hit=args.require_index_hit, lang=args.lang, threads=args.threads, ) if not res.get("ok"): print(f"[bttoxin-run] FAILED at stage={res.get('stage')}") return 1 print("[bttoxin-run] ✓ Done") print(f" run_root: {res['run_root']}") print(f" digger: {res['digger_dir']}") print(f" shotter: {res['shotter_dir']}") print(f" bundle: {res['bundle']}") print(f" strain: {res.get('strain','')}") return 0 if __name__ == "__main__": raise SystemExit(main())