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_energyFunction
transfer_free_energy(::Type{MTRecord}, atoms::AbstractVector{<:Atom}, cosolvent::AbstractString; kargs...)

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

source
transfer_free_energy(::Type{MTRecord}, sasa_ats::SASA{CreamerUnitedAtomRadii}, cosolvent::AbstractString; kargs...)

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

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", "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.

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.mvalueFunction
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)

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) ASA of each atom before taking the difference with the native-state ASA. 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.

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", "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.9539838 kcal mol⁻¹
    Backbone contributions: -0.34699118 kcal mol⁻¹
    Side-chain contributions: -0.6069926 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.saveMethod
save(filename::AbstractString, tfe::TransferFreeEnergy)

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

source
MolSimToolkitShared.loadMethod
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.saveMethod
save(filename::AbstractString, m::MValue)

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

source
MolSimToolkitShared.loadMethod
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⁻¹