bfee2 2.5.0__py3-none-any.whl → 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bfee2 might be problematic. Click here for more details.
- BFEE2/commonTools/commonSlots.py +1 -1
- BFEE2/gui.py +326 -12
- BFEE2/inputGenerator.py +236 -201
- BFEE2/postTreatment.py +156 -0
- BFEE2/templates_namd/configTemplate.py +10 -6
- BFEE2/templates_namd/fep_lddm.tcl +312 -0
- BFEE2/templates_namd/scriptTemplate.py +155 -0
- BFEE2/third_party/py_bar.py +251 -1
- BFEE2/version.py +2 -2
- {bfee2-2.5.0.data → bfee2-3.0.0.data}/scripts/BFEE2Gui.py +19 -18
- {bfee2-2.5.0.dist-info → bfee2-3.0.0.dist-info}/METADATA +84 -76
- {bfee2-2.5.0.dist-info → bfee2-3.0.0.dist-info}/RECORD +15 -14
- {bfee2-2.5.0.dist-info → bfee2-3.0.0.dist-info}/WHEEL +1 -1
- {bfee2-2.5.0.dist-info → bfee2-3.0.0.dist-info/licenses}/LICENSE +0 -0
- {bfee2-2.5.0.dist-info → bfee2-3.0.0.dist-info}/top_level.txt +0 -0
BFEE2/third_party/py_bar.py
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import sys, math
|
|
1
2
|
from typing import List, Literal, Optional, Tuple
|
|
2
3
|
|
|
3
4
|
import numpy as np
|
|
4
5
|
from numpy.typing import NDArray
|
|
5
6
|
|
|
7
|
+
# VERSION
|
|
8
|
+
VERSION = 1.0
|
|
9
|
+
|
|
6
10
|
# boltzmann constant
|
|
7
11
|
BOLTZMANN = 0.0019872041
|
|
12
|
+
CSTAR = 1661
|
|
8
13
|
|
|
9
14
|
# type of FEP files
|
|
10
15
|
fep_type = Literal['forward', 'backward', 'double-wide']
|
|
@@ -191,6 +196,182 @@ class NAMDParser:
|
|
|
191
196
|
|
|
192
197
|
return self._windows, self._deltaU_data
|
|
193
198
|
|
|
199
|
+
class ColvarsParser:
|
|
200
|
+
""" parse Colvars cvtrj files and get the necessary data
|
|
201
|
+
"""
|
|
202
|
+
def __init__(self,
|
|
203
|
+
cvtrj_file: str,
|
|
204
|
+
step_per_window: int,
|
|
205
|
+
equilibration_per_window: int,
|
|
206
|
+
force_constants: List[int],
|
|
207
|
+
centers: List[int],
|
|
208
|
+
lambda_list: List[float]) -> None:
|
|
209
|
+
|
|
210
|
+
self._windows, self._deltaU_data = self._read_double_wide_cvtrj(
|
|
211
|
+
cvtrj_file,
|
|
212
|
+
step_per_window,
|
|
213
|
+
equilibration_per_window,
|
|
214
|
+
force_constants,
|
|
215
|
+
centers,
|
|
216
|
+
lambda_list
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
if len(self._windows) != len(self._deltaU_data):
|
|
220
|
+
print(len(self._windows))
|
|
221
|
+
print(len(self._deltaU_data))
|
|
222
|
+
raise RuntimeError('Internal numbers of windows and deltaU do not match! This is a bug!')
|
|
223
|
+
|
|
224
|
+
self._restaint_contribution = \
|
|
225
|
+
self._alchemicalRestraintContributionBulk(centers[0], centers[3], centers[5], *force_constants)
|
|
226
|
+
|
|
227
|
+
def _read_double_wide_cvtrj(
|
|
228
|
+
self,
|
|
229
|
+
cvtrj_file: str,
|
|
230
|
+
step_per_window: int,
|
|
231
|
+
equilibration_per_window: int,
|
|
232
|
+
force_constants: List[int],
|
|
233
|
+
centers: List[int],
|
|
234
|
+
lambda_list: List[float]
|
|
235
|
+
) -> Tuple[List[Tuple[float, float]], List[Tuple[NDArray, NDArray]]]:
|
|
236
|
+
""" Read an Colvars cvtrj file and regard it as double-wide free-energy calculation.
|
|
237
|
+
Return the window and bidirectional deltaU information.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
cvtrj_file (str): the path of the fepout file
|
|
241
|
+
step_per_window (int): total steps of a window
|
|
242
|
+
equilibration_per_window (int): steps of equilibration of a window
|
|
243
|
+
force_constants (List[int]) force constants of each CV.
|
|
244
|
+
centers (List[int]): the center (lambda=1) of each CV. The first N CVs are considered.
|
|
245
|
+
lambda_list (List[float]): Lambda schedule [0, ..., 1] or [1, ..., 0]
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Tuple[List[Tuple[float, float]], List[Tuple[NDArray, NDArray]]]: recording the boundary and
|
|
249
|
+
deltaU of each window of
|
|
250
|
+
bidirectional simulations
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
assert len(force_constants) == len(centers), "Error, The lengths of force_constants of centers are not equal!"
|
|
254
|
+
|
|
255
|
+
force_constants = np.array(force_constants)
|
|
256
|
+
centers = np.array(centers)
|
|
257
|
+
lambda_list = np.array(lambda_list)
|
|
258
|
+
|
|
259
|
+
windows = []
|
|
260
|
+
for i in range(len(lambda_list) - 1):
|
|
261
|
+
windows.append((lambda_list[i], lambda_list[i + 1]))
|
|
262
|
+
|
|
263
|
+
deltaU_forward = []
|
|
264
|
+
deltaU_backward = []
|
|
265
|
+
|
|
266
|
+
num_CVs = len(force_constants)
|
|
267
|
+
num_windows = len(lambda_list)
|
|
268
|
+
|
|
269
|
+
with open(cvtrj_file, 'r') as input_fepout:
|
|
270
|
+
# The first window samples forward only, the last window backward only
|
|
271
|
+
window_index = 0
|
|
272
|
+
|
|
273
|
+
while True:
|
|
274
|
+
line = input_fepout.readline()
|
|
275
|
+
if not line:
|
|
276
|
+
break
|
|
277
|
+
if line.startswith("#"):
|
|
278
|
+
continue
|
|
279
|
+
splitedLine = line.strip().split()
|
|
280
|
+
step = int(splitedLine[0])
|
|
281
|
+
|
|
282
|
+
if step % step_per_window == 0:
|
|
283
|
+
# collecting deltaU
|
|
284
|
+
deltaU_forward_per_window = []
|
|
285
|
+
deltaU_backward_per_window = []
|
|
286
|
+
|
|
287
|
+
while True:
|
|
288
|
+
line = input_fepout.readline()
|
|
289
|
+
if not line:
|
|
290
|
+
break
|
|
291
|
+
if line.startswith("#"):
|
|
292
|
+
continue
|
|
293
|
+
splitedLine = line.strip().split()
|
|
294
|
+
step = int(splitedLine[0])
|
|
295
|
+
|
|
296
|
+
if step % step_per_window == 0:
|
|
297
|
+
if window_index == 0:
|
|
298
|
+
deltaU_forward.append(deltaU_forward_per_window)
|
|
299
|
+
elif window_index == num_windows - 1:
|
|
300
|
+
deltaU_backward.append(deltaU_backward_per_window)
|
|
301
|
+
else:
|
|
302
|
+
deltaU_forward.append(deltaU_forward_per_window)
|
|
303
|
+
deltaU_backward.append(deltaU_backward_per_window)
|
|
304
|
+
window_index += 1
|
|
305
|
+
break
|
|
306
|
+
|
|
307
|
+
# equilibration
|
|
308
|
+
if step < window_index * step_per_window + equilibration_per_window:
|
|
309
|
+
continue
|
|
310
|
+
else:
|
|
311
|
+
dis = abs(np.array(splitedLine[1:1+num_CVs]).astype(float) - centers)
|
|
312
|
+
dis[dis>180] -= 360
|
|
313
|
+
if window_index == 0:
|
|
314
|
+
deltaU_forward_per_window.append(0.5 * np.sum((lambda_list[window_index + 1] - lambda_list[window_index]) * force_constants * (dis**2)))
|
|
315
|
+
elif window_index == num_windows - 1:
|
|
316
|
+
deltaU_backward_per_window.append(0.5 * np.sum((lambda_list[window_index - 1] - lambda_list[window_index]) * force_constants * (dis**2)))
|
|
317
|
+
else:
|
|
318
|
+
deltaU_forward_per_window.append(0.5 * np.sum((lambda_list[window_index + 1] - lambda_list[window_index]) * force_constants * (dis**2)))
|
|
319
|
+
deltaU_backward_per_window.append(0.5 * np.sum((lambda_list[window_index - 1] - lambda_list[window_index]) * force_constants * (dis**2)))
|
|
320
|
+
|
|
321
|
+
if len(deltaU_forward) != len(deltaU_backward):
|
|
322
|
+
raise RuntimeError('Forward and backward data do not match!')
|
|
323
|
+
|
|
324
|
+
deltaU = []
|
|
325
|
+
for i in range(len(deltaU_forward)):
|
|
326
|
+
deltaU.append((np.array(deltaU_forward[i]), np.array(deltaU_backward[i])))
|
|
327
|
+
|
|
328
|
+
return windows, deltaU
|
|
329
|
+
|
|
330
|
+
def get_data(self) -> Tuple[List[Tuple[float, float]], List[Tuple[NDArray, NDArray]]]:
|
|
331
|
+
return self._windows, self._deltaU_data
|
|
332
|
+
|
|
333
|
+
def get_restraint_contribution(self) -> float:
|
|
334
|
+
return self._restaint_contribution
|
|
335
|
+
|
|
336
|
+
def _alchemicalRestraintContributionBulk(
|
|
337
|
+
self, eulerTheta, polarTheta, R,
|
|
338
|
+
forceConstantTheta=0.1, forceConstantPhi=0.1, forceConstantPsi=0.1,
|
|
339
|
+
forceConstanttheta=0.1, forceConstantphi=0.1, forceConstantR=10
|
|
340
|
+
):
|
|
341
|
+
"""contribution of (standard concentration corrected) rotational
|
|
342
|
+
and orienetational restraints in the unbounded state
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
eulerTheta (float): restraining center of the Euler angle theta
|
|
346
|
+
polarTheta (float): restraining center of the polar angle theta
|
|
347
|
+
R (float): restraining center of anger R
|
|
348
|
+
forceConstantTheta (float): restraining force constant for euler Theta. Defaults to 0.1.
|
|
349
|
+
forceConstantPhi (float, optional): restraining force constant for euler Phi. Defaults to 0.1.
|
|
350
|
+
forceConstantPsi (float, optional): restraining force constant for euler Psi. Defaults to 0.1.
|
|
351
|
+
forceConstanttheta (float, optional): restraining force constant for polar theta. Defaults to 0.1.
|
|
352
|
+
forceConstantphi (float, optional): restraining force constant for polar phi. Defaults to 0.1.
|
|
353
|
+
forceConstantR (int, optional): restraining force constant for distance R. Defaults to 10.
|
|
354
|
+
|
|
355
|
+
Returns:
|
|
356
|
+
float: contribution of the geometric restraint in the unbound state
|
|
357
|
+
"""
|
|
358
|
+
|
|
359
|
+
# degrees to rad
|
|
360
|
+
eulerTheta = math.radians(eulerTheta + 90)
|
|
361
|
+
polarTheta = math.radians(polarTheta)
|
|
362
|
+
forceConstantTheta *= (180 / math.pi)**2
|
|
363
|
+
forceConstantPhi *= (180 / math.pi)**2
|
|
364
|
+
forceConstantPsi *= (180 / math.pi)**2
|
|
365
|
+
forceConstanttheta *= (180 / math.pi)**2
|
|
366
|
+
forceConstantphi *= (180 / math.pi)**2
|
|
367
|
+
|
|
368
|
+
contribution = BOLTZMANN * 300 * math.log(
|
|
369
|
+
8 * (math.pi**2) * CSTAR / ((R**2) * math.sin(eulerTheta) * math.sin(polarTheta)) * \
|
|
370
|
+
math.sqrt(forceConstantTheta * forceConstantPhi * forceConstantPsi * forceConstanttheta * \
|
|
371
|
+
forceConstantphi * forceConstantR ) / ((2 * math.pi * BOLTZMANN * 300)**3)
|
|
372
|
+
)
|
|
373
|
+
return contribution
|
|
374
|
+
|
|
194
375
|
class FEPAnalyzer:
|
|
195
376
|
""" Analyze FEP simulations
|
|
196
377
|
"""
|
|
@@ -214,6 +395,67 @@ class FEPAnalyzer:
|
|
|
214
395
|
self._temperature = temperature
|
|
215
396
|
if len(self._windows) != len(self._deltaU_data):
|
|
216
397
|
raise RuntimeError('Internal numbers of windows and deltaU do not match! This is a bug!')
|
|
398
|
+
|
|
399
|
+
def MergeData(
|
|
400
|
+
self,
|
|
401
|
+
window_boundaries: List[Tuple[float, float]],
|
|
402
|
+
deltaU_data: List[Tuple[NDArray, NDArray]]
|
|
403
|
+
) -> bool:
|
|
404
|
+
""" Merge the exist dU with another one. Used in FEP + Colvars_FEP tasks.
|
|
405
|
+
window boundaries and the number of deltaU in a window must be the same
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
window_boundaries (List[Tuple[float, float]]): boundaries of each window
|
|
409
|
+
deltaU_data (List[Tuple[NDArray, NDArray]]): deltaU for forward and backward simulations
|
|
410
|
+
of each window. The two deltaU should be opposite
|
|
411
|
+
numbers.
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
bool: Whether merge is successful
|
|
415
|
+
"""
|
|
416
|
+
if len(window_boundaries) != len(self._windows):
|
|
417
|
+
print(1)
|
|
418
|
+
return False
|
|
419
|
+
|
|
420
|
+
#for i in range(len(window_boundaries)):
|
|
421
|
+
# print(f'FEP: {self._windows[i]} Colvars: {window_boundaries[i]}')
|
|
422
|
+
# print(f'FEP: {len(deltaU_data[i][0])} Colvars: {len(self._deltaU_data[i][0])}')
|
|
423
|
+
|
|
424
|
+
for i in range(len(window_boundaries)):
|
|
425
|
+
if (len(deltaU_data[i][0]) - 1) != len(self._deltaU_data[i][0]) \
|
|
426
|
+
and (len(deltaU_data[i][0]) - 1) != len(self._deltaU_data[i][0]) / 2 \
|
|
427
|
+
and len(deltaU_data[i][0]) != len(self._deltaU_data[i][0]) \
|
|
428
|
+
and len(deltaU_data[i][0]) != len(self._deltaU_data[i][0]) / 2:
|
|
429
|
+
return False
|
|
430
|
+
if (len(deltaU_data[i][1]) - 1) != len(self._deltaU_data[i][1]) \
|
|
431
|
+
and (len(deltaU_data[i][1]) - 1) != len(self._deltaU_data[i][1]) / 2 \
|
|
432
|
+
and len(deltaU_data[i][1]) != len(self._deltaU_data[i][1]) \
|
|
433
|
+
and len(deltaU_data[i][1]) != len(self._deltaU_data[i][1]) / 2:
|
|
434
|
+
return False
|
|
435
|
+
if (len(deltaU_data[i][0]) - 1) == len(self._deltaU_data[i][0]):
|
|
436
|
+
temp_forward = self._deltaU_data[i][0] + deltaU_data[i][0][:-1]
|
|
437
|
+
elif (len(deltaU_data[i][0]) - 1) == len(self._deltaU_data[i][0]) / 2:
|
|
438
|
+
temp_forward = self._deltaU_data[i][0][1::2]
|
|
439
|
+
temp_forward += deltaU_data[i][0][:-1]
|
|
440
|
+
elif len(deltaU_data[i][0]) == len(self._deltaU_data[i][0]):
|
|
441
|
+
temp_forward = self._deltaU_data[i][0] + deltaU_data[i][0]
|
|
442
|
+
elif len(deltaU_data[i][0]) == len(self._deltaU_data[i][0]) / 2:
|
|
443
|
+
temp_forward = self._deltaU_data[i][0][1::2]
|
|
444
|
+
temp_forward += deltaU_data[i][0]
|
|
445
|
+
|
|
446
|
+
if (len(deltaU_data[i][1]) - 1) == len(self._deltaU_data[i][1]):
|
|
447
|
+
temp_backward = self._deltaU_data[i][1] + deltaU_data[i][1][:-1]
|
|
448
|
+
elif (len(deltaU_data[i][1]) - 1) == len(self._deltaU_data[i][1]) / 2:
|
|
449
|
+
temp_backward = self._deltaU_data[i][1][::2]
|
|
450
|
+
temp_backward += deltaU_data[i][1][:-1]
|
|
451
|
+
elif len(deltaU_data[i][1]) == len(self._deltaU_data[i][1]):
|
|
452
|
+
temp_backward = self._deltaU_data[i][1] + deltaU_data[i][1]
|
|
453
|
+
elif len(deltaU_data[i][1]) == len(self._deltaU_data[i][1]) / 2:
|
|
454
|
+
temp_backward = self._deltaU_data[i][1][::2]
|
|
455
|
+
temp_backward += deltaU_data[i][1]
|
|
456
|
+
self._deltaU_data[i] = (temp_forward, temp_backward)
|
|
457
|
+
|
|
458
|
+
return True
|
|
217
459
|
|
|
218
460
|
def FEP_free_energy(self) -> Tuple[List[Tuple[float, float]], List[NDArray], List[NDArray]]:
|
|
219
461
|
""" Calculate and return the free-energy change using the FEP equation
|
|
@@ -230,7 +472,7 @@ class FEPAnalyzer:
|
|
|
230
472
|
backward_free_energy = -BOLTZMANN * self._temperature * \
|
|
231
473
|
np.log(np.mean(np.exp(-self._deltaU_data[i][1] / (BOLTZMANN * self._temperature))))
|
|
232
474
|
free_energies.append((forward_free_energy - backward_free_energy) / 2)
|
|
233
|
-
errors.append((forward_free_energy + backward_free_energy) / np.sqrt(2))
|
|
475
|
+
errors.append(np.abs(forward_free_energy + backward_free_energy) / np.sqrt(2))
|
|
234
476
|
return self._windows, free_energies, errors
|
|
235
477
|
|
|
236
478
|
def BAR_free_energy(
|
|
@@ -260,6 +502,14 @@ class FEPAnalyzer:
|
|
|
260
502
|
errors.append(err)
|
|
261
503
|
return self._windows, free_energies, errors
|
|
262
504
|
|
|
505
|
+
def Window_boundaries(self) -> List[Tuple[float, float]]:
|
|
506
|
+
""" Get the boundaries of windows
|
|
507
|
+
|
|
508
|
+
Returns:
|
|
509
|
+
List[Tuple[float, float]]: windows boundaries
|
|
510
|
+
"""
|
|
511
|
+
return self._windows
|
|
512
|
+
|
|
263
513
|
def _BAR_estimator(self, deltaU: Tuple[NDArray, NDArray], tolerance: float = 1e-6) -> float:
|
|
264
514
|
""" Estimate the free energy of a window using the BAR estimator
|
|
265
515
|
|
BFEE2/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__VERSION__ = '
|
|
2
|
-
__NAMD_VERSION__ = '3.
|
|
1
|
+
__VERSION__ = '3.0.0'
|
|
2
|
+
__NAMD_VERSION__ = '3.0'
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
#!python
|
|
2
|
-
###################################################
|
|
3
|
-
## binding free energy estimator (BFEE) v2.x
|
|
4
|
-
## by Haohao Fu (fhh2626_at_gmail.com)
|
|
5
|
-
##
|
|
6
|
-
## this is a completely rewritten version of BFEE
|
|
7
|
-
##
|
|
8
|
-
###################################################
|
|
9
|
-
|
|
10
|
-
import sys
|
|
11
|
-
from
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
#!python
|
|
2
|
+
###################################################
|
|
3
|
+
## binding free energy estimator (BFEE) v2.x
|
|
4
|
+
## by Haohao Fu (fhh2626_at_gmail.com)
|
|
5
|
+
##
|
|
6
|
+
## this is a completely rewritten version of BFEE
|
|
7
|
+
##
|
|
8
|
+
###################################################
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from PySide6.QtWidgets import QApplication
|
|
12
|
+
from PySide6.QtGui import QAction
|
|
13
|
+
import BFEE2.gui as gui
|
|
14
|
+
|
|
15
|
+
if __name__ == '__main__':
|
|
16
|
+
|
|
17
|
+
app = QApplication(sys.argv)
|
|
18
|
+
ex = gui.mainUI()
|
|
19
|
+
sys.exit(app.exec())
|
|
@@ -1,76 +1,84 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
2
|
-
Name: bfee2
|
|
3
|
-
Version:
|
|
4
|
-
Summary: Binding Free Energy Estimator 2
|
|
5
|
-
Home-page: https://github.com/fhh2626/BFEE2
|
|
6
|
-
Author: Haohao Fu, Haochuan Chen, Wensheng Cai
|
|
7
|
-
Author-email:
|
|
8
|
-
Maintainer: Haohao Fu
|
|
9
|
-
Maintainer-email: fhh2626@
|
|
10
|
-
License: GPLv3
|
|
11
|
-
Requires-Python: >=3.6
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
Requires-Dist: setuptools
|
|
15
|
-
Requires-Dist:
|
|
16
|
-
Requires-Dist: appdirs
|
|
17
|
-
Requires-Dist: MDAnalysis
|
|
18
|
-
Requires-Dist: matplotlib
|
|
19
|
-
Requires-Dist: numpy
|
|
20
|
-
Requires-Dist: scipy
|
|
21
|
-
Requires-Dist: parmed
|
|
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
|
-
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bfee2
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Summary: Binding Free Energy Estimator 2
|
|
5
|
+
Home-page: https://github.com/fhh2626/BFEE2
|
|
6
|
+
Author: Haohao Fu, Haochuan Chen, Hengwei Bian, Wensheng Cai, Chris Chipot
|
|
7
|
+
Author-email: fhh2626@nankai.edu.cn
|
|
8
|
+
Maintainer: Haohao Fu
|
|
9
|
+
Maintainer-email: fhh2626@nankai.edu.cn
|
|
10
|
+
License: GPLv3
|
|
11
|
+
Requires-Python: >=3.6
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: setuptools
|
|
15
|
+
Requires-Dist: pyside6
|
|
16
|
+
Requires-Dist: appdirs
|
|
17
|
+
Requires-Dist: MDAnalysis
|
|
18
|
+
Requires-Dist: matplotlib
|
|
19
|
+
Requires-Dist: numpy
|
|
20
|
+
Requires-Dist: scipy
|
|
21
|
+
Requires-Dist: parmed
|
|
22
|
+
Dynamic: license-file
|
|
23
|
+
|
|
24
|
+
# Binding Free Energy Estimator 3
|
|
25
|
+
[](https://zenodo.org/badge/latestdoi/322234705)
|
|
26
|
+
[](https://pepy.tech/project/bfee2)
|
|
27
|
+
|
|
28
|
+
**Binding free energy estimator 3 (BFEE3) has come! There are three major upgrades in BFEE3: (1) LDDM, a high-throughput alchemical route for absolute binding free-energy calculations; (2) streamlined geometrical route for protein-protien binding free-energy calculations and (3) quick settings for common calculations.**
|
|
29
|
+
|
|
30
|
+
BFEE is a python-based software that automates absolute binding free energy calculations through either the alchemical or geometric route by molecular dynamics simulations.<br>
|
|
31
|
+
|
|
32
|
+
## Theoretical backgrounds
|
|
33
|
+
The degrees of freedom of the protein-ligand (or host-guest) system are described by a series of geometric variables (or collective variables), as firstly described by the [Karplus group](https://pubs.acs.org/doi/abs/10.1021/jp0217839). In BFEE, a generalized, best-fit-rotation-based geometric variables are used, making it in principle available to any protein-ligand complex. See [this paper](https://pubs.acs.org/doi/abs/10.1021/acs.jctc.7b00791) for introduction of these variables.<br>
|
|
34
|
+
|
|
35
|
+
In the [geometric route](https://pubs.acs.org/doi/10.1021/ct3008099), the degrees of freedom is investigated one by one, through one-dimensional free-energy calculations. In BFEE, [WTM-eABF](https://pubs.acs.org/doi/abs/10.1021/acs.accounts.9b00473) is used, while other importance-sampling algorithms such as [plain eABF](https://pubs.acs.org/doi/abs/10.1021/acs.jctc.6b00447) are also acceptable.
|
|
36
|
+
The [alchemical route](https://pubs.acs.org/doi/10.1021/ct3008099) is a variants of the [double decoupling method (DDM)](https://www.sciencedirect.com/science/article/pii/S0006349597787563). A thermodynamic cycle, in which the ligand and the geometric restraints are decoupled independently to guarantee the convergence of the simulations.<br>
|
|
37
|
+
[这里](http://sioc-journal.cn/Jwk_hxxb/CN/10.6023/A20100489)是标准结合自由能计算方法的中文介绍.<br>
|
|
38
|
+
|
|
39
|
+
## Features
|
|
40
|
+
Generates all the input files for absolute binding free energy calculations;<br>
|
|
41
|
+
Support Protein-protein and protein-ligand complexes;<br>
|
|
42
|
+
Perform post-treatment automatedly;<br>
|
|
43
|
+
Support NAMD (alchemical and geometric route) and Gromacs (geometric route) as molecular dynamics engines;<br>
|
|
44
|
+
Support many file formats for the input complex structure (PSF/PDB/PRM, PRM7/RST7, TOP/PDB);<br>
|
|
45
|
+
Support both rigid (exclude RMSD CV) and flexible (include RMSD CV) ligands and protein-protein complexes (streamlined geometrical route);<br>
|
|
46
|
+
...<br>
|
|
47
|
+
|
|
48
|
+
## Requirements
|
|
49
|
+
Python 3.6+, PySide 2, numpy, scipy, matplotlib, parmed and MDAnalysis.<br>
|
|
50
|
+
[NAMD 3.0 or later](https://www.ks.uiuc.edu/Development/Download/download.cgi?PackageName=NAMD) / [GROMACS 2024 or later](https://manual.gromacs.org/).<br>
|
|
51
|
+
**Note: Since both NAMD and Gromacs have incorporated Colvars in their latest binaries. Each release of BFEE3 corresponds to a version of NAMD/Gromacs. Please always use
|
|
52
|
+
the corresponding or later versions of the MD engines for free-energy calculations!**
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
We suggest to install BFEE through conda. It will be safe if conda is install in a new environment<br>
|
|
56
|
+
```
|
|
57
|
+
conda create --name bfee (optional)
|
|
58
|
+
conda activate bfee (optional)
|
|
59
|
+
conda install -c conda-forge BFEE2
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Usage
|
|
63
|
+
Simply run BFEE2Gui.py in terminal or PowerShell. One may need to use the absolute path on MS Windows.<br>
|
|
64
|
+
A step-by-step tutorial is provided [here](https://www.nature.com/articles/s41596-021-00676-1).<br>
|
|
65
|
+
A tutorial about new streamlined geometrical route is provided in the SI of [this paper](https://pubs.acs.org/doi/full/10.1021/acs.jcim.3c00487).<br>
|
|
66
|
+
|
|
67
|
+
## Test files
|
|
68
|
+
One can download the Supplement Data [here](https://www.nature.com/articles/s41596-021-00676-1#Sec47) for testing BFEE3.
|
|
69
|
+
|
|
70
|
+
## Citations
|
|
71
|
+
When possible, please consider mentioning [Fu et al. Nat. Protoc. 2022, doi:10.1038/s41596-021-00676-1](https://www.nature.com/articles/s41596-021-00676-1#citeas) when BFEE is used in your project.
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
Additional references:<br>
|
|
75
|
+
BFEE2: [Fu et al. J. Chem. Inf. Model. 2021, 61, 2116–2123](https://pubs.acs.org/doi/abs/10.1021/acs.jcim.1c00269)<br>
|
|
76
|
+
BFEE2 for protein-protein binding free energy calculations [Fu et al. J. Chem. Inf. Model. 2023, 63, 2512–2519](https://pubs.acs.org/doi/full/10.1021/acs.jcim.3c00487)<br>
|
|
77
|
+
Alchemical and geometric routes [Gumbart et al. J. Chem. Theory Comput. 2013, 9, 794–802](https://pubs.acs.org/doi/abs/10.1021/ct3008099)<br>
|
|
78
|
+
WTM-eABF: [Fu et al. Acc. Chem. Res. 2019, 52, 3254–3264](https://pubs.acs.org/doi/abs/10.1021/acs.accounts.9b00473) and [Fu et al. J. Phys. Chem. Lett. 2018, 9, 4738–4745](https://pubs.acs.org/doi/abs/10.1021/acs.jpclett.8b01994)<br>
|
|
79
|
+
Collective variables: [Fu et al. J. Chem. Theory Comput. 2017, 13, 5173–5178](https://pubs.acs.org/doi/abs/10.1021/acs.jctc.7b00791)<br>
|
|
80
|
+
Colvars module: [Fiorin et al. Mol. Phys. 2013 111, 3345-3362](https://www.tandfonline.com/doi/full/10.1080/00268976.2013.813594)<br>
|
|
81
|
+
"Mother" of all restraint-based binding free-energy calculations: [Hermans et al. Isr. J. Chem. 1986, 27, 225–227](https://onlinelibrary.wiley.com/doi/abs/10.1002/ijch.198600032)<br>
|
|
82
|
+
|
|
83
|
+
## Contact us
|
|
84
|
+
This software is under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html) license. For more information about BFEE, contact Haohao Fu (fhh2626@nankai.edu.cn) and Haochuan Chen (yjcoshc@mail.nankai.edu.cn).
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
BFEE2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
BFEE2/gui.py,sha256=
|
|
3
|
-
BFEE2/inputGenerator.py,sha256=
|
|
4
|
-
BFEE2/postTreatment.py,sha256=
|
|
5
|
-
BFEE2/version.py,sha256=
|
|
2
|
+
BFEE2/gui.py,sha256=_4sovHYznBzJKN5QMAjAC03lnm9m9UlQPq4mJxpXrdo,117558
|
|
3
|
+
BFEE2/inputGenerator.py,sha256=htPz5agO8Bga-Csh7gTZH4cL945UUy4b-ddRysOy6Xg,141967
|
|
4
|
+
BFEE2/postTreatment.py,sha256=iPnNxkcjdYq6MOdemivUuqn7P5Mk9B3rliXj1KY9Byo,27322
|
|
5
|
+
BFEE2/version.py,sha256=kHkWNpvUvNztsx3fwXyEpOqmNt8Vhb59Vq0xlbR5jAI,47
|
|
6
6
|
BFEE2/commonTools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
BFEE2/commonTools/commonSlots.py,sha256=
|
|
7
|
+
BFEE2/commonTools/commonSlots.py,sha256=8u9WJg12Y98WMArLaekWy3oZqBLzyc1tsRcsim8DrU4,1450
|
|
8
8
|
BFEE2/commonTools/fileParser.py,sha256=0JwDcOx6bNnkl98yB279E0iJv3yHP0Yx9INSc7ZRBWQ,11005
|
|
9
9
|
BFEE2/commonTools/ploter.py,sha256=9m0_sW_sQpuabWML1uHMlsGgRcRtu-dwlJ9vXUPK4SM,5677
|
|
10
10
|
BFEE2/doc/Doc.pdf,sha256=zR_QAUa15IIjbpyyflx4N89NjUN5j2pHXozMaAW7QJE,143522
|
|
@@ -45,9 +45,10 @@ BFEE2/templates_gromacs/BFEEGromacs.py,sha256=74eTWo78JL-63uwDz9iV2JISD5YKM3_CUz
|
|
|
45
45
|
BFEE2/templates_gromacs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
BFEE2/templates_gromacs/find_min_max.awk,sha256=nCbymmZzIhMeEFJFmRD-FoQOASxPyMJDNuubAHBsoks,394
|
|
47
47
|
BFEE2/templates_namd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
-
BFEE2/templates_namd/configTemplate.py,sha256=
|
|
48
|
+
BFEE2/templates_namd/configTemplate.py,sha256=1yU6oENU2BlkhkNDP0IzpKuktlFijJp1WjIe9e3PNKE,45457
|
|
49
49
|
BFEE2/templates_namd/fep.tcl,sha256=cXmnn5VQB-erUXvJktfuDZG-EkMjWjDXVpALYVW7HdA,8601
|
|
50
|
-
BFEE2/templates_namd/
|
|
50
|
+
BFEE2/templates_namd/fep_lddm.tcl,sha256=Ct_Jg0bKv6BtUVSoJZyL_tKViUzjduq57hp9GqecAbo,8695
|
|
51
|
+
BFEE2/templates_namd/scriptTemplate.py,sha256=d0S4cbFNle-CbN0MpyVYLOWpzxhHBDsPtlujUaQS8GY,11072
|
|
51
52
|
BFEE2/templates_namd/solvate.tcl,sha256=zJj9x0mPGAa9itPWyZLPWtcoN8oVBoRz5lBH3qJEXX8,302
|
|
52
53
|
BFEE2/templates_namd/solvate_mem.tcl,sha256=NcsE04VQV1avszP5KEJyzslkn4k3EqtgFbhXa_vSUK4,298
|
|
53
54
|
BFEE2/templates_namd/updateCenters.py,sha256=oIVba4hkSE4ip1EcNBFDTP3bBSkMO0yq9klbA6q2Fxk,11661
|
|
@@ -56,10 +57,10 @@ BFEE2/templates_readme/Readme_NAMD_Alchemical.txt,sha256=ELWMpk7xNq_lVHfm9A5hKWE
|
|
|
56
57
|
BFEE2/templates_readme/Readme_NAMD_Geometrical.txt,sha256=nE2osdeS94PVHv_cb9Lx3AEItc0ftRXqmUcdqd6T00c,1492
|
|
57
58
|
BFEE2/templates_readme/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
58
59
|
BFEE2/third_party/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
|
-
BFEE2/third_party/py_bar.py,sha256=
|
|
60
|
-
bfee2-
|
|
61
|
-
bfee2-
|
|
62
|
-
bfee2-
|
|
63
|
-
bfee2-
|
|
64
|
-
bfee2-
|
|
65
|
-
bfee2-
|
|
60
|
+
BFEE2/third_party/py_bar.py,sha256=xiD1O5OJqTutEKLxHVuJOfFvNcNgK-1GbvAq9VfbHSk,27353
|
|
61
|
+
bfee2-3.0.0.data/scripts/BFEE2Gui.py,sha256=-8au9eZwRLzmID5MFNm8sf6B-0OhgLuDlSTbgKEAmnU,506
|
|
62
|
+
bfee2-3.0.0.dist-info/licenses/LICENSE,sha256=D49NePXWPL2DWuRjzaaLEJCI-g7Td73f4Fn21ixqGQo,35349
|
|
63
|
+
bfee2-3.0.0.dist-info/METADATA,sha256=ZrEpkAVAH9J4RE8-Zi_KzxhIPUczBBTJMZp7p0jPTAk,6204
|
|
64
|
+
bfee2-3.0.0.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
|
|
65
|
+
bfee2-3.0.0.dist-info/top_level.txt,sha256=O5qOOi90gwZ9axrUPYy9I-ZiwgfPd-sc6NTQnKWh1LA,6
|
|
66
|
+
bfee2-3.0.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|