[MMTK] Adding/modifying forcefields
konrad.hinsen at laposte.net
konrad.hinsen at laposte.net
Fri Dec 17 21:07:46 CET 2004
On Dec 17, 2004, at 16:49, david.evans at ulsop.ac.uk wrote:
> Thanks for the reply. I was hoping that I could use the existing
> Amber94 classes, and just change the input parameter files, i.e. use
> something instead of 'amber_parm94'. The functional form of Amber99
> and gaff is identical to Amber94, I believe, so I thought it would
> just be a question of ensuring the correct data was read in.
It is, but it is a bit more work than you suspect, which is why I
didn't do it already.
The Python code you need is minor, and just a clone of the Amber 94
code. I have appended it below (save as Amber99ForceField.py). The
parameter file needs to be called amber_parm99 and must be located in
the same directory as the module, but both details are easy to change.
Something to verify is the 1-4 factors, if they are different from
their 94 value, you must change the respective lines.
However, this is just the first step of using Amber 99. The second one
is simple in principle but quite time-consuming: you must put the atom
type and charge parameters for Amber 99 into all the group and molecule
description files that you plan to use. If you work with proteins,
that's a lot! You need to define amber99_atom_type and amber99_charge
in the same way as amber_atom_type and amber_charge are defined for the
94 version. You can either add the data to the existing database files,
or make a copy of the files you plan to modify and put them into
~/.mmtk/Database. You can find all the information in the Amber
topology files.
The original MMTK database files were machine-generated from the Amber
94 topology files to reduce the effort (and mistakes). In principle,
that could be done again, but if I remember correctly Amber has changed
the format of the topology files, so a new converter would have to be
written. Moreover, a lot of manual fine-tuning was applied to the MMTK
files in order to be able to read PDB files of various origins, all
that would be lost with a simple regeneration.
Still, I think an automatic approach is the only viable solution unless
you plan to use just a few molecules.
Konrad.
--
---------------------------------------------------------------------
Konrad Hinsen
Laboratoire Léon Brillouin, CEA Saclay,
91191 Gif-sur-Yvette Cedex, France
Tel.: +33-1 69 08 79 25
Fax: +33-1 69 08 82 61
E-Mail: hinsen at llb.saclay.cea.fr
---------------------------------------------------------------------
# Amber 99 force field
#
# Written by Konrad Hinsen
# last revision: 2004-12-17
#
from MMTK.ForceFields import MMForceField
from MMTK.ForceFields.Amber import AmberData
import os
#
# Read parameter files
#
Amber99 = None
this_directory = os.path.split(__file__)[0]
def readAmber99(main_file = None, mod_files = None):
global Amber99
if main_file is None and mod_files is None:
if Amber99 is None:
paramfile = os.path.join(this_directory, "amber_parm99")
Amber99 = AmberData.AmberParameters(paramfile)
Amber99.lennard_jones_1_4 = 0.5
Amber99.electrostatic_1_4 = 1./1.2
Amber99.default_ljpar_set = Amber99.ljpar_sets['MOD4']
Amber99.atom_type_property = 'amber99_atom_type'
Amber99.charge_property = 'amber99_charge'
return Amber99
else:
if main_file is None:
main_file = os.path.join(this_directory, "amber_parm99")
mod_files = map(lambda mf: (mf, 'MOD4'), mod_files)
params = AmberData.AmberParameters(main_file, mod_files)
params.lennard_jones_1_4 = 0.5
params.electrostatic_1_4 = 1./1.2
params.default_ljpar_set = params.ljpar_sets['MOD4']
params.atom_type_property = 'amber99_atom_type'
params.charge_property = 'amber99_charge'
return params
#
# The force field class
#
class Amber99ForceField(MMForceField.MMForceField):
def __init__(self, lj_options = None, es_options = None,
bonded_scale_factor = 1., **kwargs):
self.arguments = (lj_options, es_options, bonded_scale_factor)
main_file = kwargs.get('parameter_file', None)
mod_files = kwargs.get('mod_files', None)
parameters = readAmber99(main_file, mod_files)
MMForceField.MMForceField.__init__(self, 'Amber99', parameters,
lj_options, es_options,
bonded_scale_factor)
More information about the mmtk
mailing list