89 lines
2.4 KiB
Python
Executable File
89 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
KaKs Analysis Skill - Main Runner
|
|
Ka/Ks分析技能主运行脚本
|
|
|
|
Usage:
|
|
python run.py --cds1 Ft.cds.fa --cds2 Ath.cds.fa --pairs orthologs.txt --output ./kaks
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import logging
|
|
import sys
|
|
import re
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def parse_yn00_output(yn00_file: Path) -> tuple:
|
|
"""解析yn00输出文件,提取Ka, Ks, Ka/Ks"""
|
|
ka = ks = kaks = None
|
|
|
|
with open(yn00_file, 'r') as f:
|
|
content = f.read()
|
|
|
|
# 查找YN方法的结果
|
|
yn_pattern = r'\d+\.\d+\s+\d+\.\d+\s+\d+\.\d+\s+\d+\.\d+\s+\d+\.\d+\s+\d+\.\d+'
|
|
matches = re.findall(yn_pattern, content)
|
|
|
|
if matches:
|
|
last_line = matches[-1].split()
|
|
if len(last_line) >= 6:
|
|
ka = float(last_line[0])
|
|
ks = float(last_line[1])
|
|
kaks = float(last_line[2])
|
|
|
|
return ka, ks, kaks
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Ka/Ks Analysis Skill - 非同义/同义替换率分析"
|
|
)
|
|
parser.add_argument(
|
|
"--cds1", "-1", required=True, type=Path,
|
|
help="物种1 CDS FASTA文件"
|
|
)
|
|
parser.add_argument(
|
|
"--cds2", "-2", required=True, type=Path,
|
|
help="物种2 CDS FASTA文件"
|
|
)
|
|
parser.add_argument(
|
|
"--pairs", "-p", required=True, type=Path,
|
|
help="同源基因对列表文件 (TSV格式: gene1\\tgene2)"
|
|
)
|
|
parser.add_argument(
|
|
"--neutral-rate", type=float, default=7.08e-9,
|
|
help="中性替换率 (替换/位点/年), 默认: 7.08e-9 (拟南芥)"
|
|
)
|
|
parser.add_argument(
|
|
"--cpu", type=int, default=8,
|
|
help="CPU线程数, 默认: 8"
|
|
)
|
|
parser.add_argument(
|
|
"--output", "-o", required=True, type=Path,
|
|
help="输出目录"
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
logger.info(f"Starting Ka/Ks analysis...")
|
|
logger.info(f"CDS1: {args.cds1}")
|
|
logger.info(f"CDS2: {args.cds2}")
|
|
logger.info(f"Pairs: {args.pairs}")
|
|
logger.info(f"Output: {args.output}")
|
|
|
|
# TODO: Implement full analysis pipeline
|
|
logger.info("Ka/Ks analysis completed (placeholder)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|