REST2/FF-REMD algorithm
Here I cover a Replica Exchange with Solute Tempering and Force Field Replica Exchange Molecular Dynamics (REST2/FF-REMD) algorithm concept that can be implemented in NAMD through the multiple-copy scripting interface.
Replica Exchange Solute Tempering (REST2) is an enhanced sampling technique that was published by Wang et al. The traditional Temperature Replica Exchange Molecular Dyanmics (TREMD) requires many replicas to have decent exchanges between copies because good overlap at the tails of the distribution are required for exchanges to occur. In contrast, REST2 does not require many replicas.
In REST2 the protein-protein, protein-water, and water-water interactions are scaled by \(\beta\),
\[U^{SS}(\vec{r}) = \beta U_{pp}( \vec{r} ) + \sqrt{\beta} U_{pw}(\vec{r}) + U_{ww}(\vec{r})\]where \(U_{pp}\) denote the protein-protein interactions, \(U_{pw}\) denote the protein-water interactions, and \(U_{ww}\) denote the water-water interactions. Thus, REST2 allows sampling at the desired temperature by scaling the intramolecular potential energy of the protein and the intermolecular interactions between protein-water and water-water.
The algorithm follows this ladder/linear convention:
where specifically the coordinates are swaped between copies. There are \(N\) unbiased force field replicas and \(n\) \(\beta\)-scaled REST2 replicas for a total of \(N+n\) replicas/copies. The depiction of the algorithm can be viewed as a ladder. Where coordinate swaps are performed periodically at some frequency between the \(N\) unbiased force field replicas and the \(\beta\)-scaled REST2 replicas. Thus, the unbiased replicas swap with the biased REST2 replicas allowing enhanced sampling when you have many force fields to be simulated. The force fields themselves could be composed of perturbed protein-protein, protein-ion, and protein-water interactions. Finally, the algorithm is coded like so in Tcl:
# Check if a swap should be attempted at current step for replica i
if { (!($i_step % $ff_frequency) && $i_run && !($replica_id)) || \
($num_temp == 1 && !($replica_id)) } {
# Coordinate Swap i.e., Force field swap
set swap [expr int($num_forcefields * rand() + 2)] ; # Swapping force field chosen at random
# Swap i with j
for { set i 1 } { $i < $num_replicas } { incr i } {
replicaSend $swap $i
}
# Check if a swap should be attempted at current step for replica j
} elseif { (!($i_step % $ff_frequency) && $i_run && $replica_id) \
|| ($num_temp == 1 && $replica_id) } {
# Swap j with i
set swap [replicaRecv 0]
}
# Finally check swapping criterion (for example, Monte Carlo Exchange Criterion)