File size: 2,527 Bytes
907b200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
66
67
68
69
70
71
72
73
74
75
76
77
import sys
import json
from vina import Vina

def main():
    if len(sys.argv) < 7:
        print("Usage: python3 vina_docking.py <protein_file> <ligand_file> <center_x> <center_y> <center_z> <box_size_x> <box_size_y> <box_size_z> [exhaustiveness] [n_poses]")
        sys.exit(1)

    protein_file = sys.argv[1]
    ligand_file = sys.argv[2]
    center_x = float(sys.argv[3])
    center_y = float(sys.argv[4])
    center_z = float(sys.argv[5])
    box_x = float(sys.argv[6])
    box_y = float(sys.argv[7])
    box_z = float(sys.argv[8])
    
    exhaustiveness = int(sys.argv[9]) if len(sys.argv) > 9 else 8
    n_poses = int(sys.argv[10]) if len(sys.argv) > 10 else 5

    try:
        v = Vina(sf_name='vina')
        v.set_receptor(protein_file)
        v.set_ligand_from_file(ligand_file)

        v.compute_vina_maps(center=[center_x, center_y, center_z], box_size=[box_x, box_y, box_z])
        
        # Run docking
        v.dock(exhaustiveness=exhaustiveness, n_poses=n_poses)

        # Output energies in JSON format so PHP can parse it easily
        energies = v.energies()

        poses_file = ligand_file.replace('.pdbqt', '') + '_out.pdbqt'
        v.write_poses(poses_file, n_poses=n_poses, overwrite=True)

        # Combined file: receptor + best docked pose in one flat view
        complex_file = ligand_file.replace('.pdbqt', '') + '_complex_out.pdbqt'

        with open(complex_file, 'w') as out:
            # Write receptor (skip MODEL/ENDMDL)
            with open(protein_file) as f:
                for line in f:
                    if not line.startswith(('MODEL', 'ENDMDL')):
                        out.write(line)

            # Write best ligand pose (first one, stripped of MODEL/ENDMDL)
            capture = False
            with open(poses_file) as f:
                for line in f:
                    if line.startswith('MODEL'):
                        capture = True
                        continue
                    elif capture and line.startswith('ENDMDL'):
                        break
                    elif capture:
                        out.write(line)

        result = {
            "status": "success",
            "energies": [list(e) for e in energies],
            "output_file": complex_file
        }
        print(json.dumps(result))

    except Exception as e:
        error_result = {
            "status": "error",
            "message": str(e)
        }
        print(json.dumps(error_result))
        sys.exit(1)

if __name__ == "__main__":
    main()