Generalized Born Solvation
The Generalized Born (GB) solvation model attempts to approximate the Poisson-Boltzmann equation, using the following equation:
\[- \frac{1}{2}\left ( \frac{1}{\varepsilon_{protein} }-\frac{1}{\varepsilon_{solvent} } \right ) \sum_{i,j}^{N}\frac{q_{i}q_{j}}{f_{GB}},\]
\[f_{GB} = \sqrt{d_{ij}^{2} + \left ( \alpha_{i}\alpha_{j} e^{-\frac{d_{ij}}{4\alpha_{i}\alpha_{j}}} \right)}\]
where $\varepsilon_{protein}$ and $\varepsilon_{solvent}$ are the dieletric constants of the protein interior and of the solvent, respectively, $qi$ and $qj$ are the atomic partial charges for each interacting point-like particle, $d_{ij}$ is the inter-atomic distance of the considered particle pair and, finally, $\alpha_{i}$ and $\alpha_{j}$ are the effective Born radii of both considered interacting particles. The Born radius of an Atom
is a characterization of its burial degree in the solute, and defines the interaction amount with the solvent. Despite the GB solvation model success, accurate estimation of the Born radii in a system has been the bottleneck preventing mass adoption as the go-to implicit solvent potential.
The following section has been subdivided in several sub-section for organizational purposes:
Born Radii estimation
As previously stated, Born radii estimation is a performance-intensive task. Several approaches have been devised over the years to improve both the accuracy and calculation speed in Born radii estimation. ProtoSyn employs the work of Fogolari et al. (2020) (https://pubmed.ncbi.nlm.nih.gov/31693089/), estimating the Born radii using a machine learning model.
ProtoSyn.Calculators.GB.predict_igbr_nn_born_radii
— Functionpredict_igbr_nn_born_radii(pose::Pose, selection::Opt{AbstractSelection} = nothing; dm::Opt{Matrix{T}} = nothing, models::GBModels = models_onnx) where {T <: AbstractFloat}
Returns the Born Radii for each [`Atom`](@ref) instance in the given
Pose
pose
(selected by the AbstractSelection
selection
- TrueSelection
, by default), according to the IGBR neural network model (See Fogolari et al. work - https://pubmed.ncbi.nlm.nih.gov/31693089/). By default, uses the pre-trained ProtoSyn.Calculators.GB.models_onnx
models, but can be set to use other models with the models
argument. Optionally, a pre-calculated full distance matrix dm
can be provided, otherwise will calculate one using the ProtoSyn.acceleration.active
mode.
See also
Examples
julia> ProtoSyn.Calculators.GB.predict_igbr_nn_born_radii(pose)
1140-element Vector{Float64}:
0.4011280834674835
0.3859025537967682
0.5258529782295227
(...)
Generalized Born solvation EnergyFunctionComponent
With the estimated Born radii, ProtoSyn employs the above-defined equations to evaluate a system's implicit solvation status using the following methods:
ProtoSyn.Calculators.GB.calc_gb
— Functioncalc_gb([::A], pose::Pose, selection::Opt{AbstractSelection}, [update_forces::Bool = false]; [born_radii::Union{Vector{T}, Function} = predict_igbr_nn_born_radii], [ϵ_protein::T = 1.0], [ϵ_solvent::T = 80.0], [models::GBModels = models_onnx]) where {A}
Calculate the Pose
pose
solvation energy according to the Generalized Born function (make sure the Pose
pose
is synched, see sync!
). ProtoSyn uses the Generalzied Born function as described in Simmerling et al. work (See https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4361090/). The protein and solvent dieletric constants can be defined using the ϵ_protein
and ϵ_solvent
arguments (default is 1.0 and 80.0, respectively). The Born Radii can be statically provided in the born_radii
argument. Optionally, this argument can be a Function
instance, in which case the Born Radii will be re-calculated, using the provided models
(uses ProtoSyn.Calculators.GB.models_onnx
, by default). Custom Born Radii predictors can be defined, using the following signature:
my_born_radii_predictor(pose::Pose, selection::Opt{AbstractSelection} = nothing; dm::Opt{Matrix{T}} = nothing, models::GBModels = models_onnx)
Note the presence of pre-calculated full-distance matrix dm
in the Function
arguments. Even if no GBModels
are used in the Born Radii prediction, calc_gb
still provides them and as such the custom Function
signature should expect them (or use kwargs). An optional parameter A
(Type{<: AbstractAccelerationType}
) can be provided, stating the acceleration type used to calculate this energetic contribution (See ProtoSyn acceleration types). Uses ProtoSyn.acceleration.active
by default.
See also
Examples
julia> ProtoSyn.Calculators.GB.calc_gb(pose, nothing)
(124.4289232784785, nothing)
ProtoSyn.Calculators.GB.get_default_gb
— Functionget_default_gb(;[α::T = 1.0]) where {T <: AbstractFloat}
Return the default Generalized Born EnergyFunctionComponent
. α
sets the component weight (on an EnergyFunction
instance). This component employs the calc_gb
method, therefore defining a Pose
energy based on the Generalized Born function. By default, this EnergyFunctionComponent
uses the predict_igbr_nn_born_radii
function to predict Born Radii every call. Define efc.settings[:born_radii]
as a Vector{Float64}
to use static born radii.
Settings
born_radii::Union{Function, Vector{T}}
- Defines either the born radii predictor function or static list of born radii (where T <: AbstractFloat);ϵ_protein::T
- Define the protein dieletric constant (where T <: AbstractFloat);ϵ_solvent::T
- Define the solvent dieletric constant (where T <: AbstractFloat);models::GBModels
- Define theGBModels
to use if:born_radii
is a predictor function.
Examples
julia> ProtoSyn.Calculators.GB.get_default_gb()
🞧 Energy Function Component:
+---------------------------------------------------+
| Name | GB_Solvation |
| Alpha (α) | 1.0 |
| Update forces | false |
| Calculator | calc_gb |
+---------------------------------------------------+
| +----------------------------------------------------------------------------------+
├── ● Settings | Value |
| +----------------------------------------------------------------------------------+
| | ϵ_solvent | 80.0 |
| | models | C: ✓ | N: ✓ | H: ✓ | O: ✓ | S: ✓ |
| | ϵ_protein | 4.0 |
| | born_radii | predict_igbr_nn_born_radii |
| +----------------------------------------------------------------------------------+
|
└── ○ Selection: nothing
Despite using modern machine learning models (which substantially cut down the performance cost of estimating accurate born radii), this step is still costly and time-consuming. In not big changes are expected in the system (for example, only small refinement movements are introduced in the system, such as when re-packaging sidechains), consider using static born radii (calculated once and provided to calc_gb
as a static Vector
).
Modern implicit solvation models often employ a hybrid approach, dubbed "SASA/GB". In short, the Generalized Born model attempts to estimate the enthalpic contribution of solvating a given molecule, and the SASA model calculates the entropy contribution of "opening space" for the solvation of such a molecule. Both models act together to provide a more clear picture of the solvation potential of that system. Consider employing the get_default_sasa
EnergyFunctionComponent
in conjunction with the get_default_gb
EnergyFunctionComponent
.