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.

@@ -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.5.0'
2
- __NAMD_VERSION__ = '3.0b5'
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 PySide2.QtWidgets import QApplication
12
- import BFEE2.gui as gui
13
-
14
- if __name__ == '__main__':
15
-
16
- app = QApplication(sys.argv)
17
- ex = gui.mainUI()
18
- sys.exit(app.exec_())
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.1
2
- Name: bfee2
3
- Version: 2.5.0
4
- Summary: Binding Free Energy Estimator 2
5
- Home-page: https://github.com/fhh2626/BFEE2
6
- Author: Haohao Fu, Haochuan Chen, Wensheng Cai and Chris Chipot
7
- Author-email: wscai@nankai.edu.cn
8
- Maintainer: Haohao Fu
9
- Maintainer-email: fhh2626@mail.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: pyside2
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
- # Binding Free Energy Estimator 2
24
- [![DOI](https://zenodo.org/badge/322234705.svg)](https://zenodo.org/badge/latestdoi/322234705)
25
-
26
- Binding free energy estimator (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>
27
-
28
- ## Theoretical backgrounds
29
- 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>
30
-
31
- 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.
32
- 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>
33
- [这里](http://sioc-journal.cn/Jwk_hxxb/CN/10.6023/A20100489)是标准结合自由能计算方法的中文介绍.<br>
34
-
35
- ## Features
36
- Generates all the input files for absolute binding free energy calculations;<br>
37
- Perform post-treatment automatedly;<br>
38
- Support NAMD (alchemical and geometric route) and Gromacs (geometric route) as molecular dynamics engines;<br>
39
- Support many file formats for the input complex structure (PSF/PDB/PRM, PRM7/RST7, TOP/PDB);<br>
40
- Support both rigid (exclude RMSD CV) and flexible (include RMSD CV) ligands and protein-protein complexes (streamlined geometrical route);<br>
41
- ...<br>
42
-
43
- ## Requirements
44
- Python 3.6+, PySide 2, numpy, scipy, matplotlib, parmed and MDAnalysis.<br>
45
- [NAMD 3.0 or later](https://www.ks.uiuc.edu/Development/Download/download.cgi?PackageName=NAMD) / [Colvars patched Gromacs](https://github.com/Colvars/colvars).<br>
46
- **Note: BFEE2 uses cutting-edge features of NAMD and Colvars. We highly suggest the end-user download the devel branch of NAMD from [here](https://gitlab.com/tcbgUIUC/namd/-/tree/devel) and patch it with [Colvars](https://github.com/Colvars/colvars) to prevent possible problems.**
47
-
48
- ## Installation
49
- We suggest to install BFEE2 through conda. It will be safe if conda is install in a new environment<br>
50
- ```
51
- conda create --name bfee (optional)
52
- conda activate bfee (optional)
53
- conda install -c conda-forge BFEE2
54
- ```
55
-
56
- ## Usage
57
- Simply run BFEE2Gui.py in terminal or PowerShell. One may need to use the absolute path on MS Windows.<br>
58
- A step-by-step tutorial is provided [here](https://www.nature.com/articles/s41596-021-00676-1).<br>
59
- 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>
60
-
61
- ## Citations
62
- 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 BFEE2 is used in your project.
63
-
64
-
65
- Additional references:<br>
66
- BFEE2: [Fu et al. J. Chem. Inf. Model. 2021, 61, 2116–2123](https://pubs.acs.org/doi/abs/10.1021/acs.jcim.1c00269)<br>
67
- 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>
68
- 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>
69
- 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>
70
- Colvars module: [Fiorin et al. Mol. Phys. 2013 111, 3345-3362](https://www.tandfonline.com/doi/full/10.1080/00268976.2013.813594)<br>
71
- "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>
72
-
73
- ## Contact us
74
- Technique issues: Haohao Fu (fhh2626@mail.nankai.edu.cn) and Haochuan Chen (yjcoshc@mail.nankai.edu.cn)<br>
75
-
76
- This software is under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html) license. For more information about the copyright of BFEE, contact the corresponding authors of the aforementioned papers (wscai@nankai.edu.cn, Christophe.Chipot@univ-lorraine.fr).
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
+ [![DOI](https://zenodo.org/badge/322234705.svg)](https://zenodo.org/badge/latestdoi/322234705)
26
+ [![Downloads](https://static.pepy.tech/badge/bfee2)](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=RbWeGiuhljYb0CFTiamHrSgBcLEAh5FrjOFKkzfOZ14,101330
3
- BFEE2/inputGenerator.py,sha256=DjQPNvcB0hlToAxx27hVaLwMslEnx_gekLcEVASz1bE,139316
4
- BFEE2/postTreatment.py,sha256=lC8nB7xyLODxJcAqVNbmmMKNRGKW4VinXeN5HADFCe4,20408
5
- BFEE2/version.py,sha256=E7P4nPNcQO652COodOtIHFiQJcyAuN7QsQ2FSFOcGqs,49
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=CQ8ISiF7JNmL0Bl9KujcprufjHz1lSmgHqDu0aVO2e8,1450
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=I7A6TpUlYLQ-K1kOaVbiH_u79oAfgN2PolU9pIe70H8,45274
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/scriptTemplate.py,sha256=IJnkdBPo0dfXt2dbW87nHZlbPJYHKgCCudmnEYqHrVU,4809
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=BrlMgcG_LuvyNEk6Y0rUD3bQ-FwqdTuOr1M-EsaQ1ZE,15071
60
- bfee2-2.5.0.data/scripts/BFEE2Gui.py,sha256=fVwzX2dtqc0_Re3thZq-NRzJtIbA4p9jK8Umx_aXxG4,454
61
- bfee2-2.5.0.dist-info/LICENSE,sha256=D49NePXWPL2DWuRjzaaLEJCI-g7Td73f4Fn21ixqGQo,35349
62
- bfee2-2.5.0.dist-info/METADATA,sha256=ER_peJZNJDlIHBrZqrJ_nzP5jXag7wEJCdOmgSHUhho,5540
63
- bfee2-2.5.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
64
- bfee2-2.5.0.dist-info/top_level.txt,sha256=O5qOOi90gwZ9axrUPYy9I-ZiwgfPd-sc6NTQnKWh1LA,6
65
- bfee2-2.5.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.40.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5