Files
2026-08-03 18:42:47 +08:00

92 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""
RNA-seq Alignment Skill Runner
Executes the RNA-seq alignment stage as a skill.
"""
import argparse
import json
import subprocess
import sys
from pathlib import Path
from typing import Dict, Any
def load_config(config_path: Path) -> Dict[str, Any]:
"""Load skill configuration"""
import yaml
with open(config_path, 'r') as f:
return yaml.safe_load(f)
def run_skill(
input_dir: Path,
hisat2_index: Path,
output_dir: Path,
prefix: str = "",
cpu: int = 4,
sample_config: Path = None,
job_id: str = "unknown"
) -> Dict[str, Any]:
"""Run the RNA-seq alignment skill"""
# Import the main module
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "apps" / "cli"))
from run_rnaseq_align import main as align_main
# Build arguments
args = [
"-i", str(input_dir),
"-x", str(hisat2_index),
"-o", str(output_dir),
"-j", job_id,
"-p", prefix,
"-t", str(cpu)
]
if sample_config:
args.extend(["--sample-config", str(sample_config)])
# Run the alignment
sys.argv = ["run_rnaseq_align.py"] + args
align_main()
# Load and return manifest
manifest_path = output_dir.parent / "final" / f"{prefix}.rnaseq_align.manifest.json"
if manifest_path.exists():
with open(manifest_path, 'r') as f:
return json.load(f)
return {"status": "failed", "error": "Manifest not found"}
def main():
parser = argparse.ArgumentParser(description="RNA-seq Alignment Skill")
parser.add_argument("-i", "--input", required=True, help="Input directory with clean FASTQ")
parser.add_argument("-x", "--hisat2-index", required=True, help="HISAT2 index prefix")
parser.add_argument("-o", "--output", required=True, help="Output directory")
parser.add_argument("-j", "--job-id", default="unknown", help="Job ID")
parser.add_argument("-p", "--prefix", default="", help="Output prefix")
parser.add_argument("-t", "--cpu", type=int, default=4, help="CPU threads")
parser.add_argument("-c", "--config", help="Sample config YAML")
args = parser.parse_args()
result = run_skill(
input_dir=Path(args.input),
hisat2_index=Path(args.hisat2_index),
output_dir=Path(args.output),
prefix=args.prefix,
cpu=args.cpu,
sample_config=Path(args.config) if args.config else None,
job_id=args.job_id
)
print(json.dumps(result, indent=2))
return 0 if result.get("status") == "success" else 1
if __name__ == "__main__":
sys.exit(main())