| import subprocess |
| import os |
| from typing import List, Optional |
| from pathlib import Path |
| import yaml |
|
|
| class USalignRunner: |
| def __init__(self, config_path: str = "config.yaml"): |
| """ |
| Initialize USalignRunner with parameters from config file. |
| |
| Args: |
| config_path (str): Path to the configuration file |
| """ |
| with open(config_path, 'r',encoding="utf-8") as f: |
| config = yaml.safe_load(f) |
| |
| self.usalign_path = Path(config['USalign']['path']) |
| self.default_params = { |
| 'tmscore': config['USalign']['tmscore'], |
| 'outfmt': config['USalign']['outfmt'], |
| 'mol': 'protein' |
| } |
| |
| if not self.usalign_path.exists(): |
| raise FileNotFoundError(f"USalign executable not found at {self.usalign_path}") |
|
|
| def run_alignment( |
| self, |
| target_dir: str, |
| pdb_list_file: str, |
| tmscore: Optional[float] = None, |
| outfmt: Optional[int] = None, |
| ) -> tuple[int, str, str]: |
| tmscore = tmscore if tmscore is not None else self.default_params['tmscore'] |
| outfmt = outfmt if outfmt is not None else self.default_params['outfmt'] |
| |
| |
| cmd = [ |
| str(self.usalign_path), |
| "-mol", self.default_params['mol'], |
| "-dir", str(target_dir), |
| pdb_list_file, |
| "-TMscore", str(tmscore), |
| "-outfmt", str(outfmt) |
| ] |
| print(cmd) |
| |
| |
| cmd_str = " ".join(cmd) |
| |
| try: |
| |
| process = subprocess.Popen( |
| cmd_str, |
| stdout=subprocess.PIPE, |
| stderr=subprocess.PIPE, |
| shell=True, |
| text=True |
| ) |
| |
| |
| stdout, stderr = process.communicate() |
| |
| return process.returncode, stdout, stderr |
| |
| except Exception as e: |
| return -1, "", str(e) |
|
|