Protein transfer free energy and m-values

These function compute the transfer free energies of proteins from water to different solvent, using the Tanford additive transfer models.

m-values are the transfer free-energy difference, here in kcal/mol, between two structures from water to a 1M solution of a cosolvent. Estimates of m-values for denaturation events can be computed using the Creamer estimates for denatued accessible surface areas.

PDBTools.transfer_free_energy — Function
transfer_free_energy(::Type{MTRecord}, atoms::AbstractVector{<:Atom}, cosolvent::AbstractString; temperature=298.15, kargs...)

Compute transfer free energies from a fixed (native) structure using the Record surface-type model and atom-resolved SASAs.

The optional temperature keyword (in K, default 298.15) is forwarded to model_combination_rule; see its docstring for which cosolvents it affects.

radii_set (default :set1, Richards 1977) and exclude_cavities (default true) are forwarded to sasa_particles(RichardsUnitedAtomRadii, ...); this combination was found to best reproduce the ASA convention (SurfaceRacer, Tsodikov, Record & Sergeev, 2002) that the underlying alpha_i values were calibrated against – see richards.jl's tests for the validation. cavity_dot_cutoff is forwarded to exclude_cavity_dots! and only has an effect when exclude_cavities=true.

exclude_cavities=true is not supported together with periodic boundary conditions (unitcell); if unitcell is given and exclude_cavities is left at its default, it is silently set to false instead (with a one-time warning) rather than erroring, since the combination of "periodic structure" and "default keywords" is a common, legitimate case (e.g. transfer free energies along an MD trajectory). Pass exclude_cavities=true explicitly together with a unitcell to get the (currently unsupported) error instead of this silent fallback.

source
transfer_free_energy(::Type{MTRecord}, sasa_ats::SASA{RichardsUnitedAtomRadii}, cosolvent::AbstractString; temperature=298.15, kargs...)

Compute fixed-state transfer free energies using Record interaction potentials and atom-resolved coarse-grained surface classes.

The optional temperature keyword (in K, default 298.15) is forwarded to model_combination_rule; see its docstring for which cosolvents it affects.

source
transfer_free_energy(sasa_ats::SASA{RichardsUnitedAtomRadii}, cosolvent::AbstractString; model=MTRecord, kargs...)

Compute transfer free energies from a precomputed SASA using Richards united atom radii. This is the RichardsUnitedAtomRadii counterpart of transfer_free_energy(sasa_ats::SASA{CreamerUnitedAtomRadii}, ...): since Richards radii are only meaningful for the MTRecord model, model must be MTRecord (its default).

source
transfer_free_energy(atoms::AbstractVector{<:PDBTools.Atom}, cosolvent::AbstractString; kargs...)

Calculates the transfer free energy (in 1M solution, in kcal/mol) using the Tanford transfer model, as implemented by Moeser and Horinek [1] or by Auton and Bolen [2,3].

Positional Arguments

  • atoms:: Atoms of the system (a vector of PDBTools.Atom objects)
  • cosolvent::AbstractString: The cosolvent to consider.

Available models and cosolvents for each model:

- `Accessibility`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `AutonBolen`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea", "urea-app", "urea-mh" 
- `MoeserHorinek`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `MoeserHorinekApp`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `MTRecord`: "betaine", "glycerol", "proline", "tetraeg", "tmao", "trehalose", "urea"

Keyword Arguments (optional)

  • model::Type{<:MValueModel}=AutonBolen: The model to use for the calculation.
  • sel::Union{String,Function}=all: Selection of atoms to consider in the calculation. Can be a selection string or a function that takes an Atom and returns a Bool.
  • backbone::Function = PDBTools.isbackbone: Function to identify backbone atoms.
  • sidechain::Function = PDBTools.issidechain: Function to identify side chain atoms.
  • parallel:Bool = true: Set parallelization, requires starting Julia multithreaded.
  • unitcell=nothing: if periodic boundary conditions are used, provide a 3x3 matrix with the unitcell, or alternatively a vector of length 3 with the sides, for orthorhombic cells.
  • exclude_cavities::Union{Nothing,Bool}=nothing: forwarded to sasa_particles; excludes surface dots that sit in a solvent-sealed interior cavity (see Excluding solvent-sealed cavities). Defaults to true for model=MTRecord and to false for every other model (not validated for those).
  • cavity_dot_cutoff::Union{Nothing,Real}=nothing: forwarded to sasa_particles; only has an effect when exclude_cavities=true.
  • radii_set::Union{Nothing,Symbol}=nothing: only meaningful for model=MTRecord (defaults to :set1 there); passing it for any other model throws an ArgumentError.

Returns

A TransferFreeEnergy object, with fields:

  • ntatoms::Int: Number of atoms considered.
  • tot::Float32: Total m-value (kcal/mol/M).
  • bb::Float32: Backbone contribution to the m-value (kcal/mol/M).
  • sc::Float32: Side chain contribution to the m-value (kcal/mol/M).
  • residue_contributions_bb::Vector{Float32}: Backbone contributions of each residue to the m-value.
  • residue_contributions_sc::Vector{Float32}: Side-chain contributions of each residue to the m-value.
  • cosolvent::String: The cosolvent considered.

Example

using PDBTools
prot = read_pdb("native.pdb")
transfer_free_energy(prot, "urea")

References

  1. https://doi.org/10.1021/jp409934q
  2. https://doi.org/10.1016/s0076-6879(07)28023-1
  3. https://www.pnas.org/doi/10.1073/pnas.0706251104
source
transfer_free_energy(
    sasa_ats::SASA{CreamerUnitedAtomRadii},
    cosolvent::AbstractString;
    model::Type{<:MValueModel}=AutonBolen,
    backbone::F1=isbackbone,
    sel::Union{String,Function}=all,
    sidechain::F2=issidechain,
    parallel::Bool=true,
)

Compute transfer free energies from precomputed solvent accessible surface areas. The SASAs must have been computed with CreamerUnitedAtomRadii radii.

source
PDBTools.mvalue — Function
mvalue(m::CreamerDenaturedModel, cosolvent::AbstractString; model=AutonBolen)

Computes an estimate of the effect of a cosolvent on the m-value of denaturation of a protein.

Example

julia> using PDBTools

julia> prot = read_pdb(PDBTools.TESTPDB, "protein");

julia> m = mvalue(CreamerDenaturedModel(prot), "urea")
MValue{AutonBolen} - 104 residues - cosolvent: "urea"
    Total m-value: -1.290518 kcal mol⁻¹
    Backbone contributions: -1.3936301 kcal mol⁻¹
    Side-chain contributions: 0.10311211 kcal mol⁻¹
source
mvalue(m::MTRecordDenaturedModel, cosolvent::AbstractString; alpha=1.0, temperature=298.15)

Compute Record-model m-values from coarse-grained surface interaction potentials, using Eq. 4 (Guinn et al. 2011) and the atom-resolved ΔASA between the native and fully-extended chains wrapped in m (that is, ASA of the extended chain minus ASA of the native chain, for each atom), following the original Record model.

The optional alpha keyword scales the extended-chain (denatured-state) transfer free energy tfe_d before subtracting the native-state tfe_n: mval = alpha * tfe_d - tfe_n. The default, alpha=1.0, uses the extended-chain ASA as computed, with no adjustment; this reproduces the urea benchmarks of Guinn et al. (Table S3) well. There is no equivalent extended-chain validation set for betaine in the paper, so alpha is exposed to allow empirically fitting the denatured-state ASA scale to experimental betaine data, if needed.

Because it rescales only the denatured-state term, alpha is not the same quantity as the ΔASA correction factor f of Hong & Xiong, which rescales the whole ΔASA (tfe_d - tfe_n) instead: the two are related by alpha = f + (1 - f) * tfe_n / tfe_d.

The optional temperature keyword (in K, default 298.15) rescales the R * T * alpha_i surface interaction potentials (Eq. 4) to a different temperature, assuming the dimensionless alpha_i themselves are temperature-independent. It only affects cosolvents parameterized in the Guinn et al. convention (betaine, urea, tmao, proline, trehalose); the TetraEG and glycerol coefficients are raw empirical values with no such decomposition in their source paper, and are unaffected by this keyword.

source
mvalue(
    initial_state::AbstractVector{<:Atom},
    final_state::AbstractVector{<:Atom},
    cosolvent::AbstractString;
    sel::Union{String,Function}=all,
    model::Type{<:MValueModel}=AutonBolen,
    backbone::Function = isbackbone,
    sidechain::Function = issidechain,
    parallel:Bool = true,
    unitcell=nothing,
    sasa_particles::Function = sasa_particles with Creamer united atom radii and no hydrogens.
)

Calculates the m-value (transfer free energy of a protein in 1M solution, in kcal/mol) using the Tanford transfer model, as implemented by Moeser and Horinek [1] or by Auton and Bolen [2,3].

Positional Arguments

  • initial_state: Structure of the initial state, as a vector of Atom objects.
  • final_state: Structure of the final state, as a vector of Atom objects (e. g. the denatured sate).
  • cosolvent::AbstractString: The cosolvent to consider (case insensitive).

Available models and cosolvents for each model:

- `Accessibility`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `AutonBolen`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea", "urea-app", "urea-mh" 
- `MoeserHorinek`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `MoeserHorinekApp`: "betaine", "glycerol", "proline", "sarcosine", "sorbitol", "sucrose", "tmao", "trehalose", "urea" 
- `MTRecord`: "betaine", "glycerol", "proline", "tetraeg", "tmao", "trehalose", "urea"

Keyword Arguments

  • sel::Union{String,Function}=all: Selection of atoms to consider in the calculation. Can be a selection string or a function that takes an Atom and returns a Bool.
  • model::Type{<:MValueModel}=AutonBolen.
  • backbone::Function = PDBTools.isbackbone: Function to identify backbone atoms.
  • sidechain::Function = PDBTools.issidechain: Function to identify side chain atoms.
  • parallel:Bool = true: Set parallelization, requires starting Julia multithreaded.
  • unitcell=nothing: if periodic boundary conditions are used, provide a 3x3 matrix with the unitcell, or alternatively a vector of length 3 with the sides, for orthorhombic cells.

Returns

A MValue object, with fields:

  • ntatoms::Int: Number of atoms considered.
  • tot::Float32: Total m-value (kcal/mol/M).
  • bb::Float32: Backbone contribution to the m-value (kcal/mol/M).
  • sc::Float32: Side chain contribution to the m-value (kcal/mol/M).
  • residue_contributions_bb::Vector{Float32}: Backbone contributions of each residue to the m-value.
  • residue_contributions_sc::Vector{Float32}: Side-chain contributions of each residue to the m-value.
  • cosolvent::AbstractString: The cosolvent considered.

Example

using PDBTools

initial_state = read_pdb("native.pdb")
final_state = read_pdb("desnat.pdb")

mvalue(inital_state, final_state; model=AutonBolen, cosolvent="TMAO")

References

  1. https://doi.org/10.1021/jp409934q
  2. https://doi.org/10.1016/s0076-6879(07)28023-1
  3. https://www.pnas.org/doi/10.1073/pnas.0706251104
source
mvalue(
    sasa_initial::SASA{CreamerUnitedAtomRadii},
    sasa_final::SASA{CreamerUnitedAtomRadii},
    cosolvent::AbstractString;
    sel::Union{String,Function}=all,
    model::Type{<:MValueModel}=AutonBolen,
    backbone::F1=isbackbone,
    sidechain::F2=issidechain,
    parallel::Bool=true,
) where {F1<:Function,F2<:Function}

Compute m-values from precomputed solvent accessible surface areas. The SASAs must have been computed with CreamerUnitedAtomRadii radii.

source

Here we implement four additive transfer models: the established Auton/Bolen model, the universal-backbone Moeser/Horinek model, and the Accessibility model, which explicitly accounts for the mutual shielding between backbone and side-chain groups (see this section). (1, 2, 3). Typically, these models are used to obtain the effect of cosolvent on the structural stability of proteins, but the current implementation allows the practical use of these functions to compute m-values of more general transformations, as described in the examples.

The transfer free energy of a protein from water to a 1M solution of a cosolvent can be estimated with the transfer_free_energy function:

using PDBTools
native_state = read_pdb(PDBTools.MJC_NATIVE, "protein")
tfe = transfer_free_energy(native_state, "urea")
TransferFreeEnergy{AutonBolen} - 69 residues to 1M "urea".
    Total transfer free energy: -0.73953044 kcal mol⁻¹
    Backbone contributions: -0.98496306 kcal mol⁻¹
    Side-chain contributions: 0.24543259 kcal mol⁻¹

The resulting TransferFreeEnegy object contains the information of the contribution of each residue to the transfer free energy obtained, split into backbone and side-chain contributions:

tfe.residue_contributions_bb[1]
-0.086069845f0
tfe.residue_contributions_sc[1]
0.011580416f0

When multiple protein conformations are of interest, the mvalue methods provide a direct way to compute the variations in transfer free energies associated to the states involved, as shown in the following examples.

Combining transfer free energies

TransferFreeEnergy objects (total, backbone, side-chain, and per-residue contributions) can be scaled and combined directly with *, +, and -. Adding or subtracting two of them requires both to share the same model type and cosolvent, or an ArgumentError is thrown:

Base.:* — Method
*(alpha::Real, t::TransferFreeEnergy)

Scales a TransferFreeEnergy (total, backbone, side-chain, and per-residue contributions) by alpha, keeping the same model type and cosolvent.

source
Base.:+ — Method
+(t1::TransferFreeEnergy, t2::TransferFreeEnergy)

Adds two TransferFreeEnergy objects computed for the same model and cosolvent, element-wise (total, backbone, side-chain, and per-residue contributions). Throws an ArgumentError if t1 and t2 have different numbers of residues or cosolvents.

source
Base.:- — Method
-(t1::TransferFreeEnergy, t2::TransferFreeEnergy)

Subtracts two TransferFreeEnergy objects computed for the same model and cosolvent (equivalent to t1 + (-1)*t2).

source

This is convenient for models whose m-value is naturally defined as a difference (or scaled difference) of transfer free energies of two independent structures, instead of a per-residue comparison of a single pair of states. The MTRecord model, for example, computes its m-value this way, from the transfer free energies of the native structure and of its fully-extended chain:

tfe_native = transfer_free_energy(native_state, "urea"; model=MTRecord)
tfe_extended = transfer_free_energy(extended_chain(native_state), "urea"; model=MTRecord)
tfe_extended - tfe_native
TransferFreeEnergy{MTRecord} - 69 residues to 1M "urea".
    Total transfer free energy: -0.96455896 kcal mol⁻¹
    Backbone contributions: -0.3588792 kcal mol⁻¹
    Side-chain contributions: -0.60567975 kcal mol⁻¹

Save and load TFE/m-value data

TransferFreeEnergy or MValue objects can be saved to a json file with save and restored with load:

MolSimToolkitShared.save — Method
save(filename::AbstractString, tfe::TransferFreeEnergy)

Save TransferFreeEnergy object data to filename (json format). Load with load(TransferFreeEnergy, filename).

source
MolSimToolkitShared.load — Method
load(TransferFreeEnergy, filename::AbstractString)

Creates a TransferFreeEnergy object from the data saved to filename, with the save(filename, tfe) function.

source
outfile = tempname() * ".json"
save(outfile, tfe)
tfe_loaded = load(TransferFreeEnergy, outfile)
TransferFreeEnergy{AutonBolen} - 69 residues to 1M "urea".
    Total transfer free energy: -0.73953044 kcal mol⁻¹
    Backbone contributions: -0.98496306 kcal mol⁻¹
    Side-chain contributions: 0.24543259 kcal mol⁻¹

The saved file includes the transfer model name (for example, AutonBolen or MoeserHorinek), which is used when loading to reconstruct the original parametric type:

typeof(tfe)
TransferFreeEnergy{AutonBolen}
typeof(tfe_loaded)
TransferFreeEnergy{AutonBolen}

The same interface can be used for MValue objects:

MolSimToolkitShared.save — Method
save(filename::AbstractString, m::MValue)

Save MValue object data to filename (json format). Load with load(MValue, filename).

source
MolSimToolkitShared.load — Method
load(MValue, filename::String)

Creates an MValue object from the data saved to filename, with the save(filename, m) function.

source
desnat_state = read_pdb(PDBTools.MJC_DESNAT, "protein")
m = mvalue(native_state, desnat_state, "urea")
save(outfile, m)
m_loaded = load(MValue, outfile)
MValue{AutonBolen} - 69 residues - cosolvent: "urea"
    Total m-value: -1.3340737 kcal mol⁻¹
    Backbone contributions: -1.4051082 kcal mol⁻¹
    Side-chain contributions: 0.07103452 kcal mol⁻¹