The chemical bond is represented by a harmonic potential:
where
The way to specify a harmonic bond in DMFF is the same as the way doing it in OpenMM:
<HarmonicBondForce>
<Bond class1="C" class2="C" length="0.1525" k="259408.0" mask="true"/>
<Bond class1="C" class2="CA" length="0.1409" k="392459.2" mask="true"/>
<Bond class1="C" class2="CB" length="0.1419" k="374049.6" mask="true"/>
...
</HarmonicBondForce>
Every <Bond>
tag defines a rule for creating harmonic bond interactions between atoms. Each tag may identify the atoms either by type (using the attributes type1
and type2
) or by class (using the attributes class1
and class2
). length
is the equilibrium bond length in k
is the force constant in
When the tag has an attribute named mask
and it's value set to true
, this means the parameter is not trainable. Such information will be passed to ParamSet.mask
(the corresponding mask value will be 0.0 if not trainable).
The angle is represented by a harmonic potential:
where HarmonicBondJaxForce
, the parameters in some other MD softwares are defined to follow the potential form:
The way to specify a harmonic angle in DMFF is the same as the way doing it in OpenMM:
<HarmonicAngleForce>
<Angle class1="C" class2="C" class3="O" angle="2.094" k="669.44"/>
<Angle class1="C" class2="C" class3="OH" angle="2.094" k="669.44"/>
<Angle class1="CA" class2="C" class3="CA" angle="2.094" k="527.184" mask="true"/>
...
</HarmonicAngleForce>
Every <Angle>
tag defines a rule for creating harmonic angle interactions between triplets of atoms. Each tag may identify the atoms either by type (using the attributes type1
, type2
, type3
) or by class (using the attributes class1
, class2
, class3
). The force field identifies every set of three atoms in the system where the first is bonded to the second, and the second to the third. angle
is the equilibrium angle in radians, and k
is the spring constant in
When the tag has an attribute named mask
and it's value set to true
, this means the parameter is not trainable. Such information will be passed to ParamSet.mask
(the corresponding mask value will be 0.0 if not trainable).
The torsion is represented by a truncated periodic Fourier series:
where
The way to specify a periodic torsion in DMFF is the same as the way doing it in OpenMM:
<PeriodicTorsionForce>
<Proper class1="HC" class2="CT" class3="CT" class4="CT" periodicity1="3" phase1="0.0" k1="0.66944"/>
<Proper class1="HC" class2="CT" class3="CT" class4="HC" periodicity1="3" phase1="0.0" k1="0.6276"/>
...
<Improper class1="N" class2="C" class3="CT" class4="O" periodicity1="2" phase1="3.14159265359" k1="4.6024" mask="true"/>
<Improper class1="N" class2="C" class3="CT" class4="H" periodicity1="2" phase1="3.14159265359" k1="4.6024" mask="true"/>
...
</PeriodicTorsionForce>
Every child tag defines a rule for creating periodic torsion interactions between sets of four atoms. Each tag may identify the atoms either by type (using the attributes type1
, type2
, ...) or by class (using the attributes class1
, class2
, ...).
The force field recognizes two different types of torsions: Proper
and Improper
. A proper torsion involves four atoms that are bonded in sequence: 1 to 2, 2 to 3, and 3 to 4. An improper torsion involves a central atom and three others that are bonded to it: atoms 2, 3, and 4 are all bonded to atom 1. periodicity1
is the periodicity of the torsion, phase1
is the phase offset in radians, and k1
is the force constant in kJ/mol. To add a second periodicity, just add three more attributes: periodicity2
, phase2
, and k2
. The maxium periodicity supported in DMFF is 6, which is different from OpenMM.
You can also use wildcards when defining torsions. To do this, simply leave the type or class name for an atom empty. That will cause it to match any atom:
<Proper class1="" class2="OS" class3="P" class4="" periodicity1="3" phase1="0.0" k1="1.046"/>
When the tag has an attribute named mask
and it's value set to true
, this means the parameter is not trainable. Such information will be passed to ParamSet.mask
(the corresponding mask value will be 0.0 if not trainable).
The Lennard-Jones intearction between two particles follows the potential form:
where
The pairwise parameter
To specify Lennard-Jones interactions, include a tag that looks like this:
<LennardJonesForce lj14scale="0.5">
<Atom sigma="0.247679397463798523" epsilon="0.0869048" type="gaff2-hc"/>
<Atom sigma="0.233928874135017395" epsilon="0.0873315" type="gaff2-h1"/>
...
</LennardJonesForce>
The <LennardJones>
tag an attribute lj14scale
that specify the scale factors between pairs of atoms separated by three bonds. Each <Atom>
tag specifies the nonbonded parameters for one atom type (specified with the type
attribute) or atom class (specified with the class
attribute). sigma
is in nm, and epsilon
is in
The form of the Coulomb interaction between each pair of particles depends on the NonbondedMethod
in use. For NoCutoff, it is given by
where
To specify Coulomb interactions, include a tag that looks like this:
<CoulombForce coulomb14scale="0.83333333">
</CoulombForce>
The attribute coulomb14scale
specifies the scale factors between pairs of atoms separated by three bonds.
Notice that the atomic charges are not specified in this tag because different force fields may adopt different approaches to assign atomic charges. Currently, DMFF supports two approaches to assign atomic charges: template-based and AM1-BCC.
- In force fields like AMBER, the atomic charges are defined in a template-based manner. Such force fields are usually for protein or nucleic acids that have well-defined building blocks. Hence, the atomic charges can be specified in the
<Residues>
node:
<Residues>
<Residue name="ALA">
<Atom charge="-0.4157" name="N" type="protein-N"/>
<Atom charge="0.2719" name="H" type="protein-H"/>
<Atom charge="0.0337" name="CA" type="protein-CX"/>
<Atom charge="0.0823" name="HA" type="protein-H1"/>
<Atom charge="-0.1825" name="CB" type="protein-CT"/>
<Atom charge="0.0603" name="HB1" type="protein-HC"/>
<Atom charge="0.0603" name="HB2" type="protein-HC"/>
<Atom charge="0.0603" name="HB3" type="protein-HC"/>
<Atom charge="0.5973" name="C" type="protein-C"/>
<Atom charge="-0.5679" name="O" type="protein-O"/>
<Bond atomName1="N" atomName2="H"/>
<Bond atomName1="N" atomName2="CA"/>
<Bond atomName1="CA" atomName2="HA"/>
<Bond atomName1="CA" atomName2="CB"/>
<Bond atomName1="CA" atomName2="C"/>
<Bond atomName1="CB" atomName2="HB1"/>
<Bond atomName1="CB" atomName2="HB2"/>
<Bond atomName1="CB" atomName2="HB3"/>
<Bond atomName1="C" atomName2="O"/>
<ExternalBond atomName="N"/>
<ExternalBond atomName="C"/>
</Residue>
...
</Residues>
- For arbitrary organic molecules, AM1-BCC approach appears to be an efficient way to derive high-quality charges. The atomic charges are calculated by applying bond charge corrections (BCC) to Mulliken charges under AM1 level of theory. In DMFF, one can define BCC parameters with SMIRKS patterns and call
sqm
to calculate AM1 charges:
<ForceField>
<Operators>
<AM1ChargeOperator>
<SQM path="sqm"/>
</AM1ChargeOperator>
</Operators>
<CoulombForce coulomb14scale="0.83333333">
<UseBondChargeCorrection name="MOL"/>
<BondChargeCorrection bcc="0.0000" smirks="[#6X4:1]-[#6X4:2]"/>
<BondChargeCorrection bcc="0.0278" smirks="[#6X4:1]-[#6X3:2]"/>
...
</CoulombForce>
The NonbondedForce
is a summary of CoulombForce
and LennardJonesForce
for consistency with OpenMM. With NonbondedForce
, the force field library of OpenMM can be fluentely used in DMFF. The form of the Lennard-Jones and Coulomb interaction between each pair of particles depends on the NonbondedMethod
in use.
To specify NonbondedForce interactions, include a tag that looks like this:
<NonbondedForce coulomb14scale="0.8333333333333334" lj14scale="0.5">
<UseAttributeFromResidue name="charge"/>
<Atom epsilon="0.359824" sigma="0.3399669508423535" type="protein-C"/>
<Atom epsilon="0.359824" sigma="0.3399669508423535" type="protein-CA"/>
</NonbondedForce>
The attribute coulomb14scale
and lj14scale
specifies the scale factors between pairs of atoms separated by three bonds. The atomic charges are defined in a template-based manner since the UseAttributeFromResidue
node is added. If node UseAttributeFromResidue
does not exist, the atomic charges should be specified with Atom
node, such as:
<NonbondedForce coulomb14scale="0.8333333333333334" lj14scale="0.5">
<Atom epsilon="0.359824" charge="0.131452" sigma="0.3399669508423535" type="protein-C"/>
<Atom epsilon="0.359824" charge="-0.051223" sigma="0.3399669508423535" type="protein-CA"/>
</NonbondedForce>