Refactor: Unified pipeline execution, simplified UI, and fixed Docker config

- Backend: Refactored tasks.py to directly invoke run_single_fna_pipeline.py for consistency.
- Backend: Changed output format to ZIP and added auto-cleanup of intermediate files.
- Backend: Fixed language parameter passing in API and tasks.
- Frontend: Removed CRISPR Fusion UI elements from Submit and Monitor views.
- Frontend: Implemented simulated progress bar for better UX.
- Frontend: Restored One-click load button and added result file structure documentation.
- Docker: Fixed critical Restarting loop by removing incorrect image directive in docker-compose.yml.
- Docker: Optimized Dockerfile to correct .pixi environment path issues and prevent accidental deletion of frontend assets.
This commit is contained in:
zly
2026-01-20 20:25:25 +08:00
parent 5067169b0b
commit c75c85c53b
134 changed files with 146457 additions and 996647 deletions

View File

@@ -206,6 +206,49 @@ def run_single_file_pipeline(
if not all_toxins.exists():
return {"ok": False, "stage": "digger", "error": f"Missing All_Toxins.txt at {all_toxins}"}
# 1.5) Run Context Analysis (BGC, Mobilome, CRISPR)
print("[pipeline] Running Genome Context Analysis...")
context_dir = out_root / "context"
context_dir.mkdir(parents=True, exist_ok=True)
# Define tool paths
project_root = Path(__file__).resolve().parents[1]
bgc_script = project_root / "tools" / "bgc_analysis" / "detect_bgc.py"
mobi_script = project_root / "tools" / "mobilome_analysis" / "detect_mobilome.py"
crispr_script = project_root / "tools" / "crispr_cas_analysis" / "scripts" / "detect_crispr.py"
fusion_script = project_root / "tools" / "crispr_cas_analysis" / "scripts" / "fusion_analysis.py"
# Define outputs
bgc_out = context_dir / "bgc.json"
mobi_out = context_dir / "mobilome.json"
crispr_out = context_dir / "crispr_results.json"
fusion_out = context_dir / "fusion_results.json"
# Execute Tools (using pipeline env python)
# BGC
if bgc_script.exists():
_shell(["python", str(bgc_script), "--input", str(input_path), "--output", str(bgc_out)])
# Mobilome
if mobi_script.exists():
_shell(["python", str(mobi_script), "--input", str(input_path), "--output", str(mobi_out)])
# CRISPR Detection
if crispr_script.exists():
# Use --mock for now as per instructions
_shell(["python", str(crispr_script), "--input", str(input_path), "--output", str(crispr_out), "--mock"])
# CRISPR Fusion (needs CRISPR results + Digger results)
if fusion_script.exists() and crispr_out.exists() and all_toxins.exists():
_shell([
"python", str(fusion_script),
"--crispr-results", str(crispr_out),
"--toxin-results", str(all_toxins),
"--genome", str(input_path),
"--output", str(fusion_out),
"--mock"
])
# 2) Run Shotter scoring via pixi run -e pipeline
shotter_dir.mkdir(parents=True, exist_ok=True)
scripts_dir = Path(__file__).resolve().parents[0]
@@ -221,6 +264,12 @@ def run_single_file_pipeline(
min_coverage=min_coverage,
allow_unknown_families=allow_unknown_families,
require_index_hit=require_index_hit,
# Pass Context Results
crispr_results=fusion_out if fusion_out.exists() else None,
crispr_fusion=fusion_out.exists(),
context_bgc=bgc_out if bgc_out.exists() else None,
context_mobilome=mobi_out if mobi_out.exists() else None,
context_crispr=crispr_out if crispr_out.exists() else None,
)
r1 = _shell(shoter_cmd)
@@ -248,6 +297,7 @@ def run_single_file_pipeline(
r2 = _shell(plot_cmd)
if r2.returncode != 0:
print(f"[pipeline] Warning: Plotting/Report failed (exit={r2.returncode})")
# plotting/report optional; continue
pass