-
Notifications
You must be signed in to change notification settings - Fork 1
/
iPBSA.sh
262 lines (229 loc) · 5.59 KB
/
iPBSA.sh
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#!/bin/bash
#iPBSA minimizes docked receptor-ligand conformations in implicit solvent and calculates the binding free energy with MM/PB(GB)SA methods.
#The algorithm is based on AmberTools which can be installed via conda (https://ambermd.org/AmberTools.php)
#For more details please see https://link.springer.com/article/10.1007/s10822-021-00389-3
display_usage() {
echo -e "\niPBSA is a script for docking results rescoring"
echo -e "\nUsage: ./iPBSA.sh -r <.pdb> -l <lig dir> -n <int> -c <bcc/gas> -o <output dir> \n"
echo "-r receptor file in pdb format"
echo "-l path to the directory with small molecules (ligands should be in pdb format with added hydrogens)."
echo "-n number of parallel threads (The number of threads must not excead the number of ligands)."
echo "-o output directory"
echo -e "-c charge method BCC (defolt) or GAS \n"
}
if [ $# -le 1 ]
then
display_usage
exit 1
fi
charge=bcc
N=4
while getopts r:l:o:n:c: flag
do
case "${flag}" in
r) receptor=${OPTARG};;
l) mols=${OPTARG};;
o) output=${OPTARG};;
n) N=${OPTARG};;
c) charge=${OPTARG};;
esac
done
mkdir $output; cd $output
mkdir -p inp parm min gbsa pbsa
pdb4amber -i ../$receptor -o parm/rec.pdb --nohyd --dry
cp -r ../$mols mols
sed -i '/\(ATOM\|HETATM\)/!d' mols/*pdb
#prepare input files
cat > ./inp/xtleap.in <<EOF
source leaprc.protein.ff14SB
source leaprc.gaff
set default PBradii mbondi3
PROT=loadpdb parm/rec.pdb
LIG=loadmol2 parm/_mol_/_mol_.mol2
loadamberparams parm/_mol_/_mol_.frcmod
complex = combine {PROT LIG}
saveamberparm complex parm/complex__mol_.prmtop parm/complex__mol_.inpcrd
saveamberparm LIG parm/_mol_.prmtop parm/_mol_.inpcrd
quit
EOF
cat > ./inp/prot_tleap.in <<EOF
source leaprc.protein.ff14SB
source leaprc.gaff
set default PBradii mbondi3
PROT=loadpdb parm/rec.pdb
saveamberparm PROT parm/protein.prmtop parm/protein.inpcrd
quit
/
EOF
cat > ./inp/min.in <<EOF
Initial minimisation of rec-lig complex
&cntrl
imin=1,
maxcyc=2500, ncyc=100,
cut=16, ntb=0, igb=0,
ntpr=500,
ntwx=500,
ntwr=500
drms=0.01
ibelly=1,
bellymask=':UNL <@5'
&end
/
EOF
cat > ./inp/gbsa.in <<EOF
mmgbsa analysis
&general
startframe=1, interval=1, endframe=9999,
verbose=2, keep_files=0, netcdf=1,
strip_mask = ":WAT,Cl-,Na+,K+",
/
&gb
igb=2,
saltcon=0.150,
/
EOF
cat > ./inp/pbsa.in <<EOF
mmgbsa analysis
&general
startframe=1, interval=1, endframe=9999,
verbose=2, keep_files=0, netcdf=1,
strip_mask = ":WAT,Cl-,Na+,K+",
/
&pb
inp=1
istrng=0.150
/
EOF
#antechamber
echo "running antechamber..."
cd parm
for lig in ../mols/*.pdb; do
(
mol=`basename $lig .pdb`
mkdir -p $mol
cd $mol
pwd
antechamber -i ../../mols/${mol}.pdb -fi pdb -o $mol.mol2 -fo mol2 -at gaff -c $charge -rn UNL -nc 0
sleep $(( (RANDOM % 3) + 1))
) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; then
wait -n
fi
done > ../antechamber.log
wait
cd ..
#antechamber (frcmod)
cd parm
for lig in ../mols/*.pdb
do
(
mol=`basename $lig .pdb`
cd $mol
parmchk2 -i ${mol}.mol2 -f mol2 -o ${mol}.frcmod
cd ..
sleep $(( (RANDOM % 3) + 1))
) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; then
wait -n
fi
done> ../parmchk2.log
cd ..
#tleap prot
echo "preparing receptor..."
tleap -f inp/prot_tleap.in > prot_tleap.log
#tleap mols
echo "preparing small molecules..."
for lig in ./mols/*.pdb
do
mol=`basename $lig .pdb`
sed "s/_mol_/$mol/g" inp/xtleap.in >> inp/tleap_$mol.in
done
#tleap complex
echo "preparing complexes..."
for lig in ./mols/*.pdb; do
(
mol=`basename $lig .pdb`
tleap -f inp/tleap_$mol.in
sleep $(( (RANDOM % 3) + 1))
) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; then
wait -n
fi
done > tleap.log
#rm inp/tleap_*.in
#minim
echo "minimization..."
for lig in ./mols/*.pdb; do
(
mol=`basename $lig .pdb`
sander -O -i inp/min.in \
-p parm/complex_${mol}.prmtop \
-c parm/complex_${mol}.inpcrd \
-r min/min_${mol}.rst \
-ref parm/complex_${mol}.inpcrd \
-o min/minim_${mol}.out
sleep $(( (RANDOM % 3) + 1))
) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; then
wait -n
fi
done > minimization.log
wait
#GBSA
echo "running mmgbsa..."
cd gbsa
(
for lig in ../mols/*.pdb
do
mol=`basename $lig .pdb`
mkdir -p $mol
cd $mol
((i=i%N)); ((i++==0)) && wait
MMPBSA.py -O -i ../../inp/gbsa.in \
-o ../FINAL_RESULTS_GBSA_${mol}.dat \
-eo ../en_pre-frames_${mol}.dat \
-cp ../../parm/complex_${mol}.prmtop \
-rp ../../parm/protein.prmtop \
-lp ../../parm/${mol}.prmtop \
-y ../../min/min_${mol}.rst* &
cd ..
done
date
wait
date
) > ../gbsa.log
cd ..
#PBSA
echo "running mmpbsa..."
cd pbsa
(
for lig in ../mols/*.pdb
do
mol=`basename $lig .pdb`
mkdir -p $mol
cd $mol
((i=i%N)); ((i++==0)) && wait
MMPBSA.py -O -i ../../inp/pbsa.in \
-o ../FINAL_RESULTS_pbsa_${mol}.dat \
-eo ../en_pre-frames_${mol}.dat \
-cp ../../parm/complex_${mol}.prmtop \
-rp ../../parm/protein.prmtop \
-lp ../../parm/${mol}.prmtop \
-y ../../min/min_${mol}.rst* &
cd ..
done
date
wait
date
) > ../pbsa.log
cd ..
for lig in ./mols/*.pdb
do
mol=`basename $lig .pdb`
GB=`sed -e '1,/DELTA TOTAL/d' gbsa/en_pre-frames_${mol}.dat | awk -F ',' '{print $NF}' | head -n 1`
PB=`sed -e '1,/DELTA TOTAL/d' pbsa/en_pre-frames_${mol}.dat | awk -F ',' '{print $NF}' | head -n 1`
echo $mol $PB >> rawPBSA.dat
echo $mol $GB >> rawGBSA.dat
done
sort -V rawGBSA.dat | grep ' ' > FINAL_GBSA.dat
sort -V rawPBSA.dat | grep ' ' > FINAL_PBSA.dat