-
Notifications
You must be signed in to change notification settings - Fork 1
/
voidDock.py
139 lines (111 loc) · 5.61 KB
/
voidDock.py
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
##########################################################################
# import basic libraries
import os
import os.path as p
import sys
import argpass
import multiprocessing as mp
import yaml
# inport util scripts
from util_voidDock import *
import config_checker
# clean code
from typing import Union
from os import PathLike
##########################################################################
def main() -> None:
# read config file
config: dict = config_checker.read_and_validate_config()
outDir: Union[PathLike, str] = config["pathInfo"]["outDir"]
ligandDir: Union[PathLike, str] = config["pathInfo"]["ligandDir"]
dockingOrders: dict = config["dockingOrders"]
# pre-prepare ligand pdbqt files
gen_ligand_pdbqts(dockingOrders, ligandDir)
# make outDir
os.makedirs(outDir, exist_ok=True)
cpusPerRun: int = config["cpuInfo"]["cpusPerRun"]
parallelCpus: int = config["cpuInfo"]["totalCpuUsage"] // cpusPerRun
if parallelCpus == 1:
run_serial(config, dockingOrders)
elif parallelCpus > 1:
run_parallel(config, dockingOrders)
collate_docked_pdbs(outDir, rmDirs = False)
##########################################################################
def run_parallel(config: dict, dockingOrders: dict) -> None:
cpusPerRun: int = config["cpuInfo"]["cpusPerRun"]
parallelCpus: int = config["cpuInfo"]["totalCpuUsage"] // cpusPerRun
with mp.Pool(processes=parallelCpus) as pool:
try:
pool.starmap(
docking_protocol, [
(config, dockingOrder) for dockingOrder in dockingOrders])
except Exception as e:
print(f"ERROR: {e}")
##########################################################################
def run_serial(config: dict, dockingOrders: dict) -> None:
for dockingOrder in dockingOrders:
docking_protocol(config, dockingOrder)
##########################################################################
def docking_protocol(config: dict, dockingOrder:dict) -> None:
# read config
pathInfo: Union[PathLike, str] = config["pathInfo"]
outDir: Union[PathLike, str] = pathInfo["outDir"]
cpusPerRun: Union[PathLike, str] = config["cpuInfo"]["cpusPerRun"]
# set up run directory and output key variables
protName, protPdb, ligPdbqts, runDir = set_up_directory(outDir=outDir,
pathInfo=pathInfo,
dockingOrder=dockingOrder)
# Use fpocket to identify correct pocket, calclate box center and return
# residues in pocket
targetPocketResidues: list = dockingOrder["pocketResidues"]
boxCenter, pocketResidues = directed_fpocket(protName=protName,
runDir=runDir,
pdbFile=protPdb,
targetPocketResidues=targetPocketResidues)
if dockingOrder["mutatePocketToAla"]:
# Replace pocket residues with alanine
protPdb: Union[PathLike, str] = pocket_residues_to_alainine(protName=protName,
pdbFile=protPdb,
residuesToAlanine=pocketResidues,
dockingOrder=dockingOrder,
outDir=runDir)
flexibleDocking: bool = False
if "flexibleResidues" in dockingOrder:
if len(dockingOrder["flexibleResidues"]) > 0:
flexibleDocking = True
rigidPdbqt, flexPdbqt = gen_flex_pdbqts(protPdb = protPdb,
flexibleResidues = dockingOrder["flexibleResidues"],
outDir = runDir)
# Write a config file for vina
vinaConfig, dockedPdbqt = write_vina_config(outDir=runDir,
receptorPdbqt=rigidPdbqt,
flexPdbqt = flexPdbqt,
boxCenter=boxCenter,
boxSize=30,
cpus=cpusPerRun,
flex=True)
if not flexibleDocking:
# Convert alanine PDB to PDBQT
rigidPdbqt: Union[PathLike, str] = pdb_to_pdbqt(inPdb=protPdb,
outDir=runDir,
jobType="rigid")
# Write a config file for vina
vinaConfig, dockedPdbqt = write_vina_config(outDir=runDir,
receptorPdbqt=rigidPdbqt,
boxCenter=boxCenter,
boxSize=30,
cpus=cpusPerRun,
flex=False)
# Run vina docking
run_vina(outDir=runDir,
configFile=vinaConfig,
ligPdbqts=ligPdbqts)
process_vina_results(outDir= runDir,
dockedPdbqt = dockedPdbqt,
receptorPdbqt = rigidPdbqt,
dockingOrder = dockingOrder,
ligandDir= config["pathInfo"]["ligandDir"]
)
##########################################################################
if __name__ == "__main__":
main()