File size: 1,853 Bytes
9b9c66d
 
4a4b152
 
9b9c66d
 
4a4b152
9b9c66d
 
 
 
4a4b152
9b9c66d
 
 
4a4b152
9b9c66d
4a4b152
 
9b9c66d
4a4b152
 
 
9b9c66d
 
 
 
 
 
 
 
 
4a4b152
 
 
9b9c66d
 
 
4a4b152
 
 
 
9b9c66d
4a4b152
 
 
 
9b9c66d
 
4a4b152
9b9c66d
 
4a4b152
9b9c66d
 
4a4b152
 
9b9c66d
 
4a4b152
9b9c66d
4a4b152
9b9c66d
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import subprocess
from pathlib import Path
from typing import Optional

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",  # Default to protein alignment
        }

    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"]

        # Create the command
        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)

        # Convert command list to string
        cmd_str = "  ".join(cmd)

        try:
            # Execute the command
            process = subprocess.Popen(cmd_str, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True)

            # Get output
            stdout, stderr = process.communicate()

            return process.returncode, stdout, stderr

        except Exception as e:
            return -1, "", str(e)