Usage Examples
Generation of Water in Water Trajectories
First, we need an input coordinate file in TINKER XYZ (or PDB) format
648 Water Cubic Box (18.643 Ang, 216 AMOEBA)
1 O 8.039430 5.868035 0.492777 1 2 3
2 H 7.581494 5.022666 0.403759 2 1
3 H 8.287056 6.062440 -0.397074 2 1
4 O 0.114840 -8.876599 6.445852 1 5 6
5 H 0.958925 -8.446494 6.405247 2 4
6 H 0.247235 -9.794471 6.137893 2 4
7 O -6.576367 -0.252600 8.104632 1 8 9
8 H -6.645499 0.689925 7.896356 2 7
9 H -6.684537 -0.400760 9.103747 2 7
Next, is the property file (like a TINKER keyword file). Note that Force Field X stores parameter files internally.
forcefield amoeba-water
a-axis 18.643
spacegroup P1
polar-eps 0.01
Finally, we use a Force Field X script to run the sampling.
// Coordinate file to open (can be XYZ or PDB)
String fileName = "examples/watersmall.xyz";
// Beginning of the ligand atom range.
int ligandStart = 1;
// End of the ligand atom range.
int ligandStop = 3;
// Number of electrostatics lambda windows.
int elecWindows = 10;
// Number of soft core van der Waals lambda windows.
int vdwWindows = 10;
// Number of equilibration MD steps.
int eSteps = 100000;
// Number of MD steps per window.
int nSteps = 100000;
// Time step in femtoseconds.
double timeStep = 1.0;
// Frequency to print out thermodynamics information in picoseconds.
double printInterval = 0.01;
// Frequency to save out coordinates in picoseconds.
double saveInterval = 0.1;
// Temperature in degrees Kelvin.
double temperature = 300.0;
// Things below this line normally do not need to be modified.
// =============================================================================
import org.apache.commons.io.FilenameUtils;
import ffx.algorithms.MolecularDynamics;
import ffx.algorithms.dynamics.thermostats.Thermostat.Thermostats;
import ffx.potential.PotentialEnergy;
import ffx.potential.bonded.Atom;
// Open the system
open(fileName);
String lambdaName = FilenameUtils.removeExtension(fileName);
// Apply the ligand atom selection
Atom[] atoms = active.getAtomArray();
for (int i = ligandStart; i <= ligandStop; i++) {
Atom ai = atoms[i - 1];
ai.setApplyLambda(true);
}
// Select an availble thermostat [ BUSSI, BERENDSEN, ISOTHERMAL ]
Thermostats thermostat = Thermostats.BUSSI;
// Create a MolecularDynamics instance
MolecularDynamics molDyn = new MolecularDynamics(active, null, thermostat);
// Equilibrate the system
boolean initVelocities = true;
molDyn.dynamic(eSteps, timeStep, printInterval, -1, temperature, initVelocities);
// Retrieve the PotentialEnergy instance
PotentialEnergy energy = active.getPotentialEnergy();
// Turn off the polarizability and multipoles for the selected atoms
for (int i=0; i <= elecWindows; i++) {
double lambda = 1.0 - (double) i / (double) elecWindows;
energy.setElectrostaticsLambda(lambda);
molDyn.setArchiveFile(new File(lambdaName + "_elec_" + String.format("%5.3f", lambda) + ".arc"));
molDyn.dynamic(nSteps, timeStep, printInterval, saveInterval, temperature, initVelocities);
}
// Turn off the vdW potential for the selected atoms
for (int i=1; i <= vdwWindows; i++) {
double lambda = 1.0 - (double) i / (double) vdwWindows;
energy.setSoftCoreLambda(lambda);
molDyn.setArchiveFile(new File(lambdaName + "_vdw_" + String.format("%5.3f", lambda) + ".arc"));
molDyn.dynamic(nSteps, timeStep, printInterval, saveInterval, temperature, initVelocities);
}